6d24e4cd7fb28fdd95796e2506f8f7de88d8206c
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Models / TimelineRecord.js
1 /*
2  * Copyright (C) 2013 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.TimelineRecord = class TimelineRecord extends WebInspector.Object
27 {
28     constructor(type, startTime, endTime, callFrames, sourceCodeLocation)
29     {
30         super();
31
32         console.assert(type);
33
34         if (type in WebInspector.TimelineRecord.Type)
35             type = WebInspector.TimelineRecord.Type[type];
36
37         this._type = type;
38         this._startTime = startTime || NaN;
39         this._endTime = endTime || NaN;
40         this._callFrames = callFrames || null;
41         this._sourceCodeLocation = sourceCodeLocation || null;
42         this._children = [];
43     }
44
45     // Public
46
47     get type()
48     {
49         return this._type;
50     }
51
52     get startTime()
53     {
54         // Implemented by subclasses if needed.
55         return this._startTime;
56     }
57
58     get activeStartTime()
59     {
60         // Implemented by subclasses if needed.
61         return this._startTime;
62     }
63
64     get endTime()
65     {
66         // Implemented by subclasses if needed.
67         return this._endTime;
68     }
69
70     get duration()
71     {
72         // Use the getters instead of the properties so this works for subclasses that override the getters.
73         return this.endTime - this.startTime;
74     }
75
76     get inactiveDuration()
77     {
78         // Use the getters instead of the properties so this works for subclasses that override the getters.
79         return this.activeStartTime - this.startTime;
80     }
81
82     get activeDuration()
83     {
84         // Use the getters instead of the properties so this works for subclasses that override the getters.
85         return this.endTime - this.activeStartTime;
86     }
87
88     get updatesDynamically()
89     {
90         // Implemented by subclasses if needed.
91         return false;
92     }
93
94     get usesActiveStartTime()
95     {
96         // Implemented by subclasses if needed.
97         return false;
98     }
99
100     get callFrames()
101     {
102         return this._callFrames;
103     }
104
105     get initiatorCallFrame()
106     {
107         if (!this._callFrames || !this._callFrames.length)
108             return null;
109
110         // Return the first non-native code call frame as the initiator.
111         for (var i = 0; i < this._callFrames.length; ++i) {
112             if (this._callFrames[i].nativeCode)
113                 continue;
114             return this._callFrames[i];
115         }
116
117         return null;
118     }
119
120     get sourceCodeLocation()
121     {
122         return this._sourceCodeLocation;
123     }
124
125     get children()
126     {
127         return this._children;
128     }
129
130     saveIdentityToCookie(cookie)
131     {
132         cookie[WebInspector.TimelineRecord.SourceCodeURLCookieKey] = this._sourceCodeLocation ? this._sourceCodeLocation.sourceCode.url ? this._sourceCodeLocation.sourceCode.url.hash : null : null;
133         cookie[WebInspector.TimelineRecord.SourceCodeLocationLineCookieKey] = this._sourceCodeLocation ? this._sourceCodeLocation.lineNumber : null;
134         cookie[WebInspector.TimelineRecord.SourceCodeLocationColumnCookieKey] = this._sourceCodeLocation ? this._sourceCodeLocation.columnNumber : null;
135         cookie[WebInspector.TimelineRecord.TypeCookieKey] = this._type || null;
136     }
137 };
138
139 WebInspector.TimelineRecord.Event = {
140     Updated: "timeline-record-updated"
141 };
142
143 WebInspector.TimelineRecord.Type = {
144     Network: "timeline-record-type-network",
145     Layout: "timeline-record-type-layout",
146     Script: "timeline-record-type-script",
147     RenderingFrame: "timeline-record-type-rendering-frame"
148 };
149
150 WebInspector.TimelineRecord.TypeIdentifier = "timeline-record";
151 WebInspector.TimelineRecord.SourceCodeURLCookieKey = "timeline-record-source-code-url";
152 WebInspector.TimelineRecord.SourceCodeLocationLineCookieKey = "timeline-record-source-code-location-line";
153 WebInspector.TimelineRecord.SourceCodeLocationColumnCookieKey = "timeline-record-source-code-location-column";
154 WebInspector.TimelineRecord.TypeCookieKey = "timeline-record-type";