diff --git a/accessible/public/Makefile.in b/accessible/public/Makefile.in index 24e0c5ea01c..b25d0eae0c3 100644 --- a/accessible/public/Makefile.in +++ b/accessible/public/Makefile.in @@ -61,6 +61,7 @@ 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 5b7eb1d2631..9679b8600ac 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 nsAccessNode object pointer") +cpp_quote("// Only available in Gecko's process - casts to an XPCOM nsIAccessNode interface pointer") cpp_quote("//") cpp_quote("//") cpp_quote("// get_language(/* [out] */ BSTR *htmlText);") diff --git a/accessible/public/nsIAccessNode.idl b/accessible/public/nsIAccessNode.idl new file mode 100644 index 00000000000..e938b88132c --- /dev/null +++ b/accessible/public/nsIAccessNode.idl @@ -0,0 +1,126 @@ +/* -*- 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 2e46b5fbd36..bef69df2777 100644 --- a/accessible/public/nsIAccessible.idl +++ b/accessible/public/nsIAccessible.idl @@ -43,10 +43,7 @@ #include "nsIArray.idl" interface nsIPersistentProperties; -interface nsIDOMCSSPrimitiveValue; interface nsIDOMDOMStringList; -interface nsIDOMNode; -interface nsIAccessibleDocument; interface nsIAccessibleRelation; /** @@ -103,53 +100,6 @@ 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 @@ -335,26 +285,6 @@ 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 0293f4ea467..73d909c065f 100644 --- a/accessible/public/nsIAccessibleDocument.idl +++ b/accessible/public/nsIAccessibleDocument.idl @@ -39,6 +39,7 @@ #include "nsISupports.idl" interface nsIAccessible; +interface nsIAccessNode; interface nsIDOMDocument; interface nsIDOMNode; interface nsIDOMWindow; @@ -49,9 +50,10 @@ 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 for - * the root node of a document. You can also get one from - * nsIAccessible::GetAccessibleDocument() or + * 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 * nsIAccessibleEvent::GetAccessibleDocument() */ [scriptable, uuid(451242bd-8a0c-4198-ae88-c053609a4e5d)] diff --git a/accessible/public/nsIAccessibleRetrieval.idl b/accessible/public/nsIAccessibleRetrieval.idl index 368b40b911f..e433b20cc66 100644 --- a/accessible/public/nsIAccessibleRetrieval.idl +++ b/accessible/public/nsIAccessibleRetrieval.idl @@ -43,12 +43,15 @@ 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 for a given DOM node. More documentation at: + * An interface for in-process accessibility clients + * wishing to get an nsIAccessible or nsIAccessNode 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 2f31f96164d..c0525a12b31 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->Language(locale); + accWrap->GetLanguage(locale); return locale.IsEmpty() ? nsnull : nsAccessibleWrap::ReturnString(locale); } diff --git a/accessible/src/base/nsAccUtils.h b/accessible/src/base/nsAccUtils.h index 2fd8a1ec230..f471fb559a7 100644 --- a/accessible/src/base/nsAccUtils.h +++ b/accessible/src/base/nsAccUtils.h @@ -40,6 +40,7 @@ #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 1449678273e..70bb4642242 100644 --- a/accessible/src/base/nsAccessNode.cpp +++ b/accessible/src/base/nsAccessNode.cpp @@ -36,27 +36,37 @@ * * ***** END LICENSE BLOCK ***** */ -#include "nsAccessNode.h" +#include "nsDocAccessible.h" -#include "nsAccessibilityService.h" +#include "nsIAccessible.h" + +#include "nsAccCache.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 "nsIFrame.h" +#include "nsPIDOMWindow.h" #include "nsIInterfaceRequestorUtils.h" -#include "nsIObserverService.h" -#include "nsIPrefBranch.h" +#include "nsIFrame.h" #include "nsIPrefService.h" +#include "nsIPrefBranch.h" +#include "nsPresContext.h" #include "nsIPresShell.h" #include "nsIServiceManager.h" #include "nsIStringBundle.h" +#include "nsRootAccessible.h" #include "nsFocusManager.h" -#include "nsPresContext.h" +#include "nsIObserverService.h" #include "mozilla/Services.h" /* For documentation of the accessibility architecture, @@ -79,7 +89,9 @@ 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) @@ -275,28 +287,126 @@ nsAccessNode::IsPrimaryForNode() const } //////////////////////////////////////////////////////////////////////////////// -void +// 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 nsAccessNode::ScrollTo(PRUint32 aScrollType) { if (IsDefunct()) - return; + return NS_ERROR_FAILURE; nsCOMPtr shell(GetPresShell()); - if (!shell) - return; + NS_ENSURE_TRUE(shell, NS_ERROR_FAILURE); nsIFrame *frame = GetFrame(); - if (!frame) - return; + NS_ENSURE_TRUE(frame, NS_ERROR_FAILURE); - nsIContent* content = frame->GetContent(); - if (!content) - return; + nsCOMPtr content = frame->GetContent(); + NS_ENSURE_TRUE(content, NS_ERROR_FAILURE); PRInt16 vPercent, hPercent; nsCoreUtils::ConvertScrollTypeToPercents(aScrollType, &vPercent, &hPercent); - shell->ScrollContentIntoView(content, vPercent, hPercent, - nsIPresShell::SCROLL_OVERFLOW_HIDDEN); + 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); } // nsAccessNode public @@ -333,18 +443,20 @@ nsAccessNode::GetCurrentFocus() return focusedNode; } -void -nsAccessNode::Language(nsAString& aLanguage) +NS_IMETHODIMP +nsAccessNode::GetLanguage(nsAString& aLanguage) { aLanguage.Truncate(); if (IsDefunct()) - return; + return NS_ERROR_FAILURE; 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 1f42653c0af..b58ff1d2f7a 100644 --- a/accessible/src/base/nsAccessNode.h +++ b/accessible/src/base/nsAccessNode.h @@ -43,6 +43,7 @@ #ifndef _nsAccessNode_H_ #define _nsAccessNode_H_ +#include "nsIAccessNode.h" #include "nsIAccessibleTypes.h" #include "a11yGeneric.h" @@ -67,7 +68,15 @@ class nsIDocShellTreeItem; #define ACCESSIBLE_BUNDLE_URL "chrome://global-platform/locale/accessible.properties" #define PLATFORM_KEYS_BUNDLE_URL "chrome://global-platform/locale/platformKeys.properties" -class nsAccessNode: public nsISupports +#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 { public: @@ -75,7 +84,10 @@ public: virtual ~nsAccessNode(); NS_DECL_CYCLE_COLLECTING_ISUPPORTS - NS_DECL_CYCLE_COLLECTION_CLASS(nsAccessNode) + NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsAccessNode, nsIAccessNode) + + NS_DECL_NSIACCESSNODE + NS_DECLARE_STATIC_IID_ACCESSOR(NS_ACCESSNODE_IMPL_CID) static void InitXPAccessibility(); static void ShutdownXPAccessibility(); @@ -122,6 +134,18 @@ public: * 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. */ @@ -171,18 +195,6 @@ public: */ 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(); @@ -209,5 +221,8 @@ private: 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 4bbb5b7f8d9..02a7cc06e4c 100644 --- a/accessible/src/base/nsAccessible.cpp +++ b/accessible/src/base/nsAccessible.cpp @@ -52,14 +52,11 @@ #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" @@ -232,92 +229,6 @@ 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) { @@ -2265,32 +2176,6 @@ 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 ebf119cf53a..1e9af878338 100644 --- a/accessible/src/base/nsAccessible.h +++ b/accessible/src/base/nsAccessible.h @@ -129,17 +129,6 @@ public: */ 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 931f9551ef4..a29a3df53cf 100644 --- a/accessible/src/base/nsApplicationAccessible.cpp +++ b/accessible/src/base/nsApplicationAccessible.cpp @@ -421,7 +421,7 @@ nsApplicationAccessible::GetSiblingAtOffset(PRInt32 aOffset, } //////////////////////////////////////////////////////////////////////////////// -// nsIAccessible +// nsIAccessNode and nsAccessNode NS_IMETHODIMP nsApplicationAccessible::GetDOMNode(nsIDOMNode **aDOMNode) diff --git a/accessible/src/base/nsApplicationAccessible.h b/accessible/src/base/nsApplicationAccessible.h index db83524cfbe..be89067f58b 100644 --- a/accessible/src/base/nsApplicationAccessible.h +++ b/accessible/src/base/nsApplicationAccessible.h @@ -69,7 +69,7 @@ public: // nsISupports NS_DECL_ISUPPORTS_INHERITED - // nsIAccessible + // nsIAccessNode NS_SCRIPTABLE NS_IMETHOD GetDOMNode(nsIDOMNode** aDOMNode); NS_SCRIPTABLE NS_IMETHOD GetDocument(nsIAccessibleDocument** aDocument); NS_SCRIPTABLE NS_IMETHOD GetRootDocument(nsIAccessibleDocument** aRootDocument); @@ -83,6 +83,8 @@ public: 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 371a39a33d8..5036077d29e 100644 --- a/accessible/src/base/nsCoreUtils.h +++ b/accessible/src/base/nsCoreUtils.h @@ -191,7 +191,7 @@ public: /** * Scrolls the given frame to the point, used for implememntation of - * nsIAccessible::scrollToPoint and nsIAccessibleText::scrollSubstringToPoint. + * nsIAccessNode::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 68286438a74..8534b9db85a 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) { - aRootAcc->Language(mRootNativeValue); - mIsRootDefined = !mRootNativeValue.IsEmpty(); + nsresult rv = aRootAcc->GetLanguage(mRootNativeValue); + mIsRootDefined = NS_SUCCEEDED(rv) && !mRootNativeValue.IsEmpty(); if (aContent) mIsDefined = GetLang(aContent, mNativeValue); diff --git a/accessible/src/html/nsHyperTextAccessible.cpp b/accessible/src/html/nsHyperTextAccessible.cpp index 2e7135f7d53..29e56701507 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->DOMNode(); + nsCOMPtr node = accAtOffset->GetDOMNode(); PRInt32 nodeOffset = 0; nsresult rv = RenderedToContentOffset(offsetFrame, offsetInAcc, @@ -2255,8 +2255,10 @@ 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; - aAccessible->GetDOMNode(getter_AddRefs(DOMNode)); + accessNode->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 8ef54744c79..89f7b2c1f80 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; - nsRefPtr acc(do_QueryObject(this)); + nsCOMPtr acc(do_QueryObject(this)); if (!acc) return E_FAIL; diff --git a/accessible/src/msaa/nsAccessNodeWrap.cpp b/accessible/src/msaa/nsAccessNodeWrap.cpp index 62d81b2d13f..1097c07728f 100644 --- a/accessible/src/msaa/nsAccessNodeWrap.cpp +++ b/accessible/src/msaa/nsAccessNodeWrap.cpp @@ -396,8 +396,9 @@ __try { aScrollTopLeft ? nsIAccessibleScrollType::SCROLL_TYPE_TOP_LEFT : nsIAccessibleScrollType::SCROLL_TYPE_BOTTOM_RIGHT; - ScrollTo(scrollType); - return S_OK; + nsresult rv = ScrollTo(scrollType); + if (NS_SUCCEEDED(rv)) + return S_OK; } __except(FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { } return E_FAIL; @@ -553,7 +554,10 @@ __try { *aLanguage = NULL; nsAutoString language; - Language(language); + if (NS_FAILED(GetLanguage(language))) { + return E_FAIL; + } + if (language.IsEmpty()) return S_FALSE; @@ -571,7 +575,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 2b2e625ed30..032aef204c3 100644 --- a/accessible/src/msaa/nsAccessibleWrap.cpp +++ b/accessible/src/msaa/nsAccessibleWrap.cpp @@ -1145,8 +1145,8 @@ STDMETHODIMP nsAccessibleWrap::scrollTo(enum IA2ScrollType aScrollType) { __try { - nsAccessNode::ScrollTo(aScrollType); - return S_OK; + nsresult rv = ScrollTo(aScrollType); + return GetHRESULT(rv); } __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { } return E_FAIL; @@ -1366,7 +1366,9 @@ __try { // Any two-letter subcode is understood to be a [ISO3166] country code. nsAutoString lang; - Language(lang); + nsresult rv = GetLanguage(lang); + if (NS_FAILED(rv)) + return GetHRESULT(rv); // 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 c6f418192e5..6715b921579 100644 --- a/accessible/src/xul/nsXULFormControlAccessible.cpp +++ b/accessible/src/xul/nsXULFormControlAccessible.cpp @@ -662,10 +662,17 @@ nsXULToolbarButtonAccessible::GetPositionAndSizeInternal(PRInt32 *aPosInSet, bool nsXULToolbarButtonAccessible::IsSeparator(nsAccessible *aAccessible) { - nsIContent* content = aAccessible->GetContent(); - return content && ((content->Tag() == nsGkAtoms::toolbarseparator) || - (content->Tag() == nsGkAtoms::toolbarspacer) || - (content->Tag() == nsGkAtoms::toolbarspring)); } + 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); +} //////////////////////////////////////////////////////////////////////////////// diff --git a/accessible/src/xul/nsXULTabAccessible.cpp b/accessible/src/xul/nsXULTabAccessible.cpp index 9d8c3f9b3d2..95367f872e9 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(DOMNode()); + nsCOMPtr DOMNode(GetDOMNode()); 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(DOMNode()); + nsCOMPtr DOMNode(GetDOMNode()); 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 111afd57c13..7586197f31e 100644 --- a/accessible/tests/mochitest/common.js +++ b/accessible/tests/mochitest/common.js @@ -18,6 +18,7 @@ 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; @@ -120,8 +121,10 @@ function getNode(aAccOrNodeOrID) if (aAccOrNodeOrID instanceof nsIDOMNode) return aAccOrNodeOrID; - if (aAccOrNodeOrID instanceof nsIAccessible) + if (aAccOrNodeOrID instanceof nsIAccessible) { + aAccOrNodeOrID.QueryInterface(nsIAccessNode); return aAccOrNodeOrID.DOMNode; + } node = document.getElementById(aAccOrNodeOrID); if (!node) { @@ -164,6 +167,7 @@ function getAccessible(aAccOrElmOrID, aInterfaces, aElmObj, aDoNotFailIf) var elm = null; if (aAccOrElmOrID instanceof nsIAccessible) { + aAccOrElmOrID.QueryInterface(nsIAccessNode); elm = aAccOrElmOrID.DOMNode; } else if (aAccOrElmOrID instanceof nsIDOMNode) { @@ -195,6 +199,8 @@ function getAccessible(aAccOrElmOrID, aInterfaces, aElmObj, aDoNotFailIf) } } + acc.QueryInterface(nsIAccessNode); + if (!aInterfaces) return acc; @@ -251,7 +257,8 @@ function getContainerAccessible(aAccOrElmOrID) */ function getRootAccessible(aAccOrElmOrID) { - var acc = getAccessible(aAccOrElmOrID ? aAccOrElmOrID : document); + var acc = getAccessible(aAccOrElmOrID ? aAccOrElmOrID : document, + [nsIAccessNode]); return acc ? acc.rootDocument.QueryInterface(nsIAccessible) : null; } @@ -260,10 +267,11 @@ function getRootAccessible(aAccOrElmOrID) */ function getTabDocAccessible(aAccOrElmOrID) { - var acc = getAccessible(aAccOrElmOrID ? aAccOrElmOrID : document); + var acc = getAccessible(aAccOrElmOrID ? aAccOrElmOrID : document, + [nsIAccessNode]); var docAcc = acc.document.QueryInterface(nsIAccessible); - var containerDocAcc = docAcc.parent.document; + var containerDocAcc = docAcc.parent.QueryInterface(nsIAccessNode).document; // Test is running is stand-alone mode. if (acc.rootDocument == containerDocAcc) @@ -576,7 +584,7 @@ function getTextFromClipboard() function prettyName(aIdentifier) { if (aIdentifier instanceof nsIAccessible) { - var acc = getAccessible(aIdentifier); + var acc = getAccessible(aIdentifier, [nsIAccessNode]); 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 065e1b50e30..33d2cb892b5 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); + return getAccessible(item, [nsIAccessNode]); } return null; } diff --git a/accessible/tests/mochitest/hypertext/test_update.html b/accessible/tests/mochitest/hypertext/test_update.html index 8107bfff44e..3950bbe7880 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; + this.text = this.container.firstChild.QueryInterface(nsIAccessNode); 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 c7349f233b3..2e29517073c 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", null, elmObj); + var acc = getAccessible("span", [nsIAccessNode], 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); + acc = getAccessible(acc.firstChild, [nsIAccessNode]); 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 64d5bbd75e3..8c965abe765 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).DOMNode; + var text = getAccessible(getAccessible(getDocNode(aID)).firstChild, + [nsIAccessNode]).DOMNode; this.eventSeq[0].target = text; }