Title: [117750] trunk/Source/WebCore
Revision
117750
Author
[email protected]
Date
2012-05-21 01:55:58 -0700 (Mon, 21 May 2012)

Log Message

Web Inspector: implement revision history view.
https://bugs.webkit.org/show_bug.cgi?id=86966

Reviewed by Yury Semikhatsky.

Added revision view into the drawer. It now lists all the revisions
along with the inline diffs. Once source panel is enabled by default,
this view will completely substitute the one in the resources panel.
See the screenshot attached. View is updated when revisions are added
and when editor view is switched.

* English.lproj/localizedStrings.js:
* WebCore.gypi:
* WebCore.vcproj/WebCore.vcproj:
* inspector/compile-front-end.py:
* inspector/front-end/AdvancedSearchController.js:
(WebInspector.FileBasedSearchResultsPane.prototype._appendSearchMatches):
* inspector/front-end/ContextMenu.js:
(WebInspector.ContextMenu.prototype._itemSelected):
(WebInspector.ContextMenu.prototype.appendApplicableItems):
(WebInspector.ContextMenu.Provider.prototype.appendApplicableItems):
(WebInspector.ContextMenu.registerProvider):
* inspector/front-end/_javascript_SourceFrame.js:
(WebInspector._javascript_SourceFrame.prototype.populateTextAreaContextMenu):
* inspector/front-end/Resource.js:
(WebInspector.ResourceRevision.prototype.revertToThis):
* inspector/front-end/RevisionHistoryView.js: Added.
(WebInspector.RevisionHistoryView):
(WebInspector.RevisionHistoryView.showHistory):
(WebInspector.RevisionHistoryView.uiSourceCodeSelected):
(WebInspector.RevisionHistoryView.prototype._revisionAdded):
(WebInspector.RevisionHistoryView.prototype._onclose):
(WebInspector.RevisionHistoryTreeElement.else.revert):
(WebInspector.RevisionHistoryTreeElement):
(WebInspector.RevisionHistoryTreeElement.prototype.onexpand.step1):
(WebInspector.RevisionHistoryTreeElement.prototype.onexpand.step2):
(WebInspector.RevisionHistoryTreeElement.prototype.onexpand):
(WebInspector.RevisionHistoryTreeElement.prototype._createLine):
(WebInspector.RevisionHistoryTreeElement.prototype._diff.popsym):
(WebInspector.RevisionHistoryTreeElement.prototype._diff):
* inspector/front-end/ScriptsPanel.js:
(WebInspector.ScriptsPanel.prototype._editorSelected):
(WebInspector.ScriptsPanel.prototype.registerUISourceCodeProvider):
(WebInspector.ScriptsPanel.prototype._showLocalHistory):
(WebInspector.ScriptsPanel.prototype.appendApplicableItems):
* inspector/front-end/StylesPanel.js:
(WebInspector.StyleSourceFrame.prototype._contentChanged):
(WebInspector.StyleSourceFrame.prototype.populateTextAreaContextMenu):
* inspector/front-end/WebKit.qrc:
* inspector/front-end/inspector.css:
(#search-results-pane-file-based .search-result):
(#search-results-pane-file-based .search-result:hover):
(#search-results-pane-file-based .search-match:hover):
(#search-results-pane-file-based .search-match .search-match-content):
* inspector/front-end/inspector.html:
* inspector/front-end/scriptsPanel.css:
(.outline-disclosure.revision-history-drawer):
(.outline-disclosure.revision-history-drawer ol):
(.outline-disclosure.revision-history-drawer > ol):
(.outline-disclosure.revision-history-drawer li):
(.outline-disclosure.revision-history-drawer li.parent):
(.revision-history-link):
(.outline-disclosure.revision-history-drawer .revision-history-line):
(.revision-history-drawer .webkit-line-number):
(.revision-history-line-added):
(.revision-history-line-removed):
* inspector/front-end/textViewer.css:
(.webkit-added-line.webkit-line-number):
(.webkit-removed-line.webkit-line-number):
(.webkit-changed-line.webkit-line-number):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (117749 => 117750)


--- trunk/Source/WebCore/ChangeLog	2012-05-21 08:53:37 UTC (rev 117749)
+++ trunk/Source/WebCore/ChangeLog	2012-05-21 08:55:58 UTC (rev 117750)
@@ -1,3 +1,76 @@
+2012-05-21  Pavel Feldman  <[email protected]>
+
+        Web Inspector: implement revision history view.
+        https://bugs.webkit.org/show_bug.cgi?id=86966
+
+        Reviewed by Yury Semikhatsky.
+
+        Added revision view into the drawer. It now lists all the revisions
+        along with the inline diffs. Once source panel is enabled by default,
+        this view will completely substitute the one in the resources panel.
+        See the screenshot attached. View is updated when revisions are added
+        and when editor view is switched.
+
+        * English.lproj/localizedStrings.js:
+        * WebCore.gypi:
+        * WebCore.vcproj/WebCore.vcproj:
+        * inspector/compile-front-end.py:
+        * inspector/front-end/AdvancedSearchController.js:
+        (WebInspector.FileBasedSearchResultsPane.prototype._appendSearchMatches):
+        * inspector/front-end/ContextMenu.js:
+        (WebInspector.ContextMenu.prototype._itemSelected):
+        (WebInspector.ContextMenu.prototype.appendApplicableItems):
+        (WebInspector.ContextMenu.Provider.prototype.appendApplicableItems):
+        (WebInspector.ContextMenu.registerProvider):
+        * inspector/front-end/_javascript_SourceFrame.js:
+        (WebInspector._javascript_SourceFrame.prototype.populateTextAreaContextMenu):
+        * inspector/front-end/Resource.js:
+        (WebInspector.ResourceRevision.prototype.revertToThis):
+        * inspector/front-end/RevisionHistoryView.js: Added.
+        (WebInspector.RevisionHistoryView):
+        (WebInspector.RevisionHistoryView.showHistory):
+        (WebInspector.RevisionHistoryView.uiSourceCodeSelected):
+        (WebInspector.RevisionHistoryView.prototype._revisionAdded):
+        (WebInspector.RevisionHistoryView.prototype._onclose):
+        (WebInspector.RevisionHistoryTreeElement.else.revert):
+        (WebInspector.RevisionHistoryTreeElement):
+        (WebInspector.RevisionHistoryTreeElement.prototype.onexpand.step1):
+        (WebInspector.RevisionHistoryTreeElement.prototype.onexpand.step2):
+        (WebInspector.RevisionHistoryTreeElement.prototype.onexpand):
+        (WebInspector.RevisionHistoryTreeElement.prototype._createLine):
+        (WebInspector.RevisionHistoryTreeElement.prototype._diff.popsym):
+        (WebInspector.RevisionHistoryTreeElement.prototype._diff):
+        * inspector/front-end/ScriptsPanel.js:
+        (WebInspector.ScriptsPanel.prototype._editorSelected):
+        (WebInspector.ScriptsPanel.prototype.registerUISourceCodeProvider):
+        (WebInspector.ScriptsPanel.prototype._showLocalHistory):
+        (WebInspector.ScriptsPanel.prototype.appendApplicableItems):
+        * inspector/front-end/StylesPanel.js:
+        (WebInspector.StyleSourceFrame.prototype._contentChanged):
+        (WebInspector.StyleSourceFrame.prototype.populateTextAreaContextMenu):
+        * inspector/front-end/WebKit.qrc:
+        * inspector/front-end/inspector.css:
+        (#search-results-pane-file-based .search-result):
+        (#search-results-pane-file-based .search-result:hover):
+        (#search-results-pane-file-based .search-match:hover):
+        (#search-results-pane-file-based .search-match .search-match-content):
+        * inspector/front-end/inspector.html:
+        * inspector/front-end/scriptsPanel.css:
+        (.outline-disclosure.revision-history-drawer):
+        (.outline-disclosure.revision-history-drawer ol):
+        (.outline-disclosure.revision-history-drawer > ol):
+        (.outline-disclosure.revision-history-drawer li):
+        (.outline-disclosure.revision-history-drawer li.parent):
+        (.revision-history-link):
+        (.outline-disclosure.revision-history-drawer .revision-history-line):
+        (.revision-history-drawer .webkit-line-number):
+        (.revision-history-line-added):
+        (.revision-history-line-removed):
+        * inspector/front-end/textViewer.css:
+        (.webkit-added-line.webkit-line-number):
+        (.webkit-removed-line.webkit-line-number):
+        (.webkit-changed-line.webkit-line-number):
+
 2012-05-18  Ilya Tikhonovsky  <[email protected]>
 
         Web Inspector: upstream build dominators tree procedure from v8.

Modified: trunk/Source/WebCore/English.lproj/localizedStrings.js


(Binary files differ)

Modified: trunk/Source/WebCore/WebCore.gypi (117749 => 117750)


--- trunk/Source/WebCore/WebCore.gypi	2012-05-21 08:53:37 UTC (rev 117749)
+++ trunk/Source/WebCore/WebCore.gypi	2012-05-21 08:55:58 UTC (rev 117750)
@@ -6463,6 +6463,7 @@
             'inspector/front-end/ResourceView.js',
             'inspector/front-end/ResourceWebSocketFrameView.js',
             'inspector/front-end/ResourcesPanel.js',
+            'inspector/front-end/RevisionHistoryView.js',
             'inspector/front-end/ScopeChainSidebarPane.js',
             'inspector/front-end/Script.js',
             'inspector/front-end/ScriptFormatter.js',
@@ -6541,6 +6542,7 @@
             'inspector/front-end/profilesPanel.css',
             'inspector/front-end/resourceView.css',
             'inspector/front-end/resourcesPanel.css',
+            'inspector/front-end/revisionHistory.css',
             'inspector/front-end/scriptsPanel.css',
             'inspector/front-end/splitView.css',
             'inspector/front-end/tabbedPane.css',

Modified: trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj (117749 => 117750)


--- trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj	2012-05-21 08:53:37 UTC (rev 117749)
+++ trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj	2012-05-21 08:55:58 UTC (rev 117750)
@@ -74657,6 +74657,14 @@
 					>
 				</File>
 				<File
+					RelativePath="..\inspector\front-end\revisionHistory.css"
+					>
+				</File>
+				<File
+					RelativePath="..\inspector\front-end\RevisionHistoryView.js"
+					>
+				</File>
+				<File
 					RelativePath="..\inspector\front-end\ScopeChainSidebarPane.js"
 					>
 				</File>

Modified: trunk/Source/WebCore/inspector/compile-front-end.py (117749 => 117750)


--- trunk/Source/WebCore/inspector/compile-front-end.py	2012-05-21 08:53:37 UTC (rev 117749)
+++ trunk/Source/WebCore/inspector/compile-front-end.py	2012-05-21 08:55:58 UTC (rev 117750)
@@ -216,10 +216,11 @@
             "ScopeChainSidebarPane.js",
             "_javascript_SourceFrame.js",
             "PresentationConsoleMessageHelper.js",
-            "TabbedEditorContainer.js",
+            "RevisionHistoryView.js",
             "ScriptsNavigator.js",
             "ScriptsPanel.js",
             "ScriptsSearchScope.js",
+            "TabbedEditorContainer.js",
             "WatchExpressionsSidebarPane.js",
             "WorkerManager.js",
             "WorkersSidebarPane.js",

Modified: trunk/Source/WebCore/inspector/front-end/AdvancedSearchController.js (117749 => 117750)


--- trunk/Source/WebCore/inspector/front-end/AdvancedSearchController.js	2012-05-21 08:53:37 UTC (rev 117749)
+++ trunk/Source/WebCore/inspector/front-end/AdvancedSearchController.js	2012-05-21 08:55:58 UTC (rev 117750)
@@ -585,7 +585,7 @@
             
             var searchMatchElement = new TreeElement("", null, false);
             fileTreeElement.appendChild(searchMatchElement);
-            searchMatchElement.listItemElement.className = "search-match";
+            searchMatchElement.listItemElement.className = "search-match source-code";
             searchMatchElement.listItemElement.appendChild(anchor);
         }
     },

Modified: trunk/Source/WebCore/inspector/front-end/ContextMenu.js (117749 => 117750)


--- trunk/Source/WebCore/inspector/front-end/ContextMenu.js	2012-05-21 08:53:37 UTC (rev 117749)
+++ trunk/Source/WebCore/inspector/front-end/ContextMenu.js	2012-05-21 08:55:58 UTC (rev 117750)
@@ -92,9 +92,44 @@
     {
         if (this._handlers[id])
             this._handlers[id].call(this);
+    },
+
+    /**
+     * @param {Object} target
+     */
+    appendApplicableItems: function(target)
+    {
+        for (var i = 0; i < WebInspector.ContextMenu._providers.length; ++i) {
+            var provider = WebInspector.ContextMenu._providers[i];
+            provider.appendApplicableItems(this, target);
+        }
     }
 }
 
+/**
+ * @interface
+ */
+WebInspector.ContextMenu.Provider = function() { 
+}
+
+WebInspector.ContextMenu.Provider.prototype = {
+    /** 
+     * @param {WebInspector.ContextMenu} contextMenu
+     * @param {Object} target
+     */
+    appendApplicableItems: function(contextMenu, target) { }
+}
+
+/**
+ * @param {WebInspector.ContextMenu.Provider} provider
+ */
+WebInspector.ContextMenu.registerProvider = function(provider)
+{
+    WebInspector.ContextMenu._providers.push(provider);
+}
+
+WebInspector.ContextMenu._providers = [];
+
 WebInspector.contextMenuItemSelected = function(id)
 {
     if (WebInspector._contextMenu)

Modified: trunk/Source/WebCore/inspector/front-end/_javascript_SourceFrame.js (117749 => 117750)


--- trunk/Source/WebCore/inspector/front-end/_javascript_SourceFrame.js	2012-05-21 08:53:37 UTC (rev 117749)
+++ trunk/Source/WebCore/inspector/front-end/_javascript_SourceFrame.js	2012-05-21 08:55:58 UTC (rev 117750)
@@ -148,7 +148,9 @@
             contextMenu.appendItem(addToWatchLabel, this._scriptsPanel.addToWatch.bind(this._scriptsPanel, selection.toString()));
             var evaluateLabel = WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Evaluate in console" : "Evaluate in Console");
             contextMenu.appendItem(evaluateLabel, WebInspector.evaluateInConsole.bind(WebInspector, selection.toString()));
+            contextMenu.appendSeparator();
         }
+        contextMenu.appendApplicableItems(this._uiSourceCode);
     },
 
     afterTextChanged: function(oldRange, newRange)

Modified: trunk/Source/WebCore/inspector/front-end/Resource.js (117749 => 117750)


--- trunk/Source/WebCore/inspector/front-end/Resource.js	2012-05-21 08:53:37 UTC (rev 117749)
+++ trunk/Source/WebCore/inspector/front-end/Resource.js	2012-05-21 08:55:58 UTC (rev 117750)
@@ -301,7 +301,7 @@
     },
 
     /**
-     * @return {number}
+     * @return {Date}
      */
     get contentTimestamp()
     {
@@ -514,7 +514,8 @@
     {
         function revert(content)
         {
-            this._resource.setContent(content, true);
+            if (this._resource._content !== content)
+                this._resource.setContent(content, true);
         }
         this.requestContent(revert.bind(this));
     },

Added: trunk/Source/WebCore/inspector/front-end/RevisionHistoryView.js (0 => 117750)


--- trunk/Source/WebCore/inspector/front-end/RevisionHistoryView.js	                        (rev 0)
+++ trunk/Source/WebCore/inspector/front-end/RevisionHistoryView.js	2012-05-21 08:55:58 UTC (rev 117750)
@@ -0,0 +1,264 @@
+/*
+ * 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.View}
+ * @param {WebInspector.UISourceCode} uiSourceCode
+ */
+WebInspector.RevisionHistoryView = function(uiSourceCode)
+{
+    WebInspector.View.call(this);
+    this.registerRequiredCSS("revisionHistory.css");
+    this.element.addStyleClass("revision-history-drawer");
+    this.element.addStyleClass("fill");
+    this.element.addStyleClass("outline-disclosure");
+
+    this._uiSourceCode = uiSourceCode;
+    this._resource = uiSourceCode.resource();
+
+    var revisionCount = 0;
+    if (!this._resource || !this._resource.history.length) {
+        var label = this.element.createChild("div", "storage-empty-view");
+        label.textContent = WebInspector.UIString("No revisions");
+    } else {
+        var olElement = this.element.createChild("ol");
+        var treeOutline = new TreeOutline(olElement);
+        revisionCount = this._resource.history.length;
+
+        var historyItem = new WebInspector.RevisionHistoryTreeElement(this._resource);
+        historyItem.selectable = false;
+        treeOutline.appendChild(historyItem);
+
+        for (var i = revisionCount - 1; i >= 0; --i) {
+            var revision = this._resource.history[i];
+            historyItem = new WebInspector.RevisionHistoryTreeElement(this._resource, i);
+            historyItem.selectable = false;
+            treeOutline.appendChild(historyItem);
+        }
+    }
+
+    this._statusElement = document.createElement("span");
+    if (!revisionCount)
+        this._statusElement.textContent = WebInspector.UIString("%s: no revisions", uiSourceCode.parsedURL.displayName);
+    else if (revisionCount === 1)
+        this._statusElement.textContent = WebInspector.UIString("%s: 1 revision", uiSourceCode.parsedURL.displayName);
+    else
+        this._statusElement.textContent = WebInspector.UIString("%s: %s revisions", uiSourceCode.parsedURL.displayName, revisionCount);
+
+    if (this._resource)
+        this._resource.addEventListener(WebInspector.Resource.Events.RevisionAdded, this._revisionAdded, this);
+}
+
+/**
+ * @param {WebInspector.UISourceCode} uiSourceCode
+ */
+WebInspector.RevisionHistoryView.showHistory = function(uiSourceCode)
+{
+    var view = new WebInspector.RevisionHistoryView(uiSourceCode);
+    WebInspector.showViewInDrawer(view._statusElement, view, view._onclose.bind(view));
+    WebInspector.RevisionHistoryView._revisionHistoryShowing = true;
+}
+
+/**
+ * @param {WebInspector.UISourceCode} uiSourceCode
+ */
+WebInspector.RevisionHistoryView.uiSourceCodeSelected = function(uiSourceCode)
+{
+    if (WebInspector.RevisionHistoryView._revisionHistoryShowing)
+        WebInspector.RevisionHistoryView.showHistory(uiSourceCode);
+}
+
+WebInspector.RevisionHistoryView.prototype = {
+    _revisionAdded: function()
+    {
+        WebInspector.RevisionHistoryView.showHistory(this._uiSourceCode);
+    },
+
+    _onclose: function()
+    {
+        if (this._resource)
+            this._resource.removeEventListener(WebInspector.Resource.Events.RevisionAdded, this._revisionAdded, this);
+        delete WebInspector.RevisionHistoryView._revisionHistoryShowing;
+    }
+}
+
+WebInspector.RevisionHistoryView.prototype.__proto__ = WebInspector.View.prototype;
+
+/**
+ * @constructor
+ * @extends {TreeElement}
+ * @param {WebInspector.Resource} resource
+ * @param {number=} revisionOrdinal
+ */
+WebInspector.RevisionHistoryTreeElement = function(resource, revisionOrdinal)
+{
+    this._resource = resource;
+
+    var titleElement = document.createElement("span");
+    if (isNaN(revisionOrdinal)) {
+        this._revision = resource;
+        this._baseRevision = resource.history[resource.history.length - 1];
+
+        titleElement.textContent = resource.contentTimestamp.toLocaleTimeString();
+    } else {
+        this._revision = resource.history[revisionOrdinal];
+        this._baseRevision = resource.history[revisionOrdinal - 1];
+
+        titleElement.textContent = revisionOrdinal ? resource.history[revisionOrdinal].timestamp.toLocaleTimeString() : WebInspector.UIString("(original)");
+        function revert()
+        {
+            this._revision.revertToThis();
+        }
+
+        var revertElement = titleElement.createChild("span", "revision-history-link");
+        revertElement.textContent = WebInspector.UIString("revert to this");
+        revertElement.addEventListener("click", revert.bind(this), false);
+    }
+    TreeElement.call(this, titleElement, null, revisionOrdinal !== 0);
+}
+
+WebInspector.RevisionHistoryTreeElement.prototype = {
+    onexpand: function()
+    {
+        if (this._wasExpandedOnce)
+            return;
+        this._wasExpandedOnce = true;
+
+        this.childrenListElement.addStyleClass("source-code");
+        this._baseRevision.requestContent(step1.bind(this));
+
+        function step1(baseContent)
+        {
+            this._revision.requestContent(step2.bind(this, baseContent));
+        }
+
+        function step2(baseContent, revisionContent)
+        {
+            var oldLines = baseContent.split(/\r?\n/);
+            var newLines = revisionContent.split(/\r?\n/);
+            var diffData = this._diff(oldLines, newLines);
+
+            for (var i = 0; i < diffData.added.length; ++i) {
+                var lineNumber = diffData.added[i];
+                this._createLine(lineNumber, newLines[lineNumber], "added");
+            }
+
+            for (var i = 0; i < diffData.removed.length; ++i) {
+                var lineNumber = diffData.removed[i];
+                this._createLine(lineNumber, oldLines[lineNumber], "removed");
+            }
+        }
+    },
+
+    /**
+     * @param {number} lineNumber
+     * @param {string} lineContent
+     * @param {string} changeType
+     */
+    _createLine: function(lineNumber, lineContent, changeType)
+    {
+        var child = new TreeElement("", null, false);
+        child.selectable = false;
+        this.appendChild(child);
+        var lineElement = document.createElement("span");
+        var numberString = numberToStringWithSpacesPadding(lineNumber + 1, 4);
+        var lineNumberSpan = document.createElement("span");
+        lineNumberSpan.addStyleClass("webkit-line-number");
+        lineNumberSpan.textContent = numberString;
+        child.listItemElement.appendChild(lineNumberSpan);
+
+        var contentSpan = document.createElement("span");
+        contentSpan.textContent = lineContent;
+        child.listItemElement.appendChild(contentSpan);
+        child.listItemElement.addStyleClass("revision-history-line");
+        child.listItemElement.addStyleClass("revision-history-line-" + changeType);
+    },
+
+    _diff: function(x, y)
+    {
+        var symbols = {};
+        var r = 0, p = 0;
+        var result = [];
+
+        var p1 = popsym(0);
+        for (var i = 0; i < x.length; i++) {
+            p = r === p ? p1 : popsym(i);
+            p1 = popsym(i + 1);
+
+            var idx;
+            if (p > p1) {
+                i++;
+                idx = p1;
+                delete symbols[y[p]];
+            } else
+                idx = p;
+
+            if (idx === y.length)
+                p = popsym(i);
+            else {
+                r = idx;
+                result.push([i, r]);
+            }
+        }
+
+        var removed = [];
+        var added = [];
+        var ix = 0;
+        var iy = 0;
+        for (var i = 0; i < result.length; ++i) {
+            for (var j = ix; j < result[i][0]; ++j)
+                removed.push(j);
+            ix = result[i][0] + 1;
+            for (var j = iy; j < result[i][1]; ++j)
+                added.push(j);
+            iy = result[i][1] + 1;
+        }
+        for (var j = ix + 1; j < x.length; ++j)
+            removed.push(j);
+        for (var j = iy + 1; j < y.length; ++j)
+            added.push(j);
+
+        return { removed: removed, added: added };
+
+        function popsym(index)
+        {
+            var s = x[index];
+            var pos = symbols[s] + 1;
+            pos = y.indexOf(s, pos > r ? pos : r);
+            if (pos === -1)
+                pos = y.length;
+            symbols[s] = pos;
+            return pos;
+        }
+    }
+}
+
+WebInspector.RevisionHistoryTreeElement.prototype.__proto__ = TreeElement.prototype;
Property changes on: trunk/Source/WebCore/inspector/front-end/RevisionHistoryView.js
___________________________________________________________________

Added: svn:eol-style

Modified: trunk/Source/WebCore/inspector/front-end/ScriptsPanel.js (117749 => 117750)


--- trunk/Source/WebCore/inspector/front-end/ScriptsPanel.js	2012-05-21 08:53:37 UTC (rev 117749)
+++ trunk/Source/WebCore/inspector/front-end/ScriptsPanel.js	2012-05-21 08:55:58 UTC (rev 117750)
@@ -27,6 +27,7 @@
 /**
  * @constructor
  * @implements {WebInspector.TabbedEditorContainerDelegate}
+ * @implements {WebInspector.ContextMenu.Provider}
  * @extends {WebInspector.Panel}
  * @param {WebInspector.CompositeUISourceCodeProvider=} uiSourceCodeProviderForTest
  */
@@ -186,6 +187,7 @@
         WebInspector.debuggerModel.enableDebugger();
 
     WebInspector.advancedSearchController.registerSearchScope(new WebInspector.ScriptsSearchScope(this._uiSourceCodeProvider));
+    WebInspector.ContextMenu.registerProvider(this);
 }
 
 // Keep these in sync with WebCore::ScriptDebugServer
@@ -230,6 +232,7 @@
 
     willHide: function()
     {
+        WebInspector.Panel.prototype.willHide.call(this);
         WebInspector.closeViewInDrawer();
     },
 
@@ -578,6 +581,7 @@
     _editorSelected: function(event)
     {
         var uiSourceCode = /** @type {WebInspector.UISourceCode} */ event.data;
+        WebInspector.RevisionHistoryView.uiSourceCodeSelected(uiSourceCode);
         this._showFile(uiSourceCode);
         this._navigatorController.hideNavigatorOverlay();
     },
@@ -1045,6 +1049,27 @@
     registerUISourceCodeProvider: function(uiSourceCodeProvider)
     {
         this._uiSourceCodeProvider._registerUISourceCodeProvider(uiSourceCodeProvider);
+    },
+
+    /**
+     * @param {WebInspector.UISourceCode} uiSourceCode
+     */
+    _showLocalHistory: function(uiSourceCode)
+    {
+        WebInspector.RevisionHistoryView.showHistory(uiSourceCode);
+    },
+
+    /** 
+     * @param {WebInspector.ContextMenu} contextMenu
+     * @param {Object} target
+     */
+    appendApplicableItems: function(contextMenu, target)
+    {
+        if (WebInspector.experimentsSettings.sourceCodePanel.isEnabled() && target instanceof WebInspector.UISourceCode) {
+            contextMenu.appendSeparator();
+            contextMenu.appendItem(WebInspector.UIString("Revision history..."), this._showLocalHistory.bind(this, /** @type {WebInspector.UISourceCode} */ target));
+            contextMenu.appendSeparator();
+        }
     }
 }
 

Modified: trunk/Source/WebCore/inspector/front-end/StylesPanel.js (117749 => 117750)


--- trunk/Source/WebCore/inspector/front-end/StylesPanel.js	2012-05-21 08:53:37 UTC (rev 117749)
+++ trunk/Source/WebCore/inspector/front-end/StylesPanel.js	2012-05-21 08:55:58 UTC (rev 117750)
@@ -154,6 +154,14 @@
     {
         this._styleSource.contentChanged(this._styleSource.resource().content || "");
         this.setContent(this._styleSource.resource().content, false, "text/stylesheet");
+    },
+
+    populateTextAreaContextMenu: function(contextMenu, lineNumber)
+    {
+        WebInspector.SourceFrame.prototype.populateTextAreaContextMenu.call(this, contextMenu, lineNumber);
+        var scriptsPanel = WebInspector.panels.scripts;
+        contextMenu.appendApplicableItems(this._styleSource);
+        contextMenu.appendSeparator();
     }
 }
 

Modified: trunk/Source/WebCore/inspector/front-end/WebKit.qrc (117749 => 117750)


--- trunk/Source/WebCore/inspector/front-end/WebKit.qrc	2012-05-21 08:53:37 UTC (rev 117749)
+++ trunk/Source/WebCore/inspector/front-end/WebKit.qrc	2012-05-21 08:55:58 UTC (rev 117750)
@@ -127,6 +127,7 @@
     <file>ResourceView.js</file>
     <file>ResourceWebSocketFrameView.js</file>
     <file>ResourcesPanel.js</file>
+    <file>RevisionHistoryView.js</file>
     <file>ScopeChainSidebarPane.js</file>
     <file>Script.js</file>
     <file>ScriptFormatter.js</file>
@@ -203,6 +204,7 @@
     <file>profilesPanel.css</file>
     <file>resourceView.css</file>
     <file>resourcesPanel.css</file>
+    <file>revisionHistory.css</file>
     <file>scriptsPanel.css</file>
     <file>splitView.css</file>
     <file>tabbedPane.css</file>

Modified: trunk/Source/WebCore/inspector/front-end/inspector.css (117749 => 117750)


--- trunk/Source/WebCore/inspector/front-end/inspector.css	2012-05-21 08:53:37 UTC (rev 117749)
+++ trunk/Source/WebCore/inspector/front-end/inspector.css	2012-05-21 08:55:58 UTC (rev 117750)
@@ -2508,7 +2508,7 @@
 }
 
 #search-results-pane-file-based .search-result {
