Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(834)

Unified Diff: third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp

Issue 1348503003: One AXObjectCache per frame (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix issues in AutomationApiTest.Events Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp b/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp
index ff87ae10000912a5afeaad8afb9333527002bdc0..7d19d09d7d096540643fdfeb2566d436464e6b05 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp
+++ b/third_party/WebKit/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();
- Page* page = newFocusedNode->document().page();
- if (!page)
- return;
+ AXObject* obj = getOrCreate(newFocusedNode);
+
+ if (isHTMLAreaElement(newFocusedNode))
+ 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

Powered by Google App Engine
This is Rietveld 408576698