blob: 8b4251f52003896d97bf894024797e7b1fee6ec1 [file] [log] [blame]
(async function(testRunner) {
testRunner.log('Tests that one session receives DOM notifications when the other modifies the DOM.');
var page = await testRunner.createPage();
await page.loadHTML(`<div id='test' attr='value'>textContent</div>`);
async function connect(name) {
var session = await page.createSession();
session.nodes = new Map();
await session.protocol.DOM.enable();
session.protocol.DOM.onSetChildNodes(event => setNodes(event.params.nodes));
session.protocol.DOM.onAttributeModified(event => {
var node = session.nodes.get(event.params.nodeId);
testRunner.log(`Attribute modified in ${name}: ${node.nodeName}[${event.params.name}=${event.params.value}]`);
});
session.protocol.DOM.onAttributeRemoved(event => {
var node = session.nodes.get(event.params.nodeId);
testRunner.log(`Attribute removed in ${name}: ${node.nodeName}[${event.params.name}]`);
});
session.protocol.DOM.onChildNodeRemoved(event => {
var node = session.nodes.get(event.params.nodeId);
testRunner.log(`Node removed in ${name}: ${node.nodeName}`);
});
session.protocol.DOM.onChildNodeInserted(event => {
var node = event.params.node;
session.nodes.set(node.nodeId, node);
testRunner.log(`Node inserted in ${name}: ${node.nodeName}`);
});
session.doc = (await session.protocol.DOM.getDocument()).result.root;
session.nodes.set(session.doc.nodeId, session.doc);
var divId = (await session.protocol.DOM.querySelector({nodeId: session.doc.nodeId, selector: '#test'})).result.nodeId;
session.div = session.nodes.get(divId);
return session;
function setNodes(nodes) {
for (var node of nodes) {
session.nodes.set(node.nodeId, node);
if (node.children)
setNodes(node.children);
}
}
}
var session1 = await connect(1);
var session2 = await connect(2);
testRunner.log('\nModifying attribute value in 1');
await session1.protocol.DOM.setAttributeValue({nodeId: session1.div.nodeId, name: 'attr', value: 'newValue'});
testRunner.log('\nRemoving attribute in 2');
await session2.protocol.DOM.markUndoableState();
await session2.protocol.DOM.removeAttribute({nodeId: session2.div.nodeId, name: 'attr'});
testRunner.log('\nRemoving node in 1');
await session1.protocol.DOM.markUndoableState();
await session1.protocol.DOM.removeNode({nodeId: session1.div.nodeId});
testRunner.log('\nUndoing node removal in 1');
await session1.protocol.DOM.undo();
testRunner.log('\nUndoing attribute removal in 2');
await session2.protocol.DOM.undo();
testRunner.completeTest();
})