Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
/* Any copyright is dedicated to the Public Domain.
"use strict";
// Tests for menuitem functionality that doesn't fit into any specific category
const TEST_URL = URL_ROOT + "doc_inspector_menu.html";
add_task(async function () {
const { inspector, toolbox } = await openInspectorForURL(TEST_URL);
await testShowDOMProperties();
await testDuplicateNode();
await testDeleteNode();
await testDeleteTextNode();
await testDeleteRootNode();
await testScrollIntoView();
async function testDuplicateNode() {
info("Testing 'Duplicate Node' menu item for normal elements.");
await selectNode(".duplicate", inspector);
is(
await getNumberOfMatchingElementsInContentPage(".duplicate"),
1,
"There should initially be 1 .duplicate node"
);
const allMenuItems = openContextMenuAndGetAllItems(inspector);
const menuItem = allMenuItems.find(
item => item.id === "node-menu-duplicatenode"
);
ok(menuItem, "'Duplicate node' menu item should exist");
info("Triggering 'Duplicate Node' and waiting for inspector to update");
const updated = inspector.once("markupmutation");
menuItem.click();
await updated;
is(
await getNumberOfMatchingElementsInContentPage(".duplicate"),
2,
"The duplicated node should be in the markup."
);
const container = await getContainerForSelector(
".duplicate + .duplicate",
inspector
);
ok(container, "A MarkupContainer should be created for the new node");
}
async function testDeleteNode() {
info("Testing 'Delete Node' menu item for normal elements.");
await selectNode("#delete", inspector);
const allMenuItems = openContextMenuAndGetAllItems(inspector);
const deleteNode = allMenuItems.find(
item => item.id === "node-menu-delete"
);
ok(deleteNode, "the popup menu has a delete menu item");
const updated = inspector.once("inspector-updated");
info("Triggering 'Delete Node' and waiting for inspector to update");
deleteNode.click();
await updated;
ok(!(await hasMatchingElementInContentPage("#delete")), "Node deleted");
}
async function testDeleteTextNode() {
info("Testing 'Delete Node' menu item for text elements.");
const { walker } = inspector;
const divBefore = await walker.querySelector(
walker.rootNode,
"#nestedHiddenElement"
);
const { nodes } = await walker.children(divBefore);
await selectNode(nodes[0], inspector, "test-highlight");
const allMenuItems = openContextMenuAndGetAllItems(inspector);
const deleteNode = allMenuItems.find(
item => item.id === "node-menu-delete"
);
ok(deleteNode, "the popup menu has a delete menu item");
ok(!deleteNode.disabled, "the delete menu item is not disabled");
const updated = inspector.once("inspector-updated");
info("Triggering 'Delete Node' and waiting for inspector to update");
deleteNode.click();
await updated;
const divAfter = await walker.querySelector(
walker.rootNode,
"#nestedHiddenElement"
);
const nodesAfter = (await walker.children(divAfter)).nodes;
ok(!nodesAfter.length, "the node still had children");
}
async function testDeleteRootNode() {
info("Testing 'Delete Node' menu item does not delete root node.");
await selectNode("html", inspector);
const allMenuItems = openContextMenuAndGetAllItems(inspector);
const deleteNode = allMenuItems.find(
item => item.id === "node-menu-delete"
);
deleteNode.click();
await new Promise(resolve => {
executeSoon(resolve);
});
const hasDocumentElement = await SpecialPowers.spawn(
gBrowser.selectedBrowser,
[],
() => !!content.document.documentElement
);
ok(hasDocumentElement, "Document element still alive.");
}
async function testShowDOMProperties() {
info("Testing 'Show DOM Properties' menu item.");
const allMenuItems = openContextMenuAndGetAllItems(inspector);
const showDOMPropertiesNode = allMenuItems.find(
item => item.id === "node-menu-showdomproperties"
);
ok(showDOMPropertiesNode, "the popup menu has a show dom properties item");
const consoleOpened = toolbox.once("webconsole-ready");
info("Triggering 'Show DOM Properties' and waiting for inspector open");
showDOMPropertiesNode.click();
await consoleOpened;
const webconsoleUI = toolbox.getPanel("webconsole").hud.ui;
await poll(
() => {
const messages = [
...webconsoleUI.outputNode.querySelectorAll(".message"),
];
const nodeMessage = messages.find(m => m.textContent.includes("body"));
// wait for the object to be expanded
return (
nodeMessage &&
nodeMessage.querySelectorAll(".object-inspector .node").length > 10
);
},
"Waiting for the element node to be expanded",
10,
1000
);
info("Close split console");
await toolbox.toggleSplitConsole();
}
function testScrollIntoView() {
todo(false, "Verify that node is scrolled into the viewport.");
}
});