1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* ***** BEGIN LICENSE BLOCK *****
3
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
5
* The contents of this file are subject to the Netscape Public License
6
* Version 1.1 (the "License"); you may not use this file except in
7
* compliance with the License. You may obtain a copy of the License at
8
* http://www.mozilla.org/NPL/
10
* Software distributed under the License is distributed on an "AS IS" basis,
11
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12
* for the specific language governing rights and limitations under the
15
* The Original Code is mozilla.org code.
17
* The Initial Developer of the Original Code is
18
* Netscape Communications Corporation.
19
* Portions created by the Initial Developer are Copyright (C) 1998
20
* the Initial Developer. All Rights Reserved.
22
* Original Author: David W. Hyatt (hyatt@netscape.com)
25
* John Gaunt (jgaunt@netscape.com)
28
* Alternatively, the contents of this file may be used under the terms of
29
* either the GNU General Public License Version 2 or later (the "GPL"), or
30
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
31
* in which case the provisions of the GPL or the LGPL are applicable instead
32
* of those above. If you wish to allow use of your version of this file only
33
* under the terms of either the GPL or the LGPL, and not to allow others to
34
* use your version of this file under the terms of the NPL, indicate your
35
* decision by deleting the provisions above and replace them with the notice
36
* and other provisions required by the GPL or the LGPL. If you do not delete
37
* the provisions above, a recipient may use your version of this file under
38
* the terms of any one of the NPL, the GPL or the LGPL.
40
* ***** END LICENSE BLOCK ***** */
42
// NOTE: alphabetically ordered
43
#include "nsAccessibilityAtoms.h"
44
#include "nsAccessibilityService.h"
45
#include "nsCaretAccessible.h"
46
#include "nsCURILoader.h"
47
#include "nsDocAccessible.h"
48
#include "nsHTMLAreaAccessible.h"
49
#include "nsHTMLFormControlAccessible.h"
50
#include "nsHTMLImageAccessible.h"
51
#include "nsHTMLLinkAccessible.h"
52
#include "nsHTMLSelectAccessible.h"
53
#include "nsHTMLTableAccessible.h"
54
#include "nsHTMLTextAccessible.h"
55
#include "nsIAccessibilityService.h"
56
#include "nsIAccessibleProvider.h"
57
#include "nsIDOMDocument.h"
58
#include "nsIDOMHTMLAreaElement.h"
59
#include "nsIDOMHTMLLegendElement.h"
60
#include "nsIDOMHTMLObjectElement.h"
61
#include "nsIDOMHTMLOptGroupElement.h"
62
#include "nsIDOMHTMLOptionElement.h"
63
#include "nsIDOMWindow.h"
64
#include "nsIDOMXULElement.h"
65
#include "nsIDocShell.h"
68
#include "nsIObserverService.h"
69
#include "nsIPluginInstance.h"
70
#include "nsIPresContext.h"
71
#include "nsIPresShell.h"
72
#include "nsITextContent.h"
73
#include "nsIWebNavigation.h"
74
#include "nsObjectFrame.h"
75
#include "nsOuterDocAccessible.h"
76
#include "nsRootAccessibleWrap.h"
77
#include "nsTextFragment.h"
78
#include "nsPIAccessNode.h"
81
#include "nsXULColorPickerAccessible.h"
82
#include "nsXULFormControlAccessible.h"
83
#include "nsXULMenuAccessible.h"
84
#include "nsXULSelectAccessible.h"
85
#include "nsXULTabAccessible.h"
86
#include "nsXULTextAccessible.h"
87
#include "nsXULTreeAccessible.h"
90
// For native window support for object/embed/applet tags
92
#include "nsHTMLWin32ObjectAccessible.h"
95
#ifdef MOZ_ACCESSIBILITY_ATK
96
#include "nsHTMLBlockAccessible.h"
97
#include "nsHTMLLinkAccessibleWrap.h"
98
#include "nsHTMLFormControlAccessibleWrap.h"
99
#include "nsHTMLTableAccessibleWrap.h"
100
#include "nsXULFormControlAccessibleWrap.h"
101
#include "nsXULTreeAccessibleWrap.h"
104
nsAccessibilityService *nsAccessibilityService::gAccessibilityService = nsnull;
107
* nsAccessibilityService
110
nsAccessibilityService::nsAccessibilityService()
112
nsCOMPtr<nsIObserverService> observerService =
113
do_GetService("@mozilla.org/observer-service;1");
114
if (!observerService)
117
observerService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, PR_FALSE);
118
nsCOMPtr<nsIWebProgress> progress(do_GetService(NS_DOCUMENTLOADER_SERVICE_CONTRACTID));
120
progress->AddProgressListener(NS_STATIC_CAST(nsIWebProgressListener*,this),
121
nsIWebProgress::NOTIFY_STATE_DOCUMENT);
123
nsAccessNodeWrap::InitAccessibility();
126
nsAccessibilityService::~nsAccessibilityService()
128
nsAccessibilityService::gAccessibilityService = nsnull;
129
nsAccessNodeWrap::ShutdownAccessibility();
132
NS_IMPL_THREADSAFE_ISUPPORTS5(nsAccessibilityService, nsIAccessibilityService, nsIAccessibleRetrieval,
133
nsIObserver, nsIWebProgressListener, nsISupportsWeakReference)
138
nsAccessibilityService::Observe(nsISupports *aSubject, const char *aTopic,
139
const PRUnichar *aData)
141
if (!nsCRT::strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID)) {
142
nsCOMPtr<nsIObserverService> observerService =
143
do_GetService("@mozilla.org/observer-service;1");
144
if (observerService) {
145
observerService->RemoveObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID);
147
nsAccessNodeWrap::ShutdownAccessibility();
152
// nsIWebProgressListener
154
NS_IMETHODIMP nsAccessibilityService::OnStateChange(nsIWebProgress *aWebProgress,
155
nsIRequest *aRequest, PRUint32 aStateFlags, nsresult aStatus)
157
const PRUint32 kRequiredFlags = STATE_IS_DOCUMENT | STATE_TRANSFERRING;
158
if ((aStateFlags & kRequiredFlags ) != kRequiredFlags) {
162
nsCOMPtr<nsIDOMWindow> domWindow;
163
aWebProgress->GetDOMWindow(getter_AddRefs(domWindow));
164
// Bug 214049 OnStateChange can come from non UI threads.
168
nsCOMPtr<nsIDOMDocument> domDoc;
169
domWindow->GetDocument(getter_AddRefs(domDoc));
170
nsCOMPtr<nsIDOMNode> domDocRootNode(do_QueryInterface(domDoc));
171
NS_ENSURE_TRUE(domDocRootNode, NS_ERROR_FAILURE);
173
// Get the accessible for the new document
174
// This will cache the doc's accessible and set up event listeners
175
// so that toolkit and internal accessibility events will get fired
176
nsCOMPtr<nsIAccessible> accessible;
177
GetAccessibleFor(domDocRootNode, getter_AddRefs(accessible));
181
/* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */
182
NS_IMETHODIMP nsAccessibilityService::OnProgressChange(nsIWebProgress *aWebProgress,
183
nsIRequest *aRequest, PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress,
184
PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress)
186
NS_NOTREACHED("notification excluded in AddProgressListener(...)");
190
/* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location); */
191
NS_IMETHODIMP nsAccessibilityService::OnLocationChange(nsIWebProgress *aWebProgress,
192
nsIRequest *aRequest, nsIURI *location)
194
NS_NOTREACHED("notification excluded in AddProgressListener(...)");
198
/* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */
199
NS_IMETHODIMP nsAccessibilityService::OnStatusChange(nsIWebProgress *aWebProgress,
200
nsIRequest *aRequest, nsresult aStatus, const PRUnichar *aMessage)
202
NS_NOTREACHED("notification excluded in AddProgressListener(...)");
206
/* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */
207
NS_IMETHODIMP nsAccessibilityService::OnSecurityChange(nsIWebProgress *aWebProgress,
208
nsIRequest *aRequest, PRUint32 state)
210
NS_NOTREACHED("notification excluded in AddProgressListener(...)");
216
nsAccessibilityService::GetInfo(nsISupports* aFrame, nsIFrame** aRealFrame, nsIWeakReference** aShell, nsIDOMNode** aNode)
218
NS_ASSERTION(aFrame,"Error -- 1st argument (aFrame) is null!!");
219
*aRealFrame = NS_STATIC_CAST(nsIFrame*, aFrame);
220
nsCOMPtr<nsIContent> content = (*aRealFrame)->GetContent();
221
nsCOMPtr<nsIDOMNode> node(do_QueryInterface(content));
222
if (!content || !node)
223
return NS_ERROR_FAILURE;
225
NS_IF_ADDREF(*aNode);
227
nsCOMPtr<nsIDocument> document = content->GetDocument();
229
return NS_ERROR_FAILURE;
232
PRInt32 shells = document->GetNumberOfShells();
233
NS_ASSERTION(shells > 0,"Error no shells!");
236
// do_GetWR only works into a |nsCOMPtr| :-(
237
nsCOMPtr<nsIWeakReference> weakShell =
238
do_GetWeakReference(document->GetShellAt(0));
239
NS_IF_ADDREF(*aShell = weakShell);
245
nsAccessibilityService::GetShellFromNode(nsIDOMNode *aNode, nsIWeakReference **aWeakShell)
247
nsCOMPtr<nsIDOMDocument> domDoc;
248
aNode->GetOwnerDocument(getter_AddRefs(domDoc));
249
nsCOMPtr<nsIDocument> doc(do_QueryInterface(domDoc));
251
return NS_ERROR_INVALID_ARG;
253
// ---- Get the pres shell ----
254
nsIPresShell *shell = doc->GetShellAt(0);
256
return NS_ERROR_FAILURE;
258
nsCOMPtr<nsIWeakReference> weakRef(do_GetWeakReference(shell));
260
*aWeakShell = weakRef;
261
NS_IF_ADDREF(*aWeakShell);
267
* nsIAccessibilityService methods:
271
nsAccessibilityService::CreateOuterDocAccessible(nsIDOMNode* aDOMNode,
272
nsIAccessible **aOuterDocAccessible)
274
NS_ENSURE_ARG_POINTER(aDOMNode);
276
*aOuterDocAccessible = nsnull;
278
nsCOMPtr<nsIWeakReference> outerWeakShell;
279
GetShellFromNode(aDOMNode, getter_AddRefs(outerWeakShell));
280
NS_ENSURE_TRUE(outerWeakShell, NS_ERROR_FAILURE);
282
nsOuterDocAccessible *outerDocAccessible =
283
new nsOuterDocAccessible(aDOMNode, outerWeakShell);
284
NS_ENSURE_TRUE(outerDocAccessible, NS_ERROR_FAILURE);
286
NS_ADDREF(*aOuterDocAccessible = outerDocAccessible);
292
nsAccessibilityService::CreateRootAccessible(nsIPresShell *aShell,
293
nsIDocument* aDocument,
294
nsIAccessible **aRootAcc)
298
nsCOMPtr<nsIDOMNode> rootNode(do_QueryInterface(aDocument));
299
NS_ENSURE_TRUE(rootNode, NS_ERROR_FAILURE);
301
nsIDocument *parentDoc = aDocument->GetParentDocument();
303
nsIPresShell *presShell = aShell;
305
presShell = aDocument->GetShellAt(0);
307
nsCOMPtr<nsIWeakReference> weakShell(do_GetWeakReference(presShell));
310
// We only create root accessibles for the true root, othewise create a
312
*aRootAcc = new nsDocAccessibleWrap(rootNode, weakShell);
315
*aRootAcc = new nsRootAccessibleWrap(rootNode, weakShell);
318
return NS_ERROR_OUT_OF_MEMORY;
320
nsCOMPtr<nsPIAccessNode> privateAccessNode(do_QueryInterface(*aRootAcc));
321
privateAccessNode->Init();
323
NS_ADDREF(*aRootAcc);
329
* HTML widget creation
332
nsAccessibilityService::CreateHTML4ButtonAccessible(nsISupports *aFrame, nsIAccessible **_retval)
335
nsCOMPtr<nsIDOMNode> node;
336
nsCOMPtr<nsIWeakReference> weakShell;
337
nsresult rv = GetInfo(aFrame, &frame, getter_AddRefs(weakShell), getter_AddRefs(node));
341
*_retval = new nsHTML4ButtonAccessible(node, weakShell);
343
return NS_ERROR_OUT_OF_MEMORY;
350
nsAccessibilityService::CreateHTMLAreaAccessible(nsIWeakReference *aShell, nsIDOMNode *aDOMNode, nsIAccessible *aParent,
351
nsIAccessible **_retval)
353
*_retval = new nsHTMLAreaAccessible(aDOMNode, aParent, aShell);
356
return NS_ERROR_OUT_OF_MEMORY;
363
nsAccessibilityService::CreateHTMLBlockAccessible(nsISupports *aFrame, nsIAccessible **_retval)
365
#ifndef MOZ_ACCESSIBILITY_ATK
367
return NS_ERROR_FAILURE;
370
nsCOMPtr<nsIDOMNode> node;
371
nsCOMPtr<nsIWeakReference> weakShell;
372
nsresult rv = GetInfo(aFrame, &frame, getter_AddRefs(weakShell), getter_AddRefs(node));
376
*_retval = new nsHTMLBlockAccessible(node, weakShell);
378
return NS_ERROR_OUT_OF_MEMORY;
386
nsAccessibilityService::CreateHTMLButtonAccessible(nsISupports *aFrame, nsIAccessible **_retval)
389
nsCOMPtr<nsIDOMNode> node;
390
nsCOMPtr<nsIWeakReference> weakShell;
391
nsresult rv = GetInfo(aFrame, &frame, getter_AddRefs(weakShell), getter_AddRefs(node));
395
*_retval = new nsHTMLButtonAccessible(node, weakShell);
397
return NS_ERROR_OUT_OF_MEMORY;
404
nsAccessibilityService::CreateHTMLButtonAccessibleXBL(nsIDOMNode *aNode, nsIAccessible **_retval)
407
nsCOMPtr<nsIWeakReference> weakShell;
408
GetShellFromNode(aNode, getter_AddRefs(weakShell));
410
// reusing the HTML accessible widget and enhancing for XUL
411
*_retval = new nsHTML4ButtonAccessible(aNode, weakShell);
413
return NS_ERROR_OUT_OF_MEMORY;
423
nsAccessibilityService::CreateHTMLCheckboxAccessible(nsISupports *aFrame, nsIAccessible **_retval)
426
nsCOMPtr<nsIDOMNode> node;
427
nsCOMPtr<nsIWeakReference> weakShell;
428
nsresult rv = GetInfo(aFrame, &frame, getter_AddRefs(weakShell), getter_AddRefs(node));
432
*_retval = new nsHTMLCheckboxAccessible(node, weakShell);
434
return NS_ERROR_OUT_OF_MEMORY;
441
nsAccessibilityService::CreateHTMLCheckboxAccessibleXBL(nsIDOMNode *aNode, nsIAccessible **_retval)
444
nsCOMPtr<nsIWeakReference> weakShell;
445
GetShellFromNode(aNode, getter_AddRefs(weakShell));
447
// reusing the HTML accessible widget and enhancing for XUL
448
*_retval = new nsHTMLCheckboxAccessible(aNode, weakShell);
450
return NS_ERROR_OUT_OF_MEMORY;
460
nsAccessibilityService::CreateHTMLComboboxAccessible(nsIDOMNode* aDOMNode, nsISupports* aPresContext, nsIAccessible **_retval)
462
nsCOMPtr<nsIPresContext> presContext(do_QueryInterface(aPresContext));
463
NS_ASSERTION(presContext,"Error non prescontext passed to accessible factory!!!");
465
nsCOMPtr<nsIWeakReference> weakShell =
466
do_GetWeakReference(presContext->PresShell());
468
*_retval = new nsHTMLComboboxAccessible(aDOMNode, weakShell);
470
return NS_ERROR_OUT_OF_MEMORY;
477
nsAccessibilityService::CreateHTMLImageAccessible(nsISupports *aFrame, nsIAccessible **_retval)
480
nsCOMPtr<nsIDOMNode> node;
481
nsCOMPtr<nsIWeakReference> weakShell;
482
nsresult rv = GetInfo(aFrame, &frame, getter_AddRefs(weakShell), getter_AddRefs(node));
487
nsCOMPtr<nsIDOMElement> domElement(do_QueryInterface(node));
489
#ifdef MOZ_ACCESSIBILITY_ATK
491
rv = domElement->HasAttribute(NS_LITERAL_STRING("usemap"), &hasAttribute);
492
if (NS_SUCCEEDED(rv) && hasAttribute) {
493
//There is a "use map"
494
*_retval = new nsHTMLImageMapAccessible(node, weakShell);
497
#endif //MOZ_ACCESSIBILITY_ATK
498
*_retval = new nsHTMLImageAccessible(node, weakShell);
502
return NS_ERROR_OUT_OF_MEMORY;
509
nsAccessibilityService::CreateHTMLGroupboxAccessible(nsISupports *aFrame, nsIAccessible **_retval)
512
nsCOMPtr<nsIDOMNode> node;
513
nsCOMPtr<nsIWeakReference> weakShell;
514
nsresult rv = GetInfo(aFrame, &frame, getter_AddRefs(weakShell), getter_AddRefs(node));
518
*_retval = new nsHTMLGroupboxAccessible(node, weakShell);
520
return NS_ERROR_OUT_OF_MEMORY;
527
nsAccessibilityService::CreateHTMLListboxAccessible(nsIDOMNode* aDOMNode, nsISupports* aPresContext, nsIAccessible **_retval)
529
nsCOMPtr<nsIPresContext> presContext(do_QueryInterface(aPresContext));
530
NS_ASSERTION(presContext,"Error non prescontext passed to accessible factory!!!");
532
nsCOMPtr<nsIWeakReference> weakShell =
533
do_GetWeakReference(presContext->PresShell());
535
*_retval = new nsHTMLSelectListAccessible(aDOMNode, weakShell);
537
return NS_ERROR_OUT_OF_MEMORY;
544
* We can have several cases here.
545
* 1) a text or html embedded document where the contentDocument
546
* variable in the object element holds the content
547
* 2) web content that uses a plugin, which means we will
548
* have to go to the plugin to get the accessible content
549
* 3) An image or imagemap, where the image frame points back to
550
* the object element DOMNode
553
nsAccessibilityService::CreateHTMLObjectFrameAccessible(nsObjectFrame *aFrame,
554
nsIAccessible **aAccessible)
556
nsCOMPtr<nsIDOMNode> node;
557
nsCOMPtr<nsIWeakReference> weakShell;
559
GetInfo(NS_STATIC_CAST(nsIFrame*, aFrame), &frame, getter_AddRefs(weakShell), getter_AddRefs(node));
561
// 1) for object elements containing either HTML or TXT documents
562
nsCOMPtr<nsIDOMDocument> domDoc;
563
nsCOMPtr<nsIDOMHTMLObjectElement> obj(do_QueryInterface(node));
565
obj->GetContentDocument(getter_AddRefs(domDoc));
567
domDoc = do_QueryInterface(node);
569
return CreateOuterDocAccessible(node, aAccessible);
573
nsCOMPtr<nsIPluginInstance> pluginInstance ;
574
aFrame->GetPluginInstance(*getter_AddRefs(pluginInstance));
575
if (pluginInstance) {
576
HWND pluginPort = nsnull;
577
aFrame->GetPluginPort(&pluginPort);
579
*aAccessible = new nsHTMLWin32ObjectAccessible(node, weakShell, pluginPort);
581
NS_ADDREF(*aAccessible);
588
// 3) for images and imagemaps, or anything else with a child frame
589
// we have the object frame, get the image frame
590
frame = aFrame->GetFirstChild(nsnull);
592
return frame->GetAccessible(aAccessible);
594
return NS_ERROR_FAILURE;
598
nsAccessibilityService::CreateHTMLRadioButtonAccessible(nsISupports *aFrame, nsIAccessible **_retval)
601
nsCOMPtr<nsIDOMNode> node;
602
nsCOMPtr<nsIWeakReference> weakShell;
603
nsresult rv = GetInfo(aFrame, &frame, getter_AddRefs(weakShell), getter_AddRefs(node));
607
*_retval = new nsHTMLRadioButtonAccessible(node, weakShell);
609
return NS_ERROR_OUT_OF_MEMORY;
616
nsAccessibilityService::CreateHTMLRadioButtonAccessibleXBL(nsIDOMNode *aNode, nsIAccessible **_retval)
619
nsCOMPtr<nsIWeakReference> weakShell;
620
GetShellFromNode(aNode, getter_AddRefs(weakShell));
622
// reusing the HTML accessible widget and enhancing for XUL
623
*_retval = new nsHTMLRadioButtonAccessible(aNode, weakShell);
625
return NS_ERROR_OUT_OF_MEMORY;
635
nsAccessibilityService::CreateHTMLSelectOptionAccessible(nsIDOMNode* aDOMNode,
636
nsIAccessible *aParent,
637
nsISupports* aPresContext,
638
nsIAccessible **_retval)
640
nsCOMPtr<nsIPresContext> presContext(do_QueryInterface(aPresContext));
641
NS_ASSERTION(presContext,"Error non prescontext passed to accessible factory!!!");
643
nsCOMPtr<nsIWeakReference> weakShell =
644
do_GetWeakReference(presContext->PresShell());
646
*_retval = new nsHTMLSelectOptionAccessible(aDOMNode, weakShell);
648
return NS_ERROR_OUT_OF_MEMORY;
655
nsAccessibilityService::CreateHTMLTableAccessible(nsISupports *aFrame, nsIAccessible **_retval)
658
nsCOMPtr<nsIDOMNode> node;
659
nsCOMPtr<nsIWeakReference> weakShell;
660
nsresult rv = GetInfo(aFrame, &frame, getter_AddRefs(weakShell), getter_AddRefs(node));
664
*_retval = new nsHTMLTableAccessibleWrap(node, weakShell);
666
return NS_ERROR_OUT_OF_MEMORY;
673
nsAccessibilityService::CreateHTMLTableCaptionAccessible(nsIDOMNode *aDOMNode, nsIAccessible **_retval)
675
NS_ENSURE_ARG_POINTER(aDOMNode);
679
nsCOMPtr<nsIWeakReference> weakShell;
680
rv = GetShellFromNode(aDOMNode, getter_AddRefs(weakShell));
681
NS_ENSURE_SUCCESS(rv, rv);
683
nsHTMLTableCaptionAccessible* accTableCaption =
684
new nsHTMLTableCaptionAccessible(aDOMNode, weakShell);
686
NS_ENSURE_TRUE(accTableCaption, NS_ERROR_OUT_OF_MEMORY);
688
*_retval = NS_STATIC_CAST(nsIAccessible *, accTableCaption);
689
NS_IF_ADDREF(*_retval);
695
nsAccessibilityService::CreateHTMLTableHeadAccessible(nsIDOMNode *aDOMNode, nsIAccessible **_retval)
697
#ifndef MOZ_ACCESSIBILITY_ATK
699
return NS_ERROR_FAILURE;
701
NS_ENSURE_ARG_POINTER(aDOMNode);
705
nsCOMPtr<nsIWeakReference> weakShell;
706
rv = GetShellFromNode(aDOMNode, getter_AddRefs(weakShell));
707
NS_ENSURE_SUCCESS(rv, rv);
709
nsHTMLTableHeadAccessible* accTableHead =
710
new nsHTMLTableHeadAccessible(aDOMNode, weakShell);
712
NS_ENSURE_TRUE(accTableHead, NS_ERROR_OUT_OF_MEMORY);
714
*_retval = NS_STATIC_CAST(nsIAccessible *, accTableHead);
715
NS_IF_ADDREF(*_retval);
722
nsAccessibilityService::CreateHTMLTableCellAccessible(nsISupports *aFrame, nsIAccessible **_retval)
725
nsCOMPtr<nsIDOMNode> node;
726
nsCOMPtr<nsIWeakReference> weakShell;
727
nsresult rv = GetInfo(aFrame, &frame, getter_AddRefs(weakShell), getter_AddRefs(node));
731
*_retval = new nsHTMLTableCellAccessibleWrap(node, weakShell);
733
return NS_ERROR_OUT_OF_MEMORY;
740
nsAccessibilityService::CreateHTMLTextAccessible(nsISupports *aFrame, nsIAccessible **_retval)
743
nsCOMPtr<nsIDOMNode> node;
744
nsCOMPtr<nsIWeakReference> weakShell;
745
nsresult rv = GetInfo(aFrame, &frame, getter_AddRefs(weakShell), getter_AddRefs(node));
751
#ifndef MOZ_ACCESSIBILITY_ATK
752
nsCOMPtr<nsITextContent> textContent(do_QueryInterface(node));
754
// If empty text string, don't include in accessible tree
755
// Items with length 0 are already gone, we also need to check for single NBSP's
756
// or newlines, both of which indicate an empty text object
757
PRInt32 textLength = 0;
758
textContent->GetTextLength(&textLength);
759
if (textLength == 1) {
760
const nsTextFragment *textFrag;
761
textContent->GetText(&textFrag);
762
PRUnichar theChar = textFrag->CharAt(0);
763
// Check for NBSP (160) or newline
764
if (theChar == 160 || theChar=='\n')
765
return NS_ERROR_FAILURE;
767
nsCOMPtr<nsIDOMNode> parentNode;
768
node->GetParentNode(getter_AddRefs(parentNode));
769
nsCOMPtr<nsIDOMHTMLLegendElement> legend(do_QueryInterface(parentNode));
770
if (legend) // Expose <legend> as the name in a groupbox, not as a ROLE_TEXT accessible
771
return NS_ERROR_FAILURE;
774
*_retval = new nsHTMLTextAccessible(node, weakShell);
776
// In ATK, we are only creating the accessible object for the text frame that is the FIRST
777
// text frame in its block.
778
// A depth-first traversal from its nearest parent block frame will produce a frame sequence like
779
// TTTBTTBTT... (B for block frame, T for text frame), so every T frame which is the immediate
780
// sibiling of B frame will be the FIRST text frame.
781
nsIFrame* parentFrame = nsAccessible::GetParentBlockFrame(frame);
783
return NS_ERROR_FAILURE;
785
nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(weakShell));
786
nsCOMPtr<nsIPresContext> presContext;
787
presShell->GetPresContext(getter_AddRefs(presContext));
788
nsIFrame* childFrame = parentFrame->GetFirstChild(nsnull);
790
nsIFrame* firstTextFrame = nsnull;
791
PRBool ret = nsAccessible::FindTextFrame(index, presContext, childFrame, &firstTextFrame, frame);
792
if (!ret || index != 0)
793
return NS_ERROR_FAILURE;
795
*_retval = new nsHTMLBlockAccessible(node, weakShell);
796
#endif //MOZ_ACCESSIBILITY_ATK
798
return NS_ERROR_OUT_OF_MEMORY;
805
nsAccessibilityService::CreateHTMLTextFieldAccessible(nsISupports *aFrame, nsIAccessible **_retval)
808
nsCOMPtr<nsIDOMNode> node;
809
nsCOMPtr<nsIWeakReference> weakShell;
810
nsresult rv = GetInfo(aFrame, &frame, getter_AddRefs(weakShell), getter_AddRefs(node));
814
*_retval = new nsHTMLTextFieldAccessibleWrap(node, weakShell);
816
return NS_ERROR_OUT_OF_MEMORY;
823
nsAccessibilityService::CreateXULTextBoxAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
826
nsCOMPtr<nsIWeakReference> weakShell;
827
GetShellFromNode(aNode, getter_AddRefs(weakShell));
829
// reusing the HTML accessible widget and enhancing for XUL
830
*_retval = new nsHTMLTextFieldAccessible(aNode, weakShell);
832
return NS_ERROR_OUT_OF_MEMORY;
842
nsAccessibilityService::CreateHTMLLabelAccessible(nsISupports *aFrame, nsIAccessible **_retval)
845
nsCOMPtr<nsIDOMNode> node;
846
nsCOMPtr<nsIWeakReference> weakShell;
847
nsresult rv = GetInfo(aFrame, &frame, getter_AddRefs(weakShell), getter_AddRefs(node));
851
*_retval = new nsHTMLLabelAccessible(node, weakShell);
853
return NS_ERROR_OUT_OF_MEMORY;
860
nsAccessibilityService::CreateHTMLHRAccessible(nsISupports *aFrame, nsIAccessible **_retval)
863
nsCOMPtr<nsIDOMNode> node;
864
nsCOMPtr<nsIWeakReference> weakShell;
865
nsresult rv = GetInfo(aFrame, &frame, getter_AddRefs(weakShell), getter_AddRefs(node));
869
*_retval = new nsHTMLHRAccessible(node, weakShell);
871
return NS_ERROR_OUT_OF_MEMORY;
878
* XUL widget creation
879
* we can't ifdef this whole block because there is no way to exclude
880
* these methods from the idl definition conditionally (MOZ_XUL).
881
* XXXjgaunt what needs to happen is all of the CreateFooAcc() methods get re-written
882
* into a single method.
885
NS_IMETHODIMP nsAccessibilityService::CreateXULButtonAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
888
nsCOMPtr<nsIWeakReference> weakShell;
889
GetShellFromNode(aNode, getter_AddRefs(weakShell));
891
// reusing the HTML accessible widget and enhancing for XUL
892
*_retval = new nsXULButtonAccessible(aNode, weakShell);
894
return NS_ERROR_OUT_OF_MEMORY;
904
nsAccessibilityService::CreateXULCheckboxAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
907
nsCOMPtr<nsIWeakReference> weakShell;
908
GetShellFromNode(aNode, getter_AddRefs(weakShell));
910
// reusing the HTML accessible widget and enhancing for XUL
911
*_retval = new nsXULCheckboxAccessible(aNode, weakShell);
913
return NS_ERROR_OUT_OF_MEMORY;
923
nsAccessibilityService::CreateXULColorPickerAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
926
nsCOMPtr<nsIWeakReference> weakShell;
927
GetShellFromNode(aNode, getter_AddRefs(weakShell));
929
*_retval = new nsXULColorPickerAccessible(aNode, weakShell);
931
return NS_ERROR_OUT_OF_MEMORY;
941
nsAccessibilityService::CreateXULColorPickerTileAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
944
nsCOMPtr<nsIWeakReference> weakShell;
945
GetShellFromNode(aNode, getter_AddRefs(weakShell));
947
*_retval = new nsXULColorPickerTileAccessible(aNode, weakShell);
949
return NS_ERROR_OUT_OF_MEMORY;
959
nsAccessibilityService::CreateXULComboboxAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
962
nsCOMPtr<nsIWeakReference> weakShell;
963
GetShellFromNode(aNode, getter_AddRefs(weakShell));
965
*_retval = new nsXULComboboxAccessible(aNode, weakShell);
967
return NS_ERROR_OUT_OF_MEMORY;
977
nsAccessibilityService::CreateXULDropmarkerAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
980
nsCOMPtr<nsIWeakReference> weakShell;
981
GetShellFromNode(aNode, getter_AddRefs(weakShell));
983
*_retval = new nsXULDropmarkerAccessible(aNode, weakShell);
985
return NS_ERROR_OUT_OF_MEMORY;
995
nsAccessibilityService::CreateXULGroupboxAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
998
nsCOMPtr<nsIWeakReference> weakShell;
999
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1001
*_retval = new nsXULGroupboxAccessible(aNode, weakShell);
1003
return NS_ERROR_OUT_OF_MEMORY;
1005
NS_ADDREF(*_retval);
1013
nsAccessibilityService::CreateXULImageAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1016
// Don't include nameless images in accessible tree
1019
nsCOMPtr<nsIDOMElement> elt(do_QueryInterface(aNode));
1021
return NS_ERROR_FAILURE;
1022
PRBool hasTextEquivalent;
1023
elt->HasAttribute(NS_LITERAL_STRING("tooltiptext"), &hasTextEquivalent); // Prefer value over tooltiptext
1024
if (!hasTextEquivalent) {
1028
nsCOMPtr<nsIWeakReference> weakShell;
1029
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1031
*_retval = new nsHTMLImageAccessible(aNode, weakShell);
1033
return NS_ERROR_OUT_OF_MEMORY;
1035
NS_ADDREF(*_retval);
1044
nsAccessibilityService::CreateXULListboxAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1047
nsCOMPtr<nsIWeakReference> weakShell;
1048
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1050
*_retval = new nsXULListboxAccessible(aNode, weakShell);
1052
return NS_ERROR_OUT_OF_MEMORY;
1054
NS_ADDREF(*_retval);
1062
nsAccessibilityService::CreateXULListitemAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1065
nsCOMPtr<nsIWeakReference> weakShell;
1066
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1068
*_retval = new nsXULListitemAccessible(aNode, weakShell);
1070
return NS_ERROR_OUT_OF_MEMORY;
1072
NS_ADDREF(*_retval);
1080
nsAccessibilityService::CreateXULMenubarAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1083
nsCOMPtr<nsIWeakReference> weakShell;
1084
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1086
*_retval = new nsXULMenubarAccessible(aNode, weakShell);
1088
return NS_ERROR_OUT_OF_MEMORY;
1090
NS_ADDREF(*_retval);
1098
nsAccessibilityService::CreateXULMenuitemAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1101
nsCOMPtr<nsIWeakReference> weakShell;
1102
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1104
*_retval = new nsXULMenuitemAccessible(aNode, weakShell);
1106
return NS_ERROR_OUT_OF_MEMORY;
1108
NS_ADDREF(*_retval);
1116
nsAccessibilityService::CreateXULMenupopupAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1119
nsCOMPtr<nsIWeakReference> weakShell;
1120
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1122
*_retval = new nsXULMenupopupAccessible(aNode, weakShell);
1124
return NS_ERROR_OUT_OF_MEMORY;
1126
NS_ADDREF(*_retval);
1134
nsAccessibilityService::CreateXULMenuSeparatorAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1137
nsCOMPtr<nsIWeakReference> weakShell;
1138
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1140
*_retval = new nsXULMenuSeparatorAccessible(aNode, weakShell);
1142
return NS_ERROR_OUT_OF_MEMORY;
1144
NS_ADDREF(*_retval);
1152
nsAccessibilityService::CreateXULProgressMeterAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1155
nsCOMPtr<nsIWeakReference> weakShell;
1156
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1158
*_retval = new nsXULProgressMeterAccessibleWrap(aNode, weakShell);
1160
return NS_ERROR_OUT_OF_MEMORY;
1162
NS_ADDREF(*_retval);
1170
nsAccessibilityService::CreateXULRadioButtonAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1173
nsCOMPtr<nsIWeakReference> weakShell;
1174
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1176
*_retval = new nsXULRadioButtonAccessible(aNode, weakShell);
1178
return NS_ERROR_OUT_OF_MEMORY;
1180
NS_ADDREF(*_retval);
1188
nsAccessibilityService::CreateXULRadioGroupAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1191
nsCOMPtr<nsIWeakReference> weakShell;
1192
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1194
*_retval = new nsXULRadioGroupAccessible(aNode, weakShell);
1196
return NS_ERROR_OUT_OF_MEMORY;
1198
NS_ADDREF(*_retval);
1206
nsAccessibilityService::CreateXULSelectListAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1209
nsCOMPtr<nsIWeakReference> weakShell;
1210
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1212
*_retval = new nsXULSelectListAccessible(aNode, weakShell);
1214
return NS_ERROR_OUT_OF_MEMORY;
1216
NS_ADDREF(*_retval);
1224
nsAccessibilityService::CreateXULSelectOptionAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1227
nsCOMPtr<nsIWeakReference> weakShell;
1228
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1230
*_retval = new nsXULSelectOptionAccessible(aNode, weakShell);
1232
return NS_ERROR_OUT_OF_MEMORY;
1234
NS_ADDREF(*_retval);
1242
nsAccessibilityService::CreateXULStatusBarAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1245
nsCOMPtr<nsIWeakReference> weakShell;
1246
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1248
*_retval = new nsXULStatusBarAccessible(aNode, weakShell);
1250
return NS_ERROR_OUT_OF_MEMORY;
1252
NS_ADDREF(*_retval);
1260
nsAccessibilityService::CreateXULTextAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1263
nsCOMPtr<nsIWeakReference> weakShell;
1264
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1266
// reusing the HTML accessible widget and enhancing for XUL
1267
*_retval = new nsXULTextAccessible(aNode, weakShell);
1269
return NS_ERROR_OUT_OF_MEMORY;
1271
NS_ADDREF(*_retval);
1278
/** The single tab in a dialog or tabbrowser/editor interface */
1279
NS_IMETHODIMP nsAccessibilityService::CreateXULTabAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1282
nsCOMPtr<nsIWeakReference> weakShell;
1283
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1285
*_retval = new nsXULTabAccessible(aNode, weakShell);
1287
return NS_ERROR_OUT_OF_MEMORY;
1289
NS_ADDREF(*_retval);
1296
/** A combination of a tabs object and a tabpanels object */
1297
NS_IMETHODIMP nsAccessibilityService::CreateXULTabBoxAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1300
nsCOMPtr<nsIWeakReference> weakShell;
1301
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1303
*_retval = new nsXULTabBoxAccessible(aNode, weakShell);
1305
return NS_ERROR_OUT_OF_MEMORY;
1307
NS_ADDREF(*_retval);
1314
/** The display area for a dialog or tabbrowser interface */
1315
NS_IMETHODIMP nsAccessibilityService::CreateXULTabPanelsAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1318
nsCOMPtr<nsIWeakReference> weakShell;
1319
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1321
*_retval = new nsXULTabPanelsAccessible(aNode, weakShell);
1323
return NS_ERROR_OUT_OF_MEMORY;
1325
NS_ADDREF(*_retval);
1332
/** The collection of tab objects, useable in the TabBox and independant of as well */
1333
NS_IMETHODIMP nsAccessibilityService::CreateXULTabsAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1336
nsCOMPtr<nsIWeakReference> weakShell;
1337
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1339
*_retval = new nsXULTabsAccessible(aNode, weakShell);
1341
return NS_ERROR_OUT_OF_MEMORY;
1343
NS_ADDREF(*_retval);
1350
NS_IMETHODIMP nsAccessibilityService::CreateXULToolbarAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1353
nsCOMPtr<nsIWeakReference> weakShell;
1354
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1356
*_retval = new nsXULToolbarAccessible(aNode, weakShell);
1358
return NS_ERROR_OUT_OF_MEMORY;
1360
NS_ADDREF(*_retval);
1367
NS_IMETHODIMP nsAccessibilityService::CreateXULToolbarSeparatorAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1370
nsCOMPtr<nsIWeakReference> weakShell;
1371
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1373
*_retval = new nsXULToolbarSeparatorAccessible(aNode, weakShell);
1375
return NS_ERROR_OUT_OF_MEMORY;
1377
NS_ADDREF(*_retval);
1384
NS_IMETHODIMP nsAccessibilityService::CreateXULTooltipAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1387
#ifndef MOZ_ACCESSIBILITY_ATK
1388
nsCOMPtr<nsIWeakReference> weakShell;
1389
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1391
*_retval = new nsXULTooltipAccessible(aNode, weakShell);
1393
return NS_ERROR_OUT_OF_MEMORY;
1395
NS_ADDREF(*_retval);
1398
#endif // MOZ_ACCESSIBILITY_ATK
1405
NS_IMETHODIMP nsAccessibilityService::CreateXULTreeAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1408
nsCOMPtr<nsIWeakReference> weakShell;
1409
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1411
*_retval = new nsXULTreeAccessibleWrap(aNode, weakShell);
1413
return NS_ERROR_OUT_OF_MEMORY;
1415
NS_ADDREF(*_retval);
1422
NS_IMETHODIMP nsAccessibilityService::CreateXULTreeColumnsAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1425
nsCOMPtr<nsIWeakReference> weakShell;
1426
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1428
*_retval = new nsXULTreeColumnsAccessibleWrap(aNode, weakShell);
1430
return NS_ERROR_OUT_OF_MEMORY;
1432
NS_ADDREF(*_retval);
1439
NS_IMETHODIMP nsAccessibilityService::CreateXULTreeColumnitemAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
1442
nsCOMPtr<nsIWeakReference> weakShell;
1443
GetShellFromNode(aNode, getter_AddRefs(weakShell));
1445
*_retval = new nsXULTreeColumnitemAccessible(aNode, weakShell);
1447
return NS_ERROR_OUT_OF_MEMORY;
1449
NS_ADDREF(*_retval);
1457
NS_IMETHODIMP nsAccessibilityService::GetCachedAccessible(nsIDOMNode *aNode,
1458
nsIWeakReference *aWeakShell,
1459
nsIAccessible **aAccessible)
1461
nsCOMPtr<nsIAccessNode> accessNode;
1462
nsresult rv = GetCachedAccessNode(aNode, aWeakShell, getter_AddRefs(accessNode));
1463
nsCOMPtr<nsIAccessible> accessible(do_QueryInterface(accessNode));
1464
NS_IF_ADDREF(*aAccessible = accessible);
1468
NS_IMETHODIMP nsAccessibilityService::GetCachedAccessNode(nsIDOMNode *aNode,
1469
nsIWeakReference *aWeakShell,
1470
nsIAccessNode **aAccessNode)
1472
nsCOMPtr<nsIAccessibleDocument> accessibleDoc;
1473
nsAccessNode::GetDocAccessibleFor(aWeakShell, getter_AddRefs(accessibleDoc));
1475
if (!accessibleDoc) {
1476
*aAccessNode = nsnull;
1477
return NS_ERROR_FAILURE;
1480
return accessibleDoc->GetCachedAccessNode(NS_STATIC_CAST(void*, aNode), aAccessNode);
1484
* GetAccessibleFor - get an nsIAccessible from a DOM node
1487
NS_IMETHODIMP nsAccessibilityService::GetAccessibleFor(nsIDOMNode *aNode,
1488
nsIAccessible **aAccessible)
1490
// It's not ideal to call this -- it will assume shell #0
1491
// Some of our old test scripts still use it
1492
nsCOMPtr<nsIContent> content(do_QueryInterface(aNode));
1493
nsCOMPtr<nsIDocument> doc;
1495
doc = content->GetDocument();
1497
else {// Could be document node
1498
doc = do_QueryInterface(aNode);
1501
return NS_ERROR_FAILURE;
1503
nsIPresShell *presShell = doc->GetShellAt(0);
1504
return GetAccessibleInShell(aNode, presShell, aAccessible);
1507
NS_IMETHODIMP nsAccessibilityService::GetAccessibleInWindow(nsIDOMNode *aNode,
1509
nsIAccessible **aAccessible)
1511
nsCOMPtr<nsIWebNavigation> webNav(do_GetInterface(aWin));
1512
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(webNav));
1514
return NS_ERROR_FAILURE;
1516
nsCOMPtr<nsIPresShell> presShell;
1517
docShell->GetPresShell(getter_AddRefs(presShell));
1518
return GetAccessibleInShell(aNode, presShell, aAccessible);
1521
NS_IMETHODIMP nsAccessibilityService::GetAccessibleInShell(nsIDOMNode *aNode,
1522
nsIPresShell *aPresShell,
1523
nsIAccessible **aAccessible)
1525
nsCOMPtr<nsIWeakReference> weakShell(do_GetWeakReference(aPresShell));
1526
return GetAccessible(aNode, aPresShell, weakShell, aAccessible);
1529
NS_IMETHODIMP nsAccessibilityService::GetAccessibleInWeakShell(nsIDOMNode *aNode,
1530
nsIWeakReference *aWeakShell,
1531
nsIAccessible **aAccessible)
1533
nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(aWeakShell));
1534
return GetAccessible(aNode, presShell, aWeakShell, aAccessible);
1537
nsresult nsAccessibilityService::GetAccessible(nsIDOMNode *aNode,
1538
nsIPresShell *aPresShell,
1539
nsIWeakReference *aWeakShell,
1540
nsIAccessible **aAccessible)
1542
*aAccessible = nsnull;
1543
if (!aPresShell || !aWeakShell) {
1544
return NS_ERROR_FAILURE;
1547
NS_ASSERTION(aNode, "GetAccessibleFor() called with no node.");
1550
// Please leave this in for now, it's a convenient debugging method
1552
aNode->GetLocalName(name);
1553
if (name.EqualsIgnoreCase("browser"))
1554
printf("## aaronl debugging tag name\n");
1556
nsAutoString attrib;
1557
nsCOMPtr<nsIDOMElement> element(do_QueryInterface(aNode));
1559
element->GetAttribute(NS_LITERAL_STRING("type"), attrib);
1560
if (attrib.Equals(NS_LITERAL_STRING("checkbox")))
1561
printf("## aaronl debugging attribute\n");
1565
// Check to see if we already have an accessible for this
1566
// node in the cache
1567
nsCOMPtr<nsIAccessNode> accessNode;
1568
GetCachedAccessNode(aNode, aWeakShell, getter_AddRefs(accessNode));
1570
nsCOMPtr<nsIAccessible> newAcc;
1572
// Retrieved from cache
1573
// QI might not succeed if it's a node that's not accessible
1574
newAcc = do_QueryInterface(accessNode);
1575
NS_IF_ADDREF(*aAccessible = newAcc);
1579
// No cache entry, so we must create the accessible
1581
// XUL elements may implement nsIAccessibleProvider via XBL
1582
// This allows them to say what kind of accessible to create
1583
nsCOMPtr<nsIAccessibleProvider> accProv(do_QueryInterface(aNode));
1585
accProv->GetAccessible(getter_AddRefs(newAcc));
1587
return NS_ERROR_FAILURE;
1588
PRUint32 role, state;
1589
newAcc->GetRole(&role);
1590
// don't create the accessible object for popup widget when it's not visible
1591
if (role == nsIAccessible::ROLE_MENUPOPUP) {
1592
newAcc->GetState(&state);
1593
if (state & (nsIAccessible::STATE_INVISIBLE | nsIAccessible::STATE_OFFSCREEN))
1594
return NS_ERROR_FAILURE;
1596
nsCOMPtr<nsPIAccessNode> privateAccessNode = do_QueryInterface(newAcc);
1597
privateAccessNode->Init(); // Add to cache, etc.
1598
*aAccessible = newAcc;
1599
NS_ADDREF(*aAccessible);
1604
nsCOMPtr<nsIDOMXULElement> xulElement(do_QueryInterface(aNode));
1606
return NS_ERROR_FAILURE;
1609
// ---- Get the document for this node ----
1610
nsCOMPtr<nsIDocument> doc;
1611
nsCOMPtr<nsIDocument> nodeIsDoc(do_QueryInterface(aNode));
1615
nsCOMPtr<nsIDOMDocument> domDoc;
1616
aNode->GetOwnerDocument(getter_AddRefs(domDoc));
1618
return NS_ERROR_INVALID_ARG;
1619
doc = do_QueryInterface(domDoc);
1622
return NS_ERROR_INVALID_ARG;
1624
// ---- Check if area node ----
1625
nsCOMPtr<nsIDOMHTMLAreaElement> areaContent(do_QueryInterface(aNode));
1626
if (areaContent) // Area elements are implemented in nsHTMLImageAccessible as children of the image
1627
return NS_ERROR_FAILURE; // Return, otherwise the image frame looks like an accessible object in the wrong place
1629
// ---- Check if we need outer owning doc ----
1630
nsCOMPtr<nsIContent> content(do_QueryInterface(aNode));
1631
if (!content && nodeIsDoc) {
1632
// This happens when we're on the document node, which will not QI to an nsIContent,
1633
nsCOMPtr<nsIAccessibleDocument> accessibleDoc;
1634
nsAccessNode::GetDocAccessibleFor(aWeakShell, getter_AddRefs(accessibleDoc));
1635
if (accessibleDoc) {
1636
newAcc = do_QueryInterface(accessibleDoc);
1637
NS_ASSERTION(newAcc, "nsIAccessibleDocument is not an nsIAccessible");
1640
CreateRootAccessible(aPresShell, doc, getter_AddRefs(newAcc)); // Does Init() for us
1641
NS_ASSERTION(newAcc, "No root/doc accessible created");
1644
NS_ADDREF(*aAccessible = newAcc );
1648
NS_ASSERTION(content, "GetAccessibleFor() called with no content.");
1650
// ---- Try using frame to get nsIAccessible ----
1651
nsIFrame* frame = nsnull;
1652
aPresShell->GetPrimaryFrameFor(content, &frame);
1654
return NS_ERROR_FAILURE;
1656
frame->GetAccessible(getter_AddRefs(newAcc));
1658
#ifndef MOZ_ACCESSIBILITY_ATK
1659
// ---- If link, create link accessible ----
1662
nsCOMPtr<nsILink> link(do_QueryInterface(aNode));
1664
newAcc = new nsHTMLLinkAccessible(aNode, aWeakShell);
1667
#endif //MOZ_ACCESSIBILITY_ATK
1669
// ---- If <select> <option>, create select option accessible
1672
nsCOMPtr<nsIDOMHTMLOptionElement> optionElement(do_QueryInterface(aNode));
1673
if (optionElement) {
1674
newAcc = new nsHTMLSelectOptionAccessible(aNode, aWeakShell);
1677
// See if this is an <optgroup>,
1678
// create the accessible for the optgroup.
1680
nsCOMPtr<nsIDOMHTMLOptGroupElement> optGroupElement(do_QueryInterface(aNode));
1681
if (optGroupElement) {
1682
newAcc = new nsHTMLSelectOptGroupAccessible(aNode, aWeakShell);
1687
return NS_ERROR_FAILURE;
1689
nsCOMPtr<nsPIAccessNode> privateAccessNode = do_QueryInterface(newAcc);
1690
privateAccessNode->Init(); // Add to cache, etc.
1692
*aAccessible = newAcc;
1693
NS_ADDREF(*aAccessible);
1698
//////////////////////////////////////////////////////////////////////
1699
//////////////////////////////////////////////////////////////////////
1702
nsAccessibilityService::GetAccessibilityService(nsIAccessibilityService** aResult)
1704
NS_PRECONDITION(aResult != nsnull, "null ptr");
1706
return NS_ERROR_NULL_POINTER;
1709
if (!nsAccessibilityService::gAccessibilityService) {
1710
gAccessibilityService = new nsAccessibilityService();
1711
if (!gAccessibilityService ) {
1712
return NS_ERROR_OUT_OF_MEMORY;
1715
*aResult = nsAccessibilityService::gAccessibilityService;
1716
NS_ADDREF(*aResult);
1721
NS_GetAccessibilityService(nsIAccessibilityService** aResult)
1723
return nsAccessibilityService::GetAccessibilityService(aResult);