<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[279613] trunk/Source/WebInspectorUI</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/279613">279613</a></dd>
<dt>Author</dt> <dd>pangle@apple.com</dd>
<dt>Date</dt> <dd>2021-07-06 13:25:48 -0700 (Tue, 06 Jul 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: Elements Tab Details Sidebar navigation items sometime wrap to a second line
https://bugs.webkit.org/show_bug.cgi?id=227707

Reviewed by Devin Rousso.

When resizing a sidebar, it was possible that the cumulative widths of each navigation item could add up to just
less than the actual amount of space necessary to lay out each item in a single row, leading to wrapping items
to the next line. This resolves that issue by taking the ceiling of each item's width when calculating the
total amount of space needed to display all the items. Additionally, every time a panel is added or removed from
the sidebar, we need to recalculate the width of the sidebar to make sure the new navigation item, or the
removal thereof, is accommodated.

* UserInterface/Views/NavigationBar.js:
(WI.NavigationBar.prototype.layout.calculateVisibleItemWidth):
(WI.NavigationBar.prototype._calculateMinimumWidth):
* UserInterface/Views/SingleSidebar.js:
(WI.SingleSidebar.prototype.didInsertSidebarPanel):
(WI.SingleSidebar.prototype.didRemoveSidebarPanel):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsNavigationBarjs">trunk/Source/WebInspectorUI/UserInterface/Views/NavigationBar.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsSingleSidebarjs">trunk/Source/WebInspectorUI/UserInterface/Views/SingleSidebar.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (279612 => 279613)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog    2021-07-06 20:19:59 UTC (rev 279612)
+++ trunk/Source/WebInspectorUI/ChangeLog       2021-07-06 20:25:48 UTC (rev 279613)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2021-07-06  Patrick Angle  <pangle@apple.com>
+
+        Web Inspector: Elements Tab Details Sidebar navigation items sometime wrap to a second line
+        https://bugs.webkit.org/show_bug.cgi?id=227707
+
+        Reviewed by Devin Rousso.
+
+        When resizing a sidebar, it was possible that the cumulative widths of each navigation item could add up to just
+        less than the actual amount of space necessary to lay out each item in a single row, leading to wrapping items
+        to the next line. This resolves that issue by taking the ceiling of each item's width when calculating the
+        total amount of space needed to display all the items. Additionally, every time a panel is added or removed from
+        the sidebar, we need to recalculate the width of the sidebar to make sure the new navigation item, or the
+        removal thereof, is accommodated.
+
+        * UserInterface/Views/NavigationBar.js:
+        (WI.NavigationBar.prototype.layout.calculateVisibleItemWidth):
+        (WI.NavigationBar.prototype._calculateMinimumWidth):
+        * UserInterface/Views/SingleSidebar.js:
+        (WI.SingleSidebar.prototype.didInsertSidebarPanel):
+        (WI.SingleSidebar.prototype.didRemoveSidebarPanel):
+
</ins><span class="cx"> 2021-07-02  Harshil Ratnu  <hratnu@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: add contextual documentation for CSS properties
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsNavigationBarjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/NavigationBar.js (279612 => 279613)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/NavigationBar.js 2021-07-06 20:19:59 UTC (rev 279612)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/NavigationBar.js    2021-07-06 20:25:48 UTC (rev 279613)
</span><span class="lines">@@ -223,7 +223,7 @@
</span><span class="cx">         let visibleNavigationItems = this._visibleNavigationItems;
</span><span class="cx"> 
</span><span class="cx">         function calculateVisibleItemWidth() {
</span><del>-            return visibleNavigationItems.reduce((total, item) => total + item.width, 0);
</del><ins>+            return visibleNavigationItems.reduce((total, item) => total + Math.ceil(item.width), 0);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         let totalItemWidth = calculateVisibleItemWidth();
</span><span class="lines">@@ -252,7 +252,7 @@
</span><span class="cx"> 
</span><span class="cx">             while (totalItemWidth > barWidth && visibleNavigationItems.length) {
</span><span class="cx">                 let navigationItem = visibleNavigationItems.shift();
</span><del>-                totalItemWidth -= navigationItem.width;
</del><ins>+                totalItemWidth -= Math.ceil(navigationItem.width);
</ins><span class="cx">                 forceItemHidden(navigationItem, true);
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="lines">@@ -414,7 +414,7 @@
</span><span class="cx">         if (!wasCollapsed)
</span><span class="cx">             this.element.classList.add(WI.NavigationBar.CollapsedStyleClassName);
</span><span class="cx"> 
</span><del>-        let totalItemWidth = visibleNavigationItems.reduce((total, item) => total + item.minimumWidth, 0);
</del><ins>+        let totalItemWidth = visibleNavigationItems.reduce((total, item) => total + Math.ceil(item.minimumWidth), 0);
</ins><span class="cx"> 
</span><span class="cx">         // Remove the collapsed style class if we were not collapsed before.
</span><span class="cx">         if (!wasCollapsed)
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsSingleSidebarjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/SingleSidebar.js (279612 => 279613)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/SingleSidebar.js 2021-07-06 20:19:59 UTC (rev 279612)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/SingleSidebar.js    2021-07-06 20:25:48 UTC (rev 279613)
</span><span class="lines">@@ -83,18 +83,24 @@
</span><span class="cx"> 
</span><span class="cx">     didInsertSidebarPanel(sidebarPanel, index)
</span><span class="cx">     {
</span><del>-        if (this._navigationBar) {
-            console.assert(sidebarPanel.navigationItem);
-            this._navigationBar.insertNavigationItem(sidebarPanel.navigationItem, index);
-        }
</del><ins>+        if (!this._navigationBar)
+            return;
+
+        console.assert(sidebarPanel.navigationItem);
+        this._navigationBar.insertNavigationItem(sidebarPanel.navigationItem, index);
+
+        this._recalculateWidth();   
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     didRemoveSidebarPanel(sidebarPanel)
</span><span class="cx">     {
</span><del>-        if (this._navigationBar) {
-            console.assert(sidebarPanel.navigationItem);
-            this._navigationBar.removeNavigationItem(sidebarPanel.navigationItem);
-        }
</del><ins>+        if (!this._navigationBar)
+            return;
+
+        console.assert(sidebarPanel.navigationItem);
+        this._navigationBar.removeNavigationItem(sidebarPanel.navigationItem);
+
+        this._recalculateWidth();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     willSetSelectedSidebarPanel(sidebarPanel)
</span></span></pre>
</div>
</div>

</body>
</html>