Changeset 123182 in webkit


Ignore:
Timestamp:
Jul 19, 2012 11:06:04 PM (12 years ago)
Author:
dmazzoni@google.com
Message:

AX: Need AccessibilityObjects for nodes without renderers in canvas subtree
https://bugs.webkit.org/show_bug.cgi?id=87899

Reviewed by Chris Fleizach.

Source/WebCore:

Refactors AccessibilityRenderObject so that it inherits from a new class,
AccessibilityNodeObject, that can be constructed from a Node without a
renderer. Modifies AXObjectCache so that it automatically creates an
AccessibilityNodeObject for elements in a canvas subtree but not otherwise.
A new layout test verifies that this correctly exposes an accessibility
tree with appropriate roles for elements in a canvas subtree.

This patch does not try to complete the implementation of
AccessibilityNodeObject. Most AX methods are still unimplemented and need
to be migrated from AccessibilityRenderObject to AccessibilityNodeObject
in a future patch.

This patch also doesn't change anything outside of WebCore/accessibility, so
the rest of WebCore only calls AXObjectCache when there are changes to a
RenderObject, not to a Node. Accessible notifications on nodes without
renderers need to be implemented in a future patch.

Test: accessibility/canvas-accessibilitynodeobject.html

  • CMakeLists.txt:
  • GNUmakefile.list.am:
  • Target.pri:
  • WebCore.gypi:
  • accessibility/AXObjectCache.cpp:

(WebCore::AXObjectCache::get):
(WebCore):
(WebCore::createFromNode):
(WebCore::AXObjectCache::getOrCreate):
(WebCore::AXObjectCache::remove):

  • accessibility/AXObjectCache.h:

(AXObjectCache):
(WebCore::AXObjectCache::get):
(WebCore::AXObjectCache::getOrCreate):
(WebCore::AXObjectCache::remove):

  • accessibility/AccessibilityARIAGrid.cpp:

(WebCore::AccessibilityARIAGrid::AccessibilityARIAGrid):
(WebCore):
(WebCore::AccessibilityARIAGrid::~AccessibilityARIAGrid):
(WebCore::AccessibilityARIAGrid::init):
(WebCore::AccessibilityARIAGrid::create):

  • accessibility/AccessibilityARIAGrid.h:

(AccessibilityARIAGrid):

  • accessibility/AccessibilityARIAGridCell.cpp:

(WebCore::AccessibilityARIAGridCell::create):

  • accessibility/AccessibilityARIAGridRow.cpp:

(WebCore::AccessibilityARIAGridRow::create):

  • accessibility/AccessibilityAllInOne.cpp:
  • accessibility/AccessibilityList.cpp:

(WebCore::AccessibilityList::create):

  • accessibility/AccessibilityListBox.cpp:

(WebCore::AccessibilityListBox::create):

  • accessibility/AccessibilityMediaControls.cpp:

(WebCore::AccessibilityMediaControl::create):
(WebCore::AccessibilityMediaControlsContainer::create):
(WebCore::AccessibilityMediaTimeline::create):
(WebCore::AccessibilityMediaTimeDisplay::create):

  • accessibility/AccessibilityMenuList.cpp:

(WebCore::AccessibilityMenuList::create):
(WebCore):

  • accessibility/AccessibilityMenuList.h:

(AccessibilityMenuList):

  • accessibility/AccessibilityNodeObject.cpp: Added.

(WebCore):
(WebCore::AccessibilityNodeObject::AccessibilityNodeObject):
(WebCore::AccessibilityNodeObject::~AccessibilityNodeObject):
(WebCore::AccessibilityNodeObject::init):
(WebCore::AccessibilityNodeObject::create):
(WebCore::AccessibilityNodeObject::detach):
(WebCore::AccessibilityNodeObject::childrenChanged):
(WebCore::AccessibilityNodeObject::updateAccessibilityRole):
(WebCore::AccessibilityNodeObject::firstChild):
(WebCore::AccessibilityNodeObject::lastChild):
(WebCore::AccessibilityNodeObject::previousSibling):
(WebCore::AccessibilityNodeObject::nextSibling):
(WebCore::AccessibilityNodeObject::parentObjectIfExists):
(WebCore::AccessibilityNodeObject::parentObject):
(WebCore::AccessibilityNodeObject::elementRect):
(WebCore::AccessibilityNodeObject::setNode):
(WebCore::AccessibilityNodeObject::document):
(WebCore::AccessibilityNodeObject::determineAccessibilityRole):
(WebCore::AccessibilityNodeObject::addChildren):
(WebCore::AccessibilityNodeObject::accessibilityIsIgnored):
(WebCore::AccessibilityNodeObject::canSetFocusAttribute):
(WebCore::AccessibilityNodeObject::determineAriaRoleAttribute):
(WebCore::AccessibilityNodeObject::ariaRoleAttribute):
(WebCore::AccessibilityNodeObject::remapAriaRoleDueToParent):

  • accessibility/AccessibilityNodeObject.h: Added.

