| Index: third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineIRModel.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineIRModel.js b/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineIRModel.js
|
| index e31fc1a5e2a5f1a7489e23b2b7b3b3fe5bbf3790..18d1f1d68ce5bb9a856bba79dd11d139443fd7ea 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineIRModel.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineIRModel.js
|
| @@ -1,333 +1,321 @@
|
| // Copyright 2016 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
| -
|
| /**
|
| - * @constructor
|
| + * @unrestricted
|
| */
|
| -WebInspector.TimelineIRModel = function()
|
| -{
|
| +WebInspector.TimelineIRModel = class {
|
| + constructor() {
|
| + this.reset();
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TracingModel.Event} event
|
| + * @return {!WebInspector.TimelineIRModel.Phases}
|
| + */
|
| + static phaseForEvent(event) {
|
| + return event[WebInspector.TimelineIRModel._eventIRPhase];
|
| + }
|
| +
|
| + /**
|
| + * @param {?Array<!WebInspector.TracingModel.AsyncEvent>} inputLatencies
|
| + * @param {?Array<!WebInspector.TracingModel.AsyncEvent>} animations
|
| + */
|
| + populate(inputLatencies, animations) {
|
| + var eventTypes = WebInspector.TimelineIRModel.InputEvents;
|
| + var phases = WebInspector.TimelineIRModel.Phases;
|
| +
|
| this.reset();
|
| + if (!inputLatencies)
|
| + return;
|
| + this._processInputLatencies(inputLatencies);
|
| + if (animations)
|
| + this._processAnimations(animations);
|
| + var range = new WebInspector.SegmentedRange();
|
| + range.appendRange(this._drags); // Drags take lower precedence than animation, as we can't detect them reliably.
|
| + range.appendRange(this._cssAnimations);
|
| + range.appendRange(this._scrolls);
|
| + range.appendRange(this._responses);
|
| + this._segments = range.segments();
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array<!WebInspector.TracingModel.AsyncEvent>} events
|
| + */
|
| + _processInputLatencies(events) {
|
| + var eventTypes = WebInspector.TimelineIRModel.InputEvents;
|
| + var phases = WebInspector.TimelineIRModel.Phases;
|
| + var thresholdsMs = WebInspector.TimelineIRModel._mergeThresholdsMs;
|
| +
|
| + var scrollStart;
|
| + var flingStart;
|
| + var touchStart;
|
| + var firstTouchMove;
|
| + var mouseWheel;
|
| + var mouseDown;
|
| + var mouseMove;
|
| +
|
| + for (var i = 0; i < events.length; ++i) {
|
| + var event = events[i];
|
| + if (i > 0 && events[i].startTime < events[i - 1].startTime)
|
| + console.assert(false, 'Unordered input events');
|
| + var type = this._inputEventType(event.name);
|
| + switch (type) {
|
| + case eventTypes.ScrollBegin:
|
| + this._scrolls.append(this._segmentForEvent(event, phases.Scroll));
|
| + scrollStart = event;
|
| + break;
|
| +
|
| + case eventTypes.ScrollEnd:
|
| + if (scrollStart)
|
| + this._scrolls.append(this._segmentForEventRange(scrollStart, event, phases.Scroll));
|
| + else
|
| + this._scrolls.append(this._segmentForEvent(event, phases.Scroll));
|
| + scrollStart = null;
|
| + break;
|
| +
|
| + case eventTypes.ScrollUpdate:
|
| + touchStart = null; // Since we're scrolling now, disregard other touch gestures.
|
| + this._scrolls.append(this._segmentForEvent(event, phases.Scroll));
|
| + break;
|
| +
|
| + case eventTypes.FlingStart:
|
| + if (flingStart) {
|
| + WebInspector.console.error(
|
| + WebInspector.UIString('Two flings at the same time? %s vs %s', flingStart.startTime, event.startTime));
|
| + break;
|
| + }
|
| + flingStart = event;
|
| + break;
|
| +
|
| + case eventTypes.FlingCancel:
|
| + // FIXME: also process renderer fling events.
|
| + if (!flingStart)
|
| + break;
|
| + this._scrolls.append(this._segmentForEventRange(flingStart, event, phases.Fling));
|
| + flingStart = null;
|
| + break;
|
| +
|
| + case eventTypes.ImplSideFling:
|
| + this._scrolls.append(this._segmentForEvent(event, phases.Fling));
|
| + break;
|
| +
|
| + case eventTypes.ShowPress:
|
| + case eventTypes.Tap:
|
| + case eventTypes.KeyDown:
|
| + case eventTypes.KeyDownRaw:
|
| + case eventTypes.KeyUp:
|
| + case eventTypes.Char:
|
| + case eventTypes.Click:
|
| + case eventTypes.ContextMenu:
|
| + this._responses.append(this._segmentForEvent(event, phases.Response));
|
| + break;
|
| +
|
| + case eventTypes.TouchStart:
|
| + // We do not produce any response segment for TouchStart -- there's either going to be one upon
|
| + // TouchMove for drag, or one for GestureTap.
|
| + if (touchStart) {
|
| + WebInspector.console.error(
|
| + WebInspector.UIString('Two touches at the same time? %s vs %s', touchStart.startTime, event.startTime));
|
| + break;
|
| + }
|
| + touchStart = event;
|
| + event.steps[0][WebInspector.TimelineIRModel._eventIRPhase] = phases.Response;
|
| + firstTouchMove = null;
|
| + break;
|
| +
|
| + case eventTypes.TouchCancel:
|
| + touchStart = null;
|
| + break;
|
| +
|
| + case eventTypes.TouchMove:
|
| + if (firstTouchMove) {
|
| + this._drags.append(this._segmentForEvent(event, phases.Drag));
|
| + } else if (touchStart) {
|
| + firstTouchMove = event;
|
| + this._responses.append(this._segmentForEventRange(touchStart, event, phases.Response));
|
| + }
|
| + break;
|
| +
|
| + case eventTypes.TouchEnd:
|
| + touchStart = null;
|
| + break;
|
| +
|
| + case eventTypes.MouseDown:
|
| + mouseDown = event;
|
| + mouseMove = null;
|
| + break;
|
| +
|
| + case eventTypes.MouseMove:
|
| + if (mouseDown && !mouseMove && mouseDown.startTime + thresholdsMs.mouse > event.startTime) {
|
| + this._responses.append(this._segmentForEvent(mouseDown, phases.Response));
|
| + this._responses.append(this._segmentForEvent(event, phases.Response));
|
| + } else if (mouseDown) {
|
| + this._drags.append(this._segmentForEvent(event, phases.Drag));
|
| + }
|
| + mouseMove = event;
|
| + break;
|
| +
|
| + case eventTypes.MouseUp:
|
| + this._responses.append(this._segmentForEvent(event, phases.Response));
|
| + mouseDown = null;
|
| + break;
|
| +
|
| + case eventTypes.MouseWheel:
|
| + // Do not consider first MouseWheel as trace viewer's implementation does -- in case of MouseWheel it's not really special.
|
| + if (mouseWheel && canMerge(thresholdsMs.mouse, mouseWheel, event))
|
| + this._scrolls.append(this._segmentForEventRange(mouseWheel, event, phases.Scroll));
|
| + else
|
| + this._scrolls.append(this._segmentForEvent(event, phases.Scroll));
|
| + mouseWheel = event;
|
| + break;
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {number} threshold
|
| + * @param {!WebInspector.TracingModel.AsyncEvent} first
|
| + * @param {!WebInspector.TracingModel.AsyncEvent} second
|
| + * @return {boolean}
|
| + */
|
| + function canMerge(threshold, first, second) {
|
| + return first.endTime < second.startTime && second.startTime < first.endTime + threshold;
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array<!WebInspector.TracingModel.AsyncEvent>} events
|
| + */
|
| + _processAnimations(events) {
|
| + for (var i = 0; i < events.length; ++i)
|
| + this._cssAnimations.append(this._segmentForEvent(events[i], WebInspector.TimelineIRModel.Phases.Animation));
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TracingModel.AsyncEvent} event
|
| + * @param {!WebInspector.TimelineIRModel.Phases} phase
|
| + * @return {!WebInspector.Segment}
|
| + */
|
| + _segmentForEvent(event, phase) {
|
| + this._setPhaseForEvent(event, phase);
|
| + return new WebInspector.Segment(event.startTime, event.endTime, phase);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TracingModel.AsyncEvent} startEvent
|
| + * @param {!WebInspector.TracingModel.AsyncEvent} endEvent
|
| + * @param {!WebInspector.TimelineIRModel.Phases} phase
|
| + * @return {!WebInspector.Segment}
|
| + */
|
| + _segmentForEventRange(startEvent, endEvent, phase) {
|
| + this._setPhaseForEvent(startEvent, phase);
|
| + this._setPhaseForEvent(endEvent, phase);
|
| + return new WebInspector.Segment(startEvent.startTime, endEvent.endTime, phase);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TracingModel.AsyncEvent} asyncEvent
|
| + * @param {!WebInspector.TimelineIRModel.Phases} phase
|
| + */
|
| + _setPhaseForEvent(asyncEvent, phase) {
|
| + asyncEvent.steps[0][WebInspector.TimelineIRModel._eventIRPhase] = phase;
|
| + }
|
| +
|
| + /**
|
| + * @return {!Array<!WebInspector.Segment>}
|
| + */
|
| + interactionRecords() {
|
| + return this._segments;
|
| + }
|
| +
|
| + reset() {
|
| + var thresholdsMs = WebInspector.TimelineIRModel._mergeThresholdsMs;
|
| +
|
| + this._segments = [];
|
| + this._drags = new WebInspector.SegmentedRange(merge.bind(null, thresholdsMs.mouse));
|
| + this._cssAnimations = new WebInspector.SegmentedRange(merge.bind(null, thresholdsMs.animation));
|
| + this._responses = new WebInspector.SegmentedRange(merge.bind(null, 0));
|
| + this._scrolls = new WebInspector.SegmentedRange(merge.bind(null, thresholdsMs.animation));
|
| +
|
| + /**
|
| + * @param {number} threshold
|
| + * @param {!WebInspector.Segment} first
|
| + * @param {!WebInspector.Segment} second
|
| + */
|
| + function merge(threshold, first, second) {
|
| + return first.end + threshold >= second.begin && first.data === second.data ? first : null;
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {string} eventName
|
| + * @return {?WebInspector.TimelineIRModel.InputEvents}
|
| + */
|
| + _inputEventType(eventName) {
|
| + var prefix = 'InputLatency::';
|
| + if (!eventName.startsWith(prefix)) {
|
| + if (eventName === WebInspector.TimelineIRModel.InputEvents.ImplSideFling)
|
| + return /** @type {!WebInspector.TimelineIRModel.InputEvents} */ (eventName);
|
| + console.error('Unrecognized input latency event: ' + eventName);
|
| + return null;
|
| + }
|
| + return /** @type {!WebInspector.TimelineIRModel.InputEvents} */ (eventName.substr(prefix.length));
|
| + }
|
| };
|
|
|
| /**
|
| * @enum {string}
|
| */
|
| WebInspector.TimelineIRModel.Phases = {
|
| - Idle: "Idle",
|
| - Response: "Response",
|
| - Scroll: "Scroll",
|
| - Fling: "Fling",
|
| - Drag: "Drag",
|
| - Animation: "Animation",
|
| - Uncategorized: "Uncategorized"
|
| + Idle: 'Idle',
|
| + Response: 'Response',
|
| + Scroll: 'Scroll',
|
| + Fling: 'Fling',
|
| + Drag: 'Drag',
|
| + Animation: 'Animation',
|
| + Uncategorized: 'Uncategorized'
|
| };
|
|
|
| /**
|
| * @enum {string}
|
| */
|
| WebInspector.TimelineIRModel.InputEvents = {
|
| - Char: "Char",
|
| - Click: "GestureClick",
|
| - ContextMenu: "ContextMenu",
|
| - FlingCancel: "GestureFlingCancel",
|
| - FlingStart: "GestureFlingStart",
|
| - ImplSideFling: WebInspector.TimelineModel.RecordType.ImplSideFling,
|
| - KeyDown: "KeyDown",
|
| - KeyDownRaw: "RawKeyDown",
|
| - KeyUp: "KeyUp",
|
| - LatencyScrollUpdate: "ScrollUpdate",
|
| - MouseDown: "MouseDown",
|
| - MouseMove: "MouseMove",
|
| - MouseUp: "MouseUp",
|
| - MouseWheel: "MouseWheel",
|
| - PinchBegin: "GesturePinchBegin",
|
| - PinchEnd: "GesturePinchEnd",
|
| - PinchUpdate: "GesturePinchUpdate",
|
| - ScrollBegin: "GestureScrollBegin",
|
| - ScrollEnd: "GestureScrollEnd",
|
| - ScrollUpdate: "GestureScrollUpdate",
|
| - ScrollUpdateRenderer: "ScrollUpdate",
|
| - ShowPress: "GestureShowPress",
|
| - Tap: "GestureTap",
|
| - TapCancel: "GestureTapCancel",
|
| - TapDown: "GestureTapDown",
|
| - TouchCancel: "TouchCancel",
|
| - TouchEnd: "TouchEnd",
|
| - TouchMove: "TouchMove",
|
| - TouchStart: "TouchStart"
|
| + Char: 'Char',
|
| + Click: 'GestureClick',
|
| + ContextMenu: 'ContextMenu',
|
| + FlingCancel: 'GestureFlingCancel',
|
| + FlingStart: 'GestureFlingStart',
|
| + ImplSideFling: WebInspector.TimelineModel.RecordType.ImplSideFling,
|
| + KeyDown: 'KeyDown',
|
| + KeyDownRaw: 'RawKeyDown',
|
| + KeyUp: 'KeyUp',
|
| + LatencyScrollUpdate: 'ScrollUpdate',
|
| + MouseDown: 'MouseDown',
|
| + MouseMove: 'MouseMove',
|
| + MouseUp: 'MouseUp',
|
| + MouseWheel: 'MouseWheel',
|
| + PinchBegin: 'GesturePinchBegin',
|
| + PinchEnd: 'GesturePinchEnd',
|
| + PinchUpdate: 'GesturePinchUpdate',
|
| + ScrollBegin: 'GestureScrollBegin',
|
| + ScrollEnd: 'GestureScrollEnd',
|
| + ScrollUpdate: 'GestureScrollUpdate',
|
| + ScrollUpdateRenderer: 'ScrollUpdate',
|
| + ShowPress: 'GestureShowPress',
|
| + Tap: 'GestureTap',
|
| + TapCancel: 'GestureTapCancel',
|
| + TapDown: 'GestureTapDown',
|
| + TouchCancel: 'TouchCancel',
|
| + TouchEnd: 'TouchEnd',
|
| + TouchMove: 'TouchMove',
|
| + TouchStart: 'TouchStart'
|
| };
|
|
|
| WebInspector.TimelineIRModel._mergeThresholdsMs = {
|
| - animation: 1,
|
| - mouse: 40,
|
| + animation: 1,
|
| + mouse: 40,
|
| };
|
|
|
| -WebInspector.TimelineIRModel._eventIRPhase = Symbol("eventIRPhase");
|
| -
|
| -/**
|
| - * @param {!WebInspector.TracingModel.Event} event
|
| - * @return {!WebInspector.TimelineIRModel.Phases}
|
| - */
|
| -WebInspector.TimelineIRModel.phaseForEvent = function(event)
|
| -{
|
| - return event[WebInspector.TimelineIRModel._eventIRPhase];
|
| -};
|
| -
|
| -WebInspector.TimelineIRModel.prototype = {
|
| - /**
|
| - * @param {?Array<!WebInspector.TracingModel.AsyncEvent>} inputLatencies
|
| - * @param {?Array<!WebInspector.TracingModel.AsyncEvent>} animations
|
| - */
|
| - populate: function(inputLatencies, animations)
|
| - {
|
| - var eventTypes = WebInspector.TimelineIRModel.InputEvents;
|
| - var phases = WebInspector.TimelineIRModel.Phases;
|
| -
|
| - this.reset();
|
| - if (!inputLatencies)
|
| - return;
|
| - this._processInputLatencies(inputLatencies);
|
| - if (animations)
|
| - this._processAnimations(animations);
|
| - var range = new WebInspector.SegmentedRange();
|
| - range.appendRange(this._drags); // Drags take lower precedence than animation, as we can't detect them reliably.
|
| - range.appendRange(this._cssAnimations);
|
| - range.appendRange(this._scrolls);
|
| - range.appendRange(this._responses);
|
| - this._segments = range.segments();
|
| - },
|
| -
|
| - /**
|
| - * @param {!Array<!WebInspector.TracingModel.AsyncEvent>} events
|
| - */
|
| - _processInputLatencies: function(events)
|
| - {
|
| - var eventTypes = WebInspector.TimelineIRModel.InputEvents;
|
| - var phases = WebInspector.TimelineIRModel.Phases;
|
| - var thresholdsMs = WebInspector.TimelineIRModel._mergeThresholdsMs;
|
| -
|
| - var scrollStart;
|
| - var flingStart;
|
| - var touchStart;
|
| - var firstTouchMove;
|
| - var mouseWheel;
|
| - var mouseDown;
|
| - var mouseMove;
|
| -
|
| - for (var i = 0; i < events.length; ++i) {
|
| - var event = events[i];
|
| - if (i > 0 && events[i].startTime < events[i - 1].startTime)
|
| - console.assert(false, "Unordered input events");
|
| - var type = this._inputEventType(event.name);
|
| - switch (type) {
|
| -
|
| - case eventTypes.ScrollBegin:
|
| - this._scrolls.append(this._segmentForEvent(event, phases.Scroll));
|
| - scrollStart = event;
|
| - break;
|
| -
|
| - case eventTypes.ScrollEnd:
|
| - if (scrollStart)
|
| - this._scrolls.append(this._segmentForEventRange(scrollStart, event, phases.Scroll));
|
| - else
|
| - this._scrolls.append(this._segmentForEvent(event, phases.Scroll));
|
| - scrollStart = null;
|
| - break;
|
| -
|
| - case eventTypes.ScrollUpdate:
|
| - touchStart = null; // Since we're scrolling now, disregard other touch gestures.
|
| - this._scrolls.append(this._segmentForEvent(event, phases.Scroll));
|
| - break;
|
| -
|
| - case eventTypes.FlingStart:
|
| - if (flingStart) {
|
| - WebInspector.console.error(WebInspector.UIString("Two flings at the same time? %s vs %s", flingStart.startTime, event.startTime));
|
| - break;
|
| - }
|
| - flingStart = event;
|
| - break;
|
| -
|
| - case eventTypes.FlingCancel:
|
| - // FIXME: also process renderer fling events.
|
| - if (!flingStart)
|
| - break;
|
| - this._scrolls.append(this._segmentForEventRange(flingStart, event, phases.Fling));
|
| - flingStart = null;
|
| - break;
|
| -
|
| - case eventTypes.ImplSideFling:
|
| - this._scrolls.append(this._segmentForEvent(event, phases.Fling));
|
| - break;
|
| -
|
| - case eventTypes.ShowPress:
|
| - case eventTypes.Tap:
|
| - case eventTypes.KeyDown:
|
| - case eventTypes.KeyDownRaw:
|
| - case eventTypes.KeyUp:
|
| - case eventTypes.Char:
|
| - case eventTypes.Click:
|
| - case eventTypes.ContextMenu:
|
| - this._responses.append(this._segmentForEvent(event, phases.Response));
|
| - break;
|
| -
|
| - case eventTypes.TouchStart:
|
| - // We do not produce any response segment for TouchStart -- there's either going to be one upon
|
| - // TouchMove for drag, or one for GestureTap.
|
| - if (touchStart) {
|
| - WebInspector.console.error(WebInspector.UIString("Two touches at the same time? %s vs %s", touchStart.startTime, event.startTime));
|
| - break;
|
| - }
|
| - touchStart = event;
|
| - event.steps[0][WebInspector.TimelineIRModel._eventIRPhase] = phases.Response;
|
| - firstTouchMove = null;
|
| - break;
|
| -
|
| - case eventTypes.TouchCancel:
|
| - touchStart = null;
|
| - break;
|
| -
|
| - case eventTypes.TouchMove:
|
| - if (firstTouchMove) {
|
| - this._drags.append(this._segmentForEvent(event, phases.Drag));
|
| - } else if (touchStart) {
|
| - firstTouchMove = event;
|
| - this._responses.append(this._segmentForEventRange(touchStart, event, phases.Response));
|
| - }
|
| - break;
|
| -
|
| - case eventTypes.TouchEnd:
|
| - touchStart = null;
|
| - break;
|
| -
|
| - case eventTypes.MouseDown:
|
| - mouseDown = event;
|
| - mouseMove = null;
|
| - break;
|
| -
|
| - case eventTypes.MouseMove:
|
| - if (mouseDown && !mouseMove && mouseDown.startTime + thresholdsMs.mouse > event.startTime) {
|
| - this._responses.append(this._segmentForEvent(mouseDown, phases.Response));
|
| - this._responses.append(this._segmentForEvent(event, phases.Response));
|
| - } else if (mouseDown) {
|
| - this._drags.append(this._segmentForEvent(event, phases.Drag));
|
| - }
|
| - mouseMove = event;
|
| - break;
|
| -
|
| - case eventTypes.MouseUp:
|
| - this._responses.append(this._segmentForEvent(event, phases.Response));
|
| - mouseDown = null;
|
| - break;
|
| -
|
| - case eventTypes.MouseWheel:
|
| - // Do not consider first MouseWheel as trace viewer's implementation does -- in case of MouseWheel it's not really special.
|
| - if (mouseWheel && canMerge(thresholdsMs.mouse, mouseWheel, event))
|
| - this._scrolls.append(this._segmentForEventRange(mouseWheel, event, phases.Scroll));
|
| - else
|
| - this._scrolls.append(this._segmentForEvent(event, phases.Scroll));
|
| - mouseWheel = event;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * @param {number} threshold
|
| - * @param {!WebInspector.TracingModel.AsyncEvent} first
|
| - * @param {!WebInspector.TracingModel.AsyncEvent} second
|
| - * @return {boolean}
|
| - */
|
| - function canMerge(threshold, first, second)
|
| - {
|
| - return first.endTime < second.startTime && second.startTime < first.endTime + threshold;
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!Array<!WebInspector.TracingModel.AsyncEvent>} events
|
| - */
|
| - _processAnimations: function(events)
|
| - {
|
| - for (var i = 0; i < events.length; ++i)
|
| - this._cssAnimations.append(this._segmentForEvent(events[i], WebInspector.TimelineIRModel.Phases.Animation));
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.TracingModel.AsyncEvent} event
|
| - * @param {!WebInspector.TimelineIRModel.Phases} phase
|
| - * @return {!WebInspector.Segment}
|
| - */
|
| - _segmentForEvent: function(event, phase)
|
| - {
|
| - this._setPhaseForEvent(event, phase);
|
| - return new WebInspector.Segment(event.startTime, event.endTime, phase);
|
| - },
|
| +WebInspector.TimelineIRModel._eventIRPhase = Symbol('eventIRPhase');
|
|
|
| - /**
|
| - * @param {!WebInspector.TracingModel.AsyncEvent} startEvent
|
| - * @param {!WebInspector.TracingModel.AsyncEvent} endEvent
|
| - * @param {!WebInspector.TimelineIRModel.Phases} phase
|
| - * @return {!WebInspector.Segment}
|
| - */
|
| - _segmentForEventRange: function(startEvent, endEvent, phase)
|
| - {
|
| - this._setPhaseForEvent(startEvent, phase);
|
| - this._setPhaseForEvent(endEvent, phase);
|
| - return new WebInspector.Segment(startEvent.startTime, endEvent.endTime, phase);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.TracingModel.AsyncEvent} asyncEvent
|
| - * @param {!WebInspector.TimelineIRModel.Phases} phase
|
| - */
|
| - _setPhaseForEvent: function(asyncEvent, phase)
|
| - {
|
| - asyncEvent.steps[0][WebInspector.TimelineIRModel._eventIRPhase] = phase;
|
| - },
|
| -
|
| - /**
|
| - * @return {!Array<!WebInspector.Segment>}
|
| - */
|
| - interactionRecords: function()
|
| - {
|
| - return this._segments;
|
| - },
|
| -
|
| - reset: function()
|
| - {
|
| - var thresholdsMs = WebInspector.TimelineIRModel._mergeThresholdsMs;
|
| -
|
| - this._segments = [];
|
| - this._drags = new WebInspector.SegmentedRange(merge.bind(null, thresholdsMs.mouse));
|
| - this._cssAnimations = new WebInspector.SegmentedRange(merge.bind(null, thresholdsMs.animation));
|
| - this._responses = new WebInspector.SegmentedRange(merge.bind(null, 0));
|
| - this._scrolls = new WebInspector.SegmentedRange(merge.bind(null, thresholdsMs.animation));
|
| -
|
| - /**
|
| - * @param {number} threshold
|
| - * @param {!WebInspector.Segment} first
|
| - * @param {!WebInspector.Segment} second
|
| - */
|
| - function merge(threshold, first, second)
|
| - {
|
| - return first.end + threshold >= second.begin && first.data === second.data ? first : null;
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {string} eventName
|
| - * @return {?WebInspector.TimelineIRModel.InputEvents}
|
| - */
|
| - _inputEventType: function(eventName)
|
| - {
|
| - var prefix = "InputLatency::";
|
| - if (!eventName.startsWith(prefix)) {
|
| - if (eventName === WebInspector.TimelineIRModel.InputEvents.ImplSideFling)
|
| - return /** @type {!WebInspector.TimelineIRModel.InputEvents} */ (eventName);
|
| - console.error("Unrecognized input latency event: " + eventName);
|
| - return null;
|
| - }
|
| - return /** @type {!WebInspector.TimelineIRModel.InputEvents} */ (eventName.substr(prefix.length));
|
| - }
|
| -};
|
|
|
|
|