| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 WebInspector.TimelineProfileTree = { }; | 5 WebInspector.TimelineProfileTree = { }; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * @constructor | 8 * @constructor |
| 9 */ | 9 */ |
| 10 WebInspector.TimelineProfileTree.Node = function() | 10 WebInspector.TimelineProfileTree.Node = function() |
| 11 { | 11 { |
| 12 /** @type {number} */ | 12 /** @type {number} */ |
| 13 this.totalTime; | 13 this.totalTime; |
| 14 /** @type {number} */ | 14 /** @type {number} */ |
| 15 this.selfTime; | 15 this.selfTime; |
| 16 /** @type {string} */ | 16 /** @type {string} */ |
| 17 this.id; | 17 this.id; |
| 18 /** @type {!WebInspector.TracingModel.Event} */ | 18 /** @type {!WebInspector.TracingModel.Event} */ |
| 19 this.event; | 19 this.event; |
| 20 /** @type {?Map<string|symbol,!WebInspector.TimelineProfileTree.Node>} */ | 20 /** @type {?Map<string|symbol,!WebInspector.TimelineProfileTree.Node>} */ |
| 21 this.children; | 21 this.children; |
| 22 /** @type {?WebInspector.TimelineProfileTree.Node} */ | 22 /** @type {?WebInspector.TimelineProfileTree.Node} */ |
| 23 this.parent; | 23 this.parent; |
| 24 this._isGroupNode = false; | 24 this._isGroupNode = false; |
| 25 } | 25 }; |
| 26 | 26 |
| 27 WebInspector.TimelineProfileTree.Node.prototype = { | 27 WebInspector.TimelineProfileTree.Node.prototype = { |
| 28 /** | 28 /** |
| 29 * @return {boolean} | 29 * @return {boolean} |
| 30 */ | 30 */ |
| 31 isGroupNode: function() | 31 isGroupNode: function() |
| 32 { | 32 { |
| 33 return this._isGroupNode; | 33 return this._isGroupNode; |
| 34 } | 34 } |
| 35 } | 35 }; |
| 36 | 36 |
| 37 /** | 37 /** |
| 38 * @param {!Array<!WebInspector.TracingModel.Event>} events | 38 * @param {!Array<!WebInspector.TracingModel.Event>} events |
| 39 * @param {!Array<!WebInspector.TimelineModel.Filter>} filters | 39 * @param {!Array<!WebInspector.TimelineModel.Filter>} filters |
| 40 * @param {number} startTime | 40 * @param {number} startTime |
| 41 * @param {number} endTime | 41 * @param {number} endTime |
| 42 * @param {function(!WebInspector.TracingModel.Event):(string|symbol)=} eventIdC
allback | 42 * @param {function(!WebInspector.TracingModel.Event):(string|symbol)=} eventIdC
allback |
| 43 * @return {!WebInspector.TimelineProfileTree.Node} | 43 * @return {!WebInspector.TimelineProfileTree.Node} |
| 44 */ | 44 */ |
| 45 WebInspector.TimelineProfileTree.buildTopDown = function(events, filters, startT
ime, endTime, eventIdCallback) | 45 WebInspector.TimelineProfileTree.buildTopDown = function(events, filters, startT
ime, endTime, eventIdCallback) |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 if (!WebInspector.TimelineModel.isVisible(filters, e)) | 93 if (!WebInspector.TimelineModel.isVisible(filters, e)) |
| 94 return; | 94 return; |
| 95 parent = parent.parent; | 95 parent = parent.parent; |
| 96 } | 96 } |
| 97 | 97 |
| 98 var instantEventCallback = eventIdCallback ? undefined : onStartEvent; // Ig
nore instant events when aggregating. | 98 var instantEventCallback = eventIdCallback ? undefined : onStartEvent; // Ig
nore instant events when aggregating. |
| 99 WebInspector.TimelineModel.forEachEvent(events, onStartEvent, onEndEvent, in
stantEventCallback, startTime, endTime); | 99 WebInspector.TimelineModel.forEachEvent(events, onStartEvent, onEndEvent, in
stantEventCallback, startTime, endTime); |
| 100 root.totalTime -= root.selfTime; | 100 root.totalTime -= root.selfTime; |
| 101 root.selfTime = 0; | 101 root.selfTime = 0; |
| 102 return root; | 102 return root; |
| 103 } | 103 }; |
| 104 | 104 |
| 105 /** | 105 /** |
| 106 * @param {!WebInspector.TimelineProfileTree.Node} topDownTree | 106 * @param {!WebInspector.TimelineProfileTree.Node} topDownTree |
| 107 * @param {?function(!WebInspector.TimelineProfileTree.Node):!WebInspector.Timel
ineProfileTree.Node=} groupingCallback | 107 * @param {?function(!WebInspector.TimelineProfileTree.Node):!WebInspector.Timel
ineProfileTree.Node=} groupingCallback |
| 108 * @return {!WebInspector.TimelineProfileTree.Node} | 108 * @return {!WebInspector.TimelineProfileTree.Node} |
| 109 */ | 109 */ |
| 110 WebInspector.TimelineProfileTree.buildBottomUp = function(topDownTree, groupingC
allback) | 110 WebInspector.TimelineProfileTree.buildBottomUp = function(topDownTree, groupingC
allback) |
| 111 { | 111 { |
| 112 var buRoot = new WebInspector.TimelineProfileTree.Node(); | 112 var buRoot = new WebInspector.TimelineProfileTree.Node(); |
| 113 buRoot.selfTime = 0; | 113 buRoot.selfTime = 0; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 } | 173 } |
| 174 | 174 |
| 175 // Purge zero self time nodes. | 175 // Purge zero self time nodes. |
| 176 var rootChildren = buRoot.children; | 176 var rootChildren = buRoot.children; |
| 177 for (var item of rootChildren.entries()) { | 177 for (var item of rootChildren.entries()) { |
| 178 if (item[1].selfTime === 0) | 178 if (item[1].selfTime === 0) |
| 179 rootChildren.delete(/** @type {string} */(item[0])); | 179 rootChildren.delete(/** @type {string} */(item[0])); |
| 180 } | 180 } |
| 181 | 181 |
| 182 return buRoot; | 182 return buRoot; |
| 183 } | 183 }; |
| 184 | 184 |
| 185 /** | 185 /** |
| 186 * @param {!WebInspector.TracingModel.Event} event | 186 * @param {!WebInspector.TracingModel.Event} event |
| 187 * @return {?string} | 187 * @return {?string} |
| 188 */ | 188 */ |
| 189 WebInspector.TimelineProfileTree.eventURL = function(event) | 189 WebInspector.TimelineProfileTree.eventURL = function(event) |
| 190 { | 190 { |
| 191 var data = event.args["data"] || event.args["beginData"]; | 191 var data = event.args["data"] || event.args["beginData"]; |
| 192 if (data && data["url"]) | 192 if (data && data["url"]) |
| 193 return data["url"]; | 193 return data["url"]; |
| 194 var frame = WebInspector.TimelineProfileTree.eventStackFrame(event); | 194 var frame = WebInspector.TimelineProfileTree.eventStackFrame(event); |
| 195 while (frame) { | 195 while (frame) { |
| 196 var url = frame["url"]; | 196 var url = frame["url"]; |
| 197 if (url) | 197 if (url) |
| 198 return url; | 198 return url; |
| 199 frame = frame.parent; | 199 frame = frame.parent; |
| 200 } | 200 } |
| 201 return null; | 201 return null; |
| 202 } | 202 }; |
| 203 | 203 |
| 204 /** | 204 /** |
| 205 * @param {!WebInspector.TracingModel.Event} event | 205 * @param {!WebInspector.TracingModel.Event} event |
| 206 * @return {?RuntimeAgent.CallFrame} | 206 * @return {?RuntimeAgent.CallFrame} |
| 207 */ | 207 */ |
| 208 WebInspector.TimelineProfileTree.eventStackFrame = function(event) | 208 WebInspector.TimelineProfileTree.eventStackFrame = function(event) |
| 209 { | 209 { |
| 210 if (event.name === WebInspector.TimelineModel.RecordType.JSFrame) | 210 if (event.name === WebInspector.TimelineModel.RecordType.JSFrame) |
| 211 return /** @type {?RuntimeAgent.CallFrame} */ (event.args["data"] || nul
l); | 211 return /** @type {?RuntimeAgent.CallFrame} */ (event.args["data"] || nul
l); |
| 212 var topFrame = event.stackTrace && event.stackTrace[0]; | 212 var topFrame = event.stackTrace && event.stackTrace[0]; |
| 213 if (topFrame) | 213 if (topFrame) |
| 214 return /** @type {!RuntimeAgent.CallFrame} */ (topFrame); | 214 return /** @type {!RuntimeAgent.CallFrame} */ (topFrame); |
| 215 var initiator = event.initiator; | 215 var initiator = event.initiator; |
| 216 return /** @type {?RuntimeAgent.CallFrame} */ (initiator && initiator.stackT
race && initiator.stackTrace[0] || null); | 216 return /** @type {?RuntimeAgent.CallFrame} */ (initiator && initiator.stackT
race && initiator.stackTrace[0] || null); |
| 217 } | 217 }; |
| 218 | 218 |
| 219 /** | 219 /** |
| 220 * @constructor | 220 * @constructor |
| 221 * @param {function(!WebInspector.TracingModel.Event):string} titleMapper | 221 * @param {function(!WebInspector.TracingModel.Event):string} titleMapper |
| 222 * @param {function(!WebInspector.TracingModel.Event):string} categoryMapper | 222 * @param {function(!WebInspector.TracingModel.Event):string} categoryMapper |
| 223 */ | 223 */ |
| 224 WebInspector.TimelineAggregator = function(titleMapper, categoryMapper) | 224 WebInspector.TimelineAggregator = function(titleMapper, categoryMapper) |
| 225 { | 225 { |
| 226 this._titleMapper = titleMapper; | 226 this._titleMapper = titleMapper; |
| 227 this._categoryMapper = categoryMapper; | 227 this._categoryMapper = categoryMapper; |
| 228 /** @type {!Map<string, !WebInspector.TimelineProfileTree.Node>} */ | 228 /** @type {!Map<string, !WebInspector.TimelineProfileTree.Node>} */ |
| 229 this._groupNodes = new Map(); | 229 this._groupNodes = new Map(); |
| 230 } | 230 }; |
| 231 | 231 |
| 232 /** | 232 /** |
| 233 * @enum {string} | 233 * @enum {string} |
| 234 */ | 234 */ |
| 235 WebInspector.TimelineAggregator.GroupBy = { | 235 WebInspector.TimelineAggregator.GroupBy = { |
| 236 None: "None", | 236 None: "None", |
| 237 EventName: "EventName", | 237 EventName: "EventName", |
| 238 Category: "Category", | 238 Category: "Category", |
| 239 Domain: "Domain", | 239 Domain: "Domain", |
| 240 Subdomain: "Subdomain", | 240 Subdomain: "Subdomain", |
| 241 URL: "URL" | 241 URL: "URL" |
| 242 } | 242 }; |
| 243 | 243 |
| 244 /** | 244 /** |
| 245 * @param {!WebInspector.TracingModel.Event} event | 245 * @param {!WebInspector.TracingModel.Event} event |
| 246 * @return {string} | 246 * @return {string} |
| 247 */ | 247 */ |
| 248 WebInspector.TimelineAggregator.eventId = function(event) | 248 WebInspector.TimelineAggregator.eventId = function(event) |
| 249 { | 249 { |
| 250 if (event.name === WebInspector.TimelineModel.RecordType.JSFrame) { | 250 if (event.name === WebInspector.TimelineModel.RecordType.JSFrame) { |
| 251 var data = event.args["data"]; | 251 var data = event.args["data"]; |
| 252 return "f:" + data["functionName"] + "@" + (data["scriptId"] || data["ur
l"] || ""); | 252 return "f:" + data["functionName"] + "@" + (data["scriptId"] || data["ur
l"] || ""); |
| 253 } | 253 } |
| 254 return event.name + ":@" + WebInspector.TimelineProfileTree.eventURL(event); | 254 return event.name + ":@" + WebInspector.TimelineProfileTree.eventURL(event); |
| 255 } | 255 }; |
| 256 | 256 |
| 257 WebInspector.TimelineAggregator._extensionInternalPrefix = "extensions::"; | 257 WebInspector.TimelineAggregator._extensionInternalPrefix = "extensions::"; |
| 258 WebInspector.TimelineAggregator._groupNodeFlag = Symbol("groupNode"); | 258 WebInspector.TimelineAggregator._groupNodeFlag = Symbol("groupNode"); |
| 259 | 259 |
| 260 /** | 260 /** |
| 261 * @param {string} url | 261 * @param {string} url |
| 262 * @return {boolean} | 262 * @return {boolean} |
| 263 */ | 263 */ |
| 264 WebInspector.TimelineAggregator.isExtensionInternalURL = function(url) | 264 WebInspector.TimelineAggregator.isExtensionInternalURL = function(url) |
| 265 { | 265 { |
| 266 return url.startsWith(WebInspector.TimelineAggregator._extensionInternalPref
ix); | 266 return url.startsWith(WebInspector.TimelineAggregator._extensionInternalPref
ix); |
| 267 } | 267 }; |
| 268 | 268 |
| 269 WebInspector.TimelineAggregator.prototype = { | 269 WebInspector.TimelineAggregator.prototype = { |
| 270 /** | 270 /** |
| 271 * @param {!WebInspector.TimelineAggregator.GroupBy} groupBy | 271 * @param {!WebInspector.TimelineAggregator.GroupBy} groupBy |
| 272 * @return {?function(!WebInspector.TimelineProfileTree.Node):!WebInspector.
TimelineProfileTree.Node} | 272 * @return {?function(!WebInspector.TimelineProfileTree.Node):!WebInspector.
TimelineProfileTree.Node} |
| 273 */ | 273 */ |
| 274 groupFunction: function(groupBy) | 274 groupFunction: function(groupBy) |
| 275 { | 275 { |
| 276 var idMapper = this._nodeToGroupIdFunction(groupBy); | 276 var idMapper = this._nodeToGroupIdFunction(groupBy); |
| 277 return idMapper && this._nodeToGroupNode.bind(this, idMapper); | 277 return idMapper && this._nodeToGroupNode.bind(this, idMapper); |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 /** | 369 /** |
| 370 * @param {function(!WebInspector.TimelineProfileTree.Node):string} nodeToGr
oupId | 370 * @param {function(!WebInspector.TimelineProfileTree.Node):string} nodeToGr
oupId |
| 371 * @param {!WebInspector.TimelineProfileTree.Node} node | 371 * @param {!WebInspector.TimelineProfileTree.Node} node |
| 372 * @return {!WebInspector.TimelineProfileTree.Node} | 372 * @return {!WebInspector.TimelineProfileTree.Node} |
| 373 */ | 373 */ |
| 374 _nodeToGroupNode: function(nodeToGroupId, node) | 374 _nodeToGroupNode: function(nodeToGroupId, node) |
| 375 { | 375 { |
| 376 var id = nodeToGroupId(node); | 376 var id = nodeToGroupId(node); |
| 377 return this._groupNodes.get(id) || this._buildGroupNode(id, node.event); | 377 return this._groupNodes.get(id) || this._buildGroupNode(id, node.event); |
| 378 }, | 378 }, |
| 379 } | 379 }; |
| OLD | NEW |