(WebCore):
(AccessibilityNodeObject):
(WebCore::AccessibilityNodeObject::isAccessibilityNodeObject):
(WebCore::AccessibilityNodeObject::node):
(WebCore::AccessibilityNodeObject::isDetached):
(WebCore::toAccessibilityNodeObject):

  • accessibility/AccessibilityObject.h:

(WebCore::AccessibilityObject::isAccessibilityNodeObject):

  • accessibility/AccessibilityProgressIndicator.cpp:

(WebCore::AccessibilityProgressIndicator::create):

  • accessibility/AccessibilityRenderObject.cpp:

(WebCore::AccessibilityRenderObject::AccessibilityRenderObject):
(WebCore::AccessibilityRenderObject::init):
(WebCore):
(WebCore::AccessibilityRenderObject::create):
(WebCore::AccessibilityRenderObject::detach):
(WebCore::AccessibilityRenderObject::setRenderer):
(WebCore::AccessibilityRenderObject::canHaveChildren):
(WebCore::AccessibilityRenderObject::addCanvasChildren):
(WebCore::AccessibilityRenderObject::addChildren):

  • accessibility/AccessibilityRenderObject.h:

(AccessibilityRenderObject):

  • accessibility/AccessibilitySlider.cpp:

(WebCore::AccessibilitySlider::create):

  • accessibility/AccessibilityTable.cpp:

(WebCore::AccessibilityTable::AccessibilityTable):
(WebCore):
(WebCore::AccessibilityTable::~AccessibilityTable):
(WebCore::AccessibilityTable::init):
(WebCore::AccessibilityTable::create):

  • accessibility/AccessibilityTable.h:

(AccessibilityTable):

  • accessibility/AccessibilityTableCell.cpp:

(WebCore::AccessibilityTableCell::create):

  • accessibility/AccessibilityTableRow.cpp:

(WebCore::AccessibilityTableRow::create):

LayoutTests:

This new test adds a bunch of elements to a normal container and the same elements to
a canvas subtree, then it iterates over all of the accessible objects within each
container and makes sure they have identical roles. Because we know the nodes in the
canvas subtree don't have renderers, this successfully tests that AccessibilityNodeObjects
are getting created for these nodes.

  • accessibility/canvas-accessibilitynodeobject-expected.txt: Added.
  • accessibility/canvas-accessibilitynodeobject.html: Added.
