| Index: tools/perf/metrics/timeline_interaction_record.py
|
| diff --git a/tools/perf/metrics/timeline_interaction_record.py b/tools/perf/metrics/timeline_interaction_record.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..87d575de8beaa9b6d0362c35c807a9e1309b865d
|
| --- /dev/null
|
| +++ b/tools/perf/metrics/timeline_interaction_record.py
|
| @@ -0,0 +1,74 @@
|
| +# Copyright 2014 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.
|
| +
|
| +import re
|
| +
|
| +
|
| +def IsTimelineInteractionRecord(event_name):
|
| + return event_name.startswith('Interaction.')
|
| +
|
| +
|
| +class TimelineInteractionRecord(object):
|
| + """Represents an interaction that took place during a timeline recording.
|
| +
|
| + As a page runs, typically a number of different (simulated) user interactions
|
| + take place. For instance, a user might click a button in a mail app causing a
|
| + popup to animate in. Then they might press another button that sends data to a
|
| + server and simultaneously closes the popup without an animation. These are two
|
| + interactions.
|
| +
|
| + From the point of view of the page, each interaction might have a different
|
| + logical name: ClickComposeButton and SendEmail, for instance. From the point
|
| + of view of the benchmarking harness, the names aren't so interesting as what
|
| + the performance expectations are for that interaction: was it loading
|
| + resources from the network? was there an animation?
|
| +
|
| + Determining these things is hard to do, simply by observing the state given to
|
| + a page from javascript. There are hints, for instance if network requests are
|
| + sent, or if a CSS animation is pending. But this is by no means a complete
|
| + story.
|
| +
|
| + Instead, we expect pages to mark up the timeline what they are doing, with
|
| + logical names, and flags indicating the semantics of that interaction. This
|
| + is currently done by pushing markers into the console.time/timeEnd API: this
|
| + for instance can be issued in JS:
|
| +
|
| + var str = 'Interaction.SendEmail/is_smooth,is_loading_resources';
|
| + console.time(str);
|
| + setTimeout(function() {
|
| + console.timeEnd(str);
|
| + }, 1000);
|
| +
|
| + When run with perf.measurements.timeline_based_measurement running, this will
|
| + then cause a TimelineInteractionRecord to be created for this range and both
|
| + smoothness and network metrics to be reported for the marked up 1000ms
|
| + time-range.
|
| +
|
| + """
|
| + def __init__(self, event):
|
| + self.start = event.start
|
| + self.end = event.end
|
| +
|
| + m = re.match('Interaction\.(.+)\/(.+)', event.name)
|
| + if m:
|
| + self.logical_name = m.group(1)
|
| + if m.group(1) != '':
|
| + flags = m.group(2).split(',')
|
| + else:
|
| + flags = []
|
| + else:
|
| + m = re.match('Interaction\.(.+)', event.name)
|
| + assert m
|
| + self.logical_name = m.group(1)
|
| + flags = []
|
| +
|
| + for f in flags:
|
| + if not f in ('is_smooth', 'is_loading_resources'):
|
| + raise Exception(
|
| + 'Unrecognized flag in timeline Interaction record: %s' % f)
|
| + self.is_smooth = 'is_smooth' in flags
|
| + self.is_loading_resources = 'is_loading_resources' in flags
|
| +
|
| + def GetResultNameFor(self, result_name):
|
| + return "%s/%s" % (self.logical_name, result_name)
|
|
|