21cfbf1ca7d2a659753167a2634ee7402a144194
[WebKit-https.git] / Source / WebCore / inspector / front-end / Script.js
1 /*
2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 /**
27  * @constructor
28  * @param {?string} scriptId
29  * @param {string} sourceURL
30  * @param {number} startLine
31  * @param {number} startColumn
32  * @param {number} endLine
33  * @param {number} endColumn
34  * @param {boolean} isContentScript
35  */
36 WebInspector.Script = function(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, sourceMapURL)
37 {
38     this.scriptId = scriptId;
39     this.sourceURL = sourceURL;
40     this.lineOffset = startLine;
41     this.columnOffset = startColumn;
42     this.endLine = endLine;
43     this.endColumn = endColumn;
44     this.isContentScript = isContentScript;
45     this.sourceMapURL = sourceMapURL;
46 }
47
48 WebInspector.Script.prototype = {
49     /**
50      * @param {function(string)} callback
51      */
52     requestSource: function(callback)
53     {
54         if (this._source) {
55             callback(this._source);
56             return;
57         }
58
59         /**
60          * @this {WebInspector.Script}
61          * @param {?Protocol.Error} error
62          * @param {string} source
63          */
64         function didGetScriptSource(error, source)
65         {
66             this._source = error ? "" : source;
67             callback(this._source);
68         }
69         if (this.scriptId) {
70             // Script failed to parse.
71             DebuggerAgent.getScriptSource(this.scriptId, didGetScriptSource.bind(this));
72         } else
73             callback("");
74     },
75
76     /**
77      * @param {string} query
78      * @param {boolean} caseSensitive
79      * @param {boolean} isRegex
80      * @param {function(Array.<PageAgent.SearchMatch>)} callback
81      */
82     searchInContent: function(query, caseSensitive, isRegex, callback)
83     {
84         /**
85          * @this {WebInspector.Script}
86          * @param {?Protocol.Error} error
87          * @param {Array.<PageAgent.SearchMatch>} searchMatches
88          */
89         function innerCallback(error, searchMatches)
90         {
91             if (error)
92                 console.error(error);
93             var result = [];
94             for (var i = 0; i < searchMatches.length; ++i) {
95                 var searchMatch = new WebInspector.ContentProvider.SearchMatch(searchMatches[i].lineNumber, searchMatches[i].lineContent);
96                 result.push(searchMatch);
97             }
98             callback(result || []);
99         }
100
101         if (this.scriptId) {
102             // Script failed to parse.
103             DebuggerAgent.searchInContent(this.scriptId, query, caseSensitive, isRegex, innerCallback.bind(this));
104         } else
105             callback([]);
106     },
107
108     /**
109      * @param {string} newSource
110      * @param {function(?Protocol.Error, Array.<DebuggerAgent.CallFrame>=)} callback
111      */
112     editSource: function(newSource, callback)
113     {
114         /**
115          * @this {WebInspector.Script}
116          * @param {?Protocol.Error} error
117          * @param {Array.<DebuggerAgent.CallFrame>|undefined} callFrames
118          */
119         function didEditScriptSource(error, callFrames)
120         {
121             if (!error)
122                 this._source = newSource;
123             callback(error, callFrames);
124         }
125         if (this.scriptId) {
126             // Script failed to parse.
127             DebuggerAgent.setScriptSource(this.scriptId, newSource, undefined, didEditScriptSource.bind(this));
128         } else
129             callback("Script failed to parse");
130     },
131
132     isInlineScript: function()
133     {
134         return this.sourceURL && this.lineOffset !== 0 && this.columnOffset !== 0;
135     }
136 }