-    font-size: 12px;
+    font-size: 11px;
     padding: 2px 0 2px 10px;
     word-wrap: normal;
     white-space: pre;
@@ -2517,7 +2517,6 @@
 
 #search-results-pane-file-based .search-result:hover {
     background-color: rgba(121, 121, 121, 0.1);
-    -webkit-border-radius: 5px;
 }
 
 #search-results-pane-file-based .search-result .search-result-file-name {
@@ -2542,10 +2541,7 @@
     text-decoration: underline;
 }
 
-
 #search-results-pane-file-based .search-match {
-    font-family: 'dejavu sans mono', monospace;
-    font-size: 11px;
     word-wrap: normal;
     white-space: pre;
 }
@@ -2561,7 +2557,6 @@
 
 #search-results-pane-file-based .search-match:hover {
     background-color: rgba(56, 121, 217, 0.1);
-    -webkit-border-radius: 5px;
 }
 
 #search-results-pane-file-based .search-match .highlighted-match {
@@ -2575,7 +2570,6 @@
 
 #search-results-pane-file-based .search-match .search-match-content {
     color: #000;
-    white-space: pre;
 }
 
 .record-cpu-profile-status-bar-item .glyph, .record-profile-status-bar-item .glyph {

Modified: trunk/Source/WebCore/inspector/front-end/inspector.html (117749 => 117750)


--- trunk/Source/WebCore/inspector/front-end/inspector.html	2012-05-21 08:53:37 UTC (rev 117749)
+++ trunk/Source/WebCore/inspector/front-end/inspector.html	2012-05-21 08:55:58 UTC (rev 117750)
@@ -127,6 +127,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=""

Added: trunk/Source/WebCore/inspector/front-end/revisionHistory.css (0 => 117750)


--- trunk/Source/WebCore/inspector/front-end/revisionHistory.css	                        (rev 0)
+++ trunk/Source/WebCore/inspector/front-end/revisionHistory.css	2012-05-21 08:55:58 UTC (rev 117750)
@@ -0,0 +1,79 @@
+/*
+ * 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:
+ *
+ * 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.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE 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 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.
+ */
+
+.outline-disclosure.revision-history-drawer {
+    -webkit-padding-start: 0;
+    overflow: auto;
+}
+
+.outline-disclosure.revision-history-drawer ol {
+    margin-top: 2px;
+    -webkit-padding-start: 0;
+    padding-left: 0 !important;
+}
+
+.outline-disclosure.revision-history-drawer > ol {
+    padding-left: 0;
+}
+
+.outline-disclosure.revision-history-drawer li {
+    padding-left: 6px;
+    margin-top: 0;
+    margin-bottom: 0;
+    height: 13px;
+}
+
+.outline-disclosure.revision-history-drawer li.parent {
+    margin-left: 4px;
+}
+
+.revision-history-link {
+    text-decoration: underline;
+    cursor: pointer;
+    color: #00e;
+    padding: 0 4px;
+}
+
+.outline-disclosure.revision-history-drawer .revision-history-line {
+    padding-left: 0;
+    -webkit-user-select: text;
+}
+
+.revision-history-drawer .webkit-line-number {
+    margin-right: 5px;
+    border-right: 1px solid #BBB;
+    background-color: #F0F0F0;    
+}
+
+.revision-history-line-added {
+    background-color: rgb(153, 238, 153);
+}
+
+.revision-history-line-removed {
+    background-color: rgb(255, 221, 221);
+}
Property changes on: trunk/Source/WebCore/inspector/front-end/revisionHistory.css
___________________________________________________________________

Added: svn:eol-style

Modified: trunk/Source/WebCore/inspector/front-end/textViewer.css (117749 => 117750)


--- trunk/Source/WebCore/inspector/front-end/textViewer.css	2012-05-21 08:53:37 UTC (rev 117749)
+++ trunk/Source/WebCore/inspector/front-end/textViewer.css	2012-05-21 08:55:58 UTC (rev 117750)
@@ -175,17 +175,17 @@
     outline: 1px solid rgb(64, 115, 244);
 }
 
