Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(161)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/timeline/TimelineUIUtils.js

Issue 2466123002: DevTools: reformat front-end code to match chromium style. (Closed)
Patch Set: all done Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * Copyright (C) 2012 Intel Inc. All rights reserved. 3 * Copyright (C) 2012 Intel Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 6 * modification, are permitted provided that the following conditions are
7 * met: 7 * met:
8 * 8 *
9 * * Redistributions of source code must retain the above copyright 9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 10 matching lines...) Expand all
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */ 30 */
31
32 /** 31 /**
33 * @constructor 32 * @unrestricted
34 */ 33 */
35 WebInspector.TimelineUIUtils = function() { }; 34 WebInspector.TimelineUIUtils = class {
36 35 /**
37 /** 36 * @return {!Object.<string, !WebInspector.TimelineRecordStyle>}
38 * @constructor 37 */
39 * @param {string} title 38 static _initEventStyles() {
40 * @param {!WebInspector.TimelineCategory} category
41 * @param {boolean=} hidden
42 */
43 WebInspector.TimelineRecordStyle = function(title, category, hidden)
44 {
45 this.title = title;
46 this.category = category;
47 this.hidden = !!hidden;
48 };
49
50 /**
51 * @return {!Object.<string, !WebInspector.TimelineRecordStyle>}
52 */
53 WebInspector.TimelineUIUtils._initEventStyles = function()
54 {
55 if (WebInspector.TimelineUIUtils._eventStylesMap) 39 if (WebInspector.TimelineUIUtils._eventStylesMap)
56 return WebInspector.TimelineUIUtils._eventStylesMap; 40 return WebInspector.TimelineUIUtils._eventStylesMap;
57 41
58 var recordTypes = WebInspector.TimelineModel.RecordType; 42 var recordTypes = WebInspector.TimelineModel.RecordType;
59 var categories = WebInspector.TimelineUIUtils.categories(); 43 var categories = WebInspector.TimelineUIUtils.categories();
60 44
61 var eventStyles = {}; 45 var eventStyles = {};
62 eventStyles[recordTypes.Task] = new WebInspector.TimelineRecordStyle(WebInsp ector.UIString("Task"), categories["other"]); 46 eventStyles[recordTypes.Task] =
63 eventStyles[recordTypes.Program] = new WebInspector.TimelineRecordStyle(WebI nspector.UIString("Other"), categories["other"]); 47 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Task'), cate gories['other']);
64 eventStyles[recordTypes.Animation] = new WebInspector.TimelineRecordStyle(We bInspector.UIString("Animation"), categories["rendering"]); 48 eventStyles[recordTypes.Program] =
65 eventStyles[recordTypes.EventDispatch] = new WebInspector.TimelineRecordStyl e(WebInspector.UIString("Event"), categories["scripting"]); 49 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Other'), cat egories['other']);
66 eventStyles[recordTypes.RequestMainThreadFrame] = new WebInspector.TimelineR ecordStyle(WebInspector.UIString("Request Main Thread Frame"), categories["rende ring"], true); 50 eventStyles[recordTypes.Animation] =
67 eventStyles[recordTypes.BeginFrame] = new WebInspector.TimelineRecordStyle(W ebInspector.UIString("Frame Start"), categories["rendering"], true); 51 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Animation'), categories['rendering']);
68 eventStyles[recordTypes.BeginMainThreadFrame] = new WebInspector.TimelineRec ordStyle(WebInspector.UIString("Frame Start (main thread)"), categories["renderi ng"], true); 52 eventStyles[recordTypes.EventDispatch] =
69 eventStyles[recordTypes.DrawFrame] = new WebInspector.TimelineRecordStyle(We bInspector.UIString("Draw Frame"), categories["rendering"], true); 53 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Event'), cat egories['scripting']);
70 eventStyles[recordTypes.HitTest] = new WebInspector.TimelineRecordStyle(WebI nspector.UIString("Hit Test"), categories["rendering"]); 54 eventStyles[recordTypes.RequestMainThreadFrame] = new WebInspector.TimelineR ecordStyle(
71 eventStyles[recordTypes.ScheduleStyleRecalculation] = new WebInspector.Timel ineRecordStyle(WebInspector.UIString("Schedule Style Recalculation"), categories ["rendering"], true); 55 WebInspector.UIString('Request Main Thread Frame'), categories['renderin g'], true);
72 eventStyles[recordTypes.RecalculateStyles] = new WebInspector.TimelineRecord Style(WebInspector.UIString("Recalculate Style"), categories["rendering"]); 56 eventStyles[recordTypes.BeginFrame] =
73 eventStyles[recordTypes.UpdateLayoutTree] = new WebInspector.TimelineRecordS tyle(WebInspector.UIString("Recalculate Style"), categories["rendering"]); 57 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Frame Start' ), categories['rendering'], true);
74 eventStyles[recordTypes.InvalidateLayout] = new WebInspector.TimelineRecordS tyle(WebInspector.UIString("Invalidate Layout"), categories["rendering"], true); 58 eventStyles[recordTypes.BeginMainThreadFrame] = new WebInspector.TimelineRec ordStyle(
75 eventStyles[recordTypes.Layout] = new WebInspector.TimelineRecordStyle(WebIn spector.UIString("Layout"), categories["rendering"]); 59 WebInspector.UIString('Frame Start (main thread)'), categories['renderin g'], true);
76 eventStyles[recordTypes.PaintSetup] = new WebInspector.TimelineRecordStyle(W ebInspector.UIString("Paint Setup"), categories["painting"]); 60 eventStyles[recordTypes.DrawFrame] =
77 eventStyles[recordTypes.PaintImage] = new WebInspector.TimelineRecordStyle(W ebInspector.UIString("Paint Image"), categories["painting"], true); 61 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Draw Frame') , categories['rendering'], true);
78 eventStyles[recordTypes.UpdateLayer] = new WebInspector.TimelineRecordStyle( WebInspector.UIString("Update Layer"), categories["painting"], true); 62 eventStyles[recordTypes.HitTest] =
79 eventStyles[recordTypes.UpdateLayerTree] = new WebInspector.TimelineRecordSt yle(WebInspector.UIString("Update Layer Tree"), categories["rendering"]); 63 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Hit Test'), categories['rendering']);
80 eventStyles[recordTypes.Paint] = new WebInspector.TimelineRecordStyle(WebIns pector.UIString("Paint"), categories["painting"]); 64 eventStyles[recordTypes.ScheduleStyleRecalculation] = new WebInspector.Timel ineRecordStyle(
81 eventStyles[recordTypes.RasterTask] = new WebInspector.TimelineRecordStyle(W ebInspector.UIString("Rasterize Paint"), categories["painting"]); 65 WebInspector.UIString('Schedule Style Recalculation'), categories['rende ring'], true);
82 eventStyles[recordTypes.ScrollLayer] = new WebInspector.TimelineRecordStyle( WebInspector.UIString("Scroll"), categories["rendering"]); 66 eventStyles[recordTypes.RecalculateStyles] =
83 eventStyles[recordTypes.CompositeLayers] = new WebInspector.TimelineRecordSt yle(WebInspector.UIString("Composite Layers"), categories["painting"]); 67 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Recalculate Style'), categories['rendering']);
84 eventStyles[recordTypes.ParseHTML] = new WebInspector.TimelineRecordStyle(We bInspector.UIString("Parse HTML"), categories["loading"]); 68 eventStyles[recordTypes.UpdateLayoutTree] =
85 eventStyles[recordTypes.ParseAuthorStyleSheet] = new WebInspector.TimelineRe cordStyle(WebInspector.UIString("Parse Stylesheet"), categories["loading"]); 69 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Recalculate Style'), categories['rendering']);
86 eventStyles[recordTypes.TimerInstall] = new WebInspector.TimelineRecordStyle (WebInspector.UIString("Install Timer"), categories["scripting"]); 70 eventStyles[recordTypes.InvalidateLayout] =
87 eventStyles[recordTypes.TimerRemove] = new WebInspector.TimelineRecordStyle( WebInspector.UIString("Remove Timer"), categories["scripting"]); 71 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Invalidate L ayout'), categories['rendering'], true);
88 eventStyles[recordTypes.TimerFire] = new WebInspector.TimelineRecordStyle(We bInspector.UIString("Timer Fired"), categories["scripting"]); 72 eventStyles[recordTypes.Layout] =
89 eventStyles[recordTypes.XHRReadyStateChange] = new WebInspector.TimelineReco rdStyle(WebInspector.UIString("XHR Ready State Change"), categories["scripting"] ); 73 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Layout'), ca tegories['rendering']);
90 eventStyles[recordTypes.XHRLoad] = new WebInspector.TimelineRecordStyle(WebI nspector.UIString("XHR Load"), categories["scripting"]); 74 eventStyles[recordTypes.PaintSetup] =
91 eventStyles[recordTypes.CompileScript] = new WebInspector.TimelineRecordStyl e(WebInspector.UIString("Compile Script"), categories["scripting"]); 75 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Paint Setup' ), categories['painting']);
92 eventStyles[recordTypes.EvaluateScript] = new WebInspector.TimelineRecordSty le(WebInspector.UIString("Evaluate Script"), categories["scripting"]); 76 eventStyles[recordTypes.PaintImage] =
93 eventStyles[recordTypes.ParseScriptOnBackground] = new WebInspector.Timeline RecordStyle(WebInspector.UIString("Parse Script"), categories["scripting"]); 77 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Paint Image' ), categories['painting'], true);
94 eventStyles[recordTypes.MarkLoad] = new WebInspector.TimelineRecordStyle(Web Inspector.UIString("Load event"), categories["scripting"], true); 78 eventStyles[recordTypes.UpdateLayer] =
95 eventStyles[recordTypes.MarkDOMContent] = new WebInspector.TimelineRecordSty le(WebInspector.UIString("DOMContentLoaded event"), categories["scripting"], tru e); 79 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Update Layer '), categories['painting'], true);
96 eventStyles[recordTypes.MarkFirstPaint] = new WebInspector.TimelineRecordSty le(WebInspector.UIString("First paint"), categories["painting"], true); 80 eventStyles[recordTypes.UpdateLayerTree] =
97 eventStyles[recordTypes.TimeStamp] = new WebInspector.TimelineRecordStyle(We bInspector.UIString("Timestamp"), categories["scripting"]); 81 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Update Layer Tree'), categories['rendering']);
98 eventStyles[recordTypes.ConsoleTime] = new WebInspector.TimelineRecordStyle( WebInspector.UIString("Console Time"), categories["scripting"]); 82 eventStyles[recordTypes.Paint] =
99 eventStyles[recordTypes.UserTiming] = new WebInspector.TimelineRecordStyle(W ebInspector.UIString("User Timing"), categories["scripting"]); 83 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Paint'), cat egories['painting']);
100 eventStyles[recordTypes.ResourceSendRequest] = new WebInspector.TimelineReco rdStyle(WebInspector.UIString("Send Request"), categories["loading"]); 84 eventStyles[recordTypes.RasterTask] =
101 eventStyles[recordTypes.ResourceReceiveResponse] = new WebInspector.Timeline RecordStyle(WebInspector.UIString("Receive Response"), categories["loading"]); 85 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Rasterize Pa int'), categories['painting']);
102 eventStyles[recordTypes.ResourceFinish] = new WebInspector.TimelineRecordSty le(WebInspector.UIString("Finish Loading"), categories["loading"]); 86 eventStyles[recordTypes.ScrollLayer] =
103 eventStyles[recordTypes.ResourceReceivedData] = new WebInspector.TimelineRec ordStyle(WebInspector.UIString("Receive Data"), categories["loading"]); 87 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Scroll'), ca tegories['rendering']);
104 eventStyles[recordTypes.RunMicrotasks] = new WebInspector.TimelineRecordStyl e(WebInspector.UIString("Run Microtasks"), categories["scripting"]); 88 eventStyles[recordTypes.CompositeLayers] =
105 eventStyles[recordTypes.FunctionCall] = new WebInspector.TimelineRecordStyle (WebInspector.UIString("Function Call"), categories["scripting"]); 89 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Composite La yers'), categories['painting']);
106 eventStyles[recordTypes.GCEvent] = new WebInspector.TimelineRecordStyle(WebI nspector.UIString("GC Event"), categories["scripting"]); 90 eventStyles[recordTypes.ParseHTML] =
107 eventStyles[recordTypes.MajorGC] = new WebInspector.TimelineRecordStyle(WebI nspector.UIString("Major GC"), categories["scripting"]); 91 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Parse HTML') , categories['loading']);
108 eventStyles[recordTypes.MinorGC] = new WebInspector.TimelineRecordStyle(WebI nspector.UIString("Minor GC"), categories["scripting"]); 92 eventStyles[recordTypes.ParseAuthorStyleSheet] =
109 eventStyles[recordTypes.JSFrame] = new WebInspector.TimelineRecordStyle(WebI nspector.UIString("JS Frame"), categories["scripting"]); 93 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Parse Styles heet'), categories['loading']);
110 eventStyles[recordTypes.RequestAnimationFrame] = new WebInspector.TimelineRe cordStyle(WebInspector.UIString("Request Animation Frame"), categories["scriptin g"]); 94 eventStyles[recordTypes.TimerInstall] =
111 eventStyles[recordTypes.CancelAnimationFrame] = new WebInspector.TimelineRec ordStyle(WebInspector.UIString("Cancel Animation Frame"), categories["scripting" ]); 95 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Install Time r'), categories['scripting']);
112 eventStyles[recordTypes.FireAnimationFrame] = new WebInspector.TimelineRecor dStyle(WebInspector.UIString("Animation Frame Fired"), categories["scripting"]); 96 eventStyles[recordTypes.TimerRemove] =
113 eventStyles[recordTypes.RequestIdleCallback] = new WebInspector.TimelineReco rdStyle(WebInspector.UIString("Request Idle Callback"), categories["scripting"]) ; 97 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Remove Timer '), categories['scripting']);
114 eventStyles[recordTypes.CancelIdleCallback] = new WebInspector.TimelineRecor dStyle(WebInspector.UIString("Cancel Idle Callback"), categories["scripting"]); 98 eventStyles[recordTypes.TimerFire] =
115 eventStyles[recordTypes.FireIdleCallback] = new WebInspector.TimelineRecordS tyle(WebInspector.UIString("Fire Idle Callback"), categories["scripting"]); 99 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Timer Fired' ), categories['scripting']);
116 eventStyles[recordTypes.WebSocketCreate] = new WebInspector.TimelineRecordSt yle(WebInspector.UIString("Create WebSocket"), categories["scripting"]); 100 eventStyles[recordTypes.XHRReadyStateChange] =
117 eventStyles[recordTypes.WebSocketSendHandshakeRequest] = new WebInspector.Ti melineRecordStyle(WebInspector.UIString("Send WebSocket Handshake"), categories[ "scripting"]); 101 new WebInspector.TimelineRecordStyle(WebInspector.UIString('XHR Ready St ate Change'), categories['scripting']);
118 eventStyles[recordTypes.WebSocketReceiveHandshakeResponse] = new WebInspecto r.TimelineRecordStyle(WebInspector.UIString("Receive WebSocket Handshake"), cate gories["scripting"]); 102 eventStyles[recordTypes.XHRLoad] =
119 eventStyles[recordTypes.WebSocketDestroy] = new WebInspector.TimelineRecordS tyle(WebInspector.UIString("Destroy WebSocket"), categories["scripting"]); 103 new WebInspector.TimelineRecordStyle(WebInspector.UIString('XHR Load'), categories['scripting']);
120 eventStyles[recordTypes.EmbedderCallback] = new WebInspector.TimelineRecordS tyle(WebInspector.UIString("Embedder Callback"), categories["scripting"]); 104 eventStyles[recordTypes.CompileScript] =
121 eventStyles[recordTypes.DecodeImage] = new WebInspector.TimelineRecordStyle( WebInspector.UIString("Image Decode"), categories["painting"]); 105 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Compile Scri pt'), categories['scripting']);
122 eventStyles[recordTypes.ResizeImage] = new WebInspector.TimelineRecordStyle( WebInspector.UIString("Image Resize"), categories["painting"]); 106 eventStyles[recordTypes.EvaluateScript] =
123 eventStyles[recordTypes.GPUTask] = new WebInspector.TimelineRecordStyle(WebI nspector.UIString("GPU"), categories["gpu"]); 107 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Evaluate Scr ipt'), categories['scripting']);
124 eventStyles[recordTypes.LatencyInfo] = new WebInspector.TimelineRecordStyle( WebInspector.UIString("Input Latency"), categories["scripting"]); 108 eventStyles[recordTypes.ParseScriptOnBackground] =
125 109 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Parse Script '), categories['scripting']);
126 eventStyles[recordTypes.GCIdleLazySweep] = new WebInspector.TimelineRecordSt yle(WebInspector.UIString("DOM GC"), categories["scripting"]); 110 eventStyles[recordTypes.MarkLoad] =
127 eventStyles[recordTypes.GCCompleteSweep] = new WebInspector.TimelineRecordSt yle(WebInspector.UIString("DOM GC"), categories["scripting"]); 111 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Load event') , categories['scripting'], true);
128 eventStyles[recordTypes.GCCollectGarbage] = new WebInspector.TimelineRecordS tyle(WebInspector.UIString("DOM GC"), categories["scripting"]); 112 eventStyles[recordTypes.MarkDOMContent] = new WebInspector.TimelineRecordSty le(
113 WebInspector.UIString('DOMContentLoaded event'), categories['scripting'] , true);
114 eventStyles[recordTypes.MarkFirstPaint] =
115 new WebInspector.TimelineRecordStyle(WebInspector.UIString('First paint' ), categories['painting'], true);
116 eventStyles[recordTypes.TimeStamp] =
117 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Timestamp'), categories['scripting']);
118 eventStyles[recordTypes.ConsoleTime] =
119 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Console Time '), categories['scripting']);
120 eventStyles[recordTypes.UserTiming] =
121 new WebInspector.TimelineRecordStyle(WebInspector.UIString('User Timing' ), categories['scripting']);
122 eventStyles[recordTypes.ResourceSendRequest] =
123 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Send Request '), categories['loading']);
124 eventStyles[recordTypes.ResourceReceiveResponse] =
125 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Receive Resp onse'), categories['loading']);
126 eventStyles[recordTypes.ResourceFinish] =
127 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Finish Loadi ng'), categories['loading']);
128 eventStyles[recordTypes.ResourceReceivedData] =
129 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Receive Data '), categories['loading']);
130 eventStyles[recordTypes.RunMicrotasks] =
131 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Run Microtas ks'), categories['scripting']);
132 eventStyles[recordTypes.FunctionCall] =
133 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Function Cal l'), categories['scripting']);
134 eventStyles[recordTypes.GCEvent] =
135 new WebInspector.TimelineRecordStyle(WebInspector.UIString('GC Event'), categories['scripting']);
136 eventStyles[recordTypes.MajorGC] =
137 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Major GC'), categories['scripting']);
138 eventStyles[recordTypes.MinorGC] =
139 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Minor GC'), categories['scripting']);
140 eventStyles[recordTypes.JSFrame] =
141 new WebInspector.TimelineRecordStyle(WebInspector.UIString('JS Frame'), categories['scripting']);
142 eventStyles[recordTypes.RequestAnimationFrame] =
143 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Request Anim ation Frame'), categories['scripting']);
144 eventStyles[recordTypes.CancelAnimationFrame] =
145 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Cancel Anima tion Frame'), categories['scripting']);
146 eventStyles[recordTypes.FireAnimationFrame] =
147 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Animation Fr ame Fired'), categories['scripting']);
148 eventStyles[recordTypes.RequestIdleCallback] =
149 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Request Idle Callback'), categories['scripting']);
150 eventStyles[recordTypes.CancelIdleCallback] =
151 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Cancel Idle Callback'), categories['scripting']);
152 eventStyles[recordTypes.FireIdleCallback] =
153 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Fire Idle Ca llback'), categories['scripting']);
154 eventStyles[recordTypes.WebSocketCreate] =
155 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Create WebSo cket'), categories['scripting']);
156 eventStyles[recordTypes.WebSocketSendHandshakeRequest] = new WebInspector.Ti melineRecordStyle(
157 WebInspector.UIString('Send WebSocket Handshake'), categories['scripting ']);
158 eventStyles[recordTypes.WebSocketReceiveHandshakeResponse] = new WebInspecto r.TimelineRecordStyle(
159 WebInspector.UIString('Receive WebSocket Handshake'), categories['script ing']);
160 eventStyles[recordTypes.WebSocketDestroy] =
161 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Destroy WebS ocket'), categories['scripting']);
162 eventStyles[recordTypes.EmbedderCallback] =
163 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Embedder Cal lback'), categories['scripting']);
164 eventStyles[recordTypes.DecodeImage] =
165 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Image Decode '), categories['painting']);
166 eventStyles[recordTypes.ResizeImage] =
167 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Image Resize '), categories['painting']);
168 eventStyles[recordTypes.GPUTask] =
169 new WebInspector.TimelineRecordStyle(WebInspector.UIString('GPU'), categ ories['gpu']);
170 eventStyles[recordTypes.LatencyInfo] =
171 new WebInspector.TimelineRecordStyle(WebInspector.UIString('Input Latenc y'), categories['scripting']);
172
173 eventStyles[recordTypes.GCIdleLazySweep] =
174 new WebInspector.TimelineRecordStyle(WebInspector.UIString('DOM GC'), ca tegories['scripting']);
175 eventStyles[recordTypes.GCCompleteSweep] =
176 new WebInspector.TimelineRecordStyle(WebInspector.UIString('DOM GC'), ca tegories['scripting']);
177 eventStyles[recordTypes.GCCollectGarbage] =
178 new WebInspector.TimelineRecordStyle(WebInspector.UIString('DOM GC'), ca tegories['scripting']);
129 179
130 WebInspector.TimelineUIUtils._eventStylesMap = eventStyles; 180 WebInspector.TimelineUIUtils._eventStylesMap = eventStyles;
131 return eventStyles; 181 return eventStyles;
132 }; 182 }
133 183
134 /** 184 /**
135 * @param {!WebInspector.TimelineIRModel.InputEvents} inputEventType 185 * @param {!WebInspector.TimelineIRModel.InputEvents} inputEventType
136 * @return {?string} 186 * @return {?string}
137 */ 187 */
138 WebInspector.TimelineUIUtils.inputEventDisplayName = function(inputEventType) 188 static inputEventDisplayName(inputEventType) {
139 {
140 if (!WebInspector.TimelineUIUtils._inputEventToDisplayName) { 189 if (!WebInspector.TimelineUIUtils._inputEventToDisplayName) {
141 var inputEvent = WebInspector.TimelineIRModel.InputEvents; 190 var inputEvent = WebInspector.TimelineIRModel.InputEvents;
142 191
143 /** @type {!Map<!WebInspector.TimelineIRModel.InputEvents, string>} */ 192 /** @type {!Map<!WebInspector.TimelineIRModel.InputEvents, string>} */
144 WebInspector.TimelineUIUtils._inputEventToDisplayName = new Map([ 193 WebInspector.TimelineUIUtils._inputEventToDisplayName = new Map([
145 [inputEvent.Char, WebInspector.UIString("Key Character")], 194 [inputEvent.Char, WebInspector.UIString('Key Character')],
146 [inputEvent.KeyDown, WebInspector.UIString("Key Down")], 195 [inputEvent.KeyDown, WebInspector.UIString('Key Down')],
147 [inputEvent.KeyDownRaw, WebInspector.UIString("Key Down")], 196 [inputEvent.KeyDownRaw, WebInspector.UIString('Key Down')],
148 [inputEvent.KeyUp, WebInspector.UIString("Key Up")], 197 [inputEvent.KeyUp, WebInspector.UIString('Key Up')],
149 [inputEvent.Click, WebInspector.UIString("Click")], 198 [inputEvent.Click, WebInspector.UIString('Click')],
150 [inputEvent.ContextMenu, WebInspector.UIString("Context Menu")], 199 [inputEvent.ContextMenu, WebInspector.UIString('Context Menu')],
151 [inputEvent.MouseDown, WebInspector.UIString("Mouse Down")], 200 [inputEvent.MouseDown, WebInspector.UIString('Mouse Down')],
152 [inputEvent.MouseMove, WebInspector.UIString("Mouse Move")], 201 [inputEvent.MouseMove, WebInspector.UIString('Mouse Move')],
153 [inputEvent.MouseUp, WebInspector.UIString("Mouse Up")], 202 [inputEvent.MouseUp, WebInspector.UIString('Mouse Up')],
154 [inputEvent.MouseWheel, WebInspector.UIString("Mouse Wheel")], 203 [inputEvent.MouseWheel, WebInspector.UIString('Mouse Wheel')],
155 [inputEvent.ScrollBegin, WebInspector.UIString("Scroll Begin")], 204 [inputEvent.ScrollBegin, WebInspector.UIString('Scroll Begin')],
156 [inputEvent.ScrollEnd, WebInspector.UIString("Scroll End")], 205 [inputEvent.ScrollEnd, WebInspector.UIString('Scroll End')],
157 [inputEvent.ScrollUpdate, WebInspector.UIString("Scroll Update")], 206 [inputEvent.ScrollUpdate, WebInspector.UIString('Scroll Update')],
158 [inputEvent.FlingStart, WebInspector.UIString("Fling Start")], 207 [inputEvent.FlingStart, WebInspector.UIString('Fling Start')],
159 [inputEvent.FlingCancel, WebInspector.UIString("Fling Halt")], 208 [inputEvent.FlingCancel, WebInspector.UIString('Fling Halt')],
160 [inputEvent.Tap, WebInspector.UIString("Tap")], 209 [inputEvent.Tap, WebInspector.UIString('Tap')],
161 [inputEvent.TapCancel, WebInspector.UIString("Tap Halt")], 210 [inputEvent.TapCancel, WebInspector.UIString('Tap Halt')],
162 [inputEvent.ShowPress, WebInspector.UIString("Tap Begin")], 211 [inputEvent.ShowPress, WebInspector.UIString('Tap Begin')],
163 [inputEvent.TapDown, WebInspector.UIString("Tap Down")], 212 [inputEvent.TapDown, WebInspector.UIString('Tap Down')],
164 [inputEvent.TouchCancel, WebInspector.UIString("Touch Cancel")], 213 [inputEvent.TouchCancel, WebInspector.UIString('Touch Cancel')],
165 [inputEvent.TouchEnd, WebInspector.UIString("Touch End")], 214 [inputEvent.TouchEnd, WebInspector.UIString('Touch End')],
166 [inputEvent.TouchMove, WebInspector.UIString("Touch Move")], 215 [inputEvent.TouchMove, WebInspector.UIString('Touch Move')],
167 [inputEvent.TouchStart, WebInspector.UIString("Touch Start")], 216 [inputEvent.TouchStart, WebInspector.UIString('Touch Start')],
168 [inputEvent.PinchBegin, WebInspector.UIString("Pinch Begin")], 217 [inputEvent.PinchBegin, WebInspector.UIString('Pinch Begin')],
169 [inputEvent.PinchEnd, WebInspector.UIString("Pinch End")], 218 [inputEvent.PinchEnd, WebInspector.UIString('Pinch End')],
170 [inputEvent.PinchUpdate, WebInspector.UIString("Pinch Update")] 219 [inputEvent.PinchUpdate, WebInspector.UIString('Pinch Update')]
171 ]); 220 ]);
172 } 221 }
173 return WebInspector.TimelineUIUtils._inputEventToDisplayName.get(inputEventT ype) || null; 222 return WebInspector.TimelineUIUtils._inputEventToDisplayName.get(inputEventT ype) || null;
174 }; 223 }
175 224
176 /** 225 /**
177 * @param {!WebInspector.TracingModel.Event} traceEvent 226 * @param {!WebInspector.TracingModel.Event} traceEvent
178 * @param {!RegExp} regExp 227 * @param {!RegExp} regExp
179 * @return {boolean} 228 * @return {boolean}
180 */ 229 */
181 WebInspector.TimelineUIUtils.testContentMatching = function(traceEvent, regExp) 230 static testContentMatching(traceEvent, regExp) {
182 {
183 var title = WebInspector.TimelineUIUtils.eventStyle(traceEvent).title; 231 var title = WebInspector.TimelineUIUtils.eventStyle(traceEvent).title;
184 var tokens = [title]; 232 var tokens = [title];
185 if (traceEvent.url) 233 if (traceEvent.url)
186 tokens.push(traceEvent.url); 234 tokens.push(traceEvent.url);
187 for (var argName in traceEvent.args) { 235 for (var argName in traceEvent.args) {
188 var argValue = traceEvent.args[argName]; 236 var argValue = traceEvent.args[argName];
189 for (var key in argValue) 237 for (var key in argValue)
190 tokens.push(argValue[key]); 238 tokens.push(argValue[key]);
191 } 239 }
192 return regExp.test(tokens.join("|")); 240 return regExp.test(tokens.join('|'));
193 }; 241 }
194 242
195 /** 243 /**
196 * @param {!WebInspector.TimelineModel.Record} record 244 * @param {!WebInspector.TimelineModel.Record} record
197 * @return {!WebInspector.TimelineCategory} 245 * @return {!WebInspector.TimelineCategory}
198 */ 246 */
199 WebInspector.TimelineUIUtils.categoryForRecord = function(record) 247 static categoryForRecord(record) {
200 {
201 return WebInspector.TimelineUIUtils.eventStyle(record.traceEvent()).category ; 248 return WebInspector.TimelineUIUtils.eventStyle(record.traceEvent()).category ;
202 }; 249 }
203 250
204 251 /**
205 /** 252 * @param {!WebInspector.TracingModel.Event} event
206 * @param {!WebInspector.TracingModel.Event} event 253 * @return {!{title: string, category: !WebInspector.TimelineCategory}}
207 * @return {!{title: string, category: !WebInspector.TimelineCategory}} 254 */
208 */ 255 static eventStyle(event) {
209 WebInspector.TimelineUIUtils.eventStyle = function(event)
210 {
211 var eventStyles = WebInspector.TimelineUIUtils._initEventStyles(); 256 var eventStyles = WebInspector.TimelineUIUtils._initEventStyles();
212 if (event.hasCategory(WebInspector.TimelineModel.Category.Console) || event. hasCategory(WebInspector.TimelineModel.Category.UserTiming)) 257 if (event.hasCategory(WebInspector.TimelineModel.Category.Console) ||
213 return { title: event.name, category: WebInspector.TimelineUIUtils.categ ories()["scripting"] }; 258 event.hasCategory(WebInspector.TimelineModel.Category.UserTiming))
259 return {title: event.name, category: WebInspector.TimelineUIUtils.categori es()['scripting']};
214 260
215 if (event.hasCategory(WebInspector.TimelineModel.Category.LatencyInfo)) { 261 if (event.hasCategory(WebInspector.TimelineModel.Category.LatencyInfo)) {
216 /** @const */ 262 /** @const */
217 var prefix = "InputLatency::"; 263 var prefix = 'InputLatency::';
218 var inputEventType = event.name.startsWith(prefix) ? event.name.substr(p refix.length) : event.name; 264 var inputEventType = event.name.startsWith(prefix) ? event.name.substr(pre fix.length) : event.name;
219 var displayName = WebInspector.TimelineUIUtils.inputEventDisplayName(/** @type {!WebInspector.TimelineIRModel.InputEvents} */ (inputEventType)); 265 var displayName = WebInspector.TimelineUIUtils.inputEventDisplayName(
220 return { title: displayName || inputEventType, category: WebInspector.Ti melineUIUtils.categories()["scripting"] }; 266 /** @type {!WebInspector.TimelineIRModel.InputEvents} */ (inputEventTy pe));
267 return {title: displayName || inputEventType, category: WebInspector.Timel ineUIUtils.categories()['scripting']};
221 } 268 }
222 var result = eventStyles[event.name]; 269 var result = eventStyles[event.name];
223 if (!result) { 270 if (!result) {
224 result = new WebInspector.TimelineRecordStyle(event.name, WebInspector. TimelineUIUtils.categories()["other"], true); 271 result =
225 eventStyles[event.name] = result; 272 new WebInspector.TimelineRecordStyle(event.name, WebInspector.Timeline UIUtils.categories()['other'], true);
273 eventStyles[event.name] = result;
226 } 274 }
227 return result; 275 return result;
228 }; 276 }
229 277
230 /** 278 /**
231 * @param {!WebInspector.TracingModel.Event} event 279 * @param {!WebInspector.TracingModel.Event} event
232 * @return {string} 280 * @return {string}
233 */ 281 */
234 WebInspector.TimelineUIUtils.eventColor = function(event) 282 static eventColor(event) {
235 {
236 if (event.name === WebInspector.TimelineModel.RecordType.JSFrame) { 283 if (event.name === WebInspector.TimelineModel.RecordType.JSFrame) {
237 var frame = event.args["data"]; 284 var frame = event.args['data'];
238 if (WebInspector.TimelineUIUtils.isUserFrame(frame)) 285 if (WebInspector.TimelineUIUtils.isUserFrame(frame))
239 return WebInspector.TimelineUIUtils.colorForURL(frame.url); 286 return WebInspector.TimelineUIUtils.colorForURL(frame.url);
240 } 287 }
241 return WebInspector.TimelineUIUtils.eventStyle(event).category.color; 288 return WebInspector.TimelineUIUtils.eventStyle(event).category.color;
242 }; 289 }
243 290
244 /** 291 /**
245 * @param {!WebInspector.TracingModel.Event} event 292 * @param {!WebInspector.TracingModel.Event} event
246 * @return {string} 293 * @return {string}
247 */ 294 */
248 WebInspector.TimelineUIUtils.eventTitle = function(event) 295 static eventTitle(event) {
249 {
250 var title = WebInspector.TimelineUIUtils.eventStyle(event).title; 296 var title = WebInspector.TimelineUIUtils.eventStyle(event).title;
251 if (event.hasCategory(WebInspector.TimelineModel.Category.Console)) 297 if (event.hasCategory(WebInspector.TimelineModel.Category.Console))
252 return title; 298 return title;
253 if (event.name === WebInspector.TimelineModel.RecordType.TimeStamp) 299 if (event.name === WebInspector.TimelineModel.RecordType.TimeStamp)
254 return WebInspector.UIString("%s: %s", title, event.args["data"]["messag e"]); 300 return WebInspector.UIString('%s: %s', title, event.args['data']['message' ]);
255 if (event.name === WebInspector.TimelineModel.RecordType.Animation && event. args["data"] && event.args["data"]["name"]) 301 if (event.name === WebInspector.TimelineModel.RecordType.Animation && event. args['data'] &&
256 return WebInspector.UIString("%s: %s", title, event.args["data"]["name"] ); 302 event.args['data']['name'])
303 return WebInspector.UIString('%s: %s', title, event.args['data']['name']);
257 return title; 304 return title;
258 }; 305 }
259 306
260 /** 307 /**
261 * @param {!WebInspector.TracingModel.Event} event 308 * @param {!WebInspector.TracingModel.Event} event
262 * @return {?string} 309 * @return {?string}
263 */ 310 */
264 WebInspector.TimelineUIUtils.eventURL = function(event) 311 static eventURL(event) {
265 {
266 if (event.url) 312 if (event.url)
267 return event.url; 313 return event.url;
268 var data = event.args["data"] || event.args["beginData"]; 314 var data = event.args['data'] || event.args['beginData'];
269 return data && data.url || null; 315 return data && data.url || null;
270 }; 316 }
271 317
272 /** 318 /**
273 * !Map<!WebInspector.TimelineIRModel.Phases, !{color: string, label: string}> 319 * !Map<!WebInspector.TimelineIRModel.Phases, !{color: string, label: string}>
274 */ 320 */
275 WebInspector.TimelineUIUtils._interactionPhaseStyles = function() 321 static _interactionPhaseStyles() {
276 {
277 var map = WebInspector.TimelineUIUtils._interactionPhaseStylesMap; 322 var map = WebInspector.TimelineUIUtils._interactionPhaseStylesMap;
278 if (!map) { 323 if (!map) {
279 map = new Map([ 324 map = new Map([
280 [WebInspector.TimelineIRModel.Phases.Idle, {color: "white", label: " Idle"}], 325 [WebInspector.TimelineIRModel.Phases.Idle, {color: 'white', label: 'Idle '}],
281 [WebInspector.TimelineIRModel.Phases.Response, {color: "hsl(43, 83%, 64%)", label: WebInspector.UIString("Response")}], 326 [
282 [WebInspector.TimelineIRModel.Phases.Scroll, {color: "hsl(256, 67%, 70%)", label: WebInspector.UIString("Scroll")}], 327 WebInspector.TimelineIRModel.Phases.Response,
283 [WebInspector.TimelineIRModel.Phases.Fling, {color: "hsl(256, 67%, 7 0%)", label: WebInspector.UIString("Fling")}], 328 {color: 'hsl(43, 83%, 64%)', label: WebInspector.UIString('Response')}
284 [WebInspector.TimelineIRModel.Phases.Drag, {color: "hsl(256, 67%, 70 %)", label: WebInspector.UIString("Drag")}], 329 ],
285 [WebInspector.TimelineIRModel.Phases.Animation, {color: "hsl(256, 67 %, 70%)", label: WebInspector.UIString("Animation")}], 330 [
286 [WebInspector.TimelineIRModel.Phases.Uncategorized, {color: "hsl(0, 0%, 87%)", label: WebInspector.UIString("Uncategorized")}] 331 WebInspector.TimelineIRModel.Phases.Scroll,
287 ]); 332 {color: 'hsl(256, 67%, 70%)', label: WebInspector.UIString('Scroll')}
288 WebInspector.TimelineUIUtils._interactionPhaseStylesMap = map; 333 ],
334 [
335 WebInspector.TimelineIRModel.Phases.Fling,
336 {color: 'hsl(256, 67%, 70%)', label: WebInspector.UIString('Fling')}
337 ],
338 [WebInspector.TimelineIRModel.Phases.Drag, {color: 'hsl(256, 67%, 70%)', label: WebInspector.UIString('Drag')}],
339 [
340 WebInspector.TimelineIRModel.Phases.Animation,
341 {color: 'hsl(256, 67%, 70%)', label: WebInspector.UIString('Animation' )}
342 ],
343 [
344 WebInspector.TimelineIRModel.Phases.Uncategorized,
345 {color: 'hsl(0, 0%, 87%)', label: WebInspector.UIString('Uncategorized ')}
346 ]
347 ]);
348 WebInspector.TimelineUIUtils._interactionPhaseStylesMap = map;
289 } 349 }
290 return map; 350 return map;
291 }; 351 }
292 352
293 /** 353 /**
294 * @param {!WebInspector.TimelineIRModel.Phases} phase 354 * @param {!WebInspector.TimelineIRModel.Phases} phase
295 * @return {string} 355 * @return {string}
296 */ 356 */
297 WebInspector.TimelineUIUtils.interactionPhaseColor = function(phase) 357 static interactionPhaseColor(phase) {
298 {
299 return WebInspector.TimelineUIUtils._interactionPhaseStyles().get(phase).col or; 358 return WebInspector.TimelineUIUtils._interactionPhaseStyles().get(phase).col or;
300 }; 359 }
301 360
302 /** 361 /**
303 * @param {!WebInspector.TimelineIRModel.Phases} phase 362 * @param {!WebInspector.TimelineIRModel.Phases} phase
304 * @return {string} 363 * @return {string}
305 */ 364 */
306 WebInspector.TimelineUIUtils.interactionPhaseLabel = function(phase) 365 static interactionPhaseLabel(phase) {
307 {
308 return WebInspector.TimelineUIUtils._interactionPhaseStyles().get(phase).lab el; 366 return WebInspector.TimelineUIUtils._interactionPhaseStyles().get(phase).lab el;
309 }; 367 }
310 368
311 /** 369 /**
312 * @param {!RuntimeAgent.CallFrame} frame 370 * @param {!RuntimeAgent.CallFrame} frame
313 * @return {boolean} 371 * @return {boolean}
314 */ 372 */
315 WebInspector.TimelineUIUtils.isUserFrame = function(frame) 373 static isUserFrame(frame) {
316 { 374 return frame.scriptId !== '0' && !(frame.url && frame.url.startsWith('native '));
317 return frame.scriptId !== "0" && !(frame.url && frame.url.startsWith("native ")); 375 }
318 }; 376
319 377 /**
320 /** 378 * @param {!WebInspector.TracingModel.Event} event
321 * @param {!WebInspector.TracingModel.Event} event 379 * @return {?RuntimeAgent.CallFrame}
322 * @return {?RuntimeAgent.CallFrame} 380 */
323 */ 381 static topStackFrame(event) {
324 WebInspector.TimelineUIUtils.topStackFrame = function(event)
325 {
326 var stackTrace = event.stackTrace || event.initiator && event.initiator.stac kTrace; 382 var stackTrace = event.stackTrace || event.initiator && event.initiator.stac kTrace;
327 return stackTrace && stackTrace.length ? stackTrace[0] : null; 383 return stackTrace && stackTrace.length ? stackTrace[0] : null;
328 }; 384 }
329 385
330 /** 386 /**
331 * @enum {symbol} 387 * @param {!WebInspector.TimelineModel.NetworkRequest} request
332 */ 388 * @return {!WebInspector.TimelineUIUtils.NetworkCategory}
333 WebInspector.TimelineUIUtils.NetworkCategory = { 389 */
334 HTML: Symbol("HTML"), 390 static networkRequestCategory(request) {
335 Script: Symbol("Script"),
336 Style: Symbol("Style"),
337 Media: Symbol("Media"),
338 Other: Symbol("Other")
339 };
340
341 /**
342 * @param {!WebInspector.TimelineModel.NetworkRequest} request
343 * @return {!WebInspector.TimelineUIUtils.NetworkCategory}
344 */
345 WebInspector.TimelineUIUtils.networkRequestCategory = function(request)
346 {
347 var categories = WebInspector.TimelineUIUtils.NetworkCategory; 391 var categories = WebInspector.TimelineUIUtils.NetworkCategory;
348 switch (request.mimeType) { 392 switch (request.mimeType) {
349 case "text/html": 393 case 'text/html':
350 return categories.HTML; 394 return categories.HTML;
351 case "application/javascript": 395 case 'application/javascript':
352 case "application/x-javascript": 396 case 'application/x-javascript':
353 case "text/javascript": 397 case 'text/javascript':
354 return categories.Script; 398 return categories.Script;
355 case "text/css": 399 case 'text/css':
356 return categories.Style; 400 return categories.Style;
357 case "audio/ogg": 401 case 'audio/ogg':
358 case "image/gif": 402 case 'image/gif':
359 case "image/jpeg": 403 case 'image/jpeg':
360 case "image/png": 404 case 'image/png':
361 case "image/svg+xml": 405 case 'image/svg+xml':
362 case "image/webp": 406 case 'image/webp':
363 case "image/x-icon": 407 case 'image/x-icon':
364 case "font/opentype": 408 case 'font/opentype':
365 case "font/woff2": 409 case 'font/woff2':
366 case "application/font-woff": 410 case 'application/font-woff':
367 return categories.Media; 411 return categories.Media;
368 default: 412 default:
369 return categories.Other; 413 return categories.Other;
370 } 414 }
371 }; 415 }
372 416
373 /** 417 /**
374 * @param {!WebInspector.TimelineUIUtils.NetworkCategory} category 418 * @param {!WebInspector.TimelineUIUtils.NetworkCategory} category
375 * @return {string} 419 * @return {string}
376 */ 420 */
377 WebInspector.TimelineUIUtils.networkCategoryColor = function(category) 421 static networkCategoryColor(category) {
378 {
379 var categories = WebInspector.TimelineUIUtils.NetworkCategory; 422 var categories = WebInspector.TimelineUIUtils.NetworkCategory;
380 switch (category) { 423 switch (category) {
381 case categories.HTML: return "hsl(214, 67%, 66%)"; 424 case categories.HTML:
382 case categories.Script: return "hsl(43, 83%, 64%)"; 425 return 'hsl(214, 67%, 66%)';
383 case categories.Style: return "hsl(256, 67%, 70%)"; 426 case categories.Script:
384 case categories.Media: return "hsl(109, 33%, 55%)"; 427 return 'hsl(43, 83%, 64%)';
385 default: return "hsl(0, 0%, 70%)"; 428 case categories.Style:
386 } 429 return 'hsl(256, 67%, 70%)';
387 }; 430 case categories.Media:
388 431 return 'hsl(109, 33%, 55%)';
389 /** 432 default:
390 * @param {!WebInspector.TracingModel.Event} event 433 return 'hsl(0, 0%, 70%)';
391 * @param {?WebInspector.Target} target 434 }
392 * @return {?string} 435 }
393 */ 436
394 WebInspector.TimelineUIUtils.buildDetailsTextForTraceEvent = function(event, tar get) 437 /**
395 { 438 * @param {!WebInspector.TracingModel.Event} event
439 * @param {?WebInspector.Target} target
440 * @return {?string}
441 */
442 static buildDetailsTextForTraceEvent(event, target) {
396 var recordType = WebInspector.TimelineModel.RecordType; 443 var recordType = WebInspector.TimelineModel.RecordType;
397 var detailsText; 444 var detailsText;
398 var eventData = event.args["data"]; 445 var eventData = event.args['data'];
399 switch (event.name) { 446 switch (event.name) {
400 case recordType.GCEvent: 447 case recordType.GCEvent:
401 case recordType.MajorGC: 448 case recordType.MajorGC:
402 case recordType.MinorGC: 449 case recordType.MinorGC:
403 var delta = event.args["usedHeapSizeBefore"] - event.args["usedHeapSizeA fter"]; 450 var delta = event.args['usedHeapSizeBefore'] - event.args['usedHeapSizeA fter'];
404 detailsText = WebInspector.UIString("%s collected", Number.bytesToString (delta)); 451 detailsText = WebInspector.UIString('%s collected', Number.bytesToString (delta));
405 break; 452 break;
406 case recordType.FunctionCall: 453 case recordType.FunctionCall:
407 // Omit internally generated script names. 454 // Omit internally generated script names.
408 if (eventData) 455 if (eventData)
409 detailsText = linkifyLocationAsText(eventData["scriptId"], eventData ["lineNumber"], 0); 456 detailsText = linkifyLocationAsText(eventData['scriptId'], eventData[' lineNumber'], 0);
410 break; 457 break;
411 case recordType.JSFrame: 458 case recordType.JSFrame:
412 detailsText = WebInspector.beautifyFunctionName(eventData["functionName" ]); 459 detailsText = WebInspector.beautifyFunctionName(eventData['functionName' ]);
413 break; 460 break;
414 case recordType.EventDispatch: 461 case recordType.EventDispatch:
415 detailsText = eventData ? eventData["type"] : null; 462 detailsText = eventData ? eventData['type'] : null;
416 break; 463 break;
417 case recordType.Paint: 464 case recordType.Paint:
418 var width = WebInspector.TimelineUIUtils.quadWidth(eventData.clip); 465 var width = WebInspector.TimelineUIUtils.quadWidth(eventData.clip);
419 var height = WebInspector.TimelineUIUtils.quadHeight(eventData.clip); 466 var height = WebInspector.TimelineUIUtils.quadHeight(eventData.clip);
420 if (width && height) 467 if (width && height)
421 detailsText = WebInspector.UIString("%d\u2009\u00d7\u2009%d", width, height); 468 detailsText = WebInspector.UIString('%d\u2009\u00d7\u2009%d', width, h eight);
422 break; 469 break;
423 case recordType.ParseHTML: 470 case recordType.ParseHTML:
424 var endLine = event.args["endData"] && event.args["endData"]["endLine"]; 471 var endLine = event.args['endData'] && event.args['endData']['endLine'];
425 var url = WebInspector.displayNameForURL(event.args["beginData"]["url"]) ; 472 var url = WebInspector.displayNameForURL(event.args['beginData']['url']) ;
426 detailsText = WebInspector.UIString("%s [%s\u2026%s]", url, event.args[" beginData"]["startLine"] + 1, endLine >= 0 ? endLine + 1 : ""); 473 detailsText = WebInspector.UIString(
427 break; 474 '%s [%s\u2026%s]', url, event.args['beginData']['startLine'] + 1, en dLine >= 0 ? endLine + 1 : '');
428 475 break;
429 case recordType.CompileScript: 476
430 case recordType.EvaluateScript: 477 case recordType.CompileScript:
431 var url = eventData && eventData["url"]; 478 case recordType.EvaluateScript:
479 var url = eventData && eventData['url'];
432 if (url) 480 if (url)
433 detailsText = WebInspector.displayNameForURL(url) + ":" + (eventData ["lineNumber"] + 1); 481 detailsText = WebInspector.displayNameForURL(url) + ':' + (eventData[' lineNumber'] + 1);
434 break; 482 break;
435 case recordType.ParseScriptOnBackground: 483 case recordType.ParseScriptOnBackground:
436 case recordType.XHRReadyStateChange: 484 case recordType.XHRReadyStateChange:
437 case recordType.XHRLoad: 485 case recordType.XHRLoad:
438 var url = eventData["url"]; 486 var url = eventData['url'];
439 if (url) 487 if (url)
440 detailsText = WebInspector.displayNameForURL(url); 488 detailsText = WebInspector.displayNameForURL(url);
441 break; 489 break;
442 case recordType.TimeStamp: 490 case recordType.TimeStamp:
443 detailsText = eventData["message"]; 491 detailsText = eventData['message'];
444 break; 492 break;
445 493
446 case recordType.WebSocketCreate: 494 case recordType.WebSocketCreate:
447 case recordType.WebSocketSendHandshakeRequest: 495 case recordType.WebSocketSendHandshakeRequest:
448 case recordType.WebSocketReceiveHandshakeResponse: 496 case recordType.WebSocketReceiveHandshakeResponse:
449 case recordType.WebSocketDestroy: 497 case recordType.WebSocketDestroy:
450 case recordType.ResourceSendRequest: 498 case recordType.ResourceSendRequest:
451 case recordType.ResourceReceivedData: 499 case recordType.ResourceReceivedData:
452 case recordType.ResourceReceiveResponse: 500 case recordType.ResourceReceiveResponse:
453 case recordType.ResourceFinish: 501 case recordType.ResourceFinish:
454 case recordType.PaintImage: 502 case recordType.PaintImage:
455 case recordType.DecodeImage: 503 case recordType.DecodeImage:
456 case recordType.ResizeImage: 504 case recordType.ResizeImage:
457 case recordType.DecodeLazyPixelRef: 505 case recordType.DecodeLazyPixelRef:
458 if (event.url) 506 if (event.url)
459 detailsText = WebInspector.displayNameForURL(event.url); 507 detailsText = WebInspector.displayNameForURL(event.url);
460 break; 508 break;
461 509
462 case recordType.EmbedderCallback: 510 case recordType.EmbedderCallback:
463 detailsText = eventData["callbackName"]; 511 detailsText = eventData['callbackName'];
464 break; 512 break;
465 513
466 case recordType.Animation: 514 case recordType.Animation:
467 detailsText = eventData && eventData["name"]; 515 detailsText = eventData && eventData['name'];
468 break; 516 break;
469 517
470 case recordType.GCIdleLazySweep: 518 case recordType.GCIdleLazySweep:
471 detailsText = WebInspector.UIString("idle sweep"); 519 detailsText = WebInspector.UIString('idle sweep');
472 break; 520 break;
473 521
474 case recordType.GCCompleteSweep: 522 case recordType.GCCompleteSweep:
475 detailsText = WebInspector.UIString("complete sweep"); 523 detailsText = WebInspector.UIString('complete sweep');
476 break; 524 break;
477 525
478 case recordType.GCCollectGarbage: 526 case recordType.GCCollectGarbage:
479 detailsText = WebInspector.UIString("collect"); 527 detailsText = WebInspector.UIString('collect');
480 break; 528 break;
481 529
482 default: 530 default:
483 if (event.hasCategory(WebInspector.TimelineModel.Category.Console)) 531 if (event.hasCategory(WebInspector.TimelineModel.Category.Console))
484 detailsText = null; 532 detailsText = null;
485 else 533 else
486 detailsText = linkifyTopCallFrameAsText(); 534 detailsText = linkifyTopCallFrameAsText();
487 break; 535 break;
488 } 536 }
489 537
490 return detailsText; 538 return detailsText;
491 539
492 /** 540 /**
493 * @param {string} scriptId 541 * @param {string} scriptId
494 * @param {number} lineNumber 542 * @param {number} lineNumber
495 * @param {number} columnNumber 543 * @param {number} columnNumber
496 * @return {?string} 544 * @return {?string}
497 */ 545 */
498 function linkifyLocationAsText(scriptId, lineNumber, columnNumber) 546 function linkifyLocationAsText(scriptId, lineNumber, columnNumber) {
499 { 547 var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);
500 var debuggerModel = WebInspector.DebuggerModel.fromTarget(target); 548 if (!target || target.isDisposed() || !scriptId || !debuggerModel)
501 if (!target || target.isDisposed() || !scriptId || !debuggerModel) 549 return null;
502 return null; 550 var rawLocation = debuggerModel.createRawLocationByScriptId(scriptId, line Number, columnNumber);
503 var rawLocation = debuggerModel.createRawLocationByScriptId(scriptId, li neNumber, columnNumber); 551 if (!rawLocation)
504 if (!rawLocation) 552 return null;
505 return null; 553 var uiLocation = WebInspector.debuggerWorkspaceBinding.rawLocationToUILoca tion(rawLocation);
506 var uiLocation = WebInspector.debuggerWorkspaceBinding.rawLocationToUILo cation(rawLocation); 554 return uiLocation.linkText();
507 return uiLocation.linkText();
508 } 555 }
509 556
510 /** 557 /**
511 * @return {?string} 558 * @return {?string}
512 */ 559 */
513 function linkifyTopCallFrameAsText() 560 function linkifyTopCallFrameAsText() {
514 { 561 var frame = WebInspector.TimelineUIUtils.topStackFrame(event);
515 var frame = WebInspector.TimelineUIUtils.topStackFrame(event); 562 if (!frame)
516 if (!frame) 563 return null;
517 return null; 564 var text = linkifyLocationAsText(frame.scriptId, frame.lineNumber, frame.c olumnNumber);
518 var text = linkifyLocationAsText(frame.scriptId, frame.lineNumber, frame .columnNumber); 565 if (!text) {
519 if (!text) { 566 text = frame.url;
520 text = frame.url; 567 if (typeof frame.lineNumber === 'number')
521 if (typeof frame.lineNumber === "number") 568 text += ':' + (frame.lineNumber + 1);
522 text += ":" + (frame.lineNumber + 1); 569 }
523 } 570 return text;
524 return text;
525 } 571 }
526 }; 572 }
527 573
528 /** 574 /**
529 * @param {!WebInspector.TracingModel.Event} event 575 * @param {!WebInspector.TracingModel.Event} event
530 * @param {?WebInspector.Target} target 576 * @param {?WebInspector.Target} target
531 * @param {!WebInspector.Linkifier} linkifier 577 * @param {!WebInspector.Linkifier} linkifier
532 * @return {?Node} 578 * @return {?Node}
533 */ 579 */
534 WebInspector.TimelineUIUtils.buildDetailsNodeForTraceEvent = function(event, tar get, linkifier) 580 static buildDetailsNodeForTraceEvent(event, target, linkifier) {
535 {
536 var recordType = WebInspector.TimelineModel.RecordType; 581 var recordType = WebInspector.TimelineModel.RecordType;
537 var details = null; 582 var details = null;
538 var detailsText; 583 var detailsText;
539 var eventData = event.args["data"]; 584 var eventData = event.args['data'];
540 switch (event.name) { 585 switch (event.name) {
541 case recordType.GCEvent: 586 case recordType.GCEvent:
542 case recordType.MajorGC: 587 case recordType.MajorGC:
543 case recordType.MinorGC: 588 case recordType.MinorGC:
544 case recordType.EventDispatch: 589 case recordType.EventDispatch:
545 case recordType.Paint: 590 case recordType.Paint:
546 case recordType.Animation: 591 case recordType.Animation:
547 case recordType.EmbedderCallback: 592 case recordType.EmbedderCallback:
548 case recordType.ParseHTML: 593 case recordType.ParseHTML:
549 case recordType.WebSocketCreate: 594 case recordType.WebSocketCreate:
550 case recordType.WebSocketSendHandshakeRequest: 595 case recordType.WebSocketSendHandshakeRequest:
551 case recordType.WebSocketReceiveHandshakeResponse: 596 case recordType.WebSocketReceiveHandshakeResponse:
552 case recordType.WebSocketDestroy: 597 case recordType.WebSocketDestroy:
553 case recordType.GCIdleLazySweep: 598 case recordType.GCIdleLazySweep:
554 case recordType.GCCompleteSweep: 599 case recordType.GCCompleteSweep:
555 case recordType.GCCollectGarbage: 600 case recordType.GCCollectGarbage:
556 detailsText = WebInspector.TimelineUIUtils.buildDetailsTextForTraceEvent (event, target); 601 detailsText = WebInspector.TimelineUIUtils.buildDetailsTextForTraceEvent (event, target);
557 break; 602 break;
558 case recordType.PaintImage: 603 case recordType.PaintImage:
559 case recordType.DecodeImage: 604 case recordType.DecodeImage:
560 case recordType.ResizeImage: 605 case recordType.ResizeImage:
561 case recordType.DecodeLazyPixelRef: 606 case recordType.DecodeLazyPixelRef:
562 case recordType.XHRReadyStateChange: 607 case recordType.XHRReadyStateChange:
563 case recordType.XHRLoad: 608 case recordType.XHRLoad:
564 case recordType.ResourceSendRequest: 609 case recordType.ResourceSendRequest:
565 case recordType.ResourceReceivedData: 610 case recordType.ResourceReceivedData:
566 case recordType.ResourceReceiveResponse: 611 case recordType.ResourceReceiveResponse:
567 case recordType.ResourceFinish: 612 case recordType.ResourceFinish:
568 if (event.url) 613 if (event.url)
569 details = WebInspector.linkifyResourceAsNode(event.url); 614 details = WebInspector.linkifyResourceAsNode(event.url);
570 break; 615 break;
571 case recordType.FunctionCall: 616 case recordType.FunctionCall:
572 case recordType.JSFrame: 617 case recordType.JSFrame:
573 details = createElement("span"); 618 details = createElement('span');
574 details.createTextChild(WebInspector.beautifyFunctionName(eventData["fun ctionName"])); 619 details.createTextChild(WebInspector.beautifyFunctionName(eventData['fun ctionName']));
575 var location = linkifyLocation(eventData["scriptId"], eventData["url"], eventData["lineNumber"], eventData["columnNumber"]); 620 var location = linkifyLocation(
621 eventData['scriptId'], eventData['url'], eventData['lineNumber'], ev entData['columnNumber']);
576 if (location) { 622 if (location) {
577 details.createTextChild(" @ "); 623 details.createTextChild(' @ ');
578 details.appendChild(location); 624 details.appendChild(location);
579 } 625 }
580 break; 626 break;
581 case recordType.CompileScript: 627 case recordType.CompileScript:
582 case recordType.EvaluateScript: 628 case recordType.EvaluateScript:
583 var url = eventData["url"]; 629 var url = eventData['url'];
584 if (url) 630 if (url)
585 details = linkifyLocation("", url, eventData["lineNumber"], 0); 631 details = linkifyLocation('', url, eventData['lineNumber'], 0);
586 break; 632 break;
587 case recordType.ParseScriptOnBackground: 633 case recordType.ParseScriptOnBackground:
588 var url = eventData["url"]; 634 var url = eventData['url'];
589 if (url) 635 if (url)
590 details = linkifyLocation("", url, 0, 0); 636 details = linkifyLocation('', url, 0, 0);
591 break; 637 break;
592 default: 638 default:
593 if (event.hasCategory(WebInspector.TimelineModel.Category.Console)) 639 if (event.hasCategory(WebInspector.TimelineModel.Category.Console))
594 detailsText = null; 640 detailsText = null;
595 else 641 else
596 details = linkifyTopCallFrame(); 642 details = linkifyTopCallFrame();
597 break; 643 break;
598 } 644 }
599 645
600 if (!details && detailsText) 646 if (!details && detailsText)
601 details = createTextNode(detailsText); 647 details = createTextNode(detailsText);
602 return details; 648 return details;
603 649
604 /** 650 /**
605 * @param {string} scriptId 651 * @param {string} scriptId
606 * @param {string} url 652 * @param {string} url
607 * @param {number} lineNumber 653 * @param {number} lineNumber
608 * @param {number=} columnNumber 654 * @param {number=} columnNumber
609 * @return {?Element} 655 * @return {?Element}
610 */ 656 */
611 function linkifyLocation(scriptId, url, lineNumber, columnNumber) 657 function linkifyLocation(scriptId, url, lineNumber, columnNumber) {
612 { 658 return linkifier.linkifyScriptLocation(target, scriptId, url, lineNumber, columnNumber, 'timeline-details');
613 return linkifier.linkifyScriptLocation(target, scriptId, url, lineNumber , columnNumber, "timeline-details");
614 } 659 }
615 660
616 /** 661 /**
617 * @return {?Element} 662 * @return {?Element}
618 */ 663 */
619 function linkifyTopCallFrame() 664 function linkifyTopCallFrame() {
620 { 665 var frame = WebInspector.TimelineUIUtils.topStackFrame(event);
621 var frame = WebInspector.TimelineUIUtils.topStackFrame(event); 666 return frame ? linkifier.maybeLinkifyConsoleCallFrame(target, frame, 'time line-details') : null;
622 return frame ? linkifier.maybeLinkifyConsoleCallFrame(target, frame, "ti meline-details") : null;
623 } 667 }
624 }; 668 }
625 669
626 /** 670 /**
627 * @param {!WebInspector.TracingModel.Event} event 671 * @param {!WebInspector.TracingModel.Event} event
628 * @param {!WebInspector.TimelineModel} model 672 * @param {!WebInspector.TimelineModel} model
629 * @param {!WebInspector.Linkifier} linkifier 673 * @param {!WebInspector.Linkifier} linkifier
630 * @param {boolean} detailed 674 * @param {boolean} detailed
631 * @param {function(!DocumentFragment)} callback 675 * @param {function(!DocumentFragment)} callback
632 */ 676 */
633 WebInspector.TimelineUIUtils.buildTraceEventDetails = function(event, model, lin kifier, detailed, callback) 677 static buildTraceEventDetails(event, model, linkifier, detailed, callback) {
634 {
635 var target = model.targetByEvent(event); 678 var target = model.targetByEvent(event);
636 if (!target) { 679 if (!target) {
637 callbackWrapper(); 680 callbackWrapper();
638 return; 681 return;
639 } 682 }
640 var relatedNodes = null; 683 var relatedNodes = null;
641 var barrier = new CallbackBarrier(); 684 var barrier = new CallbackBarrier();
642 if (!event.previewElement) { 685 if (!event.previewElement) {
643 if (event.url) 686 if (event.url)
644 WebInspector.DOMPresentationUtils.buildImagePreviewContents(target, event.url, false, barrier.createCallback(saveImage)); 687 WebInspector.DOMPresentationUtils.buildImagePreviewContents(
645 else if (event.picture) 688 target, event.url, false, barrier.createCallback(saveImage));
646 WebInspector.TimelineUIUtils.buildPicturePreviewContent(event, targe t, barrier.createCallback(saveImage)); 689 else if (event.picture)
690 WebInspector.TimelineUIUtils.buildPicturePreviewContent(event, target, b arrier.createCallback(saveImage));
647 } 691 }
648 var nodeIdsToResolve = new Set(); 692 var nodeIdsToResolve = new Set();
649 if (event.backendNodeId) 693 if (event.backendNodeId)
650 nodeIdsToResolve.add(event.backendNodeId); 694 nodeIdsToResolve.add(event.backendNodeId);
651 if (event.invalidationTrackingEvents) 695 if (event.invalidationTrackingEvents)
652 WebInspector.TimelineUIUtils._collectInvalidationNodeIds(nodeIdsToResolv e, event.invalidationTrackingEvents); 696 WebInspector.TimelineUIUtils._collectInvalidationNodeIds(nodeIdsToResolve, event.invalidationTrackingEvents);
653 if (nodeIdsToResolve.size) { 697 if (nodeIdsToResolve.size) {
654 var domModel = WebInspector.DOMModel.fromTarget(target); 698 var domModel = WebInspector.DOMModel.fromTarget(target);
655 if (domModel) 699 if (domModel)
656 domModel.pushNodesByBackendIdsToFrontend(nodeIdsToResolve, barrier.c reateCallback(setRelatedNodeMap)); 700 domModel.pushNodesByBackendIdsToFrontend(nodeIdsToResolve, barrier.creat eCallback(setRelatedNodeMap));
657 } 701 }
658 barrier.callWhenDone(callbackWrapper); 702 barrier.callWhenDone(callbackWrapper);
659 703
660 /** 704 /**
661 * @param {!Element=} element 705 * @param {!Element=} element
662 */ 706 */
663 function saveImage(element) 707 function saveImage(element) {
664 { 708 event.previewElement = element || null;
665 event.previewElement = element || null;
666 } 709 }
667 710
668 /** 711 /**
669 * @param {?Map<number, ?WebInspector.DOMNode>} nodeMap 712 * @param {?Map<number, ?WebInspector.DOMNode>} nodeMap
670 */ 713 */
671 function setRelatedNodeMap(nodeMap) 714 function setRelatedNodeMap(nodeMap) {
672 { 715 relatedNodes = nodeMap;
673 relatedNodes = nodeMap;
674 } 716 }
675 717
676 function callbackWrapper() 718 function callbackWrapper() {
677 { 719 callback(WebInspector.TimelineUIUtils._buildTraceEventDetailsSynchronously (
678 callback(WebInspector.TimelineUIUtils._buildTraceEventDetailsSynchronous ly(event, model, linkifier, detailed, relatedNodes)); 720 event, model, linkifier, detailed, relatedNodes));
679 } 721 }
680 }; 722 }
681 723
682 /** 724 /**
683 * @param {!WebInspector.TracingModel.Event} event 725 * @param {!WebInspector.TracingModel.Event} event
684 * @param {!WebInspector.TimelineModel} model 726 * @param {!WebInspector.TimelineModel} model
685 * @param {!WebInspector.Linkifier} linkifier 727 * @param {!WebInspector.Linkifier} linkifier
686 * @param {boolean} detailed 728 * @param {boolean} detailed
687 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap 729 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap
688 * @return {!DocumentFragment} 730 * @return {!DocumentFragment}
689 */ 731 */
690 WebInspector.TimelineUIUtils._buildTraceEventDetailsSynchronously = function(eve nt, model, linkifier, detailed, relatedNodesMap) 732 static _buildTraceEventDetailsSynchronously(event, model, linkifier, detailed, relatedNodesMap) {
691 {
692 var stats = {}; 733 var stats = {};
693 var recordTypes = WebInspector.TimelineModel.RecordType; 734 var recordTypes = WebInspector.TimelineModel.RecordType;
694 735
695 // This message may vary per event.name; 736 // This message may vary per event.name;
696 var relatedNodeLabel; 737 var relatedNodeLabel;
697 738
698 var contentHelper = new WebInspector.TimelineDetailsContentHelper(model.targ etByEvent(event), linkifier); 739 var contentHelper = new WebInspector.TimelineDetailsContentHelper(model.targ etByEvent(event), linkifier);
699 contentHelper.addSection(WebInspector.TimelineUIUtils.eventTitle(event), Web Inspector.TimelineUIUtils.eventStyle(event).category); 740 contentHelper.addSection(
700 741 WebInspector.TimelineUIUtils.eventTitle(event), WebInspector.TimelineUIU tils.eventStyle(event).category);
701 var eventData = event.args["data"]; 742
743 var eventData = event.args['data'];
702 var initiator = event.initiator; 744 var initiator = event.initiator;
703 745
704 if (event.warning) 746 if (event.warning)
705 contentHelper.appendWarningRow(event); 747 contentHelper.appendWarningRow(event);
706 if (event.name === recordTypes.JSFrame && eventData["deoptReason"]) 748 if (event.name === recordTypes.JSFrame && eventData['deoptReason'])
707 contentHelper.appendWarningRow(event, WebInspector.TimelineModel.Warning Type.V8Deopt); 749 contentHelper.appendWarningRow(event, WebInspector.TimelineModel.WarningTy pe.V8Deopt);
708 750
709 if (detailed) { 751 if (detailed) {
710 contentHelper.appendTextRow(WebInspector.UIString("Self Time"), Number.m illisToString(event.selfTime, true)); 752 contentHelper.appendTextRow(WebInspector.UIString('Self Time'), Number.mil lisToString(event.selfTime, true));
711 contentHelper.appendTextRow(WebInspector.UIString("Total Time"), Number. millisToString(event.duration || 0, true)); 753 contentHelper.appendTextRow(
754 WebInspector.UIString('Total Time'), Number.millisToString(event.durat ion || 0, true));
712 } 755 }
713 756
714 switch (event.name) { 757 switch (event.name) {
715 case recordTypes.GCEvent: 758 case recordTypes.GCEvent:
716 case recordTypes.MajorGC: 759 case recordTypes.MajorGC:
717 case recordTypes.MinorGC: 760 case recordTypes.MinorGC:
718 var delta = event.args["usedHeapSizeBefore"] - event.args["usedHeapSizeA fter"]; 761 var delta = event.args['usedHeapSizeBefore'] - event.args['usedHeapSizeA fter'];
719 contentHelper.appendTextRow(WebInspector.UIString("Collected"), Number.b ytesToString(delta)); 762 contentHelper.appendTextRow(WebInspector.UIString('Collected'), Number.b ytesToString(delta));
720 break; 763 break;
721 case recordTypes.JSFrame: 764 case recordTypes.JSFrame:
722 case recordTypes.FunctionCall: 765 case recordTypes.FunctionCall:
723 var detailsNode = WebInspector.TimelineUIUtils.buildDetailsNodeForTraceE vent(event, model.targetByEvent(event), linkifier); 766 var detailsNode =
767 WebInspector.TimelineUIUtils.buildDetailsNodeForTraceEvent(event, mo del.targetByEvent(event), linkifier);
724 if (detailsNode) 768 if (detailsNode)
725 contentHelper.appendElementRow(WebInspector.UIString("Function"), de tailsNode); 769 contentHelper.appendElementRow(WebInspector.UIString('Function'), deta ilsNode);
726 break; 770 break;
727 case recordTypes.TimerFire: 771 case recordTypes.TimerFire:
728 case recordTypes.TimerInstall: 772 case recordTypes.TimerInstall:
729 case recordTypes.TimerRemove: 773 case recordTypes.TimerRemove:
730 contentHelper.appendTextRow(WebInspector.UIString("Timer ID"), eventData ["timerId"]); 774 contentHelper.appendTextRow(WebInspector.UIString('Timer ID'), eventData ['timerId']);
731 if (event.name === recordTypes.TimerInstall) { 775 if (event.name === recordTypes.TimerInstall) {
732 contentHelper.appendTextRow(WebInspector.UIString("Timeout"), Number .millisToString(eventData["timeout"])); 776 contentHelper.appendTextRow(WebInspector.UIString('Timeout'), Number.m illisToString(eventData['timeout']));
733 contentHelper.appendTextRow(WebInspector.UIString("Repeats"), !event Data["singleShot"]); 777 contentHelper.appendTextRow(WebInspector.UIString('Repeats'), !eventDa ta['singleShot']);
734 } 778 }
735 break; 779 break;
736 case recordTypes.FireAnimationFrame: 780 case recordTypes.FireAnimationFrame:
737 contentHelper.appendTextRow(WebInspector.UIString("Callback ID"), eventD ata["id"]); 781 contentHelper.appendTextRow(WebInspector.UIString('Callback ID'), eventD ata['id']);
738 break; 782 break;
739 case recordTypes.ResourceSendRequest: 783 case recordTypes.ResourceSendRequest:
740 case recordTypes.ResourceReceiveResponse: 784 case recordTypes.ResourceReceiveResponse:
741 case recordTypes.ResourceReceivedData: 785 case recordTypes.ResourceReceivedData:
742 case recordTypes.ResourceFinish: 786 case recordTypes.ResourceFinish:
743 var url = (event.name === recordTypes.ResourceSendRequest) ? eventData[" url"] : initiator && initiator.args["data"]["url"]; 787 var url = (event.name === recordTypes.ResourceSendRequest) ? eventData[' url'] :
744 if (url) 788 initiator & & initiator.args['data']['url'];
745 contentHelper.appendElementRow(WebInspector.UIString("Resource"), We bInspector.linkifyResourceAsNode(url)); 789 if (url)
746 if (eventData["requestMethod"]) 790 contentHelper.appendElementRow(WebInspector.UIString('Resource'), WebI nspector.linkifyResourceAsNode(url));
747 contentHelper.appendTextRow(WebInspector.UIString("Request Method"), eventData["requestMethod"]); 791 if (eventData['requestMethod'])
748 if (typeof eventData["statusCode"] === "number") 792 contentHelper.appendTextRow(WebInspector.UIString('Request Method'), e ventData['requestMethod']);
749 contentHelper.appendTextRow(WebInspector.UIString("Status Code"), ev entData["statusCode"]); 793 if (typeof eventData['statusCode'] === 'number')
750 if (eventData["mimeType"]) 794 contentHelper.appendTextRow(WebInspector.UIString('Status Code'), even tData['statusCode']);
751 contentHelper.appendTextRow(WebInspector.UIString("MIME Type"), even tData["mimeType"]); 795 if (eventData['mimeType'])
752 if ("priority" in eventData) { 796 contentHelper.appendTextRow(WebInspector.UIString('MIME Type'), eventD ata['mimeType']);
753 var priority = WebInspector.uiLabelForPriority(eventData["priority"] ); 797 if ('priority' in eventData) {
754 contentHelper.appendTextRow(WebInspector.UIString("Priority"), prior ity); 798 var priority = WebInspector.uiLabelForPriority(eventData['priority']);
799 contentHelper.appendTextRow(WebInspector.UIString('Priority'), priorit y);
755 } 800 }
756 if (eventData["encodedDataLength"]) 801 if (eventData['encodedDataLength'])
757 contentHelper.appendTextRow(WebInspector.UIString("Encoded Data Leng th"), WebInspector.UIString("%d Bytes", eventData["encodedDataLength"])); 802 contentHelper.appendTextRow(
758 break; 803 WebInspector.UIString('Encoded Data Length'),
759 case recordTypes.CompileScript: 804 WebInspector.UIString('%d Bytes', eventData['encodedDataLength'])) ;
760 case recordTypes.EvaluateScript: 805 break;
761 var url = eventData && eventData["url"]; 806 case recordTypes.CompileScript:
762 if (url) 807 case recordTypes.EvaluateScript:
763 contentHelper.appendLocationRow(WebInspector.UIString("Script"), url , eventData["lineNumber"], eventData["columnNumber"]); 808 var url = eventData && eventData['url'];
764 break; 809 if (url)
765 case recordTypes.Paint: 810 contentHelper.appendLocationRow(
766 var clip = eventData["clip"]; 811 WebInspector.UIString('Script'), url, eventData['lineNumber'], eve ntData['columnNumber']);
767 contentHelper.appendTextRow(WebInspector.UIString("Location"), WebInspec tor.UIString("(%d, %d)", clip[0], clip[1])); 812 break;
813 case recordTypes.Paint:
814 var clip = eventData['clip'];
815 contentHelper.appendTextRow(
816 WebInspector.UIString('Location'), WebInspector.UIString('(%d, %d)', clip[0], clip[1]));
768 var clipWidth = WebInspector.TimelineUIUtils.quadWidth(clip); 817 var clipWidth = WebInspector.TimelineUIUtils.quadWidth(clip);
769 var clipHeight = WebInspector.TimelineUIUtils.quadHeight(clip); 818 var clipHeight = WebInspector.TimelineUIUtils.quadHeight(clip);
770 contentHelper.appendTextRow(WebInspector.UIString("Dimensions"), WebInsp ector.UIString("%d × %d", clipWidth, clipHeight)); 819 contentHelper.appendTextRow(
771 // Fall-through intended. 820 WebInspector.UIString('Dimensions'), WebInspector.UIString('%d × %d' , clipWidth, clipHeight));
772 821 // Fall-through intended.
773 case recordTypes.PaintSetup: 822
774 case recordTypes.Rasterize: 823 case recordTypes.PaintSetup:
775 case recordTypes.ScrollLayer: 824 case recordTypes.Rasterize:
776 relatedNodeLabel = WebInspector.UIString("Layer Root"); 825 case recordTypes.ScrollLayer:
777 break; 826 relatedNodeLabel = WebInspector.UIString('Layer Root');
778 case recordTypes.PaintImage: 827 break;
779 case recordTypes.DecodeLazyPixelRef: 828 case recordTypes.PaintImage:
780 case recordTypes.DecodeImage: 829 case recordTypes.DecodeLazyPixelRef:
781 case recordTypes.ResizeImage: 830 case recordTypes.DecodeImage:
782 case recordTypes.DrawLazyPixelRef: 831 case recordTypes.ResizeImage:
783 relatedNodeLabel = WebInspector.UIString("Owner Element"); 832 case recordTypes.DrawLazyPixelRef:
833 relatedNodeLabel = WebInspector.UIString('Owner Element');
784 if (event.url) 834 if (event.url)
785 contentHelper.appendElementRow(WebInspector.UIString("Image URL"), W ebInspector.linkifyResourceAsNode(event.url)); 835 contentHelper.appendElementRow(
786 break; 836 WebInspector.UIString('Image URL'), WebInspector.linkifyResourceAs Node(event.url));
787 case recordTypes.ParseAuthorStyleSheet: 837 break;
788 var url = eventData["styleSheetUrl"]; 838 case recordTypes.ParseAuthorStyleSheet:
789 if (url) 839 var url = eventData['styleSheetUrl'];
790 contentHelper.appendElementRow(WebInspector.UIString("Stylesheet URL "), WebInspector.linkifyResourceAsNode(url)); 840 if (url)
791 break; 841 contentHelper.appendElementRow(
792 case recordTypes.UpdateLayoutTree: // We don't want to see default details. 842 WebInspector.UIString('Stylesheet URL'), WebInspector.linkifyResou rceAsNode(url));
793 case recordTypes.RecalculateStyles: 843 break;
794 contentHelper.appendTextRow(WebInspector.UIString("Elements Affected"), event.args["elementCount"]); 844 case recordTypes.UpdateLayoutTree: // We don't want to see default detail s.
795 break; 845 case recordTypes.RecalculateStyles:
796 case recordTypes.Layout: 846 contentHelper.appendTextRow(WebInspector.UIString('Elements Affected'), event.args['elementCount']);
797 var beginData = event.args["beginData"]; 847 break;
798 contentHelper.appendTextRow(WebInspector.UIString("Nodes That Need Layou t"), WebInspector.UIString("%s of %s", beginData["dirtyObjects"], beginData["tot alObjects"])); 848 case recordTypes.Layout:
799 relatedNodeLabel = WebInspector.UIString("Layout root"); 849 var beginData = event.args['beginData'];
800 break; 850 contentHelper.appendTextRow(
801 case recordTypes.ConsoleTime: 851 WebInspector.UIString('Nodes That Need Layout'),
802 contentHelper.appendTextRow(WebInspector.UIString("Message"), event.name ); 852 WebInspector.UIString('%s of %s', beginData['dirtyObjects'], beginDa ta['totalObjects']));
803 break; 853 relatedNodeLabel = WebInspector.UIString('Layout root');
804 case recordTypes.WebSocketCreate: 854 break;
805 case recordTypes.WebSocketSendHandshakeRequest: 855 case recordTypes.ConsoleTime:
806 case recordTypes.WebSocketReceiveHandshakeResponse: 856 contentHelper.appendTextRow(WebInspector.UIString('Message'), event.name );
807 case recordTypes.WebSocketDestroy: 857 break;
808 var initiatorData = initiator ? initiator.args["data"] : eventData; 858 case recordTypes.WebSocketCreate:
809 if (typeof initiatorData["webSocketURL"] !== "undefined") 859 case recordTypes.WebSocketSendHandshakeRequest:
810 contentHelper.appendTextRow(WebInspector.UIString("URL"), initiatorD ata["webSocketURL"]); 860 case recordTypes.WebSocketReceiveHandshakeResponse:
811 if (typeof initiatorData["webSocketProtocol"] !== "undefined") 861 case recordTypes.WebSocketDestroy:
812 contentHelper.appendTextRow(WebInspector.UIString("WebSocket Protoco l"), initiatorData["webSocketProtocol"]); 862 var initiatorData = initiator ? initiator.args['data'] : eventData;
813 if (typeof eventData["message"] !== "undefined") 863 if (typeof initiatorData['webSocketURL'] !== 'undefined')
814 contentHelper.appendTextRow(WebInspector.UIString("Message"), eventD ata["message"]); 864 contentHelper.appendTextRow(WebInspector.UIString('URL'), initiatorDat a['webSocketURL']);
815 break; 865 if (typeof initiatorData['webSocketProtocol'] !== 'undefined')
816 case recordTypes.EmbedderCallback: 866 contentHelper.appendTextRow(WebInspector.UIString('WebSocket Protocol' ), initiatorData['webSocketProtocol']);
817 contentHelper.appendTextRow(WebInspector.UIString("Callback Function"), eventData["callbackName"]); 867 if (typeof eventData['message'] !== 'undefined')
818 break; 868 contentHelper.appendTextRow(WebInspector.UIString('Message'), eventDat a['message']);
819 case recordTypes.Animation: 869 break;
870 case recordTypes.EmbedderCallback:
871 contentHelper.appendTextRow(WebInspector.UIString('Callback Function'), eventData['callbackName']);
872 break;
873 case recordTypes.Animation:
820 if (event.phase === WebInspector.TracingModel.Phase.NestableAsyncInstant ) 874 if (event.phase === WebInspector.TracingModel.Phase.NestableAsyncInstant )
821 contentHelper.appendTextRow(WebInspector.UIString("State"), eventDat a["state"]); 875 contentHelper.appendTextRow(WebInspector.UIString('State'), eventData[ 'state']);
822 break; 876 break;
823 case recordTypes.ParseHTML: 877 case recordTypes.ParseHTML:
824 var beginData = event.args["beginData"]; 878 var beginData = event.args['beginData'];
825 var url = beginData["url"]; 879 var url = beginData['url'];
826 var startLine = beginData["startLine"] - 1; 880 var startLine = beginData['startLine'] - 1;
827 var endLine = event.args["endData"] ? event.args["endData"]["endLine"] - 1 : undefined; 881 var endLine = event.args['endData'] ? event.args['endData']['endLine'] - 1 : undefined;
828 if (url) 882 if (url)
829 contentHelper.appendLocationRange(WebInspector.UIString("Range"), ur l, startLine, endLine); 883 contentHelper.appendLocationRange(WebInspector.UIString('Range'), url, startLine, endLine);
830 break; 884 break;
831 885
832 case recordTypes.FireIdleCallback: 886 case recordTypes.FireIdleCallback:
833 contentHelper.appendTextRow(WebInspector.UIString("Allotted Time"), Numb er.millisToString(eventData["allottedMilliseconds"])); 887 contentHelper.appendTextRow(
834 contentHelper.appendTextRow(WebInspector.UIString("Invoked by Timeout"), eventData["timedOut"]); 888 WebInspector.UIString('Allotted Time'), Number.millisToString(eventD ata['allottedMilliseconds']));
835 // Fall-through intended. 889 contentHelper.appendTextRow(WebInspector.UIString('Invoked by Timeout'), eventData['timedOut']);
836 890 // Fall-through intended.
837 case recordTypes.RequestIdleCallback: 891
838 case recordTypes.CancelIdleCallback: 892 case recordTypes.RequestIdleCallback:
839 contentHelper.appendTextRow(WebInspector.UIString("Callback ID"), eventD ata["id"]); 893 case recordTypes.CancelIdleCallback:
840 break; 894 contentHelper.appendTextRow(WebInspector.UIString('Callback ID'), eventD ata['id']);
841 case recordTypes.EventDispatch: 895 break;
842 contentHelper.appendTextRow(WebInspector.UIString("Type"), eventData["ty pe"]); 896 case recordTypes.EventDispatch:
843 break; 897 contentHelper.appendTextRow(WebInspector.UIString('Type'), eventData['ty pe']);
844 898 break;
845 default: 899
846 var detailsNode = WebInspector.TimelineUIUtils.buildDetailsNodeForTraceE vent(event, model.targetByEvent(event), linkifier); 900 default:
901 var detailsNode =
902 WebInspector.TimelineUIUtils.buildDetailsNodeForTraceEvent(event, mo del.targetByEvent(event), linkifier);
847 if (detailsNode) 903 if (detailsNode)
848 contentHelper.appendElementRow(WebInspector.UIString("Details"), det ailsNode); 904 contentHelper.appendElementRow(WebInspector.UIString('Details'), detai lsNode);
849 break; 905 break;
850 } 906 }
851 907
852 if (event.timeWaitingForMainThread) 908 if (event.timeWaitingForMainThread)
853 contentHelper.appendTextRow(WebInspector.UIString("Time Waiting for Main Thread"), Number.millisToString(event.timeWaitingForMainThread, true)); 909 contentHelper.appendTextRow(
910 WebInspector.UIString('Time Waiting for Main Thread'),
911 Number.millisToString(event.timeWaitingForMainThread, true));
854 912
855 var relatedNode = relatedNodesMap && relatedNodesMap.get(event.backendNodeId ); 913 var relatedNode = relatedNodesMap && relatedNodesMap.get(event.backendNodeId );
856 if (relatedNode) 914 if (relatedNode)
857 contentHelper.appendElementRow(relatedNodeLabel || WebInspector.UIString ("Related Node"), WebInspector.DOMPresentationUtils.linkifyNodeReference(related Node)); 915 contentHelper.appendElementRow(
916 relatedNodeLabel || WebInspector.UIString('Related Node'),
917 WebInspector.DOMPresentationUtils.linkifyNodeReference(relatedNode));
858 918
859 if (event.previewElement) { 919 if (event.previewElement) {
860 contentHelper.addSection(WebInspector.UIString("Preview")); 920 contentHelper.addSection(WebInspector.UIString('Preview'));
861 contentHelper.appendElementRow("", event.previewElement); 921 contentHelper.appendElementRow('', event.previewElement);
862 } 922 }
863 923
864 if (event.stackTrace || (event.initiator && event.initiator.stackTrace) || e vent.invalidationTrackingEvents) 924 if (event.stackTrace || (event.initiator && event.initiator.stackTrace) || e vent.invalidationTrackingEvents)
865 WebInspector.TimelineUIUtils._generateCauses(event, model.targetByEvent( event), relatedNodesMap, contentHelper); 925 WebInspector.TimelineUIUtils._generateCauses(event, model.targetByEvent(ev ent), relatedNodesMap, contentHelper);
866 926
867 var showPieChart = detailed && WebInspector.TimelineUIUtils._aggregatedStats ForTraceEvent(stats, model, event); 927 var showPieChart = detailed && WebInspector.TimelineUIUtils._aggregatedStats ForTraceEvent(stats, model, event);
868 if (showPieChart) { 928 if (showPieChart) {
869 contentHelper.addSection(WebInspector.UIString("Aggregated Time")); 929 contentHelper.addSection(WebInspector.UIString('Aggregated Time'));
870 var pieChart = WebInspector.TimelineUIUtils.generatePieChart(stats, WebI nspector.TimelineUIUtils.eventStyle(event).category, event.selfTime); 930 var pieChart = WebInspector.TimelineUIUtils.generatePieChart(
871 contentHelper.appendElementRow("", pieChart); 931 stats, WebInspector.TimelineUIUtils.eventStyle(event).category, event. selfTime);
932 contentHelper.appendElementRow('', pieChart);
872 } 933 }
873 934
874 return contentHelper.fragment; 935 return contentHelper.fragment;
875 }; 936 }
876 937
877 WebInspector.TimelineUIUtils._aggregatedStatsKey = Symbol("aggregatedStats"); 938 /**
878 939 * @param {!WebInspector.TimelineModel} model
879 /** 940 * @param {number} startTime
880 * @param {!WebInspector.TimelineModel} model 941 * @param {number} endTime
881 * @param {number} startTime 942 * @return {!DocumentFragment}
882 * @param {number} endTime 943 */
883 * @return {!DocumentFragment} 944 static buildRangeStats(model, startTime, endTime) {
884 */
885 WebInspector.TimelineUIUtils.buildRangeStats = function(model, startTime, endTim e)
886 {
887 var aggregatedStats = {}; 945 var aggregatedStats = {};
888 946
889 /** 947 /**
890 * @param {number} value 948 * @param {number} value
891 * @param {!WebInspector.TimelineModel.Record} task 949 * @param {!WebInspector.TimelineModel.Record} task
892 * @return {number} 950 * @return {number}
893 */ 951 */
894 function compareEndTime(value, task) 952 function compareEndTime(value, task) {
895 { 953 return value < task.endTime() ? -1 : 1;
896 return value < task.endTime() ? -1 : 1;
897 } 954 }
898 var mainThreadTasks = model.mainThreadTasks(); 955 var mainThreadTasks = model.mainThreadTasks();
899 var taskIndex = mainThreadTasks.lowerBound(startTime, compareEndTime); 956 var taskIndex = mainThreadTasks.lowerBound(startTime, compareEndTime);
900 for (; taskIndex < mainThreadTasks.length; ++taskIndex) { 957 for (; taskIndex < mainThreadTasks.length; ++taskIndex) {
901 var task = mainThreadTasks[taskIndex]; 958 var task = mainThreadTasks[taskIndex];
902 if (task.startTime() > endTime) 959 if (task.startTime() > endTime)
903 break; 960 break;
904 if (task.startTime() > startTime && task.endTime() < endTime) { 961 if (task.startTime() > startTime && task.endTime() < endTime) {
905 // cache stats for top-level entries that fit the range entirely. 962 // cache stats for top-level entries that fit the range entirely.
906 var taskStats = task[WebInspector.TimelineUIUtils._aggregatedStatsKe y]; 963 var taskStats = task[WebInspector.TimelineUIUtils._aggregatedStatsKey];
907 if (!taskStats) { 964 if (!taskStats) {
908 taskStats = {}; 965 taskStats = {};
909 WebInspector.TimelineUIUtils._collectAggregatedStatsForRecord(ta sk, startTime, endTime, taskStats); 966 WebInspector.TimelineUIUtils._collectAggregatedStatsForRecord(task, st artTime, endTime, taskStats);
910 task[WebInspector.TimelineUIUtils._aggregatedStatsKey] = taskSta ts; 967 task[WebInspector.TimelineUIUtils._aggregatedStatsKey] = taskStats;
911 }
912 for (var key in taskStats)
913 aggregatedStats[key] = (aggregatedStats[key] || 0) + taskStats[k ey];
914 continue;
915 } 968 }
916 WebInspector.TimelineUIUtils._collectAggregatedStatsForRecord(task, star tTime, endTime, aggregatedStats); 969 for (var key in taskStats)
970 aggregatedStats[key] = (aggregatedStats[key] || 0) + taskStats[key];
971 continue;
972 }
973 WebInspector.TimelineUIUtils._collectAggregatedStatsForRecord(task, startT ime, endTime, aggregatedStats);
917 } 974 }
918 975
919 var aggregatedTotal = 0; 976 var aggregatedTotal = 0;
920 for (var categoryName in aggregatedStats) 977 for (var categoryName in aggregatedStats)
921 aggregatedTotal += aggregatedStats[categoryName]; 978 aggregatedTotal += aggregatedStats[categoryName];
922 aggregatedStats["idle"] = Math.max(0, endTime - startTime - aggregatedTotal) ; 979 aggregatedStats['idle'] = Math.max(0, endTime - startTime - aggregatedTotal) ;
923 980
924 var startOffset = startTime - model.minimumRecordTime(); 981 var startOffset = startTime - model.minimumRecordTime();
925 var endOffset = endTime - model.minimumRecordTime(); 982 var endOffset = endTime - model.minimumRecordTime();
926 983
927 var contentHelper = new WebInspector.TimelineDetailsContentHelper(null, null ); 984 var contentHelper = new WebInspector.TimelineDetailsContentHelper(null, null );
928 contentHelper.addSection(WebInspector.UIString("Range: %s \u2013 %s", Numbe r.millisToString(startOffset), Number.millisToString(endOffset))); 985 contentHelper.addSection(WebInspector.UIString(
986 'Range: %s \u2013 %s', Number.millisToString(startOffset), Number.milli sToString(endOffset)));
929 var pieChart = WebInspector.TimelineUIUtils.generatePieChart(aggregatedStats ); 987 var pieChart = WebInspector.TimelineUIUtils.generatePieChart(aggregatedStats );
930 contentHelper.appendElementRow("", pieChart); 988 contentHelper.appendElementRow('', pieChart);
931 return contentHelper.fragment; 989 return contentHelper.fragment;
932 }; 990 }
933 991
934 /** 992 /**
935 * @param {!WebInspector.TimelineModel.Record} record 993 * @param {!WebInspector.TimelineModel.Record} record
936 * @param {number} startTime 994 * @param {number} startTime
937 * @param {number} endTime 995 * @param {number} endTime
938 * @param {!Object} aggregatedStats 996 * @param {!Object} aggregatedStats
939 */ 997 */
940 WebInspector.TimelineUIUtils._collectAggregatedStatsForRecord = function(record, startTime, endTime, aggregatedStats) 998 static _collectAggregatedStatsForRecord(record, startTime, endTime, aggregated Stats) {
941 {
942 var records = []; 999 var records = [];
943 1000
944 if (!record.endTime() || record.endTime() < startTime || record.startTime() > endTime) 1001 if (!record.endTime() || record.endTime() < startTime || record.startTime() > endTime)
945 return; 1002 return;
946 1003
947 var childrenTime = 0; 1004 var childrenTime = 0;
948 var children = record.children() || []; 1005 var children = record.children() || [];
949 for (var i = 0; i < children.length; ++i) { 1006 for (var i = 0; i < children.length; ++i) {
950 var child = children[i]; 1007 var child = children[i];
951 if (!child.endTime() || child.endTime() < startTime || child.startTime() > endTime) 1008 if (!child.endTime() || child.endTime() < startTime || child.startTime() > endTime)
952 continue; 1009 continue;
953 childrenTime += Math.min(endTime, child.endTime()) - Math.max(startTime, child.startTime()); 1010 childrenTime += Math.min(endTime, child.endTime()) - Math.max(startTime, c hild.startTime());
954 WebInspector.TimelineUIUtils._collectAggregatedStatsForRecord(child, sta rtTime, endTime, aggregatedStats); 1011 WebInspector.TimelineUIUtils._collectAggregatedStatsForRecord(child, start Time, endTime, aggregatedStats);
955 } 1012 }
956 var categoryName = WebInspector.TimelineUIUtils.categoryForRecord(record).na me; 1013 var categoryName = WebInspector.TimelineUIUtils.categoryForRecord(record).na me;
957 var ownTime = Math.min(endTime, record.endTime()) - Math.max(startTime, reco rd.startTime()) - childrenTime; 1014 var ownTime = Math.min(endTime, record.endTime()) - Math.max(startTime, reco rd.startTime()) - childrenTime;
958 aggregatedStats[categoryName] = (aggregatedStats[categoryName] || 0) + ownTi me; 1015 aggregatedStats[categoryName] = (aggregatedStats[categoryName] || 0) + ownTi me;
959 }; 1016 }
960 1017
961 /** 1018 /**
962 * @param {!WebInspector.TimelineModel.NetworkRequest} request 1019 * @param {!WebInspector.TimelineModel.NetworkRequest} request
963 * @param {!WebInspector.TimelineModel} model 1020 * @param {!WebInspector.TimelineModel} model
964 * @param {!WebInspector.Linkifier} linkifier 1021 * @param {!WebInspector.Linkifier} linkifier
965 * @return {!Promise<!DocumentFragment>} 1022 * @return {!Promise<!DocumentFragment>}
966 */ 1023 */
967 WebInspector.TimelineUIUtils.buildNetworkRequestDetails = function(request, mode l, linkifier) 1024 static buildNetworkRequestDetails(request, model, linkifier) {
968 {
969 var target = model.targetByEvent(request.children[0]); 1025 var target = model.targetByEvent(request.children[0]);
970 var contentHelper = new WebInspector.TimelineDetailsContentHelper(target, li nkifier); 1026 var contentHelper = new WebInspector.TimelineDetailsContentHelper(target, li nkifier);
971 1027
972 var duration = request.endTime - (request.startTime || -Infinity); 1028 var duration = request.endTime - (request.startTime || -Infinity);
973 var items = []; 1029 var items = [];
974 if (request.url) 1030 if (request.url)
975 contentHelper.appendElementRow(WebInspector.UIString("URL"), WebInspecto r.linkifyURLAsNode(request.url)); 1031 contentHelper.appendElementRow(WebInspector.UIString('URL'), WebInspector. linkifyURLAsNode(request.url));
976 if (isFinite(duration)) 1032 if (isFinite(duration))
977 contentHelper.appendTextRow(WebInspector.UIString("Duration"), Number.mi llisToString(duration, true)); 1033 contentHelper.appendTextRow(WebInspector.UIString('Duration'), Number.mill isToString(duration, true));
978 if (request.requestMethod) 1034 if (request.requestMethod)
979 contentHelper.appendTextRow(WebInspector.UIString("Request Method"), req uest.requestMethod); 1035 contentHelper.appendTextRow(WebInspector.UIString('Request Method'), reque st.requestMethod);
980 if (typeof request.priority === "string") { 1036 if (typeof request.priority === 'string') {
981 var priority = WebInspector.uiLabelForPriority(/** @type {!NetworkAgent. ResourcePriority} */ (request.priority)); 1037 var priority = WebInspector.uiLabelForPriority(/** @type {!NetworkAgent.Re sourcePriority} */ (request.priority));
982 contentHelper.appendTextRow(WebInspector.UIString("Priority"), priority) ; 1038 contentHelper.appendTextRow(WebInspector.UIString('Priority'), priority);
983 } 1039 }
984 if (request.mimeType) 1040 if (request.mimeType)
985 contentHelper.appendTextRow(WebInspector.UIString("Mime Type"), request. mimeType); 1041 contentHelper.appendTextRow(WebInspector.UIString('Mime Type'), request.mi meType);
986 1042
987 var title = WebInspector.UIString("Initiator"); 1043 var title = WebInspector.UIString('Initiator');
988 var sendRequest = request.children[0]; 1044 var sendRequest = request.children[0];
989 var topFrame = WebInspector.TimelineUIUtils.topStackFrame(sendRequest); 1045 var topFrame = WebInspector.TimelineUIUtils.topStackFrame(sendRequest);
990 if (topFrame) { 1046 if (topFrame) {
991 var link = linkifier.maybeLinkifyConsoleCallFrame(target, topFrame); 1047 var link = linkifier.maybeLinkifyConsoleCallFrame(target, topFrame);
1048 if (link)
1049 contentHelper.appendElementRow(title, link);
1050 } else if (sendRequest.initiator) {
1051 var initiatorURL = WebInspector.TimelineUIUtils.eventURL(sendRequest.initi ator);
1052 if (initiatorURL) {
1053 var link = linkifier.maybeLinkifyScriptLocation(target, null, initiatorU RL, 0);
992 if (link) 1054 if (link)
993 contentHelper.appendElementRow(title, link); 1055 contentHelper.appendElementRow(title, link);
994 } else if (sendRequest.initiator) { 1056 }
995 var initiatorURL = WebInspector.TimelineUIUtils.eventURL(sendRequest.ini tiator);
996 if (initiatorURL) {
997 var link = linkifier.maybeLinkifyScriptLocation(target, null, initia torURL, 0);
998 if (link)
999 contentHelper.appendElementRow(title, link);
1000 }
1001 } 1057 }
1002 1058
1003 /** 1059 /**
1004 * @param {function(?Element)} fulfill 1060 * @param {function(?Element)} fulfill
1005 */ 1061 */
1006 function action(fulfill) 1062 function action(fulfill) {
1007 { 1063 WebInspector.DOMPresentationUtils.buildImagePreviewContents(
1008 WebInspector.DOMPresentationUtils.buildImagePreviewContents(/** @type {! WebInspector.Target} */(target), request.url, false, saveImage); 1064 /** @type {!WebInspector.Target} */ (target), request.url, false, save Image);
1009 /** 1065 /**
1010 * @param {!Element=} element 1066 * @param {!Element=} element
1011 */ 1067 */
1012 function saveImage(element) 1068 function saveImage(element) {
1013 { 1069 request.previewElement = element || null;
1014 request.previewElement = element || null; 1070 fulfill(request.previewElement);
1015 fulfill(request.previewElement); 1071 }
1016 }
1017 } 1072 }
1018 var previewPromise; 1073 var previewPromise;
1019 if (request.previewElement) 1074 if (request.previewElement)
1020 previewPromise = Promise.resolve(request.previewElement); 1075 previewPromise = Promise.resolve(request.previewElement);
1021 else 1076 else
1022 previewPromise = request.url && target ? new Promise(action) : Promise.r esolve(null); 1077 previewPromise = request.url && target ? new Promise(action) : Promise.res olve(null);
1023 /** 1078 /**
1024 * @param {?Element} element 1079 * @param {?Element} element
1025 * @return {!DocumentFragment} 1080 * @return {!DocumentFragment}
1026 */ 1081 */
1027 function appendPreview(element) 1082 function appendPreview(element) {
1028 { 1083 if (element)
1029 if (element) 1084 contentHelper.appendElementRow(WebInspector.UIString('Preview'), request .previewElement);
1030 contentHelper.appendElementRow(WebInspector.UIString("Preview"), req uest.previewElement); 1085 return contentHelper.fragment;
1031 return contentHelper.fragment;
1032 } 1086 }
1033 return previewPromise.then(appendPreview); 1087 return previewPromise.then(appendPreview);
1034 }; 1088 }
1035 1089
1036 /** 1090 /**
1037 * @param {!Array<!RuntimeAgent.CallFrame>} callFrames 1091 * @param {!Array<!RuntimeAgent.CallFrame>} callFrames
1038 * @return {!RuntimeAgent.StackTrace} 1092 * @return {!RuntimeAgent.StackTrace}
1039 */ 1093 */
1040 WebInspector.TimelineUIUtils._stackTraceFromCallFrames = function(callFrames) 1094 static _stackTraceFromCallFrames(callFrames) {
1041 { 1095 return /** @type {!RuntimeAgent.StackTrace} */ ({callFrames: callFrames});
1042 return /** @type {!RuntimeAgent.StackTrace} */ ({ callFrames: callFrames }); 1096 }
1043 };
1044 1097
1045 /** 1098 /**
1046 * @param {!WebInspector.TracingModel.Event} event 1099 * @param {!WebInspector.TracingModel.Event} event
1047 * @param {?WebInspector.Target} target 1100 * @param {?WebInspector.Target} target
1048 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap 1101 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap
1049 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper 1102 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper
1050 */ 1103 */
1051 WebInspector.TimelineUIUtils._generateCauses = function(event, target, relatedNo desMap, contentHelper) 1104 static _generateCauses(event, target, relatedNodesMap, contentHelper) {
1052 {
1053 var recordTypes = WebInspector.TimelineModel.RecordType; 1105 var recordTypes = WebInspector.TimelineModel.RecordType;
1054 1106
1055 var callSiteStackLabel; 1107 var callSiteStackLabel;
1056 var stackLabel; 1108 var stackLabel;
1057 var initiator = event.initiator; 1109 var initiator = event.initiator;
1058 1110
1059 switch (event.name) { 1111 switch (event.name) {
1060 case recordTypes.TimerFire: 1112 case recordTypes.TimerFire:
1061 callSiteStackLabel = WebInspector.UIString("Timer Installed"); 1113 callSiteStackLabel = WebInspector.UIString('Timer Installed');
1062 break; 1114 break;
1063 case recordTypes.FireAnimationFrame: 1115 case recordTypes.FireAnimationFrame:
1064 callSiteStackLabel = WebInspector.UIString("Animation Frame Requested"); 1116 callSiteStackLabel = WebInspector.UIString('Animation Frame Requested');
1065 break; 1117 break;
1066 case recordTypes.FireIdleCallback: 1118 case recordTypes.FireIdleCallback:
1067 callSiteStackLabel = WebInspector.UIString("Idle Callback Requested"); 1119 callSiteStackLabel = WebInspector.UIString('Idle Callback Requested');
1068 break; 1120 break;
1069 case recordTypes.UpdateLayoutTree: 1121 case recordTypes.UpdateLayoutTree:
1070 case recordTypes.RecalculateStyles: 1122 case recordTypes.RecalculateStyles:
1071 stackLabel = WebInspector.UIString("Recalculation Forced"); 1123 stackLabel = WebInspector.UIString('Recalculation Forced');
1072 break; 1124 break;
1073 case recordTypes.Layout: 1125 case recordTypes.Layout:
1074 callSiteStackLabel = WebInspector.UIString("First Layout Invalidation"); 1126 callSiteStackLabel = WebInspector.UIString('First Layout Invalidation');
1075 stackLabel = WebInspector.UIString("Layout Forced"); 1127 stackLabel = WebInspector.UIString('Layout Forced');
1076 break; 1128 break;
1077 } 1129 }
1078 1130
1079 // Direct cause. 1131 // Direct cause.
1080 if (event.stackTrace && event.stackTrace.length) { 1132 if (event.stackTrace && event.stackTrace.length) {
1081 contentHelper.addSection(WebInspector.UIString("Call Stacks")); 1133 contentHelper.addSection(WebInspector.UIString('Call Stacks'));
1082 contentHelper.appendStackTrace(stackLabel || WebInspector.UIString("Stac k Trace"), WebInspector.TimelineUIUtils._stackTraceFromCallFrames(event.stackTra ce)); 1134 contentHelper.appendStackTrace(
1135 stackLabel || WebInspector.UIString('Stack Trace'),
1136 WebInspector.TimelineUIUtils._stackTraceFromCallFrames(event.stackTrac e));
1083 } 1137 }
1084 1138
1085 // Indirect causes. 1139 // Indirect causes.
1086 if (event.invalidationTrackingEvents && target) { // Full invalidation track ing (experimental). 1140 if (event.invalidationTrackingEvents && target) { // Full invalidation trac king (experimental).
1087 contentHelper.addSection(WebInspector.UIString("Invalidations")); 1141 contentHelper.addSection(WebInspector.UIString('Invalidations'));
1088 WebInspector.TimelineUIUtils._generateInvalidations(event, target, relat edNodesMap, contentHelper); 1142 WebInspector.TimelineUIUtils._generateInvalidations(event, target, related NodesMap, contentHelper);
1089 } else if (initiator && initiator.stackTrace) { // Partial invalidation trac king. 1143 } else if (initiator && initiator.stackTrace) { // Partial invalidation tra cking.
1090 contentHelper.appendStackTrace(callSiteStackLabel || WebInspector.UIStri ng("First Invalidated"), WebInspector.TimelineUIUtils._stackTraceFromCallFrames( initiator.stackTrace)); 1144 contentHelper.appendStackTrace(
1145 callSiteStackLabel || WebInspector.UIString('First Invalidated'),
1146 WebInspector.TimelineUIUtils._stackTraceFromCallFrames(initiator.stack Trace));
1091 } 1147 }
1092 }; 1148 }
1093 1149
1094 /** 1150 /**
1095 * @param {!WebInspector.TracingModel.Event} event 1151 * @param {!WebInspector.TracingModel.Event} event
1096 * @param {!WebInspector.Target} target 1152 * @param {!WebInspector.Target} target
1097 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap 1153 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap
1098 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper 1154 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper
1099 */ 1155 */
1100 WebInspector.TimelineUIUtils._generateInvalidations = function(event, target, re latedNodesMap, contentHelper) 1156 static _generateInvalidations(event, target, relatedNodesMap, contentHelper) {
1101 {
1102 if (!event.invalidationTrackingEvents) 1157 if (!event.invalidationTrackingEvents)
1103 return; 1158 return;
1104 1159
1105 var invalidations = {}; 1160 var invalidations = {};
1106 event.invalidationTrackingEvents.forEach(function(invalidation) { 1161 event.invalidationTrackingEvents.forEach(function(invalidation) {
1107 if (!invalidations[invalidation.type]) 1162 if (!invalidations[invalidation.type])
1108 invalidations[invalidation.type] = [invalidation]; 1163 invalidations[invalidation.type] = [invalidation];
1109 else 1164 else
1110 invalidations[invalidation.type].push(invalidation); 1165 invalidations[invalidation.type].push(invalidation);
1111 }); 1166 });
1112 1167
1113 Object.keys(invalidations).forEach(function(type) { 1168 Object.keys(invalidations).forEach(function(type) {
1114 WebInspector.TimelineUIUtils._generateInvalidationsForType( 1169 WebInspector.TimelineUIUtils._generateInvalidationsForType(
1115 type, target, invalidations[type], relatedNodesMap, contentHelper); 1170 type, target, invalidations[type], relatedNodesMap, contentHelper);
1116 }); 1171 });
1117 }; 1172 }
1118 1173
1119 /** 1174 /**
1120 * @param {string} type 1175 * @param {string} type
1121 * @param {!WebInspector.Target} target 1176 * @param {!WebInspector.Target} target
1122 * @param {!Array.<!WebInspector.InvalidationTrackingEvent>} invalidations 1177 * @param {!Array.<!WebInspector.InvalidationTrackingEvent>} invalidations
1123 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap 1178 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap
1124 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper 1179 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper
1125 */ 1180 */
1126 WebInspector.TimelineUIUtils._generateInvalidationsForType = function(type, targ et, invalidations, relatedNodesMap, contentHelper) 1181 static _generateInvalidationsForType(type, target, invalidations, relatedNodes Map, contentHelper) {
1127 {
1128 var title; 1182 var title;
1129 switch (type) { 1183 switch (type) {
1130 case WebInspector.TimelineModel.RecordType.StyleRecalcInvalidationTracking: 1184 case WebInspector.TimelineModel.RecordType.StyleRecalcInvalidationTracking :
1131 title = WebInspector.UIString("Style Invalidations"); 1185 title = WebInspector.UIString('Style Invalidations');
1132 break; 1186 break;
1133 case WebInspector.TimelineModel.RecordType.LayoutInvalidationTracking: 1187 case WebInspector.TimelineModel.RecordType.LayoutInvalidationTracking:
1134 title = WebInspector.UIString("Layout Invalidations"); 1188 title = WebInspector.UIString('Layout Invalidations');
1135 break; 1189 break;
1136 default: 1190 default:
1137 title = WebInspector.UIString("Other Invalidations"); 1191 title = WebInspector.UIString('Other Invalidations');
1138 break; 1192 break;
1139 } 1193 }
1140 1194
1141 var invalidationsTreeOutline = new TreeOutlineInShadow(); 1195 var invalidationsTreeOutline = new TreeOutlineInShadow();
1142 invalidationsTreeOutline.registerRequiredCSS("timeline/invalidationsTree.css "); 1196 invalidationsTreeOutline.registerRequiredCSS('timeline/invalidationsTree.css ');
1143 invalidationsTreeOutline.element.classList.add("invalidations-tree"); 1197 invalidationsTreeOutline.element.classList.add('invalidations-tree');
1144 1198
1145 var invalidationGroups = groupInvalidationsByCause(invalidations); 1199 var invalidationGroups = groupInvalidationsByCause(invalidations);
1146 invalidationGroups.forEach(function(group) { 1200 invalidationGroups.forEach(function(group) {
1147 var groupElement = new WebInspector.TimelineUIUtils.InvalidationsGroupEl ement(target, relatedNodesMap, contentHelper, group); 1201 var groupElement =
1148 invalidationsTreeOutline.appendChild(groupElement); 1202 new WebInspector.TimelineUIUtils.InvalidationsGroupElement(target, rel atedNodesMap, contentHelper, group);
1203 invalidationsTreeOutline.appendChild(groupElement);
1149 }); 1204 });
1150 contentHelper.appendElementRow(title, invalidationsTreeOutline.element, fals e, true); 1205 contentHelper.appendElementRow(title, invalidationsTreeOutline.element, fals e, true);
1151 1206
1152 /** 1207 /**
1153 * @param {!Array<!WebInspector.InvalidationTrackingEvent>} invalidations 1208 * @param {!Array<!WebInspector.InvalidationTrackingEvent>} invalidations
1154 * @return {!Array<!Array<!WebInspector.InvalidationTrackingEvent>>} 1209 * @return {!Array<!Array<!WebInspector.InvalidationTrackingEvent>>}
1155 */ 1210 */
1156 function groupInvalidationsByCause(invalidations) 1211 function groupInvalidationsByCause(invalidations) {
1157 { 1212 /** @type {!Map<string, !Array<!WebInspector.InvalidationTrackingEvent>>} */
1158 /** @type {!Map<string, !Array<!WebInspector.InvalidationTrackingEvent>> } */ 1213 var causeToInvalidationMap = new Map();
1159 var causeToInvalidationMap = new Map(); 1214 for (var index = 0; index < invalidations.length; index++) {
1160 for (var index = 0; index < invalidations.length; index++) { 1215 var invalidation = invalidations[index];
1161 var invalidation = invalidations[index]; 1216 var causeKey = '';
1162 var causeKey = ""; 1217 if (invalidation.cause.reason)
1163 if (invalidation.cause.reason) 1218 causeKey += invalidation.cause.reason + '.';
1164 causeKey += invalidation.cause.reason + "."; 1219 if (invalidation.cause.stackTrace) {
1165 if (invalidation.cause.stackTrace) { 1220 invalidation.cause.stackTrace.forEach(function(stackFrame) {
1166 invalidation.cause.stackTrace.forEach(function(stackFrame) { 1221 causeKey += stackFrame['functionName'] + '.';
1167 causeKey += stackFrame["functionName"] + "."; 1222 causeKey += stackFrame['scriptId'] + '.';
1168 causeKey += stackFrame["scriptId"] + "."; 1223 causeKey += stackFrame['url'] + '.';
1169 causeKey += stackFrame["url"] + "."; 1224 causeKey += stackFrame['lineNumber'] + '.';
1170 causeKey += stackFrame["lineNumber"] + "."; 1225 causeKey += stackFrame['columnNumber'] + '.';
1171 causeKey += stackFrame["columnNumber"] + "."; 1226 });
1172 });
1173 }
1174
1175 if (causeToInvalidationMap.has(causeKey))
1176 causeToInvalidationMap.get(causeKey).push(invalidation);
1177 else
1178 causeToInvalidationMap.set(causeKey, [ invalidation ]);
1179 } 1227 }
1180 return causeToInvalidationMap.valuesArray(); 1228
1181 } 1229 if (causeToInvalidationMap.has(causeKey))
1182 }; 1230 causeToInvalidationMap.get(causeKey).push(invalidation);
1183 1231 else
1184 /** 1232 causeToInvalidationMap.set(causeKey, [invalidation]);
1185 * @param {!Set<number>} nodeIds 1233 }
1186 * @param {!WebInspector.InvalidationTrackingEvent} invalidations 1234 return causeToInvalidationMap.valuesArray();
1187 */ 1235 }
1188 WebInspector.TimelineUIUtils._collectInvalidationNodeIds = function(nodeIds, inv alidations) 1236 }
1189 { 1237
1238 /**
1239 * @param {!Set<number>} nodeIds
1240 * @param {!WebInspector.InvalidationTrackingEvent} invalidations
1241 */
1242 static _collectInvalidationNodeIds(nodeIds, invalidations) {
1190 for (var i = 0; i < invalidations.length; ++i) { 1243 for (var i = 0; i < invalidations.length; ++i) {
1191 if (invalidations[i].nodeId) 1244 if (invalidations[i].nodeId)
1192 nodeIds.add(invalidations[i].nodeId); 1245 nodeIds.add(invalidations[i].nodeId);
1193 } 1246 }
1194 }; 1247 }
1195 1248
1196 /** 1249 /**
1197 * @constructor 1250 * @param {!Object} total
1198 * @param {!WebInspector.Target} target 1251 * @param {!WebInspector.TimelineModel} model
1199 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap 1252 * @param {!WebInspector.TracingModel.Event} event
1200 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper 1253 * @return {boolean}
1201 * @param {!Array.<!WebInspector.InvalidationTrackingEvent>} invalidations 1254 */
1202 * @extends {TreeElement} 1255 static _aggregatedStatsForTraceEvent(total, model, event) {
1203 */
1204 WebInspector.TimelineUIUtils.InvalidationsGroupElement = function(target, relate dNodesMap, contentHelper, invalidations)
1205 {
1206 TreeElement.call(this, "", true);
1207
1208 this.listItemElement.classList.add("header");
1209 this.selectable = false;
1210 this.toggleOnClick = true;
1211
1212 this._relatedNodesMap = relatedNodesMap;
1213 this._contentHelper = contentHelper;
1214 this._invalidations = invalidations;
1215 this.title = this._createTitle(target);
1216 };
1217
1218 WebInspector.TimelineUIUtils.InvalidationsGroupElement.prototype = {
1219
1220 /**
1221 * @param {!WebInspector.Target} target
1222 * @return {!Element}
1223 */
1224 _createTitle: function(target)
1225 {
1226 var first = this._invalidations[0];
1227 var reason = first.cause.reason;
1228 var topFrame = first.cause.stackTrace && first.cause.stackTrace[0];
1229
1230 var title = createElement("span");
1231 if (reason)
1232 title.createTextChild(WebInspector.UIString("%s for ", reason));
1233 else
1234 title.createTextChild(WebInspector.UIString("Unknown cause for "));
1235
1236 this._appendTruncatedNodeList(title, this._invalidations);
1237
1238 if (topFrame && this._contentHelper.linkifier()) {
1239 title.createTextChild(WebInspector.UIString(". "));
1240 var stack = title.createChild("span", "monospace");
1241 stack.createChild("span").textContent = WebInspector.beautifyFunctio nName(topFrame.functionName);
1242 var link = this._contentHelper.linkifier().maybeLinkifyConsoleCallFr ame(target, topFrame);
1243 if (link) {
1244 stack.createChild("span").textContent = " @ ";
1245 stack.createChild("span").appendChild(link);
1246 }
1247 }
1248
1249 return title;
1250 },
1251
1252 /**
1253 * @override
1254 */
1255 onpopulate: function()
1256 {
1257 var content = createElementWithClass("div", "content");
1258
1259 var first = this._invalidations[0];
1260 if (first.cause.stackTrace) {
1261 var stack = content.createChild("div");
1262 stack.createTextChild(WebInspector.UIString("Stack trace:"));
1263 this._contentHelper.createChildStackTraceElement(stack, WebInspector .TimelineUIUtils._stackTraceFromCallFrames(first.cause.stackTrace));
1264 }
1265
1266 content.createTextChild(this._invalidations.length > 1 ? WebInspector.UI String("Nodes:") : WebInspector.UIString("Node:"));
1267 var nodeList = content.createChild("div", "node-list");
1268 var firstNode = true;
1269 for (var i = 0; i < this._invalidations.length; i++) {
1270 var invalidation = this._invalidations[i];
1271 var invalidationNode = this._createInvalidationNode(invalidation, tr ue);
1272 if (invalidationNode) {
1273 if (!firstNode)
1274 nodeList.createTextChild(WebInspector.UIString(", "));
1275 firstNode = false;
1276
1277 nodeList.appendChild(invalidationNode);
1278
1279 var extraData = invalidation.extraData ? ", " + invalidation.ext raData : "";
1280 if (invalidation.changedId)
1281 nodeList.createTextChild(WebInspector.UIString("(changed id to \"%s\"%s)", invalidation.changedId, extraData));
1282 else if (invalidation.changedClass)
1283 nodeList.createTextChild(WebInspector.UIString("(changed cla ss to \"%s\"%s)", invalidation.changedClass, extraData));
1284 else if (invalidation.changedAttribute)
1285 nodeList.createTextChild(WebInspector.UIString("(changed att ribute to \"%s\"%s)", invalidation.changedAttribute, extraData));
1286 else if (invalidation.changedPseudo)
1287 nodeList.createTextChild(WebInspector.UIString("(changed pes udo to \"%s\"%s)", invalidation.changedPseudo, extraData));
1288 else if (invalidation.selectorPart)
1289 nodeList.createTextChild(WebInspector.UIString("(changed \"% s\"%s)", invalidation.selectorPart, extraData));
1290 }
1291 }
1292
1293 var contentTreeElement = new TreeElement(content, false);
1294 contentTreeElement.selectable = false;
1295 this.appendChild(contentTreeElement);
1296 },
1297
1298 /**
1299 * @param {!Element} parentElement
1300 * @param {!Array.<!WebInspector.InvalidationTrackingEvent>} invalidations
1301 */
1302 _appendTruncatedNodeList: function(parentElement, invalidations)
1303 {
1304 var invalidationNodes = [];
1305 var invalidationNodeIdMap = {};
1306 for (var i = 0; i < invalidations.length; i++) {
1307 var invalidation = invalidations[i];
1308 var invalidationNode = this._createInvalidationNode(invalidation, fa lse);
1309 invalidationNode.addEventListener("click", (e) => e.consume(), false );
1310 if (invalidationNode && !invalidationNodeIdMap[invalidation.nodeId]) {
1311 invalidationNodes.push(invalidationNode);
1312 invalidationNodeIdMap[invalidation.nodeId] = true;
1313 }
1314 }
1315
1316 if (invalidationNodes.length === 1) {
1317 parentElement.appendChild(invalidationNodes[0]);
1318 } else if (invalidationNodes.length === 2) {
1319 parentElement.appendChild(invalidationNodes[0]);
1320 parentElement.createTextChild(WebInspector.UIString(" and "));
1321 parentElement.appendChild(invalidationNodes[1]);
1322 } else if (invalidationNodes.length >= 3) {
1323 parentElement.appendChild(invalidationNodes[0]);
1324 parentElement.createTextChild(WebInspector.UIString(", "));
1325 parentElement.appendChild(invalidationNodes[1]);
1326 parentElement.createTextChild(WebInspector.UIString(", and %s others ", invalidationNodes.length - 2));
1327 }
1328 },
1329
1330 /**
1331 * @param {!WebInspector.InvalidationTrackingEvent} invalidation
1332 * @param {boolean} showUnknownNodes
1333 */
1334 _createInvalidationNode: function(invalidation, showUnknownNodes)
1335 {
1336 var node = (invalidation.nodeId && this._relatedNodesMap) ? this._relate dNodesMap.get(invalidation.nodeId) : null;
1337 if (node)
1338 return WebInspector.DOMPresentationUtils.linkifyNodeReference(node);
1339 if (invalidation.nodeName) {
1340 var nodeSpan = createElement("span");
1341 nodeSpan.textContent = WebInspector.UIString("[ %s ]", invalidation. nodeName);
1342 return nodeSpan;
1343 }
1344 if (showUnknownNodes) {
1345 var nodeSpan = createElement("span");
1346 return nodeSpan.createTextChild(WebInspector.UIString("[ unknown nod e ]"));
1347 }
1348 },
1349
1350 __proto__: TreeElement.prototype
1351 };
1352
1353 /**
1354 * @param {!Object} total
1355 * @param {!WebInspector.TimelineModel} model
1356 * @param {!WebInspector.TracingModel.Event} event
1357 * @return {boolean}
1358 */
1359 WebInspector.TimelineUIUtils._aggregatedStatsForTraceEvent = function(total, mod el, event)
1360 {
1361 var events = model.inspectedTargetEvents(); 1256 var events = model.inspectedTargetEvents();
1362 /** 1257 /**
1363 * @param {number} startTime 1258 * @param {number} startTime
1364 * @param {!WebInspector.TracingModel.Event} e 1259 * @param {!WebInspector.TracingModel.Event} e
1365 * @return {number} 1260 * @return {number}
1366 */ 1261 */
1367 function eventComparator(startTime, e) 1262 function eventComparator(startTime, e) {
1368 { 1263 return startTime - e.startTime;
1369 return startTime - e.startTime;
1370 } 1264 }
1371 var index = events.binaryIndexOf(event.startTime, eventComparator); 1265 var index = events.binaryIndexOf(event.startTime, eventComparator);
1372 // Not a main thread event? 1266 // Not a main thread event?
1373 if (index < 0) 1267 if (index < 0)
1374 return false; 1268 return false;
1375 var hasChildren = false; 1269 var hasChildren = false;
1376 var endTime = event.endTime; 1270 var endTime = event.endTime;
1377 if (endTime) { 1271 if (endTime) {
1378 for (var i = index; i < events.length; i++) { 1272 for (var i = index; i < events.length; i++) {
1379 var nextEvent = events[i]; 1273 var nextEvent = events[i];
1380 if (nextEvent.startTime >= endTime) 1274 if (nextEvent.startTime >= endTime)
1381 break; 1275 break;
1382 if (!nextEvent.selfTime) 1276 if (!nextEvent.selfTime)
1383 continue; 1277 continue;
1384 if (nextEvent.thread !== event.thread) 1278 if (nextEvent.thread !== event.thread)
1385 continue; 1279 continue;
1386 if (i > index) 1280 if (i > index)
1387 hasChildren = true; 1281 hasChildren = true;
1388 var categoryName = WebInspector.TimelineUIUtils.eventStyle(nextEvent ).category.name; 1282 var categoryName = WebInspector.TimelineUIUtils.eventStyle(nextEvent).ca tegory.name;
1389 total[categoryName] = (total[categoryName] || 0) + nextEvent.selfTim e; 1283 total[categoryName] = (total[categoryName] || 0) + nextEvent.selfTime;
1390 } 1284 }
1391 } 1285 }
1392 if (WebInspector.TracingModel.isAsyncPhase(event.phase)) { 1286 if (WebInspector.TracingModel.isAsyncPhase(event.phase)) {
1393 if (event.endTime) { 1287 if (event.endTime) {
1394 var aggregatedTotal = 0; 1288 var aggregatedTotal = 0;
1395 for (var categoryName in total) 1289 for (var categoryName in total)
1396 aggregatedTotal += total[categoryName]; 1290 aggregatedTotal += total[categoryName];
1397 total["idle"] = Math.max(0, event.endTime - event.startTime - aggreg atedTotal); 1291 total['idle'] = Math.max(0, event.endTime - event.startTime - aggregated Total);
1398 } 1292 }
1399 return false; 1293 return false;
1400 } 1294 }
1401 return hasChildren; 1295 return hasChildren;
1402 }; 1296 }
1403 1297
1404 /** 1298 /**
1405 * @param {!WebInspector.TracingModel.Event} event 1299 * @param {!WebInspector.TracingModel.Event} event
1406 * @param {!WebInspector.Target} target 1300 * @param {!WebInspector.Target} target
1407 * @param {function(!Element=)} callback 1301 * @param {function(!Element=)} callback
1408 */ 1302 */
1409 WebInspector.TimelineUIUtils.buildPicturePreviewContent = function(event, target , callback) 1303 static buildPicturePreviewContent(event, target, callback) {
1410 {
1411 new WebInspector.LayerPaintEvent(event, target).snapshotPromise().then(onSna pshotLoaded); 1304 new WebInspector.LayerPaintEvent(event, target).snapshotPromise().then(onSna pshotLoaded);
1412 /** 1305 /**
1413 * @param {?WebInspector.SnapshotWithRect} snapshotWithRect 1306 * @param {?WebInspector.SnapshotWithRect} snapshotWithRect
1414 */ 1307 */
1415 function onSnapshotLoaded(snapshotWithRect) 1308 function onSnapshotLoaded(snapshotWithRect) {
1416 { 1309 if (!snapshotWithRect) {
1417 if (!snapshotWithRect) { 1310 callback();
1418 callback(); 1311 return;
1419 return; 1312 }
1420 } 1313 snapshotWithRect.snapshot.replay(null, null, 1).then(imageURL => onGotImag e(imageURL));
1421 snapshotWithRect.snapshot.replay(null, null, 1).then(imageURL => onGotIm age(imageURL)); 1314 snapshotWithRect.snapshot.release();
1422 snapshotWithRect.snapshot.release();
1423 } 1315 }
1424 1316
1425 /** 1317 /**
1426 * @param {?string} imageURL 1318 * @param {?string} imageURL
1427 */ 1319 */
1428 function onGotImage(imageURL) 1320 function onGotImage(imageURL) {
1429 { 1321 if (!imageURL) {
1430 if (!imageURL) { 1322 callback();
1431 callback(); 1323 return;
1432 return; 1324 }
1433 } 1325 var container = createElement('div');
1434 var container = createElement("div"); 1326 container.classList.add('image-preview-container', 'vbox', 'link');
1435 container.classList.add("image-preview-container", "vbox", "link"); 1327 var img = container.createChild('img');
1436 var img = container.createChild("img"); 1328 img.src = imageURL;
1437 img.src = imageURL; 1329 var paintProfilerButton = container.createChild('a');
1438 var paintProfilerButton = container.createChild("a"); 1330 paintProfilerButton.textContent = WebInspector.UIString('Paint Profiler');
1439 paintProfilerButton.textContent = WebInspector.UIString("Paint Profiler" ); 1331 container.addEventListener('click', showPaintProfiler, false);
1440 container.addEventListener("click", showPaintProfiler, false); 1332 callback(container);
1441 callback(container); 1333 }
1442 } 1334
1443 1335 function showPaintProfiler() {
1444 function showPaintProfiler() 1336 WebInspector.TimelinePanel.instance().select(
1445 { 1337 WebInspector.TimelineSelection.fromTraceEvent(event), WebInspector.Tim elinePanel.DetailsTab.PaintProfiler);
1446 WebInspector.TimelinePanel.instance().select(WebInspector.TimelineSelect ion.fromTraceEvent(event), WebInspector.TimelinePanel.DetailsTab.PaintProfiler); 1338 }
1447 } 1339 }
1448 }; 1340
1449 1341 /**
1450 /** 1342 * @param {!WebInspector.TimelineModel.RecordType} recordType
1451 * @param {!WebInspector.TimelineModel.RecordType} recordType 1343 * @param {?string} title
1452 * @param {?string} title 1344 * @param {number} position
1453 * @param {number} position 1345 * @return {!Element}
1454 * @return {!Element} 1346 */
1455 */ 1347 static createEventDivider(recordType, title, position) {
1456 WebInspector.TimelineUIUtils.createEventDivider = function(recordType, title, po sition) 1348 var eventDivider = createElement('div');
1457 { 1349 eventDivider.className = 'resources-event-divider';
1458 var eventDivider = createElement("div");
1459 eventDivider.className = "resources-event-divider";
1460 var recordTypes = WebInspector.TimelineModel.RecordType; 1350 var recordTypes = WebInspector.TimelineModel.RecordType;
1461 1351
1462 if (recordType === recordTypes.MarkDOMContent) 1352 if (recordType === recordTypes.MarkDOMContent)
1463 eventDivider.className += " resources-blue-divider"; 1353 eventDivider.className += ' resources-blue-divider';
1464 else if (recordType === recordTypes.MarkLoad) 1354 else if (recordType === recordTypes.MarkLoad)
1465 eventDivider.className += " resources-red-divider"; 1355 eventDivider.className += ' resources-red-divider';
1466 else if (recordType === recordTypes.MarkFirstPaint) 1356 else if (recordType === recordTypes.MarkFirstPaint)
1467 eventDivider.className += " resources-green-divider"; 1357 eventDivider.className += ' resources-green-divider';
1468 else if (recordType === recordTypes.TimeStamp || recordType === recordTypes. ConsoleTime || recordType === recordTypes.UserTiming) 1358 else if (
1469 eventDivider.className += " resources-orange-divider"; 1359 recordType === recordTypes.TimeStamp || recordType === recordTypes.Conso leTime ||
1360 recordType === recordTypes.UserTiming)
1361 eventDivider.className += ' resources-orange-divider';
1470 else if (recordType === recordTypes.BeginFrame) 1362 else if (recordType === recordTypes.BeginFrame)
1471 eventDivider.className += " timeline-frame-divider"; 1363 eventDivider.className += ' timeline-frame-divider';
1472 1364
1473 if (title) 1365 if (title)
1474 eventDivider.title = title; 1366 eventDivider.title = title;
1475 eventDivider.style.left = position + "px"; 1367 eventDivider.style.left = position + 'px';
1476 return eventDivider; 1368 return eventDivider;
1477 }; 1369 }
1478 1370
1479 /** 1371 /**
1480 * @param {!WebInspector.TimelineModel.Record} record 1372 * @param {!WebInspector.TimelineModel.Record} record
1481 * @param {number} zeroTime 1373 * @param {number} zeroTime
1482 * @param {number} position 1374 * @param {number} position
1483 * @return {!Element} 1375 * @return {!Element}
1484 */ 1376 */
1485 WebInspector.TimelineUIUtils.createDividerForRecord = function(record, zeroTime, position) 1377 static createDividerForRecord(record, zeroTime, position) {
1486 {
1487 var startTime = Number.millisToString(record.startTime() - zeroTime); 1378 var startTime = Number.millisToString(record.startTime() - zeroTime);
1488 var title = WebInspector.UIString("%s at %s", WebInspector.TimelineUIUtils.e ventTitle(record.traceEvent()), startTime); 1379 var title =
1380 WebInspector.UIString('%s at %s', WebInspector.TimelineUIUtils.eventTitl e(record.traceEvent()), startTime);
1489 return WebInspector.TimelineUIUtils.createEventDivider(record.type(), title, position); 1381 return WebInspector.TimelineUIUtils.createEventDivider(record.type(), title, position);
1490 }; 1382 }
1491 1383
1492 /** 1384 /**
1493 * @return {!Array.<string>} 1385 * @return {!Array.<string>}
1494 */ 1386 */
1495 WebInspector.TimelineUIUtils._visibleTypes = function() 1387 static _visibleTypes() {
1496 {
1497 var eventStyles = WebInspector.TimelineUIUtils._initEventStyles(); 1388 var eventStyles = WebInspector.TimelineUIUtils._initEventStyles();
1498 var result = []; 1389 var result = [];
1499 for (var name in eventStyles) { 1390 for (var name in eventStyles) {
1500 if (!eventStyles[name].hidden) 1391 if (!eventStyles[name].hidden)
1501 result.push(name); 1392 result.push(name);
1502 } 1393 }
1503 return result; 1394 return result;
1504 }; 1395 }
1505 1396
1506 /** 1397 /**
1507 * @return {!WebInspector.TimelineModel.Filter} 1398 * @return {!WebInspector.TimelineModel.Filter}
1508 */ 1399 */
1509 WebInspector.TimelineUIUtils.visibleEventsFilter = function() 1400 static visibleEventsFilter() {
1510 {
1511 return new WebInspector.TimelineVisibleEventsFilter(WebInspector.TimelineUIU tils._visibleTypes()); 1401 return new WebInspector.TimelineVisibleEventsFilter(WebInspector.TimelineUIU tils._visibleTypes());
1512 }; 1402 }
1513 1403
1514 /** 1404 /**
1515 * @return {!Object.<string, !WebInspector.TimelineCategory>} 1405 * @return {!Object.<string, !WebInspector.TimelineCategory>}
1516 */ 1406 */
1517 WebInspector.TimelineUIUtils.categories = function() 1407 static categories() {
1518 {
1519 if (WebInspector.TimelineUIUtils._categories) 1408 if (WebInspector.TimelineUIUtils._categories)
1520 return WebInspector.TimelineUIUtils._categories; 1409 return WebInspector.TimelineUIUtils._categories;
1521 WebInspector.TimelineUIUtils._categories = { 1410 WebInspector.TimelineUIUtils._categories = {
1522 loading: new WebInspector.TimelineCategory("loading", WebInspector.UIStr ing("Loading"), true, "hsl(214, 67%, 74%)", "hsl(214, 67%, 66%)"), 1411 loading: new WebInspector.TimelineCategory(
1523 scripting: new WebInspector.TimelineCategory("scripting", WebInspector.U IString("Scripting"), true, "hsl(43, 83%, 72%)", "hsl(43, 83%, 64%) "), 1412 'loading', WebInspector.UIString('Loading'), true, 'hsl(214, 67%, 74%) ', 'hsl(214, 67%, 66%)'),
1524 rendering: new WebInspector.TimelineCategory("rendering", WebInspector.U IString("Rendering"), true, "hsl(256, 67%, 76%)", "hsl(256, 67%, 70%)"), 1413 scripting: new WebInspector.TimelineCategory(
1525 painting: new WebInspector.TimelineCategory("painting", WebInspector.UIS tring("Painting"), true, "hsl(109, 33%, 64%)", "hsl(109, 33%, 55%)"), 1414 'scripting', WebInspector.UIString('Scripting'), true, 'hsl(43, 83%, 7 2%)', 'hsl(43, 83%, 64%) '),
1526 gpu: new WebInspector.TimelineCategory("gpu", WebInspector.UIString("GPU "), false, "hsl(109, 33%, 64%)", "hsl(109, 33%, 55%)"), 1415 rendering: new WebInspector.TimelineCategory(
1527 other: new WebInspector.TimelineCategory("other", WebInspector.UIString( "Other"), false, "hsl(0, 0%, 87%)", "hsl(0, 0%, 79%)"), 1416 'rendering', WebInspector.UIString('Rendering'), true, 'hsl(256, 67%, 76%)', 'hsl(256, 67%, 70%)'),
1528 idle: new WebInspector.TimelineCategory("idle", WebInspector.UIString("I dle"), false, "hsl(0, 100%, 100%)", "hsl(0, 100%, 100%)") 1417 painting: new WebInspector.TimelineCategory(
1418 'painting', WebInspector.UIString('Painting'), true, 'hsl(109, 33%, 64 %)', 'hsl(109, 33%, 55%)'),
1419 gpu: new WebInspector.TimelineCategory(
1420 'gpu', WebInspector.UIString('GPU'), false, 'hsl(109, 33%, 64%)', 'hsl (109, 33%, 55%)'),
1421 other: new WebInspector.TimelineCategory(
1422 'other', WebInspector.UIString('Other'), false, 'hsl(0, 0%, 87%)', 'hs l(0, 0%, 79%)'),
1423 idle: new WebInspector.TimelineCategory(
1424 'idle', WebInspector.UIString('Idle'), false, 'hsl(0, 100%, 100%)', 'h sl(0, 100%, 100%)')
1529 }; 1425 };
1530 return WebInspector.TimelineUIUtils._categories; 1426 return WebInspector.TimelineUIUtils._categories;
1531 }; 1427 }
1532 1428
1533 /** 1429 /**
1534 * @param {!WebInspector.TimelineModel.AsyncEventGroup} group 1430 * @param {!WebInspector.TimelineModel.AsyncEventGroup} group
1535 * @return {string} 1431 * @return {string}
1536 */ 1432 */
1537 WebInspector.TimelineUIUtils.titleForAsyncEventGroup = function(group) 1433 static titleForAsyncEventGroup(group) {
1538 {
1539 if (!WebInspector.TimelineUIUtils._titleForAsyncEventGroupMap) { 1434 if (!WebInspector.TimelineUIUtils._titleForAsyncEventGroupMap) {
1540 var groups = WebInspector.TimelineModel.AsyncEventGroup; 1435 var groups = WebInspector.TimelineModel.AsyncEventGroup;
1541 WebInspector.TimelineUIUtils._titleForAsyncEventGroupMap = new Map([ 1436 WebInspector.TimelineUIUtils._titleForAsyncEventGroupMap = new Map([
1542 [groups.animation, WebInspector.UIString("Animation")], 1437 [groups.animation, WebInspector.UIString('Animation')], [groups.console, WebInspector.UIString('Console')],
1543 [groups.console, WebInspector.UIString("Console")], 1438 [groups.userTiming, WebInspector.UIString('User Timing')], [groups.input , WebInspector.UIString('Input')]
1544 [groups.userTiming, WebInspector.UIString("User Timing")], 1439 ]);
1545 [groups.input, WebInspector.UIString("Input")] 1440 }
1546 ]); 1441 return WebInspector.TimelineUIUtils._titleForAsyncEventGroupMap.get(group) | | '';
1547 } 1442 }
1548 return WebInspector.TimelineUIUtils._titleForAsyncEventGroupMap.get(group) | | ""; 1443
1549 }; 1444 /**
1550 1445 * @param {!Object} aggregatedStats
1551 /** 1446 * @param {!WebInspector.TimelineCategory=} selfCategory
1552 * @param {!Object} aggregatedStats 1447 * @param {number=} selfTime
1553 * @param {!WebInspector.TimelineCategory=} selfCategory 1448 * @return {!Element}
1554 * @param {number=} selfTime 1449 */
1555 * @return {!Element} 1450 static generatePieChart(aggregatedStats, selfCategory, selfTime) {
1556 */
1557 WebInspector.TimelineUIUtils.generatePieChart = function(aggregatedStats, selfCa tegory, selfTime)
1558 {
1559 var total = 0; 1451 var total = 0;
1560 for (var categoryName in aggregatedStats) 1452 for (var categoryName in aggregatedStats)
1561 total += aggregatedStats[categoryName]; 1453 total += aggregatedStats[categoryName];
1562 1454
1563 var element = createElementWithClass("div", "timeline-details-view-pie-chart -wrapper hbox"); 1455 var element = createElementWithClass('div', 'timeline-details-view-pie-chart -wrapper hbox');
1564 var pieChart = new WebInspector.PieChart(100); 1456 var pieChart = new WebInspector.PieChart(100);
1565 pieChart.element.classList.add("timeline-details-view-pie-chart"); 1457 pieChart.element.classList.add('timeline-details-view-pie-chart');
1566 pieChart.setTotal(total); 1458 pieChart.setTotal(total);
1567 var pieChartContainer = element.createChild("div", "vbox"); 1459 var pieChartContainer = element.createChild('div', 'vbox');
1568 pieChartContainer.appendChild(pieChart.element); 1460 pieChartContainer.appendChild(pieChart.element);
1569 pieChartContainer.createChild("div", "timeline-details-view-pie-chart-total" ).textContent = WebInspector.UIString("Total: %s", Number.millisToString(total, true)); 1461 pieChartContainer.createChild('div', 'timeline-details-view-pie-chart-total' ).textContent =
1570 var footerElement = element.createChild("div", "timeline-aggregated-info-leg end"); 1462 WebInspector.UIString('Total: %s', Number.millisToString(total, true));
1463 var footerElement = element.createChild('div', 'timeline-aggregated-info-leg end');
1571 1464
1572 /** 1465 /**
1573 * @param {string} name 1466 * @param {string} name
1574 * @param {string} title 1467 * @param {string} title
1575 * @param {number} value 1468 * @param {number} value
1576 * @param {string} color 1469 * @param {string} color
1577 */ 1470 */
1578 function appendLegendRow(name, title, value, color) 1471 function appendLegendRow(name, title, value, color) {
1579 { 1472 if (!value)
1580 if (!value) 1473 return;
1581 return; 1474 pieChart.addSlice(value, color);
1582 pieChart.addSlice(value, color); 1475 var rowElement = footerElement.createChild('div');
1583 var rowElement = footerElement.createChild("div"); 1476 rowElement.createChild('span', 'timeline-aggregated-legend-value').textCon tent =
1584 rowElement.createChild("span", "timeline-aggregated-legend-value").textC ontent = Number.preciseMillisToString(value, 1); 1477 Number.preciseMillisToString(value, 1);
1585 rowElement.createChild("span", "timeline-aggregated-legend-swatch").styl e.backgroundColor = color; 1478 rowElement.createChild('span', 'timeline-aggregated-legend-swatch').style. backgroundColor = color;
1586 rowElement.createChild("span", "timeline-aggregated-legend-title").textC ontent = title; 1479 rowElement.createChild('span', 'timeline-aggregated-legend-title').textCon tent = title;
1587 } 1480 }
1588 1481
1589 // In case of self time, first add self, then children of the same category. 1482 // In case of self time, first add self, then children of the same category.
1590 if (selfCategory) { 1483 if (selfCategory) {
1591 if (selfTime) 1484 if (selfTime)
1592 appendLegendRow(selfCategory.name, WebInspector.UIString("%s (self)" , selfCategory.title), selfTime, selfCategory.color); 1485 appendLegendRow(
1593 // Children of the same category. 1486 selfCategory.name, WebInspector.UIString('%s (self)', selfCategory.t itle), selfTime, selfCategory.color);
1594 var categoryTime = aggregatedStats[selfCategory.name]; 1487 // Children of the same category.
1595 var value = categoryTime - selfTime; 1488 var categoryTime = aggregatedStats[selfCategory.name];
1596 if (value > 0) 1489 var value = categoryTime - selfTime;
1597 appendLegendRow(selfCategory.name, WebInspector.UIString("%s (childr en)", selfCategory.title), value, selfCategory.childColor); 1490 if (value > 0)
1491 appendLegendRow(
1492 selfCategory.name, WebInspector.UIString('%s (children)', selfCatego ry.title), value,
1493 selfCategory.childColor);
1598 } 1494 }
1599 1495
1600 // Add other categories. 1496 // Add other categories.
1601 for (var categoryName in WebInspector.TimelineUIUtils.categories()) { 1497 for (var categoryName in WebInspector.TimelineUIUtils.categories()) {
1602 var category = WebInspector.TimelineUIUtils.categories()[categoryName]; 1498 var category = WebInspector.TimelineUIUtils.categories()[categoryName];
1603 if (category === selfCategory) 1499 if (category === selfCategory)
1604 continue; 1500 continue;
1605 appendLegendRow(category.name, category.title, aggregatedStats[category. name], category.childColor); 1501 appendLegendRow(category.name, category.title, aggregatedStats[category.na me], category.childColor);
1606 } 1502 }
1607 return element; 1503 return element;
1608 }; 1504 }
1609 1505
1610 /** 1506 /**
1611 * @param {!WebInspector.TimelineFrameModel} frameModel 1507 * @param {!WebInspector.TimelineFrameModel} frameModel
1612 * @param {!WebInspector.TimelineFrame} frame 1508 * @param {!WebInspector.TimelineFrame} frame
1613 * @param {?WebInspector.FilmStripModel.Frame} filmStripFrame 1509 * @param {?WebInspector.FilmStripModel.Frame} filmStripFrame
1614 * @return {!Element} 1510 * @return {!Element}
1615 */ 1511 */
1616 WebInspector.TimelineUIUtils.generateDetailsContentForFrame = function(frameMode l, frame, filmStripFrame) 1512 static generateDetailsContentForFrame(frameModel, frame, filmStripFrame) {
1617 {
1618 var pieChart = WebInspector.TimelineUIUtils.generatePieChart(frame.timeByCat egory); 1513 var pieChart = WebInspector.TimelineUIUtils.generatePieChart(frame.timeByCat egory);
1619 var contentHelper = new WebInspector.TimelineDetailsContentHelper(null, null ); 1514 var contentHelper = new WebInspector.TimelineDetailsContentHelper(null, null );
1620 contentHelper.addSection(WebInspector.UIString("Frame")); 1515 contentHelper.addSection(WebInspector.UIString('Frame'));
1621 1516
1622 var duration = WebInspector.TimelineUIUtils.frameDuration(frame); 1517 var duration = WebInspector.TimelineUIUtils.frameDuration(frame);
1623 contentHelper.appendElementRow(WebInspector.UIString("Duration"), duration, frame.hasWarnings()); 1518 contentHelper.appendElementRow(WebInspector.UIString('Duration'), duration, frame.hasWarnings());
1624 if (filmStripFrame) { 1519 if (filmStripFrame) {
1625 var filmStripPreview = createElementWithClass("img", "timeline-filmstrip -preview"); 1520 var filmStripPreview = createElementWithClass('img', 'timeline-filmstrip-p review');
1626 filmStripFrame.imageDataPromise().then(onGotImageData.bind(null, filmStr ipPreview)); 1521 filmStripFrame.imageDataPromise().then(onGotImageData.bind(null, filmStrip Preview));
1627 contentHelper.appendElementRow("", filmStripPreview); 1522 contentHelper.appendElementRow('', filmStripPreview);
1628 filmStripPreview.addEventListener("click", frameClicked.bind(null, filmS tripFrame), false); 1523 filmStripPreview.addEventListener('click', frameClicked.bind(null, filmStr ipFrame), false);
1629 } 1524 }
1630 var durationInMillis = frame.endTime - frame.startTime; 1525 var durationInMillis = frame.endTime - frame.startTime;
1631 contentHelper.appendTextRow(WebInspector.UIString("FPS"), Math.floor(1000 / durationInMillis)); 1526 contentHelper.appendTextRow(WebInspector.UIString('FPS'), Math.floor(1000 / durationInMillis));
1632 contentHelper.appendTextRow(WebInspector.UIString("CPU time"), Number.millis ToString(frame.cpuTime, true)); 1527 contentHelper.appendTextRow(WebInspector.UIString('CPU time'), Number.millis ToString(frame.cpuTime, true));
1633 1528
1634 if (Runtime.experiments.isEnabled("layersPanel") && frame.layerTree) { 1529 if (Runtime.experiments.isEnabled('layersPanel') && frame.layerTree) {
1635 contentHelper.appendElementRow(WebInspector.UIString("Layer tree"), 1530 contentHelper.appendElementRow(
1636 WebInspector.Linkifier.linkifyUsingReveal er(frame.layerTree, WebInspector.UIString("show"))); 1531 WebInspector.UIString('Layer tree'),
1532 WebInspector.Linkifier.linkifyUsingRevealer(frame.layerTree, WebInspec tor.UIString('show')));
1637 } 1533 }
1638 1534
1639 /** 1535 /**
1640 * @param {!Element} image 1536 * @param {!Element} image
1641 * @param {?string} data 1537 * @param {?string} data
1642 */ 1538 */
1643 function onGotImageData(image, data) 1539 function onGotImageData(image, data) {
1644 { 1540 if (data)
1645 if (data) 1541 image.src = 'data:image/jpg;base64,' + data;
1646 image.src = "data:image/jpg;base64," + data;
1647 } 1542 }
1648 1543
1649 /** 1544 /**
1650 * @param {!WebInspector.FilmStripModel.Frame} filmStripFrame 1545 * @param {!WebInspector.FilmStripModel.Frame} filmStripFrame
1651 */ 1546 */
1652 function frameClicked(filmStripFrame) 1547 function frameClicked(filmStripFrame) {
1653 { 1548 new WebInspector.FilmStripView.Dialog(filmStripFrame, 0);
1654 new WebInspector.FilmStripView.Dialog(filmStripFrame, 0);
1655 } 1549 }
1656 1550
1657 return contentHelper.fragment; 1551 return contentHelper.fragment;
1658 }; 1552 }
1659 1553
1660 /** 1554 /**
1661 * @param {!WebInspector.TimelineFrame} frame 1555 * @param {!WebInspector.TimelineFrame} frame
1662 * @return {!Element} 1556 * @return {!Element}
1663 */ 1557 */
1664 WebInspector.TimelineUIUtils.frameDuration = function(frame) 1558 static frameDuration(frame) {
1665 { 1559 var durationText = WebInspector.UIString(
1666 var durationText = WebInspector.UIString("%s (at %s)", Number.millisToString (frame.endTime - frame.startTime, true), 1560 '%s (at %s)', Number.millisToString(frame.endTime - frame.startTime, tru e),
1667 Number.millisToString(frame.startTimeOffset, true)); 1561 Number.millisToString(frame.startTimeOffset, true));
1668 var element = createElement("span"); 1562 var element = createElement('span');
1669 element.createTextChild(durationText); 1563 element.createTextChild(durationText);
1670 if (!frame.hasWarnings()) 1564 if (!frame.hasWarnings())
1671 return element; 1565 return element;
1672 element.createTextChild(WebInspector.UIString(". Long frame times are an ind ication of ")); 1566 element.createTextChild(WebInspector.UIString('. Long frame times are an ind ication of '));
1673 element.appendChild(WebInspector.linkifyURLAsNode("https://developers.google .com/web/fundamentals/performance/rendering/", 1567 element.appendChild(WebInspector.linkifyURLAsNode(
1674 WebInspector.UIString("jan k"), undefined, true)); 1568 'https://developers.google.com/web/fundamentals/performance/rendering/', WebInspector.UIString('jank'),
1675 element.createTextChild("."); 1569 undefined, true));
1570 element.createTextChild('.');
1676 return element; 1571 return element;
1677 }; 1572 }
1678 1573
1679 /** 1574 /**
1680 * @param {!CanvasRenderingContext2D} context 1575 * @param {!CanvasRenderingContext2D} context
1681 * @param {number} width 1576 * @param {number} width
1682 * @param {number} height 1577 * @param {number} height
1683 * @param {string} color0 1578 * @param {string} color0
1684 * @param {string} color1 1579 * @param {string} color1
1685 * @param {string} color2 1580 * @param {string} color2
1686 * @return {!CanvasGradient} 1581 * @return {!CanvasGradient}
1687 */ 1582 */
1688 WebInspector.TimelineUIUtils.createFillStyle = function(context, width, height, color0, color1, color2) 1583 static createFillStyle(context, width, height, color0, color1, color2) {
1689 {
1690 var gradient = context.createLinearGradient(0, 0, width, height); 1584 var gradient = context.createLinearGradient(0, 0, width, height);
1691 gradient.addColorStop(0, color0); 1585 gradient.addColorStop(0, color0);
1692 gradient.addColorStop(0.25, color1); 1586 gradient.addColorStop(0.25, color1);
1693 gradient.addColorStop(0.75, color1); 1587 gradient.addColorStop(0.75, color1);
1694 gradient.addColorStop(1, color2); 1588 gradient.addColorStop(1, color2);
1695 return gradient; 1589 return gradient;
1590 }
1591
1592 /**
1593 * @param {!Array.<number>} quad
1594 * @return {number}
1595 */
1596 static quadWidth(quad) {
1597 return Math.round(Math.sqrt(Math.pow(quad[0] - quad[2], 2) + Math.pow(quad[1 ] - quad[3], 2)));
1598 }
1599
1600 /**
1601 * @param {!Array.<number>} quad
1602 * @return {number}
1603 */
1604 static quadHeight(quad) {
1605 return Math.round(Math.sqrt(Math.pow(quad[0] - quad[6], 2) + Math.pow(quad[1 ] - quad[7], 2)));
1606 }
1607
1608 /**
1609 * @return {!Array.<!WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor> }
1610 */
1611 static eventDispatchDesciptors() {
1612 if (WebInspector.TimelineUIUtils._eventDispatchDesciptors)
1613 return WebInspector.TimelineUIUtils._eventDispatchDesciptors;
1614 var lightOrange = 'hsl(40,100%,80%)';
1615 var orange = 'hsl(40,100%,50%)';
1616 var green = 'hsl(90,100%,40%)';
1617 var purple = 'hsl(256,100%,75%)';
1618 WebInspector.TimelineUIUtils._eventDispatchDesciptors = [
1619 new WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor(
1620 1, lightOrange, ['mousemove', 'mouseenter', 'mouseleave', 'mouseout', 'mouseover']),
1621 new WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor(
1622 1, lightOrange, ['pointerover', 'pointerout', 'pointerenter', 'pointer leave', 'pointermove']),
1623 new WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor(2, green, ['w heel']),
1624 new WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor(3, orange, [' click', 'mousedown', 'mouseup']),
1625 new WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor(
1626 3, orange, ['touchstart', 'touchend', 'touchmove', 'touchcancel']),
1627 new WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor(
1628 3, orange, ['pointerdown', 'pointerup', 'pointercancel', 'gotpointerca pture', 'lostpointercapture']),
1629 new WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor(3, purple, [' keydown', 'keyup', 'keypress'])
1630 ];
1631 return WebInspector.TimelineUIUtils._eventDispatchDesciptors;
1632 }
1633
1634 /**
1635 * @param {!WebInspector.TracingModel.Event} event
1636 * @return {!WebInspector.TimelineMarkerStyle}
1637 */
1638 static markerStyleForEvent(event) {
1639 var red = 'rgb(255, 0, 0)';
1640 var blue = 'rgb(0, 0, 255)';
1641 var orange = 'rgb(255, 178, 23)';
1642 var green = 'rgb(0, 130, 0)';
1643 var tallMarkerDashStyle = [10, 5];
1644
1645 var title = WebInspector.TimelineUIUtils.eventTitle(event);
1646
1647 if (event.hasCategory(WebInspector.TimelineModel.Category.Console) ||
1648 event.hasCategory(WebInspector.TimelineModel.Category.UserTiming)) {
1649 return {
1650 title: title,
1651 dashStyle: tallMarkerDashStyle,
1652 lineWidth: 0.5,
1653 color: orange,
1654 tall: false,
1655 lowPriority: false,
1656 };
1657 }
1658 var recordTypes = WebInspector.TimelineModel.RecordType;
1659 var tall = false;
1660 var color = green;
1661 switch (event.name) {
1662 case recordTypes.MarkDOMContent:
1663 color = blue;
1664 tall = true;
1665 break;
1666 case recordTypes.MarkLoad:
1667 color = red;
1668 tall = true;
1669 break;
1670 case recordTypes.MarkFirstPaint:
1671 color = green;
1672 tall = true;
1673 break;
1674 case recordTypes.TimeStamp:
1675 color = orange;
1676 break;
1677 }
1678 return {
1679 title: title,
1680 dashStyle: tallMarkerDashStyle,
1681 lineWidth: 0.5,
1682 color: color,
1683 tall: tall,
1684 lowPriority: false,
1685 };
1686 }
1687
1688 /**
1689 * @return {!WebInspector.TimelineMarkerStyle}
1690 */
1691 static markerStyleForFrame() {
1692 return {
1693 title: WebInspector.UIString('Frame'),
1694 color: 'rgba(100, 100, 100, 0.4)',
1695 lineWidth: 3,
1696 dashStyle: [3],
1697 tall: true,
1698 lowPriority: true
1699 };
1700 }
1701
1702 /**
1703 * @param {string} url
1704 * @return {string}
1705 */
1706 static colorForURL(url) {
1707 if (!WebInspector.TimelineUIUtils.colorForURL._colorGenerator) {
1708 WebInspector.TimelineUIUtils.colorForURL._colorGenerator =
1709 new WebInspector.FlameChart.ColorGenerator({min: 30, max: 330}, {min: 50, max: 80, count: 3}, 85);
1710 }
1711 return WebInspector.TimelineUIUtils.colorForURL._colorGenerator.colorForID(u rl);
1712 }
1713
1714 /**
1715 * @param {!WebInspector.TracingModel.Event} event
1716 * @param {string=} warningType
1717 * @return {?Element}
1718 */
1719 static eventWarning(event, warningType) {
1720 var warning = warningType || event.warning;
1721 if (!warning)
1722 return null;
1723 var warnings = WebInspector.TimelineModel.WarningType;
1724 var span = createElement('span');
1725 var eventData = event.args['data'];
1726
1727 switch (warning) {
1728 case warnings.ForcedStyle:
1729 case warnings.ForcedLayout:
1730 span.appendChild(WebInspector.linkifyDocumentationURLAsNode(
1731 '../../fundamentals/performance/rendering/avoid-large-complex-layout s-and-layout-thrashing#avoid-forced-synchronous-layouts',
1732 WebInspector.UIString('Forced reflow')));
1733 span.createTextChild(WebInspector.UIString(' is a likely performance bot tleneck.'));
1734 break;
1735 case warnings.IdleDeadlineExceeded:
1736 span.textContent = WebInspector.UIString(
1737 'Idle callback execution extended beyond deadline by ' +
1738 Number.millisToString(event.duration - eventData['allottedMillisecon ds'], true));
1739 break;
1740 case warnings.V8Deopt:
1741 span.appendChild(WebInspector.linkifyURLAsNode(
1742 'https://github.com/GoogleChrome/devtools-docs/issues/53', WebInspec tor.UIString('Not optimized'),
1743 undefined, true));
1744 span.createTextChild(WebInspector.UIString(': %s', eventData['deoptReaso n']));
1745 break;
1746 default:
1747 console.assert(false, 'Unhandled TimelineModel.WarningType');
1748 }
1749 return span;
1750 }
1696 }; 1751 };
1697 1752
1698 /** 1753 /**
1699 * @param {!Array.<number>} quad 1754 * @unrestricted
1700 * @return {number}
1701 */ 1755 */
1702 WebInspector.TimelineUIUtils.quadWidth = function(quad) 1756 WebInspector.TimelineRecordStyle = class {
1703 { 1757 /**
1704 return Math.round(Math.sqrt(Math.pow(quad[0] - quad[2], 2) + Math.pow(quad[1 ] - quad[3], 2))); 1758 * @param {string} title
1705 }; 1759 * @param {!WebInspector.TimelineCategory} category
1760 * @param {boolean=} hidden
1761 */
1762 constructor(title, category, hidden) {
1763 this.title = title;
1764 this.category = category;
1765 this.hidden = !!hidden;
1766 }
1767 };
1768
1706 1769
1707 /** 1770 /**
1708 * @param {!Array.<number>} quad 1771 * @enum {symbol}
1709 * @return {number}
1710 */ 1772 */
1711 WebInspector.TimelineUIUtils.quadHeight = function(quad) 1773 WebInspector.TimelineUIUtils.NetworkCategory = {
1712 { 1774 HTML: Symbol('HTML'),
1713 return Math.round(Math.sqrt(Math.pow(quad[0] - quad[6], 2) + Math.pow(quad[1 ] - quad[7], 2))); 1775 Script: Symbol('Script'),
1714 }; 1776 Style: Symbol('Style'),
1777 Media: Symbol('Media'),
1778 Other: Symbol('Other')
1779 };
1780
1781
1782 WebInspector.TimelineUIUtils._aggregatedStatsKey = Symbol('aggregatedStats');
1783
1715 1784
1716 /** 1785 /**
1717 * @constructor 1786 * @unrestricted
1718 * @param {number} priority
1719 * @param {string} color
1720 * @param {!Array.<string>} eventTypes
1721 */ 1787 */
1722 WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor = function(priority, co lor, eventTypes) 1788 WebInspector.TimelineUIUtils.InvalidationsGroupElement = class extends TreeEleme nt {
1723 { 1789 /**
1790 * @param {!WebInspector.Target} target
1791 * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap
1792 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper
1793 * @param {!Array.<!WebInspector.InvalidationTrackingEvent>} invalidations
1794 */
1795 constructor(target, relatedNodesMap, contentHelper, invalidations) {
1796 super('', true);
1797
1798 this.listItemElement.classList.add('header');
1799 this.selectable = false;
1800 this.toggleOnClick = true;
1801
1802 this._relatedNodesMap = relatedNodesMap;
1803 this._contentHelper = contentHelper;
1804 this._invalidations = invalidations;
1805 this.title = this._createTitle(target);
1806 }
1807
1808 /**
1809 * @param {!WebInspector.Target} target
1810 * @return {!Element}
1811 */
1812 _createTitle(target) {
1813 var first = this._invalidations[0];
1814 var reason = first.cause.reason;
1815 var topFrame = first.cause.stackTrace && first.cause.stackTrace[0];
1816
1817 var title = createElement('span');
1818 if (reason)
1819 title.createTextChild(WebInspector.UIString('%s for ', reason));
1820 else
1821 title.createTextChild(WebInspector.UIString('Unknown cause for '));
1822
1823 this._appendTruncatedNodeList(title, this._invalidations);
1824
1825 if (topFrame && this._contentHelper.linkifier()) {
1826 title.createTextChild(WebInspector.UIString('. '));
1827 var stack = title.createChild('span', 'monospace');
1828 stack.createChild('span').textContent = WebInspector.beautifyFunctionName( topFrame.functionName);
1829 var link = this._contentHelper.linkifier().maybeLinkifyConsoleCallFrame(ta rget, topFrame);
1830 if (link) {
1831 stack.createChild('span').textContent = ' @ ';
1832 stack.createChild('span').appendChild(link);
1833 }
1834 }
1835
1836 return title;
1837 }
1838
1839 /**
1840 * @override
1841 */
1842 onpopulate() {
1843 var content = createElementWithClass('div', 'content');
1844
1845 var first = this._invalidations[0];
1846 if (first.cause.stackTrace) {
1847 var stack = content.createChild('div');
1848 stack.createTextChild(WebInspector.UIString('Stack trace:'));
1849 this._contentHelper.createChildStackTraceElement(
1850 stack, WebInspector.TimelineUIUtils._stackTraceFromCallFrames(first.ca use.stackTrace));
1851 }
1852
1853 content.createTextChild(
1854 this._invalidations.length > 1 ? WebInspector.UIString('Nodes:') : WebIn spector.UIString('Node:'));
1855 var nodeList = content.createChild('div', 'node-list');
1856 var firstNode = true;
1857 for (var i = 0; i < this._invalidations.length; i++) {
1858 var invalidation = this._invalidations[i];
1859 var invalidationNode = this._createInvalidationNode(invalidation, true);
1860 if (invalidationNode) {
1861 if (!firstNode)
1862 nodeList.createTextChild(WebInspector.UIString(', '));
1863 firstNode = false;
1864
1865 nodeList.appendChild(invalidationNode);
1866
1867 var extraData = invalidation.extraData ? ', ' + invalidation.extraData : '';
1868 if (invalidation.changedId)
1869 nodeList.createTextChild(WebInspector.UIString('(changed id to "%s"%s) ', invalidation.changedId, extraData));
1870 else if (invalidation.changedClass)
1871 nodeList.createTextChild(
1872 WebInspector.UIString('(changed class to "%s"%s)', invalidation.ch angedClass, extraData));
1873 else if (invalidation.changedAttribute)
1874 nodeList.createTextChild(
1875 WebInspector.UIString('(changed attribute to "%s"%s)', invalidatio n.changedAttribute, extraData));
1876 else if (invalidation.changedPseudo)
1877 nodeList.createTextChild(
1878 WebInspector.UIString('(changed pesudo to "%s"%s)', invalidation.c hangedPseudo, extraData));
1879 else if (invalidation.selectorPart)
1880 nodeList.createTextChild(WebInspector.UIString('(changed "%s"%s)', inv alidation.selectorPart, extraData));
1881 }
1882 }
1883
1884 var contentTreeElement = new TreeElement(content, false);
1885 contentTreeElement.selectable = false;
1886 this.appendChild(contentTreeElement);
1887 }
1888
1889 /**
1890 * @param {!Element} parentElement
1891 * @param {!Array.<!WebInspector.InvalidationTrackingEvent>} invalidations
1892 */
1893 _appendTruncatedNodeList(parentElement, invalidations) {
1894 var invalidationNodes = [];
1895 var invalidationNodeIdMap = {};
1896 for (var i = 0; i < invalidations.length; i++) {
1897 var invalidation = invalidations[i];
1898 var invalidationNode = this._createInvalidationNode(invalidation, false);
1899 invalidationNode.addEventListener('click', (e) => e.consume(), false);
1900 if (invalidationNode && !invalidationNodeIdMap[invalidation.nodeId]) {
1901 invalidationNodes.push(invalidationNode);
1902 invalidationNodeIdMap[invalidation.nodeId] = true;
1903 }
1904 }
1905
1906 if (invalidationNodes.length === 1) {
1907 parentElement.appendChild(invalidationNodes[0]);
1908 } else if (invalidationNodes.length === 2) {
1909 parentElement.appendChild(invalidationNodes[0]);
1910 parentElement.createTextChild(WebInspector.UIString(' and '));
1911 parentElement.appendChild(invalidationNodes[1]);
1912 } else if (invalidationNodes.length >= 3) {
1913 parentElement.appendChild(invalidationNodes[0]);
1914 parentElement.createTextChild(WebInspector.UIString(', '));
1915 parentElement.appendChild(invalidationNodes[1]);
1916 parentElement.createTextChild(WebInspector.UIString(', and %s others', inv alidationNodes.length - 2));
1917 }
1918 }
1919
1920 /**
1921 * @param {!WebInspector.InvalidationTrackingEvent} invalidation
1922 * @param {boolean} showUnknownNodes
1923 */
1924 _createInvalidationNode(invalidation, showUnknownNodes) {
1925 var node = (invalidation.nodeId && this._relatedNodesMap) ? this._relatedNod esMap.get(invalidation.nodeId) : null;
1926 if (node)
1927 return WebInspector.DOMPresentationUtils.linkifyNodeReference(node);
1928 if (invalidation.nodeName) {
1929 var nodeSpan = createElement('span');
1930 nodeSpan.textContent = WebInspector.UIString('[ %s ]', invalidation.nodeNa me);
1931 return nodeSpan;
1932 }
1933 if (showUnknownNodes) {
1934 var nodeSpan = createElement('span');
1935 return nodeSpan.createTextChild(WebInspector.UIString('[ unknown node ]')) ;
1936 }
1937 }
1938 };
1939
1940
1941 /**
1942 * @unrestricted
1943 */
1944 WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor = class {
1945 /**
1946 * @param {number} priority
1947 * @param {string} color
1948 * @param {!Array.<string>} eventTypes
1949 */
1950 constructor(priority, color, eventTypes) {
1724 this.priority = priority; 1951 this.priority = priority;
1725 this.color = color; 1952 this.color = color;
1726 this.eventTypes = eventTypes; 1953 this.eventTypes = eventTypes;
1727 }; 1954 }
1955 };
1956
1728 1957
1729 /** 1958 /**
1730 * @return {!Array.<!WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor>} 1959 * @unrestricted
1731 */ 1960 */
1732 WebInspector.TimelineUIUtils.eventDispatchDesciptors = function() 1961 WebInspector.TimelineCategory = class extends WebInspector.Object {
1733 { 1962 /**
1734 if (WebInspector.TimelineUIUtils._eventDispatchDesciptors) 1963 * @param {string} name
1735 return WebInspector.TimelineUIUtils._eventDispatchDesciptors; 1964 * @param {string} title
1736 var lightOrange = "hsl(40,100%,80%)"; 1965 * @param {boolean} visible
1737 var orange = "hsl(40,100%,50%)"; 1966 * @param {string} childColor
1738 var green = "hsl(90,100%,40%)"; 1967 * @param {string} color
1739 var purple = "hsl(256,100%,75%)"; 1968 */
1740 WebInspector.TimelineUIUtils._eventDispatchDesciptors = [ 1969 constructor(name, title, visible, childColor, color) {
1741 new WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor(1, lightOra nge, ["mousemove", "mouseenter", "mouseleave", "mouseout", "mouseover"]), 1970 super();
1742 new WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor(1, lightOra nge, ["pointerover", "pointerout", "pointerenter", "pointerleave", "pointermove" ]),
1743 new WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor(2, green, [ "wheel"]),
1744 new WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor(3, orange, ["click", "mousedown", "mouseup"]),
1745 new WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor(3, orange, ["touchstart", "touchend", "touchmove", "touchcancel"]),
1746 new WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor(3, orange, ["pointerdown", "pointerup", "pointercancel", "gotpointercapture", "lostpointerc apture"]),
1747 new WebInspector.TimelineUIUtils.EventDispatchTypeDescriptor(3, purple, ["keydown", "keyup", "keypress"])
1748 ];
1749 return WebInspector.TimelineUIUtils._eventDispatchDesciptors;
1750 };
1751
1752 /**
1753 * @constructor
1754 * @extends {WebInspector.Object}
1755 * @param {string} name
1756 * @param {string} title
1757 * @param {boolean} visible
1758 * @param {string} childColor
1759 * @param {string} color
1760 */
1761 WebInspector.TimelineCategory = function(name, title, visible, childColor, color )
1762 {
1763 this.name = name; 1971 this.name = name;
1764 this.title = title; 1972 this.title = title;
1765 this.visible = visible; 1973 this.visible = visible;
1766 this.childColor = childColor; 1974 this.childColor = childColor;
1767 this.color = color; 1975 this.color = color;
1768 this.hidden = false; 1976 this.hidden = false;
1977 }
1978
1979 /**
1980 * @return {boolean}
1981 */
1982 get hidden() {
1983 return this._hidden;
1984 }
1985
1986 /**
1987 * @param {boolean} hidden
1988 */
1989 set hidden(hidden) {
1990 this._hidden = hidden;
1991 this.dispatchEventToListeners(WebInspector.TimelineCategory.Events.Visibilit yChanged, this);
1992 }
1769 }; 1993 };
1770 1994
1771 /** @enum {symbol} */ 1995 /** @enum {symbol} */
1772 WebInspector.TimelineCategory.Events = { 1996 WebInspector.TimelineCategory.Events = {
1773 VisibilityChanged: Symbol("VisibilityChanged") 1997 VisibilityChanged: Symbol('VisibilityChanged')
1774 };
1775
1776 WebInspector.TimelineCategory.prototype = {
1777 /**
1778 * @return {boolean}
1779 */
1780 get hidden()
1781 {
1782 return this._hidden;
1783 },
1784
1785 set hidden(hidden)
1786 {
1787 this._hidden = hidden;
1788 this.dispatchEventToListeners(WebInspector.TimelineCategory.Events.Visib ilityChanged, this);
1789 },
1790
1791 __proto__: WebInspector.Object.prototype
1792 }; 1998 };
1793 1999
1794 /** 2000 /**
1795 * @typedef {!{ 2001 * @typedef {!{
1796 * title: string, 2002 * title: string,
1797 * color: string, 2003 * color: string,
1798 * lineWidth: number, 2004 * lineWidth: number,
1799 * dashStyle: !Array.<number>, 2005 * dashStyle: !Array.<number>,
1800 * tall: boolean, 2006 * tall: boolean,
1801 * lowPriority: boolean 2007 * lowPriority: boolean
1802 * }} 2008 * }}
1803 */ 2009 */
1804 WebInspector.TimelineMarkerStyle; 2010 WebInspector.TimelineMarkerStyle;
1805 2011
2012
1806 /** 2013 /**
1807 * @param {!WebInspector.TracingModel.Event} event 2014 * @unrestricted
1808 * @return {!WebInspector.TimelineMarkerStyle}
1809 */ 2015 */
1810 WebInspector.TimelineUIUtils.markerStyleForEvent = function(event) 2016 WebInspector.TimelinePopupContentHelper = class {
1811 { 2017 /**
1812 var red = "rgb(255, 0, 0)"; 2018 * @param {string} title
1813 var blue = "rgb(0, 0, 255)"; 2019 */
1814 var orange = "rgb(255, 178, 23)"; 2020 constructor(title) {
1815 var green = "rgb(0, 130, 0)"; 2021 this._contentTable = createElement('table');
1816 var tallMarkerDashStyle = [10, 5]; 2022 var titleCell = this._createCell(WebInspector.UIString('%s - Details', title ), 'timeline-details-title');
1817
1818 var title = WebInspector.TimelineUIUtils.eventTitle(event);
1819
1820 if (event.hasCategory(WebInspector.TimelineModel.Category.Console) || event. hasCategory(WebInspector.TimelineModel.Category.UserTiming)) {
1821 return {
1822 title: title,
1823 dashStyle: tallMarkerDashStyle,
1824 lineWidth: 0.5,
1825 color: orange,
1826 tall: false,
1827 lowPriority: false,
1828 };
1829 }
1830 var recordTypes = WebInspector.TimelineModel.RecordType;
1831 var tall = false;
1832 var color = green;
1833 switch (event.name) {
1834 case recordTypes.MarkDOMContent:
1835 color = blue;
1836 tall = true;
1837 break;
1838 case recordTypes.MarkLoad:
1839 color = red;
1840 tall = true;
1841 break;
1842 case recordTypes.MarkFirstPaint:
1843 color = green;
1844 tall = true;
1845 break;
1846 case recordTypes.TimeStamp:
1847 color = orange;
1848 break;
1849 }
1850 return {
1851 title: title,
1852 dashStyle: tallMarkerDashStyle,
1853 lineWidth: 0.5,
1854 color: color,
1855 tall: tall,
1856 lowPriority: false,
1857 };
1858 };
1859
1860 /**
1861 * @return {!WebInspector.TimelineMarkerStyle}
1862 */
1863 WebInspector.TimelineUIUtils.markerStyleForFrame = function()
1864 {
1865 return {
1866 title: WebInspector.UIString("Frame"),
1867 color: "rgba(100, 100, 100, 0.4)",
1868 lineWidth: 3,
1869 dashStyle: [3],
1870 tall: true,
1871 lowPriority: true
1872 };
1873 };
1874
1875 /**
1876 * @param {string} url
1877 * @return {string}
1878 */
1879 WebInspector.TimelineUIUtils.colorForURL = function(url)
1880 {
1881 if (!WebInspector.TimelineUIUtils.colorForURL._colorGenerator) {
1882 WebInspector.TimelineUIUtils.colorForURL._colorGenerator = new WebInspec tor.FlameChart.ColorGenerator(
1883 { min: 30, max: 330 },
1884 { min: 50, max: 80, count: 3 },
1885 85);
1886 }
1887 return WebInspector.TimelineUIUtils.colorForURL._colorGenerator.colorForID(u rl);
1888 };
1889
1890 /**
1891 * @constructor
1892 * @param {string} title
1893 */
1894 WebInspector.TimelinePopupContentHelper = function(title)
1895 {
1896 this._contentTable = createElement("table");
1897 var titleCell = this._createCell(WebInspector.UIString("%s - Details", title ), "timeline-details-title");
1898 titleCell.colSpan = 2; 2023 titleCell.colSpan = 2;
1899 var titleRow = createElement("tr"); 2024 var titleRow = createElement('tr');
1900 titleRow.appendChild(titleCell); 2025 titleRow.appendChild(titleCell);
1901 this._contentTable.appendChild(titleRow); 2026 this._contentTable.appendChild(titleRow);
1902 }; 2027 }
1903 2028
1904 WebInspector.TimelinePopupContentHelper.prototype = { 2029 /**
1905 /** 2030 * @return {!Element}
1906 * @return {!Element} 2031 */
1907 */ 2032 contentTable() {
1908 contentTable: function() 2033 return this._contentTable;
1909 { 2034 }
1910 return this._contentTable; 2035
1911 }, 2036 /**
1912 2037 * @param {string|number} content
1913 /** 2038 * @param {string=} styleName
1914 * @param {string|number} content 2039 */
1915 * @param {string=} styleName 2040 _createCell(content, styleName) {
1916 */ 2041 var text = createElement('label');
1917 _createCell: function(content, styleName) 2042 text.createTextChild(String(content));
1918 { 2043 var cell = createElement('td');
1919 var text = createElement("label"); 2044 cell.className = 'timeline-details';
1920 text.createTextChild(String(content)); 2045 if (styleName)
1921 var cell = createElement("td"); 2046 cell.className += ' ' + styleName;
1922 cell.className = "timeline-details"; 2047 cell.textContent = content;
1923 if (styleName) 2048 return cell;
1924 cell.className += " " + styleName; 2049 }
1925 cell.textContent = content; 2050
1926 return cell; 2051 /**
1927 }, 2052 * @param {string} title
1928 2053 * @param {string|number} content
1929 /** 2054 */
1930 * @param {string} title 2055 appendTextRow(title, content) {
1931 * @param {string|number} content 2056 var row = createElement('tr');
1932 */ 2057 row.appendChild(this._createCell(title, 'timeline-details-row-title'));
1933 appendTextRow: function(title, content) 2058 row.appendChild(this._createCell(content, 'timeline-details-row-data'));
1934 { 2059 this._contentTable.appendChild(row);
1935 var row = createElement("tr"); 2060 }
1936 row.appendChild(this._createCell(title, "timeline-details-row-title")); 2061
1937 row.appendChild(this._createCell(content, "timeline-details-row-data")); 2062 /**
1938 this._contentTable.appendChild(row); 2063 * @param {string} title
1939 }, 2064 * @param {!Node|string} content
1940 2065 */
1941 /** 2066 appendElementRow(title, content) {
1942 * @param {string} title 2067 var row = createElement('tr');
1943 * @param {!Node|string} content 2068 var titleCell = this._createCell(title, 'timeline-details-row-title');
1944 */ 2069 row.appendChild(titleCell);
1945 appendElementRow: function(title, content) 2070 var cell = createElement('td');
1946 { 2071 cell.className = 'details';
1947 var row = createElement("tr"); 2072 if (content instanceof Node)
1948 var titleCell = this._createCell(title, "timeline-details-row-title"); 2073 cell.appendChild(content);
1949 row.appendChild(titleCell); 2074 else
1950 var cell = createElement("td"); 2075 cell.createTextChild(content || '');
1951 cell.className = "details"; 2076 row.appendChild(cell);
1952 if (content instanceof Node) 2077 this._contentTable.appendChild(row);
1953 cell.appendChild(content); 2078 }
1954 else
1955 cell.createTextChild(content || "");
1956 row.appendChild(cell);
1957 this._contentTable.appendChild(row);
1958 }
1959 }; 2079 };
1960 2080
1961 /** 2081 /**
1962 * @constructor 2082 * @unrestricted
1963 * @param {?WebInspector.Target} target
1964 * @param {?WebInspector.Linkifier} linkifier
1965 */ 2083 */
1966 WebInspector.TimelineDetailsContentHelper = function(target, linkifier) 2084 WebInspector.TimelineDetailsContentHelper = class {
1967 { 2085 /**
2086 * @param {?WebInspector.Target} target
2087 * @param {?WebInspector.Linkifier} linkifier
2088 */
2089 constructor(target, linkifier) {
1968 this.fragment = createDocumentFragment(); 2090 this.fragment = createDocumentFragment();
1969 2091
1970 this._linkifier = linkifier; 2092 this._linkifier = linkifier;
1971 this._target = target; 2093 this._target = target;
1972 2094
1973 this.element = createElementWithClass("div", "timeline-details-view-block"); 2095 this.element = createElementWithClass('div', 'timeline-details-view-block');
1974 this._tableElement = this.element.createChild("div", "vbox timeline-details- chip-body"); 2096 this._tableElement = this.element.createChild('div', 'vbox timeline-details- chip-body');
1975 this.fragment.appendChild(this.element); 2097 this.fragment.appendChild(this.element);
1976 }; 2098 }
1977 2099
1978 WebInspector.TimelineDetailsContentHelper.prototype = { 2100 /**
1979 /** 2101 * @param {string} title
1980 * @param {string} title 2102 * @param {!WebInspector.TimelineCategory=} category
1981 * @param {!WebInspector.TimelineCategory=} category 2103 */
1982 */ 2104 addSection(title, category) {
1983 addSection: function(title, category) 2105 if (!this._tableElement.hasChildNodes()) {
1984 { 2106 this.element.removeChildren();
1985 if (!this._tableElement.hasChildNodes()) { 2107 } else {
1986 this.element.removeChildren(); 2108 this.element = createElementWithClass('div', 'timeline-details-view-block' );
1987 } else { 2109 this.fragment.appendChild(this.element);
1988 this.element = createElementWithClass("div", "timeline-details-view- block"); 2110 }
1989 this.fragment.appendChild(this.element); 2111
1990 } 2112 if (title) {
1991 2113 var titleElement = this.element.createChild('div', 'timeline-details-chip- title');
1992 if (title) { 2114 if (category)
1993 var titleElement = this.element.createChild("div", "timeline-details -chip-title"); 2115 titleElement.createChild('div').style.backgroundColor = category.color;
1994 if (category) 2116 titleElement.createTextChild(title);
1995 titleElement.createChild("div").style.backgroundColor = category .color; 2117 }
1996 titleElement.createTextChild(title); 2118
1997 } 2119 this._tableElement = this.element.createChild('div', 'vbox timeline-details- chip-body');
1998 2120 this.fragment.appendChild(this.element);
1999 this._tableElement = this.element.createChild("div", "vbox timeline-deta ils-chip-body"); 2121 }
2000 this.fragment.appendChild(this.element); 2122
2001 }, 2123 /**
2002 2124 * @return {?WebInspector.Linkifier}
2003 /** 2125 */
2004 * @return {?WebInspector.Linkifier} 2126 linkifier() {
2005 */ 2127 return this._linkifier;
2006 linkifier: function() 2128 }
2007 { 2129
2008 return this._linkifier; 2130 /**
2009 }, 2131 * @param {string} title
2010 2132 * @param {string|number|boolean} value
2011 /** 2133 */
2012 * @param {string} title 2134 appendTextRow(title, value) {
2013 * @param {string|number|boolean} value 2135 var rowElement = this._tableElement.createChild('div', 'timeline-details-vie w-row');
2014 */ 2136 rowElement.createChild('div', 'timeline-details-view-row-title').textContent = title;
2015 appendTextRow: function(title, value) 2137 rowElement.createChild('div', 'timeline-details-view-row-value').textContent = value;
2016 { 2138 }
2017 var rowElement = this._tableElement.createChild("div", "timeline-details -view-row"); 2139
2018 rowElement.createChild("div", "timeline-details-view-row-title").textCon tent = title; 2140 /**
2019 rowElement.createChild("div", "timeline-details-view-row-value").textCon tent = value; 2141 * @param {string} title
2020 }, 2142 * @param {!Node|string} content
2021 2143 * @param {boolean=} isWarning
2022 /** 2144 * @param {boolean=} isStacked
2023 * @param {string} title 2145 */
2024 * @param {!Node|string} content 2146 appendElementRow(title, content, isWarning, isStacked) {
2025 * @param {boolean=} isWarning 2147 var rowElement = this._tableElement.createChild('div', 'timeline-details-vie w-row');
2026 * @param {boolean=} isStacked 2148 if (isWarning)
2027 */ 2149 rowElement.classList.add('timeline-details-warning');
2028 appendElementRow: function(title, content, isWarning, isStacked) 2150 if (isStacked)
2029 { 2151 rowElement.classList.add('timeline-details-stack-values');
2030 var rowElement = this._tableElement.createChild("div", "timeline-details -view-row"); 2152 var titleElement = rowElement.createChild('div', 'timeline-details-view-row- title');
2031 if (isWarning) 2153 titleElement.textContent = title;
2032 rowElement.classList.add("timeline-details-warning"); 2154 var valueElement = rowElement.createChild('div', 'timeline-details-view-row- value');
2033 if (isStacked) 2155 if (content instanceof Node)
2034 rowElement.classList.add("timeline-details-stack-values"); 2156 valueElement.appendChild(content);
2035 var titleElement = rowElement.createChild("div", "timeline-details-view- row-title"); 2157 else
2036 titleElement.textContent = title; 2158 valueElement.createTextChild(content || '');
2037 var valueElement = rowElement.createChild("div", "timeline-details-view- row-value"); 2159 }
2038 if (content instanceof Node) 2160
2039 valueElement.appendChild(content); 2161 /**
2040 else 2162 * @param {string} title
2041 valueElement.createTextChild(content || ""); 2163 * @param {string} url
2042 }, 2164 * @param {number} startLine
2043 2165 * @param {number=} startColumn
2044 /** 2166 */
2045 * @param {string} title 2167 appendLocationRow(title, url, startLine, startColumn) {
2046 * @param {string} url 2168 if (!this._linkifier || !this._target)
2047 * @param {number} startLine 2169 return;
2048 * @param {number=} startColumn 2170 var link = this._linkifier.maybeLinkifyScriptLocation(this._target, null, ur l, startLine, startColumn);
2049 */ 2171 if (!link)
2050 appendLocationRow: function(title, url, startLine, startColumn) 2172 return;
2051 { 2173 this.appendElementRow(title, link);
2052 if (!this._linkifier || !this._target) 2174 }
2053 return; 2175
2054 var link = this._linkifier.maybeLinkifyScriptLocation(this._target, null , url, startLine, startColumn); 2176 /**
2055 if (!link) 2177 * @param {string} title
2056 return; 2178 * @param {string} url
2057 this.appendElementRow(title, link); 2179 * @param {number} startLine
2058 }, 2180 * @param {number=} endLine
2059 2181 */
2060 /** 2182 appendLocationRange(title, url, startLine, endLine) {
2061 * @param {string} title 2183 if (!this._linkifier || !this._target)
2062 * @param {string} url 2184 return;
2063 * @param {number} startLine 2185 var locationContent = createElement('span');
2064 * @param {number=} endLine 2186 var link = this._linkifier.maybeLinkifyScriptLocation(this._target, null, ur l, startLine);
2065 */ 2187 if (!link)
2066 appendLocationRange: function(title, url, startLine, endLine) 2188 return;
2067 { 2189 locationContent.appendChild(link);
2068 if (!this._linkifier || !this._target) 2190 locationContent.createTextChild(String.sprintf(' [%s\u2026%s]', startLine + 1, endLine + 1 || ''));
2069 return; 2191 this.appendElementRow(title, locationContent);
2070 var locationContent = createElement("span"); 2192 }
2071 var link = this._linkifier.maybeLinkifyScriptLocation(this._target, null , url, startLine); 2193
2072 if (!link) 2194 /**
2073 return; 2195 * @param {string} title
2074 locationContent.appendChild(link); 2196 * @param {!RuntimeAgent.StackTrace} stackTrace
2075 locationContent.createTextChild(String.sprintf(" [%s\u2026%s]", startLin e + 1, endLine + 1 || "")); 2197 */
2076 this.appendElementRow(title, locationContent); 2198 appendStackTrace(title, stackTrace) {
2077 }, 2199 if (!this._linkifier || !this._target)
2078 2200 return;
2079 /** 2201
2080 * @param {string} title 2202 var rowElement = this._tableElement.createChild('div', 'timeline-details-vie w-row');
2081 * @param {!RuntimeAgent.StackTrace} stackTrace 2203 rowElement.createChild('div', 'timeline-details-view-row-title').textContent = title;
2082 */ 2204 this.createChildStackTraceElement(rowElement, stackTrace);
2083 appendStackTrace: function(title, stackTrace) 2205 }
2084 { 2206
2085 if (!this._linkifier || !this._target) 2207 /**
2086 return; 2208 * @param {!Element} parentElement
2087 2209 * @param {!RuntimeAgent.StackTrace} stackTrace
2088 var rowElement = this._tableElement.createChild("div", "timeline-details -view-row"); 2210 */
2089 rowElement.createChild("div", "timeline-details-view-row-title").textCon tent = title; 2211 createChildStackTraceElement(parentElement, stackTrace) {
2090 this.createChildStackTraceElement(rowElement, stackTrace); 2212 if (!this._linkifier || !this._target)
2091 }, 2213 return;
2092 2214 parentElement.classList.add('timeline-details-stack-values');
2093 /** 2215 var stackTraceElement =
2094 * @param {!Element} parentElement 2216 parentElement.createChild('div', 'timeline-details-view-row-value timeli ne-details-view-row-stack-trace');
2095 * @param {!RuntimeAgent.StackTrace} stackTrace 2217 var callFrameElem =
2096 */ 2218 WebInspector.DOMPresentationUtils.buildStackTracePreviewContents(this._t arget, this._linkifier, stackTrace);
2097 createChildStackTraceElement: function(parentElement, stackTrace) 2219 stackTraceElement.appendChild(callFrameElem);
2098 { 2220 }
2099 if (!this._linkifier || !this._target) 2221
2100 return; 2222 /**
2101 parentElement.classList.add("timeline-details-stack-values"); 2223 * @param {!WebInspector.TracingModel.Event} event
2102 var stackTraceElement = parentElement.createChild("div", "timeline-detai ls-view-row-value timeline-details-view-row-stack-trace"); 2224 * @param {string=} warningType
2103 var callFrameElem = WebInspector.DOMPresentationUtils.buildStackTracePre viewContents(this._target, this._linkifier, stackTrace); 2225 */
2104 stackTraceElement.appendChild(callFrameElem); 2226 appendWarningRow(event, warningType) {
2105 }, 2227 var warning = WebInspector.TimelineUIUtils.eventWarning(event, warningType);
2106 2228 if (warning)
2107 /** 2229 this.appendElementRow(WebInspector.UIString('Warning'), warning, true);
2108 * @param {!WebInspector.TracingModel.Event} event 2230 }
2109 * @param {string=} warningType 2231 };
2110 */ 2232
2111 appendWarningRow: function(event, warningType) 2233
2112 {
2113 var warning = WebInspector.TimelineUIUtils.eventWarning(event, warningTy pe);
2114 if (warning)
2115 this.appendElementRow(WebInspector.UIString("Warning"), warning, tru e);
2116 }
2117 };
2118
2119 /**
2120 * @param {!WebInspector.TracingModel.Event} event
2121 * @param {string=} warningType
2122 * @return {?Element}
2123 */
2124 WebInspector.TimelineUIUtils.eventWarning = function(event, warningType)
2125 {
2126 var warning = warningType || event.warning;
2127 if (!warning)
2128 return null;
2129 var warnings = WebInspector.TimelineModel.WarningType;
2130 var span = createElement("span");
2131 var eventData = event.args["data"];
2132
2133 switch (warning) {
2134 case warnings.ForcedStyle:
2135 case warnings.ForcedLayout:
2136 span.appendChild(WebInspector.linkifyDocumentationURLAsNode("../../funda mentals/performance/rendering/avoid-large-complex-layouts-and-layout-thrashing#a void-forced-synchronous-layouts",
2137 WebInspector.UIString("Forced reflow")));
2138 span.createTextChild(WebInspector.UIString(" is a likely performance bot tleneck."));
2139 break;
2140 case warnings.IdleDeadlineExceeded:
2141 span.textContent = WebInspector.UIString("Idle callback execution extend ed beyond deadline by " +
2142 Number.millisToString(event.duration - eventData["allottedMillisecon ds"], true));
2143 break;
2144 case warnings.V8Deopt:
2145 span.appendChild(WebInspector.linkifyURLAsNode("https://github.com/Googl eChrome/devtools-docs/issues/53",
2146 WebInspector.UIString("Not optimized"), undefined, true));
2147 span.createTextChild(WebInspector.UIString(": %s", eventData["deoptReaso n"]));
2148 break;
2149 default:
2150 console.assert(false, "Unhandled TimelineModel.WarningType");
2151 }
2152 return span;
2153 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698