Chromium Code Reviews| Index: third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp |
| diff --git a/third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp b/third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp |
| index c1762d60d37ab82fa0aad7b88924a6452b53e707..7598de752a223b31e30f357b7d1f98b87fe52f20 100644 |
| --- a/third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp |
| +++ b/third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp |
| @@ -8,6 +8,7 @@ |
| #include "core/dom/AXObjectCache.h" |
| #include "core/dom/DOMNodeIds.h" |
| #include "core/dom/Element.h" |
| +#include "core/inspector/IdentifiersFactory.h" |
| #include "core/inspector/InspectorDOMAgent.h" |
| #include "core/inspector/InspectorStyleSheet.h" |
| #include "core/page/Page.h" |
| @@ -300,7 +301,7 @@ std::unique_ptr<AXValue> createRoleNameValue(AccessibilityRole role) |
| return roleNameValue; |
| } |
| -std::unique_ptr<AXNode> buildObjectForIgnoredNode(Node* node, AXObject* axObject, AXObjectCacheImpl* cacheImpl) |
| +std::unique_ptr<AXNode> buildObjectForIgnoredNode(Node* node, const AXObject* axObject, AXObjectCacheImpl* cache) |
|
dgozman
2016/09/17 00:36:23
Looks like cache is unused. Remove?
aboxhall
2016/09/17 01:12:34
Done.
|
| { |
| AXObject::IgnoredReasons ignoredReasons; |
| @@ -311,7 +312,7 @@ std::unique_ptr<AXNode> buildObjectForIgnoredNode(Node* node, AXObject* axObject |
| axID = axObject->axObjectID(); |
| AccessibilityRole role = axObject->roleValue(); |
| ignoredNodeObject->setRole(createRoleNameValue(role)); |
| - } else if (!node->layoutObject()) { |
| + } else if (node && !node->layoutObject()) { |
| ignoredReasons.append(IgnoredReason(AXNotRendered)); |
| } |
| @@ -323,12 +324,19 @@ std::unique_ptr<AXNode> buildObjectForIgnoredNode(Node* node, AXObject* axObject |
| return ignoredNodeObject; |
| } |
| -std::unique_ptr<AXNode> buildObjectForNode(Node* node, AXObject* axObject, AXObjectCacheImpl* cacheImpl, std::unique_ptr<protocol::Array<AXProperty>> properties) |
| +std::unique_ptr<AXNode> buildProtocolAXObject(AXObject* axObject, AXObjectCacheImpl* cache) |
|
dgozman
2016/09/17 00:36:23
ditto
aboxhall
2016/09/17 01:12:34
Done.
|
| { |
| AccessibilityRole role = axObject->roleValue(); |
| std::unique_ptr<AXNode> nodeObject = AXNode::create().setNodeId(String::number(axObject->axObjectID())).setIgnored(false).build(); |
| nodeObject->setRole(createRoleNameValue(role)); |
| + std::unique_ptr<protocol::Array<AXProperty>> properties = protocol::Array<AXProperty>::create(); |
| + fillLiveRegionProperties(axObject, properties.get()); |
| + fillGlobalStates(axObject, properties.get()); |
| + fillWidgetProperties(axObject, properties.get()); |
| + fillWidgetStates(axObject, properties.get()); |
| + fillRelationships(axObject, properties.get()); |
| + |
| AXObject::NameSources nameSources; |
| String computedName = axObject->name(&nameSources); |
| if (!nameSources.isEmpty()) { |
| @@ -364,41 +372,41 @@ InspectorAccessibilityAgent::InspectorAccessibilityAgent(Page* page, InspectorDO |
| { |
| } |
| -void InspectorAccessibilityAgent::getAXNode(ErrorString* errorString, int nodeId, Maybe<AXNode>* accessibilityNode) |
| +void InspectorAccessibilityAgent::getAXNodeChain(ErrorString* errorString, int domNodeId, bool fetchAncestors, Maybe<protocol::Array<protocol::Accessibility::AXNode>>* nodes) |
| { |
| - Frame* mainFrame = m_page->mainFrame(); |
| - if (!mainFrame->isLocalFrame()) { |
| - *errorString = "Can't inspect out of process frames yet"; |
| - return; |
| - } |
| - |
| if (!m_domAgent->enabled()) { |
| *errorString = "DOM agent must be enabled"; |
| return; |
| } |
| - Node* node = m_domAgent->assertNode(errorString, nodeId); |
| + Node* node = m_domAgent->assertNode(errorString, domNodeId); |
| if (!node) |
| return; |
| Document& document = node->document(); |
| document.updateStyleAndLayoutIgnorePendingStylesheets(); |
| DocumentLifecycle::DisallowTransitionScope disallowTransition(document.lifecycle()); |
| - std::unique_ptr<ScopedAXObjectCache> cache = ScopedAXObjectCache::create(document); |
| - AXObjectCacheImpl* cacheImpl = toAXObjectCacheImpl(cache->get()); |
| - AXObject* axObject = cacheImpl->getOrCreate(node); |
| - if (!axObject || axObject->accessibilityIsIgnored()) { |
| - *accessibilityNode = buildObjectForIgnoredNode(node, axObject, cacheImpl); |
| + LocalFrame* localFrame = document.frame(); |
| + if (!localFrame) { |
| + *errorString = "Frame is detached."; |
| return; |
| } |
| + std::unique_ptr<ScopedAXObjectCache> scopedCache = ScopedAXObjectCache::create(document); |
| + AXObjectCacheImpl* cache = toAXObjectCacheImpl(scopedCache->get()); |
| + AXObject* axObject = cache->getOrCreate(node); |
| + *nodes = protocol::Array<protocol::Accessibility::AXNode>::create(); |
| + if (!axObject || axObject->accessibilityIsIgnored()) { |
| + nodes->fromJust()->addItem(buildObjectForIgnoredNode(node, axObject, cache)); |
| + } else { |
| + nodes->fromJust()->addItem(buildProtocolAXObject(axObject, cache)); |
| + } |
| - std::unique_ptr<protocol::Array<AXProperty>> properties = protocol::Array<AXProperty>::create(); |
| - fillLiveRegionProperties(axObject, properties.get()); |
| - fillGlobalStates(axObject, properties.get()); |
| - fillWidgetProperties(axObject, properties.get()); |
| - fillWidgetStates(axObject, properties.get()); |
| - fillRelationships(axObject, properties.get()); |
| - |
| - *accessibilityNode = buildObjectForNode(node, axObject, cacheImpl, std::move(properties)); |
| + if (fetchAncestors && axObject) { |
| + AXObject* parent = axObject->parentObjectUnignored(); |
| + while (parent) { |
| + nodes->fromJust()->addItem(buildProtocolAXObject(parent, cache)); |
| + parent = parent->parentObjectUnignored(); |
| + } |
| + } |
| } |
| DEFINE_TRACE(InspectorAccessibilityAgent) |