| Index: Source/devtools/front_end/timeline/TimelineTreeView.js
|
| diff --git a/Source/devtools/front_end/timeline/TimelineTreeView.js b/Source/devtools/front_end/timeline/TimelineTreeView.js
|
| index 06a890b25317f4b6f03e5d4e9a2c6ce1ee9228a1..a735e8ab9046e05aadef41c40700f44113eb6b29 100644
|
| --- a/Source/devtools/front_end/timeline/TimelineTreeView.js
|
| +++ b/Source/devtools/front_end/timeline/TimelineTreeView.js
|
| @@ -13,6 +13,7 @@ WebInspector.TimelineTreeView = function(model)
|
| this.element.classList.add("timeline-tree-view");
|
|
|
| this._model = model;
|
| + this._linkifier = new WebInspector.Linkifier();
|
| var columns = [];
|
| columns.push({id: "self", title: WebInspector.UIString("Self Time"), width: "120px", sort: WebInspector.DataGrid.Order.Descending, sortable: true});
|
| columns.push({id: "total", title: WebInspector.UIString("Total Time"), width: "120px", sortable: true});
|
| @@ -98,6 +99,18 @@ WebInspector.TimelineTreeView.prototype = {
|
| panelToolbar.appendToolbarItem(this._groupByCombobox);
|
| },
|
|
|
| + /**
|
| + * @param {?string} scriptId
|
| + * @param {string} url
|
| + * @param {number} lineNumber
|
| + * @param {number=} columnNumber
|
| + * @return {!Element}
|
| + */
|
| + linkifyLocation: function(scriptId, url, lineNumber, columnNumber)
|
| + {
|
| + return this._linkifier.linkifyScriptLocation(this._model.target(), scriptId, url, lineNumber, columnNumber);
|
| + },
|
| +
|
| _onTreeModeChanged: function()
|
| {
|
| this._refreshTree();
|
| @@ -111,6 +124,7 @@ WebInspector.TimelineTreeView.prototype = {
|
|
|
| _refreshTree: function()
|
| {
|
| + this._linkifier.reset();
|
| this.dataGrid.rootNode().removeChildren();
|
| var topDown = WebInspector.TimelineModel.buildTopDownTree(
|
| this._model.mainThreadEvents(), this._startTime, this._endTime, this._filters, WebInspector.TimelineTreeView.eventId);
|
| @@ -125,7 +139,7 @@ WebInspector.TimelineTreeView.prototype = {
|
| }
|
| for (var child of tree.children.values()) {
|
| // Exclude the idle time off the total calculation.
|
| - var gridNode = new WebInspector.TimelineTreeView.GridNode(child, topDown.totalTime, maxSelfTime, maxTotalTime);
|
| + var gridNode = new WebInspector.TimelineTreeView.GridNode(child, topDown.totalTime, maxSelfTime, maxTotalTime, this);
|
| this.dataGrid.insertChild(gridNode);
|
| }
|
| this._sortingChanged();
|
| @@ -285,21 +299,28 @@ WebInspector.TimelineTreeView.eventId = function(event)
|
|
|
| /**
|
| * @param {!WebInspector.TracingModel.Event} event
|
| - * @return {?string}
|
| + * @return {?Object}
|
| */
|
| -WebInspector.TimelineTreeView.eventURL = function(event)
|
| +WebInspector.TimelineTreeView.eventStackFrame = function(event)
|
| {
|
| var data = event.args["data"] || event.args["beginData"];
|
| - var url = data && data["url"];
|
| - if (url)
|
| - return url;
|
| + if (data)
|
| + return data;
|
| var topFrame = event.stackTrace && event.stackTrace[0];
|
| - url = topFrame && topFrame["url"];
|
| - if (url)
|
| - return url;
|
| + if (topFrame)
|
| + return topFrame;
|
| var initiator = event.initiator;
|
| - var initiatorTopFrame = initiator && initiator.stackTrace && initiator.stackTrace[0];
|
| - return initiatorTopFrame && initiatorTopFrame["url"] || null;
|
| + return initiator && initiator.stackTrace && initiator.stackTrace[0] || null;
|
| +}
|
| +
|
| +/**
|
| + * @param {!WebInspector.TracingModel.Event} event
|
| + * @return {?string}
|
| + */
|
| +WebInspector.TimelineTreeView.eventURL = function(event)
|
| +{
|
| + var frame = WebInspector.TimelineTreeView.eventStackFrame(event);
|
| + return frame && frame["url"] || null;
|
| }
|
|
|
| /**
|
| @@ -309,8 +330,9 @@ WebInspector.TimelineTreeView.eventURL = function(event)
|
| * @param {number} grandTotalTime
|
| * @param {number} maxSelfTime
|
| * @param {number} maxTotalTime
|
| + * @param {!WebInspector.TimelineTreeView} treeView
|
| */
|
| -WebInspector.TimelineTreeView.GridNode = function(profileNode, grandTotalTime, maxSelfTime, maxTotalTime)
|
| +WebInspector.TimelineTreeView.GridNode = function(profileNode, grandTotalTime, maxSelfTime, maxTotalTime, treeView)
|
| {
|
| /**
|
| * @param {number} time
|
| @@ -331,6 +353,7 @@ WebInspector.TimelineTreeView.GridNode = function(profileNode, grandTotalTime, m
|
|
|
| this._populated = false;
|
| this._profileNode = profileNode;
|
| + this._treeView = treeView;
|
| this._totalTime = grandTotalTime;
|
| this._maxTimes = { self: maxSelfTime, total: maxTotalTime };
|
| var selfTime = profileNode.selfTime;
|
| @@ -377,9 +400,13 @@ WebInspector.TimelineTreeView.GridNode.prototype = {
|
| name.textContent = event.name === WebInspector.TimelineModel.RecordType.JSFrame
|
| ? WebInspector.beautifyFunctionName(event.args["data"]["functionName"])
|
| : WebInspector.TimelineUIUtils.eventTitle(event);
|
| - var url = WebInspector.TimelineTreeView.eventURL(event);
|
| + var frame = WebInspector.TimelineTreeView.eventStackFrame(event);
|
| + var scriptId = frame && frame["scriptId"];
|
| + var url = frame && frame["url"];
|
| + var lineNumber = frame && frame["lineNumber"] || 1;
|
| + var columnNumber = frame && frame["columnNumber"];
|
| if (url)
|
| - link.appendChild(WebInspector.linkifyResourceAsNode(url));
|
| + link.appendChild(this._treeView.linkifyLocation(scriptId, url, lineNumber, columnNumber));
|
| var category = WebInspector.TimelineUIUtils.eventStyle(event).category;
|
| icon.style.backgroundColor = category.fillColorStop1;
|
| } else {
|
| @@ -421,7 +448,7 @@ WebInspector.TimelineTreeView.GridNode.prototype = {
|
| if (!this._profileNode.children)
|
| return;
|
| for (var node of this._profileNode.children.values()) {
|
| - var gridNode = new WebInspector.TimelineTreeView.GridNode(node, this._totalTime, this._maxTimes.self, this._maxTimes.total);
|
| + var gridNode = new WebInspector.TimelineTreeView.GridNode(node, this._totalTime, this._maxTimes.self, this._maxTimes.total, this._treeView);
|
| this.insertChildOrdered(gridNode);
|
| }
|
| },
|
|
|