Changeset 110864 in webkit


Ignore:
Timestamp:
Mar 15, 2012 11:26:11 AM (12 years ago)
Author:
vsevik@chromium.org
Message:

Web Inspector: MainScriptMapping should detect snippet scripts by means of sourceURL set before evaluation.
https://bugs.webkit.org/show_bug.cgi?id=81031

Reviewed by Pavel Feldman.

Source/WebCore:

  • inspector/front-end/SnippetsModel.js:

(WebInspector.SnippetsModel):
(WebInspector.SnippetsModel.prototype._saveSettings):
(WebInspector.SnippetsModel.prototype.deleteSnippet):
(WebInspector.SnippetsModel.prototype._snippetAdded):
(WebInspector.SnippetsModel.prototype._sourceURLForSnippet):
(WebInspector.SnippetsModel.prototype.snippetIdForSourceURL):
(WebInspector.SnippetsModel.prototype.snippetForSourceURL):
(WebInspector.Snippet.prototype.evaluate):
(WebInspector.SnippetsScriptMapping):
(WebInspector.SnippetsScriptMapping.prototype.uiLocationToRawLocation.get if):
(WebInspector.SnippetsScriptMapping.prototype.uiLocationToRawLocation):
(WebInspector.SnippetsScriptMapping.prototype._releasedUISourceCodes):
(WebInspector.SnippetsScriptMapping.prototype._snippetAdded):
(WebInspector.SnippetsScriptMapping.prototype._snippetWillBeEvaluated):
(WebInspector.SnippetsScriptMapping.prototype._snippetRemoved.get this):
(WebInspector.SnippetsScriptMapping.prototype._snippetRemoved):

