| Index: tracing/tracing/importer/find_load_expectations.html
|
| diff --git a/tracing/tracing/importer/find_load_expectations.html b/tracing/tracing/importer/find_load_expectations.html
|
| index 5a20648834f6e218ada4254bc25dbbefadc88337..490a6fb9eac7af75947a55346a85189742e6d9de 100644
|
| --- a/tracing/tracing/importer/find_load_expectations.html
|
| +++ b/tracing/tracing/importer/find_load_expectations.html
|
| @@ -5,51 +5,112 @@ Use of this source code is governed by a BSD-style license that can be
|
| found in the LICENSE file.
|
| -->
|
|
|
| +<link rel="import" href="/tracing/base/category_util.html">
|
| <link rel="import" href="/tracing/model/user_model/load_expectation.html">
|
|
|
| <script>
|
| 'use strict';
|
|
|
| tr.exportTo('tr.importer', function() {
|
| - // This global instant event marks the start of a navigation.
|
| - var NAVIGATION_START = 'NavigationTiming navigationStart';
|
| -
|
| - // This render-process instant event marks the first contentful paint in a
|
| - // main frame.
|
| - var FIRST_CONTENTFUL_PAINT_TITLE = 'firstContentfulPaint';
|
| -
|
| - function findLoadExpectations(modelHelper) {
|
| - var events = [];
|
| + /**
|
| + * Find all events that might be interesting for loading metrics.
|
| + * Don't worry about grouping or sorting them yet.
|
| + *
|
| + * @param {!tr.model.helpers.ChromeModelHelper} modelHelper
|
| + * @return {tr.model.EventSet}
|
| + */
|
| + function findLoadEvents(modelHelper) {
|
| + var events = new tr.model.EventSet();
|
| modelHelper.model.iterateAllEvents(function(event) {
|
| - if ((event.title === NAVIGATION_START) ||
|
| - (event.title === FIRST_CONTENTFUL_PAINT_TITLE))
|
| + if (tr.model.um.LoadEvents.isLoadEvent(event))
|
| events.push(event);
|
| });
|
| - events.sort(tr.importer.compareEvents);
|
| + return events;
|
| + }
|
| +
|
| + /**
|
| + * Find the RenderFrame id for an event.
|
| + *
|
| + * @param {!tr.model.Event} event
|
| + * @return {number}
|
| + */
|
| + function findFrameId(event) {
|
| + var renderFrameSnapshot =
|
| + tr.model.um.LoadEvents.findRenderFrameSnapshotForEvent(event);
|
| + if (renderFrameSnapshot)
|
| + return renderFrameSnapshot.objectInstance.scopedId;
|
| + return undefined;
|
| + }
|
| +
|
| + /**
|
| + * @param {!tr.model.EventSet} events
|
| + * @return {tr.model.um.LoadExpectation}
|
| + */
|
| + function createLoadExpectation(model, events) {
|
| + var subtypeName = tr.model.um.LOAD_SUBTYPE_NAMES.SUCCESSFUL;
|
| + var start = Number.MAX_VALUE;
|
| + var end = -Number.MAX_VALUE;
|
|
|
| - var loads = [];
|
| - var startEvent = undefined;
|
| events.forEach(function(event) {
|
| - if (event.title === NAVIGATION_START) {
|
| - startEvent = event;
|
| - } else if (event.title === FIRST_CONTENTFUL_PAINT_TITLE) {
|
| - if (startEvent) {
|
| - loads.push(new tr.model.um.LoadExpectation(
|
| - modelHelper.model, tr.model.um.LOAD_SUBTYPE_NAMES.SUCCESSFUL,
|
| - startEvent.start, event.start - startEvent.start));
|
| - startEvent = undefined;
|
| - }
|
| - }
|
| + if (tr.model.um.LoadEvents.isStartEvent(event))
|
| + start = Math.min(start, event.start);
|
| +
|
| + if (tr.model.um.LoadEvents.isEndEvent(event))
|
| + end = Math.max(end, event.end);
|
| +
|
| + if (tr.model.um.LoadEvents.isFailEvent(event))
|
| + subtypeName = tr.model.um.LOAD_SUBTYPE_NAMES.FAILED;
|
| });
|
|
|
| - // If the trace ended between navigation start and first contentful paint,
|
| - // then make a LoadExpectation that ends at the end of the trace.
|
| - if (startEvent) {
|
| - loads.push(new tr.model.um.LoadExpectation(
|
| - modelHelper.model, tr.model.um.LOAD_SUBTYPE_NAMES.SUCCESSFUL,
|
| - startEvent.start, modelHelper.model.bounds.max - startEvent.start));
|
| - }
|
| + if (start === Number.MAX_VALUE)
|
| + throw new Error('Unable to find Load start event');
|
| +
|
| + if (end === Number.MAX_VALUE)
|
| + end = model.bounds.max;
|
| +
|
| + var load = new tr.model.um.LoadExpectation(
|
| + model, subtypeName, start, end - start);
|
| + load.associatedEvents.addEventSet(events);
|
| + load.sourceEvents.addEventSet(events);
|
| +
|
| + return load;
|
| + }
|
| +
|
| + /**
|
| + * @param {!tr.model.helpers.ChromeModelHelper} modelHelper
|
| + * @return {Array.<LoadExpectation>}
|
| + */
|
| + function findLoadExpectations(modelHelper) {
|
| + var events = findLoadEvents(modelHelper);
|
| + var eventsByFrame = events.getEventsOrganizedByCallback(findFrameId);
|
| + var loads = [];
|
| +
|
| + tr.b.iterItems(eventsByFrame, function(frameId, frameEvents) {
|
| + frameEvents = frameEvents.toArray().sort(tr.importer.compareEvents);
|
| +
|
| + var currentLoadEvents = new tr.model.EventSet();
|
| + var foundEndEvent = false;
|
| +
|
| + frameEvents.forEach(function(event) {
|
| + if (tr.model.um.LoadEvents.isStartEvent(event)) {
|
| + if ((currentLoadEvents.length > 0) &&
|
| + foundEndEvent) {
|
| + loads.push(createLoadExpectation(
|
| + modelHelper.model, currentLoadEvents));
|
| + currentLoadEvents = new tr.model.EventSet();
|
| + foundEndEvent = false;
|
| + }
|
| + } else if (tr.model.um.LoadEvents.isEndEvent(event)) {
|
| + foundEndEvent = true;
|
| + }
|
| + currentLoadEvents.push(event);
|
| + });
|
| +
|
| + if (currentLoadEvents.length > 0)
|
| + loads.push(createLoadExpectation(modelHelper.model, currentLoadEvents));
|
| + });
|
|
|
| + loads.sort(tr.importer.compareEvents);
|
| return loads;
|
| }
|
|
|
|
|