Changeset 123182 in webkit
- Timestamp:
- Jul 19, 2012 11:06:04 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r123178 r123182 1 2012-07-19 Dominic Mazzoni <dmazzoni@google.com> 2 3 AX: Need AccessibilityObjects for nodes without renderers in canvas subtree 4 https://bugs.webkit.org/show_bug.cgi?id=87899 5 6 Reviewed by Chris Fleizach. 7 8 This new test adds a bunch of elements to a normal container and the same elements to 9 a canvas subtree, then it iterates over all of the accessible objects within each 10 container and makes sure they have identical roles. Because we know the nodes in the 11 canvas subtree don't have renderers, this successfully tests that AccessibilityNodeObjects 12 are getting created for these nodes. 13 14 * accessibility/canvas-accessibilitynodeobject-expected.txt: Added. 15 * accessibility/canvas-accessibilitynodeobject.html: Added. 16 1 17 2012-07-19 Kent Tamura <tkent@chromium.org> 2 18 -
trunk/Source/WebCore/CMakeLists.txt
r123099 r123182 936 936 accessibility/AccessibilityMenuListPopup.cpp 937 937 accessibility/AccessibilityMockObject.cpp 938 accessibility/AccessibilityNodeObject.cpp 938 939 accessibility/AccessibilityObject.cpp 939 940 accessibility/AccessibilityProgressIndicator.cpp -
trunk/Source/WebCore/ChangeLog
r123181 r123182 1 2012-07-19 Dominic Mazzoni <dmazzoni@google.com> 2 3 AX: Need AccessibilityObjects for nodes without renderers in canvas subtree 4 https://bugs.webkit.org/show_bug.cgi?id=87899 5 6 Reviewed by Chris Fleizach. 7 8 Refactors AccessibilityRenderObject so that it inherits from a new class, 9 AccessibilityNodeObject, that can be constructed from a Node without a 10 renderer. Modifies AXObjectCache so that it automatically creates an 11 AccessibilityNodeObject for elements in a canvas subtree but not otherwise. 12 A new layout test verifies that this correctly exposes an accessibility 13 tree with appropriate roles for elements in a canvas subtree. 14 15 This patch does not try to complete the implementation of 16 AccessibilityNodeObject. Most AX methods are still unimplemented and need 17 to be migrated from AccessibilityRenderObject to AccessibilityNodeObject 18 in a future patch. 19 20 This patch also doesn't change anything outside of WebCore/accessibility, so 21 the rest of WebCore only calls AXObjectCache when there are changes to a 22 RenderObject, not to a Node. Accessible notifications on nodes without 23 renderers need to be implemented in a future patch. 24 25 Test: accessibility/canvas-accessibilitynodeobject.html 26 27 * CMakeLists.txt: 28 * GNUmakefile.list.am: 29 * Target.pri: 30 * WebCore.gypi: 31 * accessibility/AXObjectCache.cpp: 32 (WebCore::AXObjectCache::get): 33 (WebCore): 34 (WebCore::createFromNode): 35 (WebCore::AXObjectCache::getOrCreate): 36 (WebCore::AXObjectCache::remove): 37 * accessibility/AXObjectCache.h: 38 (AXObjectCache): 39 (WebCore::AXObjectCache::get): 40 (WebCore::AXObjectCache::getOrCreate): 41 (WebCore::AXObjectCache::remove): 42 * accessibility/AccessibilityARIAGrid.cpp: 43 (WebCore::AccessibilityARIAGrid::AccessibilityARIAGrid): 44 (WebCore): 45 (WebCore::AccessibilityARIAGrid::~AccessibilityARIAGrid): 46 (WebCore::AccessibilityARIAGrid::init): 47 (WebCore::AccessibilityARIAGrid::create): 48 * accessibility/AccessibilityARIAGrid.h: 49 (AccessibilityARIAGrid): 50 * accessibility/AccessibilityARIAGridCell.cpp: 51 (WebCore::AccessibilityARIAGridCell::create): 52 * accessibility/AccessibilityARIAGridRow.cpp: 53 (WebCore::AccessibilityARIAGridRow::create): 54 * accessibility/AccessibilityAllInOne.cpp: 55 * accessibility/AccessibilityList.cpp: 56 (WebCore::AccessibilityList::create): 57 * accessibility/AccessibilityListBox.cpp: 58 (WebCore::AccessibilityListBox::create): 59 * accessibility/AccessibilityMediaControls.cpp: 60 (WebCore::AccessibilityMediaControl::create): 61 (WebCore::AccessibilityMediaControlsContainer::create): 62 (WebCore::AccessibilityMediaTimeline::create): 63 (WebCore::AccessibilityMediaTimeDisplay::create): 64 * accessibility/AccessibilityMenuList.cpp: 65 (WebCore::AccessibilityMenuList::create): 66 (WebCore): 67 * accessibility/AccessibilityMenuList.h: 68 (AccessibilityMenuList): 69 * accessibility/AccessibilityNodeObject.cpp: Added. 70 (WebCore): 71 (WebCore::AccessibilityNodeObject::AccessibilityNodeObject): 72 (WebCore::AccessibilityNodeObject::~AccessibilityNodeObject): 73 (WebCore::AccessibilityNodeObject::init): 74 (WebCore::AccessibilityNodeObject::create): 75 (WebCore::AccessibilityNodeObject::detach): 76 (WebCore::AccessibilityNodeObject::childrenChanged): 77 (WebCore::AccessibilityNodeObject::updateAccessibilityRole): 78 (WebCore::AccessibilityNodeObject::firstChild): 79 (WebCore::AccessibilityNodeObject::lastChild): 80 (WebCore::AccessibilityNodeObject::previousSibling): 81 (WebCore::AccessibilityNodeObject::nextSibling): 82 (WebCore::AccessibilityNodeObject::parentObjectIfExists): 83 (WebCore::AccessibilityNodeObject::parentObject): 84 (WebCore::AccessibilityNodeObject::elementRect): 85 (WebCore::AccessibilityNodeObject::setNode): 86 (WebCore::AccessibilityNodeObject::document): 87 (WebCore::AccessibilityNodeObject::determineAccessibilityRole): 88 (WebCore::AccessibilityNodeObject::addChildren): 89 (WebCore::AccessibilityNodeObject::accessibilityIsIgnored): 90 (WebCore::AccessibilityNodeObject::canSetFocusAttribute): 91 (WebCore::AccessibilityNodeObject::determineAriaRoleAttribute): 92 (WebCore::AccessibilityNodeObject::ariaRoleAttribute): 93 (WebCore::AccessibilityNodeObject::remapAriaRoleDueToParent): 94 * accessibility/AccessibilityNodeObject.h: Added. 95 (WebCore): 96 (AccessibilityNodeObject): 97 (WebCore::AccessibilityNodeObject::isAccessibilityNodeObject): 98 (WebCore::AccessibilityNodeObject::node): 99 (WebCore::AccessibilityNodeObject::isDetached): 100 (WebCore::toAccessibilityNodeObject): 101 * accessibility/AccessibilityObject.h: 102 (WebCore::AccessibilityObject::isAccessibilityNodeObject): 103 * accessibility/AccessibilityProgressIndicator.cpp: 104 (WebCore::AccessibilityProgressIndicator::create): 105 * accessibility/AccessibilityRenderObject.cpp: 106 (WebCore::AccessibilityRenderObject::AccessibilityRenderObject): 107 (WebCore::AccessibilityRenderObject::init): 108 (WebCore): 109 (WebCore::AccessibilityRenderObject::create): 110 (WebCore::AccessibilityRenderObject::detach): 111 (WebCore::AccessibilityRenderObject::setRenderer): 112 (WebCore::AccessibilityRenderObject::canHaveChildren): 113 (WebCore::AccessibilityRenderObject::addCanvasChildren): 114 (WebCore::AccessibilityRenderObject::addChildren): 115 * accessibility/AccessibilityRenderObject.h: 116 (AccessibilityRenderObject): 117 * accessibility/AccessibilitySlider.cpp: 118 (WebCore::AccessibilitySlider::create): 119 * accessibility/AccessibilityTable.cpp: 120 (WebCore::AccessibilityTable::AccessibilityTable): 121 (WebCore): 122 (WebCore::AccessibilityTable::~AccessibilityTable): 123 (WebCore::AccessibilityTable::init): 124 (WebCore::AccessibilityTable::create): 125 * accessibility/AccessibilityTable.h: 126 (AccessibilityTable): 127 * accessibility/AccessibilityTableCell.cpp: 128 (WebCore::AccessibilityTableCell::create): 129 * accessibility/AccessibilityTableRow.cpp: 130 (WebCore::AccessibilityTableRow::create): 131 1 132 2012-07-19 Dan Bernstein <mitz@apple.com> 2 133 -
trunk/Source/WebCore/GNUmakefile.list.am
r122870 r123182 1318 1318 Source/WebCore/accessibility/AccessibilityMockObject.cpp \ 1319 1319 Source/WebCore/accessibility/AccessibilityMockObject.h \ 1320 Source/WebCore/accessibility/AccessibilityNodeObject.cpp \ 1321 Source/WebCore/accessibility/AccessibilityNodeObject.h \ 1320 1322 Source/WebCore/accessibility/AccessibilityObject.cpp \ 1321 1323 Source/WebCore/accessibility/AccessibilityObject.h \ -
trunk/Source/WebCore/Target.pri
r123150 r123182 53 53 accessibility/AccessibilityListBox.cpp \ 54 54 accessibility/AccessibilityListBoxOption.cpp \ 55 accessibility/AccessibilityNodeObject.cpp \ 55 56 accessibility/AccessibilityProgressIndicator.cpp \ 56 57 accessibility/AccessibilityRenderObject.cpp \ -
trunk/Source/WebCore/WebCore.gypi
r123181 r123182 1793 1793 'accessibility/AccessibilityMockObject.cpp', 1794 1794 'accessibility/AccessibilityMockObject.h', 1795 'accessibility/AccessibilityNodeObject.cpp', 1796 'accessibility/AccessibilityNodeObject.h', 1795 1797 'accessibility/AccessibilityObject.cpp', 1796 1798 'accessibility/AccessibilityProgressIndicator.cpp', -
trunk/Source/WebCore/accessibility/AXObjectCache.cpp
r118934 r123182 189 189 } 190 190 191 AccessibilityObject* AXObjectCache::get(Node* node) 192 { 193 if (!node) 194 return 0; 195 196 // Always prefer building the AccessibilityObject from the renderer if there is one. 197 if (node->renderer()) 198 return get(node->renderer()); 199 200 AXID axID = m_nodeObjectMapping.get(node); 201 ASSERT(!HashTraits<AXID>::isDeletedValue(axID)); 202 if (!axID) 203 return 0; 204 205 return m_objects.get(axID).get(); 206 } 207 191 208 // FIXME: This probably belongs on Node. 192 209 // FIXME: This should take a const char*, but one caller passes nullAtom. … … 253 270 } 254 271 272 static PassRefPtr<AccessibilityObject> createFromNode(Node* node) 273 { 274 return AccessibilityNodeObject::create(node); 275 } 276 255 277 AccessibilityObject* AXObjectCache::getOrCreate(Widget* widget) 256 278 { … … 274 296 return newObj.get(); 275 297 } 276 298 299 AccessibilityObject* AXObjectCache::getOrCreate(Node* node) 300 { 301 if (!node) 302 return 0; 303 304 if (AccessibilityObject* obj = get(node)) 305 return obj; 306 307 if (node->renderer()) 308 return getOrCreate(node->renderer()); 309 310 // It's only allowed to create an AccessibilityObject from a Node if it's in a canvas subtree. 311 if (!node->parentElement() || !node->parentElement()->isInCanvasSubtree()) 312 return 0; 313 314 RefPtr<AccessibilityObject> newObj = createFromNode(node); 315 316 getAXID(newObj.get()); 317 318 m_nodeObjectMapping.set(node, newObj->axObjectID()); 319 m_objects.set(newObj->axObjectID(), newObj); 320 attachWrapper(newObj.get()); 321 return newObj.get(); 322 } 323 277 324 AccessibilityObject* AXObjectCache::getOrCreate(RenderObject* renderer) 278 325 { … … 389 436 } 390 437 438 void AXObjectCache::remove(Node* node) 439 { 440 if (!node) 441 return; 442 443 removeNodeForUse(node); 444 445 // This is all safe even if we didn't have a mapping. 446 AXID axID = m_nodeObjectMapping.get(node); 447 remove(axID); 448 m_nodeObjectMapping.remove(node); 449 450 if (node->renderer()) { 451 remove(node->renderer()); 452 return; 453 } 454 } 455 391 456 void AXObjectCache::remove(Widget* view) 392 457 { -
trunk/Source/WebCore/accessibility/AXObjectCache.h
r119773 r123182 71 71 AccessibilityObject* getOrCreate(RenderObject*); 72 72 AccessibilityObject* getOrCreate(Widget*); 73 AccessibilityObject* getOrCreate(Node*); 73 74 74 75 // used for objects without backing elements … … 78 79 AccessibilityObject* get(RenderObject*); 79 80 AccessibilityObject* get(Widget*); 81 AccessibilityObject* get(Node*); 80 82 81 83 void remove(RenderObject*); 84 void remove(Node*); 82 85 void remove(Widget*); 83 86 void remove(AXID); … … 183 186 HashMap<RenderObject*, AXID> m_renderObjectMapping; 184 187 HashMap<Widget*, AXID> m_widgetObjectMapping; 188 HashMap<Node*, AXID> m_nodeObjectMapping; 185 189 HashSet<Node*> m_textMarkerNodes; 186 190 static bool gAccessibilityEnabled; … … 205 209 inline AccessibilityObject* AXObjectCache::focusedUIElementForPage(const Page*) { return 0; } 206 210 inline AccessibilityObject* AXObjectCache::get(RenderObject*) { return 0; } 211 inline AccessibilityObject* AXObjectCache::get(Node*) { return 0; } 207 212 inline AccessibilityObject* AXObjectCache::get(Widget*) { return 0; } 208 213 inline AccessibilityObject* AXObjectCache::getOrCreate(AccessibilityRole) { return 0; } 209 214 inline AccessibilityObject* AXObjectCache::getOrCreate(RenderObject*) { return 0; } 215 inline AccessibilityObject* AXObjectCache::getOrCreate(Node*) { return 0; } 210 216 inline AccessibilityObject* AXObjectCache::getOrCreate(Widget*) { return 0; } 211 217 inline AccessibilityObject* AXObjectCache::rootObject() { return 0; } … … 234 240 inline void AXObjectCache::remove(AXID) { } 235 241 inline void AXObjectCache::remove(RenderObject*) { } 242 inline void AXObjectCache::remove(Node*) { } 236 243 inline void AXObjectCache::remove(Widget*) { } 237 244 inline void AXObjectCache::selectedChildrenChanged(RenderObject*) { } -
trunk/Source/WebCore/accessibility/AccessibilityARIAGrid.cpp
r96966 r123182 44 44 : AccessibilityTable(renderer) 45 45 { 46 } 47 48 AccessibilityARIAGrid::~AccessibilityARIAGrid() 49 { 50 } 51 52 void AccessibilityARIAGrid::init() 53 { 54 AccessibilityTable::init(); 46 55 #if ACCESSIBILITY_TABLES 47 56 m_isAccessibilityTable = true; … … 51 60 } 52 61 53 AccessibilityARIAGrid::~AccessibilityARIAGrid()54 {55 }56 57 62 PassRefPtr<AccessibilityARIAGrid> AccessibilityARIAGrid::create(RenderObject* renderer) 58 63 { 59 return adoptRef(new AccessibilityARIAGrid(renderer)); 64 AccessibilityARIAGrid* obj = new AccessibilityARIAGrid(renderer); 65 obj->init(); 66 return adoptRef(obj); 60 67 } 61 68 -
trunk/Source/WebCore/accessibility/AccessibilityARIAGrid.h
r110823 r123182 45 45 static PassRefPtr<AccessibilityARIAGrid> create(RenderObject*); 46 46 virtual ~AccessibilityARIAGrid(); 47 48 virtual void init(); 47 49 48 50 virtual bool isAriaTable() const { return true; } -
trunk/Source/WebCore/accessibility/AccessibilityARIAGridCell.cpp
r95901 r123182 49 49 PassRefPtr<AccessibilityARIAGridCell> AccessibilityARIAGridCell::create(RenderObject* renderer) 50 50 { 51 return adoptRef(new AccessibilityARIAGridCell(renderer)); 51 AccessibilityARIAGridCell* obj = new AccessibilityARIAGridCell(renderer); 52 obj->init(); 53 return adoptRef(obj); 52 54 } 53 55 -
trunk/Source/WebCore/accessibility/AccessibilityARIAGridRow.cpp
r95901 r123182 49 49 PassRefPtr<AccessibilityARIAGridRow> AccessibilityARIAGridRow::create(RenderObject* renderer) 50 50 { 51 return adoptRef(new AccessibilityARIAGridRow(renderer)); 51 AccessibilityARIAGridRow* obj = new AccessibilityARIAGridRow(renderer); 52 obj->init(); 53 return adoptRef(obj); 52 54 } 53 55 -
trunk/Source/WebCore/accessibility/AccessibilityAllInOne.cpp
r104350 r123182 35 35 #include "AccessibilityListBoxOption.cpp" 36 36 #include "AccessibilityMediaControls.cpp" 37 #include "AccessibilityNodeObject.cpp" 37 38 #include "AccessibilityObject.cpp" 38 39 #include "AccessibilityRenderObject.cpp" -
trunk/Source/WebCore/accessibility/AccessibilityList.cpp
r95901 r123182 51 51 PassRefPtr<AccessibilityList> AccessibilityList::create(RenderObject* renderer) 52 52 { 53 return adoptRef(new AccessibilityList(renderer)); 53 AccessibilityList* obj = new AccessibilityList(renderer); 54 obj->init(); 55 return adoptRef(obj); 54 56 } 55 57 -
trunk/Source/WebCore/accessibility/AccessibilityListBox.cpp
r111699 r123182 55 55 PassRefPtr<AccessibilityListBox> AccessibilityListBox::create(RenderObject* renderer) 56 56 { 57 return adoptRef(new AccessibilityListBox(renderer)); 57 AccessibilityListBox* obj = new AccessibilityListBox(renderer); 58 obj->init(); 59 return adoptRef(obj); 58 60 } 59 61 -
trunk/Source/WebCore/accessibility/AccessibilityMediaControls.cpp
r111041 r123182 68 68 return AccessibilityMediaControlsContainer::create(renderer); 69 69 70 default: 71 return adoptRef(new AccessibilityMediaControl(renderer)); 70 default: { 71 AccessibilityMediaControl* obj = new AccessibilityMediaControl(renderer); 72 obj->init(); 73 return adoptRef(obj); 74 } 72 75 } 73 76 } … … 208 211 PassRefPtr<AccessibilityObject> AccessibilityMediaControlsContainer::create(RenderObject* renderer) 209 212 { 210 return adoptRef(new AccessibilityMediaControlsContainer(renderer)); 213 AccessibilityMediaControlsContainer* obj = new AccessibilityMediaControlsContainer(renderer); 214 obj->init(); 215 return adoptRef(obj); 211 216 } 212 217 … … 252 257 PassRefPtr<AccessibilityObject> AccessibilityMediaTimeline::create(RenderObject* renderer) 253 258 { 254 return adoptRef(new AccessibilityMediaTimeline(renderer)); 259 AccessibilityMediaTimeline* obj = new AccessibilityMediaTimeline(renderer); 260 obj->init(); 261 return adoptRef(obj); 255 262 } 256 263 … … 282 289 PassRefPtr<AccessibilityObject> AccessibilityMediaTimeDisplay::create(RenderObject* renderer) 283 290 { 284 return adoptRef(new AccessibilityMediaTimeDisplay(renderer)); 291 AccessibilityMediaTimeDisplay* obj = new AccessibilityMediaTimeDisplay(renderer); 292 obj->init(); 293 return adoptRef(obj); 285 294 } 286 295 -
trunk/Source/WebCore/accessibility/AccessibilityMenuList.cpp
r117803 r123182 36 36 : AccessibilityRenderObject(renderer) 37 37 { 38 } 39 40 PassRefPtr<AccessibilityMenuList> AccessibilityMenuList::create(RenderMenuList* renderer) 41 { 42 AccessibilityMenuList* obj = new AccessibilityMenuList(renderer); 43 obj->init(); 44 return adoptRef(obj); 38 45 } 39 46 -
trunk/Source/WebCore/accessibility/AccessibilityMenuList.h
r117803 r123182 38 38 class AccessibilityMenuList : public AccessibilityRenderObject { 39 39 public: 40 static PassRefPtr<AccessibilityMenuList> create(RenderMenuList* renderer) { return adoptRef(new AccessibilityMenuList(renderer)); }40 static PassRefPtr<AccessibilityMenuList> create(RenderMenuList* renderer); 41 41 42 42 virtual bool isCollapsed() const; -
trunk/Source/WebCore/accessibility/AccessibilityObject.h
r119012 r123182 318 318 typedef Vector<RefPtr<AccessibilityObject> > AccessibilityChildrenVector; 319 319 320 virtual bool isAccessibilityNodeObject() const { return false; } 320 321 virtual bool isAccessibilityRenderObject() const { return false; } 321 322 virtual bool isAccessibilityScrollbar() const { return false; } -
trunk/Source/WebCore/accessibility/AccessibilityProgressIndicator.cpp
r95901 r123182 42 42 PassRefPtr<AccessibilityProgressIndicator> AccessibilityProgressIndicator::create(RenderProgress* renderer) 43 43 { 44 return adoptRef(new AccessibilityProgressIndicator(renderer)); 44 AccessibilityProgressIndicator* obj = new AccessibilityProgressIndicator(renderer); 45 obj->init(); 46 return adoptRef(obj); 45 47 } 46 48 -
trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp
r123157 r123182 94 94 95 95 AccessibilityRenderObject::AccessibilityRenderObject(RenderObject* renderer) 96 : Accessibility Object()96 : AccessibilityNodeObject(renderer->node()) 97 97 , m_renderer(renderer) 98 , m_ariaRole(UnknownRole) 99 , m_childrenDirty(false) 100 , m_roleForMSAA(UnknownRole) 101 { 102 m_role = determineAccessibilityRole(); 103 98 { 104 99 #ifndef NDEBUG 105 100 m_renderer->setHasAXObject(true); … … 112 107 } 113 108 109 void AccessibilityRenderObject::init() 110 { 111 AccessibilityNodeObject::init(); 112 } 113 114 114 PassRefPtr<AccessibilityRenderObject> AccessibilityRenderObject::create(RenderObject* renderer) 115 115 { 116 return adoptRef(new AccessibilityRenderObject(renderer)); 116 AccessibilityRenderObject* obj = new AccessibilityRenderObject(renderer); 117 obj->init(); 118 return adoptRef(obj); 117 119 } 118 120 119 121 void AccessibilityRenderObject::detach() 120 122 { 121 clearChildren(); 122 AccessibilityObject::detach(); 123 AccessibilityNodeObject::detach(); 123 124 124 125 #ifndef NDEBUG … … 126 127 m_renderer->setHasAXObject(false); 127 128 #endif 128 m_renderer = 0; 129 m_renderer = 0; 129 130 } 130 131 … … 134 135 return 0; 135 136 return toRenderBoxModelObject(m_renderer); 137 } 138 139 void AccessibilityRenderObject::setRenderer(RenderObject* renderer) 140 { 141 m_renderer = renderer; 142 setNode(renderer->node()); 136 143 } 137 144 … … 3085 3092 } 3086 3093 3087 AccessibilityRole AccessibilityRenderObject::remapAriaRoleDueToParent(AccessibilityRole role) const3088 {3089 // Some objects change their role based on their parent.3090 // However, asking for the unignoredParent calls accessibilityIsIgnored(), which can trigger a loop.3091 // While inside the call stack of creating an element, we need to avoid accessibilityIsIgnored().3092 // https://bugs.webkit.org/show_bug.cgi?id=651743093 3094 if (role != ListBoxOptionRole && role != MenuItemRole)3095 return role;3096 3097 for (AccessibilityObject* parent = parentObject(); parent && !parent->accessibilityIsIgnored(); parent = parent->parentObject()) {3098 AccessibilityRole parentAriaRole = parent->ariaRoleAttribute();3099 3100 // Selects and listboxes both have options as child roles, but they map to different roles within WebCore.3101 if (role == ListBoxOptionRole && parentAriaRole == MenuRole)3102 return MenuItemRole;3103 // An aria "menuitem" may map to MenuButton or MenuItem depending on its parent.3104 if (role == MenuItemRole && parentAriaRole == GroupRole)3105 return MenuButtonRole;3106 3107 // If the parent had a different role, then we don't need to continue searching up the chain.3108 if (parentAriaRole)3109 break;3110 }3111 3112 return role;3113 }3114 3115 AccessibilityRole AccessibilityRenderObject::determineAriaRoleAttribute() const3116 {3117 const AtomicString& ariaRole = getAttribute(roleAttr);3118 if (ariaRole.isNull() || ariaRole.isEmpty())3119 return UnknownRole;3120 3121 AccessibilityRole role = ariaRoleToWebCoreRole(ariaRole);3122 3123 // ARIA states if an item can get focus, it should not be presentational.3124 if (role == PresentationalRole && canSetFocusAttribute())3125 return UnknownRole;3126 3127 if (role == ButtonRole && ariaHasPopup())3128 role = PopUpButtonRole;3129 3130 if (role == TextAreaRole && !ariaIsMultiline())3131 role = TextFieldRole;3132 3133 role = remapAriaRoleDueToParent(role);3134 3135 if (role)3136 return role;3137 3138 return UnknownRole;3139 }3140 3141 AccessibilityRole AccessibilityRenderObject::ariaRoleAttribute() const3142 {3143 return m_ariaRole;3144 }3145 3146 void AccessibilityRenderObject::updateAccessibilityRole()3147 {3148 bool ignoredStatus = accessibilityIsIgnored();3149 m_role = determineAccessibilityRole();3150 3151 // The AX hierarchy only needs to be updated if the ignored status of an element has changed.3152 if (ignoredStatus != accessibilityIsIgnored())3153 childrenChanged();3154 }3155 3156 3094 bool AccessibilityRenderObject::isDescendantOfElementType(const QualifiedName& tagName) const 3157 3095 { … … 3390 3328 } 3391 3329 3392 bool AccessibilityRenderObject::canSetFocusAttribute() const3393 {3394 Node* node = this->node();3395 3396 if (isWebArea())3397 return true;3398 3399 // NOTE: It would be more accurate to ask the document whether setFocusedNode() would3400 // do anything. For example, setFocusedNode() will do nothing if the current focused3401 // node will not relinquish the focus.3402 if (!node)3403 return false;3404 3405 if (node->isElementNode() && !static_cast<Element*>(node)->isEnabledFormControl())3406 return false;3407 3408 return node->supportsFocus();3409 }3410 3411 3330 bool AccessibilityRenderObject::canSetExpandedAttribute() const 3412 3331 { … … 3455 3374 } 3456 3375 3457 void AccessibilityRenderObject::childrenChanged() 3458 { 3459 // This method is meant as a quick way of marking a portion of the accessibility tree dirty. 3376 bool AccessibilityRenderObject::canHaveChildren() const 3377 { 3460 3378 if (!m_renderer) 3461 return; 3462 3463 axObjectCache()->postNotification(this, document(), AXObjectCache::AXChildrenChanged, true); 3464 3465 // Go up the accessibility parent chain, but only if the element already exists. This method is 3466 // called during render layouts, minimal work should be done. 3467 // If AX elements are created now, they could interrogate the render tree while it's in a funky state. 3468 // At the same time, process ARIA live region changes. 3469 for (AccessibilityObject* parent = this; parent; parent = parent->parentObjectIfExists()) { 3470 parent->setNeedsToUpdateChildren(); 3471 3472 // These notifications always need to be sent because screenreaders are reliant on them to perform. 3473 // In other words, they need to be sent even when the screen reader has not accessed this live region since the last update. 3474 3475 // If this element supports ARIA live regions, then notify the AT of changes. 3476 if (parent->supportsARIALiveRegion()) 3477 axObjectCache()->postNotification(parent, parent->document(), AXObjectCache::AXLiveRegionChanged, true); 3478 3479 // If this element is an ARIA text control, notify the AT of changes. 3480 if (parent->isARIATextControl() && !parent->isNativeTextControl() && !parent->node()->rendererIsEditable()) 3481 axObjectCache()->postNotification(parent, parent->document(), AXObjectCache::AXValueChanged, true); 3482 } 3483 } 3484 3485 bool AccessibilityRenderObject::canHaveChildren() const 3486 { 3487 if (!m_renderer) 3488 return false; 3489 3379 return false; 3380 3381 // Canvas is a special case; its role is ImageRole but it is allowed to have children. 3382 if (node() && node()->hasTagName(canvasTag)) 3383 return true; 3384 3490 3385 // Elements that should not have children 3491 3386 switch (roleValue()) { … … 3560 3455 } 3561 3456 3457 void AccessibilityRenderObject::addCanvasChildren() 3458 { 3459 // If it's a canvas, it won't have rendered children, but it might have accessible fallback content. 3460 if (node() && node()->hasTagName(canvasTag)) { 3461 AccessibilityNodeObject::addChildren(); 3462 return; 3463 } 3464 } 3465 3562 3466 void AccessibilityRenderObject::addAttachmentChildren() 3563 3467 { … … 3596 3500 // childrenChanged should have been called, leaving the object with no children. 3597 3501 ASSERT(!m_haveChildren); 3598 3599 // nothing to add if there is no RenderObject 3600 if (!m_renderer) 3601 return; 3602 3502 3603 3503 m_haveChildren = true; 3604 3504 … … 3608 3508 // add all unignored acc children 3609 3509 for (RefPtr<AccessibilityObject> obj = firstChild(); obj; obj = obj->nextSibling()) { 3610 3611 3510 // If the parent is asking for this child's children, then either it's the first time (and clearing is a no-op), 3612 3511 // or its visibility has changed. In the latter case, this child may have a stale child cached. … … 3628 3527 addImageMapChildren(); 3629 3528 addTextFieldChildren(); 3529 addCanvasChildren(); 3630 3530 3631 3531 #if PLATFORM(MAC) -
trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h
r123157 r123182 30 30 #define AccessibilityRenderObject_h 31 31 32 #include "Accessibility Object.h"32 #include "AccessibilityNodeObject.h" 33 33 #include "LayoutTypes.h" 34 34 #include <wtf/Forward.h> … … 56 56 class Widget; 57 57 58 class AccessibilityRenderObject : public Accessibility Object {58 class AccessibilityRenderObject : public AccessibilityNodeObject { 59 59 protected: 60 60 AccessibilityRenderObject(RenderObject*); … … 64 64 65 65 virtual bool isAccessibilityRenderObject() const { return true; } 66 67 virtual void init(); 66 68 67 69 virtual bool isAnchor() const; … … 112 114 virtual bool hasUnderline() const; 113 115 114 virtual bool canSetFocusAttribute() const;115 116 virtual bool canSetTextRangeAttributes() const; 116 117 virtual bool canSetValueAttribute() const; … … 150 151 virtual void ariaOwnsElements(AccessibilityChildrenVector&) const; 151 152 virtual bool supportsARIAOwns() const; 152 virtual AccessibilityRole ariaRoleAttribute() const;153 153 virtual bool isPresentationalChildOfAriaRole() const; 154 154 virtual bool ariaRoleHasPresentationalChildren() const; 155 void updateAccessibilityRole();156 155 157 156 // Should be called on the root accessibility object to kick off a hit test. … … 169 168 virtual IntPoint clickPoint(); 170 169 171 void setRenderer(RenderObject* renderer) { m_renderer = renderer; }170 void setRenderer(RenderObject*); 172 171 virtual RenderObject* renderer() const { return m_renderer; } 173 172 RenderBoxModelObject* renderBoxModelObject() const; 174 173 virtual Node* node() const; 175 174 175 virtual Document* document() const; 176 176 177 RenderView* topRenderer() const; 177 178 RenderTextControl* textControl() const; 178 Document* document() const;179 179 FrameView* topDocumentFrameView() const; 180 180 Document* topDocument() const; … … 215 215 216 216 virtual void detach(); 217 virtual void childrenChanged();218 217 virtual void contentChanged(); 219 218 virtual void addChildren(); … … 261 260 protected: 262 261 RenderObject* m_renderer; 263 AccessibilityRole m_ariaRole;264 bool m_childrenDirty;265 262 266 263 void setRenderObject(RenderObject* renderer) { m_renderer = renderer; } … … 271 268 272 269 virtual bool isDetached() const { return !m_renderer; } 270 271 virtual AccessibilityRole determineAccessibilityRole(); 273 272 274 273 private: … … 287 286 Element* menuElementForMenuButton() const; 288 287 Element* menuItemElementForMenu() const; 289 AccessibilityRole determineAccessibilityRole();290 AccessibilityRole determineAriaRoleAttribute() const;291 AccessibilityRole remapAriaRoleDueToParent(AccessibilityRole) const;292 288 293 289 bool isTabItemSelected() const; … … 306 302 void addTextFieldChildren(); 307 303 void addImageMapChildren(); 304 void addCanvasChildren(); 308 305 void addAttachmentChildren(); 309 306 #if PLATFORM(MAC) … … 329 326 330 327 bool inheritsPresentationalRole() const; 331 332 mutable AccessibilityRole m_roleForMSAA;333 328 }; 334 329 -
trunk/Source/WebCore/accessibility/AccessibilitySlider.cpp
r114031 r123182 48 48 PassRefPtr<AccessibilitySlider> AccessibilitySlider::create(RenderObject* renderer) 49 49 { 50 return adoptRef(new AccessibilitySlider(renderer)); 50 AccessibilitySlider* obj = new AccessibilitySlider(renderer); 51 obj->init(); 52 return adoptRef(obj); 51 53 } 52 54 -
trunk/Source/WebCore/accessibility/AccessibilityTable.cpp
r118478 r123182 52 52 m_headerContainer(0) 53 53 { 54 } 55 56 AccessibilityTable::~AccessibilityTable() 57 { 58 } 59 60 void AccessibilityTable::init() 61 { 62 AccessibilityRenderObject::init(); 54 63 #if ACCESSIBILITY_TABLES 55 64 m_isAccessibilityTable = isTableExposableThroughAccessibility(); … … 59 68 } 60 69 61 AccessibilityTable::~AccessibilityTable()62 {63 }64 65 70 PassRefPtr<AccessibilityTable> AccessibilityTable::create(RenderObject* renderer) 66 71 { 67 return adoptRef(new AccessibilityTable(renderer)); 72 AccessibilityTable* obj = new AccessibilityTable(renderer); 73 obj->init(); 74 return adoptRef(obj); 68 75 } 69 76 -
trunk/Source/WebCore/accessibility/AccessibilityTable.h
r122670 r123182 51 51 virtual ~AccessibilityTable(); 52 52 53 virtual void init(); 54 53 55 virtual bool isAccessibilityTable() const; 54 56 virtual bool isDataTable() const; -
trunk/Source/WebCore/accessibility/AccessibilityTableCell.cpp
r115705 r123182 52 52 PassRefPtr<AccessibilityTableCell> AccessibilityTableCell::create(RenderObject* renderer) 53 53 { 54 return adoptRef(new AccessibilityTableCell(renderer)); 54 AccessibilityTableCell* obj = new AccessibilityTableCell(renderer); 55 obj->init(); 56 return adoptRef(obj); 55 57 } 56 58 -
trunk/Source/WebCore/accessibility/AccessibilityTableRow.cpp
r110823 r123182 55 55 PassRefPtr<AccessibilityTableRow> AccessibilityTableRow::create(RenderObject* renderer) 56 56 { 57 return adoptRef(new AccessibilityTableRow(renderer)); 57 AccessibilityTableRow* obj = new AccessibilityTableRow(renderer); 58 obj->init(); 59 return adoptRef(obj); 58 60 } 59 61
Note: See TracChangeset
for help on using the changeset viewer.