/* vim: set ts=2 et sw=2 tw=80: */ /* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; // Tests that various mutations to the dom update the markup view correctly. const TEST_URL = TEST_URL_ROOT + "doc_markup_mutation.html"; // Mutation tests. Each entry in the array has the following properties: // - desc: for logging only // - numMutations: how many mutations are expected to come happen due to the // test case. Defaults to 1 if not set. // - test: a function supposed to mutate the DOM // - check: a function supposed to test that the mutation was handled const TEST_DATA = [ { desc: "Adding an attribute", test: () => { let node1 = getNode("#node1"); node1.setAttribute("newattr", "newattrval"); }, check: function*(inspector) { let {editor} = yield getContainerForSelector("#node1", inspector); ok([...editor.attrList.querySelectorAll(".attreditor")].some(attr => { return attr.textContent.trim() === "newattr=\"newattrval\""; }), "newattr attribute found"); } }, { desc: "Removing an attribute", test: () => { let node1 = getNode("#node1"); node1.removeAttribute("newattr"); }, check: function*(inspector) { let {editor} = yield getContainerForSelector("#node1", inspector); ok(![...editor.attrList.querySelectorAll(".attreditor")].some(attr => { return attr.textContent.trim() === "newattr=\"newattrval\""; }), "newattr attribute removed"); } }, { desc: "Re-adding an attribute", test: () => { let node1 = getNode("#node1"); node1.setAttribute("newattr", "newattrval"); }, check: function*(inspector) { let {editor} = yield getContainerForSelector("#node1", inspector); ok([...editor.attrList.querySelectorAll(".attreditor")].some(attr => { return attr.textContent.trim() === "newattr=\"newattrval\""; }), "newattr attribute found"); } }, { desc: "Changing an attribute", test: () => { let node1 = getNode("#node1"); node1.setAttribute("newattr", "newattrchanged"); }, check: function*(inspector) { let {editor} = yield getContainerForSelector("#node1", inspector); ok([...editor.attrList.querySelectorAll(".attreditor")].some(attr => { return attr.textContent.trim() === "newattr=\"newattrchanged\""; }), "newattr attribute found"); } }, { desc: "Adding ::after element", numMutations: 2, test: () => { let node1 = getNode("#node1"); node1.classList.add("pseudo"); }, check: function*(inspector) { let {children} = yield getContainerForSelector("#node1", inspector); is(children.childNodes.length, 2, "Node1 now has 2 children (text child and ::after"); } }, { desc: "Removing ::after element", numMutations: 2, test: () => { let node1 = getNode("#node1"); node1.classList.remove("pseudo"); }, check: function*(inspector) { let container = yield getContainerForSelector("#node1", inspector); ok(container.singleTextChild, "Has single text child."); } }, { desc: "Updating the text-content", test: () => { let node1 = getNode("#node1"); node1.textContent = "newtext"; }, check: function*(inspector) { let container = yield getContainerForSelector("#node1", inspector); ok(container.singleTextChild, "Has single text child."); ok(!container.canExpand, "Can't expand container with singleTextChild."); ok(!container.singleTextChild.canExpand, "Can't expand singleTextChild."); is(container.editor.elt.querySelector(".text").textContent.trim(), "newtext", "Single text child editor updated."); } }, { desc: "Adding a second text child", test: () => { let node1 = getNode("#node1"); let newText = node1.ownerDocument.createTextNode("more"); node1.appendChild(newText); }, check: function*(inspector) { let container = yield getContainerForSelector("#node1", inspector); ok(!container.singleTextChild, "Does not have single text child."); ok(container.canExpand, "Can expand container with child nodes."); ok(container.editor.elt.querySelector(".text") == null, "Single text child editor removed."); }, }, { desc: "Go from 2 to 1 text child", test: () => { let node1 = getNode("#node1"); node1.textContent = "newtext"; }, check: function*(inspector) { let container = yield getContainerForSelector("#node1", inspector); ok(container.singleTextChild, "Has single text child."); ok(!container.canExpand, "Can't expand container with singleTextChild."); ok(!container.singleTextChild.canExpand, "Can't expand singleTextChild."); ok(container.editor.elt.querySelector(".text").textContent.trim(), "newtext", "Single text child editor updated."); }, }, { desc: "Removing an only text child", test: () => { let node1 = getNode("#node1"); node1.innerHTML = ""; }, check: function*(inspector) { let container = yield getContainerForSelector("#node1", inspector); ok(!container.singleTextChild, "Does not have single text child."); ok(!container.canExpand, "Can't expand empty container."); ok(container.editor.elt.querySelector(".text") == null, "Single text child editor removed."); }, }, { desc: "Go from 0 to 1 text child", test: () => { let node1 = getNode("#node1"); node1.textContent = "newtext"; }, check: function*(inspector) { let container = yield getContainerForSelector("#node1", inspector); ok(container.singleTextChild, "Has single text child."); ok(!container.canExpand, "Can't expand container with singleTextChild."); ok(!container.singleTextChild.canExpand, "Can't expand singleTextChild."); ok(container.editor.elt.querySelector(".text").textContent.trim(), "newtext", "Single text child editor updated."); }, }, { desc: "Updating the innerHTML", test: () => { let node2 = getNode("#node2"); node2.innerHTML = "