Diff
Modified: trunk/Source/WebInspectorUI/ChangeLog (181871 => 181872)
--- trunk/Source/WebInspectorUI/ChangeLog 2015-03-23 21:37:53 UTC (rev 181871)
+++ trunk/Source/WebInspectorUI/ChangeLog 2015-03-23 22:00:19 UTC (rev 181872)
@@ -1,3 +1,54 @@
+2015-03-17 Jono Wells <[email protected]>
+
+ Web Inspector: Debugger sidebar should have a filter button for breakpoints
+ https://bugs.webkit.org/show_bug.cgi?id=142779
+
+ Reviewed by Timothy Hatcher.
+
+ Add the infrastructure for activation filter buttons that can appear next to the text filters at the bottom
+ of any navigation sidebar panel. These filter bar buttons have defined within them a function that returns
+ a boolean value that indicates whether the input, typically a tree element, should be filtered or not.
+
+ This infrastructure is then used to create a filter for the debugger sidebar that, when applied, only shows
+ scripts that have breakpoints set on them.
+
+ * Localizations/en.lproj/localizedStrings.js: Updated.
+ * UserInterface/Main.html: Files added.
+
+ * UserInterface/Views/DebuggerSidebarPanel.js:
+ (WebInspector.DebuggerSidebarPanel.showResourcesWithChildrenOnlyFilterFunction):
+ (WebInspector.DebuggerSidebarPanel):
+ (WebInspector.DebuggerSidebarPanel.prototype._addBreakpoint): Drive-by fix.
+ Add filter button to filter bar.
+
+ * UserInterface/Views/FilterBar.css:
+ (.filter-bar > .navigation-bar > .item):
+ Style filter button.
+
+ * UserInterface/Views/FilterBar.js:
+ (WebInspector.FilterBar):
+ (WebInspector.FilterBar.prototype.get filters):
+ (WebInspector.FilterBar.prototype.set filters):
+ (WebInspector.FilterBar.prototype.hasActiveFilters):
+ (WebInspector.FilterBar.prototype._handleFilterChanged):
+ (WebInspector.FilterBar.prototype._inputFieldChanged): Deleted.
+ Create space for filter bar buttons and set up event handlers to deal with them.
+
+ * UserInterface/Views/FilterBarButton.js: Copied from Source/WebInspectorUI/UserInterface/Views/FilterBar.css.
+ (WebInspector.FilterBarButton):
+ (WebInspector.FilterBarButton.prototype.get filterFunction):
+ (WebInspector.FilterBarButton.prototype.toggle):
+ Create class for a filter bar button that stores a filter function.
+
+ * UserInterface/Views/NavigationSidebarPanel.js:
+ (WebInspector.NavigationSidebarPanel):
+ (WebInspector.NavigationSidebarPanel.prototype.matchTreeElementAgainstFilterFunctions):
+ (WebInspector.NavigationSidebarPanel.prototype.applyFiltersToTreeElement):
+ (WebInspector.NavigationSidebarPanel.prototype._filterDidChange):
+ (WebInspector.NavigationSidebarPanel.prototype._updateFilter):
+ (WebInspector.NavigationSidebarPanel.prototype._textFilterDidChange): Deleted.
+ Add functionality to support button filters and process their corresponding functions correctly when filtering.
+
2015-03-22 Matt Baker <[email protected]>
Web Inspector: Adopt ES6 Class Syntax for all Controller Objects
Modified: trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js (181871 => 181872)
--- trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js 2015-03-23 21:37:53 UTC (rev 181871)
+++ trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js 2015-03-23 22:00:19 UTC (rev 181872)
@@ -423,6 +423,8 @@
localizedStrings["Show compositing borders"] = "Show compositing borders";
localizedStrings["Show console (%s)"] = "Show console (%s)";
localizedStrings["Show full-height console"] = "Show full-height console";
+localizedStrings["Show only resources with breakpoints."] = "Show only resources with breakpoints.";
+localizedStrings["Show resources with and without breakpoints."] = "Show resources with and without breakpoints.";
localizedStrings["Show shadow DOM nodes"] = "Show shadow DOM nodes";
localizedStrings["Show split console"] = "Show split console";
localizedStrings["Show the %s details sidebar"] = "Show the %s details sidebar";
Modified: trunk/Source/WebInspectorUI/UserInterface/Main.html (181871 => 181872)
--- trunk/Source/WebInspectorUI/UserInterface/Main.html 2015-03-23 21:37:53 UTC (rev 181871)
+++ trunk/Source/WebInspectorUI/UserInterface/Main.html 2015-03-23 22:00:19 UTC (rev 181872)
@@ -393,6 +393,7 @@
<script src=""
<script src=""
<script src=""
+ <script src=""
<script src=""
<script src=""
<script src=""
Modified: trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js (181871 => 181872)
--- trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js 2015-03-23 21:37:53 UTC (rev 181871)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js 2015-03-23 22:00:19 UTC (rev 181872)
@@ -53,23 +53,15 @@
this._navigationBar = new WebInspector.NavigationBar;
this.element.appendChild(this._navigationBar.element);
+
+ var imageSize = WebInspector.Platform.isLegacyMacOS ? 16 : 15;
- var breakpointsImage, pauseImage, resumeImage, stepOverImage, stepIntoImage, stepOutImage;
- if (WebInspector.Platform.isLegacyMacOS) {
- breakpointsImage = {src: "Images/Legacy/Breakpoints.svg", width: 16, height: 16};
- pauseImage = {src: "Images/Legacy/Pause.svg", width: 16, height: 16};
- resumeImage = {src: "Images/Legacy/Resume.svg", width: 16, height: 16};
- stepOverImage = {src: "Images/Legacy/StepOver.svg", width: 16, height: 16};
- stepIntoImage = {src: "Images/Legacy/StepInto.svg", width: 16, height: 16};
- stepOutImage = {src: "Images/Legacy/StepOut.svg", width: 16, height: 16};
- } else {
- breakpointsImage = {src: "Images/Breakpoints.svg", width: 15, height: 15};
- pauseImage = {src: "Images/Pause.svg", width: 15, height: 15};
- resumeImage = {src: "Images/Resume.svg", width: 15, height: 15};
- stepOverImage = {src: "Images/StepOver.svg", width: 15, height: 15};
- stepIntoImage = {src: "Images/StepInto.svg", width: 15, height: 15};
- stepOutImage = {src: "Images/StepOut.svg", width: 15, height: 15};
- }
+ var breakpointsImage = {src: platformImagePath("Breakpoints.svg"), width: imageSize, height: imageSize};
+ var pauseImage = {src: platformImagePath("Pause.svg"), width: imageSize, height: imageSize};
+ var resumeImage = {src: platformImagePath("Resume.svg"), width: imageSize, height: imageSize};
+ var stepOverImage = {src: platformImagePath("StepOver.svg"), width: imageSize, height: imageSize};
+ var stepIntoImage = {src: platformImagePath("StepInto.svg"), width: imageSize, height: imageSize};
+ var stepOutImage = {src: platformImagePath("StepOut.svg"), width: imageSize, height: imageSize};
var toolTip = WebInspector.UIString("Enable all breakpoints (%s)").format(this._toggleBreakpointsKeyboardShortcut.displayName);
var altToolTip = WebInspector.UIString("Disable all breakpoints (%s)").format(this._toggleBreakpointsKeyboardShortcut.displayName);
@@ -109,7 +101,24 @@
this._allUncaughtExceptionsBreakpointTreeElement = new WebInspector.BreakpointTreeElement(WebInspector.debuggerManager.allUncaughtExceptionsBreakpoint, WebInspector.DebuggerSidebarPanel.ExceptionIconStyleClassName, WebInspector.UIString("All Uncaught Exceptions"));
this.filterBar.placeholder = WebInspector.UIString("Filter Breakpoint List");
+ var showResourcesWithBreakpointsOnlyFilterFunction = function(treeElement)
+ {
+ // Keep breakpoints and other elements that aren't resources.
+ if (!treeElement instanceof WebInspector.ResourceTreeElement || treeElement instanceof WebInspector.BreakpointTreeElement)
+ return true;
+ // Keep resources with breakpoints.
+ if (treeElement.hasChildren) {
+ for (var child of treeElement.children) {
+ if (child instanceof WebInspector.BreakpointTreeElement)
+ return true;
+ }
+ }
+ return false;
+ };
+
+ this.filterBar.addFilterBarButton("debugger-show-resources-with-children-only", showResourcesWithBreakpointsOnlyFilterFunction, true, WebInspector.UIString("Show only resources with breakpoints."), WebInspector.UIString("Show resources with and without breakpoints."), platformImagePath("Breakpoints.svg"), 15, 15);
+
this._breakpointsContentTreeOutline = this.contentTreeOutline;
this._breakpointsContentTreeOutline._onselect_ = this._treeElementSelected.bind(this);
this._breakpointsContentTreeOutline._ondelete_ = this._breakpointTreeOutlineDeleteTreeElement.bind(this);
@@ -282,7 +291,7 @@
WebInspector.debuggerManager.breakpointsEnabled = !this._debuggerBreakpointsButtonItem.activated;
},
- _addBreakpoint: function(breakpoint, sourceCode)
+ _addBreakpoint: function(breakpoint)
{
var sourceCode = breakpoint.sourceCodeLocation.displaySourceCode;
if (!sourceCode)
Modified: trunk/Source/WebInspectorUI/UserInterface/Views/FilterBar.css (181871 => 181872)
--- trunk/Source/WebInspectorUI/UserInterface/Views/FilterBar.css 2015-03-23 21:37:53 UTC (rev 181871)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/FilterBar.css 2015-03-23 22:00:19 UTC (rev 181872)
@@ -36,6 +36,10 @@
height: 21px;
}
+.filter-bar > .navigation-bar > .item {
+ padding: 0 0 3px 8px;
+}
+
.filter-bar > input[type="search"] {
display: flex;
flex: 1;
Modified: trunk/Source/WebInspectorUI/UserInterface/Views/FilterBar.js (181871 => 181872)
--- trunk/Source/WebInspectorUI/UserInterface/Views/FilterBar.js 2015-03-23 21:37:53 UTC (rev 181871)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/FilterBar.js 2015-03-23 22:00:19 UTC (rev 181872)
@@ -30,11 +30,16 @@
this._element = element || document.createElement("div");
this._element.classList.add(WebInspector.FilterBar.StyleClassName);
+ this._filtersNavigationBar = new WebInspector.NavigationBar;
+ this._element.appendChild(this._filtersNavigationBar.element);
+
+ this._filterFunctionsMap = new Map;
+
this._inputField = document.createElement("input");
this._inputField.type = "search";
this._inputField.spellcheck = false;
this._inputField.incremental = true;
- this._inputField.addEventListener("search", this._inputFieldChanged.bind(this), false);
+ this._inputField.addEventListener("search", this._handleFilterChanged.bind(this), false);
this._element.appendChild(this._inputField);
};
@@ -44,11 +49,12 @@
WebInspector.FilterBar.StyleClassName = "filter-bar";
WebInspector.FilterBar.Event = {
- TextFilterDidChange: "filter-bar-text-filter-did-change"
+ FilterDidChange: "filter-bar-text-filter-did-change"
};
WebInspector.FilterBar.prototype = {
constructor: WebInspector.FilterBar,
+ __proto__: WebInspector.Object.prototype,
// Public
@@ -74,7 +80,7 @@
get filters()
{
- return {text: this._inputField.value};
+ return {text: this._inputField.value, functions: [...this._filterFunctionsMap.values()]};
},
set filters(filters)
@@ -84,22 +90,46 @@
var oldTextValue = this._inputField.value;
this._inputField.value = filters.text || "";
if (oldTextValue !== this._inputField.value)
- this._inputFieldChanged();
+ this._handleFilterChanged();
},
+ addFilterBarButton: function(identifier, filterFunction, activatedByDefault, defaultToolTip, activatedToolTip, image, imageWidth, imageHeight, suppressEmboss)
+ {
+ var filterBarButton = new WebInspector.FilterBarButton(identifier, filterFunction, activatedByDefault, defaultToolTip, activatedToolTip, image, imageWidth, imageHeight, suppressEmboss);
+ filterBarButton.addEventListener(WebInspector.ButtonNavigationItem.Event.Clicked, this._handleFilterBarButtonClicked, this);
+ filterBarButton.addEventListener(WebInspector.FilterBarButton.Event.ActivatedStateToggled, this._handleFilterButtonToggled, this);
+ this._filtersNavigationBar.addNavigationItem(filterBarButton);
+ if (filterBarButton.activated) {
+ this._filterFunctionsMap.set(filterBarButton.identifier, filterBarButton.filterFunction);
+ this._handleFilterChanged();
+ }
+ },
+
hasActiveFilters: function()
{
- if (this._inputField.value)
- return true;
- return false;
+ return !!this._inputField.value || !!this._filterFunctionsMap.size;
},
// Private
- _inputFieldChanged: function(event)
+ _handleFilterBarButtonClicked(event)
{
- this.dispatchEventToListeners(WebInspector.FilterBar.Event.TextFilterDidChange);
+ var filterBarButton = event.target;
+ filterBarButton.toggle();
+ },
+
+ _handleFilterButtonToggled: function(event)
+ {
+ var filterBarButton = event.target;
+ if (filterBarButton.activated)
+ this._filterFunctionsMap.set(filterBarButton.identifier, filterBarButton.filterFunction);
+ else
+ this._filterFunctionsMap.delete(filterBarButton.identifier);
+ this._handleFilterChanged();
+ },
+
+ _handleFilterChanged: function()
+ {
+ this.dispatchEventToListeners(WebInspector.FilterBar.Event.FilterDidChange);
}
};
-
-WebInspector.FilterBar.prototype.__proto__ = WebInspector.Object.prototype;
Added: trunk/Source/WebInspectorUI/UserInterface/Views/FilterBarButton.js (0 => 181872)
--- trunk/Source/WebInspectorUI/UserInterface/Views/FilterBarButton.js (rev 0)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/FilterBarButton.js 2015-03-23 22:00:19 UTC (rev 181872)
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2015 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.FilterBarButton = function(identifier, filterFunction, activatedByDefault, defaultToolTip, activatedToolTip, image, imageWidth, imageHeight, suppressEmboss, role)
+{
+ WebInspector.ActivateButtonNavigationItem.call(this, identifier, defaultToolTip, activatedToolTip, image, imageWidth, imageHeight, suppressEmboss, role);
+
+ this._filterFunction = filterFunction;
+
+ this._activatedSetting = new WebInspector.Setting(identifier, activatedByDefault);
+
+ this.activated = !!this._activatedSetting.value;
+};
+
+WebInspector.FilterBarButton.StyleClassName = "filter-bar-button";
+
+WebInspector.FilterBarButton.Event = {
+ ActivatedStateToggled: "filter-bar-activated-state-toggled"
+};
+
+WebInspector.FilterBarButton.prototype = {
+ constructor: WebInspector.FilterBarButton,
+ __proto__: WebInspector.ActivateButtonNavigationItem.prototype,
+
+ // Public
+
+ get filterFunction()
+ {
+ return this._filterFunction;
+ },
+
+ toggle: function()
+ {
+ this.activated = !this.activated;
+ this._activatedSetting.value = this.activated;
+ this.dispatchEventToListeners(WebInspector.FilterBarButton.Event.ActivatedStateToggled);
+ }
+};
Modified: trunk/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.js (181871 => 181872)
--- trunk/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.js 2015-03-23 21:37:53 UTC (rev 181871)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.js 2015-03-23 22:00:19 UTC (rev 181872)
@@ -52,7 +52,7 @@
this._contentTreeOutline = this.createContentTreeOutline(true);
this._filterBar = new WebInspector.FilterBar();
- this._filterBar.addEventListener(WebInspector.FilterBar.Event.TextFilterDidChange, this._textFilterDidChange, this);
+ this._filterBar.addEventListener(WebInspector.FilterBar.Event.FilterDidChange, this._filterDidChange, this);
this.element.appendChild(this._filterBar.element);
this._bottomOverflowShadowElement = document.createElement("div");
@@ -312,6 +312,15 @@
return true;
},
+ matchTreeElementAgainstFilterFunctions: function(treeElement)
+ {
+ for (var filterFunction of this._filterFunctions) {
+ if (filterFunction(treeElement))
+ return true;
+ }
+ return false;
+ },
+
applyFiltersToTreeElement: function(treeElement)
{
if (!this._filterBar.hasActiveFilters() && !this.hasCustomFilters()) {
@@ -375,7 +384,7 @@
}
}
- if (matchTextFilter(filterableData.text) && this.matchTreeElementAgainstCustomFilters(treeElement)) {
+ if (matchTextFilter(filterableData.text) && this.matchTreeElementAgainstFilterFunctions(treeElement) && this.matchTreeElementAgainstCustomFilters(treeElement)) {
// Make this element visible since it matches.
makeVisible();
@@ -490,7 +499,7 @@
this._emptyFilterResults = true;
},
- _textFilterDidChange: function()
+ _filterDidChange: function()
{
this._updateFilter();
},
@@ -503,6 +512,7 @@
var filters = this._filterBar.filters;
this._textFilterRegex = simpleGlobStringToRegExp(filters.text, "i");
this._filtersSetting.value = filters;
+ this._filterFunctions = filters.functions;
// Don't populate if we don't have any active filters.
// We only need to populate when a filter needs to reveal.
Added: trunk/Source/WebInspectorUI/WebInspectorUI.esproj/Project.espressostorage (0 => 181872)
--- trunk/Source/WebInspectorUI/WebInspectorUI.esproj/Project.espressostorage (rev 0)
+++ trunk/Source/WebInspectorUI/WebInspectorUI.esproj/Project.espressostorage 2015-03-23 22:00:19 UTC (rev 181872)
@@ -0,0 +1,4 @@
+bplist00\xD2_5com.macrabbit.Espresso.Publisher.PublishServers.Order_/com.macrabbit.Espresso.Publisher.PublishServers\xA1\xA1\xD7
++_ESPublishServerStateUserKey_ESPublishServerStateTypeKeyTUUID_ESPublishServerStateNameKey^ConnectionType_ESPublishServerStatePortKey_ESPublishServerStatePathKeyPTSFTP_$6A7F4EA2-F078-4DB5-AD66-AE1C5A1FE5C3_untitled server_!com.macrabbit.coreconnection.sftp+Ewy{}\x8C\xAA\xC8\xCD\xEB\xFA67<cu\x99\x9B
\ No newline at end of file
Added: trunk/Source/WebInspectorUI/WebInspectorUI.esproj/user.jonowells.espressostorage (0 => 181872)
--- trunk/Source/WebInspectorUI/WebInspectorUI.esproj/user.jonowells.espressostorage (rev 0)
+++ trunk/Source/WebInspectorUI/WebInspectorUI.esproj/user.jonowells.espressostorage 2015-03-23 22:00:19 UTC (rev 181872)
@@ -0,0 +1,31 @@
+bplist00\xD2_$com.macrabbit.espresso.project.state_ESProjectWindowStateO \xC7bplist00\xD4X$versionX$objectsY$archiverT$top\x86\xA0\xA6+U$null\xD2
+WNS.dataV$classO|bplist00\xD4 X$versionX$objectsY$archiverT$top\x86\xA0\xA1U$null_NSKeyedArchiver\xD0#-279?Q
+R\x80\xD2Z$classnameX$classes]NSMutableData\xA3VNSDataXNSObject\xD2
+O\xFDbplist00\xD4X$versionX$objectsY$archiverT$top\x86\xA0\xA3+U$null\xD2
+WNS.dataV$classO\xACbplist00\xD4X$versionX$objectsY$archiverT$top\x86\xA0\xA4+U$null\xD2
+WNS.dataV$classO\x9Dbplist00\xD4 X$versionX$objectsY$archiverT$top\x86\xA0\xA1U$null_NSKeyedArchiver\xD2
++[syncOptionsXsyncMode#-279?QVbkmo\x80\xD2Z$classnameX$classes]NSMutableData\xA3VNSDataXNSObject\xD2
+O\x94bplist00\xD4 X$versionX$objectsY$archiverT$top\x86\xA0\xA1U$null_NSKeyedArchiver\xD1
+_browserViewMode#-279?QTfh\x80_NSKeyedArchiver\xD2_/syncTabController(MRViewControllerManagedState)_1browseTabController(MRViewControllerManagedState)\x80\x80#-27<BGOV\xF6\xF8\xFD#*38\xCF\xD1\xE3\xE8NPR\x80\xD2Z$classnameX$classes]NSMutableData\xA3VNSDataXNSObject_NSKeyedArchiver\xD1_Qbookmark-state.6A7F4EA2-F078-4DB5-AD66-AE1C5A1FE5C3(MRViewControllerManagedState)\x80#-27;AFNU .29BTW\xAB\xAD\x80\xD2
+Okbplist00\xD4 X$versionX$objectsY$archiverT$top\x86\xA0\xA6U$null\xD3
+WNS.keysZNS.objectsV$class\xA1+\x80\xA1\x80\x80]ExpandedItems\xD2
+\xA0\x80\xD2Z$classnameX$classes^NSMutableArray\xA3WNSArrayXNSObject\xD2\NSDictionary\xA2_NSKeyedArchiver\xD1!"_browserConfiguration\x80#-27>DKS^egikmo}\x82\x83\x85\x8A\x95\x9E\xAD\xB1\xB9\xC2\xC7\xD4\xD7\xE9\xEC#\x80\xD2
+O|bplist00\xD4 X$versionX$objectsY$archiverT$top\x86\xA0\xA1U$null_NSKeyedArchiver\xD0#-279?Q
+R\x80_NSKeyedArchiver\xD9 !"#$%&'()((,-./0_8com.macrabbit.Espresso.WorkspaceTabs.DisclosureCollapsed_Jsection:com.macrabbit.Espresso.WorkspaceTabs(MRViewControllerManagedState)_6com.macrabbit.Espresso.FileManager.DisclosureCollapsed_4com.macrabbit.Espresso.Publisher.DisclosureCollapsed_Lsection:com.macrabbit.Espresso.WorkspaceSearch(MRViewControllerManagedState)_Fsection:com.macrabbit.Espresso.Publisher(MRViewControllerManagedState)_Hsection:com.macrabbit.Espresso.FileManager(MRViewControllerManagedState)]WorkspaceMode\sidebarWidth\x80\x80\x80\x80"C\#-27>DIQX\xD7\xD9\xDE\xE9\xF2!\x90\x92\x97*=x\xC5\xFE5\x84\xCD & 3 4 6 7 8 : < > @1 E\xD5
++_ContentViewStateZProjectURL\TopLeftPointYStateType[ContentSizeO(bplist00\xD4X$versionX$objectsY$archiverT$top\x86\xA0\xA3U$null\xD3
++WNS.keysZNS.objectsV$class\xA0\xA0\x80\xD2Z$classnameX$classes_NSMutableDictionary\xA3\NSDictionaryXNSObject_NSKeyedArchiver\xD1_%sidebarIdentifierToDividerPositionMap\x80#-27;AHP[bcdfkv\x95\x99\xA6\xAF\xC1\xC4\xEC\xEE__file://localhost/Users/jonowells/Source/OpenSource/Source/WebInspectorUI/WebInspectorUI.esproj/Z{204, 746}]ProjectWindowZ{916, 466}+4K
+
+!
+4
+?
+L
+V
+b\x8E\xF0\xFB
\ No newline at end of file