-.diff-container .webkit-added-line.webkit-line-number {
+.webkit-added-line.webkit-line-number {
     background-color: rgb(170, 255, 170);
     color: #333;
 }
 
-.diff-container .webkit-removed-line.webkit-line-number {
+.webkit-removed-line.webkit-line-number {
     background-color: rgb(255, 220, 220);
     text-decoration: line-through;
 }
 
-.diff-container .webkit-changed-line.webkit-line-number {
+.webkit-changed-line.webkit-line-number {
     background-color: rgb(170, 170, 255);
     color: #333;
 }

Modified: trunk/Source/WebCore/inspector/front-end/treeoutline.js (117749 => 117750)


--- trunk/Source/WebCore/inspector/front-end/treeoutline.js	2012-05-21 08:53:37 UTC (rev 117749)
+++ trunk/Source/WebCore/inspector/front-end/treeoutline.js	2012-05-21 08:55:58 UTC (rev 117750)
@@ -1117,7 +1117,8 @@
 TreeElement.prototype.isEventWithinDisclosureTriangle = function(event)
 {
     // FIXME: We should not use getComputedStyle(). For that we need to get rid of using ::before for disclosure triangle. (http://webk.it/74446) 
-    var computedLeftPadding = window.getComputedStyle(this._listItemNode).getPropertyCSSValue("padding-left").getFloatValue(CSSPrimitiveValue.CSS_PX);
+    var paddingLeftValue = window.getComputedStyle(this._listItemNode).getPropertyCSSValue("padding-left");
+    var computedLeftPadding = paddingLeftValue ? paddingLeftValue.getFloatValue(CSSPrimitiveValue.CSS_PX) : 0;
     var left = this._listItemNode.totalOffsetLeft() + computedLeftPadding;
     return event.pageX >= left && event.pageX <= left + this.arrowToggleWidth && this.hasChildren;
 }
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to