OLD | NEW |
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 Loading... |
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 }; | |
OLD | NEW |