Location:
trunk
Files:
4 added
27 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r123178 r123182  
     12012-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
    1172012-07-19  Kent Tamura  <tkent@chromium.org>
    218
  • trunk/Source/WebCore/CMakeLists.txt

    r123099 r123182  
    936936    accessibility/AccessibilityMenuListPopup.cpp
    937937    accessibility/AccessibilityMockObject.cpp
     938    accessibility/AccessibilityNodeObject.cpp
    938939    accessibility/AccessibilityObject.cpp
    939940    accessibility/AccessibilityProgressIndicator.cpp
  • trunk/Source/WebCore/ChangeLog

    r123181 r123182  
     12012-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
    11322012-07-19  Dan Bernstein  <mitz@apple.com>
    2133
  • trunk/Source/WebCore/GNUmakefile.list.am

    r122870 r123182  
    13181318        Source/WebCore/accessibility/AccessibilityMockObject.cpp \
    13191319        Source/WebCore/accessibility/AccessibilityMockObject.h \
     1320        Source/WebCore/accessibility/AccessibilityNodeObject.cpp \
     1321        Source/WebCore/accessibility/AccessibilityNodeObject.h \
    13201322        Source/WebCore/accessibility/AccessibilityObject.cpp \
    13211323        Source/WebCore/accessibility/AccessibilityObject.h \
  • trunk/Source/WebCore/Target.pri

    r123150 r123182  
    5353    accessibility/AccessibilityListBox.cpp \
    5454    accessibility/AccessibilityListBoxOption.cpp \
     55    accessibility/AccessibilityNodeObject.cpp \
    5556    accessibility/AccessibilityProgressIndicator.cpp \
    5657    accessibility/AccessibilityRenderObject.cpp \
  • trunk/Source/WebCore/WebCore.gypi

    r123181 r123182  
    17931793            'accessibility/AccessibilityMockObject.cpp',
    17941794            'accessibility/AccessibilityMockObject.h',
     1795            'accessibility/AccessibilityNodeObject.cpp',
     1796            'accessibility/AccessibilityNodeObject.h',
    17951797            'accessibility/AccessibilityObject.cpp',
    17961798            'accessibility/AccessibilityProgressIndicator.cpp',
  • trunk/Source/WebCore/accessibility/AXObjectCache.cpp

    r118934 r123182  
    189189}
    190190
     191AccessibilityObject* 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
    191208// FIXME: This probably belongs on Node.
    192209// FIXME: This should take a const char*, but one caller passes nullAtom.
     
    253270}
    254271
     272static PassRefPtr<AccessibilityObject> createFromNode(Node* node)
     273{
     274    return AccessibilityNodeObject::create(node);
     275}
     276
    255277AccessibilityObject* AXObjectCache::getOrCreate(Widget* widget)
    256278{
     
    274296    return newObj.get();
    275297}
    276    
     298
     299AccessibilityObject* 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
    277324AccessibilityObject* AXObjectCache::getOrCreate(RenderObject* renderer)
    278325{
     
    389436}
    390437
     438void 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
    391456void AXObjectCache::remove(Widget* view)
    392457{
  • trunk/Source/WebCore/accessibility/AXObjectCache.h

    r119773 r123182  
    7171    AccessibilityObject* getOrCreate(RenderObject*);
    7272    AccessibilityObject* getOrCreate(Widget*);
     73    AccessibilityObject* getOrCreate(Node*);
    7374
    7475    // used for objects without backing elements
     
    7879    AccessibilityObject* get(RenderObject*);
    7980    AccessibilityObject* get(Widget*);
     81    AccessibilityObject* get(Node*);
    8082   
    8183    void remove(RenderObject*);
     84    void remove(Node*);
    8285    void remove(Widget*);
    8386    void remove(AXID);
     
    183186    HashMap<RenderObject*, AXID> m_renderObjectMapping;
    184187    HashMap<Widget*, AXID> m_widgetObjectMapping;
     188    HashMap<Node*, AXID> m_nodeObjectMapping;
    185189    HashSet<Node*> m_textMarkerNodes;
    186190    static bool gAccessibilityEnabled;
     
    205209inline AccessibilityObject* AXObjectCache::focusedUIElementForPage(const Page*) { return 0; }
    206210inline AccessibilityObject* AXObjectCache::get(RenderObject*) { return 0; }
     211inline AccessibilityObject* AXObjectCache::get(Node*) { return 0; }
    207212inline AccessibilityObject* AXObjectCache::get(Widget*) { return 0; }
    208213inline AccessibilityObject* AXObjectCache::getOrCreate(AccessibilityRole) { return 0; }
    209214inline AccessibilityObject* AXObjectCache::getOrCreate(RenderObject*) { return 0; }
     215inline AccessibilityObject* AXObjectCache::getOrCreate(Node*) { return 0; }
    210216inline AccessibilityObject* AXObjectCache::getOrCreate(Widget*) { return 0; }
    211217inline AccessibilityObject* AXObjectCache::rootObject() { return 0; }
     
    234240inline void AXObjectCache::remove(AXID) { }
    235241inline void AXObjectCache::remove(RenderObject*) { }
     242inline void AXObjectCache::remove(Node*) { }
    236243inline void AXObjectCache::remove(Widget*) { }
    237244inline void AXObjectCache::selectedChildrenChanged(RenderObject*) { }
  • trunk/Source/WebCore/accessibility/AccessibilityARIAGrid.cpp

    r96966 r123182  
    4444    : AccessibilityTable(renderer)
    4545{
     46}
     47
     48AccessibilityARIAGrid::~AccessibilityARIAGrid()
     49{
     50}
     51
     52void AccessibilityARIAGrid::init()
     53{
     54    AccessibilityTable::init();
    4655#if ACCESSIBILITY_TABLES
    4756    m_isAccessibilityTable = true;
     
    5160}
    5261
    53 AccessibilityARIAGrid::~AccessibilityARIAGrid()
    54 {
    55 }
    56 
    5762PassRefPtr<AccessibilityARIAGrid> AccessibilityARIAGrid::create(RenderObject* renderer)
    5863{
    59     return adoptRef(new AccessibilityARIAGrid(renderer));
     64    AccessibilityARIAGrid* obj = new AccessibilityARIAGrid(renderer);
     65    obj->init();
     66    return adoptRef(obj);
    6067}
    6168
  • trunk/Source/WebCore/accessibility/AccessibilityARIAGrid.h

    r110823 r123182  
    4545    static PassRefPtr<AccessibilityARIAGrid> create(RenderObject*);
    4646    virtual ~AccessibilityARIAGrid();
     47
     48    virtual void init();
    4749   
    4850    virtual bool isAriaTable() const { return true; }   
  • trunk/Source/WebCore/accessibility/AccessibilityARIAGridCell.cpp

    r95901 r123182  
    4949PassRefPtr<AccessibilityARIAGridCell> AccessibilityARIAGridCell::create(RenderObject* renderer)
    5050{
    51     return adoptRef(new AccessibilityARIAGridCell(renderer));
     51    AccessibilityARIAGridCell* obj = new AccessibilityARIAGridCell(renderer);
     52    obj->init();
     53    return adoptRef(obj);
    5254}
    5355
  • trunk/Source/WebCore/accessibility/AccessibilityARIAGridRow.cpp

    r95901 r123182  
    4949PassRefPtr<AccessibilityARIAGridRow> AccessibilityARIAGridRow::create(RenderObject* renderer)
    5050{
    51     return adoptRef(new AccessibilityARIAGridRow(renderer));
     51    AccessibilityARIAGridRow* obj = new AccessibilityARIAGridRow(renderer);
     52    obj->init();
     53    return adoptRef(obj);
    5254}
    5355
  • trunk/Source/WebCore/accessibility/AccessibilityAllInOne.cpp

    r104350 r123182  
    3535#include "AccessibilityListBoxOption.cpp"
    3636#include "AccessibilityMediaControls.cpp"
     37#include "AccessibilityNodeObject.cpp"
    3738#include "AccessibilityObject.cpp"
    3839#include "AccessibilityRenderObject.cpp"
  • trunk/Source/WebCore/accessibility/AccessibilityList.cpp

    r95901 r123182  
    5151PassRefPtr<AccessibilityList> AccessibilityList::create(RenderObject* renderer)
    5252{
    53     return adoptRef(new AccessibilityList(renderer));
     53    AccessibilityList* obj = new AccessibilityList(renderer);
     54    obj->init();
     55    return adoptRef(obj);
    5456}
    5557
  • trunk/Source/WebCore/accessibility/AccessibilityListBox.cpp

    r111699 r123182  
    5555PassRefPtr<AccessibilityListBox> AccessibilityListBox::create(RenderObject* renderer)
    5656{
    57     return adoptRef(new AccessibilityListBox(renderer));
     57    AccessibilityListBox* obj = new AccessibilityListBox(renderer);
     58    obj->init();
     59    return adoptRef(obj);
    5860}
    5961   
  • trunk/Source/WebCore/accessibility/AccessibilityMediaControls.cpp

    r111041 r123182  
    6868        return AccessibilityMediaControlsContainer::create(renderer);
    6969
    70     default:
    71         return adoptRef(new AccessibilityMediaControl(renderer));
     70    default: {
     71        AccessibilityMediaControl* obj = new AccessibilityMediaControl(renderer);
     72        obj->init();
     73        return adoptRef(obj);
     74        }
    7275    }
    7376}
     
    208211PassRefPtr<AccessibilityObject> AccessibilityMediaControlsContainer::create(RenderObject* renderer)
    209212{
    210     return adoptRef(new AccessibilityMediaControlsContainer(renderer));
     213    AccessibilityMediaControlsContainer* obj = new AccessibilityMediaControlsContainer(renderer);
     214    obj->init();
     215    return adoptRef(obj);
    211216}
    212217
     
    252257PassRefPtr<AccessibilityObject> AccessibilityMediaTimeline::create(RenderObject* renderer)
    253258{
    254     return adoptRef(new AccessibilityMediaTimeline(renderer));
     259    AccessibilityMediaTimeline* obj = new AccessibilityMediaTimeline(renderer);
     260    obj->init();
     261    return adoptRef(obj);
    255262}
    256263
     
    282289PassRefPtr<AccessibilityObject> AccessibilityMediaTimeDisplay::create(RenderObject* renderer)
    283290{
    284     return adoptRef(new AccessibilityMediaTimeDisplay(renderer));
     291    AccessibilityMediaTimeDisplay* obj = new AccessibilityMediaTimeDisplay(renderer);
     292    obj->init();
     293    return adoptRef(obj);
    285294}
    286295
  • trunk/Source/WebCore/accessibility/AccessibilityMenuList.cpp

    r117803 r123182  
    3636    : AccessibilityRenderObject(renderer)
    3737{
     38}
     39
     40PassRefPtr<AccessibilityMenuList> AccessibilityMenuList::create(RenderMenuList* renderer)
     41{
     42    AccessibilityMenuList* obj = new AccessibilityMenuList(renderer);
     43    obj->init();
     44    return adoptRef(obj);
    3845}
    3946
  • trunk/Source/WebCore/accessibility/AccessibilityMenuList.h

    r117803 r123182  
    3838class AccessibilityMenuList : public AccessibilityRenderObject {
    3939public:
    40     static PassRefPtr<AccessibilityMenuList> create(RenderMenuList* renderer) { return adoptRef(new AccessibilityMenuList(renderer)); }
     40    static PassRefPtr<AccessibilityMenuList> create(RenderMenuList* renderer);
    4141
    4242    virtual bool isCollapsed() const;
  • trunk/Source/WebCore/accessibility/AccessibilityObject.h

    r119012 r123182  
    318318    typedef Vector<RefPtr<AccessibilityObject> > AccessibilityChildrenVector;
    319319   
     320    virtual bool isAccessibilityNodeObject() const { return false; }   
    320321    virtual bool isAccessibilityRenderObject() const { return false; }
    321322    virtual bool isAccessibilityScrollbar() const { return false; }
  • trunk/Source/WebCore/accessibility/AccessibilityProgressIndicator.cpp

    r95901 r123182  
    4242PassRefPtr<AccessibilityProgressIndicator> AccessibilityProgressIndicator::create(RenderProgress* renderer)
    4343{
    44     return adoptRef(new AccessibilityProgressIndicator(renderer));
     44    AccessibilityProgressIndicator* obj = new AccessibilityProgressIndicator(renderer);
     45    obj->init();
     46    return adoptRef(obj);
    4547}
    4648
  • trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp

    r123157 r123182  
    9494
    9595AccessibilityRenderObject::AccessibilityRenderObject(RenderObject* renderer)
    96     : AccessibilityObject()
     96    : AccessibilityNodeObject(renderer->node())
    9797    , m_renderer(renderer)
    98     , m_ariaRole(UnknownRole)
    99     , m_childrenDirty(false)
    100     , m_roleForMSAA(UnknownRole)
    101 {
    102     m_role = determineAccessibilityRole();
    103 
     98{
    10499#ifndef NDEBUG
    105100    m_renderer->setHasAXObject(true);
     
    112107}
    113108
     109void AccessibilityRenderObject::init()
     110{
     111    AccessibilityNodeObject::init();
     112}
     113
    114114PassRefPtr<AccessibilityRenderObject> AccessibilityRenderObject::create(RenderObject* renderer)
    115115{
    116     return adoptRef(new AccessibilityRenderObject(renderer));
     116    AccessibilityRenderObject* obj = new AccessibilityRenderObject(renderer);
     117    obj->init();
     118    return adoptRef(obj);
    117119}
    118120
    119121void AccessibilityRenderObject::detach()
    120122{
    121     clearChildren();
    122     AccessibilityObject::detach();
     123    AccessibilityNodeObject::detach();
    123124   
    124125#ifndef NDEBUG
     
    126127        m_renderer->setHasAXObject(false);
    127128#endif
    128     m_renderer = 0;   
     129    m_renderer = 0;
    129130}
    130131
     
    134135        return 0;
    135136    return toRenderBoxModelObject(m_renderer);
     137}
     138
     139void AccessibilityRenderObject::setRenderer(RenderObject* renderer)
     140{
     141    m_renderer = renderer;
     142    setNode(renderer->node());
    136143}
    137144
     
    30853092}
    30863093
    3087 AccessibilityRole AccessibilityRenderObject::remapAriaRoleDueToParent(AccessibilityRole role) const
    3088 {
    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=65174
    3093 
    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() const
    3116 {
    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() const
    3142 {
    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    
    31563094bool AccessibilityRenderObject::isDescendantOfElementType(const QualifiedName& tagName) const
    31573095{
     
    33903328}
    33913329
    3392 bool AccessibilityRenderObject::canSetFocusAttribute() const
    3393 {
    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() would
    3400     // do anything.  For example, setFocusedNode() will do nothing if the current focused
    3401     // 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    
    34113330bool AccessibilityRenderObject::canSetExpandedAttribute() const
    34123331{
     
    34553374}
    34563375   
    3457 void AccessibilityRenderObject::childrenChanged()
    3458 {
    3459     // This method is meant as a quick way of marking a portion of the accessibility tree dirty.
     3376bool AccessibilityRenderObject::canHaveChildren() const
     3377{
    34603378    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
    34903385    // Elements that should not have children
    34913386    switch (roleValue()) {
     
    35603455}
    35613456
     3457void 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
    35623466void AccessibilityRenderObject::addAttachmentChildren()
    35633467{
     
    35963500    // childrenChanged should have been called, leaving the object with no children.
    35973501    ASSERT(!m_haveChildren);
    3598    
    3599     // nothing to add if there is no RenderObject
    3600     if (!m_renderer)
    3601         return;
    3602    
     3502
    36033503    m_haveChildren = true;
    36043504   
     
    36083508    // add all unignored acc children
    36093509    for (RefPtr<AccessibilityObject> obj = firstChild(); obj; obj = obj->nextSibling()) {
    3610        
    36113510        // If the parent is asking for this child's children, then either it's the first time (and clearing is a no-op),
    36123511        // or its visibility has changed. In the latter case, this child may have a stale child cached.
     
    36283527    addImageMapChildren();
    36293528    addTextFieldChildren();
     3529    addCanvasChildren();
    36303530
    36313531#if PLATFORM(MAC)
  • trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h

    r123157 r123182  
    3030#define AccessibilityRenderObject_h
    3131
    32 #include "AccessibilityObject.h"
     32#include "AccessibilityNodeObject.h"
    3333#include "LayoutTypes.h"
    3434#include <wtf/Forward.h>
     
    5656class Widget;
    5757   
    58 class AccessibilityRenderObject : public AccessibilityObject {
     58class AccessibilityRenderObject : public AccessibilityNodeObject {
    5959protected:
    6060    AccessibilityRenderObject(RenderObject*);
     
    6464   
    6565    virtual bool isAccessibilityRenderObject() const { return true; }
     66
     67    virtual void init();
    6668   
    6769    virtual bool isAnchor() const;
     
    112114    virtual bool hasUnderline() const;
    113115
    114     virtual bool canSetFocusAttribute() const;
    115116    virtual bool canSetTextRangeAttributes() const;
    116117    virtual bool canSetValueAttribute() const;
     
    150151    virtual void ariaOwnsElements(AccessibilityChildrenVector&) const;
    151152    virtual bool supportsARIAOwns() const;
    152     virtual AccessibilityRole ariaRoleAttribute() const;
    153153    virtual bool isPresentationalChildOfAriaRole() const;
    154154    virtual bool ariaRoleHasPresentationalChildren() const;
    155     void updateAccessibilityRole();
    156155   
    157156    // Should be called on the root accessibility object to kick off a hit test.
     
    169168    virtual IntPoint clickPoint();
    170169   
    171     void setRenderer(RenderObject* renderer) { m_renderer = renderer; }
     170    void setRenderer(RenderObject*);
    172171    virtual RenderObject* renderer() const { return m_renderer; }
    173172    RenderBoxModelObject* renderBoxModelObject() const;
    174173    virtual Node* node() const;
    175174
     175    virtual Document* document() const;
     176
    176177    RenderView* topRenderer() const;
    177178    RenderTextControl* textControl() const;
    178     Document* document() const;
    179179    FrameView* topDocumentFrameView() const; 
    180180    Document* topDocument() const;
     
    215215   
    216216    virtual void detach();
    217     virtual void childrenChanged();
    218217    virtual void contentChanged();
    219218    virtual void addChildren();
     
    261260protected:
    262261    RenderObject* m_renderer;
    263     AccessibilityRole m_ariaRole;
    264     bool m_childrenDirty;
    265262   
    266263    void setRenderObject(RenderObject* renderer) { m_renderer = renderer; }
     
    271268   
    272269    virtual bool isDetached() const { return !m_renderer; }
     270
     271    virtual AccessibilityRole determineAccessibilityRole();
    273272
    274273private:
     
    287286    Element* menuElementForMenuButton() const;
    288287    Element* menuItemElementForMenu() const;
    289     AccessibilityRole determineAccessibilityRole();
    290     AccessibilityRole determineAriaRoleAttribute() const;
    291     AccessibilityRole remapAriaRoleDueToParent(AccessibilityRole) const;
    292288
    293289    bool isTabItemSelected() const;
     
    306302    void addTextFieldChildren();
    307303    void addImageMapChildren();
     304    void addCanvasChildren();
    308305    void addAttachmentChildren();
    309306#if PLATFORM(MAC)
     
    329326   
    330327    bool inheritsPresentationalRole() const;
    331    
    332     mutable AccessibilityRole m_roleForMSAA;
    333328};
    334329
  • trunk/Source/WebCore/accessibility/AccessibilitySlider.cpp

    r114031 r123182  
    4848PassRefPtr<AccessibilitySlider> AccessibilitySlider::create(RenderObject* renderer)
    4949{
    50     return adoptRef(new AccessibilitySlider(renderer));
     50    AccessibilitySlider* obj = new AccessibilitySlider(renderer);
     51    obj->init();
     52    return adoptRef(obj);
    5153}
    5254
  • trunk/Source/WebCore/accessibility/AccessibilityTable.cpp

    r118478 r123182  
    5252    m_headerContainer(0)
    5353{
     54}
     55
     56AccessibilityTable::~AccessibilityTable()
     57{
     58}
     59
     60void AccessibilityTable::init()
     61{
     62    AccessibilityRenderObject::init();
    5463#if ACCESSIBILITY_TABLES
    5564    m_isAccessibilityTable = isTableExposableThroughAccessibility();
     
    5968}
    6069
    61 AccessibilityTable::~AccessibilityTable()
    62 {
    63 }
    64 
    6570PassRefPtr<AccessibilityTable> AccessibilityTable::create(RenderObject* renderer)
    6671{
    67     return adoptRef(new AccessibilityTable(renderer));
     72    AccessibilityTable* obj = new AccessibilityTable(renderer);
     73    obj->init();
     74    return adoptRef(obj);
    6875}
    6976
  • trunk/Source/WebCore/accessibility/AccessibilityTable.h

    r122670 r123182  
    5151    virtual ~AccessibilityTable();
    5252
     53    virtual void init();
     54
    5355    virtual bool isAccessibilityTable() const;
    5456    virtual bool isDataTable() const;
  • trunk/Source/WebCore/accessibility/AccessibilityTableCell.cpp

    r115705 r123182  
    5252PassRefPtr<AccessibilityTableCell> AccessibilityTableCell::create(RenderObject* renderer)
    5353{
    54     return adoptRef(new AccessibilityTableCell(renderer));
     54    AccessibilityTableCell* obj = new AccessibilityTableCell(renderer);
     55    obj->init();
     56    return adoptRef(obj);
    5557}
    5658
  • trunk/Source/WebCore/accessibility/AccessibilityTableRow.cpp

    r110823 r123182  
    5555PassRefPtr<AccessibilityTableRow> AccessibilityTableRow::create(RenderObject* renderer)
    5656{
    57     return adoptRef(new AccessibilityTableRow(renderer));
     57    AccessibilityTableRow* obj = new AccessibilityTableRow(renderer);
     58    obj->init();
     59    return adoptRef(obj);
    5860}
    5961
Note: See TracChangeset for help on using the changeset viewer.