<!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>[194460] 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/194460">194460</a></dd>
<dt>Author</dt> <dd>mattbaker@apple.com</dd>
<dt>Date</dt> <dd>2015-12-31 11:17:23 -0800 (Thu, 31 Dec 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: &quot;No Filter Results&quot; message overlaps Debugger sidebar sections
https://bugs.webkit.org/show_bug.cgi?id=150608

Reviewed by Brian Burg.

* UserInterface/Views/DebuggerSidebarPanel.js:
(WebInspector.DebuggerSidebarPanel.showResourcesWithIssuesOnlyFilterFunction):
Style cleanup.
(WebInspector.DebuggerSidebarPanel):
Add breakpoints tree to the details section before adding Global Breakpoint
elements, since adding them will trigger filtering.
(WebInspector.DebuggerSidebarPanel.prototype._treeSelectionDidChange):
Simplified selection management between the various tree outlines.
(WebInspector.DebuggerSidebarPanel.prototype._updatePauseReasonSection):
Style cleanup.
(WebInspector.DebuggerSidebarPanel.prototype.get hasSelectedElement): Deleted.
Defer to the base class implementation.
(WebInspector.DebuggerSidebarPanel.prototype._treeSelectionDidChange.deselectCallStackContentTreeElements): Deleted.
(WebInspector.DebuggerSidebarPanel.prototype._treeSelectionDidChange.deselectBreakpointContentTreeElements): Deleted.
(WebInspector.DebuggerSidebarPanel.prototype._treeSelectionDidChange.deselectPauseReasonContentTreeElements): Deleted.
These are no longer needed, since the list of visible tree elements list can be used
to manage tree element selection is a more general way.

* UserInterface/Views/NavigationSidebarPanel.css:
Empty content placeholders are now inserted into the DOM as a sibling of the
tree that was filtered. As such, they can be a child of a details section, or
the sidebar's content element.
(.sidebar &gt; .panel.navigation &gt; .content .empty-content-placeholder):
Styles for all empty content placeholders.
(.sidebar &gt; .panel.navigation &gt; .content &gt; .empty-content-placeholder):
Styles for empty content placeholders that fill the sidebar's content element.
(.sidebar &gt; .panel.navigation &gt; .content .message):
Styles for all empty content placeholders.
(.sidebar &gt; .panel.navigation &gt; .empty-content-placeholder): Deleted.
(.sidebar &gt; .panel.navigation &gt; .empty-content-placeholder &gt; .message): Deleted.

* UserInterface/Views/NavigationSidebarPanel.js:
(WebInspector.NavigationSidebarPanel):
Track the tree outline which currently has a selection.
Manage a map of content placeholders
(WebInspector.NavigationSidebarPanel.prototype.set contentTreeOutline):
(WebInspector.NavigationSidebarPanel.prototype.get hasSelectedElement):
Check all visible content trees for a selected element.
(WebInspector.NavigationSidebarPanel.prototype.createContentTreeOutline):
(WebInspector.NavigationSidebarPanel.prototype.treeElementForRepresentedObject):
Check all visible content trees for the represented object.
(WebInspector.NavigationSidebarPanel.prototype.showEmptyContentPlaceholder):
(WebInspector.NavigationSidebarPanel.prototype.hideEmptyContentPlaceholder):
(WebInspector.NavigationSidebarPanel.prototype.updateEmptyContentPlaceholder):
No sidebars currently have more than one filterable content tree outline, but in
the future we will want to support this. Empty content placeholder visibility
is now done per tree outline.
(WebInspector.NavigationSidebarPanel.prototype.show):
Focus the tree outline that most recently had the selection, or the
first tree outline in the visible tree list, if it exists.
(WebInspector.NavigationSidebarPanel.prototype._checkForEmptyFilterResults.checkTreeOutlineForEmptyFilterResults):
Tree is considered filtered if no visible filterable tree elements are found.
(WebInspector.NavigationSidebarPanel.prototype._checkForEmptyFilterResults):
Check all visible trees that support filtering.
(WebInspector.NavigationSidebarPanel.prototype._updateFilter):
Support for filtering multiple content trees.
(WebInspector.NavigationSidebarPanel.prototype._treeElementAddedOrChanged):
Check if the element's tree outline supports filtering, before applying filters.
(WebInspector.NavigationSidebarPanel.prototype._treeSelectionDidChange):
Update the selected tree outline.
(WebInspector.NavigationSidebarPanel.prototype._createEmptyContentPlaceholderIfNeeded):
Create a new empty content placeholder element for the tree.
(WebInspector.NavigationSidebarPanel.prototype.get contentTreeOutlineElement): Deleted.
No longer used.

* UserInterface/Views/TimelineSidebarPanel.js:
(WebInspector.TimelineSidebarPanel.prototype.get hasSelectedElement): Deleted.
Defer to the base class implementation.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsDebuggerSidebarPaneljs">trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsNavigationSidebarPanelcss">trunk/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.css</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsNavigationSidebarPaneljs">trunk/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsTimelineSidebarPaneljs">trunk/Source/WebInspectorUI/UserInterface/Views/TimelineSidebarPanel.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (194459 => 194460)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2015-12-31 19:05:11 UTC (rev 194459)
+++ trunk/Source/WebInspectorUI/ChangeLog        2015-12-31 19:17:23 UTC (rev 194460)
</span><span class="lines">@@ -1,3 +1,79 @@
</span><ins>+2015-12-31  Matt Baker  &lt;mattbaker@apple.com&gt;
+
+        Web Inspector: &quot;No Filter Results&quot; message overlaps Debugger sidebar sections
+        https://bugs.webkit.org/show_bug.cgi?id=150608
+
+        Reviewed by Brian Burg.
+
+        * UserInterface/Views/DebuggerSidebarPanel.js:
+        (WebInspector.DebuggerSidebarPanel.showResourcesWithIssuesOnlyFilterFunction):
+        Style cleanup.
+        (WebInspector.DebuggerSidebarPanel):
+        Add breakpoints tree to the details section before adding Global Breakpoint
+        elements, since adding them will trigger filtering.
+        (WebInspector.DebuggerSidebarPanel.prototype._treeSelectionDidChange):
+        Simplified selection management between the various tree outlines.
+        (WebInspector.DebuggerSidebarPanel.prototype._updatePauseReasonSection):
+        Style cleanup.
+        (WebInspector.DebuggerSidebarPanel.prototype.get hasSelectedElement): Deleted.
+        Defer to the base class implementation.
+        (WebInspector.DebuggerSidebarPanel.prototype._treeSelectionDidChange.deselectCallStackContentTreeElements): Deleted.
+        (WebInspector.DebuggerSidebarPanel.prototype._treeSelectionDidChange.deselectBreakpointContentTreeElements): Deleted.
+        (WebInspector.DebuggerSidebarPanel.prototype._treeSelectionDidChange.deselectPauseReasonContentTreeElements): Deleted.
+        These are no longer needed, since the list of visible tree elements list can be used
+        to manage tree element selection is a more general way.
+
+        * UserInterface/Views/NavigationSidebarPanel.css:
+        Empty content placeholders are now inserted into the DOM as a sibling of the
+        tree that was filtered. As such, they can be a child of a details section, or
+        the sidebar's content element.
+        (.sidebar &gt; .panel.navigation &gt; .content .empty-content-placeholder):
+        Styles for all empty content placeholders.
+        (.sidebar &gt; .panel.navigation &gt; .content &gt; .empty-content-placeholder):
+        Styles for empty content placeholders that fill the sidebar's content element.
+        (.sidebar &gt; .panel.navigation &gt; .content .message):
+        Styles for all empty content placeholders.
+        (.sidebar &gt; .panel.navigation &gt; .empty-content-placeholder): Deleted.
+        (.sidebar &gt; .panel.navigation &gt; .empty-content-placeholder &gt; .message): Deleted.
+
+        * UserInterface/Views/NavigationSidebarPanel.js:
+        (WebInspector.NavigationSidebarPanel):
+        Track the tree outline which currently has a selection.
+        Manage a map of content placeholders
+        (WebInspector.NavigationSidebarPanel.prototype.set contentTreeOutline):
+        (WebInspector.NavigationSidebarPanel.prototype.get hasSelectedElement):
+        Check all visible content trees for a selected element.
+        (WebInspector.NavigationSidebarPanel.prototype.createContentTreeOutline):
+        (WebInspector.NavigationSidebarPanel.prototype.treeElementForRepresentedObject):
+        Check all visible content trees for the represented object.
+        (WebInspector.NavigationSidebarPanel.prototype.showEmptyContentPlaceholder):
+        (WebInspector.NavigationSidebarPanel.prototype.hideEmptyContentPlaceholder):
+        (WebInspector.NavigationSidebarPanel.prototype.updateEmptyContentPlaceholder):
+        No sidebars currently have more than one filterable content tree outline, but in
+        the future we will want to support this. Empty content placeholder visibility
+        is now done per tree outline.
+        (WebInspector.NavigationSidebarPanel.prototype.show):
+        Focus the tree outline that most recently had the selection, or the
+        first tree outline in the visible tree list, if it exists.
+        (WebInspector.NavigationSidebarPanel.prototype._checkForEmptyFilterResults.checkTreeOutlineForEmptyFilterResults):
+        Tree is considered filtered if no visible filterable tree elements are found.
+        (WebInspector.NavigationSidebarPanel.prototype._checkForEmptyFilterResults):
+        Check all visible trees that support filtering.
+        (WebInspector.NavigationSidebarPanel.prototype._updateFilter):
+        Support for filtering multiple content trees.
+        (WebInspector.NavigationSidebarPanel.prototype._treeElementAddedOrChanged):
+        Check if the element's tree outline supports filtering, before applying filters.
+        (WebInspector.NavigationSidebarPanel.prototype._treeSelectionDidChange):
+        Update the selected tree outline.
+        (WebInspector.NavigationSidebarPanel.prototype._createEmptyContentPlaceholderIfNeeded):
+        Create a new empty content placeholder element for the tree.
+        (WebInspector.NavigationSidebarPanel.prototype.get contentTreeOutlineElement): Deleted.
+        No longer used.
+
+        * UserInterface/Views/TimelineSidebarPanel.js:
+        (WebInspector.TimelineSidebarPanel.prototype.get hasSelectedElement): Deleted.
+        Defer to the base class implementation.
+
</ins><span class="cx"> 2015-12-29  Devin Rousso  &lt;dcrousso+webkit@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Styling of invalid selector persists when changing the selected node
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsDebuggerSidebarPaneljs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js (194459 => 194460)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js        2015-12-31 19:05:11 UTC (rev 194459)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js        2015-12-31 19:17:23 UTC (rev 194460)
</span><span class="lines">@@ -92,10 +92,11 @@
</span><span class="cx">         this._globalBreakpointsFolderTreeElement = new WebInspector.FolderTreeElement(WebInspector.UIString(&quot;Global Breakpoints&quot;), null, WebInspector.DebuggerSidebarPanel.GlobalIconStyleClassName);
</span><span class="cx">         this._allExceptionsBreakpointTreeElement = new WebInspector.BreakpointTreeElement(WebInspector.debuggerManager.allExceptionsBreakpoint, WebInspector.DebuggerSidebarPanel.ExceptionIconStyleClassName, WebInspector.UIString(&quot;All Exceptions&quot;));
</span><span class="cx">         this._allUncaughtExceptionsBreakpointTreeElement = new WebInspector.BreakpointTreeElement(WebInspector.debuggerManager.allUncaughtExceptionsBreakpoint, WebInspector.DebuggerSidebarPanel.ExceptionIconStyleClassName, WebInspector.UIString(&quot;All Uncaught Exceptions&quot;));
</span><ins>+        this.suppressFilteringOnTreeElements([this._globalBreakpointsFolderTreeElement, this._allExceptionsBreakpointTreeElement, this._allUncaughtExceptionsBreakpointTreeElement]);
</ins><span class="cx"> 
</span><span class="cx">         this.filterBar.placeholder = WebInspector.UIString(&quot;Filter Breakpoint List&quot;);
</span><span class="cx"> 
</span><del>-        var showResourcesWithIssuesOnlyFilterFunction = function(treeElement)
</del><ins>+        function showResourcesWithIssuesOnlyFilterFunction(treeElement)
</ins><span class="cx">         {
</span><span class="cx">             // Keep issues.
</span><span class="cx">             if (treeElement instanceof WebInspector.IssueTreeElement)
</span><span class="lines">@@ -103,7 +104,7 @@
</span><span class="cx"> 
</span><span class="cx">             // Keep resources with issues.
</span><span class="cx">             if (treeElement.hasChildren) {
</span><del>-                for (var child of treeElement.children) {
</del><ins>+                for (let child of treeElement.children) {
</ins><span class="cx">                     if (child instanceof WebInspector.IssueTreeElement)
</span><span class="cx">                         return true;
</span><span class="cx">                 }
</span><span class="lines">@@ -114,6 +115,15 @@
</span><span class="cx">         this.filterBar.addFilterBarButton(&quot;debugger-show-resources-with-issues-only&quot;, showResourcesWithIssuesOnlyFilterFunction, true, WebInspector.UIString(&quot;Show only resources with issues.&quot;), WebInspector.UIString(&quot;Show resources with and without issues.&quot;), &quot;Images/Errors.svg&quot;, 15, 15);
</span><span class="cx"> 
</span><span class="cx">         this._breakpointsContentTreeOutline = this.contentTreeOutline;
</span><ins>+
+        let breakpointsRow = new WebInspector.DetailsSectionRow;
+        breakpointsRow.element.appendChild(this._breakpointsContentTreeOutline.element);
+
+        let breakpointsGroup = new WebInspector.DetailsSectionGroup([breakpointsRow]);
+        let breakpointsSection = new WebInspector.DetailsSection(&quot;scripts&quot;, WebInspector.UIString(&quot;Scripts&quot;), [breakpointsGroup]);
+        this.contentView.element.appendChild(breakpointsSection.element);
+
+        this._breakpointsContentTreeOutline.element.classList.add(&quot;breakpoints&quot;);
</ins><span class="cx">         this._breakpointsContentTreeOutline.addEventListener(WebInspector.TreeOutline.Event.SelectionDidChange, this._treeSelectionDidChange, this);
</span><span class="cx">         this._breakpointsContentTreeOutline.ondelete = this._breakpointTreeOutlineDeleteTreeElement.bind(this);
</span><span class="cx">         this._breakpointsContentTreeOutline.oncontextmenu = this._breakpointTreeOutlineContextMenuTreeElement.bind(this);
</span><span class="lines">@@ -123,22 +133,13 @@
</span><span class="cx">         this._globalBreakpointsFolderTreeElement.appendChild(this._allUncaughtExceptionsBreakpointTreeElement);
</span><span class="cx">         this._globalBreakpointsFolderTreeElement.expand();
</span><span class="cx"> 
</span><del>-        this.suppressFilteringOnTreeElements([this._globalBreakpointsFolderTreeElement, this._allExceptionsBreakpointTreeElement, this._allUncaughtExceptionsBreakpointTreeElement]);
-
-        var breakpointsRow = new WebInspector.DetailsSectionRow;
-        breakpointsRow.element.appendChild(this._breakpointsContentTreeOutline.element);
-
-        var breakpointsGroup = new WebInspector.DetailsSectionGroup([breakpointsRow]);
-        var breakpointsSection = new WebInspector.DetailsSection(&quot;scripts&quot;, WebInspector.UIString(&quot;Scripts&quot;), [breakpointsGroup]);
-        this.contentView.element.appendChild(breakpointsSection.element);
-
</del><span class="cx">         this._callStackContentTreeOutline = this.createContentTreeOutline(true, true);
</span><span class="cx">         this._callStackContentTreeOutline.addEventListener(WebInspector.TreeOutline.Event.SelectionDidChange, this._treeSelectionDidChange, this);
</span><span class="cx"> 
</span><span class="cx">         this._callStackRow = new WebInspector.DetailsSectionRow(WebInspector.UIString(&quot;No Call Frames&quot;));
</span><span class="cx">         this._callStackRow.showEmptyMessage();
</span><span class="cx"> 
</span><del>-        var callStackGroup = new WebInspector.DetailsSectionGroup([this._callStackRow]);
</del><ins>+        let callStackGroup = new WebInspector.DetailsSectionGroup([this._callStackRow]);
</ins><span class="cx">         this._callStackSection = new WebInspector.DetailsSection(&quot;call-stack&quot;, WebInspector.UIString(&quot;Call Stack&quot;), [callStackGroup]);
</span><span class="cx"> 
</span><span class="cx">         this._pauseReasonTreeOutline = null;
</span><span class="lines">@@ -173,13 +174,6 @@
</span><span class="cx">         WebInspector.IssueMessage.removeEventListener(null, null, this);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    get hasSelectedElement()
-    {
-        return !!this._breakpointsContentTreeOutline.selectedTreeElement
-            || !!this._callStackContentTreeOutline.selectedTreeElement
-            || (this._pauseReasonTreeOutline &amp;&amp; !!this._pauseReasonTreeOutline.selectedTreeElement);
-    }
-
</del><span class="cx">     showDefaultContentView()
</span><span class="cx">     {
</span><span class="cx">         var currentTreeElement = this._contentTreeOutline.children[0];
</span><span class="lines">@@ -608,55 +602,33 @@
</span><span class="cx"> 
</span><span class="cx">     _treeSelectionDidChange(event)
</span><span class="cx">     {
</span><del>-        function deselectCallStackContentTreeElements()
-        {
-            var selectedTreeElement = this._callStackContentTreeOutline.selectedTreeElement;
-            if (selectedTreeElement)
-                selectedTreeElement.deselect();
-        }
</del><ins>+        let treeElement = event.data.selectedElement;
+        if (!treeElement)
+            return;
</ins><span class="cx"> 
</span><del>-        function deselectBreakpointContentTreeElements()
-        {
-            var selectedTreeElement = this._breakpointsContentTreeOutline.selectedTreeElement;
-            if (selectedTreeElement)
-                selectedTreeElement.deselect();
-        }
</del><ins>+        // Deselect any other tree elements to prevent two selections in the sidebar.
+        for (let treeOutline of this.visibleContentTreeOutlines) {
+            if (treeOutline === treeElement.treeOutline)
+                continue;
</ins><span class="cx"> 
</span><del>-        function deselectPauseReasonContentTreeElements()
-        {
-            if (!this._pauseReasonTreeOutline)
-                return;
-
-            var selectedTreeElement = this._pauseReasonTreeOutline.selectedTreeElement;
</del><ins>+            let selectedTreeElement = treeOutline.selectedTreeElement;
</ins><span class="cx">             if (selectedTreeElement)
</span><span class="cx">                 selectedTreeElement.deselect();
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        let treeElement = event.data.selectedElement;
-        if (!treeElement)
-            return;
-
</del><span class="cx">         if (treeElement instanceof WebInspector.ResourceTreeElement || treeElement instanceof WebInspector.ScriptTreeElement) {
</span><del>-            deselectCallStackContentTreeElements.call(this);
-            deselectPauseReasonContentTreeElements.call(this);
</del><span class="cx">             WebInspector.showSourceCode(treeElement.representedObject);
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (treeElement instanceof WebInspector.CallFrameTreeElement) {
</span><del>-            // Deselect any tree element in the breakpoint / pause reason content tree outlines to prevent two selections in the sidebar.
-            deselectBreakpointContentTreeElements.call(this);
-            deselectPauseReasonContentTreeElements.call(this);
-
-            var callFrame = treeElement.callFrame;
</del><ins>+            let callFrame = treeElement.callFrame;
</ins><span class="cx">             WebInspector.debuggerManager.activeCallFrame = callFrame;
</span><span class="cx">             WebInspector.showSourceCodeLocation(callFrame.sourceCodeLocation);
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (treeElement instanceof WebInspector.IssueTreeElement) {
</span><del>-            deselectCallStackContentTreeElements.call(this);
-            deselectPauseReasonContentTreeElements.call(this);
</del><span class="cx">             WebInspector.showSourceCodeLocation(treeElement.issueMessage.sourceCodeLocation);
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="lines">@@ -664,15 +636,7 @@
</span><span class="cx">         if (!(treeElement instanceof WebInspector.BreakpointTreeElement) || treeElement.parent.constructor === WebInspector.FolderTreeElement)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        // Deselect any other tree elements to prevent two selections in the sidebar.
-        deselectCallStackContentTreeElements.call(this);
-
-        if (treeElement.treeOutline === this._pauseReasonTreeOutline)
-            deselectBreakpointContentTreeElements.call(this);
-        else
-            deselectPauseReasonContentTreeElements.call(this);
-
-        var breakpoint = treeElement.breakpoint;
</del><ins>+        let breakpoint = treeElement.breakpoint;
</ins><span class="cx">         if (treeElement.treeOutline === this._pauseReasonTreeOutline) {
</span><span class="cx">             WebInspector.showSourceCodeLocation(breakpoint.sourceCodeLocation);
</span><span class="cx">             return;
</span><span class="lines">@@ -741,17 +705,16 @@
</span><span class="cx">         case WebInspector.DebuggerManager.PauseReason.Breakpoint:
</span><span class="cx">             console.assert(pauseData, &quot;Expected breakpoint identifier, but found none.&quot;);
</span><span class="cx">             if (pauseData &amp;&amp; pauseData.breakpointId) {
</span><del>-                var breakpoint = WebInspector.debuggerManager.breakpointForIdentifier(pauseData.breakpointId);
-                var breakpointTreeOutline = this.createContentTreeOutline(true, true);
-                breakpointTreeOutline.addEventListener(WebInspector.TreeOutline.Event.SelectionDidChange, this._treeSelectionDidChange, this);
</del><ins>+                let breakpoint = WebInspector.debuggerManager.breakpointForIdentifier(pauseData.breakpointId);
+                this._pauseReasonTreeOutline = this.createContentTreeOutline(true, true);
+                this._pauseReasonTreeOutline.addEventListener(WebInspector.TreeOutline.Event.SelectionDidChange, this._treeSelectionDidChange, this);
</ins><span class="cx"> 
</span><del>-                var breakpointTreeElement = new WebInspector.BreakpointTreeElement(breakpoint, WebInspector.DebuggerSidebarPanel.PausedBreakpointIconStyleClassName, WebInspector.UIString(&quot;Triggered Breakpoint&quot;));
-                var breakpointDetailsSection = new WebInspector.DetailsSectionRow;
-                breakpointTreeOutline.appendChild(breakpointTreeElement);
-                breakpointDetailsSection.element.appendChild(breakpointTreeOutline.element);
</del><ins>+                let breakpointTreeElement = new WebInspector.BreakpointTreeElement(breakpoint, WebInspector.DebuggerSidebarPanel.PausedBreakpointIconStyleClassName, WebInspector.UIString(&quot;Triggered Breakpoint&quot;));
+                let breakpointDetailsSection = new WebInspector.DetailsSectionRow;
+                this._pauseReasonTreeOutline.appendChild(breakpointTreeElement);
+                breakpointDetailsSection.element.appendChild(this._pauseReasonTreeOutline.element);
</ins><span class="cx"> 
</span><span class="cx">                 this._pauseReasonGroup.rows = [breakpointDetailsSection];
</span><del>-                this._pauseReasonTreeOutline = breakpointTreeOutline;
</del><span class="cx">                 return true;
</span><span class="cx">             }
</span><span class="cx">             break;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsNavigationSidebarPanelcss"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.css (194459 => 194460)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.css        2015-12-31 19:05:11 UTC (rev 194459)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.css        2015-12-31 19:17:23 UTC (rev 194460)
</span><span class="lines">@@ -57,19 +57,25 @@
</span><span class="cx">     border-bottom-color: hsl(0, 0%, 85%);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-.sidebar &gt; .panel.navigation &gt; .empty-content-placeholder {
-    position: absolute;
-    top: 0;
</del><ins>+.sidebar &gt; .panel.navigation &gt; .content .empty-content-placeholder {
</ins><span class="cx">     left: 0;
</span><span class="cx">     right: 0;
</span><del>-    bottom: 28px;
</del><ins>+    padding-top: 15px;
+    padding-bottom: 15px;
</ins><span class="cx">     display: flex;
</span><span class="cx">     justify-content: center;
</span><span class="cx">     align-items: center;
</span><span class="cx">     overflow: hidden;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-.sidebar &gt; .panel.navigation &gt; .empty-content-placeholder &gt; .message {
</del><ins>+.sidebar &gt; .panel.navigation &gt; .content &gt; .empty-content-placeholder {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    padding: 0;
+}
+
+.sidebar &gt; .panel.navigation &gt; .content .empty-content-placeholder &gt; .message {
</ins><span class="cx">     display: inline-block;
</span><span class="cx">     white-space: nowrap;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsNavigationSidebarPaneljs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.js (194459 => 194460)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.js        2015-12-31 19:05:11 UTC (rev 194459)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.js        2015-12-31 19:17:23 UTC (rev 194460)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx">         this.contentView.element.addEventListener(&quot;scroll&quot;, this._updateContentOverflowShadowVisibility.bind(this));
</span><span class="cx"> 
</span><span class="cx">         this._contentTreeOutline = this.createContentTreeOutline(true);
</span><ins>+        this._selectedContentTreeOutline = null;
</ins><span class="cx"> 
</span><span class="cx">         this._filterBar = new WebInspector.FilterBar;
</span><span class="cx">         this._filterBar.addEventListener(WebInspector.FilterBar.Event.FilterDidChange, this._filterDidChange, this);
</span><span class="lines">@@ -58,13 +59,9 @@
</span><span class="cx">         this._filtersSetting = new WebInspector.Setting(identifier + &quot;-navigation-sidebar-filters&quot;, {});
</span><span class="cx">         this._filterBar.filters = this._filtersSetting.value;
</span><span class="cx"> 
</span><del>-        this._emptyContentPlaceholderElement = document.createElement(&quot;div&quot;);
-        this._emptyContentPlaceholderElement.className = WebInspector.NavigationSidebarPanel.EmptyContentPlaceholderElementStyleClassName;
</del><ins>+        this._emptyContentPlaceholderElements = new Map;
+        this._emptyFilterResults = new Map;
</ins><span class="cx"> 
</span><del>-        this._emptyContentPlaceholderMessageElement = document.createElement(&quot;div&quot;);
-        this._emptyContentPlaceholderMessageElement.className = WebInspector.NavigationSidebarPanel.EmptyContentPlaceholderMessageElementStyleClassName;
-        this._emptyContentPlaceholderElement.appendChild(this._emptyContentPlaceholderMessageElement);
-
</del><span class="cx">         this._generateStyleRulesIfNeeded();
</span><span class="cx"> 
</span><span class="cx">         this._shouldAutoPruneStaleTopLevelResourceTreeElements = shouldAutoPruneStaleTopLevelResourceTreeElements || false;
</span><span class="lines">@@ -97,11 +94,6 @@
</span><span class="cx">         this._contentBrowser = contentBrowser || null;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    get contentTreeOutlineElement()
-    {
-        return this._contentTreeOutline.element;
-    }
-
</del><span class="cx">     get contentTreeOutline()
</span><span class="cx">     {
</span><span class="cx">         return this._contentTreeOutline;
</span><span class="lines">@@ -114,6 +106,7 @@
</span><span class="cx">             return;
</span><span class="cx"> 
</span><span class="cx">         if (this._contentTreeOutline) {
</span><ins>+            this.hideEmptyContentPlaceholder(this._contentTreeOutline);
</ins><span class="cx">             this._contentTreeOutline.hidden = true;
</span><span class="cx">             this._visibleContentTreeOutlines.delete(this._contentTreeOutline);
</span><span class="cx">         }
</span><span class="lines">@@ -133,7 +126,7 @@
</span><span class="cx"> 
</span><span class="cx">     get hasSelectedElement()
</span><span class="cx">     {
</span><del>-        return !!this._contentTreeOutline.selectedTreeElement;
</del><ins>+        return this._visibleContentTreeOutlines.some((treeOutline) =&gt; !!treeOutline.selectedTreeElement);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     get filterBar()
</span><span class="lines">@@ -168,8 +161,11 @@
</span><span class="cx">             contentTreeOutline.addEventListener(WebInspector.TreeOutline.Event.ElementAdded, this._treeElementAddedOrChanged, this);
</span><span class="cx">             contentTreeOutline.addEventListener(WebInspector.TreeOutline.Event.ElementDidChange, this._treeElementAddedOrChanged, this);
</span><span class="cx">             contentTreeOutline.addEventListener(WebInspector.TreeOutline.Event.ElementDisclosureDidChanged, this._treeElementDisclosureDidChange, this);
</span><ins>+            contentTreeOutline.addEventListener(WebInspector.TreeOutline.Event.SelectionDidChange, this._treeSelectionDidChange, this);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        contentTreeOutline[WebInspector.NavigationSidebarPanel.SuppressFilteringSymbol] = suppressFiltering;
+
</ins><span class="cx">         if (dontHideByDefault)
</span><span class="cx">             this._visibleContentTreeOutlines.add(contentTreeOutline);
</span><span class="cx"> 
</span><span class="lines">@@ -188,7 +184,14 @@
</span><span class="cx"> 
</span><span class="cx">     treeElementForRepresentedObject(representedObject)
</span><span class="cx">     {
</span><del>-        return this._contentTreeOutline.getCachedTreeElement(representedObject);
</del><ins>+        let treeElement = null;
+        for (let treeOutline of this._visibleContentTreeOutlines) {
+            treeElement = treeOutline.getCachedTreeElement(representedObject);
+            if (treeElement)
+                break;
+        }
+
+        return treeElement;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     showDefaultContentView()
</span><span class="lines">@@ -263,37 +266,47 @@
</span><span class="cx">         this._finalAttemptToRestoreViewStateTimeout = setTimeout(finalAttemptToRestoreViewStateFromCookie.bind(this), relaxedMatchDelay);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    showEmptyContentPlaceholder(message)
</del><ins>+    showEmptyContentPlaceholder(message, treeOutline)
</ins><span class="cx">     {
</span><span class="cx">         console.assert(message);
</span><span class="cx"> 
</span><del>-        if (this._emptyContentPlaceholderElement.parentNode &amp;&amp; this._emptyContentPlaceholderMessageElement.textContent === message)
</del><ins>+        treeOutline = treeOutline || this._contentTreeOutline;
+
+        let emptyContentPlaceholderElement = this._createEmptyContentPlaceholderIfNeeded(treeOutline);
+        if (emptyContentPlaceholderElement.parentNode &amp;&amp; emptyContentPlaceholderElement.children[0].textContent === message)
</ins><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        this._emptyContentPlaceholderMessageElement.textContent = message;
-        this.element.appendChild(this._emptyContentPlaceholderElement);
</del><ins>+        emptyContentPlaceholderElement.children[0].textContent = message;
</ins><span class="cx"> 
</span><ins>+        let emptyContentPlaceholderParentElement = treeOutline.element.parentNode;
+        emptyContentPlaceholderParentElement.appendChild(emptyContentPlaceholderElement);
+
</ins><span class="cx">         this._updateContentOverflowShadowVisibility();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    hideEmptyContentPlaceholder()
</del><ins>+    hideEmptyContentPlaceholder(treeOutline)
</ins><span class="cx">     {
</span><del>-        if (!this._emptyContentPlaceholderElement.parentNode)
</del><ins>+        treeOutline = treeOutline || this._contentTreeOutline;
+
+        let emptyContentPlaceholderElement = this._emptyContentPlaceholderElements.get(treeOutline);
+        if (!emptyContentPlaceholderElement || !emptyContentPlaceholderElement.parentNode)
</ins><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        this._emptyContentPlaceholderElement.parentNode.removeChild(this._emptyContentPlaceholderElement);
</del><ins>+        emptyContentPlaceholderElement.remove();
</ins><span class="cx"> 
</span><span class="cx">         this._updateContentOverflowShadowVisibility();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    updateEmptyContentPlaceholder(message)
</del><ins>+    updateEmptyContentPlaceholder(message, treeOutline)
</ins><span class="cx">     {
</span><del>-        if (!this._contentTreeOutline.children.length) {
</del><ins>+        treeOutline = treeOutline || this._contentTreeOutline;
+
+        if (!treeOutline.children.length) {
</ins><span class="cx">             // No tree elements, so no results.
</span><del>-            this.showEmptyContentPlaceholder(message);
-        } else if (!this._emptyFilterResults) {
</del><ins>+            this.showEmptyContentPlaceholder(message, treeOutline);
+        } else if (!this._emptyFilterResults.get(treeOutline)) {
</ins><span class="cx">             // There are tree elements, and not all of them are hidden by the filter.
</span><del>-            this.hideEmptyContentPlaceholder();
</del><ins>+            this.hideEmptyContentPlaceholder(treeOutline);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -425,7 +438,12 @@
</span><span class="cx"> 
</span><span class="cx">         super.show();
</span><span class="cx"> 
</span><del>-        this.contentTreeOutlineElement.focus();
</del><ins>+        let treeOutline = this._selectedContentTreeOutline;
+        if (!treeOutline &amp;&amp; this._visibleContentTreeOutlines.length)
+            treeOutline = this._visibleContentTreeOutlines[0];
+
+        if (treeOutline)
+            treeOutline.element.focus();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     shown()
</span><span class="lines">@@ -502,26 +520,47 @@
</span><span class="cx"> 
</span><span class="cx">     _checkForEmptyFilterResults()
</span><span class="cx">     {
</span><del>-        // No tree elements, so don't touch the empty content placeholder.
-        if (!this._contentTreeOutline.children.length)
-            return;
</del><ins>+        function checkTreeOutlineForEmptyFilterResults(treeOutline)
+        {
+            // No tree elements, so don't touch the empty content placeholder.
+            if (!treeOutline.children.length)
+                return;
</ins><span class="cx"> 
</span><del>-        // Iterate over all the top level tree elements. If any are visible, return early.
-        var currentTreeElement = this._contentTreeOutline.children[0];
-        while (currentTreeElement) {
-            if (!currentTreeElement.hidden &amp;&amp; !currentTreeElement[WebInspector.NavigationSidebarPanel.SuppressFilteringSymbol]) {
-                // Not hidden, so hide any empty content message.
-                this.hideEmptyContentPlaceholder();
-                this._emptyFilterResults = false;
</del><ins>+            // Iterate over all the top level tree elements. If any filterable elements are visible, return early.
+            let filterableTreeElementFound = false;
+            let unfilteredTreeElementFound = false;
+            let currentTreeElement = treeOutline.children[0];
+            while (currentTreeElement) {
+                let suppressFilteringForTreeElement = currentTreeElement[WebInspector.NavigationSidebarPanel.SuppressFilteringSymbol];
+                if (!suppressFilteringForTreeElement) {
+                    filterableTreeElementFound = true;
+
+                    if (!currentTreeElement.hidden) {
+                        unfilteredTreeElementFound = true;
+                        break;
+                    }
+                }
+
+                currentTreeElement = currentTreeElement.nextSibling;
+            }
+
+            if (unfilteredTreeElementFound || !filterableTreeElementFound) {
+                this.hideEmptyContentPlaceholder(treeOutline);
+                this._emptyFilterResults.set(treeOutline, false);
</ins><span class="cx">                 return;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            currentTreeElement = currentTreeElement.nextSibling;
</del><ins>+            // All top level tree elements are hidden, so filtering hid everything. Show a message.
+            this.showEmptyContentPlaceholder(WebInspector.UIString(&quot;No Filter Results&quot;), treeOutline);
+            this._emptyFilterResults.set(treeOutline, true);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // All top level tree elements are hidden, so filtering hid everything. Show a message.
-        this.showEmptyContentPlaceholder(WebInspector.UIString(&quot;No Filter Results&quot;));
-        this._emptyFilterResults = true;
</del><ins>+        for (let treeOutline of this._visibleContentTreeOutlines) {
+            if (treeOutline[WebInspector.NavigationSidebarPanel.SuppressFilteringSymbol])
+                continue;
+
+            checkTreeOutlineForEmptyFilterResults.call(this, treeOutline);
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     _filterDidChange()
</span><span class="lines">@@ -531,27 +570,43 @@
</span><span class="cx"> 
</span><span class="cx">     _updateFilter()
</span><span class="cx">     {
</span><del>-        var selectedTreeElement = this._contentTreeOutline.selectedTreeElement;
-        var selectionWasHidden = selectedTreeElement &amp;&amp; selectedTreeElement.hidden;
</del><ins>+        let selectedTreeElement;
+        for (let treeOutline of this.visibleContentTreeOutlines) {
+            if (treeOutline.hidden || treeOutline[WebInspector.NavigationSidebarPanel.SuppressFilteringSymbol])
+                continue;
</ins><span class="cx"> 
</span><del>-        var filters = this._filterBar.filters;
</del><ins>+            selectedTreeElement = treeOutline.selectedTreeElement;
+            if (selectedTreeElement)
+                break;
+        }
+
+        let selectionWasHidden = selectedTreeElement &amp;&amp; selectedTreeElement.hidden;
+
+        let filters = this._filterBar.filters;
</ins><span class="cx">         this._textFilterRegex = simpleGlobStringToRegExp(filters.text, &quot;i&quot;);
</span><span class="cx">         this._filtersSetting.value = filters;
</span><span class="cx">         this._filterFunctions = filters.functions;
</span><span class="cx"> 
</span><span class="cx">         // Don't populate if we don't have any active filters.
</span><span class="cx">         // We only need to populate when a filter needs to reveal.
</span><del>-        var dontPopulate = !this._filterBar.hasActiveFilters() &amp;&amp; !this.shouldFilterPopulate();
</del><ins>+        let dontPopulate = !this._filterBar.hasActiveFilters() &amp;&amp; !this.shouldFilterPopulate();
</ins><span class="cx"> 
</span><del>-        // Update the whole tree.
-        var currentTreeElement = this._contentTreeOutline.children[0];
-        while (currentTreeElement &amp;&amp; !currentTreeElement.root) {
-            const currentTreeElementWasHidden = currentTreeElement.hidden;
-            this.applyFiltersToTreeElement(currentTreeElement);
-            if (currentTreeElementWasHidden !== currentTreeElement.hidden)
-                this.representedObjectWasFiltered(currentTreeElement.representedObject, currentTreeElement.hidden);
</del><ins>+        // Update all trees that allow filtering.
+        for (let treeOutline of this.visibleContentTreeOutlines) {
+            if (treeOutline.hidden || treeOutline[WebInspector.NavigationSidebarPanel.SuppressFilteringSymbol])
+                continue;
</ins><span class="cx"> 
</span><del>-            currentTreeElement = currentTreeElement.traverseNextTreeElement(false, null, dontPopulate);
</del><ins>+            let currentTreeElement = treeOutline.children[0];
+            while (currentTreeElement &amp;&amp; !currentTreeElement.root) {
+                if (!currentTreeElement[WebInspector.NavigationSidebarPanel.SuppressFilteringSymbol]) {
+                    const currentTreeElementWasHidden = currentTreeElement.hidden;
+                    this.applyFiltersToTreeElement(currentTreeElement);
+                    if (currentTreeElementWasHidden !== currentTreeElement.hidden)
+                        this.representedObjectWasFiltered(currentTreeElement.representedObject, currentTreeElement.hidden);
+                }
+
+                currentTreeElement = currentTreeElement.traverseNextTreeElement(false, null, dontPopulate);
+            }
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         this._checkForEmptyFilterResults();
</span><span class="lines">@@ -576,10 +631,12 @@
</span><span class="cx">         let treeElement = event.data.element;
</span><span class="cx">         let currentTreeElement = treeElement;
</span><span class="cx">         while (currentTreeElement &amp;&amp; !currentTreeElement.root) {
</span><del>-            const currentTreeElementWasHidden = currentTreeElement.hidden;
-            this.applyFiltersToTreeElement(currentTreeElement);
-            if (currentTreeElementWasHidden !== currentTreeElement.hidden)
-                this.representedObjectWasFiltered(currentTreeElement.representedObject, currentTreeElement.hidden);
</del><ins>+            if (!currentTreeElement[WebInspector.NavigationSidebarPanel.SuppressFilteringSymbol]) {
+                const currentTreeElementWasHidden = currentTreeElement.hidden;
+                this.applyFiltersToTreeElement(currentTreeElement);
+                if (currentTreeElementWasHidden !== currentTreeElement.hidden)
+                    this.representedObjectWasFiltered(currentTreeElement.representedObject, currentTreeElement.hidden);
+            }
</ins><span class="cx"> 
</span><span class="cx">             currentTreeElement = currentTreeElement.traverseNextTreeElement(false, treeElement, dontPopulate);
</span><span class="cx">         }
</span><span class="lines">@@ -598,6 +655,12 @@
</span><span class="cx">         this._updateContentOverflowShadowVisibility();
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    _treeSelectionDidChange(event)
+    {
+        let selectedElement = event.data.selectedElement;
+        this._selectedContentTreeOutline = selectedElement ? selectedElement.treeOutline : null;
+    }
+
</ins><span class="cx">     _generateStyleRulesIfNeeded()
</span><span class="cx">     {
</span><span class="cx">         if (WebInspector.NavigationSidebarPanel._styleElement)
</span><span class="lines">@@ -726,6 +789,23 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><ins>+
+    _createEmptyContentPlaceholderIfNeeded(treeOutline)
+    {
+        let emptyContentPlaceholderElement = this._emptyContentPlaceholderElements.get(treeOutline);
+        if (emptyContentPlaceholderElement)
+            return emptyContentPlaceholderElement;
+
+        emptyContentPlaceholderElement = document.createElement(&quot;div&quot;);
+        emptyContentPlaceholderElement.classList.add(WebInspector.NavigationSidebarPanel.EmptyContentPlaceholderElementStyleClassName);
+        this._emptyContentPlaceholderElements.set(treeOutline, emptyContentPlaceholderElement);
+
+        let emptyContentPlaceholderMessageElement = document.createElement(&quot;div&quot;);
+        emptyContentPlaceholderMessageElement.className = WebInspector.NavigationSidebarPanel.EmptyContentPlaceholderMessageElementStyleClassName;
+        emptyContentPlaceholderElement.appendChild(emptyContentPlaceholderMessageElement);
+
+        return emptyContentPlaceholderElement;
+    }
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> WebInspector.NavigationSidebarPanel.SuppressFilteringSymbol = Symbol(&quot;supresss-filtering&quot;);
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsTimelineSidebarPaneljs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/TimelineSidebarPanel.js (194459 => 194460)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/TimelineSidebarPanel.js        2015-12-31 19:05:11 UTC (rev 194459)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/TimelineSidebarPanel.js        2015-12-31 19:17:23 UTC (rev 194460)
</span><span class="lines">@@ -264,11 +264,6 @@
</span><span class="cx">             this.showTimelineOverview();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    get hasSelectedElement()
-    {
-        return !!this._contentTreeOutline.selectedTreeElement || !!this._recordingsTreeOutline.selectedTreeElement;
-    }
-
</del><span class="cx">     treeElementForRepresentedObject(representedObject)
</span><span class="cx">     {
</span><span class="cx">         if (representedObject instanceof WebInspector.TimelineRecording)
</span></span></pre>
</div>
</div>

</body>
</html>