Index: Source/devtools/front_end/TimelineView.js |
diff --git a/Source/devtools/front_end/TimelineView.js b/Source/devtools/front_end/TimelineView.js |
index f3483016ceb851aacf37a358187acd8c4944d668..093994f4c0ef31d7cf6d68c8bb44bd9b28c94541 100644 |
--- a/Source/devtools/front_end/TimelineView.js |
+++ b/Source/devtools/front_end/TimelineView.js |
@@ -48,7 +48,7 @@ WebInspector.TimelineView = function(delegate, model, presentationModel, frameMo |
this._model = model; |
this._presentationModel = presentationModel; |
this._frameModel = frameModel; |
- this._calculator = new WebInspector.TimelineCalculator(this._presentationModel); |
+ this._calculator = new WebInspector.TimelineCalculator(model); |
this._linkifier = new WebInspector.Linkifier(); |
this._boundariesAreValid = true; |
@@ -111,11 +111,6 @@ WebInspector.TimelineView.prototype = { |
return recordsView; |
}, |
- get calculator() |
- { |
- return this._calculator; |
- }, |
- |
_rootRecord: function() |
{ |
return this._presentationModel.rootRecord(); |
@@ -195,21 +190,19 @@ WebInspector.TimelineView.prototype = { |
}, |
/** |
- * @param {!TimelineAgent.TimelineEvent} record |
- * @param {!Array.<!WebInspector.TimelinePresentationModel.Record>} presentationRecords |
+ * @param {!WebInspector.TimelineModel.Record} record |
*/ |
- addRecord: function(record, presentationRecords) |
+ addRecord: function(record) |
{ |
- if (this._innerAddRecordToTimeline(record, presentationRecords)) |
+ if (this._innerAddRecordToTimeline(record)) |
this._invalidateAndScheduleRefresh(false, false); |
}, |
/** |
- * @param {!TimelineAgent.TimelineEvent} record |
- * @param {!Array.<!WebInspector.TimelinePresentationModel.Record>} presentationRecords |
+ * @param {!WebInspector.TimelineModel.Record} record |
* @return {boolean} |
*/ |
- _innerAddRecordToTimeline: function(record, presentationRecords) |
+ _innerAddRecordToTimeline: function(record) |
{ |
if (record.type === WebInspector.TimelineModel.RecordType.GPUTask) |
return record.startTime < this._windowEndTime; |
@@ -220,14 +213,8 @@ WebInspector.TimelineView.prototype = { |
{ |
hasVisibleRecords |= presentationModel.isVisible(record); |
} |
- WebInspector.TimelinePresentationModel.forAllRecords(presentationRecords, checkVisible); |
- |
- function isAdoptedRecord(record) |
- { |
- return record.parent !== presentationModel.rootRecord; |
- } |
- // Tell caller update is necessary either if we added a visible record or if we re-parented a record. |
- return hasVisibleRecords || presentationRecords.some(isAdoptedRecord); |
+ WebInspector.TimelineModel.forAllRecords([record], checkVisible); |
+ return hasVisibleRecords; |
}, |
/** |
@@ -337,38 +324,35 @@ WebInspector.TimelineView.prototype = { |
*/ |
_selectRecord: function(record) |
{ |
- this._delegate.selectRecord(record); |
+ this._delegate.selectRecord(record ? record.record() : null); |
}, |
/** |
- * @param {?WebInspector.TimelinePresentationModel.Record} record |
+ * @param {?WebInspector.TimelineModel.Record} record |
*/ |
setSelectedRecord: function(record) |
{ |
- if (record === this._lastSelectedRecord) |
+ var presentationRecord = this._presentationModel.toPresentationRecord(record); |
+ if (presentationRecord === this._lastSelectedRecord) |
return; |
- // Remove selection rendering. |
+ // Remove selection rendering.p |
if (this._lastSelectedRecord) { |
- var listRow = /** @type {!WebInspector.TimelineRecordListRow} */ (this._lastSelectedRecord.getUserObject("WebInspector.TimelineRecordListRow")); |
- if (listRow) |
- listRow.renderAsSelected(false); |
- var graphRow = /** @type {!WebInspector.TimelineRecordGraphRow} */ (this._lastSelectedRecord.getUserObject("WebInspector.TimelineRecordGraphRow")); |
- if (graphRow) |
- graphRow.renderAsSelected(false); |
+ if (this._lastSelectedRecord.listRow()) |
+ this._lastSelectedRecord.listRow().renderAsSelected(false); |
+ if (this._lastSelectedRecord.graphRow()) |
+ this._lastSelectedRecord.graphRow().renderAsSelected(false); |
} |
- this._lastSelectedRecord = record; |
- if (!record) |
+ this._lastSelectedRecord = presentationRecord; |
+ if (!presentationRecord) |
return; |
- this._innerRevealRecord(record); |
- var listRow = /** @type {!WebInspector.TimelineRecordListRow} */ (record.getUserObject("WebInspector.TimelineRecordListRow")); |
- if (listRow) |
- listRow.renderAsSelected(true); |
- var graphRow = /** @type {!WebInspector.TimelineRecordListRow} */ (record.getUserObject("WebInspector.TimelineRecordGraphRow")); |
- if (graphRow) |
- graphRow.renderAsSelected(true); |
+ this._innerRevealRecord(presentationRecord); |
+ if (presentationRecord.listRow()) |
+ presentationRecord.listRow().renderAsSelected(true); |
+ if (presentationRecord.graphRow()) |
+ presentationRecord.graphRow().renderAsSelected(true); |
}, |
/** |
@@ -413,6 +397,10 @@ WebInspector.TimelineView.prototype = { |
var windowStartTime = this._windowStartTime; |
var windowEndTime = this._windowEndTime; |
this._timelinePaddingLeft = this._expandOffset; |
+ if (windowStartTime === -1) |
+ windowStartTime = this._model.minimumRecordTime(); |
+ if (windowEndTime === -1) |
+ windowEndTime = this._model.maximumRecordTime(); |
this._calculator.setWindow(windowStartTime, windowEndTime); |
this._calculator.setDisplayWindow(this._timelinePaddingLeft, this._graphRowsElementWidth); |
@@ -444,11 +432,11 @@ WebInspector.TimelineView.prototype = { |
{ |
var needRefresh = false; |
// Expand all ancestors. |
- for (var parent = recordToReveal.parent; parent !== this._rootRecord(); parent = parent.parent) { |
- if (!parent.collapsed) |
+ for (var parent = recordToReveal.presentationParent(); parent !== this._rootRecord(); parent = parent.presentationParent()) { |
+ if (!parent.collapsed()) |
continue; |
this._presentationModel.invalidateFilteredRecords(); |
- parent.collapsed = false; |
+ parent.setCollapsed(false); |
needRefresh = true; |
} |
var recordsInWindow = this._presentationModel.filteredRecords(); |
@@ -484,8 +472,8 @@ WebInspector.TimelineView.prototype = { |
this._automaticallySizeWindow = false; |
this._selectRecord(null); |
// If we're at the top, always use real timeline start as a left window bound so that expansion arrow padding logic works. |
- var windowStartTime = startIndex ? recordsInWindow[startIndex].startTime : this._presentationModel.minimumRecordTime(); |
- var windowEndTime = recordsInWindow[Math.max(0, lastVisibleLine - 1)].endTime; |
+ var windowStartTime = startIndex ? recordsInWindow[startIndex].record().startTime : this._presentationModel.minimumRecordTime(); |
+ var windowEndTime = recordsInWindow[Math.max(0, lastVisibleLine - 1)].record().endTime; |
this._delegate.requestWindowTimes(windowStartTime, windowEndTime); |
recordsInWindow = this._presentationModel.filteredRecords(); |
endIndex = Math.min(recordsInWindow.length, lastVisibleLine); |
@@ -572,7 +560,7 @@ WebInspector.TimelineView.prototype = { |
/** |
* @param {string} name |
- * @param {!Array.<!TimelineAgent.TimelineEvent>} tasks |
+ * @param {!Array.<!WebInspector.TimelineModel.Record>} tasks |
* @param {?Element} container |
*/ |
_refreshUtilizationBars: function(name, tasks, container) |
@@ -594,7 +582,7 @@ WebInspector.TimelineView.prototype = { |
/** |
* @param {number} value |
- * @param {!TimelineAgent.TimelineEvent} task |
+ * @param {!WebInspector.TimelineModel.Record} task |
* @return {number} |
*/ |
function compareEndTime(value, task) |
@@ -679,8 +667,8 @@ WebInspector.TimelineView.prototype = { |
_mouseMove: function(e) |
{ |
var rowElement = e.target.enclosingNodeOrSelfWithClass("timeline-tree-item"); |
- if (rowElement && rowElement.row && rowElement.row._record.highlightQuad) |
- this._highlightQuad(rowElement.row._record.highlightQuad); |
+ if (rowElement && rowElement.row && rowElement.row._record.record().highlightQuad) |
+ this._highlightQuad(rowElement.row._record.record().highlightQuad); |
else |
this._hideQuadHighlight(); |
@@ -711,11 +699,11 @@ WebInspector.TimelineView.prototype = { |
switch (event.keyIdentifier) { |
case "Left": |
- if (record.parent) { |
- if ((!record.expandable || record.collapsed) && record.parent !== this._presentationModel.rootRecord()) { |
- this._selectRecord(record.parent); |
+ if (record.presentationParent()) { |
+ if ((!record.expandable() || record.collapsed()) && record.presentationParent() !== this._presentationModel.rootRecord()) { |
+ this._selectRecord(record.presentationParent()); |
} else { |
- record.collapsed = true; |
+ record.setCollapsed(true); |
record.clicked = true; |
this._invalidateAndScheduleRefresh(true, true); |
} |
@@ -729,8 +717,8 @@ WebInspector.TimelineView.prototype = { |
event.consume(true); |
break; |
case "Right": |
- if (record.expandable && record.collapsed) { |
- record.collapsed = false; |
+ if (record.expandable() && record.collapsed()) { |
+ record.setCollapsed(false); |
record.clicked = true; |
this._invalidateAndScheduleRefresh(true, true); |
} else { |
@@ -801,11 +789,8 @@ WebInspector.TimelineView.prototype = { |
if (anchor.classList.contains("timeline-frame-strip")) { |
var frame = anchor._frame; |
popover.show(WebInspector.TimelineUIUtils.generatePopupContentForFrame(frame), anchor); |
- } else { |
- if (anchor.row && anchor.row._record) |
- WebInspector.TimelineUIUtils.generatePopupContent(anchor.row._record, this._linkifier, showCallback); |
- else if (anchor._tasksInfo) |
- popover.show(WebInspector.TimelineUIUtils.generateMainThreadBarPopupContent(this._model, anchor._tasksInfo), anchor, null, null, WebInspector.Popover.Orientation.Bottom); |
+ } else if (anchor._tasksInfo) { |
+ popover.show(WebInspector.TimelineUIUtils.generateMainThreadBarPopupContent(this._model, anchor._tasksInfo), anchor, null, null, WebInspector.Popover.Orientation.Bottom); |
} |
function showCallback(popupContent) |
@@ -829,7 +814,7 @@ WebInspector.TimelineView.prototype = { |
}, |
/** |
- * @param {?WebInspector.TimelinePresentationModel.Record} record |
+ * @param {?WebInspector.TimelineModel.Record} record |
* @param {string=} regex |
* @param {boolean=} selectRecord |
*/ |
@@ -839,14 +824,15 @@ WebInspector.TimelineView.prototype = { |
WebInspector.revertDomChanges(this._highlightDomChanges); |
this._highlightDomChanges = []; |
- if (!record) |
+ var presentationRecord = this._presentationModel.toPresentationRecord(record); |
+ if (!presentationRecord) |
return; |
if (selectRecord) |
- this._selectRecord(record); |
+ this._selectRecord(presentationRecord); |
for (var element = this._sidebarListElement.firstChild; element; element = element.nextSibling) { |
- if (element.row._record === record) { |
+ if (element.row._record === presentationRecord) { |
element.row.highlight(regex, this._highlightDomChanges); |
break; |
} |
@@ -858,12 +844,12 @@ WebInspector.TimelineView.prototype = { |
/** |
* @constructor |
- * @param {!WebInspector.TimelinePresentationModel} presentationModel |
+ * @param {!WebInspector.TimelineModel} model |
* @implements {WebInspector.TimelineGrid.Calculator} |
*/ |
-WebInspector.TimelineCalculator = function(presentationModel) |
+WebInspector.TimelineCalculator = function(model) |
{ |
- this._presentationModel = presentationModel; |
+ this._model = model; |
} |
WebInspector.TimelineCalculator._minWidth = 5; |
@@ -894,7 +880,7 @@ WebInspector.TimelineCalculator.prototype = { |
var start = (record.startTime - this._minimumBoundary) / this.boundarySpan() * 100; |
var end = (record.startTime + record.selfTime - this._minimumBoundary) / this.boundarySpan() * 100; |
var endWithChildren = (record.lastChildEndTime - this._minimumBoundary) / this.boundarySpan() * 100; |
- var cpuWidth = record.coalesced ? endWithChildren - start : record.cpuTime / this.boundarySpan() * 100; |
+ var cpuWidth = record.cpuTime / this.boundarySpan() * 100; |
return {start: start, end: end, endWithChildren: endWithChildren, cpuWidth: cpuWidth}; |
}, |
@@ -966,7 +952,7 @@ WebInspector.TimelineCalculator.prototype = { |
*/ |
zeroTime: function() |
{ |
- return this._presentationModel.minimumRecordTime(); |
+ return this._model.minimumRecordTime(); |
}, |
/** |
@@ -1008,18 +994,23 @@ WebInspector.TimelineRecordListRow = function(linkifier, selectRecord, scheduleR |
} |
WebInspector.TimelineRecordListRow.prototype = { |
- update: function(record, offset) |
+ /** |
+ * @param {!WebInspector.TimelinePresentationModel.Record} presentationRecord |
+ * @param {number} offset |
+ */ |
+ update: function(presentationRecord, offset) |
{ |
- this._record = record; |
+ this._record = presentationRecord; |
+ var record = presentationRecord.record(); |
this._offset = offset; |
this.element.className = "timeline-tree-item timeline-category-" + record.category.name; |
var paddingLeft = 5; |
var step = -3; |
- for (var currentRecord = record.parent ? record.parent.parent : null; currentRecord; currentRecord = currentRecord.parent) |
+ for (var currentRecord = presentationRecord.presentationParent() ? presentationRecord.presentationParent().presentationParent() : null; currentRecord; currentRecord = currentRecord.presentationParent()) |
paddingLeft += 12 / (Math.max(1, step++)); |
this.element.style.paddingLeft = paddingLeft + "px"; |
- if (record.isBackground()) |
+ if (record.thread) |
this.element.classList.add("background"); |
this._typeElement.textContent = record.title(); |
@@ -1027,18 +1018,23 @@ WebInspector.TimelineRecordListRow.prototype = { |
if (this._dataElement.firstChild) |
this._dataElement.removeChildren(); |
- this._warningElement.enableStyleClass("hidden", !record.hasWarnings() && !record.childHasWarnings()); |
- this._warningElement.enableStyleClass("timeline-tree-item-child-warning", record.childHasWarnings() && !record.hasWarnings()); |
+ this._warningElement.enableStyleClass("hidden", !presentationRecord.hasWarnings() && !presentationRecord.childHasWarnings()); |
+ this._warningElement.enableStyleClass("timeline-tree-item-child-warning", presentationRecord.childHasWarnings() && !presentationRecord.hasWarnings()); |
- var detailsNode = WebInspector.TimelineUIUtils.buildDetailsNode(record, this._linkifier); |
- if (detailsNode) { |
- this._dataElement.appendChild(document.createTextNode("(")); |
- this._dataElement.appendChild(detailsNode); |
- this._dataElement.appendChild(document.createTextNode(")")); |
+ if (presentationRecord.coalesced()) { |
+ this._dataElement.createTextChild(WebInspector.UIString("× %d", presentationRecord.presentationChildren().length)); |
+ } else { |
+ var detailsNode = WebInspector.TimelineUIUtils.buildDetailsNode(record, this._linkifier); |
+ if (detailsNode) { |
+ this._dataElement.appendChild(document.createTextNode("(")); |
+ this._dataElement.appendChild(detailsNode); |
+ this._dataElement.appendChild(document.createTextNode(")")); |
+ } |
} |
- this._expandArrowElement.enableStyleClass("parent", record.children && record.children.length); |
- this._expandArrowElement.enableStyleClass("expanded", record.visibleChildrenCount); |
- this._record.setUserObject("WebInspector.TimelineRecordListRow", this); |
+ |
+ this._expandArrowElement.enableStyleClass("parent", presentationRecord.hasPresentationChildren()); |
+ this._expandArrowElement.enableStyleClass("expanded", presentationRecord.visibleChildrenCount()); |
+ this._record.setListRow(this); |
}, |
highlight: function(regExp, domChanges) |
@@ -1058,7 +1054,7 @@ WebInspector.TimelineRecordListRow.prototype = { |
*/ |
_onExpandClick: function(event) |
{ |
- this._record.collapsed = !this._record.collapsed; |
+ this._record.setCollapsed(!this._record.collapsed()); |
this._record.clicked = true; |
this._scheduleRefresh(); |
event.consume(true); |
@@ -1086,8 +1082,8 @@ WebInspector.TimelineRecordListRow.prototype = { |
_onMouseOver: function(event) |
{ |
this.element.classList.add("hovered"); |
- var graphRow = /** @type {!WebInspector.TimelineRecordGraphRow} */ (this._record.getUserObject("WebInspector.TimelineRecordGraphRow")); |
- graphRow.element.classList.add("hovered"); |
+ if (this._record.graphRow()) |
+ this._record.graphRow().element.classList.add("hovered"); |
}, |
/** |
@@ -1096,8 +1092,8 @@ WebInspector.TimelineRecordListRow.prototype = { |
_onMouseOut: function(event) |
{ |
this.element.classList.remove("hovered"); |
- var graphRow = /** @type {!WebInspector.TimelineRecordGraphRow} */ (this._record.getUserObject("WebInspector.TimelineRecordGraphRow")); |
- graphRow.element.classList.remove("hovered"); |
+ if (this._record.graphRow()) |
+ this._record.graphRow().element.classList.remove("hovered"); |
} |
} |
@@ -1140,23 +1136,29 @@ WebInspector.TimelineRecordGraphRow = function(graphContainer, selectRecord, sch |
} |
WebInspector.TimelineRecordGraphRow.prototype = { |
- update: function(record, calculator, expandOffset, index) |
+ /** |
+ * @param {!WebInspector.TimelinePresentationModel.Record} presentationRecord |
+ * @param {!WebInspector.TimelineCalculator} calculator |
+ * @param {number} expandOffset |
+ * @param {number} index |
+ */ |
+ update: function(presentationRecord, calculator, expandOffset, index) |
{ |
- this._record = record; |
+ this._record = presentationRecord; |
+ var record = presentationRecord.record(); |
this.element.className = "timeline-graph-side timeline-category-" + record.category.name; |
- if (record.isBackground()) |
+ if (record.thread) |
this.element.classList.add("background"); |
var barPosition = calculator.computeBarGraphWindowPosition(record); |
this._barWithChildrenElement.style.left = barPosition.left + "px"; |
this._barWithChildrenElement.style.width = barPosition.widthWithChildren + "px"; |
this._barElement.style.left = barPosition.left + "px"; |
- this._barElement.style.width = barPosition.width + "px"; |
+ this._barElement.style.width = (presentationRecord.coalesced() ? barPosition.widthWithChildren : barPosition.width) + "px"; |
this._barCpuElement.style.left = barPosition.left + "px"; |
- this._barCpuElement.style.width = barPosition.cpuWidth + "px"; |
- this._expandElement._update(record, index, barPosition.left - expandOffset, barPosition.width); |
- |
- this._record.setUserObject("WebInspector.TimelineRecordGraphRow", this); |
+ this._barCpuElement.style.width = (presentationRecord.coalesced() ? barPosition.widthWithChildren : barPosition.cpuWidth) + "px"; |
+ this._expandElement._update(presentationRecord, index, barPosition.left - expandOffset, barPosition.width); |
+ this._record.setGraphRow(this); |
}, |
/** |
@@ -1180,7 +1182,7 @@ WebInspector.TimelineRecordGraphRow.prototype = { |
_expand: function() |
{ |
- this._record.collapsed = !this._record.collapsed; |
+ this._record.setCollapsed(!this._record.collapsed()); |
this._record.clicked = true; |
this._scheduleRefresh(); |
}, |
@@ -1191,8 +1193,8 @@ WebInspector.TimelineRecordGraphRow.prototype = { |
_onMouseOver: function(event) |
{ |
this.element.classList.add("hovered"); |
- var listRow = /** @type {!WebInspector.TimelineRecordListRow} */ (this._record.getUserObject("WebInspector.TimelineRecordListRow")); |
- listRow.element.classList.add("hovered"); |
+ if (this._record.listRow()) |
+ this._record.listRow().element.classList.add("hovered"); |
}, |
/** |
@@ -1201,8 +1203,8 @@ WebInspector.TimelineRecordGraphRow.prototype = { |
_onMouseOut: function(event) |
{ |
this.element.classList.remove("hovered"); |
- var listRow = /** @type {!WebInspector.TimelineRecordListRow} */ (this._record.getUserObject("WebInspector.TimelineRecordListRow")); |
- listRow.element.classList.remove("hovered"); |
+ if (this._record.listRow()) |
+ this._record.listRow().element.classList.remove("hovered"); |
}, |
dispose: function() |
@@ -1223,6 +1225,9 @@ WebInspector.TimelineExpandableElement = function(container) |
} |
WebInspector.TimelineExpandableElement.prototype = { |
+ /** |
+ * @param {!WebInspector.TimelinePresentationModel.Record} record |
+ */ |
_update: function(record, index, left, width) |
{ |
const rowHeight = WebInspector.TimelinePanel.rowHeight; |
@@ -1230,7 +1235,7 @@ WebInspector.TimelineExpandableElement.prototype = { |
this._element.style.top = index * rowHeight + "px"; |
this._element.style.left = left + "px"; |
this._element.style.width = Math.max(12, width + 25) + "px"; |
- if (!record.collapsed) { |
+ if (!record.collapsed()) { |
this._element.style.height = (record.visibleChildrenCount + 1) * rowHeight + "px"; |
this._element.classList.add("timeline-expandable-expanded"); |
this._element.classList.remove("timeline-expandable-collapsed"); |