LayoutTests:

  • inspector/debugger/snippets-model-expected.txt:
  • inspector/debugger/snippets-model.html:
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r110860 r110864  
     12012-03-15  Vsevolod Vlasov  <vsevik@chromium.org>
     2
     3        Web Inspector: MainScriptMapping should detect snippet scripts by means of sourceURL set before evaluation.
     4        https://bugs.webkit.org/show_bug.cgi?id=81031
     5
     6        Reviewed by Pavel Feldman.
     7
     8        * inspector/debugger/snippets-model-expected.txt:
     9        * inspector/debugger/snippets-model.html:
     10
    1112012-03-15  Elliot Poger  <epoger@google.com>
    212
  • trunk/LayoutTests/inspector/debugger/snippets-model-expected.txt

    r110576 r110864  
    1 Tests how snippets model stores, saves and loads snippets
     1Tests snippets model.
    22
     3
     4Running: testCreateRenameEditDelete
    35Dumping saved snippets:
    46Dumping model snippets:
     
    3436Dumping model snippets:
    3537
     38Running: testEvaluate
     39Last evaluation source url for snippet: snippets://1_1
     40Last evaluation source url for snippet: snippets://2_2
     41Last evaluation source url for snippet: snippets://1_3
     42
  • trunk/LayoutTests/inspector/debugger/snippets-model.html

    r110576 r110864  
    55function test()
    66{
    7     function dumpSnippets(snippets)
     7    function resetSnippetsSettings()
    88    {
    9         for (var i = 0; i < snippets.length; ++i) {
    10             var snippet = snippets[i];
    11             InspectorTest.addResult("    Snippet: id = " + snippet.id + ", name = '" + snippet.name + "', content = '" + snippet.content + "'.");
    12         }
    13     }
    14 
    15     function dumpSavedSnippets()
    16     {
    17         InspectorTest.addResult("Dumping saved snippets:");
    18         dumpSnippets(WebInspector.snippetsModel._snippetsSetting.get());
    19     }
    20 
    21     function dumpModelSnippets()
    22     {
    23         InspectorTest.addResult("Dumping model snippets:");
    24         dumpSnippets(WebInspector.snippetsModel.snippets);
     9        WebInspector.snippetsModel._lastSnippetIdentifierSetting.set(0);
     10        WebInspector.snippetsModel._snippetsSetting.set([]);
     11        WebInspector.snippetsModel._lastSnippetEvaluationIndexSetting.set(0);
    2512    }
    2613
     
    2916        WebInspector.snippetsModel = new WebInspector.SnippetsModel();
    3017
    31     dumpSavedSnippets();
    32     dumpModelSnippets();
    33     var snippet = WebInspector.snippetsModel.createSnippet();
    34     InspectorTest.addResult("Snippet created.");
    35     dumpSavedSnippets();
    36     dumpModelSnippets();
    37     snippet.name = "New snippet name";
    38     InspectorTest.addResult("Snippet renamed.");
    39     dumpSavedSnippets();
    40     dumpModelSnippets();
    41     snippet.content = "New snippet content";
    42     InspectorTest.addResult("Snippet content changed.");
    43     dumpSavedSnippets();
    44     dumpModelSnippets();
    45     var anotherSnippet = WebInspector.snippetsModel.createSnippet();
    46     InspectorTest.addResult("Another snippet created.");
    47     dumpSavedSnippets();
    48     dumpModelSnippets();
    49     WebInspector.snippetsModel.deleteSnippet(snippet);
    50     InspectorTest.addResult("Snippet deleted.");
    51     dumpSavedSnippets();
    52     dumpModelSnippets();
    53     WebInspector.snippetsModel.deleteSnippet(anotherSnippet);
    54     InspectorTest.addResult("Another snippet deleted.");
    55     dumpSavedSnippets();
    56     dumpModelSnippets();
     18    InspectorTest.runTestSuite([
     19        function testCreateRenameEditDelete(next)
     20        {
     21            function dumpSnippets(snippets)
     22            {
     23                for (var i = 0; i < snippets.length; ++i) {
     24                    var snippet = snippets[i];
     25                    InspectorTest.addResult("    Snippet: id = " + snippet.id + ", name = '" + snippet.name + "', content = '" + snippet.content + "'.");
     26                }
     27            }
    5728
    58     InspectorTest.completeTest();
     29            function dumpSavedSnippets()
     30            {
     31                InspectorTest.addResult("Dumping saved snippets:");
     32                dumpSnippets(WebInspector.snippetsModel._snippetsSetting.get());
     33            }
     34
     35            function dumpModelSnippets()
     36            {
     37                InspectorTest.addResult("Dumping model snippets:");
     38                var snippets = [];
     39                for (var id in WebInspector.snippetsModel._snippets)
     40                    snippets.push(WebInspector.snippetsModel._snippets[id]);
     41                dumpSnippets(snippets);
     42            }
     43
     44            resetSnippetsSettings();
     45
     46            dumpSavedSnippets();
     47            dumpModelSnippets();
     48            var snippet = WebInspector.snippetsModel.createSnippet();
     49            InspectorTest.addResult("Snippet created.");
     50            dumpSavedSnippets();
     51            dumpModelSnippets();
     52            snippet.name = "New snippet name";
     53            InspectorTest.addResult("Snippet renamed.");
     54            dumpSavedSnippets();
     55            dumpModelSnippets();
     56            snippet.content = "New snippet content";
     57            InspectorTest.addResult("Snippet content changed.");
     58            dumpSavedSnippets();
     59            dumpModelSnippets();
     60            var anotherSnippet = WebInspector.snippetsModel.createSnippet();
     61            InspectorTest.addResult("Another snippet created.");
     62            dumpSavedSnippets();
     63            dumpModelSnippets();
     64            WebInspector.snippetsModel.deleteSnippet(snippet);
     65            InspectorTest.addResult("Snippet deleted.");
     66            dumpSavedSnippets();
     67            dumpModelSnippets();
     68            WebInspector.snippetsModel.deleteSnippet(anotherSnippet);
     69            InspectorTest.addResult("Another snippet deleted.");
     70            dumpSavedSnippets();
     71            dumpModelSnippets();
     72
     73            next();
     74        },
     75
     76        function testEvaluate(next)
     77        {
     78            resetSnippetsSettings();
     79
     80            var snippet1 = WebInspector.snippetsModel.createSnippet();
     81            snippet1.name = "Snippet1";
     82            snippet1.content = "";
     83            snippet1.content += "// This snippet does nothing.\n";
     84            snippet1.content += "var i = 2+2;\n";
     85            var snippet2 = WebInspector.snippetsModel.createSnippet();
     86            snippet2.name = "Snippet2";
     87            snippet2.content = "";
     88            snippet2.content += "// This snippet creates a function that does nothing.\n";
     89            snippet2.content += "function doesNothing()\n";
     90            snippet2.content += "{\n";
     91            snippet2.content += "    var  i = 2+2;\n";
     92            snippet2.content += "}\n";
     93
     94            function evaluateSnippetAndDumpEvaluationDetails(snippet, callback)
     95            {
     96                InspectorTest.addSniffer(WebInspector.SnippetsScriptMapping.prototype, "addScript", dumpScript);
     97                snippet.evaluate();
     98                InspectorTest.addResult("Last evaluation source url for snippet: " + snippet._lastEvaluationSourceURL);
     99                InspectorTest.assertEquals(snippet, WebInspector.snippetsModel.snippetForSourceURL(snippet._lastEvaluationSourceURL), "Snippet can not be identified by its evaluation sourceURL.");
     100
     101                function dumpScript(script)
     102                {
     103                    InspectorTest.addResult("Snippet script added, sourceURL = " + script.sourceURL);
     104                    callback();
     105                }
     106
     107                // FIXME: This should be removed once snippets evaluation itself is implemented.
     108                callback();
     109            }
     110
     111            evaluateSnippetAndDumpEvaluationDetails(snippet1, step2);
     112
     113            function step2()
     114            {
     115                evaluateSnippetAndDumpEvaluationDetails(snippet2, step3);
     116            }
     117
     118            function step3()
     119            {
     120                evaluateSnippetAndDumpEvaluationDetails(snippet1, next);
     121            }
     122        }
     123    ]);
    59124};
    60125</script>
    61126</head>
    62127<body onload="runTest()">
    63 <p>Tests how snippets model stores, saves and loads snippets</p>
     128<p>Tests snippets model.</p>
    64129</body>
    65130</html>
  • trunk/Source/WebCore/ChangeLog

    r110857 r110864  
     12012-03-15  Vsevolod Vlasov  <vsevik@chromium.org>
     2
     3        Web Inspector: MainScriptMapping should detect snippet scripts by means of sourceURL set before evaluation.
     4        https://bugs.webkit.org/show_bug.cgi?id=81031
     5
     6        Reviewed by Pavel Feldman.
     7
     8        * inspector/front-end/SnippetsModel.js:
     9        (WebInspector.SnippetsModel):
     10        (WebInspector.SnippetsModel.prototype._saveSettings):
     11        (WebInspector.SnippetsModel.prototype.deleteSnippet):
     12        (WebInspector.SnippetsModel.prototype._snippetAdded):
     13        (WebInspector.SnippetsModel.prototype._sourceURLForSnippet):
     14        (WebInspector.SnippetsModel.prototype.snippetIdForSourceURL):
     15        (WebInspector.SnippetsModel.prototype.snippetForSourceURL):
     16        (WebInspector.Snippet.prototype.evaluate):
     17        (WebInspector.SnippetsScriptMapping):
     18        (WebInspector.SnippetsScriptMapping.prototype.uiLocationToRawLocation.get if):
     19        (WebInspector.SnippetsScriptMapping.prototype.uiLocationToRawLocation):
     20        (WebInspector.SnippetsScriptMapping.prototype._releasedUISourceCodes):
     21        (WebInspector.SnippetsScriptMapping.prototype._snippetAdded):
     22        (WebInspector.SnippetsScriptMapping.prototype._snippetWillBeEvaluated):
     23        (WebInspector.SnippetsScriptMapping.prototype._snippetRemoved.get this):
     24        (WebInspector.SnippetsScriptMapping.prototype._snippetRemoved):
     25
    1262012-03-15  Kevin Ollivier  <kevino@theolliviers.com>
    227
  • trunk/Source/WebCore/inspector/front-end/SnippetsModel.js

    r110694 r110864  
    3333WebInspector.SnippetsModel = function()
    3434{
    35     /** @type {Array.<WebInspector.Snippet>} */ this._snippets;
     35    this._snippets = {};
    3636
    3737    this._lastSnippetIdentifierSetting = WebInspector.settings.createSetting("lastSnippetIdentifier", 0);
    3838    this._snippetsSetting = WebInspector.settings.createSetting("snippets", []);
     39    this._lastSnippetEvaluationIndexSetting = WebInspector.settings.createSetting("lastSnippetEvaluationIndex", 0);
    3940
    4041    this._loadSettings();
    4142}
     43
     44WebInspector.SnippetsModel.snippetsSourceURLPrefix = "snippets://";
    4245
    4346WebInspector.SnippetsModel.EventTypes = {
    4447    SnippetAdded: "SnippetAdded",
     48    SnippetWillBeEvaluated: "SnippetWillBeEvaluated",
    4549    SnippetRenamed: "SnippetRenamed",
    4650    SnippetRemoved: "SnippetRemoved",
     
    4852
    4953WebInspector.SnippetsModel.prototype = {
    50     /**
    51      * @return {Array.<WebInspector.Snippet>}
    52      */
    53     get snippets()
    54     {
    55         return this._snippets.slice();
    56     },
    57 
    5854    _saveSettings: function()
    5955    {
    6056        var savedSnippets = [];
    61         for (var i = 0; i < this._snippets.length; ++i)
    62             savedSnippets.push(this._snippets[i].serializeToObject());
    63 
     57        for (var id in this._snippets)
     58            savedSnippets.push(this._snippets[id].serializeToObject());
    6459        this._snippetsSetting.set(savedSnippets);
    6560    },
     
    6762    _loadSettings: function()
    6863    {
    69         this._snippets = [];
    7064        var savedSnippets = this._snippetsSetting.get();
    7165        for (var i = 0; i < savedSnippets.length; ++i)
     
    7872    deleteSnippet: function(snippet)
    7973    {
    80         for (var i = 0; i < this._snippets.length; ++i) {
    81             if (snippet.id === this._snippets[i].id) {
    82                 this._snippets.splice(i, 1);
    83                 this._saveSettings();
    84                 this.dispatchEventToListeners(WebInspector.SnippetsModel.EventTypes.SnippetRemoved, snippet);
    85                 break;
    86             }
    87         }
     74        delete this._snippets[snippet.id];
     75        this._saveSettings();
     76        this.dispatchEventToListeners(WebInspector.SnippetsModel.EventTypes.SnippetRemoved, snippet);
    8877    },
    8978
     
    9382    createSnippet: function()
    9483    {
    95         var snippetId = this._lastSnippetIdentifierSetting.get() + 1;
    96         this._lastSnippetIdentifierSetting.set(snippetId);
     84        var nextId = this._lastSnippetIdentifierSetting.get() + 1;
     85        var snippetId = String(nextId);
     86        this._lastSnippetIdentifierSetting.set(nextId);
    9787        var snippet = new WebInspector.Snippet(this, snippetId);
    9888        this._snippetAdded(snippet);
     
    10797    _snippetAdded: function(snippet)
    10898    {
    109         this._snippets.push(snippet);
     99        this._snippets[snippet.id] = snippet;
    110100        this.dispatchEventToListeners(WebInspector.SnippetsModel.EventTypes.SnippetAdded, snippet);
    111101    },
    112102
    113103    /**
    114      * @param {number} snippetId
     104     * @param {string} snippetId
    115105     */
    116106    _snippetContentUpdated: function(snippetId)
     
    129119
    130120    /**
    131      * @param {number} snippetId
    132      * @return {WebInspector.Snippet|undefined}
    133      */
    134     snippetForId: function(snippetId)
    135     {
    136         return this._snippets[snippetId];
     121     * @param {WebInspector.Snippet} snippet
     122     */
     123    _evaluateSnippet: function(snippet)
     124    {
     125        this.dispatchEventToListeners(WebInspector.SnippetsModel.EventTypes.SnippetWillBeEvaluated, snippet);
     126        var evaluationIndex = this._lastSnippetEvaluationIndexSetting.get() + 1;
     127        this._lastSnippetEvaluationIndexSetting.set(evaluationIndex);
     128
     129        var sourceURL = this._sourceURLForSnippet(snippet, evaluationIndex);
     130        snippet._lastEvaluationSourceURL = sourceURL;
     131        var expression = "\n//@ sourceURL=" + sourceURL + "\n" + snippet.content;
     132        // FIXME: evaluate snippet here.
     133    },
     134
     135    /**
     136     * @param {WebInspector.Snippet} snippet
     137     * @param {string} evaluationIndex
     138     * @return {string}
     139     */
     140    _sourceURLForSnippet: function(snippet, evaluationIndex)
     141    {
     142        var snippetsPrefix = WebInspector.SnippetsModel.snippetsSourceURLPrefix;
     143        var evaluationSuffix = evaluationIndex ? "_" + evaluationIndex : "";
     144        return snippetsPrefix + snippet.id + evaluationSuffix;
    137145    },
    138146
     
    143151    snippetIdForSourceURL: function(sourceURL)
    144152    {
    145         // FIXME: to be implemented.
    146         return null;
     153        var snippetsPrefix = WebInspector.SnippetsModel.snippetsSourceURLPrefix;
     154        if (sourceURL.indexOf(snippetsPrefix) !== 0)
     155            return null;
     156        var splittedURL = sourceURL.substring(snippetsPrefix.length).split("_");
     157        var snippetId = splittedURL[0];
     158        return snippetId;
    147159    },
    148160
     
    153165    snippetForSourceURL: function(sourceURL)
    154166    {
    155         // FIXME: to be implemented.
    156         return null;
     167        var snippetId = this.snippetIdForSourceURL(sourceURL);
     168        if (!snippetId)
     169            return null;
     170        var snippet = this._snippets[snippetId];
     171        if (!snippet || snippet._lastEvaluationSourceURL !== sourceURL)
     172            return null;
     173        return snippet;
    157174    }
    158175}
     
    164181 * @extends {WebInspector.Object}
    165182 * @param {WebInspector.SnippetsModel} model
    166  * @param {number} id
     183 * @param {string} id
    167184 * @param {string=} name
    168185 * @param {string=} content
     
    230247    },
    231248
     249    evaluate: function()
     250    {
     251        this._model._evaluateSnippet(this);
     252    },
     253
    232254    /**
    233255     * @return {Object}
     
    254276    this._uiSourceCodeForScriptId = {};
    255277    this._scriptForUISourceCode = new Map();
    256     this._snippetForUISourceCode = new Map();
    257278    this._uiSourceCodeForSnippet = new Map();
    258279   
    259280    WebInspector.snippetsModel.addEventListener(WebInspector.SnippetsModel.EventTypes.SnippetAdded, this._snippetAdded.bind(this));
     281    WebInspector.snippetsModel.addEventListener(WebInspector.SnippetsModel.EventTypes.SnippetWillBeEvaluated, this._snippetWillBeEvaluated.bind(this));
    260282    WebInspector.snippetsModel.addEventListener(WebInspector.SnippetsModel.EventTypes.SnippetRemoved, this._snippetRemoved.bind(this));
    261283}
     
    291313            return null;
    292314
    293         var snippet = this._snippetForUISourceCode.get(uiSourceCode);
    294         if (snippet) {
     315        if (uiSourceCode.isSnippet) {
    295316            var rawLineNumber = lineNumber + WebInspector.Snippet.evaluatedSnippetExtraLinesCount;
    296317            return WebInspector.debuggerModel.createRawLocation(script, rawLineNumber, columnNumber);
     
    320341        for (var scriptId in this._uiSourceCodeForScriptId) {
    321342            var uiSourceCode = this._uiSourceCodeForScriptId[scriptId];
    322             if (this._snippetForUISourceCode.get(uiSourceCode))
     343            if (uiSourceCode.isSnippet)
    323344                continue;
    324345            result.push(uiSourceCode);
     
    337358            return;
    338359        }
    339         this._releaseSnippetScript(snippet);       
    340360        var uiSourceCode = this._uiSourceCodeForSnippet.get(snippet);
     361        console.assert(!this._scriptForUISourceCode.get(uiSourceCode));
     362
    341363        this._uiSourceCodeForScriptId[script.scriptId] = uiSourceCode;
    342364        this._snippetForScriptId[script.scriptId] = snippet;
     
    358380        uiSourceCode.isEditable = true;
    359381        this._uiSourceCodeForSnippet.put(snippet, uiSourceCode);
    360         this._snippetForUISourceCode.put(uiSourceCode, snippet);
     382        uiSourceCode.snippet = snippet;
    361383        var data = { removedItems: [], addedItems: [uiSourceCode], scriptIds: [] };
    362384        this.dispatchEventToListeners(WebInspector.ScriptMapping.Events.UISourceCodeListChanged, data);
     385    },
     386
     387    /**
     388     * @param {WebInspector.Event} event
     389     */
     390    _snippetWillBeEvaluated: function(event)
     391    {
     392        var snippet = /** @type {WebInspector.Snippet} */ event.data;
     393        this._releaseSnippetScript(snippet);
    363394    },
    364395
     
    402433        this._releaseSnippetScript(snippet);
    403434        this._uiSourceCodeForSnippet.remove(snippet);
    404         this._snippetForUISourceCode.remove(uiSourceCode);
    405435        var data = { removedItems: [uiSourceCode], addedItems: [], scriptIds: [] };
    406436        this.dispatchEventToListeners(WebInspector.ScriptMapping.Events.UISourceCodeListChanged, data);
Note: See TracChangeset for help on using the changeset viewer.