| 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 |