| Index: third_party/WebKit/Source/devtools/front_end/components/DOMPresentationUtils.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/components/DOMPresentationUtils.js b/third_party/WebKit/Source/devtools/front_end/components/DOMPresentationUtils.js
|
| index f177503b3c79db844324587cb3527af85e8db132..8daa666002805cbe796a1fa04fefbc592d0bf414 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/components/DOMPresentationUtils.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/components/DOMPresentationUtils.js
|
| @@ -28,76 +28,73 @@
|
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| */
|
| -
|
| WebInspector.DOMPresentationUtils = {};
|
|
|
| /**
|
| * @param {!WebInspector.DOMNode} node
|
| * @param {!Element} parentElement
|
| */
|
| -WebInspector.DOMPresentationUtils.decorateNodeLabel = function(node, parentElement)
|
| -{
|
| - var originalNode = node;
|
| - var isPseudo = node.nodeType() === Node.ELEMENT_NODE && node.pseudoType();
|
| - if (isPseudo && node.parentNode)
|
| - node = node.parentNode;
|
| -
|
| - var title = node.nodeNameInCorrectCase();
|
| -
|
| - var nameElement = parentElement.createChild("span", "node-label-name");
|
| - nameElement.textContent = title;
|
| -
|
| - var idAttribute = node.getAttribute("id");
|
| - if (idAttribute) {
|
| - var idElement = parentElement.createChild("span", "node-label-id");
|
| - var part = "#" + idAttribute;
|
| - title += part;
|
| - idElement.createTextChild(part);
|
| -
|
| - // Mark the name as extra, since the ID is more important.
|
| - nameElement.classList.add("extra");
|
| - }
|
| -
|
| - var classAttribute = node.getAttribute("class");
|
| - if (classAttribute) {
|
| - var classes = classAttribute.split(/\s+/);
|
| - var foundClasses = {};
|
| -
|
| - if (classes.length) {
|
| - var classesElement = parentElement.createChild("span", "extra node-label-class");
|
| - for (var i = 0; i < classes.length; ++i) {
|
| - var className = classes[i];
|
| - if (className && !(className in foundClasses)) {
|
| - var part = "." + className;
|
| - title += part;
|
| - classesElement.createTextChild(part);
|
| - foundClasses[className] = true;
|
| - }
|
| - }
|
| +WebInspector.DOMPresentationUtils.decorateNodeLabel = function(node, parentElement) {
|
| + var originalNode = node;
|
| + var isPseudo = node.nodeType() === Node.ELEMENT_NODE && node.pseudoType();
|
| + if (isPseudo && node.parentNode)
|
| + node = node.parentNode;
|
| +
|
| + var title = node.nodeNameInCorrectCase();
|
| +
|
| + var nameElement = parentElement.createChild('span', 'node-label-name');
|
| + nameElement.textContent = title;
|
| +
|
| + var idAttribute = node.getAttribute('id');
|
| + if (idAttribute) {
|
| + var idElement = parentElement.createChild('span', 'node-label-id');
|
| + var part = '#' + idAttribute;
|
| + title += part;
|
| + idElement.createTextChild(part);
|
| +
|
| + // Mark the name as extra, since the ID is more important.
|
| + nameElement.classList.add('extra');
|
| + }
|
| +
|
| + var classAttribute = node.getAttribute('class');
|
| + if (classAttribute) {
|
| + var classes = classAttribute.split(/\s+/);
|
| + var foundClasses = {};
|
| +
|
| + if (classes.length) {
|
| + var classesElement = parentElement.createChild('span', 'extra node-label-class');
|
| + for (var i = 0; i < classes.length; ++i) {
|
| + var className = classes[i];
|
| + if (className && !(className in foundClasses)) {
|
| + var part = '.' + className;
|
| + title += part;
|
| + classesElement.createTextChild(part);
|
| + foundClasses[className] = true;
|
| }
|
| + }
|
| }
|
| -
|
| - if (isPseudo) {
|
| - var pseudoElement = parentElement.createChild("span", "extra node-label-pseudo");
|
| - var pseudoText = "::" + originalNode.pseudoType();
|
| - pseudoElement.createTextChild(pseudoText);
|
| - title += pseudoText;
|
| - }
|
| - parentElement.title = title;
|
| + }
|
| +
|
| + if (isPseudo) {
|
| + var pseudoElement = parentElement.createChild('span', 'extra node-label-pseudo');
|
| + var pseudoText = '::' + originalNode.pseudoType();
|
| + pseudoElement.createTextChild(pseudoText);
|
| + title += pseudoText;
|
| + }
|
| + parentElement.title = title;
|
| };
|
|
|
| /**
|
| * @param {!Element} container
|
| * @param {string} nodeTitle
|
| */
|
| -WebInspector.DOMPresentationUtils.createSpansForNodeTitle = function(container, nodeTitle)
|
| -{
|
| - var match = nodeTitle.match(/([^#.]+)(#[^.]+)?(\..*)?/);
|
| - container.createChild("span", "webkit-html-tag-name").textContent = match[1];
|
| - if (match[2])
|
| - container.createChild("span", "webkit-html-attribute-value").textContent = match[2];
|
| - if (match[3])
|
| - container.createChild("span", "webkit-html-attribute-name").textContent = match[3];
|
| +WebInspector.DOMPresentationUtils.createSpansForNodeTitle = function(container, nodeTitle) {
|
| + var match = nodeTitle.match(/([^#.]+)(#[^.]+)?(\..*)?/);
|
| + container.createChild('span', 'webkit-html-tag-name').textContent = match[1];
|
| + if (match[2])
|
| + container.createChild('span', 'webkit-html-attribute-value').textContent = match[2];
|
| + if (match[3])
|
| + container.createChild('span', 'webkit-html-attribute-name').textContent = match[3];
|
| };
|
|
|
| /**
|
| @@ -105,49 +102,46 @@ WebInspector.DOMPresentationUtils.createSpansForNodeTitle = function(container,
|
| * @param {string=} idref
|
| * @return {!Node}
|
| */
|
| -WebInspector.DOMPresentationUtils.linkifyNodeReference = function(node, idref)
|
| -{
|
| - if (!node)
|
| - return createTextNode(WebInspector.UIString("<node>"));
|
| +WebInspector.DOMPresentationUtils.linkifyNodeReference = function(node, idref) {
|
| + if (!node)
|
| + return createTextNode(WebInspector.UIString('<node>'));
|
|
|
| - var root = createElementWithClass("span", "monospace");
|
| - var shadowRoot = WebInspector.createShadowRootWithCoreStyles(root, "components/domUtils.css");
|
| - var link = shadowRoot.createChild("div", "node-link");
|
| + var root = createElementWithClass('span', 'monospace');
|
| + var shadowRoot = WebInspector.createShadowRootWithCoreStyles(root, 'components/domUtils.css');
|
| + var link = shadowRoot.createChild('div', 'node-link');
|
|
|
| - if (idref)
|
| - link.createChild("span", "node-label-id").createTextChild("#" + idref);
|
| - else
|
| - WebInspector.DOMPresentationUtils.decorateNodeLabel(node, link);
|
| + if (idref)
|
| + link.createChild('span', 'node-label-id').createTextChild('#' + idref);
|
| + else
|
| + WebInspector.DOMPresentationUtils.decorateNodeLabel(node, link);
|
|
|
| - link.addEventListener("click", WebInspector.Revealer.reveal.bind(WebInspector.Revealer, node, undefined), false);
|
| - link.addEventListener("mouseover", node.highlight.bind(node, undefined, undefined), false);
|
| - link.addEventListener("mouseleave", WebInspector.DOMModel.hideDOMNodeHighlight.bind(WebInspector.DOMModel), false);
|
| + link.addEventListener('click', WebInspector.Revealer.reveal.bind(WebInspector.Revealer, node, undefined), false);
|
| + link.addEventListener('mouseover', node.highlight.bind(node, undefined, undefined), false);
|
| + link.addEventListener('mouseleave', WebInspector.DOMModel.hideDOMNodeHighlight.bind(WebInspector.DOMModel), false);
|
|
|
| - return root;
|
| + return root;
|
| };
|
|
|
| /**
|
| * @param {!WebInspector.DeferredDOMNode} deferredNode
|
| * @return {!Node}
|
| */
|
| -WebInspector.DOMPresentationUtils.linkifyDeferredNodeReference = function(deferredNode)
|
| -{
|
| - var root = createElement("div");
|
| - var shadowRoot = WebInspector.createShadowRootWithCoreStyles(root, "components/domUtils.css");
|
| - var link = shadowRoot.createChild("div", "node-link");
|
| - link.createChild("content");
|
| - link.addEventListener("click", deferredNode.resolve.bind(deferredNode, onDeferredNodeResolved), false);
|
| - link.addEventListener("mousedown", (e) => e.consume(), false);
|
| -
|
| - /**
|
| - * @param {?WebInspector.DOMNode} node
|
| - */
|
| - function onDeferredNodeResolved(node)
|
| - {
|
| - WebInspector.Revealer.reveal(node);
|
| - }
|
| -
|
| - return root;
|
| +WebInspector.DOMPresentationUtils.linkifyDeferredNodeReference = function(deferredNode) {
|
| + var root = createElement('div');
|
| + var shadowRoot = WebInspector.createShadowRootWithCoreStyles(root, 'components/domUtils.css');
|
| + var link = shadowRoot.createChild('div', 'node-link');
|
| + link.createChild('content');
|
| + link.addEventListener('click', deferredNode.resolve.bind(deferredNode, onDeferredNodeResolved), false);
|
| + link.addEventListener('mousedown', (e) => e.consume(), false);
|
| +
|
| + /**
|
| + * @param {?WebInspector.DOMNode} node
|
| + */
|
| + function onDeferredNodeResolved(node) {
|
| + WebInspector.Revealer.reveal(node);
|
| + }
|
| +
|
| + return root;
|
| };
|
|
|
| /**
|
| @@ -157,67 +151,66 @@ WebInspector.DOMPresentationUtils.linkifyDeferredNodeReference = function(deferr
|
| * @param {function(!Element=)} userCallback
|
| * @param {!Object=} precomputedFeatures
|
| */
|
| -WebInspector.DOMPresentationUtils.buildImagePreviewContents = function(target, originalImageURL, showDimensions, userCallback, precomputedFeatures)
|
| -{
|
| - var resourceTreeModel = WebInspector.ResourceTreeModel.fromTarget(target);
|
| - if (!resourceTreeModel) {
|
| - userCallback();
|
| - return;
|
| - }
|
| - var resource = resourceTreeModel.resourceForURL(originalImageURL);
|
| - var imageURL = originalImageURL;
|
| - if (!isImageResource(resource) && precomputedFeatures && precomputedFeatures.currentSrc) {
|
| - imageURL = precomputedFeatures.currentSrc;
|
| - resource = resourceTreeModel.resourceForURL(imageURL);
|
| - }
|
| - if (!isImageResource(resource)) {
|
| - userCallback();
|
| - return;
|
| +WebInspector.DOMPresentationUtils.buildImagePreviewContents = function(
|
| + target, originalImageURL, showDimensions, userCallback, precomputedFeatures) {
|
| + var resourceTreeModel = WebInspector.ResourceTreeModel.fromTarget(target);
|
| + if (!resourceTreeModel) {
|
| + userCallback();
|
| + return;
|
| + }
|
| + var resource = resourceTreeModel.resourceForURL(originalImageURL);
|
| + var imageURL = originalImageURL;
|
| + if (!isImageResource(resource) && precomputedFeatures && precomputedFeatures.currentSrc) {
|
| + imageURL = precomputedFeatures.currentSrc;
|
| + resource = resourceTreeModel.resourceForURL(imageURL);
|
| + }
|
| + if (!isImageResource(resource)) {
|
| + userCallback();
|
| + return;
|
| + }
|
| +
|
| + var imageElement = createElement('img');
|
| + imageElement.addEventListener('load', buildContent, false);
|
| + imageElement.addEventListener('error', errorCallback, false);
|
| + resource.populateImageSource(imageElement);
|
| +
|
| + function errorCallback() {
|
| + // Drop the event parameter when invoking userCallback.
|
| + userCallback();
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.Resource} resource
|
| + * @return {boolean}
|
| + */
|
| + function isImageResource(resource) {
|
| + return !!resource && resource.resourceType() === WebInspector.resourceTypes.Image;
|
| + }
|
| +
|
| + function buildContent() {
|
| + var container = createElement('table');
|
| + container.className = 'image-preview-container';
|
| + var naturalWidth = precomputedFeatures ? precomputedFeatures.naturalWidth : imageElement.naturalWidth;
|
| + var naturalHeight = precomputedFeatures ? precomputedFeatures.naturalHeight : imageElement.naturalHeight;
|
| + var offsetWidth = precomputedFeatures ? precomputedFeatures.offsetWidth : naturalWidth;
|
| + var offsetHeight = precomputedFeatures ? precomputedFeatures.offsetHeight : naturalHeight;
|
| + var description;
|
| + if (showDimensions) {
|
| + if (offsetHeight === naturalHeight && offsetWidth === naturalWidth)
|
| + description = WebInspector.UIString('%d \xd7 %d pixels', offsetWidth, offsetHeight);
|
| + else
|
| + description = WebInspector.UIString(
|
| + '%d \xd7 %d pixels (Natural: %d \xd7 %d pixels)', offsetWidth, offsetHeight, naturalWidth, naturalHeight);
|
| }
|
|
|
| - var imageElement = createElement("img");
|
| - imageElement.addEventListener("load", buildContent, false);
|
| - imageElement.addEventListener("error", errorCallback, false);
|
| - resource.populateImageSource(imageElement);
|
| -
|
| - function errorCallback()
|
| - {
|
| - // Drop the event parameter when invoking userCallback.
|
| - userCallback();
|
| - }
|
| -
|
| - /**
|
| - * @param {?WebInspector.Resource} resource
|
| - * @return {boolean}
|
| - */
|
| - function isImageResource(resource)
|
| - {
|
| - return !!resource && resource.resourceType() === WebInspector.resourceTypes.Image;
|
| - }
|
| -
|
| - function buildContent()
|
| - {
|
| - var container = createElement("table");
|
| - container.className = "image-preview-container";
|
| - var naturalWidth = precomputedFeatures ? precomputedFeatures.naturalWidth : imageElement.naturalWidth;
|
| - var naturalHeight = precomputedFeatures ? precomputedFeatures.naturalHeight : imageElement.naturalHeight;
|
| - var offsetWidth = precomputedFeatures ? precomputedFeatures.offsetWidth : naturalWidth;
|
| - var offsetHeight = precomputedFeatures ? precomputedFeatures.offsetHeight : naturalHeight;
|
| - var description;
|
| - if (showDimensions) {
|
| - if (offsetHeight === naturalHeight && offsetWidth === naturalWidth)
|
| - description = WebInspector.UIString("%d \xd7 %d pixels", offsetWidth, offsetHeight);
|
| - else
|
| - description = WebInspector.UIString("%d \xd7 %d pixels (Natural: %d \xd7 %d pixels)", offsetWidth, offsetHeight, naturalWidth, naturalHeight);
|
| - }
|
| -
|
| - container.createChild("tr").createChild("td", "image-container").appendChild(imageElement);
|
| - if (description)
|
| - container.createChild("tr").createChild("td").createChild("span", "description").textContent = description;
|
| - if (imageURL !== originalImageURL)
|
| - container.createChild("tr").createChild("td").createChild("span", "description").textContent = String.sprintf("currentSrc: %s", imageURL.trimMiddle(100));
|
| - userCallback(container);
|
| - }
|
| + container.createChild('tr').createChild('td', 'image-container').appendChild(imageElement);
|
| + if (description)
|
| + container.createChild('tr').createChild('td').createChild('span', 'description').textContent = description;
|
| + if (imageURL !== originalImageURL)
|
| + container.createChild('tr').createChild('td').createChild('span', 'description').textContent =
|
| + String.sprintf('currentSrc: %s', imageURL.trimMiddle(100));
|
| + userCallback(container);
|
| + }
|
| };
|
|
|
| /**
|
| @@ -226,52 +219,51 @@ WebInspector.DOMPresentationUtils.buildImagePreviewContents = function(target, o
|
| * @param {!RuntimeAgent.StackTrace=} stackTrace
|
| * @return {!Element}
|
| */
|
| -WebInspector.DOMPresentationUtils.buildStackTracePreviewContents = function(target, linkifier, stackTrace)
|
| -{
|
| - var element = createElement("span");
|
| - element.style.display = "inline-block";
|
| - var shadowRoot = WebInspector.createShadowRootWithCoreStyles(element, "components/domUtils.css");
|
| - var contentElement = shadowRoot.createChild("table", "stack-preview-container");
|
| -
|
| - /**
|
| - * @param {!RuntimeAgent.StackTrace} stackTrace
|
| - */
|
| - function appendStackTrace(stackTrace)
|
| - {
|
| - for (var stackFrame of stackTrace.callFrames) {
|
| - var row = createElement("tr");
|
| - row.createChild("td").textContent = "\n";
|
| - row.createChild("td", "function-name").textContent = WebInspector.beautifyFunctionName(stackFrame.functionName);
|
| - var link = linkifier.maybeLinkifyConsoleCallFrame(target, stackFrame);
|
| - if (link) {
|
| - row.createChild("td").textContent = " @ ";
|
| - row.createChild("td").appendChild(link);
|
| - }
|
| - contentElement.appendChild(row);
|
| - }
|
| +WebInspector.DOMPresentationUtils.buildStackTracePreviewContents = function(target, linkifier, stackTrace) {
|
| + var element = createElement('span');
|
| + element.style.display = 'inline-block';
|
| + var shadowRoot = WebInspector.createShadowRootWithCoreStyles(element, 'components/domUtils.css');
|
| + var contentElement = shadowRoot.createChild('table', 'stack-preview-container');
|
| +
|
| + /**
|
| + * @param {!RuntimeAgent.StackTrace} stackTrace
|
| + */
|
| + function appendStackTrace(stackTrace) {
|
| + for (var stackFrame of stackTrace.callFrames) {
|
| + var row = createElement('tr');
|
| + row.createChild('td').textContent = '\n';
|
| + row.createChild('td', 'function-name').textContent = WebInspector.beautifyFunctionName(stackFrame.functionName);
|
| + var link = linkifier.maybeLinkifyConsoleCallFrame(target, stackFrame);
|
| + if (link) {
|
| + row.createChild('td').textContent = ' @ ';
|
| + row.createChild('td').appendChild(link);
|
| + }
|
| + contentElement.appendChild(row);
|
| }
|
| + }
|
|
|
| - if (!stackTrace)
|
| - return element;
|
| + if (!stackTrace)
|
| + return element;
|
|
|
| - appendStackTrace(stackTrace);
|
| + appendStackTrace(stackTrace);
|
|
|
| - var asyncStackTrace = stackTrace.parent;
|
| - while (asyncStackTrace) {
|
| - if (!asyncStackTrace.callFrames.length) {
|
| - asyncStackTrace = asyncStackTrace.parent;
|
| - continue;
|
| - }
|
| - var row = contentElement.createChild("tr");
|
| - row.createChild("td").textContent = "\n";
|
| - row.createChild("td", "stack-preview-async-description").textContent = WebInspector.asyncStackTraceLabel(asyncStackTrace.description);
|
| - row.createChild("td");
|
| - row.createChild("td");
|
| - appendStackTrace(asyncStackTrace);
|
| - asyncStackTrace = asyncStackTrace.parent;
|
| + var asyncStackTrace = stackTrace.parent;
|
| + while (asyncStackTrace) {
|
| + if (!asyncStackTrace.callFrames.length) {
|
| + asyncStackTrace = asyncStackTrace.parent;
|
| + continue;
|
| }
|
| -
|
| - return element;
|
| + var row = contentElement.createChild('tr');
|
| + row.createChild('td').textContent = '\n';
|
| + row.createChild('td', 'stack-preview-async-description').textContent =
|
| + WebInspector.asyncStackTraceLabel(asyncStackTrace.description);
|
| + row.createChild('td');
|
| + row.createChild('td');
|
| + appendStackTrace(asyncStackTrace);
|
| + asyncStackTrace = asyncStackTrace.parent;
|
| + }
|
| +
|
| + return element;
|
| };
|
|
|
| /**
|
| @@ -279,29 +271,28 @@ WebInspector.DOMPresentationUtils.buildStackTracePreviewContents = function(targ
|
| * @param {boolean=} justSelector
|
| * @return {string}
|
| */
|
| -WebInspector.DOMPresentationUtils.fullQualifiedSelector = function(node, justSelector)
|
| -{
|
| - if (node.nodeType() !== Node.ELEMENT_NODE)
|
| - return node.localName() || node.nodeName().toLowerCase();
|
| - return WebInspector.DOMPresentationUtils.cssPath(node, justSelector);
|
| +WebInspector.DOMPresentationUtils.fullQualifiedSelector = function(node, justSelector) {
|
| + if (node.nodeType() !== Node.ELEMENT_NODE)
|
| + return node.localName() || node.nodeName().toLowerCase();
|
| + return WebInspector.DOMPresentationUtils.cssPath(node, justSelector);
|
| };
|
|
|
| /**
|
| * @param {!WebInspector.DOMNode} node
|
| * @return {string}
|
| */
|
| -WebInspector.DOMPresentationUtils.simpleSelector = function(node)
|
| -{
|
| - var lowerCaseName = node.localName() || node.nodeName().toLowerCase();
|
| - if (node.nodeType() !== Node.ELEMENT_NODE)
|
| - return lowerCaseName;
|
| - if (lowerCaseName === "input" && node.getAttribute("type") && !node.getAttribute("id") && !node.getAttribute("class"))
|
| - return lowerCaseName + "[type=\"" + node.getAttribute("type") + "\"]";
|
| - if (node.getAttribute("id"))
|
| - return lowerCaseName + "#" + node.getAttribute("id");
|
| - if (node.getAttribute("class"))
|
| - return (lowerCaseName === "div" ? "" : lowerCaseName) + "." + node.getAttribute("class").trim().replace(/\s+/g, ".");
|
| +WebInspector.DOMPresentationUtils.simpleSelector = function(node) {
|
| + var lowerCaseName = node.localName() || node.nodeName().toLowerCase();
|
| + if (node.nodeType() !== Node.ELEMENT_NODE)
|
| return lowerCaseName;
|
| + if (lowerCaseName === 'input' && node.getAttribute('type') && !node.getAttribute('id') && !node.getAttribute('class'))
|
| + return lowerCaseName + '[type="' + node.getAttribute('type') + '"]';
|
| + if (node.getAttribute('id'))
|
| + return lowerCaseName + '#' + node.getAttribute('id');
|
| + if (node.getAttribute('class'))
|
| + return (lowerCaseName === 'div' ? '' : lowerCaseName) + '.' +
|
| + node.getAttribute('class').trim().replace(/\s+/g, '.');
|
| + return lowerCaseName;
|
| };
|
|
|
| /**
|
| @@ -309,25 +300,24 @@ WebInspector.DOMPresentationUtils.simpleSelector = function(node)
|
| * @param {boolean=} optimized
|
| * @return {string}
|
| */
|
| -WebInspector.DOMPresentationUtils.cssPath = function(node, optimized)
|
| -{
|
| - if (node.nodeType() !== Node.ELEMENT_NODE)
|
| - return "";
|
| -
|
| - var steps = [];
|
| - var contextNode = node;
|
| - while (contextNode) {
|
| - var step = WebInspector.DOMPresentationUtils._cssPathStep(contextNode, !!optimized, contextNode === node);
|
| - if (!step)
|
| - break; // Error - bail out early.
|
| - steps.push(step);
|
| - if (step.optimized)
|
| - break;
|
| - contextNode = contextNode.parentNode;
|
| - }
|
| -
|
| - steps.reverse();
|
| - return steps.join(" > ");
|
| +WebInspector.DOMPresentationUtils.cssPath = function(node, optimized) {
|
| + if (node.nodeType() !== Node.ELEMENT_NODE)
|
| + return '';
|
| +
|
| + var steps = [];
|
| + var contextNode = node;
|
| + while (contextNode) {
|
| + var step = WebInspector.DOMPresentationUtils._cssPathStep(contextNode, !!optimized, contextNode === node);
|
| + if (!step)
|
| + break; // Error - bail out early.
|
| + steps.push(step);
|
| + if (step.optimized)
|
| + break;
|
| + contextNode = contextNode.parentNode;
|
| + }
|
| +
|
| + steps.reverse();
|
| + return steps.join(' > ');
|
| };
|
|
|
| /**
|
| @@ -336,158 +326,151 @@ WebInspector.DOMPresentationUtils.cssPath = function(node, optimized)
|
| * @param {boolean} isTargetNode
|
| * @return {?WebInspector.DOMNodePathStep}
|
| */
|
| -WebInspector.DOMPresentationUtils._cssPathStep = function(node, optimized, isTargetNode)
|
| -{
|
| - if (node.nodeType() !== Node.ELEMENT_NODE)
|
| - return null;
|
| -
|
| - var id = node.getAttribute("id");
|
| - if (optimized) {
|
| - if (id)
|
| - return new WebInspector.DOMNodePathStep(idSelector(id), true);
|
| - var nodeNameLower = node.nodeName().toLowerCase();
|
| - if (nodeNameLower === "body" || nodeNameLower === "head" || nodeNameLower === "html")
|
| - return new WebInspector.DOMNodePathStep(node.nodeNameInCorrectCase(), true);
|
| - }
|
| - var nodeName = node.nodeNameInCorrectCase();
|
| +WebInspector.DOMPresentationUtils._cssPathStep = function(node, optimized, isTargetNode) {
|
| + if (node.nodeType() !== Node.ELEMENT_NODE)
|
| + return null;
|
|
|
| + var id = node.getAttribute('id');
|
| + if (optimized) {
|
| if (id)
|
| - return new WebInspector.DOMNodePathStep(nodeName + idSelector(id), true);
|
| - var parent = node.parentNode;
|
| - if (!parent || parent.nodeType() === Node.DOCUMENT_NODE)
|
| - return new WebInspector.DOMNodePathStep(nodeName, true);
|
| -
|
| - /**
|
| - * @param {!WebInspector.DOMNode} node
|
| - * @return {!Array.<string>}
|
| - */
|
| - function prefixedElementClassNames(node)
|
| - {
|
| - var classAttribute = node.getAttribute("class");
|
| - if (!classAttribute)
|
| - return [];
|
| -
|
| - return classAttribute.split(/\s+/g).filter(Boolean).map(function(name) {
|
| - // The prefix is required to store "__proto__" in a object-based map.
|
| - return "$" + name;
|
| - });
|
| + return new WebInspector.DOMNodePathStep(idSelector(id), true);
|
| + var nodeNameLower = node.nodeName().toLowerCase();
|
| + if (nodeNameLower === 'body' || nodeNameLower === 'head' || nodeNameLower === 'html')
|
| + return new WebInspector.DOMNodePathStep(node.nodeNameInCorrectCase(), true);
|
| + }
|
| + var nodeName = node.nodeNameInCorrectCase();
|
| +
|
| + if (id)
|
| + return new WebInspector.DOMNodePathStep(nodeName + idSelector(id), true);
|
| + var parent = node.parentNode;
|
| + if (!parent || parent.nodeType() === Node.DOCUMENT_NODE)
|
| + return new WebInspector.DOMNodePathStep(nodeName, true);
|
| +
|
| + /**
|
| + * @param {!WebInspector.DOMNode} node
|
| + * @return {!Array.<string>}
|
| + */
|
| + function prefixedElementClassNames(node) {
|
| + var classAttribute = node.getAttribute('class');
|
| + if (!classAttribute)
|
| + return [];
|
| +
|
| + return classAttribute.split(/\s+/g).filter(Boolean).map(function(name) {
|
| + // The prefix is required to store "__proto__" in a object-based map.
|
| + return '$' + name;
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * @param {string} id
|
| + * @return {string}
|
| + */
|
| + function idSelector(id) {
|
| + return '#' + escapeIdentifierIfNeeded(id);
|
| + }
|
| +
|
| + /**
|
| + * @param {string} ident
|
| + * @return {string}
|
| + */
|
| + function escapeIdentifierIfNeeded(ident) {
|
| + if (isCSSIdentifier(ident))
|
| + return ident;
|
| + var shouldEscapeFirst = /^(?:[0-9]|-[0-9-]?)/.test(ident);
|
| + var lastIndex = ident.length - 1;
|
| + return ident.replace(/./g, function(c, i) {
|
| + return ((shouldEscapeFirst && i === 0) || !isCSSIdentChar(c)) ? escapeAsciiChar(c, i === lastIndex) : c;
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * @param {string} c
|
| + * @param {boolean} isLast
|
| + * @return {string}
|
| + */
|
| + function escapeAsciiChar(c, isLast) {
|
| + return '\\' + toHexByte(c) + (isLast ? '' : ' ');
|
| + }
|
| +
|
| + /**
|
| + * @param {string} c
|
| + */
|
| + function toHexByte(c) {
|
| + var hexByte = c.charCodeAt(0).toString(16);
|
| + if (hexByte.length === 1)
|
| + hexByte = '0' + hexByte;
|
| + return hexByte;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} c
|
| + * @return {boolean}
|
| + */
|
| + function isCSSIdentChar(c) {
|
| + if (/[a-zA-Z0-9_-]/.test(c))
|
| + return true;
|
| + return c.charCodeAt(0) >= 0xA0;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} value
|
| + * @return {boolean}
|
| + */
|
| + function isCSSIdentifier(value) {
|
| + return /^-?[a-zA-Z_][a-zA-Z0-9_-]*$/.test(value);
|
| + }
|
| +
|
| + var prefixedOwnClassNamesArray = prefixedElementClassNames(node);
|
| + var needsClassNames = false;
|
| + var needsNthChild = false;
|
| + var ownIndex = -1;
|
| + var elementIndex = -1;
|
| + var siblings = parent.children();
|
| + for (var i = 0; (ownIndex === -1 || !needsNthChild) && i < siblings.length; ++i) {
|
| + var sibling = siblings[i];
|
| + if (sibling.nodeType() !== Node.ELEMENT_NODE)
|
| + continue;
|
| + elementIndex += 1;
|
| + if (sibling === node) {
|
| + ownIndex = elementIndex;
|
| + continue;
|
| }
|
| -
|
| - /**
|
| - * @param {string} id
|
| - * @return {string}
|
| - */
|
| - function idSelector(id)
|
| - {
|
| - return "#" + escapeIdentifierIfNeeded(id);
|
| - }
|
| -
|
| - /**
|
| - * @param {string} ident
|
| - * @return {string}
|
| - */
|
| - function escapeIdentifierIfNeeded(ident)
|
| - {
|
| - if (isCSSIdentifier(ident))
|
| - return ident;
|
| - var shouldEscapeFirst = /^(?:[0-9]|-[0-9-]?)/.test(ident);
|
| - var lastIndex = ident.length - 1;
|
| - return ident.replace(/./g, function(c, i) {
|
| - return ((shouldEscapeFirst && i === 0) || !isCSSIdentChar(c)) ? escapeAsciiChar(c, i === lastIndex) : c;
|
| - });
|
| - }
|
| -
|
| - /**
|
| - * @param {string} c
|
| - * @param {boolean} isLast
|
| - * @return {string}
|
| - */
|
| - function escapeAsciiChar(c, isLast)
|
| - {
|
| - return "\\" + toHexByte(c) + (isLast ? "" : " ");
|
| - }
|
| -
|
| - /**
|
| - * @param {string} c
|
| - */
|
| - function toHexByte(c)
|
| - {
|
| - var hexByte = c.charCodeAt(0).toString(16);
|
| - if (hexByte.length === 1)
|
| - hexByte = "0" + hexByte;
|
| - return hexByte;
|
| - }
|
| -
|
| - /**
|
| - * @param {string} c
|
| - * @return {boolean}
|
| - */
|
| - function isCSSIdentChar(c)
|
| - {
|
| - if (/[a-zA-Z0-9_-]/.test(c))
|
| - return true;
|
| - return c.charCodeAt(0) >= 0xA0;
|
| + if (needsNthChild)
|
| + continue;
|
| + if (sibling.nodeNameInCorrectCase() !== nodeName)
|
| + continue;
|
| +
|
| + needsClassNames = true;
|
| + var ownClassNames = new Set(prefixedOwnClassNamesArray);
|
| + if (!ownClassNames.size) {
|
| + needsNthChild = true;
|
| + continue;
|
| }
|
| -
|
| - /**
|
| - * @param {string} value
|
| - * @return {boolean}
|
| - */
|
| - function isCSSIdentifier(value)
|
| - {
|
| - return /^-?[a-zA-Z_][a-zA-Z0-9_-]*$/.test(value);
|
| - }
|
| -
|
| - var prefixedOwnClassNamesArray = prefixedElementClassNames(node);
|
| - var needsClassNames = false;
|
| - var needsNthChild = false;
|
| - var ownIndex = -1;
|
| - var elementIndex = -1;
|
| - var siblings = parent.children();
|
| - for (var i = 0; (ownIndex === -1 || !needsNthChild) && i < siblings.length; ++i) {
|
| - var sibling = siblings[i];
|
| - if (sibling.nodeType() !== Node.ELEMENT_NODE)
|
| - continue;
|
| - elementIndex += 1;
|
| - if (sibling === node) {
|
| - ownIndex = elementIndex;
|
| - continue;
|
| - }
|
| - if (needsNthChild)
|
| - continue;
|
| - if (sibling.nodeNameInCorrectCase() !== nodeName)
|
| - continue;
|
| -
|
| - needsClassNames = true;
|
| - var ownClassNames = new Set(prefixedOwnClassNamesArray);
|
| - if (!ownClassNames.size) {
|
| - needsNthChild = true;
|
| - continue;
|
| - }
|
| - var siblingClassNamesArray = prefixedElementClassNames(sibling);
|
| - for (var j = 0; j < siblingClassNamesArray.length; ++j) {
|
| - var siblingClass = siblingClassNamesArray[j];
|
| - if (!ownClassNames.has(siblingClass))
|
| - continue;
|
| - ownClassNames.delete(siblingClass);
|
| - if (!ownClassNames.size) {
|
| - needsNthChild = true;
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -
|
| - var result = nodeName;
|
| - if (isTargetNode && nodeName.toLowerCase() === "input" && node.getAttribute("type") && !node.getAttribute("id") && !node.getAttribute("class"))
|
| - result += "[type=\"" + node.getAttribute("type") + "\"]";
|
| - if (needsNthChild) {
|
| - result += ":nth-child(" + (ownIndex + 1) + ")";
|
| - } else if (needsClassNames) {
|
| - for (var prefixedName of prefixedOwnClassNamesArray)
|
| - result += "." + escapeIdentifierIfNeeded(prefixedName.substr(1));
|
| + var siblingClassNamesArray = prefixedElementClassNames(sibling);
|
| + for (var j = 0; j < siblingClassNamesArray.length; ++j) {
|
| + var siblingClass = siblingClassNamesArray[j];
|
| + if (!ownClassNames.has(siblingClass))
|
| + continue;
|
| + ownClassNames.delete(siblingClass);
|
| + if (!ownClassNames.size) {
|
| + needsNthChild = true;
|
| + break;
|
| + }
|
| }
|
| -
|
| - return new WebInspector.DOMNodePathStep(result, false);
|
| + }
|
| +
|
| + var result = nodeName;
|
| + if (isTargetNode && nodeName.toLowerCase() === 'input' && node.getAttribute('type') && !node.getAttribute('id') &&
|
| + !node.getAttribute('class'))
|
| + result += '[type="' + node.getAttribute('type') + '"]';
|
| + if (needsNthChild) {
|
| + result += ':nth-child(' + (ownIndex + 1) + ')';
|
| + } else if (needsClassNames) {
|
| + for (var prefixedName of prefixedOwnClassNamesArray)
|
| + result += '.' + escapeIdentifierIfNeeded(prefixedName.substr(1));
|
| + }
|
| +
|
| + return new WebInspector.DOMNodePathStep(result, false);
|
| };
|
|
|
| /**
|
| @@ -495,25 +478,24 @@ WebInspector.DOMPresentationUtils._cssPathStep = function(node, optimized, isTar
|
| * @param {boolean=} optimized
|
| * @return {string}
|
| */
|
| -WebInspector.DOMPresentationUtils.xPath = function(node, optimized)
|
| -{
|
| - if (node.nodeType() === Node.DOCUMENT_NODE)
|
| - return "/";
|
| -
|
| - var steps = [];
|
| - var contextNode = node;
|
| - while (contextNode) {
|
| - var step = WebInspector.DOMPresentationUtils._xPathValue(contextNode, optimized);
|
| - if (!step)
|
| - break; // Error - bail out early.
|
| - steps.push(step);
|
| - if (step.optimized)
|
| - break;
|
| - contextNode = contextNode.parentNode;
|
| - }
|
| -
|
| - steps.reverse();
|
| - return (steps.length && steps[0].optimized ? "" : "/") + steps.join("/");
|
| +WebInspector.DOMPresentationUtils.xPath = function(node, optimized) {
|
| + if (node.nodeType() === Node.DOCUMENT_NODE)
|
| + return '/';
|
| +
|
| + var steps = [];
|
| + var contextNode = node;
|
| + while (contextNode) {
|
| + var step = WebInspector.DOMPresentationUtils._xPathValue(contextNode, optimized);
|
| + if (!step)
|
| + break; // Error - bail out early.
|
| + steps.push(step);
|
| + if (step.optimized)
|
| + break;
|
| + contextNode = contextNode.parentNode;
|
| + }
|
| +
|
| + steps.reverse();
|
| + return (steps.length && steps[0].optimized ? '' : '/') + steps.join('/');
|
| };
|
|
|
| /**
|
| @@ -521,149 +503,144 @@ WebInspector.DOMPresentationUtils.xPath = function(node, optimized)
|
| * @param {boolean=} optimized
|
| * @return {?WebInspector.DOMNodePathStep}
|
| */
|
| -WebInspector.DOMPresentationUtils._xPathValue = function(node, optimized)
|
| -{
|
| - var ownValue;
|
| - var ownIndex = WebInspector.DOMPresentationUtils._xPathIndex(node);
|
| - if (ownIndex === -1)
|
| - return null; // Error.
|
| -
|
| - switch (node.nodeType()) {
|
| +WebInspector.DOMPresentationUtils._xPathValue = function(node, optimized) {
|
| + var ownValue;
|
| + var ownIndex = WebInspector.DOMPresentationUtils._xPathIndex(node);
|
| + if (ownIndex === -1)
|
| + return null; // Error.
|
| +
|
| + switch (node.nodeType()) {
|
| case Node.ELEMENT_NODE:
|
| - if (optimized && node.getAttribute("id"))
|
| - return new WebInspector.DOMNodePathStep("//*[@id=\"" + node.getAttribute("id") + "\"]", true);
|
| - ownValue = node.localName();
|
| - break;
|
| + if (optimized && node.getAttribute('id'))
|
| + return new WebInspector.DOMNodePathStep('//*[@id="' + node.getAttribute('id') + '"]', true);
|
| + ownValue = node.localName();
|
| + break;
|
| case Node.ATTRIBUTE_NODE:
|
| - ownValue = "@" + node.nodeName();
|
| - break;
|
| + ownValue = '@' + node.nodeName();
|
| + break;
|
| case Node.TEXT_NODE:
|
| case Node.CDATA_SECTION_NODE:
|
| - ownValue = "text()";
|
| - break;
|
| + ownValue = 'text()';
|
| + break;
|
| case Node.PROCESSING_INSTRUCTION_NODE:
|
| - ownValue = "processing-instruction()";
|
| - break;
|
| + ownValue = 'processing-instruction()';
|
| + break;
|
| case Node.COMMENT_NODE:
|
| - ownValue = "comment()";
|
| - break;
|
| + ownValue = 'comment()';
|
| + break;
|
| case Node.DOCUMENT_NODE:
|
| - ownValue = "";
|
| - break;
|
| + ownValue = '';
|
| + break;
|
| default:
|
| - ownValue = "";
|
| - break;
|
| - }
|
| + ownValue = '';
|
| + break;
|
| + }
|
|
|
| - if (ownIndex > 0)
|
| - ownValue += "[" + ownIndex + "]";
|
| + if (ownIndex > 0)
|
| + ownValue += '[' + ownIndex + ']';
|
|
|
| - return new WebInspector.DOMNodePathStep(ownValue, node.nodeType() === Node.DOCUMENT_NODE);
|
| + return new WebInspector.DOMNodePathStep(ownValue, node.nodeType() === Node.DOCUMENT_NODE);
|
| };
|
|
|
| /**
|
| * @param {!WebInspector.DOMNode} node
|
| * @return {number}
|
| */
|
| -WebInspector.DOMPresentationUtils._xPathIndex = function(node)
|
| -{
|
| - // Returns -1 in case of error, 0 if no siblings matching the same expression, <XPath index among the same expression-matching sibling nodes> otherwise.
|
| - function areNodesSimilar(left, right)
|
| - {
|
| - if (left === right)
|
| - return true;
|
| -
|
| - if (left.nodeType() === Node.ELEMENT_NODE && right.nodeType() === Node.ELEMENT_NODE)
|
| - return left.localName() === right.localName();
|
| -
|
| - if (left.nodeType() === right.nodeType())
|
| - return true;
|
| -
|
| - // XPath treats CDATA as text nodes.
|
| - var leftType = left.nodeType() === Node.CDATA_SECTION_NODE ? Node.TEXT_NODE : left.nodeType();
|
| - var rightType = right.nodeType() === Node.CDATA_SECTION_NODE ? Node.TEXT_NODE : right.nodeType();
|
| - return leftType === rightType;
|
| +WebInspector.DOMPresentationUtils._xPathIndex = function(node) {
|
| + // Returns -1 in case of error, 0 if no siblings matching the same expression, <XPath index among the same expression-matching sibling nodes> otherwise.
|
| + function areNodesSimilar(left, right) {
|
| + if (left === right)
|
| + return true;
|
| +
|
| + if (left.nodeType() === Node.ELEMENT_NODE && right.nodeType() === Node.ELEMENT_NODE)
|
| + return left.localName() === right.localName();
|
| +
|
| + if (left.nodeType() === right.nodeType())
|
| + return true;
|
| +
|
| + // XPath treats CDATA as text nodes.
|
| + var leftType = left.nodeType() === Node.CDATA_SECTION_NODE ? Node.TEXT_NODE : left.nodeType();
|
| + var rightType = right.nodeType() === Node.CDATA_SECTION_NODE ? Node.TEXT_NODE : right.nodeType();
|
| + return leftType === rightType;
|
| + }
|
| +
|
| + var siblings = node.parentNode ? node.parentNode.children() : null;
|
| + if (!siblings)
|
| + return 0; // Root node - no siblings.
|
| + var hasSameNamedElements;
|
| + for (var i = 0; i < siblings.length; ++i) {
|
| + if (areNodesSimilar(node, siblings[i]) && siblings[i] !== node) {
|
| + hasSameNamedElements = true;
|
| + break;
|
| }
|
| -
|
| - var siblings = node.parentNode ? node.parentNode.children() : null;
|
| - if (!siblings)
|
| - return 0; // Root node - no siblings.
|
| - var hasSameNamedElements;
|
| - for (var i = 0; i < siblings.length; ++i) {
|
| - if (areNodesSimilar(node, siblings[i]) && siblings[i] !== node) {
|
| - hasSameNamedElements = true;
|
| - break;
|
| - }
|
| - }
|
| - if (!hasSameNamedElements)
|
| - return 0;
|
| - var ownIndex = 1; // XPath indices start with 1.
|
| - for (var i = 0; i < siblings.length; ++i) {
|
| - if (areNodesSimilar(node, siblings[i])) {
|
| - if (siblings[i] === node)
|
| - return ownIndex;
|
| - ++ownIndex;
|
| - }
|
| + }
|
| + if (!hasSameNamedElements)
|
| + return 0;
|
| + var ownIndex = 1; // XPath indices start with 1.
|
| + for (var i = 0; i < siblings.length; ++i) {
|
| + if (areNodesSimilar(node, siblings[i])) {
|
| + if (siblings[i] === node)
|
| + return ownIndex;
|
| + ++ownIndex;
|
| }
|
| - return -1; // An error occurred: |node| not found in parent's children.
|
| + }
|
| + return -1; // An error occurred: |node| not found in parent's children.
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {string} value
|
| - * @param {boolean} optimized
|
| + * @unrestricted
|
| */
|
| -WebInspector.DOMNodePathStep = function(value, optimized)
|
| -{
|
| +WebInspector.DOMNodePathStep = class {
|
| + /**
|
| + * @param {string} value
|
| + * @param {boolean} optimized
|
| + */
|
| + constructor(value, optimized) {
|
| this.value = value;
|
| this.optimized = optimized || false;
|
| -};
|
| -
|
| -WebInspector.DOMNodePathStep.prototype = {
|
| - /**
|
| - * @override
|
| - * @return {string}
|
| - */
|
| - toString: function()
|
| - {
|
| - return this.value;
|
| - }
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {string}
|
| + */
|
| + toString() {
|
| + return this.value;
|
| + }
|
| };
|
|
|
| /**
|
| * @interface
|
| */
|
| -WebInspector.DOMPresentationUtils.MarkerDecorator = function()
|
| -{
|
| -};
|
| +WebInspector.DOMPresentationUtils.MarkerDecorator = function() {};
|
|
|
| WebInspector.DOMPresentationUtils.MarkerDecorator.prototype = {
|
| - /**
|
| - * @param {!WebInspector.DOMNode} node
|
| - * @return {?{title: string, color: string}}
|
| - */
|
| - decorate: function(node) { }
|
| + /**
|
| + * @param {!WebInspector.DOMNode} node
|
| + * @return {?{title: string, color: string}}
|
| + */
|
| + decorate: function(node) {}
|
| };
|
|
|
| /**
|
| - * @constructor
|
| * @implements {WebInspector.DOMPresentationUtils.MarkerDecorator}
|
| - * @param {!Runtime.Extension} extension
|
| + * @unrestricted
|
| */
|
| -WebInspector.DOMPresentationUtils.GenericDecorator = function(extension)
|
| -{
|
| +WebInspector.DOMPresentationUtils.GenericDecorator = class {
|
| + /**
|
| + * @param {!Runtime.Extension} extension
|
| + */
|
| + constructor(extension) {
|
| this._title = WebInspector.UIString(extension.title());
|
| - this._color = extension.descriptor()["color"];
|
| -};
|
| -
|
| -WebInspector.DOMPresentationUtils.GenericDecorator.prototype = {
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.DOMNode} node
|
| - * @return {?{title: string, color: string}}
|
| - */
|
| - decorate: function(node)
|
| - {
|
| - return { title: this._title, color: this._color };
|
| - }
|
| + this._color = extension.descriptor()['color'];
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.DOMNode} node
|
| + * @return {?{title: string, color: string}}
|
| + */
|
| + decorate(node) {
|
| + return {title: this._title, color: this._color};
|
| + }
|
| };
|
|
|