Index: Source/core/inspector/InspectorDOMAgent.cpp |
diff --git a/Source/core/inspector/InspectorDOMAgent.cpp b/Source/core/inspector/InspectorDOMAgent.cpp |
index cb1d0afc0ae75ea8051237193a85caaad8f10b54..17ad00b81e1fd45d2c8d8ea96973c7525fac7733 100644 |
--- a/Source/core/inspector/InspectorDOMAgent.cpp |
+++ b/Source/core/inspector/InspectorDOMAgent.cpp |
@@ -423,6 +423,20 @@ Element* InspectorDOMAgent::assertElement(ErrorString* errorString, int nodeId) |
return toElement(node); |
} |
+static ShadowRoot* userAgentShadowRoot(Node* node) |
+{ |
+ if (!node || !node->isInShadowTree()) |
+ return 0; |
+ |
+ Node* candidate = node; |
+ while (candidate && !candidate->isShadowRoot()) |
+ candidate = candidate->parentOrShadowHostNode(); |
+ ASSERT(candidate); |
+ ShadowRoot* shadowRoot = toShadowRoot(candidate); |
+ |
+ return shadowRoot->type() == ShadowRoot::UserAgentShadowRoot ? shadowRoot : 0; |
+} |
+ |
Node* InspectorDOMAgent::assertEditableNode(ErrorString* errorString, int nodeId) |
{ |
Node* node = assertNode(errorString, nodeId); |
@@ -434,10 +448,7 @@ Node* InspectorDOMAgent::assertEditableNode(ErrorString* errorString, int nodeId |
*errorString = "Cannot edit shadow roots"; |
return 0; |
} |
- Node* candidate = node; |
- while (candidate && !candidate->isShadowRoot()) |
- candidate = candidate->parentElementOrShadowRoot(); |
- if (!candidate || (candidate->isShadowRoot() && toShadowRoot(candidate)->type() == ShadowRoot::UserAgentShadowRoot)) { |
+ if (userAgentShadowRoot(node)) { |
*errorString = "Cannot edit nodes from user-agent shadow trees"; |
return 0; |
} |
@@ -1127,8 +1138,11 @@ void InspectorDOMAgent::inspect(Node* inspectedNode) |
return; |
Node* node = inspectedNode; |
- if (node->nodeType() != Node::ELEMENT_NODE && node->nodeType() != Node::DOCUMENT_NODE) |
- node = node->parentNode(); |
+ while (node && node->nodeType() != Node::ELEMENT_NODE && node->nodeType() != Node::DOCUMENT_NODE && node->nodeType() != Node::DOCUMENT_FRAGMENT_NODE) |
+ node = node->parentOrShadowHostNode(); |
+ |
+ if (!node) |
+ return; |
int nodeId = pushNodePathToFrontend(node); |
if (nodeId) |
@@ -1144,9 +1158,20 @@ void InspectorDOMAgent::handleMouseMove(LocalFrame* frame, const PlatformMouseEv |
return; |
Node* node = hoveredNodeForEvent(frame, event, event.shiftKey()); |
- while (m_searchingForNode != SearchingForShadow && node && node->isInShadowTree()) |
+ // Do not highlight within UA shadow root unless requested. |
+ if (m_searchingForNode != SearchingForUAShadow) { |
+ ShadowRoot* uaShadowRoot = userAgentShadowRoot(node); |
+ if (uaShadowRoot) |
+ node = uaShadowRoot->host(); |
+ } |
+ |
+ // Shadow roots don't have boxes - use host element instead. |
+ if (node && node->isShadowRoot()) |
node = node->parentOrShadowHostNode(); |
+ if (!node) |
+ return; |
+ |
Node* eventTarget = event.shiftKey() ? hoveredNodeForEvent(frame, event, false) : 0; |
if (eventTarget == node) |
eventTarget = 0; |
@@ -1193,11 +1218,11 @@ PassOwnPtr<HighlightConfig> InspectorDOMAgent::highlightConfigFromInspectorObjec |
return highlightConfig.release(); |
} |
-void InspectorDOMAgent::setInspectModeEnabled(ErrorString* errorString, bool enabled, const bool* inspectShadowDOM, const RefPtr<JSONObject>* highlightConfig) |
+void InspectorDOMAgent::setInspectModeEnabled(ErrorString* errorString, bool enabled, const bool* inspectUAShadowDOM, const RefPtr<JSONObject>* highlightConfig) |
{ |
if (enabled && !pushDocumentUponHandlelessOperation(errorString)) |
return; |
- SearchMode searchMode = enabled ? (inspectShadowDOM && *inspectShadowDOM ? SearchingForShadow : SearchingForNormal) : NotSearching; |
+ SearchMode searchMode = enabled ? (inspectUAShadowDOM && *inspectUAShadowDOM ? SearchingForUAShadow : SearchingForNormal) : NotSearching; |
setSearchingForNode(errorString, searchMode, highlightConfig ? highlightConfig->get() : 0); |
} |