Diff
Modified: trunk/LayoutTests/ChangeLog (121541 => 121542)
--- trunk/LayoutTests/ChangeLog 2012-06-29 09:50:26 UTC (rev 121541)
+++ trunk/LayoutTests/ChangeLog 2012-06-29 09:54:00 UTC (rev 121542)
@@ -1,3 +1,19 @@
+2012-06-29 Taiju Tsuiki <[email protected]>
+
+ Web Inspector: Add FileSystemView
+ https://bugs.webkit.org/show_bug.cgi?id=73301
+
+ This patch introduce a split view as FileSystemView. Including directory tree as sidebar tree.
+
+ Reviewed by Vsevolod Vlasov.
+
+ * http/tests/inspector/filesystem/directory-tree-expected.txt: Added.
+ * http/tests/inspector/filesystem/directory-tree.html: Added.
+ * http/tests/inspector/filesystem/filesystem-test.js:
+ (initialize_FileSystemTest.incrementRequestCount):
+ (initialize_FileSystemTest.decrementRequestCount):
+ (initialize_FileSystemTest.InspectorTest.callOnRequestCompleted):
+
2012-06-28 Vsevolod Vlasov <[email protected]>
Web Inspector: Resource content is not loaded if Resource.requestContent method is called before network request is finished.
Added: trunk/LayoutTests/http/tests/inspector/filesystem/directory-tree-expected.txt (0 => 121542)
--- trunk/LayoutTests/http/tests/inspector/filesystem/directory-tree-expected.txt (rev 0)
+++ trunk/LayoutTests/http/tests/inspector/filesystem/directory-tree-expected.txt 2012-06-29 09:54:00 UTC (rev 121542)
@@ -0,0 +1,32 @@
+Tests directory tree on FileSystemView.
+
+[directory tree node]
+expanded: true
+entry: (null)
+#children: 1
+ [directory tree node]
+ expanded: true
+ entry: filesystem:http://127.0.0.1:8000/temporary/
+ #children: 1
+ [directory tree node]
+ expanded: false
+ entry: filesystem:http://127.0.0.1:8000/temporary/hoge
+ #children: 0
+
+[directory tree node]
+expanded: true
+entry: (null)
+#children: 1
+ [directory tree node]
+ expanded: true
+ entry: filesystem:http://127.0.0.1:8000/temporary/
+ #children: 1
+ [directory tree node]
+ expanded: true
+ entry: filesystem:http://127.0.0.1:8000/temporary/hoge
+ #children: 1
+ [directory tree node]
+ expanded: false
+ entry: filesystem:http://127.0.0.1:8000/temporary/hoge/fuga
+ #children: 0
+
Added: trunk/LayoutTests/http/tests/inspector/filesystem/directory-tree.html (0 => 121542)
--- trunk/LayoutTests/http/tests/inspector/filesystem/directory-tree.html (rev 0)
+++ trunk/LayoutTests/http/tests/inspector/filesystem/directory-tree.html 2012-06-29 09:54:00 UTC (rev 121542)
@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<script src=""
+<script src=""
+<script>
+document.addEventListener("DOMContentLoaded", runTest);
+function test()
+{
+ var resourcesPanel = WebInspector.panels.resources;
+ var fileSystemListTreeElement = resourcesPanel.fileSystemListTreeElement;
+ if (!fileSystemListTreeElement) {
+ fileSystemListTreeElement = new WebInspector.FileSystemListTreeElement(resourcesPanel);
+ resourcesPanel.fileSystemListTreeElement = fileSystemListTreeElement;
+ resourcesPanel.sidebarTree.appendChild(fileSystemListTreeElement);
+ }
+
+ var fileSystemItem = null;
+ var fileSystemView = null;
+ var directoryTree = null;
+
+ var testStep = [
+ function()
+ {
+ WebInspector.showPanel("resources");
+ InspectorTest.createDirectory("/hoge", testStep.shift());
+ },
+
+ function()
+ {
+ InspectorTest.createDirectory("/hoge/fuga", testStep.shift());
+ },
+
+ function()
+ {
+ InspectorTest.createFile("/hoge/fuga/piyo", testStep.shift());
+ },
+
+ function()
+ {
+ InspectorTest.addSniffer(WebInspector.FileSystemListTreeElement.prototype, "_fileSystemAdded", testStep.shift(), false);
+ fileSystemListTreeElement._refreshFileSystem();
+ },
+
+ function(event)
+ {
+ if (event.data.name !== "filesystem:http://127.0.0.1:8000/temporary")
+ return;
+
+ fileSystemItem = fileSystemListTreeElement._fileSystemTreeElementByName("filesystem:http://127.0.0.1:8000/temporary");
+
+ fileSystemItem.select();
+ fileSystemView = fileSystemItem._fileSystemView;
+ directoryTree = fileSystemView.directoryTree;
+
+ InspectorTest.callOnRequestCompleted(testStep.shift());
+ },
+
+ function() {
+ dumpDirectoryTree(directoryTree);
+ InspectorTest.addResult("");
+
+ directoryTree.children[0].expandRecursively();
+ InspectorTest.callOnRequestCompleted(testStep.shift());
+ },
+
+ function() {
+ dumpDirectoryTree(directoryTree);
+
+ InspectorTest.clearFileSystem(testStep.shift());
+ },
+
+ function()
+ {
+ InspectorTest.completeTest();
+ }
+ ];
+
+ InspectorTest.clearFileSystem(testStep.shift());
+
+ function dumpDirectoryTree(treeNode, indent)
+ {
+ indent = indent || "";
+ InspectorTest.addResult(indent + "[directory tree node]");
+ InspectorTest.addResult(indent + "expanded: " + treeNode.expanded);
+ if (treeNode._entry)
+ InspectorTest.addResult(indent + "entry: " + treeNode._entry.url)
+ else
+ InspectorTest.addResult(indent + "entry: (null)")
+ InspectorTest.addResult(indent + "#children: " + treeNode.children.length);
+
+ for (var i = 0; i < treeNode.children.length; ++i)
+ dumpDirectoryTree(treeNode.children[i], indent + " ");
+ }
+}
+</script>
+</head>
+<body>
+<p>Tests directory tree on FileSystemView.</p>
+</body>
+</html>
Modified: trunk/LayoutTests/http/tests/inspector/filesystem/filesystem-test.js (121541 => 121542)
--- trunk/LayoutTests/http/tests/inspector/filesystem/filesystem-test.js 2012-06-29 09:50:26 UTC (rev 121541)
+++ trunk/LayoutTests/http/tests/inspector/filesystem/filesystem-test.js 2012-06-29 09:54:00 UTC (rev 121542)
@@ -3,6 +3,37 @@
var nextCallbackId = 0;
var callbacks = {};
+ InspectorTest.addSniffer(WebInspector.FileSystemRequestManager.prototype, "requestFileSystemRoot", incrementRequestCount, true);
+ InspectorTest.addSniffer(WebInspector.FileSystemRequestManager.prototype, "requestDirectoryContent", incrementRequestCount, true);
+ InspectorTest.addSniffer(WebInspector.FileSystemRequestManager.prototype, "requestMetadata", incrementRequestCount, true);
+
+ InspectorTest.addSniffer(WebInspector.FileSystemRequestManager.prototype, "_fileSystemRootReceived", decrementRequestCount, true);
+ InspectorTest.addSniffer(WebInspector.FileSystemRequestManager.prototype, "_directoryContentReceived", decrementRequestCount, true);
+ InspectorTest.addSniffer(WebInspector.FileSystemRequestManager.prototype, "_metadataReceived", decrementRequestCount, true);
+
+ var idleCallbacks = [];
+ var requestCount = 0;
+ function incrementRequestCount()
+ {
+ ++requestCount;
+ }
+
+ function decrementRequestCount()
+ {
+ if (--requestCount !== 0)
+ return;
+
+ var callbacks = idleCallbacks;
+ idleCallbacks = [];
+ for (var i = 0; i < callbacks.length; ++i)
+ callbacks[i]();
+ }
+
+ InspectorTest.callOnRequestCompleted = function(callback)
+ {
+ idleCallbacks.push(callback);
+ };
+
InspectorTest.registerCallback = function(callback)
{
var callbackId = ++nextCallbackId;
Modified: trunk/Source/WebCore/ChangeLog (121541 => 121542)
--- trunk/Source/WebCore/ChangeLog 2012-06-29 09:50:26 UTC (rev 121541)
+++ trunk/Source/WebCore/ChangeLog 2012-06-29 09:54:00 UTC (rev 121542)
@@ -1,3 +1,31 @@
+2012-06-29 Taiju Tsuiki <[email protected]>
+
+ Web Inspector: Add FileSystemView
+ https://bugs.webkit.org/show_bug.cgi?id=73301
+
+ This patch introduce a split view as FileSystemView. Including directory tree as sidebar tree.
+
+ Reviewed by Vsevolod Vlasov.
+
+ Test: http/tests/inspector/filesystem/directory-tree.html
+
+ * WebCore.gypi:
+ * WebCore.vcproj/WebCore.vcproj:
+ * inspector/compile-front-end.py:
+ * inspector/front-end/FileSystemModel.js:
+ (WebInspector.FileSystemModel.Entry.compare):
+ * inspector/front-end/FileSystemView.js: Added.
+ * inspector/front-end/ResourcesPanel.js:
+ (WebInspector.ResourcesPanel.prototype.showFileSystem):
+ (WebInspector.FileSystemTreeElement.prototype.get itemURL):
+ (WebInspector.FileSystemTreeElement.prototype.onattach):
+ (WebInspector.FileSystemTreeElement.prototype._handleContextMenuEvent):
+ (WebInspector.FileSystemTreeElement.prototype._refreshFileSystem):
+ (WebInspector.FileSystemTreeElement.prototype.onselect):
+ (WebInspector.FileSystemTreeElement.prototype.clear):
+ * inspector/front-end/WebKit.qrc:
+ * inspector/front-end/inspector.html:
+
2012-06-29 Kentaro Hara <[email protected]>
[V8] Replace v8::Integer::New() with v8Integer() in custom bindings
Modified: trunk/Source/WebCore/WebCore.gypi (121541 => 121542)
--- trunk/Source/WebCore/WebCore.gypi 2012-06-29 09:50:26 UTC (rev 121541)
+++ trunk/Source/WebCore/WebCore.gypi 2012-06-29 09:54:00 UTC (rev 121542)
@@ -6277,6 +6277,7 @@
'inspector/front-end/ExtensionServer.js',
'inspector/front-end/FileManager.js',
'inspector/front-end/FileSystemModel.js',
+ 'inspector/front-end/FileSystemView.js',
'inspector/front-end/FilteredItemSelectionDialog.js',
'inspector/front-end/FontView.js',
'inspector/front-end/GoToLineDialog.js',
Modified: trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj (121541 => 121542)
--- trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj 2012-06-29 09:50:26 UTC (rev 121541)
+++ trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj 2012-06-29 09:54:00 UTC (rev 121542)
@@ -74930,6 +74930,10 @@
>
</File>
<File
+ RelativePath="..\inspector\front-end\FileSystemView.js"
+ >
+ </File>
+ <File
RelativePath="..\inspector\front-end\filteredItemSelectionDialog.css"
>
</File>
Modified: trunk/Source/WebCore/inspector/compile-front-end.py (121541 => 121542)
--- trunk/Source/WebCore/inspector/compile-front-end.py 2012-06-29 09:50:26 UTC (rev 121541)
+++ trunk/Source/WebCore/inspector/compile-front-end.py 2012-06-29 09:54:00 UTC (rev 121542)
@@ -211,6 +211,7 @@
"DatabaseQueryView.js",
"DatabaseTableView.js",
"DOMStorageItemsView.js",
+ "FileSystemView.js",
"IndexedDBViews.js",
"ResourcesPanel.js",
]
Modified: trunk/Source/WebCore/inspector/front-end/FileSystemModel.js (121541 => 121542)
--- trunk/Source/WebCore/inspector/front-end/FileSystemModel.js 2012-06-29 09:50:26 UTC (rev 121541)
+++ trunk/Source/WebCore/inspector/front-end/FileSystemModel.js 2012-06-29 09:54:00 UTC (rev 121542)
@@ -291,6 +291,18 @@
this._isDirectory = backendEntry.isDirectory;
}
+/**
+ * @param {WebInspector.FileSystemModel.Entry} x
+ * @param {WebInspector.FileSystemModel.Entry} y
+ * @return {number}
+ */
+WebInspector.FileSystemModel.Entry.compare = function(x, y)
+{
+ if (x.isDirectory != y.isDirectory)
+ return y.isDirectory ? 1 : -1;
+ return x.name.localeCompare(y.name);
+}
+
WebInspector.FileSystemModel.Entry.prototype = {
/**
* @type {WebInspector.FileSystemModel}
Added: trunk/Source/WebCore/inspector/front-end/FileSystemView.js (0 => 121542)
--- trunk/Source/WebCore/inspector/front-end/FileSystemView.js (rev 0)
+++ trunk/Source/WebCore/inspector/front-end/FileSystemView.js 2012-06-29 09:54:00 UTC (rev 121542)
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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.
+ */
+
+/**
+ * @constructor
+ * @extends {WebInspector.SplitView}
+ * @param {WebInspector.FileSystemModel.FileSystem} fileSystem
+ */
+WebInspector.FileSystemView = function(fileSystem)
+{
+ WebInspector.SplitView.call(this, WebInspector.SplitView.SidebarPosition.Left, "FileSystemViewSidebarWidth");
+ this.element.addStyleClass("file-system-view");
+
+ var directoryTreeElement = this.element.createChild("ol", "filesystem-directory-tree");
+ this.directoryTree = new TreeOutline(directoryTreeElement);
+ this.sidebarElement.appendChild(directoryTreeElement);
+ this.sidebarElement.addStyleClass("outline-disclosure");
+ this.sidebarElement.addStyleClass("sidebar");
+
+ var rootItem = new WebInspector.FileSystemView.EntryTreeElement(this, fileSystem.root);
+ rootItem.expanded = true;
+ this.directoryTree.appendChild(rootItem);
+ this._visibleView = null;
+}
+
+WebInspector.FileSystemView.prototype = {
+ /**
+ * @param {WebInspector.View} view
+ */
+ showView: function(view)
+ {
+ if (this._visibleView === view)
+ return;
+ if (this._visibleView)
+ this._visibleView.detach();
+ this._visibleView = view;
+ view.show(this.mainElement);
+ }
+}
+
+WebInspector.FileSystemView.prototype.__proto__ = WebInspector.SplitView.prototype;
+
+/**
+ * @constructor
+ * @extends {TreeElement}
+ * @param {WebInspector.FileSystemView} fileSystemView
+ * @param {WebInspector.FileSystemModel.Entry} entry
+ */
+WebInspector.FileSystemView.EntryTreeElement = function(fileSystemView, entry)
+{
+ TreeElement.call(this, entry.name, null, entry.isDirectory);
+
+ this._entry = entry;
+ this._fileSystemView = fileSystemView;
+}
+
+WebInspector.FileSystemView.EntryTreeElement.prototype = {
+ onattach: function()
+ {
+ var selection = this.listItemElement.createChild("div", "selection");
+ this.listItemElement.insertBefore(selection, this.listItemElement.firstChild);
+
+ this.listItemElement.addEventListener("contextmenu", this._handleContextMenuEvent.bind(this), true);
+ },
+
+ onpopulate: function()
+ {
+ this.refresh();
+ },
+
+ _handleContextMenuEvent: function(event)
+ {
+ if (!this._entry.isDirectory)
+ return;
+
+ var contextMenu = new WebInspector.ContextMenu();
+ contextMenu.appendItem(WebInspector.UIString("Refresh"), this.refresh.bind(this));
+ contextMenu.show(event);
+ },
+
+ /**
+ * @param {number} errorCode
+ * @param {Array.<WebInspector.FileSystemModel.Entry>=} entries
+ */
+ _directoryContentReceived: function(errorCode, entries)
+ {
+ if (errorCode === FileError.NOT_FOUND_ERR) {
+ if (this.parent !== this.treeOutline)
+ this.parent.refresh();
+ return;
+ }
+
+ if (errorCode !== 0 || !entries) {
+ console.error("Failed to read directory: " + errorCode);
+ return;
+ }
+
+ entries.sort(WebInspector.FileSystemModel.Entry.compare);
+ var oldChildren = this.children.slice(0);
+
+ var newEntryIndex = 0;
+ var oldChildIndex = 0;
+ var currentTreeItem = 0;
+ while (newEntryIndex < entries.length && oldChildIndex < oldChildren.length) {
+ var newEntry = entries[newEntryIndex];
+ var oldChild = oldChildren[oldChildIndex];
+ var order = newEntry.name.localeCompare(oldChild._entry.name);
+
+ if (order === 0) {
+ if (oldChild._entry.isDirectory && oldChild.expanded)
+ oldChild.refresh();
+ ++newEntryIndex;
+ ++oldChildIndex;
+ ++currentTreeItem;
+ continue;
+ }
+ if (order < 0) {
+ this.insertChild(new WebInspector.FileSystemView.EntryTreeElement(this._fileSystemView, newEntry), currentTreeItem);
+ ++newEntryIndex;
+ ++currentTreeItem;
+ continue;
+ }
+
+ this.removeChildAtIndex(currentTreeItem);
+ ++oldChildIndex;
+ }
+ for (; newEntryIndex < entries.length; ++newEntryIndex)
+ this.appendChild(new WebInspector.FileSystemView.EntryTreeElement(this._fileSystemView, entries[newEntryIndex]));
+
+ for (; oldChildIndex < oldChildren.length; ++oldChildIndex)
+ this.removeChild(oldChildren[oldChildIndex]);
+ },
+
+ refresh: function()
+ {
+ if (!this._entry.isDirectory)
+ return;
+ this._entry.requestDirectoryContent(this._directoryContentReceived.bind(this));
+ }
+}
+
+WebInspector.FileSystemView.EntryTreeElement.prototype.__proto__ = TreeElement.prototype;
Modified: trunk/Source/WebCore/inspector/front-end/ResourcesPanel.js (121541 => 121542)
--- trunk/Source/WebCore/inspector/front-end/ResourcesPanel.js 2012-06-29 09:50:26 UTC (rev 121541)
+++ trunk/Source/WebCore/inspector/front-end/ResourcesPanel.js 2012-06-29 09:54:00 UTC (rev 121542)
@@ -462,6 +462,14 @@
this._innerShowView(this._applicationCacheViews[frameId]);
},
+ /**
+ * @param {WebInspector.View} view
+ */
+ showFileSystem: function(view)
+ {
+ this._innerShowView(view);
+ },
+
showCategoryView: function(categoryName)
{
if (!this._categoryView)
@@ -1525,6 +1533,7 @@
var fileSystemTreeElement = this._fileSystemTreeElementByName(fileSystem.name);
if (!fileSystemTreeElement)
return;
+ fileSystemTreeElement.clear();
this.removeChild(fileSystemTreeElement);
},
@@ -1981,6 +1990,19 @@
get itemURL()
{
return "filesystem://" + this._fileSystem.name;
+ },
+
+ onselect: function()
+ {
+ WebInspector.BaseStorageTreeElement.prototype.onselect.call(this);
+ this._fileSystemView = new WebInspector.FileSystemView(this._fileSystem);
+ this._storagePanel.showFileSystem(this._fileSystemView);
+ },
+
+ clear: function()
+ {
+ if (this.fileSystemView && this._storagePanel.visibleView == this.fileSystemView)
+ this._storagePanel.closeVisibleView();
}
}
Modified: trunk/Source/WebCore/inspector/front-end/WebKit.qrc (121541 => 121542)
--- trunk/Source/WebCore/inspector/front-end/WebKit.qrc 2012-06-29 09:50:26 UTC (rev 121541)
+++ trunk/Source/WebCore/inspector/front-end/WebKit.qrc 2012-06-29 09:54:00 UTC (rev 121542)
@@ -59,6 +59,7 @@
<file>ExtensionServer.js</file>
<file>FileManager.js</file>
<file>FileSystemModel.js</file>
+ <file>FileSystemView.js</file>
<file>FilteredItemSelectionDialog.js</file>
<file>FontView.js</file>
<file>GoToLineDialog.js</file>
Modified: trunk/Source/WebCore/inspector/front-end/inspector.html (121541 => 121542)
--- trunk/Source/WebCore/inspector/front-end/inspector.html 2012-06-29 09:50:26 UTC (rev 121541)
+++ trunk/Source/WebCore/inspector/front-end/inspector.html 2012-06-29 09:54:00 UTC (rev 121542)
@@ -162,6 +162,7 @@
<script type="text/_javascript_" src=""
<script type="text/_javascript_" src=""
<script type="text/_javascript_" src=""
+ <script type="text/_javascript_" src=""
<script type="text/_javascript_" src=""
<script type="text/_javascript_" src=""
<script type="text/_javascript_" src=""