blob: b1c1310ec11a0fd9658f69649d8ed14139e9bfa6 [file] [log] [blame]
(async function (testRunner) {
// Needs to successively refer to an iframe relative to the source file, so
// the test runner will launch multiple sessions against this URL.
const testUrl = 'resources/dom-request-node-test.html';
const { searchNodesByAttributeValue, searchNodesForContentDocument } =
await testRunner.loadScript('resources/dom-test-helper.js');
const { dp, page } = await testRunner.startBlank('Tests permutations of DOM.requestNode');
async function requestTargetAfterTraversal() {
// Test 1: request the targetDiv after DOM has already traversed it (no setChildNodes events)
await page.navigate(testUrl);
const setChildNodesResponses = [];
dp.DOM.onSetChildNodes((message) => setChildNodesResponses.push(message));
const documentMessage = await dp.DOM.getDocument({ depth: -1, pierce: true });
const root = documentMessage.result.root;
const targetNode = searchNodesByAttributeValue(root.children, 'targetDiv');
testRunner.log(targetNode);
const targetNodeId = targetNode.nodeId;
const evalMessage = await dp.Runtime.evaluate({ expression: `document.getElementById('targetDiv')` });
testRunner.log(evalMessage.result);
const targetRemoteObjectId = evalMessage.result.result.objectId;
const requestMessage = await dp.DOM.requestNode({ objectId: targetRemoteObjectId });
const requestedNodeId = requestMessage.result.nodeId;
testRunner.log(`requested === targeted: ${requestedNodeId === targetNodeId}`);
}
async function requestTargetBeforeTraversal() {
// Test 2: request the targetDiv before DOM has traversed it (fire setChildNodes events)
await page.navigate(testUrl);
const setChildNodesResponses = [];
dp.DOM.onSetChildNodes((message) => setChildNodesResponses.push(message));
const documentMessage = await dp.DOM.getDocument({});
const evalMessage = await dp.Runtime.evaluate({ expression: `document.getElementById('targetDiv')` });
testRunner.log(evalMessage.result);
const targetRemoteObjectId = evalMessage.result.result.objectId;
const requestMessage = await dp.DOM.requestNode({ objectId: targetRemoteObjectId });
testRunner.log(requestMessage.result);
const requestedNodeId = requestMessage.result.nodeId;
// Ensure correct setChildNodes events were fired.
for (let response of setChildNodesResponses) {
const cousinDiv = searchNodesByAttributeValue(response.params.nodes, 'cousinDiv');
if (cousinDiv) {
testRunner.fail('A DOM.setChildNodes event was fired for a non direct parent of the target div.');
break;
}
}
// Ensure the returned id matches the assigned node id
const targetDiv = searchNodesByAttributeValue(setChildNodesResponses.pop().params.nodes, 'targetDiv');
testRunner.log(targetDiv);
testRunner.log(`requested === targeted: ${requestedNodeId === targetDiv.nodeId}`);
}
async function requestNodeByObjectId() {
// Test 3: RequestNode on ObjectId that is not a node
await page.navigate(testUrl);
const setChildNodesResponses = [];
dp.DOM.onSetChildNodes((message) => setChildNodesResponses.push(message));
const evalMessage = await dp.Runtime.evaluate({ expression: 'testObject' });
testRunner.log(evalMessage.result);
const targetRemoteObjectId = evalMessage.result.result.objectId;
const requestMessage = await dp.DOM.requestNode({ objectId: targetRemoteObjectId });
testRunner.log(requestMessage.error);
}
async function requestNodeInIframeByObjectId() {
// Test 4: RequestNode on an ObjectId inside a subFrame that is not traversed yet
await page.navigate(testUrl);
const setChildNodesResponses = [];
dp.DOM.onSetChildNodes((message) => setChildNodesResponses.push(message));
const documentMessage = await dp.DOM.getDocument({ depth: -1, pierce: true });
const root = documentMessage.result.root;
// Grab a target Id from an iframe
const iframeDoc = searchNodesForContentDocument(root.children);
testRunner.log(iframeDoc);
const targetNode = searchNodesByAttributeValue(iframeDoc.children, 'class1');
testRunner.log(targetNode);
// Resolve the target nodeId to an objectId
const targetNodeId = targetNode.nodeId;
const resolvedMessage = await dp.DOM.resolveNode({ nodeId: targetNodeId });
const resolvedObjectId = resolvedMessage.result.object.objectId;
// reset the node Id tree, not traversing the iframe
await dp.DOM.getDocument();
const requestMessage = await dp.DOM.requestNode({ objectId: resolvedObjectId });
testRunner.log(requestMessage.result);
}
testRunner.runTestSuite([
requestTargetAfterTraversal,
requestTargetBeforeTraversal,
requestNodeByObjectId,
requestNodeInIframeByObjectId,
]);
})