Index: third_party/WebKit/Source/devtools/front_end/elements/ElementsBreadcrumbs.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/ElementsBreadcrumbs.js b/third_party/WebKit/Source/devtools/front_end/elements/ElementsBreadcrumbs.js |
index 18357f8f166ffd5f590724ef06b293438d29b6fc..9cf8e2908c654d75a6296119f5a7762596dc1ea1 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/elements/ElementsBreadcrumbs.js |
+++ b/third_party/WebKit/Source/devtools/front_end/elements/ElementsBreadcrumbs.js |
@@ -1,436 +1,420 @@ |
// Copyright 2014 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
- |
/** |
- * @constructor |
- * @extends {WebInspector.HBox} |
+ * @unrestricted |
*/ |
-WebInspector.ElementsBreadcrumbs = function() |
-{ |
- WebInspector.HBox.call(this, true); |
- this.registerRequiredCSS("elements/breadcrumbs.css"); |
- |
- this.crumbsElement = this.contentElement.createChild("div", "crumbs"); |
- this.crumbsElement.addEventListener("mousemove", this._mouseMovedInCrumbs.bind(this), false); |
- this.crumbsElement.addEventListener("mouseleave", this._mouseMovedOutOfCrumbs.bind(this), false); |
- this._nodeSymbol = Symbol("node"); |
-}; |
- |
-/** @enum {symbol} */ |
-WebInspector.ElementsBreadcrumbs.Events = { |
- NodeSelected: Symbol("NodeSelected") |
-}; |
- |
-WebInspector.ElementsBreadcrumbs.prototype = { |
- wasShown: function() |
- { |
- this.update(); |
- }, |
+WebInspector.ElementsBreadcrumbs = class extends WebInspector.HBox { |
+ constructor() { |
+ super(true); |
+ this.registerRequiredCSS('elements/breadcrumbs.css'); |
+ |
+ this.crumbsElement = this.contentElement.createChild('div', 'crumbs'); |
+ this.crumbsElement.addEventListener('mousemove', this._mouseMovedInCrumbs.bind(this), false); |
+ this.crumbsElement.addEventListener('mouseleave', this._mouseMovedOutOfCrumbs.bind(this), false); |
+ this._nodeSymbol = Symbol('node'); |
+ } |
+ |
+ /** |
+ * @override |
+ */ |
+ wasShown() { |
+ this.update(); |
+ } |
+ |
+ /** |
+ * @param {!Array.<!WebInspector.DOMNode>} nodes |
+ */ |
+ updateNodes(nodes) { |
+ if (!nodes.length) |
+ return; |
+ |
+ var crumbs = this.crumbsElement; |
+ for (var crumb = crumbs.firstChild; crumb; crumb = crumb.nextSibling) { |
+ if (nodes.indexOf(crumb[this._nodeSymbol]) !== -1) { |
+ this.update(true); |
+ return; |
+ } |
+ } |
+ } |
+ |
+ /** |
+ * @param {?WebInspector.DOMNode} node |
+ */ |
+ setSelectedNode(node) { |
+ this._currentDOMNode = node; |
+ this.update(); |
+ } |
+ |
+ _mouseMovedInCrumbs(event) { |
+ var nodeUnderMouse = event.target; |
+ var crumbElement = nodeUnderMouse.enclosingNodeOrSelfWithClass('crumb'); |
+ var node = /** @type {?WebInspector.DOMNode} */ (crumbElement ? crumbElement[this._nodeSymbol] : null); |
+ if (node) |
+ node.highlight(); |
+ } |
+ |
+ _mouseMovedOutOfCrumbs(event) { |
+ if (this._currentDOMNode) |
+ WebInspector.DOMModel.hideDOMNodeHighlight(); |
+ } |
+ |
+ /** |
+ * @param {boolean=} force |
+ */ |
+ update(force) { |
+ if (!this.isShowing()) |
+ return; |
+ |
+ var currentDOMNode = this._currentDOMNode; |
+ var crumbs = this.crumbsElement; |
+ |
+ var handled = false; |
+ var crumb = crumbs.firstChild; |
+ while (crumb) { |
+ if (crumb[this._nodeSymbol] === currentDOMNode) { |
+ crumb.classList.add('selected'); |
+ handled = true; |
+ } else { |
+ crumb.classList.remove('selected'); |
+ } |
+ |
+ crumb = crumb.nextSibling; |
+ } |
+ |
+ if (handled && !force) { |
+ // We don't need to rebuild the crumbs, but we need to adjust sizes |
+ // to reflect the new focused or root node. |
+ this.updateSizes(); |
+ return; |
+ } |
+ |
+ crumbs.removeChildren(); |
+ |
+ var panel = this; |
/** |
- * @param {!Array.<!WebInspector.DOMNode>} nodes |
+ * @param {!Event} event |
+ * @this {WebInspector.ElementsBreadcrumbs} |
*/ |
- updateNodes: function(nodes) |
- { |
- if (!nodes.length) |
- return; |
- |
- var crumbs = this.crumbsElement; |
- for (var crumb = crumbs.firstChild; crumb; crumb = crumb.nextSibling) { |
- if (nodes.indexOf(crumb[this._nodeSymbol]) !== -1) { |
- this.update(true); |
- return; |
- } |
+ function selectCrumb(event) { |
+ event.preventDefault(); |
+ var crumb = /** @type {!Element} */ (event.currentTarget); |
+ if (!crumb.classList.contains('collapsed')) { |
+ this.dispatchEventToListeners(WebInspector.ElementsBreadcrumbs.Events.NodeSelected, crumb[this._nodeSymbol]); |
+ return; |
+ } |
+ |
+ // Clicking a collapsed crumb will expose the hidden crumbs. |
+ if (crumb === panel.crumbsElement.firstChild) { |
+ // If the focused crumb is the first child, pick the farthest crumb |
+ // that is still hidden. This allows the user to expose every crumb. |
+ var currentCrumb = crumb; |
+ while (currentCrumb) { |
+ var hidden = currentCrumb.classList.contains('hidden'); |
+ var collapsed = currentCrumb.classList.contains('collapsed'); |
+ if (!hidden && !collapsed) |
+ break; |
+ crumb = currentCrumb; |
+ currentCrumb = currentCrumb.nextSiblingElement; |
} |
- }, |
- |
- /** |
- * @param {?WebInspector.DOMNode} node |
- */ |
- setSelectedNode: function(node) |
- { |
- this._currentDOMNode = node; |
- this.update(); |
- }, |
- |
- _mouseMovedInCrumbs: function(event) |
- { |
- var nodeUnderMouse = event.target; |
- var crumbElement = nodeUnderMouse.enclosingNodeOrSelfWithClass("crumb"); |
- var node = /** @type {?WebInspector.DOMNode} */ (crumbElement ? crumbElement[this._nodeSymbol] : null); |
- if (node) |
- node.highlight(); |
- }, |
- |
- _mouseMovedOutOfCrumbs: function(event) |
- { |
- if (this._currentDOMNode) |
- WebInspector.DOMModel.hideDOMNodeHighlight(); |
- }, |
- |
- /** |
- * @param {boolean=} force |
- */ |
- update: function(force) |
- { |
- if (!this.isShowing()) |
- return; |
- |
- var currentDOMNode = this._currentDOMNode; |
- var crumbs = this.crumbsElement; |
- |
- var handled = false; |
- var crumb = crumbs.firstChild; |
- while (crumb) { |
- if (crumb[this._nodeSymbol] === currentDOMNode) { |
- crumb.classList.add("selected"); |
- handled = true; |
- } else { |
- crumb.classList.remove("selected"); |
- } |
- |
- crumb = crumb.nextSibling; |
+ } |
+ |
+ this.updateSizes(crumb); |
+ } |
+ |
+ var boundSelectCrumb = selectCrumb.bind(this); |
+ for (var current = currentDOMNode; current; current = current.parentNode) { |
+ if (current.nodeType() === Node.DOCUMENT_NODE) |
+ continue; |
+ |
+ crumb = createElementWithClass('span', 'crumb'); |
+ crumb[this._nodeSymbol] = current; |
+ crumb.addEventListener('mousedown', boundSelectCrumb, false); |
+ |
+ var crumbTitle = ''; |
+ switch (current.nodeType()) { |
+ case Node.ELEMENT_NODE: |
+ if (current.pseudoType()) |
+ crumbTitle = '::' + current.pseudoType(); |
+ else |
+ WebInspector.DOMPresentationUtils.decorateNodeLabel(current, crumb); |
+ break; |
+ |
+ case Node.TEXT_NODE: |
+ crumbTitle = WebInspector.UIString('(text)'); |
+ break; |
+ |
+ case Node.COMMENT_NODE: |
+ crumbTitle = '<!-->'; |
+ break; |
+ |
+ case Node.DOCUMENT_TYPE_NODE: |
+ crumbTitle = '<!DOCTYPE>'; |
+ break; |
+ |
+ case Node.DOCUMENT_FRAGMENT_NODE: |
+ crumbTitle = current.shadowRootType() ? '#shadow-root' : current.nodeNameInCorrectCase(); |
+ break; |
+ |
+ default: |
+ crumbTitle = current.nodeNameInCorrectCase(); |
+ } |
+ |
+ if (!crumb.childNodes.length) { |
+ var nameElement = createElement('span'); |
+ nameElement.textContent = crumbTitle; |
+ crumb.appendChild(nameElement); |
+ crumb.title = crumbTitle; |
+ } |
+ |
+ if (current === currentDOMNode) |
+ crumb.classList.add('selected'); |
+ crumbs.insertBefore(crumb, crumbs.firstChild); |
+ } |
+ |
+ this.updateSizes(); |
+ } |
+ |
+ /** |
+ * @param {!Element=} focusedCrumb |
+ */ |
+ updateSizes(focusedCrumb) { |
+ if (!this.isShowing()) |
+ return; |
+ |
+ var crumbs = this.crumbsElement; |
+ if (!crumbs.firstChild) |
+ return; |
+ |
+ var selectedIndex = 0; |
+ var focusedIndex = 0; |
+ var selectedCrumb; |
+ |
+ // Reset crumb styles. |
+ for (var i = 0; i < crumbs.childNodes.length; ++i) { |
+ var crumb = crumbs.children[i]; |
+ // Find the selected crumb and index. |
+ if (!selectedCrumb && crumb.classList.contains('selected')) { |
+ selectedCrumb = crumb; |
+ selectedIndex = i; |
+ } |
+ |
+ // Find the focused crumb index. |
+ if (crumb === focusedCrumb) |
+ focusedIndex = i; |
+ |
+ crumb.classList.remove('compact', 'collapsed', 'hidden'); |
+ } |
+ |
+ // Layout 1: Measure total and normal crumb sizes |
+ var contentElementWidth = this.contentElement.offsetWidth; |
+ var normalSizes = []; |
+ for (var i = 0; i < crumbs.childNodes.length; ++i) { |
+ var crumb = crumbs.childNodes[i]; |
+ normalSizes[i] = crumb.offsetWidth; |
+ } |
+ |
+ // Layout 2: Measure collapsed crumb sizes |
+ var compactSizes = []; |
+ for (var i = 0; i < crumbs.childNodes.length; ++i) { |
+ var crumb = crumbs.childNodes[i]; |
+ crumb.classList.add('compact'); |
+ } |
+ for (var i = 0; i < crumbs.childNodes.length; ++i) { |
+ var crumb = crumbs.childNodes[i]; |
+ compactSizes[i] = crumb.offsetWidth; |
+ } |
+ |
+ // Layout 3: Measure collapsed crumb size |
+ crumbs.firstChild.classList.add('collapsed'); |
+ var collapsedSize = crumbs.firstChild.offsetWidth; |
+ |
+ // Clean up. |
+ for (var i = 0; i < crumbs.childNodes.length; ++i) { |
+ var crumb = crumbs.childNodes[i]; |
+ crumb.classList.remove('compact', 'collapsed'); |
+ } |
+ |
+ function crumbsAreSmallerThanContainer() { |
+ var totalSize = 0; |
+ for (var i = 0; i < crumbs.childNodes.length; ++i) { |
+ var crumb = crumbs.childNodes[i]; |
+ if (crumb.classList.contains('hidden')) |
+ continue; |
+ if (crumb.classList.contains('collapsed')) { |
+ totalSize += collapsedSize; |
+ continue; |
} |
+ totalSize += crumb.classList.contains('compact') ? compactSizes[i] : normalSizes[i]; |
+ } |
+ const rightPadding = 10; |
+ return totalSize + rightPadding < contentElementWidth; |
+ } |
- if (handled && !force) { |
- // We don't need to rebuild the crumbs, but we need to adjust sizes |
- // to reflect the new focused or root node. |
- this.updateSizes(); |
- return; |
- } |
+ if (crumbsAreSmallerThanContainer()) |
+ return; // No need to compact the crumbs, they all fit at full size. |
- crumbs.removeChildren(); |
- |
- var panel = this; |
- |
- /** |
- * @param {!Event} event |
- * @this {WebInspector.ElementsBreadcrumbs} |
- */ |
- function selectCrumb(event) |
- { |
- event.preventDefault(); |
- var crumb = /** @type {!Element} */ (event.currentTarget); |
- if (!crumb.classList.contains("collapsed")) { |
- this.dispatchEventToListeners(WebInspector.ElementsBreadcrumbs.Events.NodeSelected, crumb[this._nodeSymbol]); |
- return; |
- } |
- |
- // Clicking a collapsed crumb will expose the hidden crumbs. |
- if (crumb === panel.crumbsElement.firstChild) { |
- // If the focused crumb is the first child, pick the farthest crumb |
- // that is still hidden. This allows the user to expose every crumb. |
- var currentCrumb = crumb; |
- while (currentCrumb) { |
- var hidden = currentCrumb.classList.contains("hidden"); |
- var collapsed = currentCrumb.classList.contains("collapsed"); |
- if (!hidden && !collapsed) |
- break; |
- crumb = currentCrumb; |
- currentCrumb = currentCrumb.nextSiblingElement; |
- } |
- } |
- |
- this.updateSizes(crumb); |
- } |
- |
- var boundSelectCrumb = selectCrumb.bind(this); |
- for (var current = currentDOMNode; current; current = current.parentNode) { |
- if (current.nodeType() === Node.DOCUMENT_NODE) |
- continue; |
- |
- crumb = createElementWithClass("span", "crumb"); |
- crumb[this._nodeSymbol] = current; |
- crumb.addEventListener("mousedown", boundSelectCrumb, false); |
- |
- var crumbTitle = ""; |
- switch (current.nodeType()) { |
- case Node.ELEMENT_NODE: |
- if (current.pseudoType()) |
- crumbTitle = "::" + current.pseudoType(); |
- else |
- WebInspector.DOMPresentationUtils.decorateNodeLabel(current, crumb); |
- break; |
- |
- case Node.TEXT_NODE: |
- crumbTitle = WebInspector.UIString("(text)"); |
- break; |
- |
- case Node.COMMENT_NODE: |
- crumbTitle = "<!-->"; |
- break; |
- |
- case Node.DOCUMENT_TYPE_NODE: |
- crumbTitle = "<!DOCTYPE>"; |
- break; |
- |
- case Node.DOCUMENT_FRAGMENT_NODE: |
- crumbTitle = current.shadowRootType() ? "#shadow-root" : current.nodeNameInCorrectCase(); |
- break; |
- |
- default: |
- crumbTitle = current.nodeNameInCorrectCase(); |
- } |
- |
- if (!crumb.childNodes.length) { |
- var nameElement = createElement("span"); |
- nameElement.textContent = crumbTitle; |
- crumb.appendChild(nameElement); |
- crumb.title = crumbTitle; |
- } |
- |
- if (current === currentDOMNode) |
- crumb.classList.add("selected"); |
- crumbs.insertBefore(crumb, crumbs.firstChild); |
- } |
- |
- this.updateSizes(); |
- }, |
+ var BothSides = 0; |
+ var AncestorSide = -1; |
+ var ChildSide = 1; |
/** |
- * @param {!Element=} focusedCrumb |
+ * @param {function(!Element)} shrinkingFunction |
+ * @param {number} direction |
*/ |
- updateSizes: function(focusedCrumb) |
- { |
- if (!this.isShowing()) |
- return; |
- |
- var crumbs = this.crumbsElement; |
- if (!crumbs.firstChild) |
- return; |
- |
- var selectedIndex = 0; |
- var focusedIndex = 0; |
- var selectedCrumb; |
- |
- // Reset crumb styles. |
- for (var i = 0; i < crumbs.childNodes.length; ++i) { |
- var crumb = crumbs.children[i]; |
- // Find the selected crumb and index. |
- if (!selectedCrumb && crumb.classList.contains("selected")) { |
- selectedCrumb = crumb; |
- selectedIndex = i; |
- } |
- |
- // Find the focused crumb index. |
- if (crumb === focusedCrumb) |
- focusedIndex = i; |
- |
- crumb.classList.remove("compact", "collapsed", "hidden"); |
- } |
- |
- // Layout 1: Measure total and normal crumb sizes |
- var contentElementWidth = this.contentElement.offsetWidth; |
- var normalSizes = []; |
- for (var i = 0; i < crumbs.childNodes.length; ++i) { |
- var crumb = crumbs.childNodes[i]; |
- normalSizes[i] = crumb.offsetWidth; |
- } |
- |
- // Layout 2: Measure collapsed crumb sizes |
- var compactSizes = []; |
- for (var i = 0; i < crumbs.childNodes.length; ++i) { |
- var crumb = crumbs.childNodes[i]; |
- crumb.classList.add("compact"); |
- } |
- for (var i = 0; i < crumbs.childNodes.length; ++i) { |
- var crumb = crumbs.childNodes[i]; |
- compactSizes[i] = crumb.offsetWidth; |
+ function makeCrumbsSmaller(shrinkingFunction, direction) { |
+ var significantCrumb = focusedCrumb || selectedCrumb; |
+ var significantIndex = significantCrumb === selectedCrumb ? selectedIndex : focusedIndex; |
+ |
+ function shrinkCrumbAtIndex(index) { |
+ var shrinkCrumb = crumbs.children[index]; |
+ if (shrinkCrumb && shrinkCrumb !== significantCrumb) |
+ shrinkingFunction(shrinkCrumb); |
+ if (crumbsAreSmallerThanContainer()) |
+ return true; // No need to compact the crumbs more. |
+ return false; |
+ } |
+ |
+ // Shrink crumbs one at a time by applying the shrinkingFunction until the crumbs |
+ // fit in the container or we run out of crumbs to shrink. |
+ if (direction) { |
+ // Crumbs are shrunk on only one side (based on direction) of the signifcant crumb. |
+ var index = (direction > 0 ? 0 : crumbs.childNodes.length - 1); |
+ while (index !== significantIndex) { |
+ if (shrinkCrumbAtIndex(index)) |
+ return true; |
+ index += (direction > 0 ? 1 : -1); |
} |
- |
- // Layout 3: Measure collapsed crumb size |
- crumbs.firstChild.classList.add("collapsed"); |
- var collapsedSize = crumbs.firstChild.offsetWidth; |
- |
- // Clean up. |
- for (var i = 0; i < crumbs.childNodes.length; ++i) { |
- var crumb = crumbs.childNodes[i]; |
- crumb.classList.remove("compact", "collapsed"); |
+ } else { |
+ // Crumbs are shrunk in order of descending distance from the signifcant crumb, |
+ // with a tie going to child crumbs. |
+ var startIndex = 0; |
+ var endIndex = crumbs.childNodes.length - 1; |
+ while (startIndex !== significantIndex || endIndex !== significantIndex) { |
+ var startDistance = significantIndex - startIndex; |
+ var endDistance = endIndex - significantIndex; |
+ if (startDistance >= endDistance) |
+ var index = startIndex++; |
+ else |
+ var index = endIndex--; |
+ if (shrinkCrumbAtIndex(index)) |
+ return true; |
} |
- |
- function crumbsAreSmallerThanContainer() |
- { |
- var totalSize = 0; |
- for (var i = 0; i < crumbs.childNodes.length; ++i) { |
- var crumb = crumbs.childNodes[i]; |
- if (crumb.classList.contains("hidden")) |
- continue; |
- if (crumb.classList.contains("collapsed")) { |
- totalSize += collapsedSize; |
- continue; |
- } |
- totalSize += crumb.classList.contains("compact") ? compactSizes[i] : normalSizes[i]; |
+ } |
+ |
+ // We are not small enough yet, return false so the caller knows. |
+ return false; |
+ } |
+ |
+ function coalesceCollapsedCrumbs() { |
+ var crumb = crumbs.firstChild; |
+ var collapsedRun = false; |
+ var newStartNeeded = false; |
+ var newEndNeeded = false; |
+ while (crumb) { |
+ var hidden = crumb.classList.contains('hidden'); |
+ if (!hidden) { |
+ var collapsed = crumb.classList.contains('collapsed'); |
+ if (collapsedRun && collapsed) { |
+ crumb.classList.add('hidden'); |
+ crumb.classList.remove('compact'); |
+ crumb.classList.remove('collapsed'); |
+ |
+ if (crumb.classList.contains('start')) { |
+ crumb.classList.remove('start'); |
+ newStartNeeded = true; |
} |
- const rightPadding = 10; |
- return totalSize + rightPadding < contentElementWidth; |
- } |
- |
- if (crumbsAreSmallerThanContainer()) |
- return; // No need to compact the crumbs, they all fit at full size. |
- |
- var BothSides = 0; |
- var AncestorSide = -1; |
- var ChildSide = 1; |
- |
- /** |
- * @param {function(!Element)} shrinkingFunction |
- * @param {number} direction |
- */ |
- function makeCrumbsSmaller(shrinkingFunction, direction) |
- { |
- var significantCrumb = focusedCrumb || selectedCrumb; |
- var significantIndex = significantCrumb === selectedCrumb ? selectedIndex : focusedIndex; |
- |
- function shrinkCrumbAtIndex(index) |
- { |
- var shrinkCrumb = crumbs.children[index]; |
- if (shrinkCrumb && shrinkCrumb !== significantCrumb) |
- shrinkingFunction(shrinkCrumb); |
- if (crumbsAreSmallerThanContainer()) |
- return true; // No need to compact the crumbs more. |
- return false; |
- } |
- |
- // Shrink crumbs one at a time by applying the shrinkingFunction until the crumbs |
- // fit in the container or we run out of crumbs to shrink. |
- if (direction) { |
- // Crumbs are shrunk on only one side (based on direction) of the signifcant crumb. |
- var index = (direction > 0 ? 0 : crumbs.childNodes.length - 1); |
- while (index !== significantIndex) { |
- if (shrinkCrumbAtIndex(index)) |
- return true; |
- index += (direction > 0 ? 1 : -1); |
- } |
- } else { |
- // Crumbs are shrunk in order of descending distance from the signifcant crumb, |
- // with a tie going to child crumbs. |
- var startIndex = 0; |
- var endIndex = crumbs.childNodes.length - 1; |
- while (startIndex !== significantIndex || endIndex !== significantIndex) { |
- var startDistance = significantIndex - startIndex; |
- var endDistance = endIndex - significantIndex; |
- if (startDistance >= endDistance) |
- var index = startIndex++; |
- else |
- var index = endIndex--; |
- if (shrinkCrumbAtIndex(index)) |
- return true; |
- } |
- } |
- |
- // We are not small enough yet, return false so the caller knows. |
- return false; |
- } |
- function coalesceCollapsedCrumbs() |
- { |
- var crumb = crumbs.firstChild; |
- var collapsedRun = false; |
- var newStartNeeded = false; |
- var newEndNeeded = false; |
- while (crumb) { |
- var hidden = crumb.classList.contains("hidden"); |
- if (!hidden) { |
- var collapsed = crumb.classList.contains("collapsed"); |
- if (collapsedRun && collapsed) { |
- crumb.classList.add("hidden"); |
- crumb.classList.remove("compact"); |
- crumb.classList.remove("collapsed"); |
- |
- if (crumb.classList.contains("start")) { |
- crumb.classList.remove("start"); |
- newStartNeeded = true; |
- } |
- |
- if (crumb.classList.contains("end")) { |
- crumb.classList.remove("end"); |
- newEndNeeded = true; |
- } |
- |
- continue; |
- } |
- |
- collapsedRun = collapsed; |
- |
- if (newEndNeeded) { |
- newEndNeeded = false; |
- crumb.classList.add("end"); |
- } |
- } else { |
- collapsedRun = true; |
- } |
- crumb = crumb.nextSibling; |
+ if (crumb.classList.contains('end')) { |
+ crumb.classList.remove('end'); |
+ newEndNeeded = true; |
} |
- if (newStartNeeded) { |
- crumb = crumbs.lastChild; |
- while (crumb) { |
- if (!crumb.classList.contains("hidden")) { |
- crumb.classList.add("start"); |
- break; |
- } |
- crumb = crumb.previousSibling; |
- } |
- } |
- } |
+ continue; |
+ } |
- /** |
- * @param {!Element} crumb |
- */ |
- function compact(crumb) |
- { |
- if (crumb.classList.contains("hidden")) |
- return; |
- crumb.classList.add("compact"); |
- } |
+ collapsedRun = collapsed; |
- /** |
- * @param {!Element} crumb |
- * @param {boolean=} dontCoalesce |
- */ |
- function collapse(crumb, dontCoalesce) |
- { |
- if (crumb.classList.contains("hidden")) |
- return; |
- crumb.classList.add("collapsed"); |
- crumb.classList.remove("compact"); |
- if (!dontCoalesce) |
- coalesceCollapsedCrumbs(); |
+ if (newEndNeeded) { |
+ newEndNeeded = false; |
+ crumb.classList.add('end'); |
+ } |
+ } else { |
+ collapsedRun = true; |
} |
+ crumb = crumb.nextSibling; |
+ } |
- if (!focusedCrumb) { |
- // When not focused on a crumb we can be biased and collapse less important |
- // crumbs that the user might not care much about. |
- |
- // Compact child crumbs. |
- if (makeCrumbsSmaller(compact, ChildSide)) |
- return; |
- |
- // Collapse child crumbs. |
- if (makeCrumbsSmaller(collapse, ChildSide)) |
- return; |
+ if (newStartNeeded) { |
+ crumb = crumbs.lastChild; |
+ while (crumb) { |
+ if (!crumb.classList.contains('hidden')) { |
+ crumb.classList.add('start'); |
+ break; |
+ } |
+ crumb = crumb.previousSibling; |
} |
+ } |
+ } |
- // Compact ancestor crumbs, or from both sides if focused. |
- if (makeCrumbsSmaller(compact, focusedCrumb ? BothSides : AncestorSide)) |
- return; |
- |
- // Collapse ancestor crumbs, or from both sides if focused. |
- if (makeCrumbsSmaller(collapse, focusedCrumb ? BothSides : AncestorSide)) |
- return; |
- |
- if (!selectedCrumb) |
- return; |
- |
- // Compact the selected crumb. |
- compact(selectedCrumb); |
- if (crumbsAreSmallerThanContainer()) |
- return; |
+ /** |
+ * @param {!Element} crumb |
+ */ |
+ function compact(crumb) { |
+ if (crumb.classList.contains('hidden')) |
+ return; |
+ crumb.classList.add('compact'); |
+ } |
- // Collapse the selected crumb as a last resort. Pass true to prevent coalescing. |
- collapse(selectedCrumb, true); |
- }, |
+ /** |
+ * @param {!Element} crumb |
+ * @param {boolean=} dontCoalesce |
+ */ |
+ function collapse(crumb, dontCoalesce) { |
+ if (crumb.classList.contains('hidden')) |
+ return; |
+ crumb.classList.add('collapsed'); |
+ crumb.classList.remove('compact'); |
+ if (!dontCoalesce) |
+ coalesceCollapsedCrumbs(); |
+ } |
+ |
+ if (!focusedCrumb) { |
+ // When not focused on a crumb we can be biased and collapse less important |
+ // crumbs that the user might not care much about. |
+ |
+ // Compact child crumbs. |
+ if (makeCrumbsSmaller(compact, ChildSide)) |
+ return; |
+ |
+ // Collapse child crumbs. |
+ if (makeCrumbsSmaller(collapse, ChildSide)) |
+ return; |
+ } |
+ |
+ // Compact ancestor crumbs, or from both sides if focused. |
+ if (makeCrumbsSmaller(compact, focusedCrumb ? BothSides : AncestorSide)) |
+ return; |
+ |
+ // Collapse ancestor crumbs, or from both sides if focused. |
+ if (makeCrumbsSmaller(collapse, focusedCrumb ? BothSides : AncestorSide)) |
+ return; |
+ |
+ if (!selectedCrumb) |
+ return; |
+ |
+ // Compact the selected crumb. |
+ compact(selectedCrumb); |
+ if (crumbsAreSmallerThanContainer()) |
+ return; |
+ |
+ // Collapse the selected crumb as a last resort. Pass true to prevent coalescing. |
+ collapse(selectedCrumb, true); |
+ } |
+}; |
- __proto__: WebInspector.HBox.prototype |
+/** @enum {symbol} */ |
+WebInspector.ElementsBreadcrumbs.Events = { |
+ NodeSelected: Symbol('NodeSelected') |
}; |