15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Apple Inc. All Rights Reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
28aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch * @extends {WebInspector.TargetAwareObject}
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @implements {WebInspector.ContentProvider}
30aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch * @param {!WebInspector.Target} target
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string} scriptId
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string} sourceURL
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {number} startLine
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {number} startColumn
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {number} endLine
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {number} endColumn
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {boolean} isContentScript
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string=} sourceMapURL
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {boolean=} hasSourceURL
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
41aafa69cb17c9d6606c07663ade5f81388a2c5986Ben MurdochWebInspector.Script = function(target, scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, sourceMapURL, hasSourceURL)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
43aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    WebInspector.TargetAwareObject.call(this, target);
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.scriptId = scriptId;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.sourceURL = sourceURL;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.lineOffset = startLine;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.columnOffset = startColumn;
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.endLine = endLine;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.endColumn = endColumn;
5010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    this._isContentScript = isContentScript;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.sourceMapURL = sourceMapURL;
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.hasSourceURL = hasSourceURL;
537757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    /** @type {!Set.<!WebInspector.Script.Location>} */
54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._locations = new Set();
557757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    /** @type {!Array.<!WebInspector.SourceMapping>} */
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._sourceMappings = [];
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.Script.Events = {
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ScriptEdited: "ScriptEdited",
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.Script.snippetSourceURLPrefix = "snippets:///";
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuWebInspector.Script.sourceURLRegex = /\n[\040\t]*\/\/[@#]\ssourceURL=\s*(\S*?)\s*$/mg;
66f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/**
6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {string} source
6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @return {string}
7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */
7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.Script._trimSourceURLComment = function(source)
7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
73f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return source.replace(WebInspector.Script.sourceURLRegex, "");
7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)},
7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.Script.prototype = {
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
7910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch     * @return {boolean}
8010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch     */
8110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    isContentScript: function()
8210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    {
8310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return this._isContentScript;
8410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    },
8510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
8610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    /**
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    contentURL: function()
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this.sourceURL;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
95a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!WebInspector.ResourceType}
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    contentType: function()
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebInspector.resourceTypes.Script;
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)     * @param {function(?string)} callback
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    requestContent: function(callback)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._source) {
1081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            callback(this._source);
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        /**
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         * @this {WebInspector.Script}
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         * @param {?Protocol.Error} error
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         * @param {string} source
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         */
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function didGetScriptSource(error, source)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this._source = WebInspector.Script._trimSourceURLComment(error ? "" : source);
1201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            callback(this._source);
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.scriptId) {
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Script failed to parse.
124d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            this.target().debuggerAgent().getScriptSource(this.scriptId, didGetScriptSource.bind(this));
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else
1261e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            callback("");
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} query
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {boolean} caseSensitive
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {boolean} isRegex
133a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(!Array.<!PageAgent.SearchMatch>)} callback
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    searchInContent: function(query, caseSensitive, isRegex, callback)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        /**
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         * @param {?Protocol.Error} error
139a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         * @param {!Array.<!PageAgent.SearchMatch>} searchMatches
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         */
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function innerCallback(error, searchMatches)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (error)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                console.error(error);
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var result = [];
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (var i = 0; i < searchMatches.length; ++i) {
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var searchMatch = new WebInspector.ContentProvider.SearchMatch(searchMatches[i].lineNumber, searchMatches[i].lineContent);
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result.push(searchMatch);
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            callback(result || []);
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.scriptId) {
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Script failed to parse.
155d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            this.target().debuggerAgent().searchInContent(this.scriptId, query, caseSensitive, isRegex, innerCallback);
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            callback([]);
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
16109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {string} source
16209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {string}
16309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
16409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    _appendSourceURLCommentIfNeeded: function(source)
16509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
16609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!this.hasSourceURL)
16709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return source;
16809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return source + "\n //# sourceURL=" + this.sourceURL;
16909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    },
17009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
17109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} newSource
173a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(?Protocol.Error, !DebuggerAgent.SetScriptSourceError=, !Array.<!DebuggerAgent.CallFrame>=, !DebuggerAgent.StackTrace=, boolean=)} callback
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    editSource: function(newSource, callback)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        /**
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         * @this {WebInspector.Script}
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         * @param {?Protocol.Error} error
180a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         * @param {!DebuggerAgent.SetScriptSourceError=} errorData
181a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         * @param {!Array.<!DebuggerAgent.CallFrame>=} callFrames
182a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         * @param {!Object=} debugData
183a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         * @param {!DebuggerAgent.StackTrace=} asyncStackTrace
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         */
185a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        function didEditScriptSource(error, errorData, callFrames, debugData, asyncStackTrace)
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // FIXME: support debugData.stack_update_needs_step_in flag by calling WebInspector.debugger_model.callStackModified
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!error)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._source = newSource;
190e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            var needsStepIn = !!debugData && debugData["stack_update_needs_step_in"] === true;
191a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            callback(error, errorData, callFrames, asyncStackTrace, needsStepIn);
192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (!error)
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                this.dispatchEventToListeners(WebInspector.Script.Events.ScriptEdited, newSource);
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
195a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
19609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        newSource = WebInspector.Script._trimSourceURLComment(newSource);
19709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // We append correct sourceURL to script for consistency only. It's not actually needed for things to work correctly.
19809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        newSource = this._appendSourceURLCommentIfNeeded(newSource);
19909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
200a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (this.scriptId)
201d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            this.target().debuggerAgent().setScriptSource(this.scriptId, newSource, undefined, didEditScriptSource.bind(this));
202a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        else
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            callback("Script failed to parse");
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {boolean}
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isInlineScript: function()
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var startsAtZero = !this.lineOffset && !this.columnOffset;
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return !!this.sourceURL && !startsAtZero;
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {boolean}
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isAnonymousScript: function()
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return !this.sourceURL;
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {boolean}
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isSnippet: function()
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
228e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return !!this.sourceURL && this.sourceURL.startsWith(WebInspector.Script.snippetSourceURLPrefix);
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
232f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu     * @return {boolean}
233f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu     */
234f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    isFramework: function()
235f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    {
236f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        if (!WebInspector.experimentsSettings.frameworksDebuggingSupport.isEnabled())
237f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return false;
238f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        if (!WebInspector.settings.skipStackFramesSwitch.get())
239f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return false;
240f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        var regex = WebInspector.settings.skipStackFramesPattern.asRegExp();
241f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return regex ? regex.test(this.sourceURL) : false;
242f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    },
243f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
244f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    /**
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} lineNumber
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number=} columnNumber
247a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!WebInspector.UILocation}
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rawLocationToUILocation: function(lineNumber, columnNumber)
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var uiLocation;
252aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var rawLocation = new WebInspector.DebuggerModel.Location(this.target(), this.scriptId, lineNumber, columnNumber || 0);
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = this._sourceMappings.length - 1; !uiLocation && i >= 0; --i)
254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            uiLocation = this._sourceMappings[i].rawLocationToUILocation(rawLocation);
255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        console.assert(uiLocation, "Script raw location can not be mapped to any ui location.");
256d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return /** @type {!WebInspector.UILocation} */ (uiLocation);
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
2607757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch     * @param {!WebInspector.SourceMapping} sourceMapping
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    pushSourceMapping: function(sourceMapping)
263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._sourceMappings.push(sourceMapping);
265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.updateLocations();
266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
268d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
269d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {!WebInspector.SourceMapping}
270d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
271d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    popSourceMapping: function()
272d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
273d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var sourceMapping = this._sourceMappings.pop();
274d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this.updateLocations();
275d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return sourceMapping;
276d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
277d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    updateLocations: function()
279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
280d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        var items = this._locations.values();
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = 0; i < items.length; ++i)
282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            items[i].update();
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
286a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.DebuggerModel.Location} rawLocation
287a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(!WebInspector.UILocation):(boolean|undefined)} updateDelegate
288a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!WebInspector.Script.Location}
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    createLiveLocation: function(rawLocation, updateDelegate)
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        console.assert(rawLocation.scriptId === this.scriptId);
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var location = new WebInspector.Script.Location(this, rawLocation, updateDelegate);
294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._locations.add(location);
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        location.update();
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return location;
297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
299aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    __proto__: WebInspector.TargetAwareObject.prototype
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @extends {WebInspector.LiveLocation}
305a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.Script} script
306a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.DebuggerModel.Location} rawLocation
307a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {function(!WebInspector.UILocation):(boolean|undefined)} updateDelegate
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.Script.Location = function(script, rawLocation, updateDelegate)
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebInspector.LiveLocation.call(this, rawLocation, updateDelegate);
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._script = script;
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.Script.Location.prototype = {
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
317a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!WebInspector.UILocation}
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uiLocation: function()
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
321a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        var debuggerModelLocation = /** @type {!WebInspector.DebuggerModel.Location} */ (this.rawLocation());
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._script.rawLocationToUILocation(debuggerModelLocation.lineNumber, debuggerModelLocation.columnNumber);
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dispose: function()
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.LiveLocation.prototype.dispose.call(this);
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._script._locations.remove(this);
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    __proto__: WebInspector.LiveLocation.prototype
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
333