/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; // Test "Copy color" item of the context menu #1: Test _isColorPopup. const TEST_URI = `
Test "Copy color" context menu option
`; add_task(function* () { // Test is slow on Linux EC2 instances - Bug 1137765 requestLongerTimeout(2); yield addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI)); let {inspector} = yield openInspector(); yield testView("ruleview", inspector); yield testView("computedview", inspector); }); function* testView(viewId, inspector) { info("Testing " + viewId); yield inspector.sidebar.select(viewId); let view = inspector[viewId].view || inspector[viewId].computedView; yield selectNode("div", inspector); testIsColorValueNode(view); testIsColorPopupOnAllNodes(view); yield clearCurrentNodeSelection(inspector); } /** * A function testing that isColorValueNode correctly detects nodes part of * color values. */ function testIsColorValueNode(view) { info("Testing that child nodes of color nodes are detected."); let root = rootElement(view); let colorNode = root.querySelector("span[data-color]"); ok(colorNode, "Color node found"); for (let node of iterateNodes(colorNode)) { ok(isColorValueNode(node), "Node is part of color value."); } } /** * A function testing that _isColorPopup returns a correct value for all nodes * in the view. */ function testIsColorPopupOnAllNodes(view) { let root = rootElement(view); for (let node of iterateNodes(root)) { testIsColorPopupOnNode(view, node); } } /** * Test result of _isColorPopup with given node. * @param object view * A CSSRuleView or CssComputedView instance. * @param Node node * A node to check. */ function testIsColorPopupOnNode(view, node) { info("Testing node " + node); view.styleDocument.popupNode = node; view._contextmenu._colorToCopy = ""; let result = view._contextmenu._isColorPopup(); let correct = isColorValueNode(node); is(result, correct, "_isColorPopup returned the expected value " + correct); is(view._contextmenu._colorToCopy, (correct) ? "rgb(18, 58, 188)" : "", "_colorToCopy was set to the expected value"); } /** * Check if a node is part of color value i.e. it has parent with a 'data-color' * attribute. */ function isColorValueNode(node) { let container = (node.nodeType == node.TEXT_NODE) ? node.parentElement : node; let isColorNode = el => el.dataset && "color" in el.dataset; while (!isColorNode(container)) { container = container.parentNode; if (!container) { info("No color. Node is not part of color value."); return false; } } info("Found a color. Node is part of color value."); return true; } /** * A generator that iterates recursively trough all child nodes of baseNode. */ function* iterateNodes(baseNode) { yield baseNode; for (let child of baseNode.childNodes) { yield* iterateNodes(child); } } /** * Returns the root element for the given view, rule or computed. */ var rootElement = view => (view.element) ? view.element : view.styleDocument;