Bug 767755: Re-implement IsPrimaryForNode() using an Accessible::mFlags bit. r=surkov
--- a/accessible/src/base/nsAccessNode.cpp
+++ b/accessible/src/base/nsAccessNode.cpp
@@ -150,22 +150,16 @@ nsAccessNode::GetNode() const
}
nsIDocument*
nsAccessNode::GetDocumentNode() const
{
return mContent ? mContent->OwnerDoc() : nullptr;
}
-bool
-nsAccessNode::IsPrimaryForNode() const
-{
- return true;
-}
-
void
nsAccessNode::Language(nsAString& aLanguage)
{
aLanguage.Truncate();
if (!mDoc)
return;
--- a/accessible/src/base/nsAccessNode.h
+++ b/accessible/src/base/nsAccessNode.h
@@ -92,25 +92,16 @@ public:
}
/**
* Return the unique identifier of the accessible.
*/
void* UniqueID() { return static_cast<void*>(this); }
/**
- * Return true if the accessible is primary accessible for the given DOM node.
- *
- * Accessible hierarchy may be complex for single DOM node, in this case
- * these accessibles share the same DOM node. The primary accessible "owns"
- * that DOM node in terms it gets stored in the accessible to node map.
- */
- virtual bool IsPrimaryForNode() const;//hello
-
- /**
* Interface methods on nsIAccessible shared with ISimpleDOM.
*/
void Language(nsAString& aLocale);
protected:
void LastRelease();
nsCOMPtr<nsIContent> mContent;
--- a/accessible/src/generic/Accessible.h
+++ b/accessible/src/generic/Accessible.h
@@ -684,16 +684,25 @@ public:
*/
bool IsDefunct() const { return mFlags & eIsDefunct; }
/**
* Return true if the accessible is no longer in the document.
*/
bool IsInDocument() const { return !(mFlags & eIsNotInDocument); }
+ /**
+ * Return true if the accessible is primary accessible for the given DOM node.
+ *
+ * Accessible hierarchy may be complex for single DOM node, in this case
+ * these accessibles share the same DOM node. The primary accessible "owns"
+ * that DOM node in terms it gets stored in the accessible to node map.
+ */
+ bool IsPrimaryForNode() const { return !(mFlags & eSharedNode); }
+
protected:
//////////////////////////////////////////////////////////////////////////////
// Initializing, cache and tree traverse methods
/**
* Cache accessible children.
*/
@@ -733,41 +742,42 @@ protected:
{ mFlags = (mFlags & ~kChildrenFlagsMask) | aFlag; }
/**
* Flags used to describe the state of this accessible.
* @note keep these flags in sync with ChildrenFlags
*/
enum StateFlags {
eIsDefunct = 1 << 2, // accessible is defunct
- eIsNotInDocument = 1 << 3 // accessible is not in document
+ eIsNotInDocument = 1 << 3, // accessible is not in document
+ eSharedNode = 1 << 4 // accessible shares DOM node from another accessible
};
/**
* Flags describing the type of this accessible.
* @note keep these flags in sync with ChildrenFlags and StateFlags
*/
enum AccessibleTypes {
- eApplicationAccessible = 1 << 4,
- eAutoCompleteAccessible = 1 << 5,
- eAutoCompletePopupAccessible = 1 << 6,
- eComboboxAccessible = 1 << 7,
- eDocAccessible = 1 << 8,
- eHyperTextAccessible = 1 << 9,
- eHTMLFileInputAccessible = 1 << 10,
- eHTMLListItemAccessible = 1 << 11,
- eImageAccessible = 1 << 12,
- eImageMapAccessible = 1 << 13,
- eListControlAccessible = 1 << 14,
- eMenuButtonAccessible = 1 << 15,
- eMenuPopupAccessible = 1 << 16,
- eRootAccessible = 1 << 17,
- eTextLeafAccessible = 1 << 18,
- eXULDeckAccessible = 1 << 19,
- eXULTreeAccessible = 1 << 20
+ eApplicationAccessible = 1 << 5,
+ eAutoCompleteAccessible = 1 << 6,
+ eAutoCompletePopupAccessible = 1 << 7,
+ eComboboxAccessible = 1 << 8,
+ eDocAccessible = 1 << 9,
+ eHyperTextAccessible = 1 << 10,
+ eHTMLFileInputAccessible = 1 << 11,
+ eHTMLListItemAccessible = 1 << 12,
+ eImageAccessible = 1 << 13,
+ eImageMapAccessible = 1 << 14,
+ eListControlAccessible = 1 << 15,
+ eMenuButtonAccessible = 1 << 16,
+ eMenuPopupAccessible = 1 << 17,
+ eRootAccessible = 1 << 18,
+ eTextLeafAccessible = 1 << 19,
+ eXULDeckAccessible = 1 << 20,
+ eXULTreeAccessible = 1 << 21
};
//////////////////////////////////////////////////////////////////////////////
// Miscellaneous helpers
/**
* Return ARIA role (helper method).
*/
--- a/accessible/src/generic/ApplicationAccessible.cpp
+++ b/accessible/src/generic/ApplicationAccessible.cpp
@@ -21,17 +21,17 @@
#include "mozilla/Services.h"
#include "nsIStringBundle.h"
using namespace mozilla::a11y;
ApplicationAccessible::ApplicationAccessible() :
AccessibleWrap(nullptr, nullptr)
{
- mFlags |= eApplicationAccessible;
+ mFlags |= (eApplicationAccessible | eSharedNode);
}
////////////////////////////////////////////////////////////////////////////////
// nsISupports
NS_IMPL_ISUPPORTS_INHERITED1(ApplicationAccessible, Accessible,
nsIAccessibleApplication)
@@ -275,21 +275,16 @@ ApplicationAccessible::Init()
}
void
ApplicationAccessible::Shutdown()
{
mAppInfo = nullptr;
}
-bool
-ApplicationAccessible::IsPrimaryForNode() const
-{
- return false;
-}
////////////////////////////////////////////////////////////////////////////////
// Accessible public methods
void
ApplicationAccessible::ApplyARIAState(uint64_t* aState) const
{
}
--- a/accessible/src/generic/ApplicationAccessible.h
+++ b/accessible/src/generic/ApplicationAccessible.h
@@ -58,17 +58,16 @@ public:
NS_IMETHOD DoAction(uint8_t aIndex);
// nsIAccessibleApplication
NS_DECL_NSIACCESSIBLEAPPLICATION
// nsAccessNode
virtual void Init();
virtual void Shutdown();
- virtual bool IsPrimaryForNode() const;
// Accessible
virtual GroupPos GroupPosition();
virtual ENameValueFlag Name(nsString& aName);
virtual void ApplyARIAState(uint64_t* aState) const;
virtual void Description(nsString& aDescription);
virtual void Value(nsString& aValue);
virtual mozilla::a11y::role NativeRole();
--- a/accessible/src/html/HTMLImageMapAccessible.cpp
+++ b/accessible/src/html/HTMLImageMapAccessible.cpp
@@ -147,16 +147,19 @@ HTMLImageMapAccessible::CacheChildren()
////////////////////////////////////////////////////////////////////////////////
// HTMLAreaAccessible
////////////////////////////////////////////////////////////////////////////////
HTMLAreaAccessible::
HTMLAreaAccessible(nsIContent* aContent, DocAccessible* aDoc) :
HTMLLinkAccessible(aContent, aDoc)
{
+ // Make HTML area DOM element not accessible. HTML image map accessible
+ // manages its tree itself.
+ mFlags |= eSharedNode;
}
////////////////////////////////////////////////////////////////////////////////
// HTMLAreaAccessible: nsIAccessible
nsresult
HTMLAreaAccessible::GetNameInternal(nsAString& aName)
{
@@ -179,27 +182,16 @@ HTMLAreaAccessible::Description(nsString
// Still to do - follow IE's standard here
nsCOMPtr<nsIDOMHTMLAreaElement> area(do_QueryInterface(mContent));
if (area)
area->GetShape(aDescription);
}
////////////////////////////////////////////////////////////////////////////////
-// HTMLAreaAccessible: nsAccessNode public
-
-bool
-HTMLAreaAccessible::IsPrimaryForNode() const
-{
- // Make HTML area DOM element not accessible. HTML image map accessible
- // manages its tree itself.
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
// HTMLAreaAccessible: Accessible public
Accessible*
HTMLAreaAccessible::ChildAtPoint(int32_t aX, int32_t aY,
EWhichChildAtPoint aWhichChild)
{
// Don't walk into area accessibles.
return this;
--- a/accessible/src/html/HTMLImageMapAccessible.h
+++ b/accessible/src/html/HTMLImageMapAccessible.h
@@ -48,19 +48,16 @@ protected:
* Accessible for image map areas - must be child of image.
*/
class HTMLAreaAccessible : public HTMLLinkAccessible
{
public:
HTMLAreaAccessible(nsIContent* aContent, DocAccessible* aDoc);
- // nsAccessNode
- virtual bool IsPrimaryForNode() const;
-
// Accessible
virtual void Description(nsString& aDescription);
virtual nsresult GetNameInternal(nsAString& aName);
virtual Accessible* ChildAtPoint(int32_t aX, int32_t aY,
EWhichChildAtPoint aWhichChild);
virtual void GetBoundsRect(nsRect& aBounds, nsIFrame** aBoundingFrame);
// HyperLinkAccessible
--- a/accessible/src/html/HTMLListAccessible.cpp
+++ b/accessible/src/html/HTMLListAccessible.cpp
@@ -136,33 +136,33 @@ HTMLLIAccessible::CacheChildren()
// Cache children from subtree.
AccessibleWrap::CacheChildren();
}
////////////////////////////////////////////////////////////////////////////////
// HTMLListBulletAccessible
////////////////////////////////////////////////////////////////////////////////
+HTMLListBulletAccessible::
+ HTMLListBulletAccessible(nsIContent* aContent, DocAccessible* aDoc) :
+ LeafAccessible(aContent, aDoc)
+{
+ mFlags |= eSharedNode;
+}
////////////////////////////////////////////////////////////////////////////////
// HTMLListBulletAccessible: nsAccessNode
nsIFrame*
HTMLListBulletAccessible::GetFrame() const
{
nsBlockFrame* blockFrame = do_QueryFrame(mContent->GetPrimaryFrame());
return blockFrame ? blockFrame->GetBullet() : nullptr;
}
-bool
-HTMLListBulletAccessible::IsPrimaryForNode() const
-{
- return false;
-}
-
////////////////////////////////////////////////////////////////////////////////
// HTMLListBulletAccessible: Accessible
ENameValueFlag
HTMLListBulletAccessible::Name(nsString &aName)
{
aName.Truncate();
--- a/accessible/src/html/HTMLListAccessible.h
+++ b/accessible/src/html/HTMLListAccessible.h
@@ -70,23 +70,21 @@ private:
/**
* Used for bullet of HTML list item element (for example, HTML li).
*/
class HTMLListBulletAccessible : public LeafAccessible
{
public:
- HTMLListBulletAccessible(nsIContent* aContent, DocAccessible* aDoc) :
- LeafAccessible(aContent, aDoc) { }
+ HTMLListBulletAccessible(nsIContent* aContent, DocAccessible* aDoc);
virtual ~HTMLListBulletAccessible() { }
// nsAccessNode
virtual nsIFrame* GetFrame() const;
- virtual bool IsPrimaryForNode() const;
// Accessible
virtual ENameValueFlag Name(nsString& aName);
virtual a11y::role NativeRole();
virtual uint64_t NativeState();
virtual void AppendTextTo(nsAString& aText, uint32_t aStartOffset = 0,
uint32_t aLength = PR_UINT32_MAX);
--- a/accessible/src/html/HTMLSelectAccessible.cpp
+++ b/accessible/src/html/HTMLSelectAccessible.cpp
@@ -630,16 +630,17 @@ HTMLComboboxAccessible::SelectedOption()
// HTMLComboboxListAccessible
////////////////////////////////////////////////////////////////////////////////
HTMLComboboxListAccessible::
HTMLComboboxListAccessible(nsIAccessible* aParent, nsIContent* aContent,
DocAccessible* aDoc) :
HTMLSelectListAccessible(aContent, aDoc)
{
+ mFlags |= eSharedNode;
}
////////////////////////////////////////////////////////////////////////////////
// HTMLComboboxAccessible: nsAccessNode
nsIFrame*
HTMLComboboxListAccessible::GetFrame() const
{
@@ -650,22 +651,16 @@ HTMLComboboxListAccessible::GetFrame() c
if (comboBox) {
return comboBox->GetDropDown();
}
}
return nullptr;
}
-bool
-HTMLComboboxListAccessible::IsPrimaryForNode() const
-{
- return false;
-}
-
////////////////////////////////////////////////////////////////////////////////
// HTMLComboboxAccessible: Accessible
role
HTMLComboboxListAccessible::NativeRole()
{
return roles::COMBOBOX_LIST;
}
--- a/accessible/src/html/HTMLSelectAccessible.h
+++ b/accessible/src/html/HTMLSelectAccessible.h
@@ -217,17 +217,16 @@ class HTMLComboboxListAccessible : publi
public:
HTMLComboboxListAccessible(nsIAccessible* aParent, nsIContent* aContent,
DocAccessible* aDoc);
virtual ~HTMLComboboxListAccessible() {}
// nsAccessNode
virtual nsIFrame* GetFrame() const;
- virtual bool IsPrimaryForNode() const;
// Accessible
virtual a11y::role NativeRole();
virtual uint64_t NativeState();
virtual void GetBoundsRect(nsRect& aBounds, nsIFrame** aBoundingFrame);
// Widgets
virtual bool IsActiveWidget() const;
--- a/accessible/src/xul/XULTreeAccessible.cpp
+++ b/accessible/src/xul/XULTreeAccessible.cpp
@@ -698,16 +698,17 @@ XULTreeAccessible::CreateTreeItemAccessi
XULTreeItemAccessibleBase::
XULTreeItemAccessibleBase(nsIContent* aContent, DocAccessible* aDoc,
Accessible* aParent, nsITreeBoxObject* aTree,
nsITreeView* aTreeView, int32_t aRow) :
AccessibleWrap(aContent, aDoc),
mTree(aTree), mTreeView(aTreeView), mRow(aRow)
{
mParent = aParent;
+ mFlags |= eSharedNode;
}
////////////////////////////////////////////////////////////////////////////////
// XULTreeItemAccessibleBase: nsISupports implementation
NS_IMPL_CYCLE_COLLECTION_CLASS(XULTreeItemAccessibleBase)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(XULTreeItemAccessibleBase,
@@ -891,22 +892,16 @@ XULTreeItemAccessibleBase::Shutdown()
{
mTree = nullptr;
mTreeView = nullptr;
mRow = -1;
AccessibleWrap::Shutdown();
}
-bool
-XULTreeItemAccessibleBase::IsPrimaryForNode() const
-{
- return false;
-}
-
////////////////////////////////////////////////////////////////////////////////
// XULTreeItemAccessibleBase: Accessible public methods
// nsIAccessible::groupPosition
GroupPos
XULTreeItemAccessibleBase::GroupPosition()
{
GroupPos groupPos;
--- a/accessible/src/xul/XULTreeAccessible.h
+++ b/accessible/src/xul/XULTreeAccessible.h
@@ -149,17 +149,16 @@ public:
NS_IMETHOD SetSelected(bool aSelect);
NS_IMETHOD TakeFocus();
NS_IMETHOD GetActionName(uint8_t aIndex, nsAString& aName);
NS_IMETHOD DoAction(uint8_t aIndex);
// nsAccessNode
virtual void Shutdown();
- virtual bool IsPrimaryForNode() const;
// Accessible
virtual GroupPos GroupPosition();
virtual uint64_t NativeState();
virtual uint64_t NativeInteractiveState() const;
virtual int32_t IndexInParent() const;
virtual Relation RelationByType(uint32_t aType);
virtual Accessible* FocusedChild();
--- a/accessible/src/xul/XULTreeGridAccessible.cpp
+++ b/accessible/src/xul/XULTreeGridAccessible.cpp
@@ -464,16 +464,17 @@ XULTreeGridCellAccessible::
XULTreeGridCellAccessible(nsIContent* aContent, DocAccessible* aDoc,
XULTreeGridRowAccessible* aRowAcc,
nsITreeBoxObject* aTree, nsITreeView* aTreeView,
int32_t aRow, nsITreeColumn* aColumn) :
LeafAccessible(aContent, aDoc), xpcAccessibleTableCell(this), mTree(aTree),
mTreeView(aTreeView), mRow(aRow), mColumn(aColumn)
{
mParent = aRowAcc;
+ mFlags |= eSharedNode;
}
////////////////////////////////////////////////////////////////////////////////
// XULTreeGridCellAccessible: nsISupports implementation
NS_IMPL_CYCLE_COLLECTION_CLASS(XULTreeGridCellAccessible)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(XULTreeGridCellAccessible,
@@ -789,22 +790,16 @@ XULTreeGridCellAccessible::Init()
int16_t type;
mColumn->GetType(&type);
if (type == nsITreeColumn::TYPE_CHECKBOX)
mTreeView->GetCellValue(mRow, mColumn, mCachedTextEquiv);
else
mTreeView->GetCellText(mRow, mColumn, mCachedTextEquiv);
}
-bool
-XULTreeGridCellAccessible::IsPrimaryForNode() const
-{
- return false;
-}
-
////////////////////////////////////////////////////////////////////////////////
// XULTreeGridCellAccessible: Accessible public implementation
nsresult
XULTreeGridCellAccessible::GetAttributesInternal(nsIPersistentProperties* aAttributes)
{
NS_ENSURE_ARG_POINTER(aAttributes);
--- a/accessible/src/xul/XULTreeGridAccessible.h
+++ b/accessible/src/xul/XULTreeGridAccessible.h
@@ -146,17 +146,16 @@ public:
NS_IMETHOD GetActionName(uint8_t aIndex, nsAString& aName);
NS_IMETHOD DoAction(uint8_t aIndex);
// nsIAccessibleTableCell
NS_DECL_OR_FORWARD_NSIACCESSIBLETABLECELL_WITH_XPCACCESSIBLETABLECELL
// nsAccessNode
virtual void Init();
- virtual bool IsPrimaryForNode() const;
// Accessible
virtual void Shutdown();
virtual ENameValueFlag Name(nsString& aName);
virtual Accessible* FocusedChild();
virtual nsresult GetAttributesInternal(nsIPersistentProperties* aAttributes);
virtual int32_t IndexInParent() const;
virtual Relation RelationByType(uint32_t aType);