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 ace24ad3ead43568754da86e591101a32ea3f2c0..bdb5be0394ba7d061b3d4adc0dfd6d39c9ac95ec 100644 |
| --- a/third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp |
| +++ b/third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp |
| @@ -10,6 +10,7 @@ |
| #include "core/dom/Element.h" |
| #include "core/dom/Node.h" |
| #include "core/dom/NodeList.h" |
| +#include "core/dom/shadow/ElementShadow.h" |
| #include "core/inspector/IdentifiersFactory.h" |
| #include "core/inspector/InspectorDOMAgent.h" |
| #include "core/inspector/InspectorStyleSheet.h" |
| @@ -510,11 +511,14 @@ void InspectorAccessibilityAgent::populateDOMNodeRelatives( |
| nodeObject.setChildIds(std::move(childIds)); |
| // Walk up parents until an AXObject can be found. |
| - Node* parentNode = FlatTreeTraversal::parent(inspectedDOMNode); |
|
aboxhall
2016/12/02 00:30:14
The crash was here: FlatTreeTraversal explicitly d
|
| + Node* parentNode = inspectedDOMNode.isShadowRoot() |
| + ? &toShadowRoot(inspectedDOMNode).host() |
| + : FlatTreeTraversal::parent(inspectedDOMNode); |
| AXObject* parentAXObject = cache.getOrCreate(parentNode); |
| while (parentNode && !parentAXObject) { |
| - parentNode = FlatTreeTraversal::parent(inspectedDOMNode); |
| - parentAXObject = cache.getOrCreate(parentNode); |
|
dgozman
2016/12/02 18:04:16
Where did this line go?
aboxhall
2016/12/02 22:25:11
Yikes. Replaced.
|
| + parentNode = parentNode->isShadowRoot() |
| + ? &toShadowRoot(parentNode)->host() |
| + : FlatTreeTraversal::parent(*parentNode); |
| }; |
| if (!parentAXObject) |
| @@ -545,7 +549,20 @@ void InspectorAccessibilityAgent::findDOMNodeChildren( |
| Node& inspectedDOMNode, |
| std::unique_ptr<protocol::Array<AXNode>>& nodes, |
| AXObjectCacheImpl& cache) const { |
| + if (inspectedDOMNode.isShadowRoot() && |
| + &parentNode == toShadowRoot(inspectedDOMNode).host()) { |
| + childIds->addItem(String::number(kIDForInspectedNodeWithNoAXNode)); |
| + return; |
| + } |
| NodeList* childNodes = parentNode.childNodes(); |
| + if (!childNodes->length() && parentNode.isElementNode()) { |
| + Element& parentElement = toElement(parentNode); |
| + ElementShadow* elementShadow = parentElement.shadow(); |
| + if (elementShadow) { |
| + ShadowRoot& shadowRoot = elementShadow->youngestShadowRoot(); |
| + childNodes = shadowRoot.childNodes(); |
| + } |
| + } |
| for (size_t i = 0; i < childNodes->length(); ++i) { |
| Node* childNode = childNodes->item(i); |
| if (childNode == &inspectedDOMNode) { |