Title: [110681] trunk/Source/WebCore
Revision
110681
Author
[email protected]
Date
2012-03-14 02:59:50 -0700 (Wed, 14 Mar 2012)

Log Message

Web Inspector: Introduce SnippetsScriptMapping.
https://bugs.webkit.org/show_bug.cgi?id=80890

Reviewed by Pavel Feldman.

* inspector/front-end/ScriptMapping.js:
(WebInspector.MainScriptMapping):
(WebInspector.MainScriptMapping.prototype.addScript):
(WebInspector.MainScriptMapping.prototype._mappingForScript):
* inspector/front-end/SnippetsModel.js:
(WebInspector.SnippetsModel.prototype.snippetForId):
(WebInspector.SnippetsModel.prototype.snippetForSourceURL):
(WebInspector.SnippetsScriptMapping):
(WebInspector.SnippetsScriptMapping.prototype.uiSourceCodeList):
(WebInspector.SnippetsScriptMapping.prototype.addScript):
(WebInspector.SnippetsScriptMapping.prototype._snippetAdded):
(WebInspector.SnippetsScriptMapping.prototype._releaseSnippetScript.get if):
(WebInspector.SnippetsScriptMapping.prototype._releaseSnippetScript):
(WebInspector.SnippetsScriptMapping.prototype._snippetDeleted.get this):
(WebInspector.SnippetsScriptMapping.prototype._snippetDeleted):
(WebInspector.SnippetsScriptMapping.prototype.reset):
(WebInspector.SnippetContentProvider):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (110680 => 110681)


--- trunk/Source/WebCore/ChangeLog	2012-03-14 09:38:09 UTC (rev 110680)
+++ trunk/Source/WebCore/ChangeLog	2012-03-14 09:59:50 UTC (rev 110681)
@@ -1,3 +1,28 @@
+2012-03-12  Vsevolod Vlasov  <[email protected]>
+
+        Web Inspector: Introduce SnippetsScriptMapping.
+        https://bugs.webkit.org/show_bug.cgi?id=80890
+
+        Reviewed by Pavel Feldman.
+
+        * inspector/front-end/ScriptMapping.js:
+        (WebInspector.MainScriptMapping):
+        (WebInspector.MainScriptMapping.prototype.addScript):
+        (WebInspector.MainScriptMapping.prototype._mappingForScript):
+        * inspector/front-end/SnippetsModel.js:
+        (WebInspector.SnippetsModel.prototype.snippetForId):
+        (WebInspector.SnippetsModel.prototype.snippetForSourceURL):
+        (WebInspector.SnippetsScriptMapping):
+        (WebInspector.SnippetsScriptMapping.prototype.uiSourceCodeList):
+        (WebInspector.SnippetsScriptMapping.prototype.addScript):
+        (WebInspector.SnippetsScriptMapping.prototype._snippetAdded):
+        (WebInspector.SnippetsScriptMapping.prototype._releaseSnippetScript.get if):
+        (WebInspector.SnippetsScriptMapping.prototype._releaseSnippetScript):
+        (WebInspector.SnippetsScriptMapping.prototype._snippetDeleted.get this):
+        (WebInspector.SnippetsScriptMapping.prototype._snippetDeleted):
+        (WebInspector.SnippetsScriptMapping.prototype.reset):
+        (WebInspector.SnippetContentProvider):
+
 2012-03-14  Sheriff Bot  <[email protected]>
 
         Unreviewed, rolling out r110673.

Modified: trunk/Source/WebCore/inspector/front-end/ScriptMapping.js (110680 => 110681)


