Chromium Code Reviews| Index: Source/modules/accessibility/AXObjectCacheImpl.cpp |
| diff --git a/Source/modules/accessibility/AXObjectCacheImpl.cpp b/Source/modules/accessibility/AXObjectCacheImpl.cpp |
| index ff87ae10000912a5afeaad8afb9333527002bdc0..7d19d09d7d096540643fdfeb2566d436464e6b05 100644 |
| --- a/Source/modules/accessibility/AXObjectCacheImpl.cpp |
| +++ b/Source/modules/accessibility/AXObjectCacheImpl.cpp |
| @@ -68,8 +68,6 @@ |
| #include "modules/accessibility/AXMenuListPopup.h" |
| #include "modules/accessibility/AXProgressIndicator.h" |
| #include "modules/accessibility/AXSVGRoot.h" |
| -#include "modules/accessibility/AXScrollView.h" |
| -#include "modules/accessibility/AXScrollbar.h" |
| #include "modules/accessibility/AXSlider.h" |
| #include "modules/accessibility/AXSpinButton.h" |
| #include "modules/accessibility/AXTable.h" |
| @@ -153,53 +151,6 @@ AXObject* AXObjectCacheImpl::focusedImageMapUIElement(HTMLAreaElement* areaEleme |
| return 0; |
| } |
| -AXObject* AXObjectCacheImpl::focusedUIElementForPage(const Page* page) |
| -{ |
| - if (!page->settings().accessibilityEnabled()) |
| - return 0; |
| - |
| - // Cross-process accessibility is not yet implemented. |
| - if (!page->focusController().focusedOrMainFrame()->isLocalFrame()) |
| - return 0; |
| - |
| - // get the focused node in the page |
| - Document* focusedDocument = toLocalFrame(page->focusController().focusedOrMainFrame())->document(); |
| - Node* focusedNode = focusedDocument->focusedElement(); |
| - if (!focusedNode) |
| - focusedNode = focusedDocument; |
| - |
| - if (isHTMLAreaElement(*focusedNode)) |
| - return focusedImageMapUIElement(toHTMLAreaElement(focusedNode)); |
| - |
| - AXObject* obj = getOrCreate(focusedNode); |
| - if (!obj) |
| - return 0; |
| - |
| - if (obj->shouldFocusActiveDescendant()) { |
| - if (AXObject* descendant = obj->activeDescendant()) |
| - obj = descendant; |
| - } |
| - |
| - // the HTML element, for example, is focusable but has an AX object that is ignored |
| - if (obj->accessibilityIsIgnored()) |
| - obj = obj->parentObjectUnignored(); |
| - |
| - return obj; |
| -} |
| - |
| -AXObject* AXObjectCacheImpl::get(Widget* widget) |
| -{ |
| - if (!widget) |
| - return 0; |
| - |
| - AXID axID = m_widgetObjectMapping.get(widget); |
| - ASSERT(!HashTraits<AXID>::isDeletedValue(axID)); |
| - if (!axID) |
| - return 0; |
| - |
| - return m_objects.get(axID); |
| -} |
| - |
| AXObject* AXObjectCacheImpl::get(LayoutObject* layoutObject) |
| { |
| if (!layoutObject) |
| @@ -346,44 +297,6 @@ AXObject* AXObjectCacheImpl::createFromInlineTextBox(AbstractInlineTextBox* inli |
| return AXInlineTextBox::create(inlineTextBox, *this); |
| } |
| -AXObject* AXObjectCacheImpl::getOrCreate(Widget* widget) |
| -{ |
| - if (!widget) |
| - return 0; |
| - |
| - if (AXObject* obj = get(widget)) |
| - return obj; |
| - |
| - AXObject* newObj = nullptr; |
| - if (widget->isFrameView()) { |
| - FrameView* frameView = toFrameView(widget); |
| - |
| - // Don't create an AXScrollView for a FrameView that isn't attached to a frame, |
| - // for example if it's in the process of being disposed. |
| - if (frameView->frame().view() != frameView || !frameView->layoutView()) |
| - return 0; |
| - |
| - newObj = AXScrollView::create(toFrameView(widget), *this); |
| - } else if (widget->isScrollbar()) { |
| - newObj = AXScrollbar::create(toScrollbar(widget), *this); |
| - } |
| - |
| - // Will crash later if we have two objects for the same widget. |
| - ASSERT(!get(widget)); |
| - |
| - // Catch the case if an (unsupported) widget type is used. Only FrameView and ScrollBar are supported now. |
| - ASSERT(newObj); |
| - if (!newObj) |
| - return 0; |
| - |
| - getAXID(newObj); |
| - |
| - m_widgetObjectMapping.set(widget, newObj->axObjectID()); |
| - m_objects.set(newObj->axObjectID(), newObj); |
| - newObj->init(); |
| - return newObj; |
| -} |
| - |
| AXObject* AXObjectCacheImpl::getOrCreate(Node* node) |
| { |
| if (!node) |
| @@ -401,6 +314,15 @@ AXObject* AXObjectCacheImpl::getOrCreate(Node* node) |
| if (isHTMLHeadElement(node)) |
| return 0; |
| + if (!node->document().frame()) |
| + return 0; |
| + |
| + if (node->document().frame()->pagePopupOwner() && &node->document().frame()->pagePopupOwner()->document() != m_document) |
| + return 0; |
| + |
| + if (&node->document() != m_document) |
| + return 0; |
| + |
| AXObject* newObj = createFromNode(node); |
| // Will crash later if we have two objects for the same node. |
| @@ -424,6 +346,9 @@ AXObject* AXObjectCacheImpl::getOrCreate(LayoutObject* layoutObject) |
| if (!layoutObject) |
| return 0; |
| + if (&layoutObject->document() != m_document) |
| + return 0; |
| + |
| if (AXObject* obj = get(layoutObject)) |
| return obj; |
| @@ -470,7 +395,7 @@ AXObject* AXObjectCacheImpl::rootObject() |
| if (!accessibilityEnabled()) |
| return 0; |
| - return getOrCreate(m_document->view()); |
| + return getOrCreate(m_document); |
| } |
| AXObject* AXObjectCacheImpl::getOrCreate(AccessibilityRole role) |
| @@ -560,16 +485,6 @@ void AXObjectCacheImpl::remove(Node* node) |
| } |
| } |
| -void AXObjectCacheImpl::remove(Widget* view) |
| -{ |
| - if (!view) |
| - return; |
| - |
| - AXID axID = m_widgetObjectMapping.get(view); |
| - remove(axID); |
| - m_widgetObjectMapping.remove(view); |
| -} |
| - |
| void AXObjectCacheImpl::remove(AbstractInlineTextBox* inlineTextBox) |
| { |
| if (!inlineTextBox) |
| @@ -966,18 +881,6 @@ void AXObjectCacheImpl::listboxActiveIndexChanged(HTMLSelectElement* select) |
| toAXListBox(obj)->activeIndexChanged(); |
| } |
| -void AXObjectCacheImpl::handleScrollbarUpdate(FrameView* view) |
| -{ |
| - if (!view) |
| - return; |
| - |
| - // We don't want to create a scroll view from this method, only update an existing one. |
| - if (AXObject* scrollViewObject = get(view)) { |
| - m_modificationCount++; |
| - scrollViewObject->updateChildrenIfNecessary(); |
| - } |
| -} |
| - |
| void AXObjectCacheImpl::handleLayoutComplete(LayoutObject* layoutObject) |
| { |
| if (!layoutObject) |
| @@ -1165,17 +1068,6 @@ bool isNodeAriaVisible(Node* node) |
| void AXObjectCacheImpl::postPlatformNotification(AXObject* obj, AXNotification notification) |
| { |
| - if (obj && obj->isAXScrollbar() && notification == AXValueChanged) { |
| - // Send document value changed on scrollbar value changed notification. |
| - Scrollbar* scrollBar = toAXScrollbar(obj)->scrollbar(); |
| - if (!scrollBar || !scrollBar->parent() || !scrollBar->parent()->isFrameView()) |
| - return; |
| - Document* document = toFrameView(scrollBar->parent())->frame().document(); |
| - if (document != document->topDocument()) |
| - return; |
| - obj = get(document->layoutView()); |
| - } |
| - |
| if (!obj || !obj->document() || !obj->documentFrameView() || !obj->documentFrameView()->frame().page()) |
| return; |
| @@ -1195,17 +1087,25 @@ void AXObjectCacheImpl::postPlatformNotification(AXObject* obj, AXNotification n |
| void AXObjectCacheImpl::handleFocusedUIElementChanged(Node*, Node* newFocusedNode) |
| { |
| if (!newFocusedNode) |
| - return; |
| + newFocusedNode = m_document.get(); |
|
aboxhall
2015/09/22 21:48:27
This seems like a major change. Is this functional
dmazzoni
2015/09/22 22:08:44
This is more or less equivalent.
Internally, a do
|
| - Page* page = newFocusedNode->document().page(); |
| - if (!page) |
| - return; |
| + AXObject* obj = getOrCreate(newFocusedNode); |
| + |
| + if (isHTMLAreaElement(newFocusedNode)) |
|
aboxhall
2015/09/22 21:48:27
Can you explain why this is now needed?
dmazzoni
2015/09/22 22:08:44
This is just coming from AXObjectCacheImpl::focuse
|
| + obj = focusedImageMapUIElement(toHTMLAreaElement(newFocusedNode)); |
| - AXObject* focusedObject = focusedUIElementForPage(page); |
| - if (!focusedObject) |
| + if (!obj) |
| return; |
| - postPlatformNotification(focusedObject, AXFocusedUIElementChanged); |
| + if (obj->shouldFocusActiveDescendant()) { |
| + if (AXObject* descendant = obj->activeDescendant()) |
| + obj = descendant; |
| + } |
| + |
| + if (obj->accessibilityIsIgnored()) |
| + obj = obj->parentObjectUnignored(); |
| + |
| + postPlatformNotification(obj, AXFocusedUIElementChanged); |
| } |
| void AXObjectCacheImpl::handleInitialFocus() |
| @@ -1277,10 +1177,8 @@ void AXObjectCacheImpl::handleScrolledToAnchor(const Node* anchorNode) |
| void AXObjectCacheImpl::handleScrollPositionChanged(FrameView* frameView) |
| { |
| - // Prefer to fire the scroll position changed event on the frame view's child web area, if possible. |
| - AXObject* targetAXObject = getOrCreate(frameView); |
| - if (targetAXObject && !targetAXObject->children().isEmpty()) |
| - targetAXObject = targetAXObject->children()[0].get(); |
| + Document* doc = frameView->frame().document(); |
| + AXObject* targetAXObject = getOrCreate(doc); |
| postPlatformNotification(targetAXObject, AXScrollPositionChanged); |
| } |
| @@ -1346,7 +1244,6 @@ DEFINE_TRACE(AXObjectCacheImpl) |
| { |
| #if ENABLE(OILPAN) |
| visitor->trace(m_document); |
| - visitor->trace(m_widgetObjectMapping); |
| visitor->trace(m_nodeObjectMapping); |
| #endif |