Commit d68d3b55 authored by Eric Seckler's avatar Eric Seckler Committed by Commit Bot

[devtools] Allow resolving node objects by backend id.

DOMSnapshot domain users (primarily automation users) don't receive
nodeIds, only backendNodeIds. Still, they'd like to interact with
node objects via JS.

Bug: 546953
Change-Id: Idbce383d9b264038b737bc316620fd308e839510
Reviewed-on: https://chromium-review.googlesource.com/559390
Commit-Queue: Eric Seckler <eseckler@chromium.org>
Reviewed-by: default avatarPavel Feldman <pfeldman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#485242}
parent 9368016f
Tests that DOM.resolveNode accepts a nodeId or backendNodeId.
description: #document
description: #document
(async function(testRunner) {
var {page, session, dp} = await testRunner.startHTML(
'', 'Tests that DOM.resolveNode accepts a nodeId or backendNodeId.');
dp.DOM.enable();
var response = await dp.DOM.getDocument({depth: 0});
if (!response.result)
testRunner.log(JSON.stringify(response));
var nodeId = response.result.root.nodeId;
var backendNodeId = response.result.root.backendNodeId;
response = await dp.DOM.resolveNode({nodeId: nodeId});
if (!response.result || !response.result.object.description)
testRunner.log(JSON.stringify(response));
testRunner.log("description: " + response.result.object.description);
response = await dp.DOM.resolveNode({backendNodeId: backendNodeId});
if (!response.result || !response.result.object.description)
testRunner.log(JSON.stringify(response));
testRunner.log("description: " + response.result.object.description);
testRunner.completeTest();
})
...@@ -1283,12 +1283,22 @@ Response InspectorDOMAgent::getNodeForLocation( ...@@ -1283,12 +1283,22 @@ Response InspectorDOMAgent::getNodeForLocation(
} }
Response InspectorDOMAgent::resolveNode( Response InspectorDOMAgent::resolveNode(
int node_id, protocol::Maybe<int> node_id,
protocol::Maybe<int> backend_node_id,
Maybe<String> object_group, Maybe<String> object_group,
std::unique_ptr<v8_inspector::protocol::Runtime::API::RemoteObject>* std::unique_ptr<v8_inspector::protocol::Runtime::API::RemoteObject>*
result) { result) {
String object_group_name = object_group.fromMaybe(""); String object_group_name = object_group.fromMaybe("");
Node* node = NodeForId(node_id); Node* node = nullptr;
if (node_id.isJust() == backend_node_id.isJust())
return Response::Error("Either nodeId or backendNodeId must be specified.");
if (node_id.isJust())
node = NodeForId(node_id.fromJust());
else
node = DOMNodeIds::NodeForId(backend_node_id.fromJust());
if (!node) if (!node)
return Response::Error("No node with given id found"); return Response::Error("No node with given id found");
*result = ResolveNode(node, object_group_name); *result = ResolveNode(node, object_group_name);
......
...@@ -153,7 +153,8 @@ class CORE_EXPORT InspectorDOMAgent final ...@@ -153,7 +153,8 @@ class CORE_EXPORT InspectorDOMAgent final
std::unique_ptr<protocol::Array<int>>* node_ids) override; std::unique_ptr<protocol::Array<int>>* node_ids) override;
protocol::Response setInspectedNode(int node_id) override; protocol::Response setInspectedNode(int node_id) override;
protocol::Response resolveNode( protocol::Response resolveNode(
int node_id, protocol::Maybe<int> node_id,
protocol::Maybe<int> backend_node_id,
protocol::Maybe<String> object_group, protocol::Maybe<String> object_group,
std::unique_ptr<v8_inspector::protocol::Runtime::API::RemoteObject>*) std::unique_ptr<v8_inspector::protocol::Runtime::API::RemoteObject>*)
override; override;
......
...@@ -2637,13 +2637,14 @@ ...@@ -2637,13 +2637,14 @@
{ {
"name": "resolveNode", "name": "resolveNode",
"parameters": [ "parameters": [
{ "name": "nodeId", "$ref": "NodeId", "description": "Id of the node to resolve." }, { "name": "nodeId", "$ref": "NodeId", "optional": true, "description": "Id of the node to resolve." },
{ "name": "backendNodeId", "$ref": "DOM.BackendNodeId", "optional": true, "description": "Backend identifier of the node to resolve." },
{ "name": "objectGroup", "type": "string", "optional": true, "description": "Symbolic group name that can be used to release multiple objects." } { "name": "objectGroup", "type": "string", "optional": true, "description": "Symbolic group name that can be used to release multiple objects." }
], ],
"returns": [ "returns": [
{ "name": "object", "$ref": "Runtime.RemoteObject", "description": "JavaScript object wrapper for given node." } { "name": "object", "$ref": "Runtime.RemoteObject", "description": "JavaScript object wrapper for given node." }
], ],
"description": "Resolves JavaScript node object for given node id." "description": "Resolves the JavaScript node object for a given NodeId or BackendNodeId."
}, },
{ {
"name": "getAttributes", "name": "getAttributes",
......
...@@ -866,7 +866,7 @@ SDK.DOMNode = class { ...@@ -866,7 +866,7 @@ SDK.DOMNode = class {
* @return {!Promise<?SDK.RemoteObject>} * @return {!Promise<?SDK.RemoteObject>}
*/ */
async resolveToObject(objectGroup) { async resolveToObject(objectGroup) {
var object = await this._agent.resolveNode(this.id, objectGroup); var object = await this._agent.resolveNode(this.id, undefined, objectGroup);
return object && this._domModel._runtimeModel.createRemoteObject(object); return object && this._domModel._runtimeModel.createRemoteObject(object);
} }
......
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