From 0b2a30743eeb78063991a051a179679d3c797807 Mon Sep 17 00:00:00 2001 From: "cfleizach@apple.com" Date: Sat, 16 Mar 2013 08:51:52 +0000 Subject: [PATCH] AX: aria-hidden on container does not hide descendant popup buttons https://bugs.webkit.org/show_bug.cgi?id=112373 Reviewed by Ryosuke Niwa. Source/WebCore: There are a number of subclass AX objects that implement accessibilityIsIgnored() to always return false. This means that even if their parent is aria-hidden=true they still show up in the tree. This re-organizes this base case of aria-hidden into AccessibilityObject so that it can be re-used by these special subclasses where appropriate. Test: accessibility/aria-hidden-hides-all-elements.html * accessibility/AccessibilityImageMapLink.h: (WebCore::AccessibilityImageMapLink::isImageMapLink): * accessibility/AccessibilityList.cpp: (WebCore::AccessibilityList::computeAccessibilityIsIgnored): * accessibility/AccessibilityListBox.cpp: (WebCore): * accessibility/AccessibilityListBox.h: (AccessibilityListBox): * accessibility/AccessibilityListBoxOption.cpp: (WebCore::AccessibilityListBoxOption::computeAccessibilityIsIgnored): * accessibility/AccessibilityMediaControls.cpp: (WebCore::AccessibilityMediaControl::computeAccessibilityIsIgnored): (WebCore::AccessibilityMediaControlsContainer::computeAccessibilityIsIgnored): (WebCore::AccessibilityMediaTimeDisplay::computeAccessibilityIsIgnored): * accessibility/AccessibilityMediaControls.h: (AccessibilityMediaControlsContainer): * accessibility/AccessibilityMenuList.h: (WebCore::AccessibilityMenuList::roleValue): * accessibility/AccessibilityMenuListOption.cpp: (WebCore::AccessibilityMenuListOption::computeAccessibilityIsIgnored): * accessibility/AccessibilityMenuListPopup.cpp: (WebCore::AccessibilityMenuListPopup::computeAccessibilityIsIgnored): * accessibility/AccessibilityMockObject.cpp: (WebCore::AccessibilityMockObject::computeAccessibilityIsIgnored): (WebCore): * accessibility/AccessibilityMockObject.h: (AccessibilityMockObject): * accessibility/AccessibilityObject.cpp: (WebCore::AccessibilityObject::accessibilityIsIgnoredDefaultForObject): (WebCore): (WebCore::AccessibilityObject::ariaIsHidden): (WebCore::AccessibilityObject::accessibilityIsIgnoredBase): * accessibility/AccessibilityObject.h: (AccessibilityObject): * accessibility/AccessibilityProgressIndicator.cpp: (WebCore::AccessibilityProgressIndicator::computeAccessibilityIsIgnored): * accessibility/AccessibilityRenderObject.cpp: (WebCore): (WebCore::AccessibilityRenderObject::accessibilityIsIgnoredBase): (WebCore::AccessibilityRenderObject::addImageMapChildren): * accessibility/AccessibilityRenderObject.h: (AccessibilityRenderObject): * accessibility/AccessibilityScrollbar.h: (AccessibilityScrollbar): * accessibility/AccessibilitySlider.cpp: (WebCore): (WebCore::AccessibilitySliderThumb::computeAccessibilityIsIgnored): * accessibility/AccessibilitySlider.h: (AccessibilitySlider): * accessibility/AccessibilitySpinButton.h: (WebCore::AccessibilitySpinButton::roleValue): (AccessibilitySpinButtonPart): LayoutTests: * accessibility/aria-hidden-hides-all-elements-expected.txt: Added. * accessibility/aria-hidden-hides-all-elements.html: Added. git-svn-id: https://svn.webkit.org/repository/webkit/trunk@145988 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- LayoutTests/ChangeLog | 10 ++++ .../aria-hidden-hides-all-elements-expected.txt | 10 ++++ .../aria-hidden-hides-all-elements.html | 45 ++++++++++++++ Source/WebCore/ChangeLog | 69 ++++++++++++++++++++++ .../accessibility/AccessibilityImageMapLink.h | 1 - Source/WebCore/accessibility/AccessibilityList.cpp | 8 +-- .../WebCore/accessibility/AccessibilityListBox.cpp | 11 ---- .../WebCore/accessibility/AccessibilityListBox.h | 1 - .../accessibility/AccessibilityListBoxOption.cpp | 4 +- .../accessibility/AccessibilityMediaControls.cpp | 11 +++- .../accessibility/AccessibilityMediaControls.h | 2 +- .../accessibility/AccessibilityMenuList.cpp | 4 +- .../WebCore/accessibility/AccessibilityMenuList.h | 1 - .../accessibility/AccessibilityMenuListOption.cpp | 2 +- .../accessibility/AccessibilityMenuListPopup.cpp | 2 +- .../accessibility/AccessibilityMockObject.cpp | 5 ++ .../accessibility/AccessibilityMockObject.h | 1 + .../WebCore/accessibility/AccessibilityObject.cpp | 29 +++++++++ Source/WebCore/accessibility/AccessibilityObject.h | 5 +- .../AccessibilityProgressIndicator.cpp | 2 +- .../accessibility/AccessibilityRenderObject.cpp | 45 +++----------- .../accessibility/AccessibilityRenderObject.h | 3 +- .../WebCore/accessibility/AccessibilityScrollbar.h | 1 - .../WebCore/accessibility/AccessibilitySlider.cpp | 19 +----- Source/WebCore/accessibility/AccessibilitySlider.h | 1 - .../accessibility/AccessibilitySpinButton.h | 2 - .../WebCore/accessibility/AccessibilityTable.cpp | 2 +- .../accessibility/AccessibilityTableCell.cpp | 2 +- .../accessibility/AccessibilityTableRow.cpp | 2 +- 29 files changed, 204 insertions(+), 96 deletions(-) create mode 100644 LayoutTests/accessibility/aria-hidden-hides-all-elements-expected.txt create mode 100644 LayoutTests/accessibility/aria-hidden-hides-all-elements.html diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog index 18ac1c1..b4307fc 100644 --- a/LayoutTests/ChangeLog +++ b/LayoutTests/ChangeLog @@ -1,3 +1,13 @@ +2013-03-16 Chris Fleizach + + AX: aria-hidden on container does not hide descendant popup buttons + https://bugs.webkit.org/show_bug.cgi?id=112373 + + Reviewed by Ryosuke Niwa. + + * accessibility/aria-hidden-hides-all-elements-expected.txt: Added. + * accessibility/aria-hidden-hides-all-elements.html: Added. + 2013-03-16 Ryosuke Niwa Mac rebaseline after r145977. diff --git a/LayoutTests/accessibility/aria-hidden-hides-all-elements-expected.txt b/LayoutTests/accessibility/aria-hidden-hides-all-elements-expected.txt new file mode 100644 index 0000000..b4549a2 --- /dev/null +++ b/LayoutTests/accessibility/aria-hidden-hides-all-elements-expected.txt @@ -0,0 +1,10 @@ +This tests aria-hidden on a parent node will hide all these special subclass objects. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS content.childrenCount is 0 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/accessibility/aria-hidden-hides-all-elements.html b/LayoutTests/accessibility/aria-hidden-hides-all-elements.html new file mode 100644 index 0000000..7952a3a --- /dev/null +++ b/LayoutTests/accessibility/aria-hidden-hides-all-elements.html @@ -0,0 +1,45 @@ + + + + + + + +
+ +
+ + + + + +
  • item
+ + + + cake + +
+ +
+ + + + + + + diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index 98fdefd..ff42fba 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,72 @@ +2013-03-16 Chris Fleizach + + AX: aria-hidden on container does not hide descendant popup buttons + https://bugs.webkit.org/show_bug.cgi?id=112373 + + Reviewed by Ryosuke Niwa. + + There are a number of subclass AX objects that implement accessibilityIsIgnored() + to always return false. This means that even if their parent is aria-hidden=true + they still show up in the tree. + + This re-organizes this base case of aria-hidden into AccessibilityObject so that + it can be re-used by these special subclasses where appropriate. + + Test: accessibility/aria-hidden-hides-all-elements.html + + * accessibility/AccessibilityImageMapLink.h: + (WebCore::AccessibilityImageMapLink::isImageMapLink): + * accessibility/AccessibilityList.cpp: + (WebCore::AccessibilityList::computeAccessibilityIsIgnored): + * accessibility/AccessibilityListBox.cpp: + (WebCore): + * accessibility/AccessibilityListBox.h: + (AccessibilityListBox): + * accessibility/AccessibilityListBoxOption.cpp: + (WebCore::AccessibilityListBoxOption::computeAccessibilityIsIgnored): + * accessibility/AccessibilityMediaControls.cpp: + (WebCore::AccessibilityMediaControl::computeAccessibilityIsIgnored): + (WebCore::AccessibilityMediaControlsContainer::computeAccessibilityIsIgnored): + (WebCore::AccessibilityMediaTimeDisplay::computeAccessibilityIsIgnored): + * accessibility/AccessibilityMediaControls.h: + (AccessibilityMediaControlsContainer): + * accessibility/AccessibilityMenuList.h: + (WebCore::AccessibilityMenuList::roleValue): + * accessibility/AccessibilityMenuListOption.cpp: + (WebCore::AccessibilityMenuListOption::computeAccessibilityIsIgnored): + * accessibility/AccessibilityMenuListPopup.cpp: + (WebCore::AccessibilityMenuListPopup::computeAccessibilityIsIgnored): + * accessibility/AccessibilityMockObject.cpp: + (WebCore::AccessibilityMockObject::computeAccessibilityIsIgnored): + (WebCore): + * accessibility/AccessibilityMockObject.h: + (AccessibilityMockObject): + * accessibility/AccessibilityObject.cpp: + (WebCore::AccessibilityObject::accessibilityIsIgnoredDefaultForObject): + (WebCore): + (WebCore::AccessibilityObject::ariaIsHidden): + (WebCore::AccessibilityObject::accessibilityIsIgnoredBase): + * accessibility/AccessibilityObject.h: + (AccessibilityObject): + * accessibility/AccessibilityProgressIndicator.cpp: + (WebCore::AccessibilityProgressIndicator::computeAccessibilityIsIgnored): + * accessibility/AccessibilityRenderObject.cpp: + (WebCore): + (WebCore::AccessibilityRenderObject::accessibilityIsIgnoredBase): + (WebCore::AccessibilityRenderObject::addImageMapChildren): + * accessibility/AccessibilityRenderObject.h: + (AccessibilityRenderObject): + * accessibility/AccessibilityScrollbar.h: + (AccessibilityScrollbar): + * accessibility/AccessibilitySlider.cpp: + (WebCore): + (WebCore::AccessibilitySliderThumb::computeAccessibilityIsIgnored): + * accessibility/AccessibilitySlider.h: + (AccessibilitySlider): + * accessibility/AccessibilitySpinButton.h: + (WebCore::AccessibilitySpinButton::roleValue): + (AccessibilitySpinButtonPart): + 2013-03-15 Simon Fraser Reflected video elements hit assertion on Lion diff --git a/Source/WebCore/accessibility/AccessibilityImageMapLink.h b/Source/WebCore/accessibility/AccessibilityImageMapLink.h index fee287f..3e20049 100644 --- a/Source/WebCore/accessibility/AccessibilityImageMapLink.h +++ b/Source/WebCore/accessibility/AccessibilityImageMapLink.h @@ -74,7 +74,6 @@ private: virtual void accessibilityText(Vector&); virtual bool isImageMapLink() const { return true; } - virtual bool computeAccessibilityIsIgnored() const { return false; } }; } // namespace WebCore diff --git a/Source/WebCore/accessibility/AccessibilityList.cpp b/Source/WebCore/accessibility/AccessibilityList.cpp index 7518a35..8039cf03 100644 --- a/Source/WebCore/accessibility/AccessibilityList.cpp +++ b/Source/WebCore/accessibility/AccessibilityList.cpp @@ -55,13 +55,7 @@ PassRefPtr AccessibilityList::create(RenderObject* renderer) bool AccessibilityList::computeAccessibilityIsIgnored() const { - AccessibilityObjectInclusion decision = accessibilityIsIgnoredBase(); - if (decision == IncludeObject) - return false; - if (decision == IgnoreObject) - return true; - - return false; + return accessibilityIsIgnoredByDefault(); } bool AccessibilityList::isUnorderedList() const diff --git a/Source/WebCore/accessibility/AccessibilityListBox.cpp b/Source/WebCore/accessibility/AccessibilityListBox.cpp index 1e5c53c..4795849 100644 --- a/Source/WebCore/accessibility/AccessibilityListBox.cpp +++ b/Source/WebCore/accessibility/AccessibilityListBox.cpp @@ -152,17 +152,6 @@ AccessibilityObject* AccessibilityListBox::listBoxOptionAccessibilityObject(HTML return listBoxObject; } -bool AccessibilityListBox::computeAccessibilityIsIgnored() const -{ - AccessibilityObjectInclusion decision = accessibilityIsIgnoredBase(); - if (decision == IncludeObject) - return false; - if (decision == IgnoreObject) - return true; - - return false; -} - AccessibilityObject* AccessibilityListBox::elementAccessibilityHitTest(const IntPoint& point) const { // the internal HTMLSelectElement methods for returning a listbox option at a point diff --git a/Source/WebCore/accessibility/AccessibilityListBox.h b/Source/WebCore/accessibility/AccessibilityListBox.h index 25b0a06..dda37e8 100644 --- a/Source/WebCore/accessibility/AccessibilityListBox.h +++ b/Source/WebCore/accessibility/AccessibilityListBox.h @@ -54,7 +54,6 @@ public: private: AccessibilityObject* listBoxOptionAccessibilityObject(HTMLElement*) const; - virtual bool computeAccessibilityIsIgnored() const; virtual AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const; }; diff --git a/Source/WebCore/accessibility/AccessibilityListBoxOption.cpp b/Source/WebCore/accessibility/AccessibilityListBoxOption.cpp index 509699f..3074f1f 100644 --- a/Source/WebCore/accessibility/AccessibilityListBoxOption.cpp +++ b/Source/WebCore/accessibility/AccessibilityListBoxOption.cpp @@ -124,8 +124,8 @@ bool AccessibilityListBoxOption::computeAccessibilityIsIgnored() const { if (!m_optionElement) return true; - - if (equalIgnoringCase(getAttribute(aria_hiddenAttr), "true")) + + if (accessibilityIsIgnoredByDefault()) return true; return parentObject()->accessibilityIsIgnored(); diff --git a/Source/WebCore/accessibility/AccessibilityMediaControls.cpp b/Source/WebCore/accessibility/AccessibilityMediaControls.cpp index 4107157..5a09d5b 100644 --- a/Source/WebCore/accessibility/AccessibilityMediaControls.cpp +++ b/Source/WebCore/accessibility/AccessibilityMediaControls.cpp @@ -178,7 +178,7 @@ bool AccessibilityMediaControl::computeAccessibilityIsIgnored() const if (!m_renderer || !m_renderer->style() || m_renderer->style()->visibility() != VISIBLE || controlType() == MediaTimelineContainer) return true; - return false; + return accessibilityIsIgnoredByDefault(); } AccessibilityRole AccessibilityMediaControl::roleValue() const @@ -256,6 +256,10 @@ const String AccessibilityMediaControlsContainer::elementTypeName() const return audioElement; } +bool AccessibilityMediaControlsContainer::computeAccessibilityIsIgnored() const +{ + return accessibilityIsIgnoredByDefault(); +} // // AccessibilityMediaTimeline @@ -305,7 +309,10 @@ bool AccessibilityMediaTimeDisplay::computeAccessibilityIsIgnored() const if (!m_renderer || !m_renderer->style() || m_renderer->style()->visibility() != VISIBLE) return true; - return !m_renderer->style()->width().value(); + if (!m_renderer->style()->width().value()) + return true; + + return accessibilityIsIgnoredByDefault(); } String AccessibilityMediaTimeDisplay::accessibilityDescription() const diff --git a/Source/WebCore/accessibility/AccessibilityMediaControls.h b/Source/WebCore/accessibility/AccessibilityMediaControls.h index 6c81a97..628d70e8 100644 --- a/Source/WebCore/accessibility/AccessibilityMediaControls.h +++ b/Source/WebCore/accessibility/AccessibilityMediaControls.h @@ -90,7 +90,7 @@ private: explicit AccessibilityMediaControlsContainer(RenderObject*); bool controllingVideoElement() const; const String elementTypeName() const; - virtual bool computeAccessibilityIsIgnored() const { return false; } + virtual bool computeAccessibilityIsIgnored() const; }; diff --git a/Source/WebCore/accessibility/AccessibilityMenuList.cpp b/Source/WebCore/accessibility/AccessibilityMenuList.cpp index 6a49e7d..05a5632 100644 --- a/Source/WebCore/accessibility/AccessibilityMenuList.cpp +++ b/Source/WebCore/accessibility/AccessibilityMenuList.cpp @@ -62,12 +62,12 @@ void AccessibilityMenuList::addChildren() if (!list) return; - if (list->accessibilityPlatformIncludesObject() == IgnoreObject) { + static_cast(list)->setParent(this); + if (list->accessibilityIsIgnored()) { cache->remove(list->axObjectID()); return; } - static_cast(list)->setParent(this); m_children.append(list); list->addChildren(); diff --git a/Source/WebCore/accessibility/AccessibilityMenuList.h b/Source/WebCore/accessibility/AccessibilityMenuList.h index d437604..95f7972 100644 --- a/Source/WebCore/accessibility/AccessibilityMenuList.h +++ b/Source/WebCore/accessibility/AccessibilityMenuList.h @@ -49,7 +49,6 @@ private: virtual bool isMenuList() const { return true; } virtual AccessibilityRole roleValue() const { return PopUpButtonRole; } - virtual bool computeAccessibilityIsIgnored() const { return false; } virtual bool canSetFocusAttribute() const; virtual void addChildren(); diff --git a/Source/WebCore/accessibility/AccessibilityMenuListOption.cpp b/Source/WebCore/accessibility/AccessibilityMenuListOption.cpp index b3df0c9..480e357 100644 --- a/Source/WebCore/accessibility/AccessibilityMenuListOption.cpp +++ b/Source/WebCore/accessibility/AccessibilityMenuListOption.cpp @@ -98,7 +98,7 @@ bool AccessibilityMenuListOption::canSetSelectedAttribute() const bool AccessibilityMenuListOption::computeAccessibilityIsIgnored() const { - return accessibilityPlatformIncludesObject() != IncludeObject; + return accessibilityIsIgnoredByDefault(); } LayoutRect AccessibilityMenuListOption::elementRect() const diff --git a/Source/WebCore/accessibility/AccessibilityMenuListPopup.cpp b/Source/WebCore/accessibility/AccessibilityMenuListPopup.cpp index ec1d53e..033ca46 100644 --- a/Source/WebCore/accessibility/AccessibilityMenuListPopup.cpp +++ b/Source/WebCore/accessibility/AccessibilityMenuListPopup.cpp @@ -64,7 +64,7 @@ bool AccessibilityMenuListPopup::isEnabled() const bool AccessibilityMenuListPopup::computeAccessibilityIsIgnored() const { - return accessibilityPlatformIncludesObject() != IncludeObject; + return accessibilityIsIgnoredByDefault(); } AccessibilityMenuListOption* AccessibilityMenuListPopup::menuListOptionAccessibilityObject(HTMLElement* element) const diff --git a/Source/WebCore/accessibility/AccessibilityMockObject.cpp b/Source/WebCore/accessibility/AccessibilityMockObject.cpp index f500404..f481561 100644 --- a/Source/WebCore/accessibility/AccessibilityMockObject.cpp +++ b/Source/WebCore/accessibility/AccessibilityMockObject.cpp @@ -37,4 +37,9 @@ AccessibilityMockObject::~AccessibilityMockObject() { } +bool AccessibilityMockObject::computeAccessibilityIsIgnored() const +{ + return accessibilityIsIgnoredByDefault(); +} + } diff --git a/Source/WebCore/accessibility/AccessibilityMockObject.h b/Source/WebCore/accessibility/AccessibilityMockObject.h index e02da6b..8a9a36e 100644 --- a/Source/WebCore/accessibility/AccessibilityMockObject.h +++ b/Source/WebCore/accessibility/AccessibilityMockObject.h @@ -47,6 +47,7 @@ protected: private: virtual bool isMockObject() const { return true; } + virtual bool computeAccessibilityIsIgnored() const; // Must be called when the parent object clears its children. virtual void detachFromParent() { m_parent = 0; } }; diff --git a/Source/WebCore/accessibility/AccessibilityObject.cpp b/Source/WebCore/accessibility/AccessibilityObject.cpp index 03cd3d3..2568677 100644 --- a/Source/WebCore/accessibility/AccessibilityObject.cpp +++ b/Source/WebCore/accessibility/AccessibilityObject.cpp @@ -1867,6 +1867,35 @@ bool AccessibilityObject::isButton() const return role == ButtonRole || role == PopUpButtonRole || role == ToggleButtonRole; } +bool AccessibilityObject::accessibilityIsIgnoredByDefault() const +{ + return defaultObjectInclusion() == IgnoreObject; +} + +bool AccessibilityObject::ariaIsHidden() const +{ + if (equalIgnoringCase(getAttribute(aria_hiddenAttr), "true")) + return true; + + for (AccessibilityObject* object = parentObject(); object; object = object->parentObject()) { + if (equalIgnoringCase(object->getAttribute(aria_hiddenAttr), "true")) + return true; + } + + return false; +} + +AccessibilityObjectInclusion AccessibilityObject::defaultObjectInclusion() const +{ + if (ariaIsHidden()) + return IgnoreObject; + + if (isPresentationalChildOfAriaRole()) + return IgnoreObject; + + return accessibilityPlatformIncludesObject(); +} + bool AccessibilityObject::accessibilityIsIgnored() const { AXComputedObjectAttributeCache* attributeCache = axObjectCache()->computedObjectAttributeCache(); diff --git a/Source/WebCore/accessibility/AccessibilityObject.h b/Source/WebCore/accessibility/AccessibilityObject.h index 0e0bcfa..26a35a65 100644 --- a/Source/WebCore/accessibility/AccessibilityObject.h +++ b/Source/WebCore/accessibility/AccessibilityObject.h @@ -486,7 +486,9 @@ public: virtual Node* node() const { return 0; } virtual RenderObject* renderer() const { return 0; } virtual bool accessibilityIsIgnored() const; - + virtual AccessibilityObjectInclusion defaultObjectInclusion() const; + bool accessibilityIsIgnoredByDefault() const; + int blockquoteLevel() const; virtual int headingLevel() const { return 0; } virtual int tableLevel() const { return 0; } @@ -849,6 +851,7 @@ protected: static bool isAccessibilityTextSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*); static bool objectMatchesSearchCriteriaWithResultLimit(AccessibilityObject*, AccessibilitySearchCriteria*, AccessibilityChildrenVector&); virtual AccessibilityRole buttonRoleType() const; + bool ariaIsHidden() const; #if PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY)) bool allowsTextRanges() const; diff --git a/Source/WebCore/accessibility/AccessibilityProgressIndicator.cpp b/Source/WebCore/accessibility/AccessibilityProgressIndicator.cpp index 41e55747..08c8656 100644 --- a/Source/WebCore/accessibility/AccessibilityProgressIndicator.cpp +++ b/Source/WebCore/accessibility/AccessibilityProgressIndicator.cpp @@ -44,7 +44,7 @@ PassRefPtr AccessibilityProgressIndicator::creat bool AccessibilityProgressIndicator::computeAccessibilityIsIgnored() const { - return accessibilityIsIgnoredBase() == IgnoreObject; + return accessibilityIsIgnoredByDefault(); } float AccessibilityProgressIndicator::valueForRange() const diff --git a/Source/WebCore/accessibility/AccessibilityRenderObject.cpp b/Source/WebCore/accessibility/AccessibilityRenderObject.cpp index a6373d6..32230b0 100644 --- a/Source/WebCore/accessibility/AccessibilityRenderObject.cpp +++ b/Source/WebCore/accessibility/AccessibilityRenderObject.cpp @@ -1051,22 +1051,6 @@ AccessibilityObject* AccessibilityRenderObject::titleUIElement() const return 0; } -bool AccessibilityRenderObject::ariaIsHidden() const -{ - if (equalIgnoringCase(getAttribute(aria_hiddenAttr), "true")) - return true; - - // aria-hidden hides this object and any children - AccessibilityObject* object = parentObject(); - while (object) { - if (equalIgnoringCase(object->getAttribute(aria_hiddenAttr), "true")) - return true; - object = object->parentObject(); - } - - return false; -} - bool AccessibilityRenderObject::isAllowedChildOfTree() const { // Determine if this is in a tree. If so, we apply special behavior to make it work like an AXOutline. @@ -1089,7 +1073,7 @@ bool AccessibilityRenderObject::isAllowedChildOfTree() const return true; } -AccessibilityObjectInclusion AccessibilityRenderObject::accessibilityIsIgnoredBase() const +AccessibilityObjectInclusion AccessibilityRenderObject::defaultObjectInclusion() const { // The following cases can apply to any element that's a subclass of AccessibilityRenderObject. @@ -1103,24 +1087,9 @@ AccessibilityObjectInclusion AccessibilityRenderObject::accessibilityIsIgnoredBa return IgnoreObject; } - - // Anything marked as aria-hidden or a child of something aria-hidden must be hidden. - if (ariaIsHidden()) - return IgnoreObject; - - // Anything that is a presentational role must be hidden. - if (isPresentationalChildOfAriaRole()) - return IgnoreObject; - // Allow the platform to make a decision. - AccessibilityObjectInclusion decision = accessibilityPlatformIncludesObject(); - if (decision == IncludeObject) - return IncludeObject; - if (decision == IgnoreObject) - return IgnoreObject; - - return DefaultBehavior; -} + return AccessibilityObject::defaultObjectInclusion(); +} bool AccessibilityRenderObject::computeAccessibilityIsIgnored() const { @@ -1131,7 +1100,7 @@ bool AccessibilityRenderObject::computeAccessibilityIsIgnored() const // Check first if any of the common reasons cause this element to be ignored. // Then process other use cases that need to be applied to all the various roles // that AccessibilityRenderObjects take on. - AccessibilityObjectInclusion decision = accessibilityIsIgnoredBase(); + AccessibilityObjectInclusion decision = defaultObjectInclusion(); if (decision == IncludeObject) return false; if (decision == IgnoreObject) @@ -2733,8 +2702,10 @@ void AccessibilityRenderObject::addImageMapChildren() areaObject->setHTMLAreaElement(static_cast(current)); areaObject->setHTMLMapElement(map); areaObject->setParent(this); - - m_children.append(areaObject); + if (!areaObject->accessibilityIsIgnored()) + m_children.append(areaObject); + else + axObjectCache()->remove(areaObject->axObjectID()); } } } diff --git a/Source/WebCore/accessibility/AccessibilityRenderObject.h b/Source/WebCore/accessibility/AccessibilityRenderObject.h index ebb44bb..c01590d 100644 --- a/Source/WebCore/accessibility/AccessibilityRenderObject.h +++ b/Source/WebCore/accessibility/AccessibilityRenderObject.h @@ -93,7 +93,7 @@ public: virtual void setAccessibleName(const AtomicString&); // Provides common logic used by all elements when determining isIgnored. - AccessibilityObjectInclusion accessibilityIsIgnoredBase() const; + virtual AccessibilityObjectInclusion defaultObjectInclusion() const; virtual int layoutCount() const; virtual double estimatedLoadingProgress() const; @@ -228,7 +228,6 @@ protected: private: void ariaListboxSelectedChildren(AccessibilityChildrenVector&); void ariaListboxVisibleChildren(AccessibilityChildrenVector&); - bool ariaIsHidden() const; bool isAllowedChildOfTree() const; bool hasTextAlternative() const; String positionalDescriptionForMSAA() const; diff --git a/Source/WebCore/accessibility/AccessibilityScrollbar.h b/Source/WebCore/accessibility/AccessibilityScrollbar.h index 61837f4..6caeaea 100644 --- a/Source/WebCore/accessibility/AccessibilityScrollbar.h +++ b/Source/WebCore/accessibility/AccessibilityScrollbar.h @@ -44,7 +44,6 @@ public: private: explicit AccessibilityScrollbar(Scrollbar*); - virtual bool computeAccessibilityIsIgnored() const { return false; } virtual bool canSetValueAttribute() const { return true; } virtual bool canSetNumericValue() const { return true; } diff --git a/Source/WebCore/accessibility/AccessibilitySlider.cpp b/Source/WebCore/accessibility/AccessibilitySlider.cpp index 89f05f8..14020e0 100644 --- a/Source/WebCore/accessibility/AccessibilitySlider.cpp +++ b/Source/WebCore/accessibility/AccessibilitySlider.cpp @@ -113,17 +113,6 @@ AccessibilityObject* AccessibilitySlider::elementAccessibilityHitTest(const IntP return axObjectCache()->getOrCreate(m_renderer); } -bool AccessibilitySlider::computeAccessibilityIsIgnored() const -{ - AccessibilityObjectInclusion decision = accessibilityIsIgnoredBase(); - if (decision == IncludeObject) - return false; - if (decision == IgnoreObject) - return true; - - return false; -} - float AccessibilitySlider::valueForRange() const { return element()->value().toFloat(); @@ -180,13 +169,7 @@ LayoutRect AccessibilitySliderThumb::elementRect() const bool AccessibilitySliderThumb::computeAccessibilityIsIgnored() const { - AccessibilityObjectInclusion decision = accessibilityPlatformIncludesObject(); - if (decision == IncludeObject) - return false; - if (decision == IgnoreObject) - return true; - - return false; + return accessibilityIsIgnoredByDefault(); } } // namespace WebCore diff --git a/Source/WebCore/accessibility/AccessibilitySlider.h b/Source/WebCore/accessibility/AccessibilitySlider.h index 33e23ef..2c4dbbf 100644 --- a/Source/WebCore/accessibility/AccessibilitySlider.h +++ b/Source/WebCore/accessibility/AccessibilitySlider.h @@ -47,7 +47,6 @@ protected: private: HTMLInputElement* element() const; - virtual bool computeAccessibilityIsIgnored() const; virtual AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const; virtual AccessibilityRole roleValue() const { return SliderRole; } diff --git a/Source/WebCore/accessibility/AccessibilitySpinButton.h b/Source/WebCore/accessibility/AccessibilitySpinButton.h index cdc32e0..db5eab5 100644 --- a/Source/WebCore/accessibility/AccessibilitySpinButton.h +++ b/Source/WebCore/accessibility/AccessibilitySpinButton.h @@ -48,7 +48,6 @@ private: AccessibilitySpinButton(); virtual AccessibilityRole roleValue() const { return SpinButtonRole; } - virtual bool computeAccessibilityIsIgnored() const { return false; } virtual bool isSpinButton() const { return true; } virtual void addChildren(); virtual LayoutRect elementRect() const; @@ -72,7 +71,6 @@ private: virtual AccessibilityRole roleValue() const { return ButtonRole; } virtual bool isSpinButtonPart() const { return true; } virtual LayoutRect elementRect() const; - virtual bool computeAccessibilityIsIgnored() const { return false; } }; inline AccessibilitySpinButton* toAccessibilitySpinButton(AccessibilityObject* object) diff --git a/Source/WebCore/accessibility/AccessibilityTable.cpp b/Source/WebCore/accessibility/AccessibilityTable.cpp index 4c33236..467ea1e 100644 --- a/Source/WebCore/accessibility/AccessibilityTable.cpp +++ b/Source/WebCore/accessibility/AccessibilityTable.cpp @@ -541,7 +541,7 @@ AccessibilityRole AccessibilityTable::roleValue() const bool AccessibilityTable::computeAccessibilityIsIgnored() const { - AccessibilityObjectInclusion decision = accessibilityIsIgnoredBase(); + AccessibilityObjectInclusion decision = defaultObjectInclusion(); if (decision == IncludeObject) return false; if (decision == IgnoreObject) diff --git a/Source/WebCore/accessibility/AccessibilityTableCell.cpp b/Source/WebCore/accessibility/AccessibilityTableCell.cpp index 0e78b36..8b8b15b 100644 --- a/Source/WebCore/accessibility/AccessibilityTableCell.cpp +++ b/Source/WebCore/accessibility/AccessibilityTableCell.cpp @@ -56,7 +56,7 @@ PassRefPtr AccessibilityTableCell::create(RenderObject* bool AccessibilityTableCell::computeAccessibilityIsIgnored() const { - AccessibilityObjectInclusion decision = accessibilityIsIgnoredBase(); + AccessibilityObjectInclusion decision = defaultObjectInclusion(); if (decision == IncludeObject) return false; if (decision == IgnoreObject) diff --git a/Source/WebCore/accessibility/AccessibilityTableRow.cpp b/Source/WebCore/accessibility/AccessibilityTableRow.cpp index 1270cf8..b0d8d9c 100644 --- a/Source/WebCore/accessibility/AccessibilityTableRow.cpp +++ b/Source/WebCore/accessibility/AccessibilityTableRow.cpp @@ -88,7 +88,7 @@ AccessibilityObject* AccessibilityTableRow::observableObject() const bool AccessibilityTableRow::computeAccessibilityIsIgnored() const { - AccessibilityObjectInclusion decision = accessibilityIsIgnoredBase(); + AccessibilityObjectInclusion decision = defaultObjectInclusion(); if (decision == IncludeObject) return false; if (decision == IgnoreObject) -- 1.8.3.1