--- trunk/Source/WebCore/inspector/front-end/ScriptMapping.js	2012-03-14 09:38:09 UTC (rev 110680)
+++ trunk/Source/WebCore/inspector/front-end/ScriptMapping.js	2012-03-14 09:59:50 UTC (rev 110681)
@@ -70,10 +70,18 @@
 WebInspector.MainScriptMapping = function()
 {
     this._mappings = [];
+    
     this._resourceMapping = new WebInspector.ResourceScriptMapping();
-    this._resourceMapping.addEventListener(WebInspector.ScriptMapping.Events.UISourceCodeListChanged, this._handleUISourceCodeListChanged, this);
     this._mappings.push(this._resourceMapping);
 
+    if (WebInspector.experimentsSettings.snippetsSupport.isEnabled()) {
+        this._snippetsMapping = new WebInspector.SnippetsScriptMapping();
+        this._mappings.push(this._snippetsMapping);
+    }
+
+    for (var i = 0; i < this._mappings.length; ++i)
+        this._mappings[i].addEventListener(WebInspector.ScriptMapping.Events.UISourceCodeListChanged, this._handleUISourceCodeListChanged, this);
+    
     this._mappingForScriptId = {};
     this._mappingForUISourceCode = new Map();
     this._liveLocationsForScriptId = {};
@@ -155,13 +163,26 @@
     {
         this._liveLocationsForScriptId[script.scriptId] = [];
 
-        var mapping = this._resourceMapping;
-
+        var mapping = this._mappingForScript(script);
         this._mappingForScriptId[script.scriptId] = mapping;
         mapping.addScript(script);
     },
 
     /**
+     * @param {WebInspector.Script} script
+     * @return {WebInspector.ScriptMapping}
+     */
+    _mappingForScript: function(script)
+    {
+        if (WebInspector.experimentsSettings.snippetsSupport.isEnabled()) {
+            if (WebInspector.snippetsModel.snippetIdForSourceURL(script.sourceURL))
+                return this._snippetsMapping;
+        }
+            
+        return this._resourceMapping;
+    },
+
+    /**
      * @param {WebInspector.Event} event
      */
     _handleUISourceCodeListChanged: function(event)

Modified: trunk/Source/WebCore/inspector/front-end/SnippetsModel.js (110680 => 110681)


--- trunk/Source/WebCore/inspector/front-end/SnippetsModel.js	2012-03-14 09:38:09 UTC (rev 110680)
+++ trunk/Source/WebCore/inspector/front-end/SnippetsModel.js	2012-03-14 09:59:50 UTC (rev 110681)
@@ -43,7 +43,7 @@
 WebInspector.SnippetsModel.EventTypes = {
     SnippetAdded: "SnippetAdded",
     SnippetRenamed: "SnippetRenamed",
-    SnippetDeleted: "SnippetDeleted",
+    SnippetRemoved: "SnippetRemoved",
 }
 
 WebInspector.SnippetsModel.prototype = {
@@ -81,7 +81,7 @@
             if (snippet.id === this._snippets[i].id) {
                 this._snippets.splice(i, 1);
                 this._saveSettings();
-                this.dispatchEventToListeners(WebInspector.SnippetsModel.EventTypes.SnippetDeleted, snippet);
+                this.dispatchEventToListeners(WebInspector.SnippetsModel.EventTypes.SnippetRemoved, snippet);
                 break;
             }
         }
@@ -134,6 +134,26 @@
     snippetForId: function(snippetId)
     {
         return this._snippets[snippetId];
+    },
+
+    /**
+     * @param {string} sourceURL
+     * @return {string}
+     */
+    snippetIdForSourceURL: function(sourceURL)
+    {
+        // FIXME: to be implemented.
+        return null;
+    },
+
+    /**
+     * @param {string} sourceURL
+     * @return {WebInspector.Snippet}
+     */
+    snippetForSourceURL: function(sourceURL)
+    {
+        // FIXME: to be implemented.
+        return null;
     }
 }
 
@@ -155,6 +175,8 @@
     this._content = content || "";
 }
 
