Web Inspector: Line error widget showed in the wrong resource
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Models / ConsoleMessage.js
1 /*
2  * Copyright (C) 2015 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 WebInspector.ConsoleMessage = class ConsoleMessage extends WebInspector.Object
27 {
28     constructor(source, level, message, type, url, line, column, repeatCount, parameters, stackTrace, request)
29     {
30         super();
31
32         console.assert(typeof source === "string");
33         console.assert(typeof level === "string");
34         console.assert(typeof message === "string");
35         console.assert(!parameters || parameters.every((x) => x instanceof WebInspector.RemoteObject));
36
37         this._source = source;
38         this._level = level;
39         this._messageText = message;
40         this._type = type || WebInspector.ConsoleMessage.MessageType.Log;
41
42         this._url = url || null;
43         this._line = line || 0;
44         this._column = column || 0;
45         this._sourceCodeLocation = undefined;
46
47         this._repeatCount = repeatCount || 0;
48         this._parameters = parameters;
49
50         this._stackTrace = WebInspector.StackTrace.fromPayload(stackTrace || []);
51
52         this._request = request;
53     }
54
55     // Public
56
57     get source() { return this._source; }
58     get level() { return this._level; }
59     get messageText() { return this._messageText; }
60     get type() { return this._type; }
61     get url() { return this._url; }
62     get line() { return this._line; }
63     get column() { return this._column; }
64     get repeatCount() { return this._repeatCount; }
65     get parameters() { return this._parameters; }
66     get stackTrace() { return this._stackTrace; }
67     get request() { return this._request; }
68
69     get sourceCodeLocation()
70     {
71         if (this._sourceCodeLocation !== undefined)
72             return this._sourceCodeLocation;
73
74         // First try to get the location from the top frame of the stack trace.
75         let topCallFrame = this._stackTrace.callFrames[0];
76         if (topCallFrame && topCallFrame.sourceCodeLocation) {
77             this._sourceCodeLocation = topCallFrame.sourceCodeLocation;
78             return this._sourceCodeLocation;
79         }
80
81         // If that doesn't exist try to get a location from the url/line/column in the ConsoleMessage.
82         // FIXME <http://webkit.org/b/76404>: Remove the string equality checks for undefined once we don't get that value anymore.
83         if (this._url && this._url !== "undefined") {
84             let sourceCode = WebInspector.frameResourceManager.resourceForURL(this._url);
85             if (sourceCode) {
86                 let lineNumber = this._line > 0 ? this._line - 1 : 0;
87                 let columnNumber = this._column > 0 ? this._column - 1 : 0;
88                 this._sourceCodeLocation = new WebInspector.SourceCodeLocation(sourceCode, lineNumber, columnNumber);
89                 return this._sourceCodeLocation;
90             }
91         }
92
93         this._sourceCodeLocation = null;
94         return this._sourceCodeLocation;
95     }
96 };
97
98 WebInspector.ConsoleMessage.MessageSource = {
99     HTML: "html",
100     XML: "xml",
101     JS: "javascript",
102     Network: "network",
103     ConsoleAPI: "console-api",
104     Storage: "storage",
105     Appcache: "appcache",
106     Rendering: "rendering",
107     CSS: "css",
108     Security: "security",
109     Other: "other",
110 };
111
112 WebInspector.ConsoleMessage.MessageType = {
113     Log: "log",
114     Dir: "dir",
115     DirXML: "dirxml",
116     Table: "table",
117     Trace: "trace",
118     StartGroup: "startGroup",
119     StartGroupCollapsed: "startGroupCollapsed",
120     EndGroup: "endGroup",
121     Assert: "assert",
122     Timing: "timing",
123     Profile: "profile",
124     ProfileEnd: "profileEnd",
125     Result: "result", // Frontend Only.
126 };
127
128 WebInspector.ConsoleMessage.MessageLevel = {
129     Log: "log",
130     Info: "info",
131     Warning: "warning",
132     Error: "error",
133     Debug: "debug",
134 };