/* 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 image nodes have the "copy data-uri" contextual menu item enabled // and that clicking it puts the image data into the clipboard const PAGE_CONTENT = [ '
', '', '' ].join("\n"); add_task(function*() { yield addTab("data:text/html,markup view copy image as data-uri"); createDocument(); let doc = content.document; let {inspector} = yield openInspector(); yield selectNode("div", inspector); yield assertCopyImageDataNotAvailable(inspector); yield selectNode("img", inspector); yield assertCopyImageDataAvailable(inspector); yield triggerCopyImageUrlAndWaitForClipboard(doc.querySelector("img").src, inspector); yield selectNode("canvas", inspector); yield assertCopyImageDataAvailable(inspector); let canvas = doc.querySelector(".canvas"); yield triggerCopyImageUrlAndWaitForClipboard(canvas.toDataURL(), inspector); // Check again that the menu isn't available on the DIV (to make sure our // menu updating mechanism works) yield selectNode("div", inspector); yield assertCopyImageDataNotAvailable(inspector); }); function createDocument() { let doc = content.document; doc.body.innerHTML = PAGE_CONTENT; let context = doc.querySelector(".canvas").getContext("2d"); context.beginPath(); context.moveTo(300, 0); context.lineTo(600, 600); context.lineTo(0, 600); context.closePath(); context.fillStyle = "#ffc821"; context.fill(); } function assertCopyImageDataNotAvailable(inspector) { return openNodeMenu(inspector).then(menu => { let item = menu.getElementsByAttribute("id", "node-menu-copyimagedatauri")[0]; ok(item, "The menu item was found in the contextual menu"); is(item.getAttribute("disabled"), "true", "The menu item is disabled"); }).then(() => closeNodeMenu(inspector)); } function assertCopyImageDataAvailable(inspector) { return openNodeMenu(inspector).then(menu => { let item = menu.getElementsByAttribute("id", "node-menu-copyimagedatauri")[0]; ok(item, "The menu item was found in the contextual menu"); is(item.getAttribute("disabled"), "", "The menu item is enabled"); }).then(() => closeNodeMenu(inspector)); } function openNodeMenu(inspector) { let def = promise.defer(); inspector.nodemenu.addEventListener("popupshown", function onOpen() { inspector.nodemenu.removeEventListener("popupshown", onOpen, false); def.resolve(inspector.nodemenu); }, false); inspector.nodemenu.hidden = false; inspector.nodemenu.openPopup(); return def.promise; } function closeNodeMenu(inspector) { let def = promise.defer(); inspector.nodemenu.addEventListener("popuphidden", function onClose() { inspector.nodemenu.removeEventListener("popuphidden", onClose, false); def.resolve(inspector.nodemenu); }, false); inspector.nodemenu.hidden = true; inspector.nodemenu.hidePopup(); return def.promise; } function triggerCopyImageUrlAndWaitForClipboard(expected, inspector) { let def = promise.defer(); SimpleTest.waitForClipboard(expected, () => { inspector.markup.getContainer(inspector.selection.nodeFront).copyImageDataUri(); }, () => { ok(true, "The clipboard contains the expected value " + expected.substring(0, 50) + "..."); def.resolve(); }, () => { ok(false, "The clipboard doesn't contain the expected value " + expected.substring(0, 50) + "..."); def.resolve(); }); return def.promise; }