blob: 6e60c65f2a09053c795603603d14b494ea44fc8e [file] [log] [blame]
<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<script>
function moveNode()
{
var targetElement = document.getElementById("target_element");
targetElement.addEventListener("DOMNodeRemoved", function() {
targetElement.removeEventListener("DOMNodeRemoved", arguments.callee);
document.getElementById("final_container").appendChild(this);
});
// Remove all the children inside parent container, including "#target_element".
var parentContainer = document.getElementById("parent_container");
parentContainer.textContent = "Parent container is now empty";
}
function test()
{
var nodesById = {};
InspectorProtocol.eventHandler["DOM.setChildNodes"] = onSetChildNodes;
InspectorProtocol.eventHandler["DOM.childNodeRemoved"] = onChildNodeRemoved;
InspectorProtocol.eventHandler["DOM.childNodeInserted"] = onChildNodeInserted;
function createNodeAttributesMap(attributes)
{
var attributesMap = {};
for (var i = 0; i < attributes.length; i += 2)
attributesMap[attributes[i]] = attributes[i + 1];
return attributesMap;
}
function collectNode(node)
{
if (node.nodeType === 1)
node.attributes = createNodeAttributesMap(node.attributes);
if (node.children)
node.children.forEach(collectNode);
nodesById[node.nodeId] = node;
}
function nodeToString(node)
{
switch (node.nodeType) {
case 1:
return node.localName + "#" + node.attributes.id;
case 3:
return "<text node " + JSON.stringify(node.nodeValue) + ">";
default:
return "<nodeType " + node.nodeType + ">";
}
}
function getNodeIdentifier(nodeId)
{
if (!nodeId)
return "<invalid node id>";
var node = nodesById[nodeId];
return node ? nodeToString(node) : "<unknown node>";
}
function onSetChildNodes(response)
{
response.params.nodes.forEach(collectNode);
}
function onChildNodeRemoved(response)
{
var nodeId = response.params.nodeId;
ProtocolTest.log("Removing node " + getNodeIdentifier(nodeId));
delete nodesById[nodeId];
}
function onChildNodeInserted(response)
{
collectNode(response.params.node);
ProtocolTest.log("Inserting node " + getNodeIdentifier(response.params.node.nodeId) + " into " + getNodeIdentifier(response.params.parentNodeId));
}
InspectorProtocol.sendCommand("DOM.getDocument", {}, onGotDocument);
function onGotDocument(msg)
{
InspectorProtocol.checkForError(msg);
InspectorProtocol.sendCommand("DOM.querySelectorAll", {"nodeId": msg.result.root.nodeId, "selector": "#parent_container,#final_container"}, onQuerySelectorAll);
}
function onQuerySelectorAll(response)
{
// Make sure we receive the children of the "#final_container" as they are added.
for (var i = 0; i < response.result.nodeIds.length; ++i)
InspectorProtocol.sendCommand("DOM.requestChildNodes", {nodeId: response.result.nodeIds[i]});
InspectorProtocol.sendCommand("Runtime.evaluate", {"expression": "moveNode()"}, function() {
ProtocolTest.completeTest();
});
}
}
</script>
</head>
<body onload="runTest()">
<p>Testing that DOM.childNodeRemoved is correctly triggered when all the parent children of a node are removed at once.</p>
<div id="parent_container">
<div id="before">FAIL: Element "#before" should be removed</div>
<div id="target_element">Target element</div>
<div id="after">FAIL: Element "#after" should be removed</div>
</div>
<p id="final_container">Target element should have been moved after this line:</p>
</body>
</html>