Commit 415c8cbc authored by Pavel Feldman's avatar Pavel Feldman Committed by Commit Bot

DevTools: make DOM.getNodeForLocation work with disabled DOM domain.

Change-Id: Ie0cda615136c02d8e01a16d105cdcddf2dd0938f
Reviewed-on: https://chromium-review.googlesource.com/c/1258384
Commit-Queue: Pavel Feldman <pfeldman@chromium.org>
Reviewed-by: default avatarDmitry Gozman <dgozman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#596431}
parent 32efeacf
...@@ -27,10 +27,14 @@ ...@@ -27,10 +27,14 @@
var NodeTracker = await testRunner.loadScript('../resources/node-tracker.js'); var NodeTracker = await testRunner.loadScript('../resources/node-tracker.js');
var nodeTracker = new NodeTracker(dp); var nodeTracker = new NodeTracker(dp);
dp.DOM.enable(); const bn1 = (await dp.DOM.getNodeForLocation({x: 100, y: 200})).result.backendNodeId;
await dp.DOM.getNodeForLocation({x: 100, y: 200}); const bn2 = (await dp.DOM.getNodeForLocation({x: 250, y: 250})).result.backendNodeId;
await dp.DOM.getNodeForLocation({x: 250, y: 250}); const bn3 = (await dp.DOM.getNodeForLocation({x: 500, y: 500})).result.backendNodeId;
await dp.DOM.getNodeForLocation({x: 500, y: 500});
await dp.DOM.enable();
await nodeTracker.nodeForBackendId(bn1);
await nodeTracker.nodeForBackendId(bn2);
await nodeTracker.nodeForBackendId(bn3);
for (var nodeId of nodeTracker.nodeIds()) { for (var nodeId of nodeTracker.nodeIds()) {
var node = nodeTracker.nodeForId(nodeId); var node = nodeTracker.nodeForId(nodeId);
......
...@@ -8,9 +8,9 @@ ...@@ -8,9 +8,9 @@
var NodeTracker = await testRunner.loadScript('../resources/node-tracker.js'); var NodeTracker = await testRunner.loadScript('../resources/node-tracker.js');
var nodeTracker = new NodeTracker(dp); var nodeTracker = new NodeTracker(dp);
dp.DOM.enable();
var message = await dp.DOM.getNodeForLocation({x: 10, y: 10, includeUserAgentShadowDOM: false}); var message = await dp.DOM.getNodeForLocation({x: 10, y: 10, includeUserAgentShadowDOM: false});
var nodeId = message.result.nodeId; var backendNodeId = message.result.backendNodeId;
testRunner.log(nodeTracker.nodeForId(nodeId), 'Node: '); await dp.DOM.enable();
testRunner.log(await nodeTracker.nodeForBackendId(backendNodeId), 'Node: ');
testRunner.completeTest(); testRunner.completeTest();
}) })
...@@ -5,10 +5,10 @@ ...@@ -5,10 +5,10 @@
var NodeTracker = await testRunner.loadScript('../resources/node-tracker.js'); var NodeTracker = await testRunner.loadScript('../resources/node-tracker.js');
var nodeTracker = new NodeTracker(dp); var nodeTracker = new NodeTracker(dp);
dp.DOM.enable();
var response = await dp.DOM.getNodeForLocation({x: 10, y: 10}); var response = await dp.DOM.getNodeForLocation({x: 10, y: 10});
var nodeId = response.result.nodeId; var backendNodeId = response.result.backendNodeId;
testRunner.log(nodeTracker.nodeForId(nodeId), 'Node: '); await dp.DOM.enable();
testRunner.log(await nodeTracker.nodeForBackendId(backendNodeId), 'Node: ');
testRunner.completeTest(); testRunner.completeTest();
}) })
(class NodeTracker { (class NodeTracker {
constructor(dp) { constructor(dp) {
this._nodes = new Map(); this._nodes = new Map();
this._dp = dp;
dp.DOM.onSetChildNodes(message => message.params.nodes.forEach(node => this._addNode(node))); dp.DOM.onSetChildNodes(message => message.params.nodes.forEach(node => this._addNode(node)));
} }
...@@ -18,6 +19,13 @@ ...@@ -18,6 +19,13 @@
return this._nodes.get(nodeId) || null; return this._nodes.get(nodeId) || null;
} }
async nodeForBackendId(backendNodeId) {
const response = await this._dp.DOM.pushNodesByBackendIdsToFrontend({backendNodeIds: [backendNodeId]});
if (!response.result)
throw new Error(JSON.stringify(response));
return this.nodeForId(response.result.nodeIds[0]);
}
nodes() { nodes() {
return Array.from(this._nodes.values()); return Array.from(this._nodes.values());
} }
......
...@@ -1530,7 +1530,8 @@ domain DOM ...@@ -1530,7 +1530,8 @@ domain DOM
# Resulting node. # Resulting node.
array of Node nodes array of Node nodes
# Returns node id at given location. # Returns node id at given location. Depending on whether DOM domain is enabled, nodeId is
# either returned or not.
experimental command getNodeForLocation experimental command getNodeForLocation
parameters parameters
# X coordinate. # X coordinate.
...@@ -1540,8 +1541,10 @@ domain DOM ...@@ -1540,8 +1541,10 @@ domain DOM
# False to skip to the nearest non-UA shadow root ancestor (default: false). # False to skip to the nearest non-UA shadow root ancestor (default: false).
optional boolean includeUserAgentShadowDOM optional boolean includeUserAgentShadowDOM
returns returns
# Id of the node at given coordinates. # Resulting node.
NodeId nodeId BackendNodeId backendNodeId
# Id of the node at given coordinates, only when enabled.
optional NodeId nodeId
# Returns node's HTML markup. # Returns node's HTML markup.
command getOuterHTML command getOuterHTML
......
...@@ -1315,22 +1315,18 @@ Response InspectorDOMAgent::getNodeForLocation( ...@@ -1315,22 +1315,18 @@ Response InspectorDOMAgent::getNodeForLocation(
int x, int x,
int y, int y,
Maybe<bool> optional_include_user_agent_shadow_dom, Maybe<bool> optional_include_user_agent_shadow_dom,
int* node_id) { int* backend_node_id,
if (!enabled_.Get()) Maybe<int>* node_id) {
return Response::Error("DOM agent is not enabled");
bool include_user_agent_shadow_dom = bool include_user_agent_shadow_dom =
optional_include_user_agent_shadow_dom.fromMaybe(false); optional_include_user_agent_shadow_dom.fromMaybe(false);
Response response = PushDocumentUponHandlelessOperation(); Document* document = inspected_frames_->Root()->GetDocument();
if (!response.isSuccess())
return response;
LayoutPoint document_point(x * inspected_frames_->Root()->PageZoomFactor(), LayoutPoint document_point(x * inspected_frames_->Root()->PageZoomFactor(),
y * inspected_frames_->Root()->PageZoomFactor()); y * inspected_frames_->Root()->PageZoomFactor());
HitTestRequest request(HitTestRequest::kMove | HitTestRequest::kReadOnly | HitTestRequest request(HitTestRequest::kMove | HitTestRequest::kReadOnly |
HitTestRequest::kAllowChildFrameContent); HitTestRequest::kAllowChildFrameContent);
HitTestLocation location(document_->View()->DocumentToFrame(document_point)); HitTestLocation location(document->View()->DocumentToFrame(document_point));
HitTestResult result(request, location); HitTestResult result(request, location);
document_->GetFrame()->ContentLayoutObject()->HitTest(location, result); document->GetFrame()->ContentLayoutObject()->HitTest(location, result);
if (!include_user_agent_shadow_dom) if (!include_user_agent_shadow_dom)
result.SetToShadowHostIfInRestrictedShadowRoot(); result.SetToShadowHostIfInRestrictedShadowRoot();
Node* node = result.InnerPossiblyPseudoNode(); Node* node = result.InnerPossiblyPseudoNode();
...@@ -1338,7 +1334,13 @@ Response InspectorDOMAgent::getNodeForLocation( ...@@ -1338,7 +1334,13 @@ Response InspectorDOMAgent::getNodeForLocation(
node = node->parentNode(); node = node->parentNode();
if (!node) if (!node)
return Response::Error("No node found at given location"); return Response::Error("No node found at given location");
*node_id = PushNodePathToFrontend(node); *backend_node_id = DOMNodeIds::IdForNode(node);
if (enabled_.Get()) {
Response response = PushDocumentUponHandlelessOperation();
if (!response.isSuccess())
return response;
*node_id = PushNodePathToFrontend(node);
}
return Response::OK(); return Response::OK();
} }
...@@ -2143,6 +2145,11 @@ Response InspectorDOMAgent::pushNodesByBackendIdsToFrontend( ...@@ -2143,6 +2145,11 @@ Response InspectorDOMAgent::pushNodesByBackendIdsToFrontend(
std::unique_ptr<protocol::Array<int>>* result) { std::unique_ptr<protocol::Array<int>>* result) {
if (!enabled_.Get()) if (!enabled_.Get())
return Response::Error("DOM agent is not enabled"); return Response::Error("DOM agent is not enabled");
Response response = PushDocumentUponHandlelessOperation();
if (!response.isSuccess())
return response;
*result = protocol::Array<int>::create(); *result = protocol::Array<int>::create();
for (size_t index = 0; index < backend_node_ids->length(); ++index) { for (size_t index = 0; index < backend_node_ids->length(); ++index) {
Node* node = DOMNodeIds::NodeForId(backend_node_ids->get(index)); Node* node = DOMNodeIds::NodeForId(backend_node_ids->get(index));
......
...@@ -200,7 +200,8 @@ class CORE_EXPORT InspectorDOMAgent final ...@@ -200,7 +200,8 @@ class CORE_EXPORT InspectorDOMAgent final
int x, int x,
int y, int y,
protocol::Maybe<bool> include_user_agent_shadow_dom, protocol::Maybe<bool> include_user_agent_shadow_dom,
int* out_node_id) override; int* backend_node_id,
protocol::Maybe<int>* node_id) override;
protocol::Response getRelayoutBoundary(int node_id, protocol::Response getRelayoutBoundary(int node_id,
int* out_node_id) override; int* out_node_id) override;
protocol::Response describeNode( protocol::Response describeNode(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment