Reviewers: dgozman
CL:
https://codereview.chromium.org/2524993003/Message:
I spent a couple of hours trying to write a test for this before giving up - I
couldn't figure out how to get the frontend node ID for the shadow root in any
straightforward way, and it quickly devolved into previously unheard of depths
of promise hell.
Description:
DevTools Accessibility pane: fix crash when inspecting shadow roots
BUG=
Affected files (+20, -3 lines):
M third_party/WebKit/Source/modules/accessibility/InspectorAccessibilityAgent.cpp
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);
+ 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);
+ 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) {