(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();
})
