<!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>[175784] 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/175784">175784</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-11-08 19:17:40 -0800 (Sat, 08 Nov 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: decouple child element folderization logic from FrameTreeElement
https://bugs.webkit.org/show_bug.cgi?id=138364

Patch by Matt Baker &lt;mattbaker@apple.com&gt; on 2014-11-08
Reviewed by Timothy Hatcher.

Created FolderizedTreeElement base class, which FrameTreeElement now inherits via SourceCodeTreeElement.
FolderizedTreeElement uses settings provided by derived classes for labeling subfolders and to determine
folder membership for child items.

* UserInterface/Base/Main.js:
(WebInspector.canArchiveMainFrame):
* UserInterface/Main.html:
* UserInterface/Models/LayoutTimelineRecord.js:
(WebInspector.LayoutTimelineRecord.displayNameForEventType):
(WebInspector.LayoutTimelineRecord.EventType.displayName): Deleted.
* UserInterface/Models/Resource.js:
(WebInspector.Resource):
(WebInspector.Resource.typeFromMIMEType):
(WebInspector.Resource.displayNameForType):
(WebInspector.Resource.prototype.get syntheticMIMEType):
(WebInspector.Resource.prototype.updateForResponse):
(WebInspector.Resource.Type.fromMIMEType): Deleted.
(WebInspector.Resource.Type.displayName): Deleted.
* UserInterface/Models/SourceMapResource.js:
(WebInspector.SourceMapResource):
* UserInterface/Views/FolderizedTreeElement.js: Added.
(WebInspector.FolderizedTreeElement):
(WebInspector.FolderizedTreeElement.prototype.get groupedIntoFolders):
(WebInspector.FolderizedTreeElement.prototype.set folderSettingsKey):
(WebInspector.FolderizedTreeElement.prototype.registerFolderizeSettings):
(WebInspector.FolderizedTreeElement.prototype.set removeChildren):
(WebInspector.FolderizedTreeElement.prototype.addChildForRepresentedObject):
(WebInspector.FolderizedTreeElement.prototype.addRepresentedObjectToNewChildQueue):
(WebInspector.FolderizedTreeElement.prototype.removeChildForRepresentedObject):
(WebInspector.FolderizedTreeElement.prototype.compareChildTreeElements):
(WebInspector.FolderizedTreeElement.prototype.updateParentStatus):
(WebInspector.FolderizedTreeElement.prototype._clearNewChildQueue):
(WebInspector.FolderizedTreeElement.prototype._populateFromNewChildQueue):
(WebInspector.FolderizedTreeElement.prototype._removeRepresentedObjectFromNewChildQueue):
(WebInspector.FolderizedTreeElement.prototype._addTreeElement):
(WebInspector.FolderizedTreeElement.prototype._compareTreeElementsByMainTitle):
(WebInspector.FolderizedTreeElement.prototype._insertFolderTreeElement):
(WebInspector.FolderizedTreeElement.prototype._insertChildTreeElement):
(WebInspector.FolderizedTreeElement.prototype._removeTreeElement):
(WebInspector.FolderizedTreeElement.prototype._parentTreeElementForRepresentedObject):
(WebInspector.FolderizedTreeElement.prototype._folderTreeElementExpandedStateChange):
(WebInspector.FolderizedTreeElement.prototype._settingsForRepresentedObject):
(WebInspector.FolderizedTreeElement.prototype._shouldGroupIntoFolders.pushCategory):
(WebInspector.FolderizedTreeElement.prototype._shouldGroupIntoFolders):
* UserInterface/Views/FrameTreeElement.js:
(.this):
(WebInspector.FrameTreeElement.prototype.updateSourceMapResources):
(WebInspector.FrameTreeElement.prototype.onattach):
(WebInspector.FrameTreeElement.prototype.ondetach):
(WebInspector.FrameTreeElement.prototype.compareChildTreeElements):
(WebInspector.FrameTreeElement.prototype.onpopulate):
(WebInspector.FrameTreeElement.prototype._mainResourceDidChange):
(WebInspector.FrameTreeElement.prototype._resourceWasAdded):
(WebInspector.FrameTreeElement.prototype._resourceWasRemoved):
(WebInspector.FrameTreeElement.prototype._childFrameWasAdded):
(WebInspector.FrameTreeElement.prototype._childFrameWasRemoved):
(WebInspector.FrameTreeElement.prototype._childContentFlowWasAdded):
(WebInspector.FrameTreeElement.prototype._childContentFlowWasRemoved):
(WebInspector.FrameTreeElement.prototype._rootDOMNodeInvalidated):
(WebInspector.FrameTreeElement): Deleted.
(WebInspector.FrameTreeElement.prototype.removeChildren): Deleted.
(WebInspector.FrameTreeElement.prototype._updateParentStatus): Deleted.
(WebInspector.FrameTreeElement.prototype._addRepresentedObjectToNewChildQueue): Deleted.
(WebInspector.FrameTreeElement.prototype._removeRepresentedObjectFromNewChildQueue): Deleted.
(WebInspector.FrameTreeElement.prototype._populateFromNewChildQueue): Deleted.
(WebInspector.FrameTreeElement.prototype._clearNewChildQueue): Deleted.
(WebInspector.FrameTreeElement.prototype._addChildForRepresentedObject): Deleted.
(WebInspector.FrameTreeElement.prototype._removeChildForRepresentedObject): Deleted.
(WebInspector.FrameTreeElement.prototype._addTreeElementForRepresentedObject): Deleted.
(WebInspector.FrameTreeElement.prototype._addTreeElement): Deleted.
(WebInspector.FrameTreeElement.prototype._compareTreeElementsByMainTitle): Deleted.
(WebInspector.FrameTreeElement.prototype._insertFolderTreeElement): Deleted.
(WebInspector.FrameTreeElement.prototype._compareResourceTreeElements): Deleted.
(WebInspector.FrameTreeElement.prototype._insertResourceTreeElement): Deleted.
(WebInspector.FrameTreeElement.prototype._removeTreeElement): Deleted.
(WebInspector.FrameTreeElement.prototype._folderNameForResourceType): Deleted.
(WebInspector.FrameTreeElement.prototype._parentTreeElementForRepresentedObject.createFolderTreeElement): Deleted.
(WebInspector.FrameTreeElement.prototype._parentTreeElementForRepresentedObject): Deleted.
(WebInspector.FrameTreeElement.prototype._folderTreeElementExpandedStateChange): Deleted.
(WebInspector.FrameTreeElement.prototype._shouldGroupIntoFolders.pushResourceType): Deleted.
(WebInspector.FrameTreeElement.prototype._shouldGroupIntoFolders.pushCategory): Deleted.
(WebInspector.FrameTreeElement.prototype._shouldGroupIntoFolders): Deleted.
* UserInterface/Views/LayoutTimelineDataGridNode.js:
(WebInspector.LayoutTimelineDataGridNode.prototype.createCellContent):
* UserInterface/Views/LayoutTimelineView.js:
(WebInspector.LayoutTimelineView): Deleted.
* UserInterface/Views/NetworkTimelineView.js:
(WebInspector.NetworkTimelineView): Deleted.
* UserInterface/Views/ResourceDetailsSidebarPanel.js:
(WebInspector.ResourceDetailsSidebarPanel.prototype._refreshResourceType):
* UserInterface/Views/ResourceTimelineDataGridNode.js:
(WebInspector.ResourceTimelineDataGridNode.prototype.createCellContent):
* UserInterface/Views/SourceCodeTreeElement.js:
(WebInspector.SourceCodeTreeElement):
* UserInterface/Views/TimelineDataGrid.js:
(WebInspector.TimelineDataGrid.createColumnScopeBar):
* UserInterface/Views/TimelineRecordTreeElement.js:
(WebInspector.TimelineRecordTreeElement):
* WebInspectorUI.vcxproj/WebInspectorUI.vcxproj:
* WebInspectorUI.vcxproj/WebInspectorUI.vcxproj.filters:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceBaseMainjs">trunk/Source/WebInspectorUI/UserInterface/Base/Main.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceMainhtml">trunk/Source/WebInspectorUI/UserInterface/Main.html</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceModelsLayoutTimelineRecordjs">trunk/Source/WebInspectorUI/UserInterface/Models/LayoutTimelineRecord.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceModelsResourcejs">trunk/Source/WebInspectorUI/UserInterface/Models/Resource.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceModelsSourceMapResourcejs">trunk/Source/WebInspectorUI/UserInterface/Models/SourceMapResource.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsFrameTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/FrameTreeElement.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsLayoutTimelineDataGridNodejs">trunk/Source/WebInspectorUI/UserInterface/Views/LayoutTimelineDataGridNode.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsLayoutTimelineViewjs">trunk/Source/WebInspectorUI/UserInterface/Views/LayoutTimelineView.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsNetworkTimelineViewjs">trunk/Source/WebInspectorUI/UserInterface/Views/NetworkTimelineView.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsResourceDetailsSidebarPaneljs">trunk/Source/WebInspectorUI/UserInterface/Views/ResourceDetailsSidebarPanel.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsResourceTimelineDataGridNodejs">trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTimelineDataGridNode.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsSourceCodeTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTreeElement.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsTimelineDataGridjs">trunk/Source/WebInspectorUI/UserInterface/Views/TimelineDataGrid.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsTimelineRecordTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordTreeElement.js</a></li>
<li><a href="#trunkSourceWebInspectorUIWebInspectorUIvcxprojWebInspectorUIvcxproj">trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj</a></li>
<li><a href="#trunkSourceWebInspectorUIWebInspectorUIvcxprojWebInspectorUIvcxprojfilters">trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj.filters</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsFolderizedTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/FolderizedTreeElement.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/ChangeLog        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -1,3 +1,111 @@
</span><ins>+2014-11-08  Matt Baker  &lt;mattbaker@apple.com&gt;
+
+        Web Inspector: decouple child element folderization logic from FrameTreeElement
+        https://bugs.webkit.org/show_bug.cgi?id=138364
+
+        Reviewed by Timothy Hatcher.
+
+        Created FolderizedTreeElement base class, which FrameTreeElement now inherits via SourceCodeTreeElement.
+        FolderizedTreeElement uses settings provided by derived classes for labeling subfolders and to determine
+        folder membership for child items.
+
+        * UserInterface/Base/Main.js:
+        (WebInspector.canArchiveMainFrame):
+        * UserInterface/Main.html:
+        * UserInterface/Models/LayoutTimelineRecord.js:
+        (WebInspector.LayoutTimelineRecord.displayNameForEventType):
+        (WebInspector.LayoutTimelineRecord.EventType.displayName): Deleted.
+        * UserInterface/Models/Resource.js:
+        (WebInspector.Resource):
+        (WebInspector.Resource.typeFromMIMEType):
+        (WebInspector.Resource.displayNameForType):
+        (WebInspector.Resource.prototype.get syntheticMIMEType):
+        (WebInspector.Resource.prototype.updateForResponse):
+        (WebInspector.Resource.Type.fromMIMEType): Deleted.
+        (WebInspector.Resource.Type.displayName): Deleted.
+        * UserInterface/Models/SourceMapResource.js:
+        (WebInspector.SourceMapResource):
+        * UserInterface/Views/FolderizedTreeElement.js: Added.
+        (WebInspector.FolderizedTreeElement):
+        (WebInspector.FolderizedTreeElement.prototype.get groupedIntoFolders):
+        (WebInspector.FolderizedTreeElement.prototype.set folderSettingsKey):
+        (WebInspector.FolderizedTreeElement.prototype.registerFolderizeSettings):
+        (WebInspector.FolderizedTreeElement.prototype.set removeChildren):
+        (WebInspector.FolderizedTreeElement.prototype.addChildForRepresentedObject):
+        (WebInspector.FolderizedTreeElement.prototype.addRepresentedObjectToNewChildQueue):
+        (WebInspector.FolderizedTreeElement.prototype.removeChildForRepresentedObject):
+        (WebInspector.FolderizedTreeElement.prototype.compareChildTreeElements):
+        (WebInspector.FolderizedTreeElement.prototype.updateParentStatus):
+        (WebInspector.FolderizedTreeElement.prototype._clearNewChildQueue):
+        (WebInspector.FolderizedTreeElement.prototype._populateFromNewChildQueue):
+        (WebInspector.FolderizedTreeElement.prototype._removeRepresentedObjectFromNewChildQueue):
+        (WebInspector.FolderizedTreeElement.prototype._addTreeElement):
+        (WebInspector.FolderizedTreeElement.prototype._compareTreeElementsByMainTitle):
+        (WebInspector.FolderizedTreeElement.prototype._insertFolderTreeElement):
+        (WebInspector.FolderizedTreeElement.prototype._insertChildTreeElement):
+        (WebInspector.FolderizedTreeElement.prototype._removeTreeElement):
+        (WebInspector.FolderizedTreeElement.prototype._parentTreeElementForRepresentedObject):
+        (WebInspector.FolderizedTreeElement.prototype._folderTreeElementExpandedStateChange):
+        (WebInspector.FolderizedTreeElement.prototype._settingsForRepresentedObject):
+        (WebInspector.FolderizedTreeElement.prototype._shouldGroupIntoFolders.pushCategory):
+        (WebInspector.FolderizedTreeElement.prototype._shouldGroupIntoFolders):
+        * UserInterface/Views/FrameTreeElement.js:
+        (.this):
+        (WebInspector.FrameTreeElement.prototype.updateSourceMapResources):
+        (WebInspector.FrameTreeElement.prototype.onattach):
+        (WebInspector.FrameTreeElement.prototype.ondetach):
+        (WebInspector.FrameTreeElement.prototype.compareChildTreeElements):
+        (WebInspector.FrameTreeElement.prototype.onpopulate):
+        (WebInspector.FrameTreeElement.prototype._mainResourceDidChange):
+        (WebInspector.FrameTreeElement.prototype._resourceWasAdded):
+        (WebInspector.FrameTreeElement.prototype._resourceWasRemoved):
+        (WebInspector.FrameTreeElement.prototype._childFrameWasAdded):
+        (WebInspector.FrameTreeElement.prototype._childFrameWasRemoved):
+        (WebInspector.FrameTreeElement.prototype._childContentFlowWasAdded):
+        (WebInspector.FrameTreeElement.prototype._childContentFlowWasRemoved):
+        (WebInspector.FrameTreeElement.prototype._rootDOMNodeInvalidated):
+        (WebInspector.FrameTreeElement): Deleted.
+        (WebInspector.FrameTreeElement.prototype.removeChildren): Deleted.
+        (WebInspector.FrameTreeElement.prototype._updateParentStatus): Deleted.
+        (WebInspector.FrameTreeElement.prototype._addRepresentedObjectToNewChildQueue): Deleted.
+        (WebInspector.FrameTreeElement.prototype._removeRepresentedObjectFromNewChildQueue): Deleted.
+        (WebInspector.FrameTreeElement.prototype._populateFromNewChildQueue): Deleted.
+        (WebInspector.FrameTreeElement.prototype._clearNewChildQueue): Deleted.
+        (WebInspector.FrameTreeElement.prototype._addChildForRepresentedObject): Deleted.
+        (WebInspector.FrameTreeElement.prototype._removeChildForRepresentedObject): Deleted.
+        (WebInspector.FrameTreeElement.prototype._addTreeElementForRepresentedObject): Deleted.
+        (WebInspector.FrameTreeElement.prototype._addTreeElement): Deleted.
+        (WebInspector.FrameTreeElement.prototype._compareTreeElementsByMainTitle): Deleted.
+        (WebInspector.FrameTreeElement.prototype._insertFolderTreeElement): Deleted.
+        (WebInspector.FrameTreeElement.prototype._compareResourceTreeElements): Deleted.
+        (WebInspector.FrameTreeElement.prototype._insertResourceTreeElement): Deleted.
+        (WebInspector.FrameTreeElement.prototype._removeTreeElement): Deleted.
+        (WebInspector.FrameTreeElement.prototype._folderNameForResourceType): Deleted.
+        (WebInspector.FrameTreeElement.prototype._parentTreeElementForRepresentedObject.createFolderTreeElement): Deleted.
+        (WebInspector.FrameTreeElement.prototype._parentTreeElementForRepresentedObject): Deleted.
+        (WebInspector.FrameTreeElement.prototype._folderTreeElementExpandedStateChange): Deleted.
+        (WebInspector.FrameTreeElement.prototype._shouldGroupIntoFolders.pushResourceType): Deleted.
+        (WebInspector.FrameTreeElement.prototype._shouldGroupIntoFolders.pushCategory): Deleted.
+        (WebInspector.FrameTreeElement.prototype._shouldGroupIntoFolders): Deleted.
+        * UserInterface/Views/LayoutTimelineDataGridNode.js:
+        (WebInspector.LayoutTimelineDataGridNode.prototype.createCellContent):
+        * UserInterface/Views/LayoutTimelineView.js:
+        (WebInspector.LayoutTimelineView): Deleted.
+        * UserInterface/Views/NetworkTimelineView.js:
+        (WebInspector.NetworkTimelineView): Deleted.
+        * UserInterface/Views/ResourceDetailsSidebarPanel.js:
+        (WebInspector.ResourceDetailsSidebarPanel.prototype._refreshResourceType):
+        * UserInterface/Views/ResourceTimelineDataGridNode.js:
+        (WebInspector.ResourceTimelineDataGridNode.prototype.createCellContent):
+        * UserInterface/Views/SourceCodeTreeElement.js:
+        (WebInspector.SourceCodeTreeElement):
+        * UserInterface/Views/TimelineDataGrid.js:
+        (WebInspector.TimelineDataGrid.createColumnScopeBar):
+        * UserInterface/Views/TimelineRecordTreeElement.js:
+        (WebInspector.TimelineRecordTreeElement):
+        * WebInspectorUI.vcxproj/WebInspectorUI.vcxproj:
+        * WebInspectorUI.vcxproj/WebInspectorUI.vcxproj.filters:
+
</ins><span class="cx"> 2014-11-07  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Layer summary should be bottom sticky
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceBaseMainjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Base/Main.js (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Base/Main.js        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/UserInterface/Base/Main.js        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -1863,7 +1863,7 @@
</span><span class="cx">     if (!PageAgent.archive)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    return WebInspector.Resource.Type.fromMIMEType(WebInspector.frameResourceManager.mainFrame.mainResource.mimeType) === WebInspector.Resource.Type.Document;
</del><ins>+    return WebInspector.Resource.typeFromMIMEType(WebInspector.frameResourceManager.mainFrame.mainResource.mimeType) === WebInspector.Resource.Type.Document;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> WebInspector.addWindowKeydownListener = function(listener)
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceMainhtml"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Main.html (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Main.html        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/UserInterface/Main.html        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -301,6 +301,7 @@
</span><span class="cx">     &lt;script src=&quot;Views/TimelineDataGridNode.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> 
</span><span class="cx">     &lt;script src=&quot;Views/DOMDetailsSidebarPanel.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;Views/FolderizedTreeElement.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;Views/SourceCodeTreeElement.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Views/StorageTreeElement.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Views/TimelineRecordTreeElement.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceModelsLayoutTimelineRecordjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Models/LayoutTimelineRecord.js (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Models/LayoutTimelineRecord.js        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/LayoutTimelineRecord.js        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -49,7 +49,7 @@
</span><span class="cx">     Paint: &quot;layout-timeline-record-paint&quot;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-WebInspector.LayoutTimelineRecord.EventType.displayName = function(eventType)
</del><ins>+WebInspector.LayoutTimelineRecord.displayNameForEventType = function(eventType)
</ins><span class="cx"> {
</span><span class="cx">     switch(eventType) {
</span><span class="cx">     case WebInspector.LayoutTimelineRecord.EventType.InvalidateStyles:
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceModelsResourcejs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Models/Resource.js (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Models/Resource.js        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/Resource.js        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -34,7 +34,7 @@
</span><span class="cx"> 
</span><span class="cx">     this._url = url;
</span><span class="cx">     this._mimeType = mimeType;
</span><del>-    this._type = type || WebInspector.Resource.Type.fromMIMEType(mimeType);
</del><ins>+    this._type = type || WebInspector.Resource.typeFromMIMEType(mimeType);
</ins><span class="cx">     this._loaderIdentifier = loaderIdentifier || null;
</span><span class="cx">     this._requestIdentifier = requestIdentifier || null;
</span><span class="cx">     this._requestMethod = requestMethod || null;
</span><span class="lines">@@ -85,8 +85,8 @@
</span><span class="cx">     Other: &quot;resource-type-other&quot;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-// This MIME Type map is private, use WebInspector.Resource.Type.fromMIMEType().
-WebInspector.Resource.Type._mimeTypeMap = {
</del><ins>+// This MIME Type map is private, use WebInspector.Resource.typeFromMIMEType().
+WebInspector.Resource._mimeTypeMap = {
</ins><span class="cx">     &quot;text/html&quot;: WebInspector.Resource.Type.Document,
</span><span class="cx">     &quot;text/xml&quot;: WebInspector.Resource.Type.Document,
</span><span class="cx">     &quot;text/plain&quot;: WebInspector.Resource.Type.Document,
</span><span class="lines">@@ -126,15 +126,15 @@
</span><span class="cx">     &quot;text/x-coffeescript&quot;: WebInspector.Resource.Type.Script
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-WebInspector.Resource.Type.fromMIMEType = function(mimeType)
</del><ins>+WebInspector.Resource.typeFromMIMEType = function(mimeType)
</ins><span class="cx"> {
</span><span class="cx">     if (!mimeType)
</span><span class="cx">         return WebInspector.Resource.Type.Other;
</span><span class="cx"> 
</span><span class="cx">     mimeType = parseMIMEType(mimeType).type;
</span><span class="cx"> 
</span><del>-    if (mimeType in WebInspector.Resource.Type._mimeTypeMap)
-        return WebInspector.Resource.Type._mimeTypeMap[mimeType];
</del><ins>+    if (mimeType in WebInspector.Resource._mimeTypeMap)
+        return WebInspector.Resource._mimeTypeMap[mimeType];
</ins><span class="cx"> 
</span><span class="cx">     if (mimeType.startsWith(&quot;image/&quot;))
</span><span class="cx">         return WebInspector.Resource.Type.Image;
</span><span class="lines">@@ -145,7 +145,7 @@
</span><span class="cx">     return WebInspector.Resource.Type.Other;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-WebInspector.Resource.Type.displayName = function(type, plural)
</del><ins>+WebInspector.Resource.displayNameForType = function(type, plural)
</ins><span class="cx"> {
</span><span class="cx">     switch(type) {
</span><span class="cx">     case WebInspector.Resource.Type.Document:
</span><span class="lines">@@ -235,7 +235,7 @@
</span><span class="cx">         // This getter generates a MIME-type, if needed, that matches the resource type.
</span><span class="cx"> 
</span><span class="cx">         // If the type matches the Resource.Type of the MIME-type, then return the actual MIME-type.
</span><del>-        if (this._type === WebInspector.Resource.Type.fromMIMEType(this._mimeType))
</del><ins>+        if (this._type === WebInspector.Resource.typeFromMIMEType(this._mimeType))
</ins><span class="cx">             return this._mimeType;
</span><span class="cx"> 
</span><span class="cx">         // Return the default MIME-types for the Resource.Type, since the current MIME-type
</span><span class="lines">@@ -497,7 +497,7 @@
</span><span class="cx"> 
</span><span class="cx">         this._url = url;
</span><span class="cx">         this._mimeType = mimeType;
</span><del>-        this._type = type || WebInspector.Resource.Type.fromMIMEType(mimeType);
</del><ins>+        this._type = type || WebInspector.Resource.typeFromMIMEType(mimeType);
</ins><span class="cx">         this._statusCode = statusCode;
</span><span class="cx">         this._statusText = statusText;
</span><span class="cx">         this._responseHeaders = responseHeaders || {};
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceModelsSourceMapResourcejs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Models/SourceMapResource.js (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Models/SourceMapResource.js        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/SourceMapResource.js        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx">     // FIXME: This is a layering violation. It should use a helper function on the
</span><span class="cx">     // Resource base-class to set _mimeType and _type.
</span><span class="cx">     this._mimeType = fileExtensionMIMEType || inheritedMIMEType || &quot;text/javascript&quot;;
</span><del>-    this._type = WebInspector.Resource.Type.fromMIMEType(this._mimeType);
</del><ins>+    this._type = WebInspector.Resource.typeFromMIMEType(this._mimeType);
</ins><span class="cx"> 
</span><span class="cx">     // Mark the resource as loaded so it does not show a spinner in the sidebar.
</span><span class="cx">     // We will really load the resource the first time content is requested.
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsFolderizedTreeElementjs"></a>
<div class="addfile"><h4>Added: trunk/Source/WebInspectorUI/UserInterface/Views/FolderizedTreeElement.js (0 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/FolderizedTreeElement.js                                (rev 0)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/FolderizedTreeElement.js        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -0,0 +1,365 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.FolderizedTreeElement = function(classNames, title, subtitle, representedObject, hasChildren)
+{
+    WebInspector.GeneralTreeElement.call(this, classNames, title, subtitle, representedObject, hasChildren);
+
+    this.shouldRefreshChildren = true;
+
+    this._folderSettingsKey = &quot;&quot;;
+    this._folderTypeMap = new Map;
+    this._folderizeSettingsMap = new Map;
+    this._groupedIntoFolders = false;
+    this._clearNewChildQueue();
+};
+
+WebInspector.FolderizedTreeElement.MediumChildCountThreshold = 5;
+WebInspector.FolderizedTreeElement.LargeChildCountThreshold = 15;
+WebInspector.FolderizedTreeElement.NumberOfMediumCategoriesThreshold = 2;
+WebInspector.FolderizedTreeElement.NewChildQueueUpdateInterval = 500;
+
+WebInspector.FolderizedTreeElement.prototype = {
+    constructor: WebInspector.FolderizedTreeElement,
+    __proto__: WebInspector.GeneralTreeElement.prototype,
+
+    // Public
+
+    get groupedIntoFolders()
+    {
+        return this._groupedIntoFolders;
+    },
+
+    set folderSettingsKey(x)
+    {
+        this._folderSettingsKey = x;
+    },
+
+    registerFolderizeSettings: function(type, folderDisplayName, validateRepresentedObjectCallback, countChildrenCallback, treeElementConstructor)
+    {
+        console.assert(type);
+        console.assert(folderDisplayName);
+        console.assert(typeof validateRepresentedObjectCallback === &quot;function&quot;);
+        console.assert(typeof countChildrenCallback === &quot;function&quot;);
+        console.assert(typeof treeElementConstructor === &quot;function&quot;);
+
+        var settings = {
+            type: type,
+            folderDisplayName: folderDisplayName,
+            validateRepresentedObjectCallback: validateRepresentedObjectCallback,
+            countChildrenCallback: countChildrenCallback,
+            treeElementConstructor: treeElementConstructor
+        };
+
+        this._folderizeSettingsMap.set(type, settings);
+    },
+
+    // Overrides from TreeElement (Private).
+
+    removeChildren: function()
+    {
+        TreeElement.prototype.removeChildren.call(this);
+
+        this._clearNewChildQueue();
+
+        for (var folder of this._folderTypeMap.values())
+            folder.removeChildren();
+
+        this._folderTypeMap.clear();
+    },
+
+    // Protected
+
+    addChildForRepresentedObject: function(representedObject)
+    {
+        var settings = this._settingsForRepresentedObject(representedObject);
+        console.assert(settings);
+        if (!settings) {
+            console.error(&quot;No settings for represented object&quot;, representedObject);
+            return;
+        }
+
+        this.updateParentStatus();
+
+        if (!this.treeOutline) {
+            // Just mark as needing to update to avoid doing work that might not be needed.
+            this.shouldRefreshChildren = true;
+            return;
+        }
+
+        if (!this._groupedIntoFolders &amp;&amp; this._shouldGroupIntoFolders()) {
+            // Mark as needing a refresh to rebuild the tree into folders.
+            this._groupedIntoFolders = true;
+            this.shouldRefreshChildren = true;
+            return;
+        }
+
+        var childTreeElement = this.treeOutline.getCachedTreeElement(representedObject);
+        if (!childTreeElement)
+            childTreeElement = new settings.treeElementConstructor(representedObject);
+
+        this._addTreeElement(childTreeElement);
+    },
+
+    addRepresentedObjectToNewChildQueue: function(representedObject)
+    {
+        // This queue reduces flashing as resources load and change folders when their type becomes known.
+
+        this._newChildQueue.push(representedObject);
+        if (!this._newChildQueueTimeoutIdentifier)
+            this._newChildQueueTimeoutIdentifier = setTimeout(this._populateFromNewChildQueue.bind(this), WebInspector.FolderizedTreeElement.NewChildQueueUpdateInterval);
+    },
+
+    removeChildForRepresentedObject: function(representedObject)
+    {
+        this._removeRepresentedObjectFromNewChildQueue(representedObject);
+        this.updateParentStatus();
+
+        if (!this.treeOutline) {
+            // Just mark as needing to update to avoid doing work that might not be needed.
+            this.shouldRefreshChildren = true;
+            return;
+        }
+
+        // Find the tree element for the frame by using getCachedTreeElement
+        // to only get the item if it has been created already.
+        var childTreeElement = this.treeOutline.getCachedTreeElement(representedObject);
+        if (!childTreeElement || !childTreeElement.parent)
+            return;
+
+        this._removeTreeElement(childTreeElement);
+    },
+
+    compareChildTreeElements: function(a, b)
+    {
+        return this._compareTreeElementsByMainTitle(a, b);
+    },
+
+    updateParentStatus: function()
+    {
+        var hasChildren = false;
+        for (var settings of this._folderizeSettingsMap.values()) {
+            if (settings.countChildrenCallback()) {
+                hasChildren = true;
+                break;
+            }
+        }
+
+        this.hasChildren = hasChildren;
+        if (!this.hasChildren)
+            this.removeChildren();
+    },
+
+    // Private
+
+    _clearNewChildQueue: function()
+    {
+        this._newChildQueue = [];
+        if (this._newChildQueueTimeoutIdentifier) {
+            clearTimeout(this._newChildQueueTimeoutIdentifier);
+            this._newChildQueueTimeoutIdentifier = null;
+        }
+    },
+
+    _populateFromNewChildQueue: function()
+    {
+        if (!this.children.length) {
+            this.updateParentStatus();
+            this.shouldRefreshChildren = true;
+            return;
+        }
+
+        for (var i = 0; i &lt; this._newChildQueue.length; ++i)
+            this.addChildForRepresentedObject(this._newChildQueue[i]);
+
+        this._clearNewChildQueue();
+    },
+
+    _removeRepresentedObjectFromNewChildQueue: function(representedObject)
+    {
+        this._newChildQueue.remove(representedObject);
+    },
+
+    _addTreeElement: function(childTreeElement)
+    {
+        console.assert(childTreeElement);
+        if (!childTreeElement)
+            return;
+
+        var wasSelected = childTreeElement.selected;
+
+        this._removeTreeElement(childTreeElement, true, true);
+
+        var parentTreeElement = this._parentTreeElementForRepresentedObject(childTreeElement.representedObject);
+        if (parentTreeElement !== this &amp;&amp; !parentTreeElement.parent)
+            this._insertFolderTreeElement(parentTreeElement);
+
+        this._insertChildTreeElement(parentTreeElement, childTreeElement);
+
+        if (wasSelected)
+            childTreeElement.revealAndSelect(true, false, true, true);
+    },
+
+    _compareTreeElementsByMainTitle: function(a, b)
+    {
+        return a.mainTitle.localeCompare(b.mainTitle);
+    },
+
+    _insertFolderTreeElement: function(folderTreeElement)
+    {
+        console.assert(this._groupedIntoFolders);
+        console.assert(!folderTreeElement.parent);
+        this.insertChild(folderTreeElement, insertionIndexForObjectInListSortedByFunction(folderTreeElement, this.children, this._compareTreeElementsByMainTitle));
+    },
+
+    _insertChildTreeElement: function(parentTreeElement, childTreeElement)
+    {
+        console.assert(!childTreeElement.parent);
+        parentTreeElement.insertChild(childTreeElement, insertionIndexForObjectInListSortedByFunction(childTreeElement, parentTreeElement.children, this.compareChildTreeElements));
+    },
+
+    _removeTreeElement: function(childTreeElement, suppressOnDeselect, suppressSelectSibling)
+    {
+        var oldParent = childTreeElement.parent;
+        if (!oldParent)
+            return;
+
+        oldParent.removeChild(childTreeElement, suppressOnDeselect, suppressSelectSibling);
+
+        if (oldParent === this)
+            return;
+
+        console.assert(oldParent instanceof WebInspector.FolderTreeElement);
+        if (!(oldParent instanceof WebInspector.FolderTreeElement))
+            return;
+
+        // Remove the old parent folder if it is now empty.
+        if (!oldParent.children.length)
+            oldParent.parent.removeChild(oldParent);
+    },
+
+    _parentTreeElementForRepresentedObject: function(representedObject)
+    {
+        if (!this._groupedIntoFolders)
+            return this;
+
+        console.assert(this._folderSettingsKey !== &quot;&quot;);
+
+        function createFolderTreeElement(type, displayName)
+        {
+            var folderTreeElement = new WebInspector.FolderTreeElement(displayName);
+            folderTreeElement.__expandedSetting = new WebInspector.Setting(type + &quot;-folder-expanded-&quot; + this._folderSettingsKey, false);
+            if (folderTreeElement.__expandedSetting.value)
+                folderTreeElement.expand();
+            folderTreeElement.onexpand = this._folderTreeElementExpandedStateChange.bind(this);
+            folderTreeElement.oncollapse = this._folderTreeElementExpandedStateChange.bind(this);
+            return folderTreeElement;
+        }
+
+        var settings = this._settingsForRepresentedObject(representedObject);
+        if (!settings) {
+            console.error(&quot;Unknown representedObject&quot;, representedObject);
+            return this;
+        }
+
+        var folder = this._folderTypeMap.get(settings.type);
+        if (folder)
+            return folder;
+
+        folder = createFolderTreeElement.call(this, settings.type, settings.folderDisplayName);
+        this._folderTypeMap.set(settings.type, folder);
+        return folder;
+    },
+
+    _folderTreeElementExpandedStateChange: function(folderTreeElement)
+    {
+        console.assert(folderTreeElement.__expandedSetting);
+        folderTreeElement.__expandedSetting.value = folderTreeElement.expanded;
+    },
+
+    _settingsForRepresentedObject: function(representedObject)
+    {
+        for (var settings of this._folderizeSettingsMap.values()) {
+            if (settings.validateRepresentedObjectCallback(representedObject))
+                return settings;
+        }
+        return null;
+    },
+
+    _shouldGroupIntoFolders: function()
+    {
+        // Already grouped into folders, keep it that way.
+        if (this._groupedIntoFolders)
+            return true;
+
+        // Child objects are grouped into folders if one of two thresholds are met:
+        // 1) Once the number of medium categories passes NumberOfMediumCategoriesThreshold.
+        // 2) When there is a category that passes LargeChildCountThreshold and there are
+        //    any child objects in another category.
+
+        // Folders are avoided when there is only one category or most categories are small.
+
+        var numberOfSmallCategories = 0;
+        var numberOfMediumCategories = 0;
+        var foundLargeCategory = false;
+
+        function pushCategory(childCount)
+        {
+            if (!childCount)
+                return false;
+
+            // If this type has any resources and there is a known large category, make folders.
+            if (foundLargeCategory)
+                return true;
+
+            // If there are lots of this resource type, then count it as a large category.
+            if (childCount &gt;= WebInspector.FolderizedTreeElement.LargeChildCountThreshold) {
+                // If we already have other resources in other small or medium categories, make folders.
+                if (numberOfSmallCategories || numberOfMediumCategories)
+                    return true;
+
+                foundLargeCategory = true;
+                return false;
+            }
+
+            // Check if this is a medium category.
+            if (childCount &gt;= WebInspector.FolderizedTreeElement.MediumChildCountThreshold) {
+                // If this is the medium category that puts us over the maximum allowed, make folders.
+                return ++numberOfMediumCategories &gt;= WebInspector.FolderizedTreeElement.NumberOfMediumCategoriesThreshold;
+            }
+
+            // This is a small category.
+            ++numberOfSmallCategories;
+            return false;
+        }
+
+        // Iterate over all the available child object types.
+        for (var settings of this._folderizeSettingsMap.values()) {
+            if (pushCategory(settings.countChildrenCallback()))
+                return true;
+        }
+        return false;
+    }
+};
</ins></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsFrameTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/FrameTreeElement.js (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/FrameTreeElement.js        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/FrameTreeElement.js        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -30,7 +30,6 @@
</span><span class="cx">     WebInspector.ResourceTreeElement.call(this, frame.mainResource, representedObject || frame);
</span><span class="cx"> 
</span><span class="cx">     this._frame = frame;
</span><del>-    this._newChildQueue = [];
</del><span class="cx"> 
</span><span class="cx">     this._updateExpandedSetting();
</span><span class="cx"> 
</span><span class="lines">@@ -44,23 +43,52 @@
</span><span class="cx">     frame.domTree.addEventListener(WebInspector.DOMTree.Event.ContentFlowWasRemoved, this._childContentFlowWasRemoved, this);
</span><span class="cx">     frame.domTree.addEventListener(WebInspector.DOMTree.Event.RootDOMNodeInvalidated, this._rootDOMNodeInvalidated, this);
</span><span class="cx"> 
</span><del>-    if (this._frame.isMainFrame()) {
</del><ins>+    if (this._frame.isMainFrame())
</ins><span class="cx">         this._downloadingPage = false;
</span><del>-        WebInspector.notifications.addEventListener(WebInspector.Notification.PageArchiveStarted, this._pageArchiveStarted, this);
-        WebInspector.notifications.addEventListener(WebInspector.Notification.PageArchiveEnded, this._pageArchiveEnded, this);
-    }
</del><span class="cx"> 
</span><del>-    this._updateParentStatus();
</del><span class="cx">     this.shouldRefreshChildren = true;
</span><del>-};
</del><ins>+    this.folderSettingsKey = this._frame.url.hash;
</ins><span class="cx"> 
</span><del>-WebInspector.FrameTreeElement.MediumChildCountThreshold = 5;
-WebInspector.FrameTreeElement.LargeChildCountThreshold = 15;
-WebInspector.FrameTreeElement.NumberOfMediumCategoriesThreshold = 2;
-WebInspector.FrameTreeElement.NewChildQueueUpdateInterval = 500;
</del><ins>+    this.registerFolderizeSettings(&quot;frames&quot;, WebInspector.UIString(&quot;Frames&quot;),
+        function(representedObject) { return representedObject instanceof WebInspector.Frame; },
+        function() { return this.frame.childFrames.length; }.bind(this),
+        WebInspector.FrameTreeElement
+    );
</ins><span class="cx"> 
</span><ins>+    this.registerFolderizeSettings(&quot;flows&quot;, WebInspector.UIString(&quot;Flows&quot;),
+        function(representedObject) { return representedObject instanceof WebInspector.ContentFlow; },
+        function() { return this.frame.domTree.flowsCount; }.bind(this),
+        WebInspector.ContentFlowTreeElement
+    );
+
+    function makeValidateCallback(resourceType) {
+        return function(representedObject) {
+            return representedObject instanceof WebInspector.Resource &amp;&amp; representedObject.type === resourceType;
+        };
+    }
+
+    function makeChildCountCallback(frame, resourceType) {
+        return function() {
+            return frame.resourcesWithType(resourceType).length;
+        };
+    }
+
+    for (var key in WebInspector.Resource.Type) {
+        var value = WebInspector.Resource.Type[key];
+        var folderName = WebInspector.Resource.displayNameForType(value, true);
+        this.registerFolderizeSettings(key, folderName,
+            makeValidateCallback(value),
+            makeChildCountCallback(this.frame, value),
+            WebInspector.ResourceTreeElement
+        );
+    }
+
+    this.updateParentStatus();
+};
+
</ins><span class="cx"> WebInspector.FrameTreeElement.prototype = {
</span><span class="cx">     constructor: WebInspector.FrameTreeElement,
</span><ins>+    __proto__: WebInspector.ResourceTreeElement.prototype,
</ins><span class="cx"> 
</span><span class="cx">     // Public
</span><span class="cx"> 
</span><span class="lines">@@ -99,7 +127,7 @@
</span><span class="cx">         if (!this._frame)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        this._updateParentStatus();
</del><ins>+        this.updateParentStatus();
</ins><span class="cx"> 
</span><span class="cx">         if (this.resource &amp;&amp; this.resource.sourceMaps.length)
</span><span class="cx">             this.shouldRefreshChildren = true;
</span><span class="lines">@@ -107,11 +135,48 @@
</span><span class="cx"> 
</span><span class="cx">     onattach: function()
</span><span class="cx">     {
</span><del>-        // Frames handle their own SourceMapResources.
-
</del><ins>+        // Immediate superclasses are skipped, since Frames handle their own SourceMapResources.
</ins><span class="cx">         WebInspector.GeneralTreeElement.prototype.onattach.call(this);
</span><ins>+
+        if (this._frame.isMainFrame()) {
+            WebInspector.notifications.addEventListener(WebInspector.Notification.PageArchiveStarted, this._pageArchiveStarted, this);
+            WebInspector.notifications.addEventListener(WebInspector.Notification.PageArchiveEnded, this._pageArchiveEnded, this);
+        }
</ins><span class="cx">     },
</span><span class="cx"> 
</span><ins>+    ondetach: function()
+    {
+        WebInspector.ResourceTreeElement.prototype.ondetach.call(this);
+
+        if (this._frame.isMainFrame()) {
+            WebInspector.notifications.removeEventListener(WebInspector.Notification.PageArchiveStarted, this._pageArchiveStarted, this);
+            WebInspector.notifications.removeEventListener(WebInspector.Notification.PageArchiveEnded, this._pageArchiveEnded, this);
+        }
+    },
+
+    // Overrides from FolderizedTreeElement (Protected).
+
+    compareChildTreeElements: function(a, b)
+    {
+        if (a === b)
+            return 0;
+
+        var aIsResource = a instanceof WebInspector.ResourceTreeElement;
+        var bIsResource = b instanceof WebInspector.ResourceTreeElement;
+
+        if (aIsResource &amp;&amp; bIsResource)
+            return WebInspector.ResourceTreeElement.compareResourceTreeElements(a, b);
+
+        if (!aIsResource &amp;&amp; !bIsResource) {
+            // When both components are not resources then default to base class comparison.
+            return WebInspector.ResourceTreeElement.prototype.compareChildTreeElements.call(this, a, b);
+        }
+
+        // Non-resources should appear before the resources.
+        // FIXME: There should be a better way to group the elements by their type.
+        return aIsResource ? 1 : -1;
+    },
+
</ins><span class="cx">     // Called from ResourceTreeElement.
</span><span class="cx"> 
</span><span class="cx">     updateStatusForMainFrame: function()
</span><span class="lines">@@ -163,27 +228,23 @@
</span><span class="cx">         this.shouldRefreshChildren = false;
</span><span class="cx"> 
</span><span class="cx">         this.removeChildren();
</span><del>-        this._clearNewChildQueue();
</del><span class="cx"> 
</span><del>-        if (this._shouldGroupIntoFolders() &amp;&amp; !this._groupedIntoFolders)
-            this._groupedIntoFolders = true;
-
</del><span class="cx">         for (var i = 0; i &lt; this._frame.childFrames.length; ++i)
</span><del>-            this._addTreeElementForRepresentedObject(this._frame.childFrames[i]);
</del><ins>+            this.addChildForRepresentedObject(this._frame.childFrames[i]);
</ins><span class="cx"> 
</span><span class="cx">         for (var i = 0; i &lt; this._frame.resources.length; ++i)
</span><del>-            this._addTreeElementForRepresentedObject(this._frame.resources[i]);
</del><ins>+            this.addChildForRepresentedObject(this._frame.resources[i]);
</ins><span class="cx"> 
</span><span class="cx">         var sourceMaps = this.resource &amp;&amp; this.resource.sourceMaps;
</span><span class="cx">         for (var i = 0; i &lt; sourceMaps.length; ++i) {
</span><span class="cx">             var sourceMap = sourceMaps[i];
</span><span class="cx">             for (var j = 0; j &lt; sourceMap.resources.length; ++j)
</span><del>-            this._addTreeElementForRepresentedObject(sourceMap.resources[j]);
</del><ins>+                this.addChildForRepresentedObject(sourceMap.resources[j]);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         var flowMap = this._frame.domTree.flowMap;
</span><span class="cx">         for (var flowKey in flowMap)
</span><del>-            this._addTreeElementForRepresentedObject(flowMap[flowKey]);
</del><ins>+            this.addChildForRepresentedObject(flowMap[flowKey]);
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     onexpand: function()
</span><span class="lines">@@ -200,20 +261,6 @@
</span><span class="cx">             this._expandedSetting.value = false;
</span><span class="cx">     },
</span><span class="cx"> 
</span><del>-    removeChildren: function()
-    {
-        TreeElement.prototype.removeChildren.call(this);
-
-        if (this._framesFolderTreeElement)
-            this._framesFolderTreeElement.removeChildren();
-
-        for (var type in this._resourceFoldersTypeMap)
-            this._resourceFoldersTypeMap[type].removeChildren();
-
-        delete this._resourceFoldersTypeMap;
-        delete this._framesFolderTreeElement;
-    },
-
</del><span class="cx">     // Private
</span><span class="cx"> 
</span><span class="cx">     _updateExpandedSetting: function()
</span><span class="lines">@@ -225,22 +272,11 @@
</span><span class="cx">             this.collapse();
</span><span class="cx">     },
</span><span class="cx"> 
</span><del>-    _updateParentStatus: function()
-    {
-        this.hasChildren = (this._frame.resources.length || this._frame.childFrames.length || (this.resource &amp;&amp; this.resource.sourceMaps.length));
-        if (!this.hasChildren)
-            this.removeChildren();
-    },
-
</del><span class="cx">     _mainResourceDidChange: function(event)
</span><span class="cx">     {
</span><span class="cx">         this._updateResource(this._frame.mainResource);
</span><del>-        this._updateParentStatus();
</del><span class="cx"> 
</span><del>-        this._groupedIntoFolders = false;
-
-        this._clearNewChildQueue();
-
</del><ins>+        this.updateParentStatus();
</ins><span class="cx">         this.removeChildren();
</span><span class="cx"> 
</span><span class="cx">         // Change the expanded setting since the frame URL has changed. Do this before setting shouldRefreshChildren, since
</span><span class="lines">@@ -255,342 +291,40 @@
</span><span class="cx"> 
</span><span class="cx">     _resourceWasAdded: function(event)
</span><span class="cx">     {
</span><del>-        this._addRepresentedObjectToNewChildQueue(event.data.resource);
</del><ins>+        this.addRepresentedObjectToNewChildQueue(event.data.resource);
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     _resourceWasRemoved: function(event)
</span><span class="cx">     {
</span><del>-        this._removeChildForRepresentedObject(event.data.resource);
</del><ins>+        this.removeChildForRepresentedObject(event.data.resource);
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     _childFrameWasAdded: function(event)
</span><span class="cx">     {
</span><del>-        this._addRepresentedObjectToNewChildQueue(event.data.childFrame);
</del><ins>+        this.addRepresentedObjectToNewChildQueue(event.data.childFrame);
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     _childFrameWasRemoved: function(event)
</span><span class="cx">     {
</span><del>-        this._removeChildForRepresentedObject(event.data.childFrame);
</del><ins>+        this.removeChildForRepresentedObject(event.data.childFrame);
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     _childContentFlowWasAdded: function(event)
</span><span class="cx">     {
</span><del>-        this._addRepresentedObjectToNewChildQueue(event.data.flow);
</del><ins>+        this.addRepresentedObjectToNewChildQueue(event.data.flow);
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     _childContentFlowWasRemoved: function(event)
</span><span class="cx">     {
</span><del>-        this._removeChildForRepresentedObject(event.data.flow);
</del><ins>+        this.removeChildForRepresentedObject(event.data.flow);
</ins><span class="cx">     },
</span><span class="cx"> 
</span><del>-    _rootDOMNodeInvalidated: function() {
</del><ins>+    _rootDOMNodeInvalidated: function()
+    {
</ins><span class="cx">         if (this.expanded)
</span><span class="cx">             this._frame.domTree.requestContentFlowList();
</span><span class="cx">     },
</span><span class="cx"> 
</span><del>-    _addRepresentedObjectToNewChildQueue: function(representedObject)
-    {
-        // This queue reduces flashing as resources load and change folders when their type becomes known.
-
-        this._newChildQueue.push(representedObject);
-        if (!this._newChildQueueTimeoutIdentifier)
-            this._newChildQueueTimeoutIdentifier = setTimeout(this._populateFromNewChildQueue.bind(this), WebInspector.FrameTreeElement.NewChildQueueUpdateInterval);
-    },
-
-    _removeRepresentedObjectFromNewChildQueue: function(representedObject)
-    {
-        this._newChildQueue.remove(representedObject);
-    },
-
-    _populateFromNewChildQueue: function()
-    {
-        if (!this.children.length) {
-            this._updateParentStatus();
-            this.shouldRefreshChildren = true;
-            return;
-        }
-
-        for (var i = 0; i &lt; this._newChildQueue.length; ++i)
-            this._addChildForRepresentedObject(this._newChildQueue[i]);
-
-        this._newChildQueue = [];
-        this._newChildQueueTimeoutIdentifier = null;
-    },
-
-    _clearNewChildQueue: function()
-    {
-        this._newChildQueue = [];
-        if (this._newChildQueueTimeoutIdentifier) {
-            clearTimeout(this._newChildQueueTimeoutIdentifier);
-            this._newChildQueueTimeoutIdentifier = null;
-        }
-    },
-
-    _addChildForRepresentedObject: function(representedObject)
-    {
-        console.assert(representedObject instanceof WebInspector.Resource || representedObject instanceof WebInspector.Frame || representedObject instanceof WebInspector.ContentFlow);
-        if (!(representedObject instanceof WebInspector.Resource || representedObject instanceof WebInspector.Frame || representedObject instanceof WebInspector.ContentFlow))
-            return;
-
-        this._updateParentStatus();
-
-        if (!this.treeOutline) {
-            // Just mark as needing to update to avoid doing work that might not be needed.
-            this.shouldRefreshChildren = true;
-            return;
-        }
-
-        if (this._shouldGroupIntoFolders() &amp;&amp; !this._groupedIntoFolders) {
-            // Mark as needing a refresh to rebuild the tree into folders.
-            this._groupedIntoFolders = true;
-            this.shouldRefreshChildren = true;
-            return;
-        }
-
-        this._addTreeElementForRepresentedObject(representedObject);
-    },
-
-    _removeChildForRepresentedObject: function(representedObject)
-    {
-        console.assert(representedObject instanceof WebInspector.Resource || representedObject instanceof WebInspector.Frame || representedObject instanceof WebInspector.ContentFlow);
-        if (!(representedObject instanceof WebInspector.Resource || representedObject instanceof WebInspector.Frame || representedObject instanceof WebInspector.ContentFlow))
-            return;
-
-        this._removeRepresentedObjectFromNewChildQueue(representedObject);
-
-        this._updateParentStatus();
-
-        if (!this.treeOutline) {
-            // Just mark as needing to update to avoid doing work that might not be needed.
-            this.shouldRefreshChildren = true;
-            return;
-        }
-
-        // Find the tree element for the frame by using getCachedTreeElement
-        // to only get the item if it has been created already.
-        var childTreeElement = this.treeOutline.getCachedTreeElement(representedObject);
-        if (!childTreeElement || !childTreeElement.parent)
-            return;
-
-        this._removeTreeElement(childTreeElement);
-    },
-
-    _addTreeElementForRepresentedObject: function(representedObject)
-    {
-        var childTreeElement = this.treeOutline.getCachedTreeElement(representedObject);
-        if (!childTreeElement) {
-            if (representedObject instanceof WebInspector.SourceMapResource)
-                childTreeElement = new WebInspector.SourceMapResourceTreeElement(representedObject);
-            else if (representedObject instanceof WebInspector.Resource)
-                childTreeElement = new WebInspector.ResourceTreeElement(representedObject);
-            else if (representedObject instanceof WebInspector.Frame)
-                childTreeElement = new WebInspector.FrameTreeElement(representedObject);
-            else if (representedObject instanceof WebInspector.ContentFlow)
-                childTreeElement = new WebInspector.ContentFlowTreeElement(representedObject);
-        }
-
-        this._addTreeElement(childTreeElement);
-    },
-
-    _addTreeElement: function(childTreeElement)
-    {
-        console.assert(childTreeElement);
-        if (!childTreeElement)
-            return;
-
-        var wasSelected = childTreeElement.selected;
-
-        this._removeTreeElement(childTreeElement, true, true);
-
-        var parentTreeElement = this._parentTreeElementForRepresentedObject(childTreeElement.representedObject);
-        if (parentTreeElement !== this &amp;&amp; !parentTreeElement.parent)
-            this._insertFolderTreeElement(parentTreeElement);
-
-        this._insertResourceTreeElement(parentTreeElement, childTreeElement);
-
-        if (wasSelected)
-            childTreeElement.revealAndSelect(true, false, true, true);
-    },
-
-    _compareTreeElementsByMainTitle: function(a, b)
-    {
-        return a.mainTitle.localeCompare(b.mainTitle);
-    },
-
-    _insertFolderTreeElement: function(folderTreeElement)
-    {
-        console.assert(this._groupedIntoFolders);
-        console.assert(!folderTreeElement.parent);
-        this.insertChild(folderTreeElement, insertionIndexForObjectInListSortedByFunction(folderTreeElement, this.children, this._compareTreeElementsByMainTitle));
-    },
-
-    _compareResourceTreeElements: function(a, b)
-    {
-        if (a === b)
-            return 0;
-
-        var aIsResource = a instanceof WebInspector.ResourceTreeElement;
-        var bIsResource = b instanceof WebInspector.ResourceTreeElement;
-
-        if (aIsResource &amp;&amp; bIsResource)
-            return WebInspector.ResourceTreeElement.compareResourceTreeElements(a, b);
-
-        if (!aIsResource &amp;&amp; !bIsResource) {
-            // When both components are not resources then just compare the titles.
-            return a.mainTitle.localeCompare(b.mainTitle);
-        }
-
-        // Non-resources should appear before the resources.
-        // FIXME: There should be a better way to group the elements by their type.
-        return aIsResource ? 1 : -1;
-    },
-
-    _insertResourceTreeElement: function(parentTreeElement, childTreeElement)
-    {
-        console.assert(!childTreeElement.parent);
-        parentTreeElement.insertChild(childTreeElement, insertionIndexForObjectInListSortedByFunction(childTreeElement, parentTreeElement.children, this._compareResourceTreeElements));
-    },
-
-    _removeTreeElement: function(childTreeElement, suppressOnDeselect, suppressSelectSibling)
-    {
-        var oldParent = childTreeElement.parent;
-        if (!oldParent)
-            return;
-
-        oldParent.removeChild(childTreeElement, suppressOnDeselect, suppressSelectSibling);
-
-        if (oldParent === this)
-            return;
-
-        console.assert(oldParent instanceof WebInspector.FolderTreeElement);
-        if (!(oldParent instanceof WebInspector.FolderTreeElement))
-            return;
-
-        // Remove the old parent folder if it is now empty.
-        if (!oldParent.children.length)
-            oldParent.parent.removeChild(oldParent);
-    },
-
-    _folderNameForResourceType: function(type)
-    {
-        return WebInspector.Resource.Type.displayName(type, true);
-    },
-
-    _parentTreeElementForRepresentedObject: function(representedObject)
-    {
-        if (!this._groupedIntoFolders)
-            return this;
-
-        function createFolderTreeElement(type, displayName)
-        {
-            var folderTreeElement = new WebInspector.FolderTreeElement(displayName);
-            folderTreeElement._expandedSetting = new WebInspector.Setting(type + &quot;-folder-expanded-&quot; + this._frame.url.hash, false);
-            if (folderTreeElement._expandedSetting.value)
-                folderTreeElement.expand();
-            folderTreeElement.onexpand = this._folderTreeElementExpandedStateChange.bind(this);
-            folderTreeElement.oncollapse = this._folderTreeElementExpandedStateChange.bind(this);
-            return folderTreeElement;
-        }
-
-        if (representedObject instanceof WebInspector.Frame) {
-            if (!this._framesFolderTreeElement)
-                this._framesFolderTreeElement = createFolderTreeElement.call(this, &quot;frames&quot;, WebInspector.UIString(&quot;Frames&quot;));
-            return this._framesFolderTreeElement;
-        }
-
-        if (representedObject instanceof WebInspector.ContentFlow) {
-            if (!this._flowsFolderTreeElement)
-                this._flowsFolderTreeElement = createFolderTreeElement.call(this, &quot;flows&quot;, WebInspector.UIString(&quot;Flows&quot;));
-            return this._flowsFolderTreeElement;
-        }
-
-        if (representedObject instanceof WebInspector.Resource) {
-            var folderName = this._folderNameForResourceType(representedObject.type);
-            if (!folderName)
-                return this;
-
-            if (!this._resourceFoldersTypeMap)
-                this._resourceFoldersTypeMap = {};
-            if (!this._resourceFoldersTypeMap[representedObject.type])
-                this._resourceFoldersTypeMap[representedObject.type] = createFolderTreeElement.call(this, representedObject.type, folderName);
-            return this._resourceFoldersTypeMap[representedObject.type];
-        }
-
-        console.error(&quot;Unknown representedObject: &quot;, representedObject);
-        return this;
-    },
-
-    _folderTreeElementExpandedStateChange: function(folderTreeElement)
-    {
-        console.assert(folderTreeElement._expandedSetting);
-        folderTreeElement._expandedSetting.value = folderTreeElement.expanded;
-    },
-
-    _shouldGroupIntoFolders: function()
-    {
-        // Already grouped into folders, keep it that way.
-        if (this._groupedIntoFolders)
-            return true;
-
-        // Resources and Frames are grouped into folders if one of two thresholds are met:
-        // 1) Once the number of medium categories passes NumberOfMediumCategoriesThreshold.
-        // 2) When there is a category that passes LargeChildCountThreshold and there are
-        //    any resources in another category.
-
-        // Folders are avoided when there is only one category or most categories are small.
-
-        var numberOfSmallCategories = 0;
-        var numberOfMediumCategories = 0;
-        var foundLargeCategory = false;
-        var frame = this._frame;
-
-        function pushResourceType(type) {
-            // There are some other properties on WebInspector.Resource.Type that we need to skip, like private data and functions
-            if (type.charAt(0) === &quot;_&quot;)
-                return false;
-
-            // Only care about the values that are strings, not functions, etc.
-            var typeValue = WebInspector.Resource.Type[type];
-            if (typeof typeValue !== &quot;string&quot;)
-                return false;
-
-            return pushCategory(frame.resourcesWithType(typeValue).length);
-        }
-
-        function pushCategory(resourceCount)
-        {
-            if (!resourceCount)
-                return false;
-
-            // If this type has any resources and there is a known large category, make folders.
-            if (foundLargeCategory)
-                return true;
-
-            // If there are lots of this resource type, then count it as a large category.
-            if (resourceCount &gt;= WebInspector.FrameTreeElement.LargeChildCountThreshold) {
-                // If we already have other resources in other small or medium categories, make folders.
-                if (numberOfSmallCategories || numberOfMediumCategories)
-                    return true;
-
-                foundLargeCategory = true;
-                return false;
-            }
-
-            // Check if this is a medium category.
-            if (resourceCount &gt;= WebInspector.FrameTreeElement.MediumChildCountThreshold) {
-                // If this is the medium category that puts us over the maximum allowed, make folders.
-                return ++numberOfMediumCategories &gt;= WebInspector.FrameTreeElement.NumberOfMediumCategoriesThreshold;
-            }
-
-            // This is a small category.
-            ++numberOfSmallCategories;
-            return false;
-        }
-
-        // Iterate over all the available resource types.
-        return pushCategory(frame.childFrames.length) || pushCategory(frame.domTree.flowsCount) || Object.keys(WebInspector.Resource.Type).some(pushResourceType);
-    },
-
</del><span class="cx">     _reloadPageClicked: function(event)
</span><span class="cx">     {
</span><span class="cx">         // Ignore cache when the shift key is pressed.
</span><span class="lines">@@ -633,5 +367,3 @@
</span><span class="cx">         this._updateDownloadButton();
</span><span class="cx">     }
</span><span class="cx"> };
</span><del>-
-WebInspector.FrameTreeElement.prototype.__proto__ = WebInspector.ResourceTreeElement.prototype;
</del></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsLayoutTimelineDataGridNodejs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/LayoutTimelineDataGridNode.js (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/LayoutTimelineDataGridNode.js        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/LayoutTimelineDataGridNode.js        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -64,7 +64,7 @@
</span><span class="cx"> 
</span><span class="cx">         switch (columnIdentifier) {
</span><span class="cx">         case &quot;eventType&quot;:
</span><del>-            return WebInspector.LayoutTimelineRecord.EventType.displayName(value);
</del><ins>+            return WebInspector.LayoutTimelineRecord.displayNameForEventType(value);
</ins><span class="cx"> 
</span><span class="cx">         case &quot;width&quot;:
</span><span class="cx">         case &quot;height&quot;:
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsLayoutTimelineViewjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/LayoutTimelineView.js (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/LayoutTimelineView.js        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/LayoutTimelineView.js        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -38,7 +38,14 @@
</span><span class="cx"> 
</span><span class="cx">     columns.eventType.title = WebInspector.UIString(&quot;Type&quot;);
</span><span class="cx">     columns.eventType.width = &quot;15%&quot;;
</span><del>-    columns.eventType.scopeBar = WebInspector.TimelineDataGrid.createColumnScopeBar(&quot;layout&quot;, WebInspector.LayoutTimelineRecord.EventType);
</del><ins>+
+    var typeToLabelMap = new Map;
+    for (var key in WebInspector.LayoutTimelineRecord.EventType) {
+        var value = WebInspector.LayoutTimelineRecord.EventType[key];
+        typeToLabelMap.set(value, WebInspector.LayoutTimelineRecord.displayNameForEventType(value));
+    }
+
+    columns.eventType.scopeBar = WebInspector.TimelineDataGrid.createColumnScopeBar(&quot;layout&quot;, typeToLabelMap);
</ins><span class="cx">     columns.eventType.hidden = true;
</span><span class="cx"> 
</span><span class="cx">     columns.initiatorCallFrame.title = WebInspector.UIString(&quot;Initiator&quot;);
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsNetworkTimelineViewjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/NetworkTimelineView.js (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/NetworkTimelineView.js        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/NetworkTimelineView.js        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -41,8 +41,15 @@
</span><span class="cx"> 
</span><span class="cx">     columns.type.title = WebInspector.UIString(&quot;Type&quot;);
</span><span class="cx">     columns.type.width = &quot;8%&quot;;
</span><del>-    columns.type.scopeBar = WebInspector.TimelineDataGrid.createColumnScopeBar(&quot;network&quot;, WebInspector.Resource.Type);
</del><span class="cx"> 
</span><ins>+    var typeToLabelMap = new Map;
+    for (var key in WebInspector.Resource.Type) {
+        var value = WebInspector.Resource.Type[key];
+        typeToLabelMap.set(value, WebInspector.Resource.displayNameForType(value, true));
+    }
+
+    columns.type.scopeBar = WebInspector.TimelineDataGrid.createColumnScopeBar(&quot;network&quot;, typeToLabelMap);
+
</ins><span class="cx">     columns.method.title = WebInspector.UIString(&quot;Method&quot;);
</span><span class="cx">     columns.method.width = &quot;6%&quot;;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsResourceDetailsSidebarPaneljs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ResourceDetailsSidebarPanel.js (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ResourceDetailsSidebarPanel.js        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ResourceDetailsSidebarPanel.js        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -245,7 +245,7 @@
</span><span class="cx">         if (!this._resource)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        this._typeResourceTypeRow.value = WebInspector.Resource.Type.displayName(this._resource.type);
</del><ins>+        this._typeResourceTypeRow.value = WebInspector.Resource.displayNameForType(this._resource.type);
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     _refreshMIMEType: function()
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsResourceTimelineDataGridNodejs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTimelineDataGridNode.js (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTimelineDataGridNode.js        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTimelineDataGridNode.js        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -127,7 +127,7 @@
</span><span class="cx">             return fragment;
</span><span class="cx"> 
</span><span class="cx">         case &quot;type&quot;:
</span><del>-            return WebInspector.Resource.Type.displayName(value);
</del><ins>+            return WebInspector.Resource.displayNameForType(value);
</ins><span class="cx"> 
</span><span class="cx">         case &quot;statusCode&quot;:
</span><span class="cx">             cell.title = resource.statusText || &quot;&quot;;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsSourceCodeTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTreeElement.js (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTreeElement.js        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTreeElement.js        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -27,7 +27,7 @@
</span><span class="cx"> {
</span><span class="cx">     console.assert(sourceCode instanceof WebInspector.SourceCode);
</span><span class="cx"> 
</span><del>-    WebInspector.GeneralTreeElement.call(this, classNames, title, subtitle, representedObject || sourceCode, hasChildren);
</del><ins>+    WebInspector.FolderizedTreeElement.call(this, classNames, title, subtitle, representedObject || sourceCode, hasChildren);
</ins><span class="cx"> 
</span><span class="cx">     this.small = true;
</span><span class="cx"> 
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> 
</span><span class="cx"> WebInspector.SourceCodeTreeElement.prototype = {
</span><span class="cx">     constructor: WebInspector.SourceCodeTreeElement,
</span><ins>+    __proto__: WebInspector.FolderizedTreeElement.prototype,
</ins><span class="cx"> 
</span><span class="cx">     // Public
</span><span class="cx"> 
</span><span class="lines">@@ -204,5 +205,3 @@
</span><span class="cx">         this.updateSourceMapResources();
</span><span class="cx">     }
</span><span class="cx"> };
</span><del>-
-WebInspector.SourceCodeTreeElement.prototype.__proto__ = WebInspector.GeneralTreeElement.prototype;
</del></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsTimelineDataGridjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/TimelineDataGrid.js (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/TimelineDataGrid.js        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/TimelineDataGrid.js        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -77,16 +77,11 @@
</span><span class="cx"> {
</span><span class="cx">     prefix = prefix + &quot;-timeline-data-grid-&quot;;
</span><span class="cx"> 
</span><del>-    var keys = Object.keys(dictionary).filter(function(key) {
-        return typeof dictionary[key] === &quot;string&quot; || dictionary[key] instanceof String;
-    });
-
-    var scopeBarItems = keys.map(function(key) {
-        var value = dictionary[key];
-        var id = prefix + value;
-        var label = dictionary.displayName(value, true);
</del><ins>+    var scopeBarItems = Object.keys(dictionary).map(function(key) {
+        var id = prefix + key;
+        var label = dictionary[key];
</ins><span class="cx">         var item = new WebInspector.ScopeBarItem(id, label);
</span><del>-        item.value = value;
</del><ins>+        item.value = key;
</ins><span class="cx">         return item;
</span><span class="cx">     });
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsTimelineRecordTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordTreeElement.js (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordTreeElement.js        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordTreeElement.js        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -46,7 +46,7 @@
</span><span class="cx"> 
</span><span class="cx">     switch (timelineRecord.type) {
</span><span class="cx">     case WebInspector.TimelineRecord.Type.Layout:
</span><del>-        title = WebInspector.LayoutTimelineRecord.EventType.displayName(timelineRecord.eventType);
</del><ins>+        title = WebInspector.LayoutTimelineRecord.displayNameForEventType(timelineRecord.eventType);
</ins><span class="cx"> 
</span><span class="cx">         switch (timelineRecord.eventType) {
</span><span class="cx">         case WebInspector.LayoutTimelineRecord.EventType.InvalidateStyles:
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIWebInspectorUIvcxprojWebInspectorUIvcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -440,6 +440,7 @@
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\FlexibleSpaceNavigationItem.js&quot; /&gt;
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\FolderIcon.css&quot; /&gt;
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\FolderTreeElement.js&quot; /&gt;
</span><ins>+    &lt;None Include=&quot;..\UserInterface\FolderizedTreeElement.js&quot; /&gt;
</ins><span class="cx">     &lt;None Include=&quot;..\UserInterface\FontResourceContentView.css&quot; /&gt;
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\FontResourceContentView.js&quot; /&gt;
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\Formatter.js&quot; /&gt;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIWebInspectorUIvcxprojWebInspectorUIvcxprojfilters"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj.filters (175783 => 175784)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj.filters        2014-11-09 03:17:02 UTC (rev 175783)
+++ trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj.filters        2014-11-09 03:17:40 UTC (rev 175784)
</span><span class="lines">@@ -510,6 +510,9 @@
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\FolderTreeElement.js&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;UserInterface&lt;/Filter&gt;
</span><span class="cx">     &lt;/None&gt;
</span><ins>+    &lt;None Include=&quot;..\UserInterface\FolderizedTreeElement.js&quot;&gt;
+      &lt;Filter&gt;UserInterface&lt;/Filter&gt;
+    &lt;/None&gt;
</ins><span class="cx">     &lt;None Include=&quot;..\UserInterface\FontResourceContentView.css&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;UserInterface&lt;/Filter&gt;
</span><span class="cx">     &lt;/None&gt;
</span></span></pre>
</div>
</div>

</body>
</html>