diff options
Diffstat (limited to 'WebCore/page/AXObjectCache.cpp')
-rw-r--r-- | WebCore/page/AXObjectCache.cpp | 51 |
1 files changed, 34 insertions, 17 deletions
diff --git a/WebCore/page/AXObjectCache.cpp b/WebCore/page/AXObjectCache.cpp index d9c4c9a..f8167a5 100644 --- a/WebCore/page/AXObjectCache.cpp +++ b/WebCore/page/AXObjectCache.cpp @@ -58,6 +58,7 @@ AXObjectCache::~AXObjectCache() AccessibilityObject* obj = (*it).second.get(); detachWrapper(obj); obj->detach(); + removeAXID(obj); } } @@ -66,39 +67,52 @@ AccessibilityObject* AXObjectCache::get(RenderObject* renderer) if (!renderer) return 0; - RefPtr<AccessibilityObject> obj = 0; + AccessibilityObject* obj = 0; AXID axID = m_renderObjectMapping.get(renderer); ASSERT(!HashTraits<AXID>::isDeletedValue(axID)); if (axID) obj = m_objects.get(axID).get(); + + return obj; +} + +AccessibilityObject* AXObjectCache::getOrCreate(RenderObject* renderer) +{ + if (!renderer) + return 0; + + AccessibilityObject* obj = get(renderer); - Node* element = renderer->element(); if (!obj) { + Node* node = renderer->node(); + RefPtr<AccessibilityObject> newObj = 0; if (renderer->isListBox()) - obj = AccessibilityListBox::create(renderer); - else if (element && (element->hasTagName(ulTag) || element->hasTagName(olTag) || element->hasTagName(dlTag))) - obj = AccessibilityList::create(renderer); + newObj = AccessibilityListBox::create(renderer); + else if (node && (node->hasTagName(ulTag) || node->hasTagName(olTag) || node->hasTagName(dlTag))) + newObj = AccessibilityList::create(renderer); else if (renderer->isTable()) - obj = AccessibilityTable::create(renderer); + newObj = AccessibilityTable::create(renderer); else if (renderer->isTableRow()) - obj = AccessibilityTableRow::create(renderer); + newObj = AccessibilityTableRow::create(renderer); else if (renderer->isTableCell()) - obj = AccessibilityTableCell::create(renderer); + newObj = AccessibilityTableCell::create(renderer); else - obj = AccessibilityRenderObject::create(renderer); + newObj = AccessibilityRenderObject::create(renderer); - getAXID(obj.get()); + obj = newObj.get(); + + getAXID(obj); - m_renderObjectMapping.set(renderer, obj.get()->axObjectID()); - m_objects.set(obj.get()->axObjectID(), obj); - attachWrapper(obj.get()); + m_renderObjectMapping.set(renderer, obj->axObjectID()); + m_objects.set(obj->axObjectID(), obj); + attachWrapper(obj); } - return obj.get(); + return obj; } -AccessibilityObject* AXObjectCache::get(AccessibilityRole role) +AccessibilityObject* AXObjectCache::getOrCreate(AccessibilityRole role) { RefPtr<AccessibilityObject> obj = 0; @@ -186,6 +200,9 @@ AXID AXObjectCache::getAXID(AccessibilityObject* obj) void AXObjectCache::removeAXID(AccessibilityObject* obj) { + if (!obj) + return; + AXID objID = obj->axObjectID(); if (objID == 0) return; @@ -221,7 +238,7 @@ void AXObjectCache::handleActiveDescendantChanged(RenderObject* renderer) { if (!renderer) return; - AccessibilityObject* obj = get(renderer); + AccessibilityObject* obj = getOrCreate(renderer); if (obj) obj->handleActiveDescendantChanged(); } @@ -230,7 +247,7 @@ void AXObjectCache::handleAriaRoleChanged(RenderObject* renderer) { if (!renderer) return; - AccessibilityObject* obj = get(renderer); + AccessibilityObject* obj = getOrCreate(renderer); if (obj && obj->isAccessibilityRenderObject()) static_cast<AccessibilityRenderObject*>(obj)->setAriaRole(); } |