/* 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"; // Test that context menu items are enabled / disabled correctly. const TEST_URL = TEST_URL_ROOT + "doc_inspector_menu.html"; const PASTE_MENU_ITEMS = [ "node-menu-pasteinnerhtml", "node-menu-pasteouterhtml", "node-menu-pastebefore", "node-menu-pasteafter", "node-menu-pastefirstchild", "node-menu-pastelastchild", ]; const ALL_MENU_ITEMS = [ "node-menu-edithtml", "node-menu-copyinner", "node-menu-copyouter", "node-menu-copyuniqueselector", "node-menu-copyimagedatauri", "node-menu-showdomproperties", "node-menu-delete", "node-menu-pseudo-hover", "node-menu-pseudo-active", "node-menu-pseudo-focus" ].concat(PASTE_MENU_ITEMS); const ITEMS_WITHOUT_SHOWDOMPROPS = ALL_MENU_ITEMS.filter(item => item != "node-menu-showdomproperties"); const TEST_CASES = [ { desc: "doctype node with empty clipboard", selector: null, disabled: ITEMS_WITHOUT_SHOWDOMPROPS, }, { desc: "doctype node with html on clipboard", clipboardData: "

some text

", clipboardDataType: "html", selector: null, disabled: ITEMS_WITHOUT_SHOWDOMPROPS, }, { desc: "element node HTML on the clipboard", clipboardData: "

some text

", clipboardDataType: "html", disabled: ["node-menu-copyimagedatauri"], selector: "#sensitivity", }, { desc: " element", clipboardData: "

some text

", clipboardDataType: "html", selector: "html", disabled: [ "node-menu-copyimagedatauri", "node-menu-pastebefore", "node-menu-pasteafter", "node-menu-pastefirstchild", "node-menu-pastelastchild", ], }, { desc: " with HTML on clipboard", clipboardData: "

some text

", clipboardDataType: "html", selector: "body", disabled: [ "node-menu-copyimagedatauri", "node-menu-pastebefore", "node-menu-pasteafter", ] }, { desc: " with HTML on clipboard", clipboardData: "

some text

", clipboardDataType: "html", selector: "img", disabled: [] }, { desc: " with HTML on clipboard", clipboardData: "

some text

", clipboardDataType: "html", selector: "head", disabled: [ "node-menu-copyimagedatauri", "node-menu-pastebefore", "node-menu-pasteafter", ] }, { desc: " with text on clipboard", clipboardData: "some text", clipboardDataType: undefined, selector: "#paste-area", disabled: ["node-menu-copyimagedatauri"], }, { desc: " with base64 encoded image data uri on clipboard", clipboardData: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABC" + "AAAAAA6fptVAAAACklEQVQYV2P4DwABAQEAWk1v8QAAAABJRU5ErkJggg==", clipboardDataType: undefined, selector: "#paste-area", disabled: PASTE_MENU_ITEMS.concat(["node-menu-copyimagedatauri"]), }, { desc: " with empty string on clipboard", clipboardData: "", clipboardDataType: undefined, selector: "#paste-area", disabled: PASTE_MENU_ITEMS.concat(["node-menu-copyimagedatauri"]), }, { desc: " with whitespace only on clipboard", clipboardData: " \n\n\t\n\n \n", clipboardDataType: undefined, selector: "#paste-area", disabled: PASTE_MENU_ITEMS.concat(["node-menu-copyimagedatauri"]), }, ]; let clipboard = require("sdk/clipboard"); registerCleanupFunction(() => { clipboard = null; }); add_task(function *() { let { inspector } = yield openInspectorForURL(TEST_URL); for (let test of TEST_CASES) { let { desc, disabled, selector } = test; info(`Test ${desc}`); setupClipboard(test.clipboardData, test.clipboardDataType); let front = yield getNodeFrontForSelector(selector, inspector); info("Selecting the specified node."); yield selectNode(front, inspector); info("Simulating context menu click on the selected node container."); contextMenuClick(getContainerForNodeFront(front, inspector).tagLine); for (let menuitem of ALL_MENU_ITEMS) { let elt = inspector.panelDoc.getElementById(menuitem); let shouldBeDisabled = disabled.indexOf(menuitem) !== -1; let isDisabled = elt.hasAttribute("disabled"); is(isDisabled, shouldBeDisabled, `#${menuitem} should be ${shouldBeDisabled ? "disabled" : "enabled"} `); } } }); /** * A helper that fetches a front for a node that matches the given selector or * doctype node if the selector is falsy. */ function* getNodeFrontForSelector(selector, inspector) { if (selector) { info("Retrieving front for selector " + selector); return getNodeFront(selector, inspector); } else { info("Retrieving front for doctype node"); let {nodes} = yield inspector.walker.children(inspector.walker.rootNode); return nodes[0]; } } /** * A helper that populates the clipboard with data of given type. Clears the * clipboard if data is falsy. */ function setupClipboard(data, type) { if (data) { info("Populating clipboard with " + type + " data."); clipboard.set(data, type); } else { info("Clearing clipboard."); clipboard.set("", "text"); } } /** * A helper that simulates a contextmenu event on the given chrome DOM element. */ function contextMenuClick(element) { let evt = element.ownerDocument.createEvent('MouseEvents'); let button = 2; // right click evt.initMouseEvent('contextmenu', true, true, element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, false, false, false, button, null); element.dispatchEvent(evt); }