Index: Source/devtools/front_end/ElementsPanel.js |
diff --git a/Source/devtools/front_end/ElementsPanel.js b/Source/devtools/front_end/ElementsPanel.js |
index 995f5d32bc4a94fa8b14f3aef6b50f442ab4c482..fffc60d71d07bbde1e3d9ffdf74ee572a5794b54 100644 |
--- a/Source/devtools/front_end/ElementsPanel.js |
+++ b/Source/devtools/front_end/ElementsPanel.js |
@@ -127,8 +127,8 @@ WebInspector.ElementsPanel.prototype = { |
if (this._splitView.isVertical()) |
width -= this._splitView.sidebarSize(); |
this.treeOutline.setVisibleWidth(width); |
- this.updateBreadcrumbSizes(); |
this.treeOutline.updateSelection(); |
+ this.updateBreadcrumbSizes(); |
}, |
/** |
@@ -755,15 +755,9 @@ WebInspector.ElementsPanel.prototype = { |
if (current === this.selectedDOMNode()) |
crumb.classList.add("selected"); |
- if (!crumbs.childNodes.length) |
- crumb.classList.add("end"); |
- |
crumbs.insertBefore(crumb, crumbs.firstChild); |
} |
- if (crumbs.hasChildNodes()) |
- crumbs.lastChild.classList.add("start"); |
- |
this.updateBreadcrumbSizes(); |
}, |
@@ -775,24 +769,17 @@ WebInspector.ElementsPanel.prototype = { |
if (!this.isShowing()) |
return; |
- if (document.body.offsetWidth <= 0) { |
- // The stylesheet hasn't loaded yet or the window is closed, |
- // so we can't calculate what is need. Return early. |
- return; |
- } |
- |
var crumbs = this.crumbsElement; |
- if (!crumbs.childNodes.length || crumbs.offsetWidth <= 0) |
- return; // No crumbs, do nothing. |
+ if (!crumbs.firstChild) |
+ return; |
- // A Zero index is the right most child crumb in the breadcrumb. |
var selectedIndex = 0; |
var focusedIndex = 0; |
var selectedCrumb; |
- var i = 0; |
- var crumb = crumbs.firstChild; |
- while (crumb) { |
+ // Reset crumb styles. |
+ for (var i = 0; i < crumbs.childNodes.length; ++i) { |
+ var crumb = crumbs.childNodes[i]; |
// Find the selected crumb and index. |
if (!selectedCrumb && crumb.classList.contains("selected")) { |
selectedCrumb = crumb; |
@@ -803,31 +790,53 @@ WebInspector.ElementsPanel.prototype = { |
if (crumb === focusedCrumb) |
focusedIndex = i; |
- // Remove any styles that affect size before |
- // deciding to shorten any crumbs. |
- if (crumb !== crumbs.lastChild) |
- crumb.classList.remove("start"); |
- if (crumb !== crumbs.firstChild) |
- crumb.classList.remove("end"); |
+ crumb.classList.remove("compact", "collapsed", "hidden"); |
+ } |
- crumb.classList.remove("compact"); |
- crumb.classList.remove("collapsed"); |
- crumb.classList.remove("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; |
+ } |
- crumb = crumb.nextSibling; |
- ++i; |
+ // 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; |
} |
- // Restore the start and end crumb classes in case they got removed in coalesceCollapsedCrumbs(). |
- // The order of the crumbs in the document is opposite of the visual order. |
- crumbs.firstChild.classList.add("end"); |
- crumbs.lastChild.classList.add("start"); |
+ // 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"); |
+ } |
- var contentElement = this.contentElement; |
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 crumbs.offsetWidth + rightPadding < contentElement.offsetWidth; |
+ return totalSize + rightPadding < contentElementWidth; |
} |
if (crumbsAreSmallerThanContainer()) |
@@ -838,26 +847,13 @@ WebInspector.ElementsPanel.prototype = { |
var ChildSide = 1; |
/** |
- * @param {boolean=} significantCrumb |
+ * @param {function(!Element)} shrinkingFunction |
+ * @param {number} direction |
*/ |
- function makeCrumbsSmaller(shrinkingFunction, direction, significantCrumb) |
+ function makeCrumbsSmaller(shrinkingFunction, direction) |
{ |
- if (!significantCrumb) |
- significantCrumb = (focusedCrumb || selectedCrumb); |
- |
- if (significantCrumb === selectedCrumb) |
- var significantIndex = selectedIndex; |
- else if (significantCrumb === focusedCrumb) |
- var significantIndex = focusedIndex; |
- else { |
- var significantIndex = 0; |
- for (var i = 0; i < crumbs.childNodes.length; ++i) { |
- if (crumbs.childNodes[i] === significantCrumb) { |
- significantIndex = i; |
- break; |
- } |
- } |
- } |
+ var significantCrumb = focusedCrumb || selectedCrumb; |
+ var significantIndex = significantCrumb === selectedCrumb ? selectedIndex : focusedIndex; |
function shrinkCrumbAtIndex(index) |
{ |
@@ -951,6 +947,9 @@ WebInspector.ElementsPanel.prototype = { |
} |
} |
+ /** |
+ * @param {!Element} crumb |
+ */ |
function compact(crumb) |
{ |
if (crumb.classList.contains("hidden")) |
@@ -958,6 +957,10 @@ WebInspector.ElementsPanel.prototype = { |
crumb.classList.add("compact"); |
} |
+ /** |
+ * @param {!Element} crumb |
+ * @param {boolean=} dontCoalesce |
+ */ |
function collapse(crumb, dontCoalesce) |
{ |
if (crumb.classList.contains("hidden")) |
@@ -982,11 +985,11 @@ WebInspector.ElementsPanel.prototype = { |
} |
// Compact ancestor crumbs, or from both sides if focused. |
- if (makeCrumbsSmaller(compact, (focusedCrumb ? BothSides : AncestorSide))) |
+ if (makeCrumbsSmaller(compact, focusedCrumb ? BothSides : AncestorSide)) |
return; |
// Collapse ancestor crumbs, or from both sides if focused. |
- if (makeCrumbsSmaller(collapse, (focusedCrumb ? BothSides : AncestorSide))) |
+ if (makeCrumbsSmaller(collapse, focusedCrumb ? BothSides : AncestorSide)) |
return; |
if (!selectedCrumb) |