805e191cee154db78a666418efed284a0992f06a
[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 WebInspector.Script = function(sourceID, sourceURL, source, lineOffset, columnOffset, length, errorLine, errorMessage, worldType)
27 {
28     this.sourceID = sourceID;
29     this.sourceURL = sourceURL;
30     this._source = source;
31     this.lineOffset = lineOffset;
32     this.columnOffset = columnOffset;
33     this.length = length;
34     this.errorLine = errorLine;
35     this.errorMessage = errorMessage;
36     this.worldType = worldType;
37
38     // if no URL, look for "//@ sourceURL=" decorator
39     // note that this sourceURL comment decorator is behavior that FireBug added
40     // in it's 1.1 release as noted in the release notes:
41     // http://fbug.googlecode.com/svn/branches/firebug1.1/docs/ReleaseNotes_1.1.txt
42     if (!sourceURL) {
43         // use of [ \t] rather than \s is to prevent \n from matching
44         var pattern = /^\s*\/\/[ \t]*@[ \t]*sourceURL[ \t]*=[ \t]*(\S+).*$/m;
45         var match = pattern.exec(source);
46
47         if (match)
48             this.sourceURL = match[1];
49     }
50 }
51
52 WebInspector.Script.WorldType = {
53     MAIN_WORLD: 0,
54     EXTENSIONS_WORLD: 1
55 }
56
57 WebInspector.Script.WorldType = {
58     MAIN_WORLD: 0,
59     EXTENSIONS_WORLD: 1
60 }
61
62 WebInspector.Script.prototype = {
63     get startingLine()
64     {
65         return this.lineOffset + 1;
66     },
67
68     get linesCount()
69     {
70         if (!this.source)
71             return 0;
72         if (!this._lineEndings)
73             this._lineEndings = this._source.findAll("\n");
74         return this._lineEndings.length + 1;
75     },
76
77     sourceLine: function(lineNumber, callback)
78     {
79         function extractSourceLine()
80         {
81             lineNumber -= this.lineOffset;
82             callback(this._source.substring(this._lineEndings[lineNumber - 1], this._lineEndings[lineNumber]));
83         }
84
85         if (this._lineEndings) {
86             extractSourceLine.call(this);
87             return;
88         }
89
90         function didRequestSource()
91         {
92             this._lineEndings = this._source.findAll("\n");
93             extractSourceLine.call(this);
94         }
95         this.requestSource(didRequestSource.bind(this));
96     },
97
98     get source()
99     {
100         if (!this._source && this.resource)
101             this._source = this.resource.content;
102         return this._source;
103     },
104
105     set source(source)
106     {
107         this._source = source;
108         delete this._lineEndings;
109     },
110
111     requestSource: function(callback)
112     {
113         if (this._source) {
114             callback(this._source);
115             return;
116         }
117
118         function didGetScriptSource(error, source)
119         {
120             if (error)
121                 return;
122             this._source = source;
123             callback(this._source);
124         }
125         DebuggerAgent.getScriptSource(this.sourceID, didGetScriptSource.bind(this));
126     }
127 }