1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/devtools/inspector/test/browser_inspector_menu.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,171 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 +http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 + 1.8 +function test() { 1.9 + 1.10 + waitForExplicitFinish(); 1.11 + 1.12 + let doc; 1.13 + let inspector; 1.14 + 1.15 + gBrowser.selectedTab = gBrowser.addTab(); 1.16 + gBrowser.selectedBrowser.addEventListener("load", function onload() { 1.17 + gBrowser.selectedBrowser.removeEventListener("load", onload, true); 1.18 + doc = content.document; 1.19 + waitForFocus(setupTest, content); 1.20 + }, true); 1.21 + 1.22 + content.location = "http://mochi.test:8888/browser/browser/devtools/" + 1.23 + "inspector/test/browser_inspector_menu.html"; 1.24 + 1.25 + function setupTest() { 1.26 + openInspector(runTests); 1.27 + } 1.28 + 1.29 + function runTests(aInspector) { 1.30 + inspector = aInspector; 1.31 + checkDocTypeMenuItems(); 1.32 + } 1.33 + 1.34 + function checkDocTypeMenuItems() { 1.35 + info("Checking context menu entries for doctype node"); 1.36 + inspector.selection.setNode(doc.doctype); 1.37 + inspector.once("inspector-updated", () => { 1.38 + let docTypeNode = getMarkupTagNodeContaining("<!DOCTYPE html>"); 1.39 + 1.40 + // Right-click doctype tag 1.41 + contextMenuClick(docTypeNode); 1.42 + 1.43 + checkDisabled("node-menu-copyinner"); 1.44 + checkDisabled("node-menu-copyouter"); 1.45 + checkDisabled("node-menu-copyuniqueselector"); 1.46 + checkDisabled("node-menu-delete"); 1.47 + 1.48 + for (let name of ["hover", "active", "focus"]) { 1.49 + checkDisabled("node-menu-pseudo-" + name); 1.50 + } 1.51 + 1.52 + checkElementMenuItems(); 1.53 + }); 1.54 + } 1.55 + 1.56 + function checkElementMenuItems() { 1.57 + info("Checking context menu entries for p tag"); 1.58 + inspector.selection.setNode(doc.querySelector("p")); 1.59 + inspector.once("inspector-updated", () => { 1.60 + let tag = getMarkupTagNodeContaining("p"); 1.61 + 1.62 + // Right-click p tag 1.63 + contextMenuClick(tag); 1.64 + 1.65 + checkEnabled("node-menu-copyinner"); 1.66 + checkEnabled("node-menu-copyouter"); 1.67 + checkEnabled("node-menu-copyuniqueselector"); 1.68 + checkEnabled("node-menu-delete"); 1.69 + 1.70 + for (let name of ["hover", "active", "focus"]) { 1.71 + checkEnabled("node-menu-pseudo-" + name); 1.72 + } 1.73 + 1.74 + testCopyInnerMenu(); 1.75 + }); 1.76 + } 1.77 + 1.78 + function testCopyInnerMenu() { 1.79 + let copyInner = inspector.panelDoc.getElementById("node-menu-copyinner"); 1.80 + ok(copyInner, "the popup menu has a copy inner html menu item"); 1.81 + 1.82 + waitForClipboard("This is some example text", 1.83 + function() { copyInner.doCommand(); }, 1.84 + testCopyOuterMenu, testCopyOuterMenu); 1.85 + } 1.86 + 1.87 + function testCopyOuterMenu() { 1.88 + let copyOuter = inspector.panelDoc.getElementById("node-menu-copyouter"); 1.89 + ok(copyOuter, "the popup menu has a copy outer html menu item"); 1.90 + 1.91 + waitForClipboard("<p>This is some example text</p>", 1.92 + function() { copyOuter.doCommand(); }, 1.93 + testCopyUniqueSelectorMenu, testCopyUniqueSelectorMenu); 1.94 + } 1.95 + 1.96 + function testCopyUniqueSelectorMenu() { 1.97 + let copyUniqueSelector = inspector.panelDoc.getElementById("node-menu-copyuniqueselector"); 1.98 + ok(copyUniqueSelector, "the popup menu has a copy unique selector menu item"); 1.99 + 1.100 + waitForClipboard("body > div:nth-child(1) > p:nth-child(2)", 1.101 + function() { copyUniqueSelector.doCommand(); }, 1.102 + testDeleteNode, testDeleteNode); 1.103 + } 1.104 + 1.105 + function testDeleteNode() { 1.106 + let deleteNode = inspector.panelDoc.getElementById("node-menu-delete"); 1.107 + ok(deleteNode, "the popup menu has a delete menu item"); 1.108 + 1.109 + inspector.once("inspector-updated", deleteTest); 1.110 + 1.111 + let commandEvent = document.createEvent("XULCommandEvent"); 1.112 + commandEvent.initCommandEvent("command", true, true, window, 0, false, false, 1.113 + false, false, null); 1.114 + deleteNode.dispatchEvent(commandEvent); 1.115 + } 1.116 + 1.117 + function deleteTest() { 1.118 + let p = doc.querySelector("P"); 1.119 + is(p, null, "node deleted"); 1.120 + 1.121 + deleteRootNode(); 1.122 + } 1.123 + 1.124 + function deleteRootNode() { 1.125 + inspector.selection.setNode(doc.documentElement); 1.126 + 1.127 + inspector.once("inspector-updated", () => { 1.128 + let deleteNode = inspector.panelDoc.getElementById("node-menu-delete"); 1.129 + let commandEvent = inspector.panelDoc.createEvent("XULCommandEvent"); 1.130 + commandEvent.initCommandEvent("command", true, true, window, 0, false, false, 1.131 + false, false, null); 1.132 + deleteNode.dispatchEvent(commandEvent); 1.133 + executeSoon(isRootStillAlive); 1.134 + }); 1.135 + } 1.136 + 1.137 + function isRootStillAlive() { 1.138 + ok(doc.documentElement, "Document element still alive."); 1.139 + gBrowser.removeCurrentTab(); 1.140 + finish(); 1.141 + } 1.142 + 1.143 + function getMarkupTagNodeContaining(text) { 1.144 + let tags = inspector._markupFrame.contentDocument.querySelectorAll("span"); 1.145 + for (let tag of tags) { 1.146 + if (tag.textContent == text) { 1.147 + return tag; 1.148 + } 1.149 + } 1.150 + } 1.151 + 1.152 + function checkEnabled(elementId) { 1.153 + let elt = inspector.panelDoc.getElementById(elementId); 1.154 + ok(!elt.hasAttribute("disabled"), 1.155 + '"' + elt.label + '" context menu option is not disabled'); 1.156 + } 1.157 + 1.158 + function checkDisabled(elementId) { 1.159 + let elt = inspector.panelDoc.getElementById(elementId); 1.160 + ok(elt.hasAttribute("disabled"), 1.161 + '"' + elt.label + '" context menu option is disabled'); 1.162 + } 1.163 + 1.164 + function contextMenuClick(element) { 1.165 + let evt = element.ownerDocument.createEvent('MouseEvents'); 1.166 + let button = 2; // right click 1.167 + 1.168 + evt.initMouseEvent('contextmenu', true, true, 1.169 + element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, 1.170 + false, false, false, button, null); 1.171 + 1.172 + element.dispatchEvent(evt); 1.173 + } 1.174 +}