Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(186)

Unified Diff: tracing/tracing/importer/find_load_expectations.html

Issue 2020813002: Rewrite LoadExpectation to v1.0. (Closed) Base URL: https://github.com/catapult-project/catapult.git@master
Patch Set: . Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tracing/tracing/extras/importer/trace_event_importer.html ('k') | tracing/tracing/model/instant_event.html » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
« no previous file with comments | « tracing/tracing/extras/importer/trace_event_importer.html ('k') | tracing/tracing/model/instant_event.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698