From 44961e9ce2e94b9f6cd963074061eef4ab89add5 Mon Sep 17 00:00:00 2001 From: Trevor Saunders Date: Tue, 10 Jan 2012 11:43:27 -0500 Subject: [PATCH] bug 672507 - merge nsIAccessNode and nsIAccessible r=davidb, surkov --- accessible/public/Makefile.in | 1 - accessible/public/msaa/ISimpleDOMNode.idl | 2 +- accessible/public/nsIAccessNode.idl | 126 -------------- accessible/public/nsIAccessible.idl | 70 ++++++++ accessible/public/nsIAccessibleDocument.idl | 8 +- accessible/public/nsIAccessibleRetrieval.idl | 7 +- accessible/src/atk/nsMaiInterfaceDocument.cpp | 2 +- accessible/src/base/nsAccUtils.h | 1 - accessible/src/base/nsAccessNode.cpp | 158 +++--------------- accessible/src/base/nsAccessNode.h | 43 ++--- accessible/src/base/nsAccessible.cpp | 115 +++++++++++++ accessible/src/base/nsAccessible.h | 11 ++ .../src/base/nsApplicationAccessible.cpp | 2 +- accessible/src/base/nsApplicationAccessible.h | 4 +- accessible/src/base/nsCoreUtils.h | 2 +- accessible/src/base/nsTextAttrs.cpp | 4 +- accessible/src/html/nsHyperTextAccessible.cpp | 6 +- accessible/src/msaa/CAccessibleComponent.cpp | 2 +- accessible/src/msaa/nsAccessNodeWrap.cpp | 12 +- accessible/src/msaa/nsAccessibleWrap.cpp | 8 +- .../src/xul/nsXULFormControlAccessible.cpp | 15 +- accessible/src/xul/nsXULTabAccessible.cpp | 8 +- accessible/tests/mochitest/common.js | 18 +- .../mochitest/events/test_contextmenu.html | 2 +- .../mochitest/hypertext/test_update.html | 2 +- .../mochitest/test_nsIAccessNode_utils.html | 4 +- .../tests/mochitest/treeupdate/test_doc.html | 4 +- 27 files changed, 274 insertions(+), 363 deletions(-) delete mode 100644 accessible/public/nsIAccessNode.idl diff --git a/accessible/public/Makefile.in b/accessible/public/Makefile.in index b25d0eae0c39..24e0c5ea01cf 100644 --- a/accessible/public/Makefile.in +++ b/accessible/public/Makefile.in @@ -61,7 +61,6 @@ XPIDLSRCS = \ nsIAccessibleDocument.idl \ nsIAccessibleProvider.idl \ nsIAccessibleSelectable.idl \ - nsIAccessNode.idl \ nsIAccessibleCursorable.idl \ nsIAccessibleEvent.idl \ nsIAccessibleEditableText.idl \ diff --git a/accessible/public/msaa/ISimpleDOMNode.idl b/accessible/public/msaa/ISimpleDOMNode.idl index 9679b8600acc..5b7eb1d26319 100644 --- a/accessible/public/msaa/ISimpleDOMNode.idl +++ b/accessible/public/msaa/ISimpleDOMNode.idl @@ -117,7 +117,7 @@ cpp_quote("//") cpp_quote("//") cpp_quote("// get_localInterface(/* [out] */ void **localInterface);") cpp_quote("// ---------------------------------------------------------------------------------------------------=") -cpp_quote("// Only available in Gecko's process - casts to an XPCOM nsIAccessNode interface pointer") +cpp_quote("// Only available in Gecko's process - casts to an XPCOM nsAccessNode object pointer") cpp_quote("//") cpp_quote("//") cpp_quote("// get_language(/* [out] */ BSTR *htmlText);") diff --git a/accessible/public/nsIAccessNode.idl b/accessible/public/nsIAccessNode.idl deleted file mode 100644 index e938b88132c2..000000000000 --- a/accessible/public/nsIAccessNode.idl +++ /dev/null @@ -1,126 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2003 - * the Initial Developer. All Rights Reserved. - * - * Original Author: Aaron Leventhal (aaronl@netscape.com) - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsISupports.idl" - -interface nsIDOMNode; -interface nsIAccessibleDocument; -interface nsIDOMCSSPrimitiveValue; - -/** - * An interface used by in-process accessibility clients - * to get style, window, markup and other information about - * a DOM node. When accessibility is active in Gecko, - * every DOM node can have one nsIAccessNode for each - * pres shell the DOM node is rendered in. - * The nsIAccessNode implementations are instantiated lazily. - * The nsIAccessNode tree for a given dom window - * has a one to one relationship to the DOM tree. - * If the DOM node for this access node is "accessible", - * then a QueryInterface to nsIAccessible will succeed. - */ -[scriptable, uuid(08bb2c50-1b30-11e1-bddb-0800200c9a66)] -interface nsIAccessNode : nsISupports -{ - /** - * The DOM node this nsIAccessNode is associated with. - */ - readonly attribute nsIDOMNode DOMNode; - - /** - * The document accessible that this access node resides in. - */ - readonly attribute nsIAccessibleDocument document; - - /** - * The root document accessible that this access node resides in. - */ - readonly attribute nsIAccessibleDocument rootDocument; - - /** - * The innerHTML for the DOM node - * This is a text string of all the markup inside the DOM - * node, not including the start and end tag for the node. - */ - readonly attribute DOMString innerHTML; - - /** - * Makes an object visible on screen. - * - * @param scrollType - defines where the object should be placed on - * the screen (see nsIAccessibleScrollType for - * available constants). - */ - void scrollTo(in unsigned long aScrollType); - - /** - * Moves the top left of an object to a specified location. - * - * @param coordinateType - specifies whether the coordinates are relative to - * the screen or the parent object (for available - * constants refer to nsIAccessibleCoordinateType) - * @param aX - defines the x coordinate - * @param aY - defines the y coordinate - */ - void scrollToPoint(in unsigned long aCoordinateType, in long aX, in long aY); - - /** - * Retrieve the computed style value for this DOM node, if it is a DOM element. - * Note: the meanings of width, height and other size measurements depend - * on the version of CSS being used. Therefore, for bounds information, - * it is better to use nsIAccessible::accGetBounds. - * @param pseudoElt The pseudo element to retrieve style for, or NULL - * for general computed style information for this node. - * @param propertyName Retrieve the computed style value for this property name, - * for example "border-bottom". - */ - DOMString getComputedStyleValue(in DOMString pseudoElt, in DOMString propertyName); - - /** - * The method is similar to getComputedStyleValue() excepting that this one - * returns nsIDOMCSSPrimitiveValue. - */ - nsIDOMCSSPrimitiveValue getComputedStyleCSSValue(in DOMString pseudoElt, - in DOMString propertyName); - - /** - * The language for the current DOM node, e.g. en, de, etc. - */ - readonly attribute DOMString language; -}; - diff --git a/accessible/public/nsIAccessible.idl b/accessible/public/nsIAccessible.idl index bef69df27772..2e46b5fbd36e 100644 --- a/accessible/public/nsIAccessible.idl +++ b/accessible/public/nsIAccessible.idl @@ -43,7 +43,10 @@ #include "nsIArray.idl" interface nsIPersistentProperties; +interface nsIDOMCSSPrimitiveValue; interface nsIDOMDOMStringList; +interface nsIDOMNode; +interface nsIAccessibleDocument; interface nsIAccessibleRelation; /** @@ -100,6 +103,53 @@ interface nsIAccessible : nsISupports */ readonly attribute long indexInParent; + /** + * The innerHTML for the HTML element associated with this accessible if applicable. + * This is a text string of all the markup inside the DOM + * node, not including the start and end tag for the node. + */ + readonly attribute DOMString innerHTML; + + /** + * Retrieve the computed style value for this DOM node, if it is a DOM element. + * Note: the meanings of width, height and other size measurements depend + * on the version of CSS being used. Therefore, for bounds information, + * it is better to use nsIAccessible::accGetBounds. + * + * @param pseudoElt [in] The pseudo element to retrieve style for, or NULL + * for general computed style information for this node. + * @param propertyName [in] Retrieve the computed style value for this property name, + * for example "border-bottom". + */ + DOMString getComputedStyleValue(in DOMString pseudoElt, in DOMString propertyName); + + /** + * The method is similar to getComputedStyleValue() excepting that this one + * returns nsIDOMCSSPrimitiveValue. + */ + nsIDOMCSSPrimitiveValue getComputedStyleCSSValue(in DOMString pseudoElt, + in DOMString propertyName); + + /** + * The DOM node this nsIAccessible is associated with. + */ + readonly attribute nsIDOMNode DOMNode; + + /** + * The document accessible that this access node resides in. + */ + readonly attribute nsIAccessibleDocument document; + + /** + * The root document accessible that this access node resides in. + */ + readonly attribute nsIAccessibleDocument rootDocument; + + /** + * The language for the current DOM node, e.g. en, de, etc. + */ + readonly attribute DOMString language; + /** * Accessible name -- the main text equivalent for this node. The name is * specified by ARIA or by native markup. Example of ARIA markup is @@ -285,6 +335,26 @@ interface nsIAccessible : nsISupports */ void doAction(in PRUint8 index); + /** + * Makes an object visible on screen. + * + * @param scrollType - defines where the object should be placed on + * the screen (see nsIAccessibleScrollType for + * available constants). + */ + void scrollTo(in unsigned long aScrollType); + + /** + * Moves the top left of an object to a specified location. + * + * @param coordinateType [in] - specifies whether the coordinates are relative to + * the screen or the parent object (for available + * constants refer to nsIAccessibleCoordinateType) + * @param x [in] - defines the x coordinate + * @param y [in] - defines the y coordinate + */ + void scrollToPoint(in unsigned long coordinateType, in long x, in long y); + /** * Get a pointer to accessibility interface for this node, which is specific * to the OS/accessibility toolkit we're running on. diff --git a/accessible/public/nsIAccessibleDocument.idl b/accessible/public/nsIAccessibleDocument.idl index 73d909c065f0..0293f4ea467e 100644 --- a/accessible/public/nsIAccessibleDocument.idl +++ b/accessible/public/nsIAccessibleDocument.idl @@ -39,7 +39,6 @@ #include "nsISupports.idl" interface nsIAccessible; -interface nsIAccessNode; interface nsIDOMDocument; interface nsIDOMNode; interface nsIDOMWindow; @@ -50,10 +49,9 @@ interface nsIDOMWindow; * When accessibility is turned on in Gecko, * there is an nsIAccessibleDocument for each document * whether it is XUL, HTML or whatever. - * You can QueryInterface to nsIAccessibleDocument from - * the nsIAccessible or nsIAccessNode for the root node - * of a document. You can also get one from - * nsIAccessNode::GetAccessibleDocument() or + * You can QueryInterface to nsIAccessibleDocument from the nsIAccessible for + * the root node of a document. You can also get one from + * nsIAccessible::GetAccessibleDocument() or * nsIAccessibleEvent::GetAccessibleDocument() */ [scriptable, uuid(451242bd-8a0c-4198-ae88-c053609a4e5d)] diff --git a/accessible/public/nsIAccessibleRetrieval.idl b/accessible/public/nsIAccessibleRetrieval.idl index e433b20cc66f..368b40b911f4 100644 --- a/accessible/public/nsIAccessibleRetrieval.idl +++ b/accessible/public/nsIAccessibleRetrieval.idl @@ -43,15 +43,12 @@ interface nsIAccessible; interface nsIWeakReference; interface nsIPresShell; interface nsIDOMWindow; -interface nsIAccessNode; interface nsIDOMDOMStringList; interface nsIAccessiblePivot; /** - * An interface for in-process accessibility clients - * wishing to get an nsIAccessible or nsIAccessNode for - * a given DOM node. - * More documentation at: + * An interface for in-process accessibility clients wishing to get an + * nsIAccessible for a given DOM node. More documentation at: * http://www.mozilla.org/projects/ui/accessibility */ [scriptable, uuid(310ce77d-c92b-4761-82e8-77e1a728e8d4)] diff --git a/accessible/src/atk/nsMaiInterfaceDocument.cpp b/accessible/src/atk/nsMaiInterfaceDocument.cpp index c0525a12b315..2f31f96164d1 100644 --- a/accessible/src/atk/nsMaiInterfaceDocument.cpp +++ b/accessible/src/atk/nsMaiInterfaceDocument.cpp @@ -79,7 +79,7 @@ getDocumentLocaleCB(AtkDocument *aDocument) return nsnull; nsAutoString locale; - accWrap->GetLanguage(locale); + accWrap->Language(locale); return locale.IsEmpty() ? nsnull : nsAccessibleWrap::ReturnString(locale); } diff --git a/accessible/src/base/nsAccUtils.h b/accessible/src/base/nsAccUtils.h index f471fb559a71..2fd8a1ec2307 100644 --- a/accessible/src/base/nsAccUtils.h +++ b/accessible/src/base/nsAccUtils.h @@ -40,7 +40,6 @@ #define nsAccUtils_h_ #include "nsIAccessible.h" -#include "nsIAccessNode.h" #include "nsIAccessibleRole.h" #include "nsIAccessibleText.h" #include "nsIAccessibleTable.h" diff --git a/accessible/src/base/nsAccessNode.cpp b/accessible/src/base/nsAccessNode.cpp index 70bb46422425..1449678273ea 100644 --- a/accessible/src/base/nsAccessNode.cpp +++ b/accessible/src/base/nsAccessNode.cpp @@ -36,37 +36,27 @@ * * ***** END LICENSE BLOCK ***** */ -#include "nsDocAccessible.h" +#include "nsAccessNode.h" -#include "nsIAccessible.h" - -#include "nsAccCache.h" +#include "nsAccessibilityService.h" #include "nsAccUtils.h" +#include "nsApplicationAccessibleWrap.h" #include "nsCoreUtils.h" +#include "nsRootAccessible.h" -#include "nsHashtable.h" -#include "nsAccessibilityService.h" -#include "nsApplicationAccessibleWrap.h" #include "nsIDocShell.h" #include "nsIDocShellTreeItem.h" -#include "nsIDocument.h" -#include "nsIDOMCSSPrimitiveValue.h" -#include "nsIDOMDocument.h" -#include "nsIDOMElement.h" -#include "nsIDOMHTMLElement.h" #include "nsIDOMWindow.h" -#include "nsPIDOMWindow.h" -#include "nsIInterfaceRequestorUtils.h" #include "nsIFrame.h" -#include "nsIPrefService.h" +#include "nsIInterfaceRequestorUtils.h" +#include "nsIObserverService.h" #include "nsIPrefBranch.h" -#include "nsPresContext.h" +#include "nsIPrefService.h" #include "nsIPresShell.h" #include "nsIServiceManager.h" #include "nsIStringBundle.h" -#include "nsRootAccessible.h" #include "nsFocusManager.h" -#include "nsIObserverService.h" +#include "nsPresContext.h" #include "mozilla/Services.h" /* For documentation of the accessibility architecture, @@ -89,9 +79,7 @@ nsApplicationAccessible *nsAccessNode::gApplicationAccessible = nsnull; NS_IMPL_CYCLE_COLLECTION_1(nsAccessNode, mContent) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsAccessNode) - NS_INTERFACE_MAP_ENTRY(nsIAccessNode) NS_INTERFACE_MAP_ENTRY(nsAccessNode) - NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIAccessNode) NS_INTERFACE_MAP_END NS_IMPL_CYCLE_COLLECTING_ADDREF(nsAccessNode) @@ -287,126 +275,28 @@ nsAccessNode::IsPrimaryForNode() const } //////////////////////////////////////////////////////////////////////////////// -// nsIAccessNode - -NS_IMETHODIMP -nsAccessNode::GetDOMNode(nsIDOMNode **aDOMNode) -{ - NS_ENSURE_ARG_POINTER(aDOMNode); - *aDOMNode = nsnull; - - nsINode *node = GetNode(); - if (node) - CallQueryInterface(node, aDOMNode); - - return NS_OK; -} - -NS_IMETHODIMP -nsAccessNode::GetDocument(nsIAccessibleDocument **aDocument) -{ - NS_ENSURE_ARG_POINTER(aDocument); - - NS_IF_ADDREF(*aDocument = GetDocAccessible()); - return NS_OK; -} - -NS_IMETHODIMP -nsAccessNode::GetRootDocument(nsIAccessibleDocument **aRootDocument) -{ - NS_ENSURE_ARG_POINTER(aRootDocument); - - nsRootAccessible* rootDocument = RootAccessible(); - NS_IF_ADDREF(*aRootDocument = rootDocument); - return NS_OK; -} - -NS_IMETHODIMP -nsAccessNode::GetInnerHTML(nsAString& aInnerHTML) -{ - aInnerHTML.Truncate(); - - nsCOMPtr htmlElement = do_QueryInterface(mContent); - NS_ENSURE_TRUE(htmlElement, NS_ERROR_NULL_POINTER); - - return htmlElement->GetInnerHTML(aInnerHTML); -} - -NS_IMETHODIMP +void nsAccessNode::ScrollTo(PRUint32 aScrollType) { if (IsDefunct()) - return NS_ERROR_FAILURE; + return; nsCOMPtr shell(GetPresShell()); - NS_ENSURE_TRUE(shell, NS_ERROR_FAILURE); + if (!shell) + return; nsIFrame *frame = GetFrame(); - NS_ENSURE_TRUE(frame, NS_ERROR_FAILURE); + if (!frame) + return; - nsCOMPtr content = frame->GetContent(); - NS_ENSURE_TRUE(content, NS_ERROR_FAILURE); + nsIContent* content = frame->GetContent(); + if (!content) + return; PRInt16 vPercent, hPercent; nsCoreUtils::ConvertScrollTypeToPercents(aScrollType, &vPercent, &hPercent); - return shell->ScrollContentIntoView(content, vPercent, hPercent, - nsIPresShell::SCROLL_OVERFLOW_HIDDEN); -} - -NS_IMETHODIMP -nsAccessNode::ScrollToPoint(PRUint32 aCoordinateType, PRInt32 aX, PRInt32 aY) -{ - nsIFrame *frame = GetFrame(); - if (!frame) - return NS_ERROR_FAILURE; - - nsIntPoint coords; - nsresult rv = nsAccUtils::ConvertToScreenCoords(aX, aY, aCoordinateType, - this, &coords); - NS_ENSURE_SUCCESS(rv, rv); - - nsIFrame *parentFrame = frame; - while ((parentFrame = parentFrame->GetParent())) - nsCoreUtils::ScrollFrameToPoint(parentFrame, frame, coords); - - return NS_OK; -} - -NS_IMETHODIMP -nsAccessNode::GetComputedStyleValue(const nsAString& aPseudoElt, - const nsAString& aPropertyName, - nsAString& aValue) -{ - if (IsDefunct()) - return NS_ERROR_FAILURE; - - nsCOMPtr styleDecl = - nsCoreUtils::GetComputedStyleDeclaration(aPseudoElt, mContent); - NS_ENSURE_TRUE(styleDecl, NS_ERROR_FAILURE); - - return styleDecl->GetPropertyValue(aPropertyName, aValue); -} - -NS_IMETHODIMP -nsAccessNode::GetComputedStyleCSSValue(const nsAString& aPseudoElt, - const nsAString& aPropertyName, - nsIDOMCSSPrimitiveValue **aCSSValue) -{ - NS_ENSURE_ARG_POINTER(aCSSValue); - *aCSSValue = nsnull; - - if (IsDefunct()) - return NS_ERROR_FAILURE; - - nsCOMPtr styleDecl = - nsCoreUtils::GetComputedStyleDeclaration(aPseudoElt, mContent); - NS_ENSURE_STATE(styleDecl); - - nsCOMPtr cssValue; - styleDecl->GetPropertyCSSValue(aPropertyName, getter_AddRefs(cssValue)); - NS_ENSURE_TRUE(cssValue, NS_ERROR_FAILURE); - - return CallQueryInterface(cssValue, aCSSValue); + shell->ScrollContentIntoView(content, vPercent, hPercent, + nsIPresShell::SCROLL_OVERFLOW_HIDDEN); } // nsAccessNode public @@ -443,20 +333,18 @@ nsAccessNode::GetCurrentFocus() return focusedNode; } -NS_IMETHODIMP -nsAccessNode::GetLanguage(nsAString& aLanguage) +void +nsAccessNode::Language(nsAString& aLanguage) { aLanguage.Truncate(); if (IsDefunct()) - return NS_ERROR_FAILURE; + return; nsCoreUtils::GetLanguageFor(mContent, nsnull, aLanguage); - if (aLanguage.IsEmpty()) { // Nothing found, so use document's language mContent->OwnerDoc()->GetHeaderData(nsGkAtoms::headerContentLanguage, aLanguage); } - - return NS_OK; } + diff --git a/accessible/src/base/nsAccessNode.h b/accessible/src/base/nsAccessNode.h index b58ff1d2f7a7..1f42653c0afb 100644 --- a/accessible/src/base/nsAccessNode.h +++ b/accessible/src/base/nsAccessNode.h @@ -43,7 +43,6 @@ #ifndef _nsAccessNode_H_ #define _nsAccessNode_H_ -#include "nsIAccessNode.h" #include "nsIAccessibleTypes.h" #include "a11yGeneric.h" @@ -68,15 +67,7 @@ class nsIDocShellTreeItem; #define ACCESSIBLE_BUNDLE_URL "chrome://global-platform/locale/accessible.properties" #define PLATFORM_KEYS_BUNDLE_URL "chrome://global-platform/locale/platformKeys.properties" -#define NS_ACCESSNODE_IMPL_CID \ -{ /* 2b07e3d7-00b3-4379-aa0b-ea22e2c8ffda */ \ - 0x2b07e3d7, \ - 0x00b3, \ - 0x4379, \ - { 0xaa, 0x0b, 0xea, 0x22, 0xe2, 0xc8, 0xff, 0xda } \ -} - -class nsAccessNode: public nsIAccessNode +class nsAccessNode: public nsISupports { public: @@ -84,10 +75,7 @@ class nsAccessNode: public nsIAccessNode virtual ~nsAccessNode(); NS_DECL_CYCLE_COLLECTING_ISUPPORTS - NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsAccessNode, nsIAccessNode) - - NS_DECL_NSIACCESSNODE - NS_DECLARE_STATIC_IID_ACCESSOR(NS_ACCESSNODE_IMPL_CID) + NS_DECL_CYCLE_COLLECTION_CLASS(nsAccessNode) static void InitXPAccessibility(); static void ShutdownXPAccessibility(); @@ -134,18 +122,6 @@ class nsAccessNode: public nsIAccessNode * Return frame for the given access node object. */ virtual nsIFrame* GetFrame() const; - - /** - * Return DOM node associated with this accessible. - */ - already_AddRefed GetDOMNode() const - { - nsIDOMNode *DOMNode = nsnull; - if (GetNode()) - CallQueryInterface(GetNode(), &DOMNode); - return DOMNode; - } - /** * Return DOM node associated with the accessible. */ @@ -195,6 +171,18 @@ class nsAccessNode: public nsIAccessNode */ virtual bool IsPrimaryForNode() const; + /** + * Return the string bundle + */ + static nsIStringBundle* GetStringBundle() + { return gStringBundle; } + + /** + * Interface methods on nsIAccessible shared with ISimpleDOM. + */ + void Language(nsAString& aLocale); + void ScrollTo(PRUint32 aType); + protected: nsPresContext* GetPresContext(); @@ -221,8 +209,5 @@ class nsAccessNode: public nsIAccessNode static nsApplicationAccessible *gApplicationAccessible; }; -NS_DEFINE_STATIC_IID_ACCESSOR(nsAccessNode, - NS_ACCESSNODE_IMPL_CID) - #endif diff --git a/accessible/src/base/nsAccessible.cpp b/accessible/src/base/nsAccessible.cpp index 02a7cc06e4c2..4bbb5b7f8d93 100644 --- a/accessible/src/base/nsAccessible.cpp +++ b/accessible/src/base/nsAccessible.cpp @@ -52,11 +52,14 @@ #include "nsAccessibilityService.h" #include "nsAccTreeWalker.h" #include "nsIAccessibleRelation.h" +#include "nsRootAccessible.h" #include "nsTextEquivUtils.h" #include "Relation.h" #include "Role.h" #include "States.h" +#include "nsIDOMCSSValue.h" +#include "nsIDOMCSSPrimitiveValue.h" #include "nsIDOMElement.h" #include "nsIDOMDocument.h" #include "nsIDOMDocumentXBL.h" @@ -229,6 +232,92 @@ nsAccessible::SetRoleMapEntry(nsRoleMapEntry* aRoleMapEntry) mRoleMapEntry = aRoleMapEntry; } +NS_IMETHODIMP +nsAccessible::GetComputedStyleValue(const nsAString& aPseudoElt, + const nsAString& aPropertyName, + nsAString& aValue) +{ + if (IsDefunct()) + return NS_ERROR_FAILURE; + + nsCOMPtr styleDecl = + nsCoreUtils::GetComputedStyleDeclaration(aPseudoElt, mContent); + NS_ENSURE_TRUE(styleDecl, NS_ERROR_FAILURE); + + return styleDecl->GetPropertyValue(aPropertyName, aValue); +} + +NS_IMETHODIMP +nsAccessible::GetComputedStyleCSSValue(const nsAString& aPseudoElt, + const nsAString& aPropertyName, + nsIDOMCSSPrimitiveValue **aCSSValue) { + NS_ENSURE_ARG_POINTER(aCSSValue); + *aCSSValue = nsnull; + + if (IsDefunct()) + return NS_ERROR_FAILURE; + + nsCOMPtr styleDecl = + nsCoreUtils::GetComputedStyleDeclaration(aPseudoElt, mContent); + NS_ENSURE_STATE(styleDecl); + + nsCOMPtr cssValue; + styleDecl->GetPropertyCSSValue(aPropertyName, getter_AddRefs(cssValue)); + NS_ENSURE_TRUE(cssValue, NS_ERROR_FAILURE); + + return CallQueryInterface(cssValue, aCSSValue); +} + +NS_IMETHODIMP +nsAccessible::GetDocument(nsIAccessibleDocument **aDocument) +{ + NS_ENSURE_ARG_POINTER(aDocument); + + NS_IF_ADDREF(*aDocument = GetDocAccessible()); + return NS_OK; +} + +NS_IMETHODIMP +nsAccessible::GetDOMNode(nsIDOMNode **aDOMNode) +{ + NS_ENSURE_ARG_POINTER(aDOMNode); + *aDOMNode = nsnull; + + nsINode *node = GetNode(); + if (node) + CallQueryInterface(node, aDOMNode); + + return NS_OK; +} + +NS_IMETHODIMP +nsAccessible::GetRootDocument(nsIAccessibleDocument **aRootDocument) +{ + NS_ENSURE_ARG_POINTER(aRootDocument); + + nsRootAccessible* rootDocument = RootAccessible(); + NS_IF_ADDREF(*aRootDocument = rootDocument); + return NS_OK; +} + +NS_IMETHODIMP +nsAccessible::GetInnerHTML(nsAString& aInnerHTML) +{ + aInnerHTML.Truncate(); + + nsCOMPtr htmlElement = do_QueryInterface(mContent); + NS_ENSURE_TRUE(htmlElement, NS_ERROR_NULL_POINTER); + + return htmlElement->GetInnerHTML(aInnerHTML); +} + +NS_IMETHODIMP +nsAccessible::GetLanguage(nsAString& aLanguage) +{ + Language(aLanguage); + return NS_OK; +} + NS_IMETHODIMP nsAccessible::GetName(nsAString& aName) { @@ -2176,6 +2265,32 @@ nsAccessible::DispatchClickEvent(nsIContent *aContent, PRUint32 aActionIndex) nsCoreUtils::DispatchMouseEvent(NS_MOUSE_BUTTON_UP, presShell, aContent); } +NS_IMETHODIMP +nsAccessible::ScrollTo(PRUint32 aHow) +{ + nsAccessNode::ScrollTo(aHow); + return NS_OK; +} + +NS_IMETHODIMP +nsAccessible::ScrollToPoint(PRUint32 aCoordinateType, PRInt32 aX, PRInt32 aY) +{ + nsIFrame *frame = GetFrame(); + if (!frame) + return NS_ERROR_FAILURE; + + nsIntPoint coords; + nsresult rv = nsAccUtils::ConvertToScreenCoords(aX, aY, aCoordinateType, + this, &coords); + NS_ENSURE_SUCCESS(rv, rv); + + nsIFrame *parentFrame = frame; + while ((parentFrame = parentFrame->GetParent())) + nsCoreUtils::ScrollFrameToPoint(parentFrame, frame, coords); + + return NS_OK; +} + // nsIAccessibleSelectable NS_IMETHODIMP nsAccessible::GetSelectedChildren(nsIArray **aSelectedAccessibles) { diff --git a/accessible/src/base/nsAccessible.h b/accessible/src/base/nsAccessible.h index 1e9af8783388..ebf119cf53a3 100644 --- a/accessible/src/base/nsAccessible.h +++ b/accessible/src/base/nsAccessible.h @@ -129,6 +129,17 @@ class nsAccessible : public nsAccessNodeWrap, */ virtual void Description(nsString& aDescription); + /** + * Return DOM node associated with this accessible. + */ + inline already_AddRefed DOMNode() const + { + nsIDOMNode *DOMNode = nsnull; + if (GetNode()) + CallQueryInterface(GetNode(), &DOMNode); + return DOMNode; + } + /** * Returns the accessible name specified by ARIA. */ diff --git a/accessible/src/base/nsApplicationAccessible.cpp b/accessible/src/base/nsApplicationAccessible.cpp index a29a3df53cf5..931f9551ef46 100644 --- a/accessible/src/base/nsApplicationAccessible.cpp +++ b/accessible/src/base/nsApplicationAccessible.cpp @@ -421,7 +421,7 @@ nsApplicationAccessible::GetSiblingAtOffset(PRInt32 aOffset, } //////////////////////////////////////////////////////////////////////////////// -// nsIAccessNode and nsAccessNode +// nsIAccessible NS_IMETHODIMP nsApplicationAccessible::GetDOMNode(nsIDOMNode **aDOMNode) diff --git a/accessible/src/base/nsApplicationAccessible.h b/accessible/src/base/nsApplicationAccessible.h index be89067f58b7..db83524cfbeb 100644 --- a/accessible/src/base/nsApplicationAccessible.h +++ b/accessible/src/base/nsApplicationAccessible.h @@ -69,7 +69,7 @@ class nsApplicationAccessible: public nsAccessibleWrap, // nsISupports NS_DECL_ISUPPORTS_INHERITED - // nsIAccessNode + // nsIAccessible NS_SCRIPTABLE NS_IMETHOD GetDOMNode(nsIDOMNode** aDOMNode); NS_SCRIPTABLE NS_IMETHOD GetDocument(nsIAccessibleDocument** aDocument); NS_SCRIPTABLE NS_IMETHOD GetRootDocument(nsIAccessibleDocument** aRootDocument); @@ -83,8 +83,6 @@ class nsApplicationAccessible: public nsAccessibleWrap, const nsAString& aPropertyName, nsIDOMCSSPrimitiveValue** aValue NS_OUTPARAM); NS_SCRIPTABLE NS_IMETHOD GetLanguage(nsAString& aLanguage); - - // nsIAccessible NS_IMETHOD GetParent(nsIAccessible **aParent); NS_IMETHOD GetNextSibling(nsIAccessible **aNextSibling); NS_IMETHOD GetPreviousSibling(nsIAccessible **aPreviousSibling); diff --git a/accessible/src/base/nsCoreUtils.h b/accessible/src/base/nsCoreUtils.h index 5036077d29e8..371a39a33d89 100644 --- a/accessible/src/base/nsCoreUtils.h +++ b/accessible/src/base/nsCoreUtils.h @@ -191,7 +191,7 @@ class nsCoreUtils /** * Scrolls the given frame to the point, used for implememntation of - * nsIAccessNode::scrollToPoint and nsIAccessibleText::scrollSubstringToPoint. + * nsIAccessible::scrollToPoint and nsIAccessibleText::scrollSubstringToPoint. * * @param aScrollableFrame the scrollable frame * @param aFrame the frame to scroll diff --git a/accessible/src/base/nsTextAttrs.cpp b/accessible/src/base/nsTextAttrs.cpp index 8534b9db85a0..68286438a74f 100644 --- a/accessible/src/base/nsTextAttrs.cpp +++ b/accessible/src/base/nsTextAttrs.cpp @@ -283,8 +283,8 @@ nsLangTextAttr::nsLangTextAttr(nsHyperTextAccessible *aRootAcc, nsIContent *aRootContent, nsIContent *aContent) : nsTextAttr(aContent == nsnull), mRootContent(aRootContent) { - nsresult rv = aRootAcc->GetLanguage(mRootNativeValue); - mIsRootDefined = NS_SUCCEEDED(rv) && !mRootNativeValue.IsEmpty(); + aRootAcc->Language(mRootNativeValue); + mIsRootDefined = !mRootNativeValue.IsEmpty(); if (aContent) mIsDefined = GetLang(aContent, mNativeValue); diff --git a/accessible/src/html/nsHyperTextAccessible.cpp b/accessible/src/html/nsHyperTextAccessible.cpp index 29e567015071..2e7135f7d538 100644 --- a/accessible/src/html/nsHyperTextAccessible.cpp +++ b/accessible/src/html/nsHyperTextAccessible.cpp @@ -1148,7 +1148,7 @@ nsHyperTextAccessible::GetTextAttributes(bool aIncludeDefAttrs, // Compute spelling attributes on text accessible only. nsIFrame *offsetFrame = accAtOffset->GetFrame(); if (offsetFrame && offsetFrame->GetType() == nsGkAtoms::textFrame) { - nsCOMPtr node = accAtOffset->GetDOMNode(); + nsCOMPtr node = accAtOffset->DOMNode(); PRInt32 nodeOffset = 0; nsresult rv = RenderedToContentOffset(offsetFrame, offsetInAcc, @@ -2255,10 +2255,8 @@ nsHyperTextAccessible::GetDOMPointByFrameOffset(nsIFrame *aFrame, if (!aFrame) { // If the given frame is null then set offset after the DOM node of the // given accessible. - nsCOMPtr accessNode(do_QueryInterface(aAccessible)); - nsCOMPtr DOMNode; - accessNode->GetDOMNode(getter_AddRefs(DOMNode)); + aAccessible->GetDOMNode(getter_AddRefs(DOMNode)); nsCOMPtr content(do_QueryInterface(DOMNode)); NS_ENSURE_STATE(content); diff --git a/accessible/src/msaa/CAccessibleComponent.cpp b/accessible/src/msaa/CAccessibleComponent.cpp index 89f7b2c1f806..8ef54744c79f 100644 --- a/accessible/src/msaa/CAccessibleComponent.cpp +++ b/accessible/src/msaa/CAccessibleComponent.cpp @@ -155,7 +155,7 @@ CAccessibleComponent::GetARGBValueFromCSSProperty(const nsAString& aPropName, __try { *aColorValue = 0; - nsCOMPtr acc(do_QueryObject(this)); + nsRefPtr acc(do_QueryObject(this)); if (!acc) return E_FAIL; diff --git a/accessible/src/msaa/nsAccessNodeWrap.cpp b/accessible/src/msaa/nsAccessNodeWrap.cpp index 1097c07728fc..62d81b2d13f5 100644 --- a/accessible/src/msaa/nsAccessNodeWrap.cpp +++ b/accessible/src/msaa/nsAccessNodeWrap.cpp @@ -396,9 +396,8 @@ __try { aScrollTopLeft ? nsIAccessibleScrollType::SCROLL_TYPE_TOP_LEFT : nsIAccessibleScrollType::SCROLL_TYPE_BOTTOM_RIGHT; - nsresult rv = ScrollTo(scrollType); - if (NS_SUCCEEDED(rv)) - return S_OK; + ScrollTo(scrollType); + return S_OK; } __except(FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { } return E_FAIL; @@ -554,10 +553,7 @@ __try { *aLanguage = NULL; nsAutoString language; - if (NS_FAILED(GetLanguage(language))) { - return E_FAIL; - } - + Language(language); if (language.IsEmpty()) return S_FALSE; @@ -575,7 +571,7 @@ nsAccessNodeWrap::get_localInterface( /* [out] */ void __RPC_FAR *__RPC_FAR *localInterface) { __try { - *localInterface = static_cast(this); + *localInterface = static_cast(this); NS_ADDREF_THIS(); } __except(FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { } return S_OK; diff --git a/accessible/src/msaa/nsAccessibleWrap.cpp b/accessible/src/msaa/nsAccessibleWrap.cpp index 032aef204c36..2b2e625ed30b 100644 --- a/accessible/src/msaa/nsAccessibleWrap.cpp +++ b/accessible/src/msaa/nsAccessibleWrap.cpp @@ -1145,8 +1145,8 @@ STDMETHODIMP nsAccessibleWrap::scrollTo(enum IA2ScrollType aScrollType) { __try { - nsresult rv = ScrollTo(aScrollType); - return GetHRESULT(rv); + nsAccessNode::ScrollTo(aScrollType); + return S_OK; } __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { } return E_FAIL; @@ -1366,9 +1366,7 @@ __try { // Any two-letter subcode is understood to be a [ISO3166] country code. nsAutoString lang; - nsresult rv = GetLanguage(lang); - if (NS_FAILED(rv)) - return GetHRESULT(rv); + Language(lang); // If primary code consists from two letters then expose it as language. PRInt32 offset = lang.FindChar('-', 0); diff --git a/accessible/src/xul/nsXULFormControlAccessible.cpp b/accessible/src/xul/nsXULFormControlAccessible.cpp index 6715b9215798..c6f418192e5d 100644 --- a/accessible/src/xul/nsXULFormControlAccessible.cpp +++ b/accessible/src/xul/nsXULFormControlAccessible.cpp @@ -662,17 +662,10 @@ nsXULToolbarButtonAccessible::GetPositionAndSizeInternal(PRInt32 *aPosInSet, bool nsXULToolbarButtonAccessible::IsSeparator(nsAccessible *aAccessible) { - nsCOMPtr domNode; - aAccessible->GetDOMNode(getter_AddRefs(domNode)); - nsCOMPtr contentDomNode(do_QueryInterface(domNode)); - - if (!contentDomNode) - return false; - - return (contentDomNode->Tag() == nsGkAtoms::toolbarseparator) || - (contentDomNode->Tag() == nsGkAtoms::toolbarspacer) || - (contentDomNode->Tag() == nsGkAtoms::toolbarspring); -} + nsIContent* content = aAccessible->GetContent(); + return content && ((content->Tag() == nsGkAtoms::toolbarseparator) || + (content->Tag() == nsGkAtoms::toolbarspacer) || + (content->Tag() == nsGkAtoms::toolbarspring)); } //////////////////////////////////////////////////////////////////////////////// diff --git a/accessible/src/xul/nsXULTabAccessible.cpp b/accessible/src/xul/nsXULTabAccessible.cpp index 95367f872e9a..9d8c3f9b3d2d 100644 --- a/accessible/src/xul/nsXULTabAccessible.cpp +++ b/accessible/src/xul/nsXULTabAccessible.cpp @@ -153,9 +153,9 @@ nsXULTabAccessible::RelationByType(PRUint32 aType) if (!tabsElm) return rel; - nsCOMPtr DOMNode(GetDOMNode()); + nsCOMPtr domNode(DOMNode()); nsCOMPtr tabpanelNode; - tabsElm->GetRelatedElement(DOMNode, getter_AddRefs(tabpanelNode)); + tabsElm->GetRelatedElement(domNode, getter_AddRefs(tabpanelNode)); if (!tabpanelNode) return rel; @@ -255,9 +255,9 @@ nsXULTabpanelAccessible::RelationByType(PRUint32 aType) if (!tabpanelsElm) return rel; - nsCOMPtr DOMNode(GetDOMNode()); + nsCOMPtr domNode(DOMNode()); nsCOMPtr tabNode; - tabpanelsElm->GetRelatedElement(DOMNode, getter_AddRefs(tabNode)); + tabpanelsElm->GetRelatedElement(domNode, getter_AddRefs(tabNode)); if (!tabNode) return rel; diff --git a/accessible/tests/mochitest/common.js b/accessible/tests/mochitest/common.js index 7586197f31e3..111afd57c132 100644 --- a/accessible/tests/mochitest/common.js +++ b/accessible/tests/mochitest/common.js @@ -18,7 +18,6 @@ const nsIAccessibleCoordinateType = Components.interfaces.nsIAccessibleCoordinat const nsIAccessibleRelation = Components.interfaces.nsIAccessibleRelation; -const nsIAccessNode = Components.interfaces.nsIAccessNode; const nsIAccessible = Components.interfaces.nsIAccessible; const nsIAccessibleDocument = Components.interfaces.nsIAccessibleDocument; @@ -121,10 +120,8 @@ function getNode(aAccOrNodeOrID) if (aAccOrNodeOrID instanceof nsIDOMNode) return aAccOrNodeOrID; - if (aAccOrNodeOrID instanceof nsIAccessible) { - aAccOrNodeOrID.QueryInterface(nsIAccessNode); + if (aAccOrNodeOrID instanceof nsIAccessible) return aAccOrNodeOrID.DOMNode; - } node = document.getElementById(aAccOrNodeOrID); if (!node) { @@ -167,7 +164,6 @@ function getAccessible(aAccOrElmOrID, aInterfaces, aElmObj, aDoNotFailIf) var elm = null; if (aAccOrElmOrID instanceof nsIAccessible) { - aAccOrElmOrID.QueryInterface(nsIAccessNode); elm = aAccOrElmOrID.DOMNode; } else if (aAccOrElmOrID instanceof nsIDOMNode) { @@ -199,8 +195,6 @@ function getAccessible(aAccOrElmOrID, aInterfaces, aElmObj, aDoNotFailIf) } } - acc.QueryInterface(nsIAccessNode); - if (!aInterfaces) return acc; @@ -257,8 +251,7 @@ function getContainerAccessible(aAccOrElmOrID) */ function getRootAccessible(aAccOrElmOrID) { - var acc = getAccessible(aAccOrElmOrID ? aAccOrElmOrID : document, - [nsIAccessNode]); + var acc = getAccessible(aAccOrElmOrID ? aAccOrElmOrID : document); return acc ? acc.rootDocument.QueryInterface(nsIAccessible) : null; } @@ -267,11 +260,10 @@ function getRootAccessible(aAccOrElmOrID) */ function getTabDocAccessible(aAccOrElmOrID) { - var acc = getAccessible(aAccOrElmOrID ? aAccOrElmOrID : document, - [nsIAccessNode]); + var acc = getAccessible(aAccOrElmOrID ? aAccOrElmOrID : document); var docAcc = acc.document.QueryInterface(nsIAccessible); - var containerDocAcc = docAcc.parent.QueryInterface(nsIAccessNode).document; + var containerDocAcc = docAcc.parent.document; // Test is running is stand-alone mode. if (acc.rootDocument == containerDocAcc) @@ -584,7 +576,7 @@ function getTextFromClipboard() function prettyName(aIdentifier) { if (aIdentifier instanceof nsIAccessible) { - var acc = getAccessible(aIdentifier, [nsIAccessNode]); + var acc = getAccessible(aIdentifier); var msg = "[" + getNodePrettyName(acc.DOMNode); try { msg += ", role: " + roleToString(acc.role); diff --git a/accessible/tests/mochitest/events/test_contextmenu.html b/accessible/tests/mochitest/events/test_contextmenu.html index 33d2cb892b59..065e1b50e302 100644 --- a/accessible/tests/mochitest/events/test_contextmenu.html +++ b/accessible/tests/mochitest/events/test_contextmenu.html @@ -91,7 +91,7 @@ var item = menu.getChildAt(idx); if (hasState(item, STATE_FOCUSED)) - return getAccessible(item, [nsIAccessNode]); + return getAccessible(item); } return null; } diff --git a/accessible/tests/mochitest/hypertext/test_update.html b/accessible/tests/mochitest/hypertext/test_update.html index 3950bbe78801..8107bfff44e9 100644 --- a/accessible/tests/mochitest/hypertext/test_update.html +++ b/accessible/tests/mochitest/hypertext/test_update.html @@ -60,7 +60,7 @@ { this.containerNode = getNode(aContainerID); this.container = getAccessible(this.containerNode, nsIAccessibleHyperText); - this.text = this.container.firstChild.QueryInterface(nsIAccessNode); + this.text = this.container.firstChild; this.textNode = this.text.DOMNode; this.textLen = this.textNode.data.length; diff --git a/accessible/tests/mochitest/test_nsIAccessNode_utils.html b/accessible/tests/mochitest/test_nsIAccessNode_utils.html index 2e29517073c8..c7349f233b30 100644 --- a/accessible/tests/mochitest/test_nsIAccessNode_utils.html +++ b/accessible/tests/mochitest/test_nsIAccessNode_utils.html @@ -15,7 +15,7 @@ function doTest() { var elmObj = {}; - var acc = getAccessible("span", [nsIAccessNode], elmObj); + var acc = getAccessible("span", null, elmObj); computedStyle = document.defaultView.getComputedStyle(elmObj.value, ""); // html:span element @@ -23,7 +23,7 @@ "Wrong color for element with ID 'span'"); // text child of html:span element - acc = getAccessible(acc.firstChild, [nsIAccessNode]); + acc = getAccessible(acc.firstChild); is(acc.getComputedStyleValue("", "color"), computedStyle.color, "Wrong color for text child of element with ID 'span'"); diff --git a/accessible/tests/mochitest/treeupdate/test_doc.html b/accessible/tests/mochitest/treeupdate/test_doc.html index 8c965abe7654..64d5bbd75e3b 100644 --- a/accessible/tests/mochitest/treeupdate/test_doc.html +++ b/accessible/tests/mochitest/treeupdate/test_doc.html @@ -64,8 +64,8 @@ this.preinvoke = function rootContentRemoved_preinvoke() { // Set up target for hide event before we invoke. - var text = getAccessible(getAccessible(getDocNode(aID)).firstChild, - [nsIAccessNode]).DOMNode; + var text = + getAccessible(getAccessible(getDocNode(aID)).firstChild).DOMNode; this.eventSeq[0].target = text; }