| Index: third_party/WebKit/Source/devtools/front_end/timeline/TimelineFlameChart.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineFlameChart.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineFlameChart.js
|
| index 90b564d01d94cdfe26b8184dc237db7a10bca496..4009404107ff7c597d79c13cd71809bc0f89885b 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineFlameChart.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineFlameChart.js
|
| @@ -27,1289 +27,1244 @@
|
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| */
|
| -
|
| /**
|
| - * @constructor
|
| * @implements {WebInspector.FlameChartDataProvider}
|
| - * @param {!WebInspector.TimelineModel} model
|
| - * @param {!Array<!WebInspector.TimelineModel.Filter>} filters
|
| + * @unrestricted
|
| */
|
| -WebInspector.TimelineFlameChartDataProviderBase = function(model, filters)
|
| -{
|
| +WebInspector.TimelineFlameChartDataProviderBase = class {
|
| + /**
|
| + * @param {!WebInspector.TimelineModel} model
|
| + * @param {!Array<!WebInspector.TimelineModel.Filter>} filters
|
| + */
|
| + constructor(model, filters) {
|
| WebInspector.FlameChartDataProvider.call(this);
|
| this.reset();
|
| this._model = model;
|
| /** @type {?WebInspector.FlameChart.TimelineData} */
|
| this._timelineData;
|
| - this._font = "11px " + WebInspector.fontFamily();
|
| + this._font = '11px ' + WebInspector.fontFamily();
|
| this._filters = filters;
|
| -};
|
| -
|
| -WebInspector.TimelineFlameChartDataProviderBase.prototype = {
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - barHeight: function()
|
| - {
|
| - return 17;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - textBaseline: function()
|
| - {
|
| - return 5;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - textPadding: function()
|
| - {
|
| - return 4;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} entryIndex
|
| - * @return {string}
|
| - */
|
| - entryFont: function(entryIndex)
|
| - {
|
| - return this._font;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} entryIndex
|
| - * @return {?string}
|
| - */
|
| - entryTitle: function(entryIndex)
|
| - {
|
| - return null;
|
| - },
|
| -
|
| - reset: function()
|
| - {
|
| - this._timelineData = null;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - minimumBoundary: function()
|
| - {
|
| - return this._minimumBoundary;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - totalTime: function()
|
| - {
|
| - return this._timeSpan;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} value
|
| - * @param {number=} precision
|
| - * @return {string}
|
| - */
|
| - formatValue: function(value, precision)
|
| - {
|
| - return Number.preciseMillisToString(value, precision);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - maxStackDepth: function()
|
| - {
|
| - return this._currentLevel;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} entryIndex
|
| - * @return {?Element}
|
| - */
|
| - prepareHighlightedEntryInfo: function(entryIndex)
|
| - {
|
| - return null;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} entryIndex
|
| - * @return {boolean}
|
| - */
|
| - canJumpToEntry: function(entryIndex)
|
| - {
|
| - return false;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} entryIndex
|
| - * @return {string}
|
| - */
|
| - entryColor: function(entryIndex)
|
| - {
|
| - return "red";
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} index
|
| - * @return {boolean}
|
| - */
|
| - forceDecoration: function(index)
|
| - {
|
| - return false;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} entryIndex
|
| - * @param {!CanvasRenderingContext2D} context
|
| - * @param {?string} text
|
| - * @param {number} barX
|
| - * @param {number} barY
|
| - * @param {number} barWidth
|
| - * @param {number} barHeight
|
| - * @param {number} unclippedBarX
|
| - * @param {number} timeToPixels
|
| - * @return {boolean}
|
| - */
|
| - decorateEntry: function(entryIndex, context, text, barX, barY, barWidth, barHeight, unclippedBarX, timeToPixels)
|
| - {
|
| - return false;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - paddingLeft: function()
|
| - {
|
| - return 0;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} entryIndex
|
| - * @return {string}
|
| - */
|
| - textColor: function(entryIndex)
|
| - {
|
| - return "#333";
|
| - },
|
| -
|
| - /**
|
| - * @param {number} entryIndex
|
| - * @return {?WebInspector.TimelineSelection}
|
| - */
|
| - createSelection: function(entryIndex)
|
| - {
|
| - return null;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!WebInspector.FlameChart.TimelineData}
|
| - */
|
| - timelineData: function()
|
| - {
|
| - throw new Error("Not implemented");
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.TracingModel.Event} event
|
| - * @return {boolean}
|
| - */
|
| - _isVisible: function(event)
|
| - {
|
| - return this._filters.every(function(filter) { return filter.accept(event); });
|
| - }
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + barHeight() {
|
| + return 17;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + textBaseline() {
|
| + return 5;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + textPadding() {
|
| + return 4;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} entryIndex
|
| + * @return {string}
|
| + */
|
| + entryFont(entryIndex) {
|
| + return this._font;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} entryIndex
|
| + * @return {?string}
|
| + */
|
| + entryTitle(entryIndex) {
|
| + return null;
|
| + }
|
| +
|
| + reset() {
|
| + this._timelineData = null;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + minimumBoundary() {
|
| + return this._minimumBoundary;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + totalTime() {
|
| + return this._timeSpan;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} value
|
| + * @param {number=} precision
|
| + * @return {string}
|
| + */
|
| + formatValue(value, precision) {
|
| + return Number.preciseMillisToString(value, precision);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + maxStackDepth() {
|
| + return this._currentLevel;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} entryIndex
|
| + * @return {?Element}
|
| + */
|
| + prepareHighlightedEntryInfo(entryIndex) {
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} entryIndex
|
| + * @return {boolean}
|
| + */
|
| + canJumpToEntry(entryIndex) {
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} entryIndex
|
| + * @return {string}
|
| + */
|
| + entryColor(entryIndex) {
|
| + return 'red';
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} index
|
| + * @return {boolean}
|
| + */
|
| + forceDecoration(index) {
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} entryIndex
|
| + * @param {!CanvasRenderingContext2D} context
|
| + * @param {?string} text
|
| + * @param {number} barX
|
| + * @param {number} barY
|
| + * @param {number} barWidth
|
| + * @param {number} barHeight
|
| + * @param {number} unclippedBarX
|
| + * @param {number} timeToPixels
|
| + * @return {boolean}
|
| + */
|
| + decorateEntry(entryIndex, context, text, barX, barY, barWidth, barHeight, unclippedBarX, timeToPixels) {
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + paddingLeft() {
|
| + return 0;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} entryIndex
|
| + * @return {string}
|
| + */
|
| + textColor(entryIndex) {
|
| + return '#333';
|
| + }
|
| +
|
| + /**
|
| + * @param {number} entryIndex
|
| + * @return {?WebInspector.TimelineSelection}
|
| + */
|
| + createSelection(entryIndex) {
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!WebInspector.FlameChart.TimelineData}
|
| + */
|
| + timelineData() {
|
| + throw new Error('Not implemented');
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TracingModel.Event} event
|
| + * @return {boolean}
|
| + */
|
| + _isVisible(event) {
|
| + return this._filters.every(function(filter) {
|
| + return filter.accept(event);
|
| + });
|
| + }
|
| };
|
|
|
| /**
|
| * @enum {symbol}
|
| */
|
| WebInspector.TimelineFlameChartEntryType = {
|
| - Frame: Symbol("Frame"),
|
| - Event: Symbol("Event"),
|
| - InteractionRecord: Symbol("InteractionRecord"),
|
| + Frame: Symbol('Frame'),
|
| + Event: Symbol('Event'),
|
| + InteractionRecord: Symbol('InteractionRecord'),
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.TimelineFlameChartDataProviderBase}
|
| - * @param {!WebInspector.TimelineModel} model
|
| - * @param {!WebInspector.TimelineFrameModel} frameModel
|
| - * @param {!WebInspector.TimelineIRModel} irModel
|
| - * @param {!Array<!WebInspector.TimelineModel.Filter>} filters
|
| + * @unrestricted
|
| */
|
| -WebInspector.TimelineFlameChartDataProvider = function(model, frameModel, irModel, filters)
|
| -{
|
| - WebInspector.TimelineFlameChartDataProviderBase.call(this, model, filters);
|
| +WebInspector.TimelineFlameChartDataProvider = class extends WebInspector.TimelineFlameChartDataProviderBase {
|
| + /**
|
| + * @param {!WebInspector.TimelineModel} model
|
| + * @param {!WebInspector.TimelineFrameModel} frameModel
|
| + * @param {!WebInspector.TimelineIRModel} irModel
|
| + * @param {!Array<!WebInspector.TimelineModel.Filter>} filters
|
| + */
|
| + constructor(model, frameModel, irModel, filters) {
|
| + super(model, filters);
|
| this._frameModel = frameModel;
|
| this._irModel = irModel;
|
| - this._consoleColorGenerator = new WebInspector.FlameChart.ColorGenerator(
|
| - { min: 30, max: 55 },
|
| - { min: 70, max: 100, count: 6 },
|
| - 50, 0.7);
|
| + this._consoleColorGenerator =
|
| + new WebInspector.FlameChart.ColorGenerator({min: 30, max: 55}, {min: 70, max: 100, count: 6}, 50, 0.7);
|
|
|
| this._headerLevel1 = {
|
| - padding: 4,
|
| - height: 17,
|
| - collapsible: true,
|
| - color: WebInspector.themeSupport.patchColor("#222", WebInspector.ThemeSupport.ColorUsage.Foreground),
|
| - font: this._font,
|
| - backgroundColor: WebInspector.themeSupport.patchColor("white", WebInspector.ThemeSupport.ColorUsage.Background),
|
| - nestingLevel: 0
|
| + padding: 4,
|
| + height: 17,
|
| + collapsible: true,
|
| + color: WebInspector.themeSupport.patchColor('#222', WebInspector.ThemeSupport.ColorUsage.Foreground),
|
| + font: this._font,
|
| + backgroundColor: WebInspector.themeSupport.patchColor('white', WebInspector.ThemeSupport.ColorUsage.Background),
|
| + nestingLevel: 0
|
| };
|
|
|
| this._headerLevel2 = {
|
| - padding: 2,
|
| - height: 17,
|
| - collapsible: false,
|
| - font: this._font,
|
| - color: WebInspector.themeSupport.patchColor("#222", WebInspector.ThemeSupport.ColorUsage.Foreground),
|
| - backgroundColor: WebInspector.themeSupport.patchColor("white", WebInspector.ThemeSupport.ColorUsage.Background),
|
| - nestingLevel: 1,
|
| - shareHeaderLine: true
|
| + padding: 2,
|
| + height: 17,
|
| + collapsible: false,
|
| + font: this._font,
|
| + color: WebInspector.themeSupport.patchColor('#222', WebInspector.ThemeSupport.ColorUsage.Foreground),
|
| + backgroundColor: WebInspector.themeSupport.patchColor('white', WebInspector.ThemeSupport.ColorUsage.Background),
|
| + nestingLevel: 1,
|
| + shareHeaderLine: true
|
| };
|
|
|
| this._interactionsHeaderLevel1 = {
|
| - padding: 4,
|
| - height: 17,
|
| - collapsible: true,
|
| - color: WebInspector.themeSupport.patchColor("#222", WebInspector.ThemeSupport.ColorUsage.Foreground),
|
| - font: this._font,
|
| - backgroundColor: WebInspector.themeSupport.patchColor("white", WebInspector.ThemeSupport.ColorUsage.Background),
|
| - nestingLevel: 0,
|
| - useFirstLineForOverview: true,
|
| - shareHeaderLine: true
|
| + padding: 4,
|
| + height: 17,
|
| + collapsible: true,
|
| + color: WebInspector.themeSupport.patchColor('#222', WebInspector.ThemeSupport.ColorUsage.Foreground),
|
| + font: this._font,
|
| + backgroundColor: WebInspector.themeSupport.patchColor('white', WebInspector.ThemeSupport.ColorUsage.Background),
|
| + nestingLevel: 0,
|
| + useFirstLineForOverview: true,
|
| + shareHeaderLine: true
|
| };
|
|
|
| this._interactionsHeaderLevel2 = {
|
| - padding: 2,
|
| - height: 17,
|
| - collapsible: true,
|
| - color: WebInspector.themeSupport.patchColor("#222", WebInspector.ThemeSupport.ColorUsage.Foreground),
|
| - font: this._font,
|
| - backgroundColor: WebInspector.themeSupport.patchColor("white", WebInspector.ThemeSupport.ColorUsage.Background),
|
| - nestingLevel: 1,
|
| - shareHeaderLine: true
|
| + padding: 2,
|
| + height: 17,
|
| + collapsible: true,
|
| + color: WebInspector.themeSupport.patchColor('#222', WebInspector.ThemeSupport.ColorUsage.Foreground),
|
| + font: this._font,
|
| + backgroundColor: WebInspector.themeSupport.patchColor('white', WebInspector.ThemeSupport.ColorUsage.Background),
|
| + nestingLevel: 1,
|
| + shareHeaderLine: true
|
| };
|
| -};
|
| -
|
| -WebInspector.TimelineFlameChartDataProvider.InstantEventVisibleDurationMs = 0.001;
|
| -
|
| -WebInspector.TimelineFlameChartDataProvider.prototype = {
|
| - /**
|
| - * @override
|
| - * @param {number} entryIndex
|
| - * @return {?string}
|
| - */
|
| - entryTitle: function(entryIndex)
|
| - {
|
| - var entryType = this._entryType(entryIndex);
|
| - if (entryType === WebInspector.TimelineFlameChartEntryType.Event) {
|
| - var event = /** @type {!WebInspector.TracingModel.Event} */ (this._entryData[entryIndex]);
|
| - if (event.phase === WebInspector.TracingModel.Phase.AsyncStepInto || event.phase === WebInspector.TracingModel.Phase.AsyncStepPast)
|
| - return event.name + ":" + event.args["step"];
|
| - if (event._blackboxRoot)
|
| - return WebInspector.UIString("Blackboxed");
|
| - var name = WebInspector.TimelineUIUtils.eventStyle(event).title;
|
| - // TODO(yurys): support event dividers
|
| - var detailsText = WebInspector.TimelineUIUtils.buildDetailsTextForTraceEvent(event, this._model.targetByEvent(event));
|
| - if (event.name === WebInspector.TimelineModel.RecordType.JSFrame && detailsText)
|
| - return detailsText;
|
| - return detailsText ? WebInspector.UIString("%s (%s)", name, detailsText) : name;
|
| - }
|
| - var title = this._entryIndexToTitle[entryIndex];
|
| - if (!title) {
|
| - title = WebInspector.UIString("Unexpected entryIndex %d", entryIndex);
|
| - console.error(title);
|
| - }
|
| - return title;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} index
|
| - * @return {string}
|
| - */
|
| - textColor: function(index)
|
| - {
|
| - var event = this._entryData[index];
|
| - if (event && event._blackboxRoot)
|
| - return "#888";
|
| - else
|
| - return WebInspector.TimelineFlameChartDataProviderBase.prototype.textColor.call(this, index);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - reset: function()
|
| - {
|
| - WebInspector.TimelineFlameChartDataProviderBase.prototype.reset.call(this);
|
| - /** @type {!Array<!WebInspector.TracingModel.Event|!WebInspector.TimelineFrame|!WebInspector.TimelineIRModel.Phases>} */
|
| - this._entryData = [];
|
| - /** @type {!Array<!WebInspector.TimelineFlameChartEntryType>} */
|
| - this._entryTypeByLevel = [];
|
| - /** @type {!Array<string>} */
|
| - this._entryIndexToTitle = [];
|
| - /** @type {!Array<!WebInspector.TimelineFlameChartMarker>} */
|
| - this._markers = [];
|
| - /** @type {!Map<!WebInspector.TimelineCategory, string>} */
|
| - this._asyncColorByCategory = new Map();
|
| - /** @type {!Map<!WebInspector.TimelineIRModel.Phases, string>} */
|
| - this._asyncColorByInteractionPhase = new Map();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!WebInspector.FlameChart.TimelineData}
|
| - */
|
| - timelineData: function()
|
| - {
|
| - if (this._timelineData)
|
| - return this._timelineData;
|
| -
|
| - this._timelineData = new WebInspector.FlameChart.TimelineData([], [], [], []);
|
| -
|
| - this._flowEventIndexById = {};
|
| - this._minimumBoundary = this._model.minimumRecordTime();
|
| - this._timeSpan = this._model.isEmpty() ? 1000 : this._model.maximumRecordTime() - this._minimumBoundary;
|
| - this._currentLevel = 0;
|
| - this._appendFrameBars(this._frameModel.frames());
|
| -
|
| - this._appendHeader(WebInspector.UIString("Interactions"), this._interactionsHeaderLevel1);
|
| - this._appendInteractionRecords();
|
| -
|
| - var asyncEventGroups = WebInspector.TimelineModel.AsyncEventGroup;
|
| - var inputLatencies = this._model.mainThreadAsyncEvents().get(asyncEventGroups.input);
|
| - if (inputLatencies && inputLatencies.length) {
|
| - var title = WebInspector.TimelineUIUtils.titleForAsyncEventGroup(asyncEventGroups.input);
|
| - this._appendAsyncEventsGroup(title, inputLatencies, this._interactionsHeaderLevel2);
|
| - }
|
| - var animations = this._model.mainThreadAsyncEvents().get(asyncEventGroups.animation);
|
| - if (animations && animations.length) {
|
| - var title = WebInspector.TimelineUIUtils.titleForAsyncEventGroup(asyncEventGroups.animation);
|
| - this._appendAsyncEventsGroup(title, animations, this._interactionsHeaderLevel2);
|
| - }
|
| - var threads = this._model.virtualThreads();
|
| - this._appendThreadTimelineData(WebInspector.UIString("Main"), this._model.mainThreadEvents(), this._model.mainThreadAsyncEvents(), true);
|
| - var compositorThreads = threads.filter(thread => thread.name.startsWith("CompositorTileWorker"));
|
| - var otherThreads = threads.filter(thread => !thread.name.startsWith("CompositorTileWorker"));
|
| - if (compositorThreads.length) {
|
| - this._appendHeader(WebInspector.UIString("Raster"), this._headerLevel1);
|
| - for (var i = 0; i < compositorThreads.length; ++i)
|
| - this._appendSyncEvents(compositorThreads[i].events, WebInspector.UIString("Rasterizer Thread %d", i), this._headerLevel2);
|
| - }
|
| - this._appendGPUEvents();
|
| -
|
| - otherThreads.forEach(thread => this._appendThreadTimelineData(thread.name, thread.events, thread.asyncEventsByGroup));
|
| -
|
| - /**
|
| - * @param {!WebInspector.TimelineFlameChartMarker} a
|
| - * @param {!WebInspector.TimelineFlameChartMarker} b
|
| - */
|
| - function compareStartTime(a, b)
|
| - {
|
| - return a.startTime() - b.startTime();
|
| - }
|
| -
|
| - this._markers.sort(compareStartTime);
|
| - this._timelineData.markers = this._markers;
|
| -
|
| - this._flowEventIndexById = {};
|
| - return this._timelineData;
|
| - },
|
| -
|
| - /**
|
| - * @param {string} threadTitle
|
| - * @param {!Array<!WebInspector.TracingModel.Event>} syncEvents
|
| - * @param {!Map<!WebInspector.TimelineModel.AsyncEventGroup, !Array<!WebInspector.TracingModel.AsyncEvent>>} asyncEvents
|
| - * @param {boolean=} forceExpanded
|
| - */
|
| - _appendThreadTimelineData: function(threadTitle, syncEvents, asyncEvents, forceExpanded)
|
| - {
|
| - this._appendAsyncEvents(asyncEvents);
|
| - this._appendSyncEvents(syncEvents, threadTitle, this._headerLevel1, forceExpanded);
|
| - },
|
| -
|
| - /**
|
| - * @param {!Array<!WebInspector.TracingModel.Event>} events
|
| - * @param {string} title
|
| - * @param {!WebInspector.FlameChart.GroupStyle} style
|
| - * @param {boolean=} forceExpanded
|
| - */
|
| - _appendSyncEvents: function(events, title, style, forceExpanded)
|
| - {
|
| - var openEvents = [];
|
| - var flowEventsEnabled = Runtime.experiments.isEnabled("timelineFlowEvents");
|
| - var blackboxingEnabled = Runtime.experiments.isEnabled("blackboxJSFramesOnTimeline");
|
| - var maxStackDepth = 0;
|
| - for (var i = 0; i < events.length; ++i) {
|
| - var e = events[i];
|
| - if (WebInspector.TimelineModel.isMarkerEvent(e))
|
| - this._markers.push(new WebInspector.TimelineFlameChartMarker(e.startTime, e.startTime - this._model.minimumRecordTime(), WebInspector.TimelineUIUtils.markerStyleForEvent(e)));
|
| - if (!WebInspector.TracingModel.isFlowPhase(e.phase)) {
|
| - if (!e.endTime && e.phase !== WebInspector.TracingModel.Phase.Instant)
|
| - continue;
|
| - if (WebInspector.TracingModel.isAsyncPhase(e.phase))
|
| - continue;
|
| - if (!this._isVisible(e))
|
| - continue;
|
| - }
|
| - while (openEvents.length && openEvents.peekLast().endTime <= e.startTime)
|
| - openEvents.pop();
|
| - e._blackboxRoot = false;
|
| - if (blackboxingEnabled && this._isBlackboxedEvent(e)) {
|
| - var parent = openEvents.peekLast();
|
| - if (parent && parent._blackboxRoot)
|
| - continue;
|
| - e._blackboxRoot = true;
|
| - }
|
| - if (title) {
|
| - this._appendHeader(title, style, forceExpanded);
|
| - title = "";
|
| - }
|
| -
|
| - var level = this._currentLevel + openEvents.length;
|
| - this._appendEvent(e, level);
|
| - if (flowEventsEnabled)
|
| - this._appendFlowEvent(e, level);
|
| - maxStackDepth = Math.max(maxStackDepth, openEvents.length + 1);
|
| - if (e.endTime)
|
| - openEvents.push(e);
|
| - }
|
| - this._entryTypeByLevel.length = this._currentLevel + maxStackDepth;
|
| - this._entryTypeByLevel.fill(WebInspector.TimelineFlameChartEntryType.Event, this._currentLevel);
|
| - this._currentLevel += maxStackDepth;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.TracingModel.Event} event
|
| - * @return {boolean}
|
| - */
|
| - _isBlackboxedEvent: function(event)
|
| - {
|
| - if (event.name !== WebInspector.TimelineModel.RecordType.JSFrame)
|
| - return false;
|
| - var url = event.args["data"]["url"];
|
| - return url && this._isBlackboxedURL(url);
|
| - },
|
| -
|
| - /**
|
| - * @param {string} url
|
| - * @return {boolean}
|
| - */
|
| - _isBlackboxedURL: function(url)
|
| - {
|
| - return WebInspector.blackboxManager.isBlackboxedURL(url);
|
| - },
|
| -
|
| - /**
|
| - * @param {!Map<!WebInspector.TimelineModel.AsyncEventGroup, !Array<!WebInspector.TracingModel.AsyncEvent>>} asyncEvents
|
| - */
|
| - _appendAsyncEvents: function(asyncEvents)
|
| - {
|
| - var groups = WebInspector.TimelineModel.AsyncEventGroup;
|
| - var groupArray = Object.keys(groups).map(key => groups[key]);
|
| -
|
| - groupArray.remove(groups.animation);
|
| - groupArray.remove(groups.input);
|
| -
|
| - for (var groupIndex = 0; groupIndex < groupArray.length; ++groupIndex) {
|
| - var group = groupArray[groupIndex];
|
| - var events = asyncEvents.get(group);
|
| - if (!events)
|
| - continue;
|
| - var title = WebInspector.TimelineUIUtils.titleForAsyncEventGroup(group);
|
| - this._appendAsyncEventsGroup(title, events, this._headerLevel1);
|
| - }
|
| - },
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} entryIndex
|
| + * @return {?string}
|
| + */
|
| + entryTitle(entryIndex) {
|
| + var entryType = this._entryType(entryIndex);
|
| + if (entryType === WebInspector.TimelineFlameChartEntryType.Event) {
|
| + var event = /** @type {!WebInspector.TracingModel.Event} */ (this._entryData[entryIndex]);
|
| + if (event.phase === WebInspector.TracingModel.Phase.AsyncStepInto ||
|
| + event.phase === WebInspector.TracingModel.Phase.AsyncStepPast)
|
| + return event.name + ':' + event.args['step'];
|
| + if (event._blackboxRoot)
|
| + return WebInspector.UIString('Blackboxed');
|
| + var name = WebInspector.TimelineUIUtils.eventStyle(event).title;
|
| + // TODO(yurys): support event dividers
|
| + var detailsText =
|
| + WebInspector.TimelineUIUtils.buildDetailsTextForTraceEvent(event, this._model.targetByEvent(event));
|
| + if (event.name === WebInspector.TimelineModel.RecordType.JSFrame && detailsText)
|
| + return detailsText;
|
| + return detailsText ? WebInspector.UIString('%s (%s)', name, detailsText) : name;
|
| + }
|
| + var title = this._entryIndexToTitle[entryIndex];
|
| + if (!title) {
|
| + title = WebInspector.UIString('Unexpected entryIndex %d', entryIndex);
|
| + console.error(title);
|
| + }
|
| + return title;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} index
|
| + * @return {string}
|
| + */
|
| + textColor(index) {
|
| + var event = this._entryData[index];
|
| + if (event && event._blackboxRoot)
|
| + return '#888';
|
| + else
|
| + return super.textColor(index);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + reset() {
|
| + super.reset();
|
| + /** @type {!Array<!WebInspector.TracingModel.Event|!WebInspector.TimelineFrame|!WebInspector.TimelineIRModel.Phases>} */
|
| + this._entryData = [];
|
| + /** @type {!Array<!WebInspector.TimelineFlameChartEntryType>} */
|
| + this._entryTypeByLevel = [];
|
| + /** @type {!Array<string>} */
|
| + this._entryIndexToTitle = [];
|
| + /** @type {!Array<!WebInspector.TimelineFlameChartMarker>} */
|
| + this._markers = [];
|
| + /** @type {!Map<!WebInspector.TimelineCategory, string>} */
|
| + this._asyncColorByCategory = new Map();
|
| + /** @type {!Map<!WebInspector.TimelineIRModel.Phases, string>} */
|
| + this._asyncColorByInteractionPhase = new Map();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!WebInspector.FlameChart.TimelineData}
|
| + */
|
| + timelineData() {
|
| + if (this._timelineData)
|
| + return this._timelineData;
|
| +
|
| + this._timelineData = new WebInspector.FlameChart.TimelineData([], [], [], []);
|
| +
|
| + this._flowEventIndexById = {};
|
| + this._minimumBoundary = this._model.minimumRecordTime();
|
| + this._timeSpan = this._model.isEmpty() ? 1000 : this._model.maximumRecordTime() - this._minimumBoundary;
|
| + this._currentLevel = 0;
|
| + this._appendFrameBars(this._frameModel.frames());
|
| +
|
| + this._appendHeader(WebInspector.UIString('Interactions'), this._interactionsHeaderLevel1);
|
| + this._appendInteractionRecords();
|
| +
|
| + var asyncEventGroups = WebInspector.TimelineModel.AsyncEventGroup;
|
| + var inputLatencies = this._model.mainThreadAsyncEvents().get(asyncEventGroups.input);
|
| + if (inputLatencies && inputLatencies.length) {
|
| + var title = WebInspector.TimelineUIUtils.titleForAsyncEventGroup(asyncEventGroups.input);
|
| + this._appendAsyncEventsGroup(title, inputLatencies, this._interactionsHeaderLevel2);
|
| + }
|
| + var animations = this._model.mainThreadAsyncEvents().get(asyncEventGroups.animation);
|
| + if (animations && animations.length) {
|
| + var title = WebInspector.TimelineUIUtils.titleForAsyncEventGroup(asyncEventGroups.animation);
|
| + this._appendAsyncEventsGroup(title, animations, this._interactionsHeaderLevel2);
|
| + }
|
| + var threads = this._model.virtualThreads();
|
| + this._appendThreadTimelineData(
|
| + WebInspector.UIString('Main'), this._model.mainThreadEvents(), this._model.mainThreadAsyncEvents(), true);
|
| + var compositorThreads = threads.filter(thread => thread.name.startsWith('CompositorTileWorker'));
|
| + var otherThreads = threads.filter(thread => !thread.name.startsWith('CompositorTileWorker'));
|
| + if (compositorThreads.length) {
|
| + this._appendHeader(WebInspector.UIString('Raster'), this._headerLevel1);
|
| + for (var i = 0; i < compositorThreads.length; ++i)
|
| + this._appendSyncEvents(
|
| + compositorThreads[i].events, WebInspector.UIString('Rasterizer Thread %d', i), this._headerLevel2);
|
| + }
|
| + this._appendGPUEvents();
|
|
|
| - /**
|
| - * @param {string} header
|
| - * @param {!Array<!WebInspector.TracingModel.AsyncEvent>} events
|
| - * @param {!WebInspector.FlameChart.GroupStyle} style
|
| - */
|
| - _appendAsyncEventsGroup: function(header, events, style)
|
| - {
|
| - var lastUsedTimeByLevel = [];
|
| - var groupHeaderAppended = false;
|
| - for (var i = 0; i < events.length; ++i) {
|
| - var asyncEvent = events[i];
|
| - if (!this._isVisible(asyncEvent))
|
| - continue;
|
| - if (!groupHeaderAppended) {
|
| - this._appendHeader(header, style);
|
| - groupHeaderAppended = true;
|
| - }
|
| - var startTime = asyncEvent.startTime;
|
| - var level;
|
| - for (level = 0; level < lastUsedTimeByLevel.length && lastUsedTimeByLevel[level] > startTime; ++level) {}
|
| - this._appendAsyncEvent(asyncEvent, this._currentLevel + level);
|
| - lastUsedTimeByLevel[level] = asyncEvent.endTime;
|
| - }
|
| - this._entryTypeByLevel.length = this._currentLevel + lastUsedTimeByLevel.length;
|
| - this._entryTypeByLevel.fill(WebInspector.TimelineFlameChartEntryType.Event, this._currentLevel);
|
| - this._currentLevel += lastUsedTimeByLevel.length;
|
| - },
|
| -
|
| - _appendGPUEvents: function()
|
| - {
|
| - if (this._appendSyncEvents(this._model.gpuEvents(), WebInspector.UIString("GPU"), this._headerLevel1, false))
|
| - ++this._currentLevel;
|
| - },
|
| -
|
| - _appendInteractionRecords: function()
|
| - {
|
| - this._irModel.interactionRecords().forEach(this._appendSegment, this);
|
| - this._entryTypeByLevel[this._currentLevel++] = WebInspector.TimelineFlameChartEntryType.InteractionRecord;
|
| - },
|
| + otherThreads.forEach(
|
| + thread => this._appendThreadTimelineData(thread.name, thread.events, thread.asyncEventsByGroup));
|
|
|
| /**
|
| - * @param {!Array.<!WebInspector.TimelineFrame>} frames
|
| + * @param {!WebInspector.TimelineFlameChartMarker} a
|
| + * @param {!WebInspector.TimelineFlameChartMarker} b
|
| */
|
| - _appendFrameBars: function(frames)
|
| - {
|
| - var style = WebInspector.TimelineUIUtils.markerStyleForFrame();
|
| - this._entryTypeByLevel[this._currentLevel] = WebInspector.TimelineFlameChartEntryType.Frame;
|
| - for (var i = 0; i < frames.length; ++i) {
|
| - this._markers.push(new WebInspector.TimelineFlameChartMarker(frames[i].startTime, frames[i].startTime - this._model.minimumRecordTime(), style));
|
| - this._appendFrame(frames[i]);
|
| - }
|
| - ++this._currentLevel;
|
| - },
|
| -
|
| - /**
|
| - * @param {number} entryIndex
|
| - * @return {!WebInspector.TimelineFlameChartEntryType}
|
| - */
|
| - _entryType: function(entryIndex)
|
| - {
|
| - return this._entryTypeByLevel[this._timelineData.entryLevels[entryIndex]];
|
| - },
|
| + function compareStartTime(a, b) {
|
| + return a.startTime() - b.startTime();
|
| + }
|
|
|
| - /**
|
| - * @override
|
| - * @param {number} entryIndex
|
| - * @return {?Element}
|
| - */
|
| - prepareHighlightedEntryInfo: function(entryIndex)
|
| - {
|
| - var time = "";
|
| - var title;
|
| - var warning;
|
| - var type = this._entryType(entryIndex);
|
| - if (type === WebInspector.TimelineFlameChartEntryType.Event) {
|
| - var event = /** @type {!WebInspector.TracingModel.Event} */ (this._entryData[entryIndex]);
|
| - var totalTime = event.duration;
|
| - var selfTime = event.selfTime;
|
| - var /** @const */ eps = 1e-6;
|
| - if (typeof totalTime === "number") {
|
| - time = Math.abs(totalTime - selfTime) > eps && selfTime > eps ?
|
| - WebInspector.UIString("%s (self %s)", Number.millisToString(totalTime, true), Number.millisToString(selfTime, true)) :
|
| - Number.millisToString(totalTime, true);
|
| - }
|
| - title = this.entryTitle(entryIndex);
|
| - warning = WebInspector.TimelineUIUtils.eventWarning(event);
|
| - } else if (type === WebInspector.TimelineFlameChartEntryType.Frame) {
|
| - var frame = /** @type {!WebInspector.TimelineFrame} */ (this._entryData[entryIndex]);
|
| - time = WebInspector.UIString("%s ~ %.0f\u2009fps", Number.preciseMillisToString(frame.duration, 1), (1000 / frame.duration));
|
| - title = frame.idle ? WebInspector.UIString("Idle Frame") : WebInspector.UIString("Frame");
|
| - if (frame.hasWarnings()) {
|
| - warning = createElement("span");
|
| - warning.textContent = WebInspector.UIString("Long frame");
|
| - }
|
| - } else {
|
| - return null;
|
| - }
|
| - var element = createElement("div");
|
| - var root = WebInspector.createShadowRootWithCoreStyles(element, "timeline/timelineFlamechartPopover.css");
|
| - var contents = root.createChild("div", "timeline-flamechart-popover");
|
| - contents.createChild("span", "timeline-info-time").textContent = time;
|
| - contents.createChild("span", "timeline-info-title").textContent = title;
|
| - if (warning) {
|
| - warning.classList.add("timeline-info-warning");
|
| - contents.appendChild(warning);
|
| - }
|
| - return element;
|
| - },
|
| + this._markers.sort(compareStartTime);
|
| + this._timelineData.markers = this._markers;
|
| +
|
| + this._flowEventIndexById = {};
|
| + return this._timelineData;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} threadTitle
|
| + * @param {!Array<!WebInspector.TracingModel.Event>} syncEvents
|
| + * @param {!Map<!WebInspector.TimelineModel.AsyncEventGroup, !Array<!WebInspector.TracingModel.AsyncEvent>>} asyncEvents
|
| + * @param {boolean=} forceExpanded
|
| + */
|
| + _appendThreadTimelineData(threadTitle, syncEvents, asyncEvents, forceExpanded) {
|
| + this._appendAsyncEvents(asyncEvents);
|
| + this._appendSyncEvents(syncEvents, threadTitle, this._headerLevel1, forceExpanded);
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array<!WebInspector.TracingModel.Event>} events
|
| + * @param {string} title
|
| + * @param {!WebInspector.FlameChart.GroupStyle} style
|
| + * @param {boolean=} forceExpanded
|
| + */
|
| + _appendSyncEvents(events, title, style, forceExpanded) {
|
| + var openEvents = [];
|
| + var flowEventsEnabled = Runtime.experiments.isEnabled('timelineFlowEvents');
|
| + var blackboxingEnabled = Runtime.experiments.isEnabled('blackboxJSFramesOnTimeline');
|
| + var maxStackDepth = 0;
|
| + for (var i = 0; i < events.length; ++i) {
|
| + var e = events[i];
|
| + if (WebInspector.TimelineModel.isMarkerEvent(e))
|
| + this._markers.push(new WebInspector.TimelineFlameChartMarker(
|
| + e.startTime, e.startTime - this._model.minimumRecordTime(),
|
| + WebInspector.TimelineUIUtils.markerStyleForEvent(e)));
|
| + if (!WebInspector.TracingModel.isFlowPhase(e.phase)) {
|
| + if (!e.endTime && e.phase !== WebInspector.TracingModel.Phase.Instant)
|
| + continue;
|
| + if (WebInspector.TracingModel.isAsyncPhase(e.phase))
|
| + continue;
|
| + if (!this._isVisible(e))
|
| + continue;
|
| + }
|
| + while (openEvents.length && openEvents.peekLast().endTime <= e.startTime)
|
| + openEvents.pop();
|
| + e._blackboxRoot = false;
|
| + if (blackboxingEnabled && this._isBlackboxedEvent(e)) {
|
| + var parent = openEvents.peekLast();
|
| + if (parent && parent._blackboxRoot)
|
| + continue;
|
| + e._blackboxRoot = true;
|
| + }
|
| + if (title) {
|
| + this._appendHeader(title, style, forceExpanded);
|
| + title = '';
|
| + }
|
| +
|
| + var level = this._currentLevel + openEvents.length;
|
| + this._appendEvent(e, level);
|
| + if (flowEventsEnabled)
|
| + this._appendFlowEvent(e, level);
|
| + maxStackDepth = Math.max(maxStackDepth, openEvents.length + 1);
|
| + if (e.endTime)
|
| + openEvents.push(e);
|
| + }
|
| + this._entryTypeByLevel.length = this._currentLevel + maxStackDepth;
|
| + this._entryTypeByLevel.fill(WebInspector.TimelineFlameChartEntryType.Event, this._currentLevel);
|
| + this._currentLevel += maxStackDepth;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TracingModel.Event} event
|
| + * @return {boolean}
|
| + */
|
| + _isBlackboxedEvent(event) {
|
| + if (event.name !== WebInspector.TimelineModel.RecordType.JSFrame)
|
| + return false;
|
| + var url = event.args['data']['url'];
|
| + return url && this._isBlackboxedURL(url);
|
| + }
|
| +
|
| + /**
|
| + * @param {string} url
|
| + * @return {boolean}
|
| + */
|
| + _isBlackboxedURL(url) {
|
| + return WebInspector.blackboxManager.isBlackboxedURL(url);
|
| + }
|
| +
|
| + /**
|
| + * @param {!Map<!WebInspector.TimelineModel.AsyncEventGroup, !Array<!WebInspector.TracingModel.AsyncEvent>>} asyncEvents
|
| + */
|
| + _appendAsyncEvents(asyncEvents) {
|
| + var groups = WebInspector.TimelineModel.AsyncEventGroup;
|
| + var groupArray = Object.keys(groups).map(key => groups[key]);
|
| +
|
| + groupArray.remove(groups.animation);
|
| + groupArray.remove(groups.input);
|
| +
|
| + for (var groupIndex = 0; groupIndex < groupArray.length; ++groupIndex) {
|
| + var group = groupArray[groupIndex];
|
| + var events = asyncEvents.get(group);
|
| + if (!events)
|
| + continue;
|
| + var title = WebInspector.TimelineUIUtils.titleForAsyncEventGroup(group);
|
| + this._appendAsyncEventsGroup(title, events, this._headerLevel1);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {string} header
|
| + * @param {!Array<!WebInspector.TracingModel.AsyncEvent>} events
|
| + * @param {!WebInspector.FlameChart.GroupStyle} style
|
| + */
|
| + _appendAsyncEventsGroup(header, events, style) {
|
| + var lastUsedTimeByLevel = [];
|
| + var groupHeaderAppended = false;
|
| + for (var i = 0; i < events.length; ++i) {
|
| + var asyncEvent = events[i];
|
| + if (!this._isVisible(asyncEvent))
|
| + continue;
|
| + if (!groupHeaderAppended) {
|
| + this._appendHeader(header, style);
|
| + groupHeaderAppended = true;
|
| + }
|
| + var startTime = asyncEvent.startTime;
|
| + var level;
|
| + for (level = 0; level < lastUsedTimeByLevel.length && lastUsedTimeByLevel[level] > startTime; ++level) {
|
| + }
|
| + this._appendAsyncEvent(asyncEvent, this._currentLevel + level);
|
| + lastUsedTimeByLevel[level] = asyncEvent.endTime;
|
| + }
|
| + this._entryTypeByLevel.length = this._currentLevel + lastUsedTimeByLevel.length;
|
| + this._entryTypeByLevel.fill(WebInspector.TimelineFlameChartEntryType.Event, this._currentLevel);
|
| + this._currentLevel += lastUsedTimeByLevel.length;
|
| + }
|
| +
|
| + _appendGPUEvents() {
|
| + if (this._appendSyncEvents(this._model.gpuEvents(), WebInspector.UIString('GPU'), this._headerLevel1, false))
|
| + ++this._currentLevel;
|
| + }
|
| +
|
| + _appendInteractionRecords() {
|
| + this._irModel.interactionRecords().forEach(this._appendSegment, this);
|
| + this._entryTypeByLevel[this._currentLevel++] = WebInspector.TimelineFlameChartEntryType.InteractionRecord;
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array.<!WebInspector.TimelineFrame>} frames
|
| + */
|
| + _appendFrameBars(frames) {
|
| + var style = WebInspector.TimelineUIUtils.markerStyleForFrame();
|
| + this._entryTypeByLevel[this._currentLevel] = WebInspector.TimelineFlameChartEntryType.Frame;
|
| + for (var i = 0; i < frames.length; ++i) {
|
| + this._markers.push(new WebInspector.TimelineFlameChartMarker(
|
| + frames[i].startTime, frames[i].startTime - this._model.minimumRecordTime(), style));
|
| + this._appendFrame(frames[i]);
|
| + }
|
| + ++this._currentLevel;
|
| + }
|
| +
|
| + /**
|
| + * @param {number} entryIndex
|
| + * @return {!WebInspector.TimelineFlameChartEntryType}
|
| + */
|
| + _entryType(entryIndex) {
|
| + return this._entryTypeByLevel[this._timelineData.entryLevels[entryIndex]];
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} entryIndex
|
| + * @return {?Element}
|
| + */
|
| + prepareHighlightedEntryInfo(entryIndex) {
|
| + var time = '';
|
| + var title;
|
| + var warning;
|
| + var type = this._entryType(entryIndex);
|
| + if (type === WebInspector.TimelineFlameChartEntryType.Event) {
|
| + var event = /** @type {!WebInspector.TracingModel.Event} */ (this._entryData[entryIndex]);
|
| + var totalTime = event.duration;
|
| + var selfTime = event.selfTime;
|
| + var /** @const */ eps = 1e-6;
|
| + if (typeof totalTime === 'number') {
|
| + time = Math.abs(totalTime - selfTime) > eps && selfTime > eps ?
|
| + WebInspector.UIString(
|
| + '%s (self %s)', Number.millisToString(totalTime, true), Number.millisToString(selfTime, true)) :
|
| + Number.millisToString(totalTime, true);
|
| + }
|
| + title = this.entryTitle(entryIndex);
|
| + warning = WebInspector.TimelineUIUtils.eventWarning(event);
|
| + } else if (type === WebInspector.TimelineFlameChartEntryType.Frame) {
|
| + var frame = /** @type {!WebInspector.TimelineFrame} */ (this._entryData[entryIndex]);
|
| + time = WebInspector.UIString(
|
| + '%s ~ %.0f\u2009fps', Number.preciseMillisToString(frame.duration, 1), (1000 / frame.duration));
|
| + title = frame.idle ? WebInspector.UIString('Idle Frame') : WebInspector.UIString('Frame');
|
| + if (frame.hasWarnings()) {
|
| + warning = createElement('span');
|
| + warning.textContent = WebInspector.UIString('Long frame');
|
| + }
|
| + } else {
|
| + return null;
|
| + }
|
| + var element = createElement('div');
|
| + var root = WebInspector.createShadowRootWithCoreStyles(element, 'timeline/timelineFlamechartPopover.css');
|
| + var contents = root.createChild('div', 'timeline-flamechart-popover');
|
| + contents.createChild('span', 'timeline-info-time').textContent = time;
|
| + contents.createChild('span', 'timeline-info-title').textContent = title;
|
| + if (warning) {
|
| + warning.classList.add('timeline-info-warning');
|
| + contents.appendChild(warning);
|
| + }
|
| + return element;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} entryIndex
|
| + * @return {string}
|
| + */
|
| + entryColor(entryIndex) {
|
| + // This is not annotated due to closure compiler failure to properly infer cache container's template type.
|
| + function patchColorAndCache(cache, key, lookupColor) {
|
| + var color = cache.get(key);
|
| + if (color)
|
| + return color;
|
| + var parsedColor = WebInspector.Color.parse(lookupColor(key));
|
| + color = parsedColor.setAlpha(0.7).asString(WebInspector.Color.Format.RGBA) || '';
|
| + cache.set(key, color);
|
| + return color;
|
| + }
|
|
|
| - /**
|
| - * @override
|
| - * @param {number} entryIndex
|
| - * @return {string}
|
| - */
|
| - entryColor: function(entryIndex)
|
| - {
|
| - // This is not annotated due to closure compiler failure to properly infer cache container's template type.
|
| - function patchColorAndCache(cache, key, lookupColor)
|
| - {
|
| - var color = cache.get(key);
|
| - if (color)
|
| - return color;
|
| - var parsedColor = WebInspector.Color.parse(lookupColor(key));
|
| - color = parsedColor.setAlpha(0.7).asString(WebInspector.Color.Format.RGBA) || "";
|
| - cache.set(key, color);
|
| - return color;
|
| - }
|
| -
|
| - var type = this._entryType(entryIndex);
|
| - if (type === WebInspector.TimelineFlameChartEntryType.Event) {
|
| - var event = /** @type {!WebInspector.TracingModel.Event} */ (this._entryData[entryIndex]);
|
| - if (!WebInspector.TracingModel.isAsyncPhase(event.phase))
|
| - return WebInspector.TimelineUIUtils.eventColor(event);
|
| - if (event.hasCategory(WebInspector.TimelineModel.Category.Console) || event.hasCategory(WebInspector.TimelineModel.Category.UserTiming))
|
| - return this._consoleColorGenerator.colorForID(event.name);
|
| - if (event.hasCategory(WebInspector.TimelineModel.Category.LatencyInfo)) {
|
| - var phase = WebInspector.TimelineIRModel.phaseForEvent(event) || WebInspector.TimelineIRModel.Phases.Uncategorized;
|
| - return patchColorAndCache(this._asyncColorByInteractionPhase, phase, WebInspector.TimelineUIUtils.interactionPhaseColor);
|
| - }
|
| - var category = WebInspector.TimelineUIUtils.eventStyle(event).category;
|
| - return patchColorAndCache(this._asyncColorByCategory, category, () => category.color);
|
| - }
|
| - if (type === WebInspector.TimelineFlameChartEntryType.Frame)
|
| - return "white";
|
| - if (type === WebInspector.TimelineFlameChartEntryType.InteractionRecord)
|
| - return "transparent";
|
| - return "";
|
| - },
|
| + var type = this._entryType(entryIndex);
|
| + if (type === WebInspector.TimelineFlameChartEntryType.Event) {
|
| + var event = /** @type {!WebInspector.TracingModel.Event} */ (this._entryData[entryIndex]);
|
| + if (!WebInspector.TracingModel.isAsyncPhase(event.phase))
|
| + return WebInspector.TimelineUIUtils.eventColor(event);
|
| + if (event.hasCategory(WebInspector.TimelineModel.Category.Console) ||
|
| + event.hasCategory(WebInspector.TimelineModel.Category.UserTiming))
|
| + return this._consoleColorGenerator.colorForID(event.name);
|
| + if (event.hasCategory(WebInspector.TimelineModel.Category.LatencyInfo)) {
|
| + var phase =
|
| + WebInspector.TimelineIRModel.phaseForEvent(event) || WebInspector.TimelineIRModel.Phases.Uncategorized;
|
| + return patchColorAndCache(
|
| + this._asyncColorByInteractionPhase, phase, WebInspector.TimelineUIUtils.interactionPhaseColor);
|
| + }
|
| + var category = WebInspector.TimelineUIUtils.eventStyle(event).category;
|
| + return patchColorAndCache(this._asyncColorByCategory, category, () => category.color);
|
| + }
|
| + if (type === WebInspector.TimelineFlameChartEntryType.Frame)
|
| + return 'white';
|
| + if (type === WebInspector.TimelineFlameChartEntryType.InteractionRecord)
|
| + return 'transparent';
|
| + return '';
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} entryIndex
|
| + * @param {!CanvasRenderingContext2D} context
|
| + * @param {?string} text
|
| + * @param {number} barX
|
| + * @param {number} barY
|
| + * @param {number} barWidth
|
| + * @param {number} barHeight
|
| + * @param {number} unclippedBarX
|
| + * @param {number} timeToPixels
|
| + * @return {boolean}
|
| + */
|
| + decorateEntry(entryIndex, context, text, barX, barY, barWidth, barHeight, unclippedBarX, timeToPixels) {
|
| + var data = this._entryData[entryIndex];
|
| + var type = this._entryType(entryIndex);
|
| + if (type === WebInspector.TimelineFlameChartEntryType.Frame) {
|
| + var /** @const */ vPadding = 1;
|
| + var /** @const */ hPadding = 1;
|
| + var frame = /** {!WebInspector.TimelineFrame} */ (data);
|
| + barX += hPadding;
|
| + barWidth -= 2 * hPadding;
|
| + barY += vPadding;
|
| + barHeight -= 2 * vPadding + 1;
|
| + context.fillStyle = frame.idle ? 'white' : (frame.hasWarnings() ? '#fad1d1' : '#d7f0d1');
|
| + context.fillRect(barX, barY, barWidth, barHeight);
|
| + var frameDurationText = Number.preciseMillisToString(frame.duration, 1);
|
| + var textWidth = context.measureText(frameDurationText).width;
|
| + if (barWidth >= textWidth) {
|
| + context.fillStyle = this.textColor(entryIndex);
|
| + context.fillText(frameDurationText, barX + (barWidth - textWidth) / 2, barY + barHeight - 3);
|
| + }
|
| + return true;
|
| + }
|
|
|
| - /**
|
| - * @override
|
| - * @param {number} entryIndex
|
| - * @param {!CanvasRenderingContext2D} context
|
| - * @param {?string} text
|
| - * @param {number} barX
|
| - * @param {number} barY
|
| - * @param {number} barWidth
|
| - * @param {number} barHeight
|
| - * @param {number} unclippedBarX
|
| - * @param {number} timeToPixels
|
| - * @return {boolean}
|
| - */
|
| - decorateEntry: function(entryIndex, context, text, barX, barY, barWidth, barHeight, unclippedBarX, timeToPixels)
|
| - {
|
| - var data = this._entryData[entryIndex];
|
| - var type = this._entryType(entryIndex);
|
| - if (type === WebInspector.TimelineFlameChartEntryType.Frame) {
|
| - var /** @const */ vPadding = 1;
|
| - var /** @const */ hPadding = 1;
|
| - var frame = /** {!WebInspector.TimelineFrame} */ (data);
|
| - barX += hPadding;
|
| - barWidth -= 2 * hPadding;
|
| - barY += vPadding;
|
| - barHeight -= 2 * vPadding + 1;
|
| - context.fillStyle = frame.idle ? "white" : (frame.hasWarnings() ? "#fad1d1" : "#d7f0d1");
|
| - context.fillRect(barX, barY, barWidth, barHeight);
|
| - var frameDurationText = Number.preciseMillisToString(frame.duration, 1);
|
| - var textWidth = context.measureText(frameDurationText).width;
|
| - if (barWidth >= textWidth) {
|
| - context.fillStyle = this.textColor(entryIndex);
|
| - context.fillText(frameDurationText, barX + (barWidth - textWidth) / 2, barY + barHeight - 3);
|
| - }
|
| - return true;
|
| - }
|
| -
|
| - if (type === WebInspector.TimelineFlameChartEntryType.InteractionRecord) {
|
| - var color = WebInspector.TimelineUIUtils.interactionPhaseColor(/** @type {!WebInspector.TimelineIRModel.Phases} */ (this._entryData[entryIndex]));
|
| - context.fillStyle = color;
|
| - context.fillRect(barX, barY, barWidth - 1, 2);
|
| - context.fillRect(barX, barY - 3, 2, 3);
|
| - context.fillRect(barX + barWidth - 3, barY - 3, 2, 3);
|
| - return false;
|
| - }
|
| -
|
| - if (type === WebInspector.TimelineFlameChartEntryType.Event) {
|
| - var event = /** @type {!WebInspector.TracingModel.Event} */ (this._entryData[entryIndex]);
|
| - if (event.hasCategory(WebInspector.TimelineModel.Category.LatencyInfo) && event.timeWaitingForMainThread) {
|
| - context.fillStyle = "hsla(0, 70%, 60%, 1)";
|
| - var width = Math.floor(unclippedBarX - barX + event.timeWaitingForMainThread * timeToPixels);
|
| - context.fillRect(barX, barY + barHeight - 3, width, 2);
|
| - }
|
| - if (event.warning)
|
| - paintWarningDecoration(barX, barWidth - 1.5);
|
| - }
|
| -
|
| - /**
|
| - * @param {number} x
|
| - * @param {number} width
|
| - */
|
| - function paintWarningDecoration(x, width)
|
| - {
|
| - var /** @const */ triangleSize = 8;
|
| - context.save();
|
| - context.beginPath();
|
| - context.rect(x, barY, width, barHeight);
|
| - context.clip();
|
| - context.beginPath();
|
| - context.fillStyle = "red";
|
| - context.moveTo(x + width - triangleSize, barY);
|
| - context.lineTo(x + width, barY);
|
| - context.lineTo(x + width, barY + triangleSize);
|
| - context.fill();
|
| - context.restore();
|
| - }
|
| -
|
| - return false;
|
| - },
|
| + if (type === WebInspector.TimelineFlameChartEntryType.InteractionRecord) {
|
| + var color = WebInspector.TimelineUIUtils.interactionPhaseColor(
|
| + /** @type {!WebInspector.TimelineIRModel.Phases} */ (this._entryData[entryIndex]));
|
| + context.fillStyle = color;
|
| + context.fillRect(barX, barY, barWidth - 1, 2);
|
| + context.fillRect(barX, barY - 3, 2, 3);
|
| + context.fillRect(barX + barWidth - 3, barY - 3, 2, 3);
|
| + return false;
|
| + }
|
|
|
| - /**
|
| - * @override
|
| - * @param {number} entryIndex
|
| - * @return {boolean}
|
| - */
|
| - forceDecoration: function(entryIndex)
|
| - {
|
| - var type = this._entryType(entryIndex);
|
| - return type === WebInspector.TimelineFlameChartEntryType.Frame ||
|
| - type === WebInspector.TimelineFlameChartEntryType.Event && !!(/** @type {!WebInspector.TracingModel.Event} */ (this._entryData[entryIndex]).warning);
|
| - },
|
| + if (type === WebInspector.TimelineFlameChartEntryType.Event) {
|
| + var event = /** @type {!WebInspector.TracingModel.Event} */ (this._entryData[entryIndex]);
|
| + if (event.hasCategory(WebInspector.TimelineModel.Category.LatencyInfo) && event.timeWaitingForMainThread) {
|
| + context.fillStyle = 'hsla(0, 70%, 60%, 1)';
|
| + var width = Math.floor(unclippedBarX - barX + event.timeWaitingForMainThread * timeToPixels);
|
| + context.fillRect(barX, barY + barHeight - 3, width, 2);
|
| + }
|
| + if (event.warning)
|
| + paintWarningDecoration(barX, barWidth - 1.5);
|
| + }
|
|
|
| /**
|
| - * @param {string} title
|
| - * @param {!WebInspector.FlameChart.GroupStyle} style
|
| - * @param {boolean=} expanded
|
| - */
|
| - _appendHeader: function(title, style, expanded)
|
| - {
|
| - this._timelineData.groups.push({startLevel: this._currentLevel, name: title, expanded: expanded, style: style});
|
| - },
|
| + * @param {number} x
|
| + * @param {number} width
|
| + */
|
| + function paintWarningDecoration(x, width) {
|
| + var /** @const */ triangleSize = 8;
|
| + context.save();
|
| + context.beginPath();
|
| + context.rect(x, barY, width, barHeight);
|
| + context.clip();
|
| + context.beginPath();
|
| + context.fillStyle = 'red';
|
| + context.moveTo(x + width - triangleSize, barY);
|
| + context.lineTo(x + width, barY);
|
| + context.lineTo(x + width, barY + triangleSize);
|
| + context.fill();
|
| + context.restore();
|
| + }
|
|
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} entryIndex
|
| + * @return {boolean}
|
| + */
|
| + forceDecoration(entryIndex) {
|
| + var type = this._entryType(entryIndex);
|
| + return type === WebInspector.TimelineFlameChartEntryType.Frame ||
|
| + type === WebInspector.TimelineFlameChartEntryType.Event &&
|
| + !!(/** @type {!WebInspector.TracingModel.Event} */ (this._entryData[entryIndex]).warning);
|
| + }
|
| +
|
| + /**
|
| + * @param {string} title
|
| + * @param {!WebInspector.FlameChart.GroupStyle} style
|
| + * @param {boolean=} expanded
|
| + */
|
| + _appendHeader(title, style, expanded) {
|
| + this._timelineData.groups.push({startLevel: this._currentLevel, name: title, expanded: expanded, style: style});
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TracingModel.Event} event
|
| + * @param {number} level
|
| + */
|
| + _appendEvent(event, level) {
|
| + var index = this._entryData.length;
|
| + this._entryData.push(event);
|
| + this._timelineData.entryLevels[index] = level;
|
| + var duration;
|
| + if (WebInspector.TimelineModel.isMarkerEvent(event))
|
| + duration = undefined;
|
| + else
|
| + duration = event.duration || WebInspector.TimelineFlameChartDataProvider.InstantEventVisibleDurationMs;
|
| + this._timelineData.entryTotalTimes[index] = duration;
|
| + this._timelineData.entryStartTimes[index] = event.startTime;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TracingModel.Event} event
|
| + * @param {number} level
|
| + */
|
| + _appendFlowEvent(event, level) {
|
| + var timelineData = this._timelineData;
|
| /**
|
| * @param {!WebInspector.TracingModel.Event} event
|
| - * @param {number} level
|
| + * @return {number}
|
| */
|
| - _appendEvent: function(event, level)
|
| - {
|
| - var index = this._entryData.length;
|
| - this._entryData.push(event);
|
| - this._timelineData.entryLevels[index] = level;
|
| - var duration;
|
| - if (WebInspector.TimelineModel.isMarkerEvent(event))
|
| - duration = undefined;
|
| - else
|
| - duration = event.duration || WebInspector.TimelineFlameChartDataProvider.InstantEventVisibleDurationMs;
|
| - this._timelineData.entryTotalTimes[index] = duration;
|
| - this._timelineData.entryStartTimes[index] = event.startTime;
|
| - },
|
| + function pushStartFlow(event) {
|
| + var flowIndex = timelineData.flowStartTimes.length;
|
| + timelineData.flowStartTimes.push(event.startTime);
|
| + timelineData.flowStartLevels.push(level);
|
| + return flowIndex;
|
| + }
|
|
|
| /**
|
| * @param {!WebInspector.TracingModel.Event} event
|
| - * @param {number} level
|
| - */
|
| - _appendFlowEvent: function(event, level)
|
| - {
|
| - var timelineData = this._timelineData;
|
| - /**
|
| - * @param {!WebInspector.TracingModel.Event} event
|
| - * @return {number}
|
| - */
|
| - function pushStartFlow(event)
|
| - {
|
| - var flowIndex = timelineData.flowStartTimes.length;
|
| - timelineData.flowStartTimes.push(event.startTime);
|
| - timelineData.flowStartLevels.push(level);
|
| - return flowIndex;
|
| - }
|
| -
|
| - /**
|
| - * @param {!WebInspector.TracingModel.Event} event
|
| - * @param {number} flowIndex
|
| - */
|
| - function pushEndFlow(event, flowIndex)
|
| - {
|
| - timelineData.flowEndTimes[flowIndex] = event.startTime;
|
| - timelineData.flowEndLevels[flowIndex] = level;
|
| - }
|
| -
|
| - switch (event.phase) {
|
| - case WebInspector.TracingModel.Phase.FlowBegin:
|
| - this._flowEventIndexById[event.id] = pushStartFlow(event);
|
| - break;
|
| - case WebInspector.TracingModel.Phase.FlowStep:
|
| - pushEndFlow(event, this._flowEventIndexById[event.id]);
|
| - this._flowEventIndexById[event.id] = pushStartFlow(event);
|
| - break;
|
| - case WebInspector.TracingModel.Phase.FlowEnd:
|
| - pushEndFlow(event, this._flowEventIndexById[event.id]);
|
| - delete this._flowEventIndexById[event.id];
|
| - break;
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.TracingModel.AsyncEvent} asyncEvent
|
| - * @param {number} level
|
| - */
|
| - _appendAsyncEvent: function(asyncEvent, level)
|
| - {
|
| - if (WebInspector.TracingModel.isNestableAsyncPhase(asyncEvent.phase)) {
|
| - // FIXME: also add steps once we support event nesting in the FlameChart.
|
| - this._appendEvent(asyncEvent, level);
|
| - return;
|
| - }
|
| - var steps = asyncEvent.steps;
|
| - // If we have past steps, put the end event for each range rather than start one.
|
| - var eventOffset = steps.length > 1 && steps[1].phase === WebInspector.TracingModel.Phase.AsyncStepPast ? 1 : 0;
|
| - for (var i = 0; i < steps.length - 1; ++i) {
|
| - var index = this._entryData.length;
|
| - this._entryData.push(steps[i + eventOffset]);
|
| - var startTime = steps[i].startTime;
|
| - this._timelineData.entryLevels[index] = level;
|
| - this._timelineData.entryTotalTimes[index] = steps[i + 1].startTime - startTime;
|
| - this._timelineData.entryStartTimes[index] = startTime;
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.TimelineFrame} frame
|
| + * @param {number} flowIndex
|
| */
|
| - _appendFrame: function(frame)
|
| - {
|
| - var index = this._entryData.length;
|
| - this._entryData.push(frame);
|
| - this._entryIndexToTitle[index] = Number.millisToString(frame.duration, true);
|
| - this._timelineData.entryLevels[index] = this._currentLevel;
|
| - this._timelineData.entryTotalTimes[index] = frame.duration;
|
| - this._timelineData.entryStartTimes[index] = frame.startTime;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.Segment} segment
|
| - */
|
| - _appendSegment: function(segment)
|
| - {
|
| - var index = this._entryData.length;
|
| - this._entryData.push(/** @type {!WebInspector.TimelineIRModel.Phases} */(segment.data));
|
| - this._entryIndexToTitle[index] = /** @type {string} */ (segment.data);
|
| - this._timelineData.entryLevels[index] = this._currentLevel;
|
| - this._timelineData.entryTotalTimes[index] = segment.end - segment.begin;
|
| - this._timelineData.entryStartTimes[index] = segment.begin;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} entryIndex
|
| - * @return {?WebInspector.TimelineSelection}
|
| - */
|
| - createSelection: function(entryIndex)
|
| - {
|
| - var type = this._entryType(entryIndex);
|
| - var timelineSelection = null;
|
| - if (type === WebInspector.TimelineFlameChartEntryType.Event)
|
| - timelineSelection = WebInspector.TimelineSelection.fromTraceEvent(/** @type {!WebInspector.TracingModel.Event} */ (this._entryData[entryIndex]));
|
| - else if (type === WebInspector.TimelineFlameChartEntryType.Frame)
|
| - timelineSelection = WebInspector.TimelineSelection.fromFrame(/** @type {!WebInspector.TimelineFrame} */ (this._entryData[entryIndex]));
|
| - if (timelineSelection)
|
| - this._lastSelection = new WebInspector.TimelineFlameChartView.Selection(timelineSelection, entryIndex);
|
| - return timelineSelection;
|
| - },
|
| + function pushEndFlow(event, flowIndex) {
|
| + timelineData.flowEndTimes[flowIndex] = event.startTime;
|
| + timelineData.flowEndLevels[flowIndex] = level;
|
| + }
|
|
|
| - /**
|
| - * @param {?WebInspector.TimelineSelection} selection
|
| - * @return {number}
|
| - */
|
| - entryIndexForSelection: function(selection)
|
| - {
|
| - if (!selection || selection.type() === WebInspector.TimelineSelection.Type.Range)
|
| - return -1;
|
| -
|
| - if (this._lastSelection && this._lastSelection.timelineSelection.object() === selection.object())
|
| - return this._lastSelection.entryIndex;
|
| - var index = this._entryData.indexOf(/** @type {!WebInspector.TracingModel.Event|!WebInspector.TimelineFrame|!WebInspector.TimelineIRModel.Phases} */(selection.object()));
|
| - if (index !== -1)
|
| - this._lastSelection = new WebInspector.TimelineFlameChartView.Selection(selection, index);
|
| - return index;
|
| - },
|
| -
|
| - __proto__: WebInspector.TimelineFlameChartDataProviderBase.prototype
|
| + switch (event.phase) {
|
| + case WebInspector.TracingModel.Phase.FlowBegin:
|
| + this._flowEventIndexById[event.id] = pushStartFlow(event);
|
| + break;
|
| + case WebInspector.TracingModel.Phase.FlowStep:
|
| + pushEndFlow(event, this._flowEventIndexById[event.id]);
|
| + this._flowEventIndexById[event.id] = pushStartFlow(event);
|
| + break;
|
| + case WebInspector.TracingModel.Phase.FlowEnd:
|
| + pushEndFlow(event, this._flowEventIndexById[event.id]);
|
| + delete this._flowEventIndexById[event.id];
|
| + break;
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TracingModel.AsyncEvent} asyncEvent
|
| + * @param {number} level
|
| + */
|
| + _appendAsyncEvent(asyncEvent, level) {
|
| + if (WebInspector.TracingModel.isNestableAsyncPhase(asyncEvent.phase)) {
|
| + // FIXME: also add steps once we support event nesting in the FlameChart.
|
| + this._appendEvent(asyncEvent, level);
|
| + return;
|
| + }
|
| + var steps = asyncEvent.steps;
|
| + // If we have past steps, put the end event for each range rather than start one.
|
| + var eventOffset = steps.length > 1 && steps[1].phase === WebInspector.TracingModel.Phase.AsyncStepPast ? 1 : 0;
|
| + for (var i = 0; i < steps.length - 1; ++i) {
|
| + var index = this._entryData.length;
|
| + this._entryData.push(steps[i + eventOffset]);
|
| + var startTime = steps[i].startTime;
|
| + this._timelineData.entryLevels[index] = level;
|
| + this._timelineData.entryTotalTimes[index] = steps[i + 1].startTime - startTime;
|
| + this._timelineData.entryStartTimes[index] = startTime;
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TimelineFrame} frame
|
| + */
|
| + _appendFrame(frame) {
|
| + var index = this._entryData.length;
|
| + this._entryData.push(frame);
|
| + this._entryIndexToTitle[index] = Number.millisToString(frame.duration, true);
|
| + this._timelineData.entryLevels[index] = this._currentLevel;
|
| + this._timelineData.entryTotalTimes[index] = frame.duration;
|
| + this._timelineData.entryStartTimes[index] = frame.startTime;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.Segment} segment
|
| + */
|
| + _appendSegment(segment) {
|
| + var index = this._entryData.length;
|
| + this._entryData.push(/** @type {!WebInspector.TimelineIRModel.Phases} */ (segment.data));
|
| + this._entryIndexToTitle[index] = /** @type {string} */ (segment.data);
|
| + this._timelineData.entryLevels[index] = this._currentLevel;
|
| + this._timelineData.entryTotalTimes[index] = segment.end - segment.begin;
|
| + this._timelineData.entryStartTimes[index] = segment.begin;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} entryIndex
|
| + * @return {?WebInspector.TimelineSelection}
|
| + */
|
| + createSelection(entryIndex) {
|
| + var type = this._entryType(entryIndex);
|
| + var timelineSelection = null;
|
| + if (type === WebInspector.TimelineFlameChartEntryType.Event)
|
| + timelineSelection = WebInspector.TimelineSelection.fromTraceEvent(
|
| + /** @type {!WebInspector.TracingModel.Event} */ (this._entryData[entryIndex]));
|
| + else if (type === WebInspector.TimelineFlameChartEntryType.Frame)
|
| + timelineSelection = WebInspector.TimelineSelection.fromFrame(
|
| + /** @type {!WebInspector.TimelineFrame} */ (this._entryData[entryIndex]));
|
| + if (timelineSelection)
|
| + this._lastSelection = new WebInspector.TimelineFlameChartView.Selection(timelineSelection, entryIndex);
|
| + return timelineSelection;
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.TimelineSelection} selection
|
| + * @return {number}
|
| + */
|
| + entryIndexForSelection(selection) {
|
| + if (!selection || selection.type() === WebInspector.TimelineSelection.Type.Range)
|
| + return -1;
|
| +
|
| + if (this._lastSelection && this._lastSelection.timelineSelection.object() === selection.object())
|
| + return this._lastSelection.entryIndex;
|
| + var index = this._entryData.indexOf(
|
| + /** @type {!WebInspector.TracingModel.Event|!WebInspector.TimelineFrame|!WebInspector.TimelineIRModel.Phases} */
|
| + (selection.object()));
|
| + if (index !== -1)
|
| + this._lastSelection = new WebInspector.TimelineFlameChartView.Selection(selection, index);
|
| + return index;
|
| + }
|
| };
|
|
|
| +WebInspector.TimelineFlameChartDataProvider.InstantEventVisibleDurationMs = 0.001;
|
| +
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.TimelineFlameChartDataProviderBase}
|
| - * @param {!WebInspector.TimelineModel} model
|
| + * @unrestricted
|
| */
|
| -WebInspector.TimelineFlameChartNetworkDataProvider = function(model)
|
| -{
|
| - WebInspector.TimelineFlameChartDataProviderBase.call(this, model, []);
|
| - var loadingCategory = WebInspector.TimelineUIUtils.categories()["loading"];
|
| +WebInspector.TimelineFlameChartNetworkDataProvider = class extends WebInspector.TimelineFlameChartDataProviderBase {
|
| + /**
|
| + * @param {!WebInspector.TimelineModel} model
|
| + */
|
| + constructor(model) {
|
| + super(model, []);
|
| + var loadingCategory = WebInspector.TimelineUIUtils.categories()['loading'];
|
| this._waitingColor = loadingCategory.childColor;
|
| this._processingColor = loadingCategory.color;
|
| -};
|
| -
|
| -WebInspector.TimelineFlameChartNetworkDataProvider.prototype = {
|
| - /**
|
| - * @override
|
| - * @return {!WebInspector.FlameChart.TimelineData}
|
| - */
|
| - timelineData: function()
|
| - {
|
| - if (this._timelineData)
|
| - return this._timelineData;
|
| - /** @type {!Array<!WebInspector.TimelineModel.NetworkRequest>} */
|
| - this._requests = [];
|
| - this._timelineData = new WebInspector.FlameChart.TimelineData([], [], [], []);
|
| - this._appendTimelineData(this._model.mainThreadEvents());
|
| - return this._timelineData;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - reset: function()
|
| - {
|
| - WebInspector.TimelineFlameChartDataProviderBase.prototype.reset.call(this);
|
| - /** @type {!Array<!WebInspector.TimelineModel.NetworkRequest>} */
|
| - this._requests = [];
|
| - },
|
| -
|
| - /**
|
| - * @param {number} startTime
|
| - * @param {number} endTime
|
| - */
|
| - setWindowTimes: function(startTime, endTime)
|
| - {
|
| - this._startTime = startTime;
|
| - this._endTime = endTime;
|
| - this._updateTimelineData();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} index
|
| - * @return {?WebInspector.TimelineSelection}
|
| - */
|
| - createSelection: function(index)
|
| - {
|
| - if (index === -1)
|
| - return null;
|
| - var request = this._requests[index];
|
| - this._lastSelection = new WebInspector.TimelineFlameChartView.Selection(WebInspector.TimelineSelection.fromNetworkRequest(request), index);
|
| - return this._lastSelection.timelineSelection;
|
| - },
|
| -
|
| - /**
|
| - * @param {?WebInspector.TimelineSelection} selection
|
| - * @return {number}
|
| - */
|
| - entryIndexForSelection: function(selection)
|
| - {
|
| - if (!selection)
|
| - return -1;
|
| -
|
| - if (this._lastSelection && this._lastSelection.timelineSelection.object() === selection.object())
|
| - return this._lastSelection.entryIndex;
|
| -
|
| - if (selection.type() !== WebInspector.TimelineSelection.Type.NetworkRequest)
|
| - return -1;
|
| - var request = /** @type{!WebInspector.TimelineModel.NetworkRequest} */ (selection.object());
|
| - var index = this._requests.indexOf(request);
|
| - if (index !== -1)
|
| - this._lastSelection = new WebInspector.TimelineFlameChartView.Selection(WebInspector.TimelineSelection.fromNetworkRequest(request), index);
|
| - return index;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} index
|
| - * @return {string}
|
| - */
|
| - entryColor: function(index)
|
| - {
|
| - var request = /** @type {!WebInspector.TimelineModel.NetworkRequest} */ (this._requests[index]);
|
| - var category = WebInspector.TimelineUIUtils.networkRequestCategory(request);
|
| - return WebInspector.TimelineUIUtils.networkCategoryColor(category);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} index
|
| - * @return {?string}
|
| - */
|
| - entryTitle: function(index)
|
| - {
|
| - var request = /** @type {!WebInspector.TimelineModel.NetworkRequest} */ (this._requests[index]);
|
| - return request.url || null;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} index
|
| - * @param {!CanvasRenderingContext2D} context
|
| - * @param {?string} text
|
| - * @param {number} barX
|
| - * @param {number} barY
|
| - * @param {number} barWidth
|
| - * @param {number} barHeight
|
| - * @param {number} unclippedBarX
|
| - * @param {number} timeToPixels
|
| - * @return {boolean}
|
| - */
|
| - decorateEntry: function(index, context, text, barX, barY, barWidth, barHeight, unclippedBarX, timeToPixels)
|
| - {
|
| - var minTransferWidthPx = 2;
|
| - var request = /** @type {!WebInspector.TimelineModel.NetworkRequest} */ (this._requests[index]);
|
| - var startTime = request.startTime;
|
| - var endTime = request.endTime;
|
| - var lastX = unclippedBarX;
|
| - context.fillStyle = "hsla(0, 0%, 100%, 0.6)";
|
| - for (var i = 0; i < request.children.length; ++i) {
|
| - var event = request.children[i];
|
| - var t0 = event.startTime;
|
| - var t1 = event.endTime || event.startTime;
|
| - var x0 = Math.floor(unclippedBarX + (t0 - startTime) * timeToPixels - 1);
|
| - var x1 = Math.floor(unclippedBarX + (t1 - startTime) * timeToPixels + 1);
|
| - if (x0 > lastX)
|
| - context.fillRect(lastX, barY, x0 - lastX, barHeight);
|
| - lastX = x1;
|
| - }
|
| - var endX = unclippedBarX + (endTime - startTime) * timeToPixels;
|
| - if (endX > lastX)
|
| - context.fillRect(lastX, barY, Math.min(endX - lastX, 1e5), barHeight);
|
| - if (typeof request.priority === "string") {
|
| - var color = this._colorForPriority(request.priority);
|
| - if (color) {
|
| - context.fillStyle = "hsl(0, 0%, 100%)";
|
| - context.fillRect(barX, barY, 4, 4);
|
| - context.fillStyle = color;
|
| - context.fillRect(barX, barY, 3, 3);
|
| - }
|
| - }
|
| - return false;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} index
|
| - * @return {boolean}
|
| - */
|
| - forceDecoration: function(index)
|
| - {
|
| - return true;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} index
|
| - * @return {?Element}
|
| - */
|
| - prepareHighlightedEntryInfo: function(index)
|
| - {
|
| - var /** @const */ maxURLChars = 80;
|
| - var request = /** @type {!WebInspector.TimelineModel.NetworkRequest} */ (this._requests[index]);
|
| - if (!request.url)
|
| - return null;
|
| - var element = createElement("div");
|
| - var root = WebInspector.createShadowRootWithCoreStyles(element, "timeline/timelineFlamechartPopover.css");
|
| - var contents = root.createChild("div", "timeline-flamechart-popover");
|
| - var duration = request.endTime - request.startTime;
|
| - if (request.startTime && isFinite(duration))
|
| - contents.createChild("span", "timeline-info-network-time").textContent = Number.millisToString(duration);
|
| - if (typeof request.priority === "string") {
|
| - var div = contents.createChild("span");
|
| - div.textContent = WebInspector.uiLabelForPriority(/** @type {!NetworkAgent.ResourcePriority} */ (request.priority));
|
| - div.style.color = this._colorForPriority(request.priority) || "black";
|
| - }
|
| - contents.createChild("span").textContent = request.url.trimMiddle(maxURLChars);
|
| - return element;
|
| - },
|
| -
|
| - /**
|
| - * @param {string} priority
|
| - * @return {?string}
|
| - */
|
| - _colorForPriority: function(priority)
|
| - {
|
| - switch (/** @type {!NetworkAgent.ResourcePriority} */ (priority)) {
|
| - case NetworkAgent.ResourcePriority.VeryLow: return "#080";
|
| - case NetworkAgent.ResourcePriority.Low: return "#6c0";
|
| - case NetworkAgent.ResourcePriority.Medium: return "#fa0";
|
| - case NetworkAgent.ResourcePriority.High: return "#f60";
|
| - case NetworkAgent.ResourcePriority.VeryHigh: return "#f00";
|
| - }
|
| - return null;
|
| - },
|
| -
|
| - /**
|
| - * @param {!Array.<!WebInspector.TracingModel.Event>} events
|
| - */
|
| - _appendTimelineData: function(events)
|
| - {
|
| - this._minimumBoundary = this._model.minimumRecordTime();
|
| - this._maximumBoundary = this._model.maximumRecordTime();
|
| - this._timeSpan = this._model.isEmpty() ? 1000 : this._maximumBoundary - this._minimumBoundary;
|
| - this._model.networkRequests().forEach(this._appendEntry.bind(this));
|
| - this._updateTimelineData();
|
| - },
|
| -
|
| - _updateTimelineData: function()
|
| - {
|
| - if (!this._timelineData)
|
| - return;
|
| - var index = -1;
|
| - var lastTime = Infinity;
|
| - for (var i = 0; i < this._requests.length; ++i) {
|
| - var r = this._requests[i];
|
| - var visible = r.startTime < this._endTime && r.endTime > this._startTime;
|
| - if (!visible) {
|
| - this._timelineData.entryLevels[i] = -1;
|
| - continue;
|
| - }
|
| - if (lastTime > r.startTime)
|
| - ++index;
|
| - lastTime = r.endTime;
|
| - this._timelineData.entryLevels[i] = index;
|
| - }
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!WebInspector.FlameChart.TimelineData}
|
| + */
|
| + timelineData() {
|
| + if (this._timelineData)
|
| + return this._timelineData;
|
| + /** @type {!Array<!WebInspector.TimelineModel.NetworkRequest>} */
|
| + this._requests = [];
|
| + this._timelineData = new WebInspector.FlameChart.TimelineData([], [], [], []);
|
| + this._appendTimelineData(this._model.mainThreadEvents());
|
| + return this._timelineData;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + reset() {
|
| + super.reset();
|
| + /** @type {!Array<!WebInspector.TimelineModel.NetworkRequest>} */
|
| + this._requests = [];
|
| + }
|
| +
|
| + /**
|
| + * @param {number} startTime
|
| + * @param {number} endTime
|
| + */
|
| + setWindowTimes(startTime, endTime) {
|
| + this._startTime = startTime;
|
| + this._endTime = endTime;
|
| + this._updateTimelineData();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} index
|
| + * @return {?WebInspector.TimelineSelection}
|
| + */
|
| + createSelection(index) {
|
| + if (index === -1)
|
| + return null;
|
| + var request = this._requests[index];
|
| + this._lastSelection = new WebInspector.TimelineFlameChartView.Selection(
|
| + WebInspector.TimelineSelection.fromNetworkRequest(request), index);
|
| + return this._lastSelection.timelineSelection;
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.TimelineSelection} selection
|
| + * @return {number}
|
| + */
|
| + entryIndexForSelection(selection) {
|
| + if (!selection)
|
| + return -1;
|
| +
|
| + if (this._lastSelection && this._lastSelection.timelineSelection.object() === selection.object())
|
| + return this._lastSelection.entryIndex;
|
| +
|
| + if (selection.type() !== WebInspector.TimelineSelection.Type.NetworkRequest)
|
| + return -1;
|
| + var request = /** @type{!WebInspector.TimelineModel.NetworkRequest} */ (selection.object());
|
| + var index = this._requests.indexOf(request);
|
| + if (index !== -1)
|
| + this._lastSelection = new WebInspector.TimelineFlameChartView.Selection(
|
| + WebInspector.TimelineSelection.fromNetworkRequest(request), index);
|
| + return index;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} index
|
| + * @return {string}
|
| + */
|
| + entryColor(index) {
|
| + var request = /** @type {!WebInspector.TimelineModel.NetworkRequest} */ (this._requests[index]);
|
| + var category = WebInspector.TimelineUIUtils.networkRequestCategory(request);
|
| + return WebInspector.TimelineUIUtils.networkCategoryColor(category);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} index
|
| + * @return {?string}
|
| + */
|
| + entryTitle(index) {
|
| + var request = /** @type {!WebInspector.TimelineModel.NetworkRequest} */ (this._requests[index]);
|
| + return request.url || null;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} index
|
| + * @param {!CanvasRenderingContext2D} context
|
| + * @param {?string} text
|
| + * @param {number} barX
|
| + * @param {number} barY
|
| + * @param {number} barWidth
|
| + * @param {number} barHeight
|
| + * @param {number} unclippedBarX
|
| + * @param {number} timeToPixels
|
| + * @return {boolean}
|
| + */
|
| + decorateEntry(index, context, text, barX, barY, barWidth, barHeight, unclippedBarX, timeToPixels) {
|
| + var minTransferWidthPx = 2;
|
| + var request = /** @type {!WebInspector.TimelineModel.NetworkRequest} */ (this._requests[index]);
|
| + var startTime = request.startTime;
|
| + var endTime = request.endTime;
|
| + var lastX = unclippedBarX;
|
| + context.fillStyle = 'hsla(0, 0%, 100%, 0.6)';
|
| + for (var i = 0; i < request.children.length; ++i) {
|
| + var event = request.children[i];
|
| + var t0 = event.startTime;
|
| + var t1 = event.endTime || event.startTime;
|
| + var x0 = Math.floor(unclippedBarX + (t0 - startTime) * timeToPixels - 1);
|
| + var x1 = Math.floor(unclippedBarX + (t1 - startTime) * timeToPixels + 1);
|
| + if (x0 > lastX)
|
| + context.fillRect(lastX, barY, x0 - lastX, barHeight);
|
| + lastX = x1;
|
| + }
|
| + var endX = unclippedBarX + (endTime - startTime) * timeToPixels;
|
| + if (endX > lastX)
|
| + context.fillRect(lastX, barY, Math.min(endX - lastX, 1e5), barHeight);
|
| + if (typeof request.priority === 'string') {
|
| + var color = this._colorForPriority(request.priority);
|
| + if (color) {
|
| + context.fillStyle = 'hsl(0, 0%, 100%)';
|
| + context.fillRect(barX, barY, 4, 4);
|
| + context.fillStyle = color;
|
| + context.fillRect(barX, barY, 3, 3);
|
| + }
|
| + }
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} index
|
| + * @return {boolean}
|
| + */
|
| + forceDecoration(index) {
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} index
|
| + * @return {?Element}
|
| + */
|
| + prepareHighlightedEntryInfo(index) {
|
| + var /** @const */ maxURLChars = 80;
|
| + var request = /** @type {!WebInspector.TimelineModel.NetworkRequest} */ (this._requests[index]);
|
| + if (!request.url)
|
| + return null;
|
| + var element = createElement('div');
|
| + var root = WebInspector.createShadowRootWithCoreStyles(element, 'timeline/timelineFlamechartPopover.css');
|
| + var contents = root.createChild('div', 'timeline-flamechart-popover');
|
| + var duration = request.endTime - request.startTime;
|
| + if (request.startTime && isFinite(duration))
|
| + contents.createChild('span', 'timeline-info-network-time').textContent = Number.millisToString(duration);
|
| + if (typeof request.priority === 'string') {
|
| + var div = contents.createChild('span');
|
| + div.textContent =
|
| + WebInspector.uiLabelForPriority(/** @type {!NetworkAgent.ResourcePriority} */ (request.priority));
|
| + div.style.color = this._colorForPriority(request.priority) || 'black';
|
| + }
|
| + contents.createChild('span').textContent = request.url.trimMiddle(maxURLChars);
|
| + return element;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} priority
|
| + * @return {?string}
|
| + */
|
| + _colorForPriority(priority) {
|
| + switch (/** @type {!NetworkAgent.ResourcePriority} */ (priority)) {
|
| + case NetworkAgent.ResourcePriority.VeryLow:
|
| + return '#080';
|
| + case NetworkAgent.ResourcePriority.Low:
|
| + return '#6c0';
|
| + case NetworkAgent.ResourcePriority.Medium:
|
| + return '#fa0';
|
| + case NetworkAgent.ResourcePriority.High:
|
| + return '#f60';
|
| + case NetworkAgent.ResourcePriority.VeryHigh:
|
| + return '#f00';
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array.<!WebInspector.TracingModel.Event>} events
|
| + */
|
| + _appendTimelineData(events) {
|
| + this._minimumBoundary = this._model.minimumRecordTime();
|
| + this._maximumBoundary = this._model.maximumRecordTime();
|
| + this._timeSpan = this._model.isEmpty() ? 1000 : this._maximumBoundary - this._minimumBoundary;
|
| + this._model.networkRequests().forEach(this._appendEntry.bind(this));
|
| + this._updateTimelineData();
|
| + }
|
| +
|
| + _updateTimelineData() {
|
| + if (!this._timelineData)
|
| + return;
|
| + var index = -1;
|
| + var lastTime = Infinity;
|
| + for (var i = 0; i < this._requests.length; ++i) {
|
| + var r = this._requests[i];
|
| + var visible = r.startTime < this._endTime && r.endTime > this._startTime;
|
| + if (!visible) {
|
| + this._timelineData.entryLevels[i] = -1;
|
| + continue;
|
| + }
|
| + if (lastTime > r.startTime)
|
| ++index;
|
| - for (var i = 0; i < this._requests.length; ++i) {
|
| - if (this._timelineData.entryLevels[i] === -1)
|
| - this._timelineData.entryLevels[i] = index;
|
| - }
|
| - this._timelineData = new WebInspector.FlameChart.TimelineData(
|
| - this._timelineData.entryLevels,
|
| - this._timelineData.entryTotalTimes,
|
| - this._timelineData.entryStartTimes,
|
| - null);
|
| - this._currentLevel = index;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.TimelineModel.NetworkRequest} request
|
| - */
|
| - _appendEntry: function(request)
|
| - {
|
| - this._requests.push(request);
|
| - this._timelineData.entryStartTimes.push(request.startTime);
|
| - this._timelineData.entryTotalTimes.push(request.endTime - request.startTime);
|
| - this._timelineData.entryLevels.push(this._requests.length - 1);
|
| - },
|
| -
|
| - __proto__: WebInspector.TimelineFlameChartDataProviderBase.prototype
|
| + lastTime = r.endTime;
|
| + this._timelineData.entryLevels[i] = index;
|
| + }
|
| + ++index;
|
| + for (var i = 0; i < this._requests.length; ++i) {
|
| + if (this._timelineData.entryLevels[i] === -1)
|
| + this._timelineData.entryLevels[i] = index;
|
| + }
|
| + this._timelineData = new WebInspector.FlameChart.TimelineData(
|
| + this._timelineData.entryLevels, this._timelineData.entryTotalTimes, this._timelineData.entryStartTimes, null);
|
| + this._currentLevel = index;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TimelineModel.NetworkRequest} request
|
| + */
|
| + _appendEntry(request) {
|
| + this._requests.push(request);
|
| + this._timelineData.entryStartTimes.push(request.startTime);
|
| + this._timelineData.entryTotalTimes.push(request.endTime - request.startTime);
|
| + this._timelineData.entryLevels.push(this._requests.length - 1);
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| * @implements {WebInspector.FlameChartMarker}
|
| - * @param {number} startTime
|
| - * @param {number} startOffset
|
| - * @param {!WebInspector.TimelineMarkerStyle} style
|
| + * @unrestricted
|
| */
|
| -WebInspector.TimelineFlameChartMarker = function(startTime, startOffset, style)
|
| -{
|
| +WebInspector.TimelineFlameChartMarker = class {
|
| + /**
|
| + * @param {number} startTime
|
| + * @param {number} startOffset
|
| + * @param {!WebInspector.TimelineMarkerStyle} style
|
| + */
|
| + constructor(startTime, startOffset, style) {
|
| this._startTime = startTime;
|
| this._startOffset = startOffset;
|
| this._style = style;
|
| -};
|
| -
|
| -WebInspector.TimelineFlameChartMarker.prototype = {
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - startTime: function()
|
| - {
|
| - return this._startTime;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {string}
|
| - */
|
| - color: function()
|
| - {
|
| - return this._style.color;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {string}
|
| - */
|
| - title: function()
|
| - {
|
| - var startTime = Number.millisToString(this._startOffset);
|
| - return WebInspector.UIString("%s at %s", this._style.title, startTime);
|
| - },
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + startTime() {
|
| + return this._startTime;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {string}
|
| + */
|
| + color() {
|
| + return this._style.color;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {string}
|
| + */
|
| + title() {
|
| + var startTime = Number.millisToString(this._startOffset);
|
| + return WebInspector.UIString('%s at %s', this._style.title, startTime);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!CanvasRenderingContext2D} context
|
| + * @param {number} x
|
| + * @param {number} height
|
| + * @param {number} pixelsPerMillisecond
|
| + */
|
| + draw(context, x, height, pixelsPerMillisecond) {
|
| + var lowPriorityVisibilityThresholdInPixelsPerMs = 4;
|
| +
|
| + if (this._style.lowPriority && pixelsPerMillisecond < lowPriorityVisibilityThresholdInPixelsPerMs)
|
| + return;
|
| + context.save();
|
| +
|
| + if (!this._style.lowPriority) {
|
| + context.strokeStyle = this._style.color;
|
| + context.lineWidth = 2;
|
| + context.beginPath();
|
| + context.moveTo(x, 0);
|
| + context.lineTo(x, height);
|
| + context.stroke();
|
| + }
|
|
|
| - /**
|
| - * @override
|
| - * @param {!CanvasRenderingContext2D} context
|
| - * @param {number} x
|
| - * @param {number} height
|
| - * @param {number} pixelsPerMillisecond
|
| - */
|
| - draw: function(context, x, height, pixelsPerMillisecond)
|
| - {
|
| - var lowPriorityVisibilityThresholdInPixelsPerMs = 4;
|
| -
|
| - if (this._style.lowPriority && pixelsPerMillisecond < lowPriorityVisibilityThresholdInPixelsPerMs)
|
| - return;
|
| - context.save();
|
| -
|
| - if (!this._style.lowPriority) {
|
| - context.strokeStyle = this._style.color;
|
| - context.lineWidth = 2;
|
| - context.beginPath();
|
| - context.moveTo(x, 0);
|
| - context.lineTo(x, height);
|
| - context.stroke();
|
| - }
|
| -
|
| - if (this._style.tall) {
|
| - context.strokeStyle = this._style.color;
|
| - context.lineWidth = this._style.lineWidth;
|
| - context.translate(this._style.lineWidth < 1 || (this._style.lineWidth & 1) ? 0.5 : 0, 0.5);
|
| - context.beginPath();
|
| - context.moveTo(x, height);
|
| - context.setLineDash(this._style.dashStyle);
|
| - context.lineTo(x, context.canvas.height);
|
| - context.stroke();
|
| - }
|
| - context.restore();
|
| + if (this._style.tall) {
|
| + context.strokeStyle = this._style.color;
|
| + context.lineWidth = this._style.lineWidth;
|
| + context.translate(this._style.lineWidth < 1 || (this._style.lineWidth & 1) ? 0.5 : 0, 0.5);
|
| + context.beginPath();
|
| + context.moveTo(x, height);
|
| + context.setLineDash(this._style.dashStyle);
|
| + context.lineTo(x, context.canvas.height);
|
| + context.stroke();
|
| }
|
| + context.restore();
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.VBox}
|
| * @implements {WebInspector.TimelineModeView}
|
| * @implements {WebInspector.FlameChartDelegate}
|
| - * @param {!WebInspector.TimelineModeViewDelegate} delegate
|
| - * @param {!WebInspector.TimelineModel} timelineModel
|
| - * @param {!WebInspector.TimelineFrameModel} frameModel
|
| - * @param {!WebInspector.TimelineIRModel} irModel
|
| - * @param {!Array<!WebInspector.TimelineModel.Filter>} filters
|
| + * @unrestricted
|
| */
|
| -WebInspector.TimelineFlameChartView = function(delegate, timelineModel, frameModel, irModel, filters)
|
| -{
|
| - WebInspector.VBox.call(this);
|
| - this.element.classList.add("timeline-flamechart");
|
| +WebInspector.TimelineFlameChartView = class extends WebInspector.VBox {
|
| + /**
|
| + * @param {!WebInspector.TimelineModeViewDelegate} delegate
|
| + * @param {!WebInspector.TimelineModel} timelineModel
|
| + * @param {!WebInspector.TimelineFrameModel} frameModel
|
| + * @param {!WebInspector.TimelineIRModel} irModel
|
| + * @param {!Array<!WebInspector.TimelineModel.Filter>} filters
|
| + */
|
| + constructor(delegate, timelineModel, frameModel, irModel, filters) {
|
| + super();
|
| + this.element.classList.add('timeline-flamechart');
|
| this._delegate = delegate;
|
| this._model = timelineModel;
|
|
|
| - this._splitWidget = new WebInspector.SplitWidget(false, false, "timelineFlamechartMainView", 150);
|
| + this._splitWidget = new WebInspector.SplitWidget(false, false, 'timelineFlamechartMainView', 150);
|
|
|
| this._dataProvider = new WebInspector.TimelineFlameChartDataProvider(this._model, frameModel, irModel, filters);
|
| - var mainViewGroupExpansionSetting = WebInspector.settings.createSetting("timelineFlamechartMainViewGroupExpansion", {});
|
| + var mainViewGroupExpansionSetting =
|
| + WebInspector.settings.createSetting('timelineFlamechartMainViewGroupExpansion', {});
|
| this._mainView = new WebInspector.FlameChart(this._dataProvider, this, mainViewGroupExpansionSetting);
|
|
|
| this._networkDataProvider = new WebInspector.TimelineFlameChartNetworkDataProvider(this._model);
|
| @@ -1322,179 +1277,168 @@ WebInspector.TimelineFlameChartView = function(delegate, timelineModel, frameMod
|
| this._onMainEntrySelected = this._onEntrySelected.bind(this, this._dataProvider);
|
| this._onNetworkEntrySelected = this._onEntrySelected.bind(this, this._networkDataProvider);
|
| this._mainView.addEventListener(WebInspector.FlameChart.Events.EntrySelected, this._onMainEntrySelected, this);
|
| - this._networkView.addEventListener(WebInspector.FlameChart.Events.EntrySelected, this._onNetworkEntrySelected, this);
|
| + this._networkView.addEventListener(
|
| + WebInspector.FlameChart.Events.EntrySelected, this._onNetworkEntrySelected, this);
|
| WebInspector.blackboxManager.addChangeListener(this.refreshRecords, this);
|
| -};
|
| -
|
| -WebInspector.TimelineFlameChartView.prototype = {
|
| - /**
|
| - * @override
|
| - */
|
| - dispose: function()
|
| - {
|
| - this._mainView.removeEventListener(WebInspector.FlameChart.Events.EntrySelected, this._onMainEntrySelected, this);
|
| - this._networkView.removeEventListener(WebInspector.FlameChart.Events.EntrySelected, this._onNetworkEntrySelected, this);
|
| - WebInspector.blackboxManager.removeChangeListener(this.refreshRecords, this);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {?Element}
|
| - */
|
| - resizerElement: function()
|
| - {
|
| - return null;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} windowStartTime
|
| - * @param {number} windowEndTime
|
| - */
|
| - requestWindowTimes: function(windowStartTime, windowEndTime)
|
| - {
|
| - this._delegate.requestWindowTimes(windowStartTime, windowEndTime);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} startTime
|
| - * @param {number} endTime
|
| - */
|
| - updateRangeSelection: function(startTime, endTime)
|
| - {
|
| - this._delegate.select(WebInspector.TimelineSelection.fromRange(startTime, endTime));
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - refreshRecords: function()
|
| - {
|
| - this._dataProvider.reset();
|
| - this._mainView.scheduleUpdate();
|
| - this._networkDataProvider.reset();
|
| - this._networkView.scheduleUpdate();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {?WebInspector.TracingModel.Event} event
|
| - */
|
| - highlightEvent: function(event)
|
| - {
|
| - var entryIndex = event ? this._dataProvider.entryIndexForSelection(WebInspector.TimelineSelection.fromTraceEvent(event)) : -1;
|
| - if (entryIndex >= 0)
|
| - this._mainView.highlightEntry(entryIndex);
|
| - else
|
| - this._mainView.hideHighlight();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - wasShown: function()
|
| - {
|
| - this._mainView.scheduleUpdate();
|
| - this._networkView.scheduleUpdate();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!WebInspector.Widget}
|
| - */
|
| - view: function()
|
| - {
|
| - return this;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - reset: function()
|
| - {
|
| - this._dataProvider.reset();
|
| - this._mainView.reset();
|
| - this._mainView.setWindowTimes(0, Infinity);
|
| - this._networkDataProvider.reset();
|
| - this._networkView.reset();
|
| - this._networkView.setWindowTimes(0, Infinity);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {number} startTime
|
| - * @param {number} endTime
|
| - */
|
| - setWindowTimes: function(startTime, endTime)
|
| - {
|
| - this._mainView.setWindowTimes(startTime, endTime);
|
| - this._networkView.setWindowTimes(startTime, endTime);
|
| - this._networkDataProvider.setWindowTimes(startTime, endTime);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {?WebInspector.TracingModel.Event} event
|
| - * @param {string=} regex
|
| - * @param {boolean=} select
|
| - */
|
| - highlightSearchResult: function(event, regex, select)
|
| - {
|
| - if (!event) {
|
| - this._delegate.select(null);
|
| - return;
|
| - }
|
| - var entryIndex = this._dataProvider._entryData.indexOf(event);
|
| - var timelineSelection = this._dataProvider.createSelection(entryIndex);
|
| - if (timelineSelection)
|
| - this._delegate.select(timelineSelection);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {?WebInspector.TimelineSelection} selection
|
| - */
|
| - setSelection: function(selection)
|
| - {
|
| - var index = this._dataProvider.entryIndexForSelection(selection);
|
| - this._mainView.setSelectedEntry(index);
|
| - index = this._networkDataProvider.entryIndexForSelection(selection);
|
| - this._networkView.setSelectedEntry(index);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.FlameChartDataProvider} dataProvider
|
| - * @param {!WebInspector.Event} event
|
| - */
|
| - _onEntrySelected: function(dataProvider, event)
|
| - {
|
| - var entryIndex = /** @type{number} */ (event.data);
|
| - this._delegate.select(dataProvider.createSelection(entryIndex));
|
| - },
|
| -
|
| - /**
|
| - * @param {boolean} enable
|
| - * @param {boolean=} animate
|
| - */
|
| - enableNetworkPane: function(enable, animate)
|
| - {
|
| - if (enable)
|
| - this._splitWidget.showBoth(animate);
|
| - else
|
| - this._splitWidget.hideSidebar(animate);
|
| - },
|
| -
|
| - __proto__: WebInspector.VBox.prototype
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + dispose() {
|
| + this._mainView.removeEventListener(WebInspector.FlameChart.Events.EntrySelected, this._onMainEntrySelected, this);
|
| + this._networkView.removeEventListener(
|
| + WebInspector.FlameChart.Events.EntrySelected, this._onNetworkEntrySelected, this);
|
| + WebInspector.blackboxManager.removeChangeListener(this.refreshRecords, this);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {?Element}
|
| + */
|
| + resizerElement() {
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} windowStartTime
|
| + * @param {number} windowEndTime
|
| + */
|
| + requestWindowTimes(windowStartTime, windowEndTime) {
|
| + this._delegate.requestWindowTimes(windowStartTime, windowEndTime);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} startTime
|
| + * @param {number} endTime
|
| + */
|
| + updateRangeSelection(startTime, endTime) {
|
| + this._delegate.select(WebInspector.TimelineSelection.fromRange(startTime, endTime));
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + refreshRecords() {
|
| + this._dataProvider.reset();
|
| + this._mainView.scheduleUpdate();
|
| + this._networkDataProvider.reset();
|
| + this._networkView.scheduleUpdate();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {?WebInspector.TracingModel.Event} event
|
| + */
|
| + highlightEvent(event) {
|
| + var entryIndex =
|
| + event ? this._dataProvider.entryIndexForSelection(WebInspector.TimelineSelection.fromTraceEvent(event)) : -1;
|
| + if (entryIndex >= 0)
|
| + this._mainView.highlightEntry(entryIndex);
|
| + else
|
| + this._mainView.hideHighlight();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + wasShown() {
|
| + this._mainView.scheduleUpdate();
|
| + this._networkView.scheduleUpdate();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!WebInspector.Widget}
|
| + */
|
| + view() {
|
| + return this;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + reset() {
|
| + this._dataProvider.reset();
|
| + this._mainView.reset();
|
| + this._mainView.setWindowTimes(0, Infinity);
|
| + this._networkDataProvider.reset();
|
| + this._networkView.reset();
|
| + this._networkView.setWindowTimes(0, Infinity);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {number} startTime
|
| + * @param {number} endTime
|
| + */
|
| + setWindowTimes(startTime, endTime) {
|
| + this._mainView.setWindowTimes(startTime, endTime);
|
| + this._networkView.setWindowTimes(startTime, endTime);
|
| + this._networkDataProvider.setWindowTimes(startTime, endTime);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {?WebInspector.TracingModel.Event} event
|
| + * @param {string=} regex
|
| + * @param {boolean=} select
|
| + */
|
| + highlightSearchResult(event, regex, select) {
|
| + if (!event) {
|
| + this._delegate.select(null);
|
| + return;
|
| + }
|
| + var entryIndex = this._dataProvider._entryData.indexOf(event);
|
| + var timelineSelection = this._dataProvider.createSelection(entryIndex);
|
| + if (timelineSelection)
|
| + this._delegate.select(timelineSelection);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {?WebInspector.TimelineSelection} selection
|
| + */
|
| + setSelection(selection) {
|
| + var index = this._dataProvider.entryIndexForSelection(selection);
|
| + this._mainView.setSelectedEntry(index);
|
| + index = this._networkDataProvider.entryIndexForSelection(selection);
|
| + this._networkView.setSelectedEntry(index);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.FlameChartDataProvider} dataProvider
|
| + * @param {!WebInspector.Event} event
|
| + */
|
| + _onEntrySelected(dataProvider, event) {
|
| + var entryIndex = /** @type{number} */ (event.data);
|
| + this._delegate.select(dataProvider.createSelection(entryIndex));
|
| + }
|
| +
|
| + /**
|
| + * @param {boolean} enable
|
| + * @param {boolean=} animate
|
| + */
|
| + enableNetworkPane(enable, animate) {
|
| + if (enable)
|
| + this._splitWidget.showBoth(animate);
|
| + else
|
| + this._splitWidget.hideSidebar(animate);
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {!WebInspector.TimelineSelection} selection
|
| - * @param {number} entryIndex
|
| - */
|
| -WebInspector.TimelineFlameChartView.Selection = function(selection, entryIndex)
|
| -{
|
| + * @unrestricted
|
| + */
|
| +WebInspector.TimelineFlameChartView.Selection = class {
|
| + /**
|
| + * @param {!WebInspector.TimelineSelection} selection
|
| + * @param {number} entryIndex
|
| + */
|
| + constructor(selection, entryIndex) {
|
| this.timelineSelection = selection;
|
| this.entryIndex = entryIndex;
|
| + }
|
| };
|
|
|