+WebInspector.Snippet.evaluatedSnippetExtraLinesCount = 2;
+
 /**
  * @param {Object} serializedSnippet
  * @return {WebInspector.Snippet}
@@ -221,3 +243,195 @@
 }
 
 WebInspector.Snippet.prototype.__proto__ = WebInspector.Object.prototype;
+
+/**
+ * @constructor
+ * @extends {WebInspector.ScriptMapping}
+ */
+WebInspector.SnippetsScriptMapping = function()
+{
+    this._snippetForScriptId = {};
+    this._uiSourceCodeForScriptId = {};
+    this._scriptForUISourceCode = new Map();
+    this._snippetForUISourceCode = new Map();
+    this._uiSourceCodeForSnippet = new Map();
+    
+    WebInspector.snippetsModel.addEventListener(WebInspector.SnippetsModel.EventTypes.SnippetAdded, this._snippetAdded.bind(this));
+    WebInspector.snippetsModel.addEventListener(WebInspector.SnippetsModel.EventTypes.SnippetRemoved, this._snippetRemoved.bind(this));
+}
+
+WebInspector.SnippetsScriptMapping.prototype = {
+    /**
+     * @param {DebuggerAgent.Location} rawLocation
+     * @return {WebInspector.UILocation}
+     */
+    rawLocationToUILocation: function(rawLocation)
+    {
+        var uiSourceCode = this._uiSourceCodeForScriptId[rawLocation.scriptId];
+
+        var snippet = this._snippetForScriptId[rawLocation.scriptId];
+        if (snippet) {
+            var uiLineNumber = rawLocation.lineNumber - WebInspector.Snippet.evaluatedSnippetExtraLinesCount;
+            return new WebInspector.UILocation(uiSourceCode, uiLineNumber, rawLocation.columnNumber || 0);
+        }
+
+        return new WebInspector.UILocation(uiSourceCode, rawLocation.lineNumber, rawLocation.columnNumber || 0);
+    },
+
+    /**
+     * @param {WebInspector.UISourceCode} uiSourceCode
+     * @param {number} lineNumber
+     * @param {number} columnNumber
+     * @return {DebuggerAgent.Location}
+     */
+    uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber)
+    {
+        var script = this._scriptForUISourceCode.get(uiSourceCode);
+        if (!script)
+            return null;
+
+        var snippet = this._snippetForUISourceCode.get(uiSourceCode);
+        if (snippet) {
+            var rawLineNumber = lineNumber + WebInspector.Snippet.evaluatedSnippetExtraLinesCount;
+            return WebInspector.debuggerModel.createRawLocation(script, rawLineNumber, columnNumber);
+        }
+
+        return WebInspector.debuggerModel.createRawLocation(script, lineNumber, columnNumber);
+    },
+
+    /**
+     * @return {Array.<WebInspector.UISourceCode>}
+     */
+    uiSourceCodeList: function()
+    {
+        var result = [];
+        for (var uiSourceCode in this._uiSourceCodeForSnippet.values())
+            result.push(uiSourceCode);
+        result = result.concat(this._releasedUISourceCodes());
+        return result;
+    },
+
+    /**
+     * @return {Array.<WebInspector.UISourceCode>}
+     */
+    _releasedUISourceCodes: function()
+    {
+        var result = [];
+        for (var scriptId in this._uiSourceCodeForScriptId) {
+            var uiSourceCode = this._uiSourceCodeForScriptId[scriptId];
+            if (this._snippetForUISourceCode.get(uiSourceCode))
+                continue;
+            result.push(uiSourceCode);
+        }
+        return result;
+    },
+
+    /**
+     * @param {WebInspector.Script} script
+     */
+    addScript: function(script)
+    {
+        var snippet = WebInspector.snippetsModel.snippetForSourceURL(script.sourceURL);
+        if (!snippet) {
+            this._createUISourceCodeForScript(script);
+            return;
+        }
+        this._releaseSnippetScript(snippet);        
+        var uiSourceCode = this._uiSourceCodeForSnippet.get(snippet);
+        this._uiSourceCodeForScriptId[script.scriptId] = uiSourceCode;
+        this._snippetForScriptId[script.scriptId] = snippet;
+        this._scriptForUISourceCode.put(uiSourceCode, script);
+        var data = { removedItems: [], addedItems: [], scriptIds: [script.scriptId] };
+        this.dispatchEventToListeners(WebInspector.ScriptMapping.Events.UISourceCodeListChanged, data);        
+    },
+
+    /**
+     * @param {WebInspector.Event} event
+     */
+    _snippetAdded: function(event)
+    {
+        var snippet = /** @type {WebInspector.Snippet} */ event.data;
+        var uiSourceCodeId = ""; // FIXME: to be implemented.
+        var uiSourceCodeURL = ""; // FIXME: to be implemented.
+        var uiSourceCode = new WebInspector.UISourceCode(uiSourceCodeId, uiSourceCodeURL, new WebInspector.SnippetContentProvider(snippet));
+        uiSourceCode.isSnippet = true;
+        uiSourceCode.isEditable = true;
+        this._uiSourceCodeForSnippet.put(snippet, uiSourceCode);
+        this._snippetForUISourceCode.put(uiSourceCode, snippet);
+        var data = { removedItems: [], addedItems: [uiSourceCode], scriptIds: [] };
+        this.dispatchEventToListeners(WebInspector.ScriptMapping.Events.UISourceCodeListChanged, data);
+    },
+
+    /**
+     * @param {WebInspector.Script} script
+     */
+    _createUISourceCodeForScript: function(script)
+    {
+        var uiSourceCode = new WebInspector.UISourceCode(script.sourceURL, script.sourceURL, new WebInspector.ScriptContentProvider(script));
+        uiSourceCode.isSnippetEvaluation = true;
+        this._uiSourceCodeForScriptId[script.scriptId] = uiSourceCode;
+        this._scriptForUISourceCode.put(uiSourceCode, script);
+        var data = { removedItems: [], addedItems: [uiSourceCode], scriptIds: [script.scriptId] };
+        this.dispatchEventToListeners(WebInspector.ScriptMapping.Events.UISourceCodeListChanged, data);
+    },
+
+    /**
+     * @param {WebInspector.Snippet} snippet
+     */
+    _releaseSnippetScript: function(snippet)
+    {
+        var uiSourceCode = this._uiSourceCodeForSnippet.get(snippet);
+        var script = this._scriptForUISourceCode.get(uiSourceCode);
+        if (!script)
+            return;
+
+        delete this._uiSourceCodeForScriptId[script.scriptId];
+        delete this._snippetForScriptId[script.scriptId];
+        this._scriptForUISourceCode.remove(uiSourceCode);
+
+        this._createUISourceCodeForScript(script);
+    },
+
+    /**
+     * @param {WebInspector.Event} event
+     */
+    _snippetRemoved: function(event)
+    {
+        var snippet = /** @type {WebInspector.Snippet} */ event.data;
+        var uiSourceCode = this._uiSourceCodeForSnippet.get(snippet);
+        this._releaseSnippetScript(snippet);
+        this._uiSourceCodeForSnippet.remove(snippet);
+        this._snippetForUISourceCode.remove(uiSourceCode);
+        var data = { removedItems: [uiSourceCode], addedItems: [], scriptIds: [] };
+        this.dispatchEventToListeners(WebInspector.ScriptMapping.Events.UISourceCodeListChanged, data);
+    },
+
+    reset: function()
+    {
+        var removedUISourceCodes = this._releasedUISourceCodes();
+        this._snippetForScriptId = {};
+        this._uiSourceCodeForScriptId = {};
+        this._scriptForUISourceCode = new Map();
+        var data = { removedItems: removedUISourceCodes, addedItems: [], scriptIds: [] };
+        this.dispatchEventToListeners(WebInspector.ScriptMapping.Events.UISourceCodeListChanged, data);
+    }
+}
+
+WebInspector.SnippetsScriptMapping.prototype.__proto__ = WebInspector.ScriptMapping.prototype;
+
+/**
+ * @constructor
+ * @extends {WebInspector.StaticContentProvider}
+ * @param {WebInspector.Snippet} snippet
+ */
+WebInspector.SnippetContentProvider = function(snippet)
+{
+    WebInspector.StaticContentProvider.call(this, "text/_javascript_", snippet.content);
+}
+
+WebInspector.SnippetContentProvider.prototype.__proto__ = WebInspector.StaticContentProvider.prototype;
+
+/**
+ * @type {?WebInspector.SnippetsModel}
+ */
+WebInspector.snippetsModel = null;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to