OLD | NEW |
| (Empty) |
1 #!/usr/bin/env python | |
2 # Copyright 2014 The Chromium Authors. All rights reserved. | |
3 # Use of this source code is governed by a BSD-style license that can be | |
4 # found in the LICENSE file. | |
5 | |
6 import collections | |
7 import json | |
8 import os | |
9 import sys | |
10 | |
11 sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir)) | |
12 from telemetry.page import page as page_module | |
13 from telemetry.results import buildbot_output_formatter | |
14 from telemetry.results import page_test_results | |
15 from telemetry.timeline import model | |
16 from telemetry.timeline import tracing_timeline_data | |
17 from telemetry.web_perf.metrics import smoothness | |
18 from telemetry.web_perf import timeline_interaction_record as tir_module | |
19 | |
20 sys.path.append(os.path.join( | |
21 os.path.dirname(__file__), os.pardir, os.pardir, 'perf')) | |
22 # pylint: disable=F0401 | |
23 from measurements import smooth_gesture_util | |
24 from measurements import smoothness_controller | |
25 | |
26 | |
27 def _ExtractInteractionsRecordFromThread(thread, timeline_model): | |
28 run_smooth_actions_record = None | |
29 records = [] | |
30 for event in thread.async_slices: | |
31 if not tir_module.IsTimelineInteractionRecord(event.name): | |
32 continue | |
33 assert event.start_thread | |
34 assert event.start_thread is event.end_thread | |
35 r = smooth_gesture_util.GetAdjustedInteractionIfContainGesture( | |
36 timeline_model, | |
37 tir_module.TimelineInteractionRecord.FromAsyncEvent(event)) | |
38 if r.label == smoothness_controller.RUN_SMOOTH_ACTIONS: | |
39 assert run_smooth_actions_record is None, ( | |
40 'There can\'t be more than 1 %s record' % | |
41 smoothness_controller.RUN_SMOOTH_ACTIONS) | |
42 run_smooth_actions_record = r | |
43 else: | |
44 records.append(r) | |
45 if not records: | |
46 # Only include run_smooth_actions_record (label = | |
47 # smoothness_controller.RUN_SMOOTH_ACTIONS) if there is no other records | |
48 records = [run_smooth_actions_record] | |
49 return records | |
50 | |
51 | |
52 def Main(args): | |
53 if len(args) is not 1: | |
54 print 'Invalid arguments. Usage: measure_trace.py <trace file>' | |
55 return 1 | |
56 with open(args[0]) as trace_file: | |
57 trace_data = tracing_timeline_data.TracingTimelineData( | |
58 json.load(trace_file)) | |
59 | |
60 timeline_model = model.TimelineModel(trace_data) | |
61 smoothness_metric = smoothness.SmoothnessMetric() | |
62 formatters = [ | |
63 buildbot_output_formatter.BuildbotOutputFormatter(sys.stdout) | |
64 ] | |
65 results = page_test_results.PageTestResults(output_formatters=formatters) | |
66 for thread in timeline_model.GetAllThreads(): | |
67 interaction_records = _ExtractInteractionsRecordFromThread( | |
68 thread, timeline_model) | |
69 if not any(interaction_records): | |
70 continue | |
71 records_label_to_records_map = collections.defaultdict(list) | |
72 for r in interaction_records: | |
73 records_label_to_records_map[r.label].append(r) | |
74 for label, records in records_label_to_records_map.iteritems(): | |
75 if records[0].is_smooth: | |
76 page = page_module.Page('interaction-record://%s' % label) | |
77 results.WillRunPage(page) | |
78 smoothness_metric.AddResults( | |
79 timeline_model, thread, records, results) | |
80 results.DidRunPage(page) | |
81 results.PrintSummary() | |
82 return 0 | |
83 | |
84 | |
85 if __name__ == '__main__': | |
86 sys.exit(Main(sys.argv[1:])) | |
OLD | NEW |