Chromium Code Reviews| Index: third_party/WebKit/Source/devtools/front_end/timeline/TimelineUIUtils.js |
| diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineUIUtils.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineUIUtils.js |
| index 20c5cbfbd22dbc75c3bbef99bc404106e83dbaab..585fa7eb47e1ff7adc79798ab402be677f7d6c9e 100644 |
| --- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineUIUtils.js |
| +++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineUIUtils.js |
| @@ -581,28 +581,30 @@ WebInspector.TimelineUIUtils.buildTraceEventDetails = function(event, model, lin |
| */ |
| WebInspector.TimelineUIUtils._buildTraceEventDetailsSynchronously = function(event, model, linkifier, detailed, relatedNodesMap) |
| { |
| - var fragment = createDocumentFragment(); |
| var stats = {}; |
| var recordTypes = WebInspector.TimelineModel.RecordType; |
| // This message may vary per event.name; |
| var relatedNodeLabel; |
| - var contentHelper = new WebInspector.TimelineDetailsContentHelper(model.target(), linkifier, relatedNodesMap, false); |
| + var contentHelper = new WebInspector.TimelineDetailsContentHelper(model.target(), linkifier, relatedNodesMap); |
| + contentHelper.addSection(WebInspector.TimelineUIUtils.eventTitle(event), WebInspector.TimelineUIUtils.eventStyle(event).category); |
| + |
| + var eventData = event.args["data"]; |
| + var initiator = event.initiator; |
| if (event.warning) |
| contentHelper.appendWarningRow(event); |
| + if (event.name === recordTypes.JSFrame) { |
| + var deoptReason = eventData["deoptReason"]; |
| + if (deoptReason && deoptReason != "no reason") |
| + contentHelper.appendWarningRow(event, WebInspector.TimelineModel.WarningType.V8Deopt); |
| + } |
| if (detailed) { |
| - contentHelper.appendTextRow(WebInspector.UIString("Type"), WebInspector.TimelineUIUtils.eventTitle(event)); |
| - contentHelper.appendTextRow(WebInspector.UIString("Total Time"), Number.millisToString(event.duration || 0, true)); |
| contentHelper.appendTextRow(WebInspector.UIString("Self Time"), Number.millisToString(event.selfTime, true)); |
| + contentHelper.appendTextRow(WebInspector.UIString("Total Time"), Number.millisToString(event.duration || 0, true)); |
| } |
| - if (event.previewElement) |
| - contentHelper.appendElementRow(WebInspector.UIString("Preview"), event.previewElement); |
| - |
| - var eventData = event.args["data"]; |
| - var initiator = event.initiator; |
| switch (event.name) { |
| case recordTypes.GCEvent: |
| @@ -615,9 +617,6 @@ WebInspector.TimelineUIUtils._buildTraceEventDetailsSynchronously = function(eve |
| var detailsNode = WebInspector.TimelineUIUtils.buildDetailsNodeForTraceEvent(event, model.target(), linkifier); |
| if (detailsNode) |
| contentHelper.appendElementRow(WebInspector.UIString("Function"), detailsNode); |
| - var deoptReason = eventData["deoptReason"]; |
| - if (deoptReason && deoptReason != "no reason") |
| - contentHelper.appendWarningRow(event, WebInspector.TimelineModel.WarningType.V8Deopt); |
| break; |
| case recordTypes.TimerFire: |
| case recordTypes.TimerInstall: |
| @@ -695,9 +694,6 @@ WebInspector.TimelineUIUtils._buildTraceEventDetailsSynchronously = function(eve |
| case recordTypes.Layout: |
| var beginData = event.args["beginData"]; |
| contentHelper.appendTextRow(WebInspector.UIString("Nodes That Need Layout"), beginData["dirtyObjects"]); |
| - contentHelper.appendTextRow(WebInspector.UIString("Layout Tree Size"), beginData["totalObjects"]); |
| - contentHelper.appendTextRow(WebInspector.UIString("Layout Scope"), |
| - beginData["partialLayout"] ? WebInspector.UIString("Partial") : WebInspector.UIString("Whole document")); |
| relatedNodeLabel = WebInspector.UIString("Layout root"); |
| break; |
| case recordTypes.ConsoleTime: |
| @@ -751,25 +747,32 @@ WebInspector.TimelineUIUtils._buildTraceEventDetailsSynchronously = function(eve |
| break; |
| } |
| + if (event.previewElement) { |
| + contentHelper.addSection(); |
| + contentHelper.appendElementRow(WebInspector.UIString("Preview"), event.previewElement); |
| + } |
| + |
| var relatedNode = contentHelper.nodeForBackendId(event.backendNodeId); |
| if (relatedNode) |
| contentHelper.appendElementRow(relatedNodeLabel || WebInspector.UIString("Related Node"), WebInspector.DOMPresentationUtils.linkifyNodeReference(relatedNode)); |
|
caseq
2015/12/09 02:28:15
So this will go into the same section with preview
|
| - if (eventData && eventData["scriptName"] && event.name !== recordTypes.FunctionCall) |
| + if (eventData && eventData["scriptName"] && event.name !== recordTypes.FunctionCall) { |
| + contentHelper.addSection(); |
| contentHelper.appendLocationRow(WebInspector.UIString("Function Call"), eventData["scriptName"], eventData["scriptLine"]); |
| + } |
| - if (event.stackTrace || (event.initiator && event.initiator.stackTrace) || event.invalidationTrackingEvents) |
| + if (event.stackTrace || (event.initiator && event.initiator.stackTrace) || event.invalidationTrackingEvents) { |
|
alph
2015/12/09 02:51:56
drop {}
|
| WebInspector.TimelineUIUtils._generateCauses(event, model.target(), contentHelper); |
| + } |
| var showPieChart = detailed && WebInspector.TimelineUIUtils._aggregatedStatsForTraceEvent(stats, model, event); |
| if (showPieChart) { |
| + contentHelper.addSection(WebInspector.UIString("Aggregated Time")); |
|
alph
2015/12/09 02:51:56
could you turn it into the element name?
|
| var pieChart = WebInspector.TimelineUIUtils.generatePieChart(stats, WebInspector.TimelineUIUtils.eventStyle(event).category, event.selfTime); |
| - contentHelper.appendElementRow(WebInspector.UIString("Aggregated Time"), pieChart); |
| + contentHelper.appendElementRow("", pieChart); |
| } |
| - fragment.appendChild(contentHelper.element); |
| - |
| - return fragment; |
| + return contentHelper.fragment; |
| } |
| WebInspector.TimelineUIUtils._aggregatedStatsKey = Symbol("aggregatedStats"); |
| @@ -778,7 +781,7 @@ WebInspector.TimelineUIUtils._aggregatedStatsKey = Symbol("aggregatedStats"); |
| * @param {!WebInspector.TimelineModel} model |
| * @param {number} startTime |
| * @param {number} endTime |
| - * @return {!Element} |
| + * @return {!DocumentFragment} |
| */ |
| WebInspector.TimelineUIUtils.buildRangeStats = function(model, startTime, endTime) |
| { |
| @@ -819,15 +822,14 @@ WebInspector.TimelineUIUtils.buildRangeStats = function(model, startTime, endTim |
| aggregatedTotal += aggregatedStats[categoryName]; |
| aggregatedStats["idle"] = Math.max(0, endTime - startTime - aggregatedTotal); |
| - var contentHelper = new WebInspector.TimelineDetailsContentHelper(null, null, null, false); |
| - var pieChart = WebInspector.TimelineUIUtils.generatePieChart(aggregatedStats); |
| - |
| var startOffset = startTime - model.minimumRecordTime(); |
| var endOffset = endTime - model.minimumRecordTime(); |
| - contentHelper.appendTextRow(WebInspector.UIString("Range"), WebInspector.UIString("%s \u2013 %s", Number.millisToString(startOffset), Number.millisToString(endOffset))); |
| - contentHelper.appendElementRow(WebInspector.UIString("Aggregated Time"), pieChart); |
| - return contentHelper.element; |
| + var contentHelper = new WebInspector.TimelineDetailsContentHelper(null, null, null); |
| + contentHelper.addSection(WebInspector.UIString("Range: %s \u2013 %s", Number.millisToString(startOffset), Number.millisToString(endOffset))); |
| + var pieChart = WebInspector.TimelineUIUtils.generatePieChart(aggregatedStats); |
| + contentHelper.appendElementRow("", pieChart); |
| + return contentHelper.fragment; |
| } |
| /** |
| @@ -888,9 +890,8 @@ WebInspector.TimelineUIUtils.buildNetworkRequestInfo = function(request) |
| */ |
| WebInspector.TimelineUIUtils.buildNetworkRequestDetails = function(request, model, linkifier) |
| { |
| - var fragment = createDocumentFragment(); |
| var target = model.target(); |
| - var contentHelper = new WebInspector.TimelineDetailsContentHelper(target, linkifier, null, true); |
| + var contentHelper = new WebInspector.TimelineDetailsContentHelper(target, linkifier, null); |
| var info = WebInspector.TimelineUIUtils.buildNetworkRequestInfo(request); |
| for (var item of info) { |
| @@ -928,8 +929,7 @@ WebInspector.TimelineUIUtils.buildNetworkRequestDetails = function(request, mode |
| { |
| if (element) |
| contentHelper.appendElementRow(WebInspector.UIString("Preview"), request.previewElement); |
| - fragment.appendChild(contentHelper.element); |
| - return fragment; |
| + return contentHelper.fragment; |
| } |
| return previewPromise.then(appendPreview); |
| } |
| @@ -968,8 +968,10 @@ WebInspector.TimelineUIUtils._generateCauses = function(event, target, contentHe |
| } |
| // Direct cause. |
| - if (event.stackTrace) |
| + if (event.stackTrace && event.stackTrace.length) { |
| + contentHelper.addSection(WebInspector.UIString("Call Stacks")); |
| contentHelper.appendStackTrace(stackLabel || WebInspector.UIString("Stack Trace"), event.stackTrace); |
|
alph
2015/12/09 02:51:56
Two titles "call stacks" and "stack trace" look st
|
| + } |
| // Indirect causes. |
| if (event.invalidationTrackingEvents && target) { // Full invalidation tracking (experimental). |
| @@ -1547,19 +1549,21 @@ WebInspector.TimelineUIUtils.generatePieChart = function(aggregatedStats, selfCa |
| WebInspector.TimelineUIUtils.generateDetailsContentForFrame = function(frameModel, frame, filmStripFrame) |
| { |
| var pieChart = WebInspector.TimelineUIUtils.generatePieChart(frame.timeByCategory); |
| - var contentHelper = new WebInspector.TimelineDetailsContentHelper(null, null, null, false); |
| + var contentHelper = new WebInspector.TimelineDetailsContentHelper(null, null, null); |
| + contentHelper.addSection(WebInspector.UIString("Frame")); |
| + |
| var duration = WebInspector.TimelineUIUtils.frameDuration(frame); |
| contentHelper.appendElementRow(WebInspector.UIString("Duration"), duration, frame.hasWarnings()); |
| if (filmStripFrame) { |
| var filmStripPreview = createElementWithClass("img", "timeline-filmstrip-preview"); |
| filmStripFrame.imageDataPromise().then(onGotImageData.bind(null, filmStripPreview)); |
| - contentHelper.appendElementRow(WebInspector.UIString("Screenshot"), filmStripPreview); |
| + contentHelper.appendElementRow("", filmStripPreview); |
| filmStripPreview.addEventListener("click", frameClicked.bind(null, filmStripFrame), false); |
| } |
| var durationInMillis = frame.endTime - frame.startTime; |
| contentHelper.appendTextRow(WebInspector.UIString("FPS"), Math.floor(1000 / durationInMillis)); |
| contentHelper.appendTextRow(WebInspector.UIString("CPU time"), Number.millisToString(frame.cpuTime, true)); |
| - contentHelper.appendElementRow(WebInspector.UIString("Aggregated Time"), pieChart); |
| + |
| if (Runtime.experiments.isEnabled("layersPanel") && frame.layerTree) { |
| contentHelper.appendElementRow(WebInspector.UIString("Layer tree"), |
| WebInspector.Linkifier.linkifyUsingRevealer(frame.layerTree, WebInspector.UIString("show"))); |
| @@ -1583,7 +1587,7 @@ WebInspector.TimelineUIUtils.generateDetailsContentForFrame = function(frameMode |
| new WebInspector.FilmStripView.Dialog(filmStripFrame, 0); |
| } |
| - return contentHelper.element; |
| + return contentHelper.fragment; |
| } |
| /** |
| @@ -1923,20 +1927,46 @@ WebInspector.TimelinePopupContentHelper.prototype = { |
| * @param {?WebInspector.Target} target |
| * @param {?WebInspector.Linkifier} linkifier |
| * @param {?Map<number, ?WebInspector.DOMNode>} relatedNodesMap |
| - * @param {boolean} monospaceValues |
| */ |
| -WebInspector.TimelineDetailsContentHelper = function(target, linkifier, relatedNodesMap, monospaceValues) |
| +WebInspector.TimelineDetailsContentHelper = function(target, linkifier, relatedNodesMap) |
| { |
| + this.fragment = createDocumentFragment(); |
| + |
| this._linkifier = linkifier; |
| this._target = target; |
| this._relatedNodesMap = relatedNodesMap; |
| - this.element = createElement("div"); |
| - this.element.className = "timeline-details-view-block"; |
| - this._monospaceValues = monospaceValues; |
| + |
| + this.element = createElementWithClass("div", "timeline-details-view-block"); |
|
caseq
2015/12/09 02:28:15
s/element/_currentElement/ (note this needs to be
|
| + this._tableElement = this.element.createChild("div", "vbox timeline-details-chip-body"); |
| + this.fragment.appendChild(this.element); |
| } |
| WebInspector.TimelineDetailsContentHelper.prototype = { |
| /** |
| + * @param {string=} title |
| + * @param {!WebInspector.TimelineCategory=} category |
| + */ |
| + addSection: function(title, category) |
| + { |
| + if (!this._tableElement.hasChildNodes()) { |
| + this.element.removeChildren(); |
| + } else { |
| + this.element = createElementWithClass("div", "timeline-details-view-block"); |
| + this.fragment.appendChild(this.element); |
| + } |
| + |
| + if (title) { |
| + var titleElement = this.element.createChild("div", "timeline-details-chip-title"); |
| + if (category) |
| + titleElement.createChild("div", "timeline-" + category.name); |
| + titleElement.createTextChild(title); |
| + } |
| + |
| + this._tableElement = this.element.createChild("div", "vbox timeline-details-chip-body"); |
| + this.fragment.appendChild(this.element); |
| + }, |
| + |
| + /** |
| * @return {?WebInspector.Linkifier} |
| */ |
| linkifier: function() |
| @@ -1961,24 +1991,27 @@ WebInspector.TimelineDetailsContentHelper.prototype = { |
| */ |
| appendTextRow: function(title, value) |
| { |
| - var rowElement = this.element.createChild("div", "timeline-details-view-row"); |
| + var rowElement = this._tableElement.createChild("div", "timeline-details-view-row"); |
| rowElement.createChild("div", "timeline-details-view-row-title").textContent = title; |
| - rowElement.createChild("div", "timeline-details-view-row-value" + (this._monospaceValues ? " monospace" : "")).textContent = value; |
| + rowElement.createChild("div", "timeline-details-view-row-value").textContent = value; |
| }, |
| /** |
| * @param {string} title |
| * @param {!Node|string} content |
| * @param {boolean=} isWarning |
| + * @param {boolean=} isStacked |
| */ |
| - appendElementRow: function(title, content, isWarning) |
| + appendElementRow: function(title, content, isWarning, isStacked) |
| { |
| - var rowElement = this.element.createChild("div", "timeline-details-view-row"); |
| + var rowElement = this._tableElement.createChild("div", "timeline-details-view-row"); |
| if (isWarning) |
| rowElement.classList.add("timeline-details-warning"); |
| + if (isStacked) |
| + rowElement.classList.add("timeline-details-stack-values"); |
| var titleElement = rowElement.createChild("div", "timeline-details-view-row-title"); |
| titleElement.textContent = title; |
| - var valueElement = rowElement.createChild("div", "timeline-details-view-row-value" + (this._monospaceValues ? " monospace" : "")); |
| + var valueElement = rowElement.createChild("div", "timeline-details-view-row-value"); |
| if (content instanceof Node) |
| valueElement.appendChild(content); |
| else |
| @@ -2025,7 +2058,7 @@ WebInspector.TimelineDetailsContentHelper.prototype = { |
| if (!this._linkifier || !this._target) |
| return; |
| - var rowElement = this.element.createChild("div", "timeline-details-view-row"); |
| + var rowElement = this._tableElement.createChild("div", "timeline-details-view-row"); |
| rowElement.createChild("div", "timeline-details-view-row-title").textContent = title; |
| this.createChildStackTraceElement(rowElement, stackTrace); |
| }, |
| @@ -2038,11 +2071,9 @@ WebInspector.TimelineDetailsContentHelper.prototype = { |
| { |
| if (!this._linkifier || !this._target) |
| return; |
| - |
| - var stackTraceElement = parentElement.createChild("div", "timeline-details-view-row-value timeline-details-view-row-stack-trace monospace"); |
| - |
| + parentElement.classList.add("timeline-details-stack-values"); |
| + var stackTraceElement = parentElement.createChild("div", "timeline-details-view-row-value timeline-details-view-row-stack-trace"); |
| var callFrameElem = WebInspector.DOMPresentationUtils.buildStackTracePreviewContents(this._target, this._linkifier, stackTrace); |
| - |
| stackTraceElement.appendChild(callFrameElem); |
| }, |