From f34094bae31e216228d5c2da2f2461d03df38302 Mon Sep 17 00:00:00 2001 From: janekptacijarabaci Date: Fri, 2 Feb 2018 20:42:28 +0100 Subject: Add a "copy full CSS path" option to the inspector's menu Issue #3 --- devtools/server/css-logic.js | 49 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'devtools/server/css-logic.js') diff --git a/devtools/server/css-logic.js b/devtools/server/css-logic.js index f632871e1..c4a073635 100644 --- a/devtools/server/css-logic.js +++ b/devtools/server/css-logic.js @@ -792,6 +792,55 @@ CssLogic.findCssSelector = function (ele) { return selector; }; +/** + * Get the full CSS path for a given element. + * @returns a string that can be used as a CSS selector for the element. It might not + * match the element uniquely. It does however, represent the full path from the root + * node to the element. + */ +CssLogic.getCssPath = function (ele) { + ele = getRootBindingParent(ele); + const document = ele.ownerDocument; + if (!document || !document.contains(ele)) { + throw new Error("getCssPath received element not inside document"); + } + + const getElementSelector = element => { + if (!element.localName) { + return ""; + } + + let label = element.nodeName == element.nodeName.toUpperCase() + ? element.localName.toLowerCase() + : element.localName; + + if (element.id) { + label += "#" + element.id; + } + + if (element.classList) { + for (let cl of element.classList) { + label += "." + cl; + } + } + + return label; + }; + + let paths = []; + + while (ele) { + if (!ele || ele.nodeType !== Node.ELEMENT_NODE) { + break; + } + + paths.splice(0, 0, getElementSelector(ele)); + ele = ele.parentNode; + } + + return paths.length ? paths.join(" ") : ""; +} + /** * A safe way to access cached bits of information about a stylesheet. * -- cgit v1.2.3