1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4 from measurements
import smooth_gesture_util
6 from telemetry
.core
.platform
import tracing_category_filter
7 from telemetry
.core
.platform
import tracing_options
8 from telemetry
.timeline
.model
import TimelineModel
9 from telemetry
.page
.actions
import action_runner
10 from telemetry
.web_perf
import timeline_interaction_record
as tir_module
13 RUN_SMOOTH_ACTIONS
= 'RunSmoothAllActions'
16 class TimelineController(object):
18 super(TimelineController
, self
).__init
__()
19 self
.trace_categories
= None
21 self
._renderer
_process
= None
22 self
._smooth
_records
= []
23 self
._interaction
= None
25 def SetUp(self
, page
, tab
):
26 """Starts gathering timeline data.
29 # Resets these member variables incase this object is reused.
31 self
._renderer
_process
= None
32 if not tab
.browser
.platform
.tracing_controller
.IsChromeTracingSupported(
34 raise Exception('Not supported')
35 category_filter
= tracing_category_filter
.TracingCategoryFilter(
36 filter_string
=self
.trace_categories
)
37 for delay
in page
.GetSyntheticDelayCategories():
38 category_filter
.AddSyntheticDelay(delay
)
39 options
= tracing_options
.TracingOptions()
40 options
.enable_chrome_trace
= True
41 tab
.browser
.platform
.tracing_controller
.Start(options
, category_filter
)
44 # Start the smooth marker for all actions.
45 runner
= action_runner
.ActionRunner(tab
)
46 self
._interaction
= runner
.BeginInteraction(
47 RUN_SMOOTH_ACTIONS
, is_smooth
=True)
50 # End the smooth marker for all actions.
51 self
._interaction
.End()
53 timeline_data
= tab
.browser
.platform
.tracing_controller
.Stop()
54 self
._model
= TimelineModel(timeline_data
)
55 self
._renderer
_process
= self
._model
.GetRendererProcessFromTabId(tab
.id)
56 renderer_thread
= self
.model
.GetRendererThreadFromTabId(tab
.id)
58 run_smooth_actions_record
= None
59 self
._smooth
_records
= []
60 for event
in renderer_thread
.async_slices
:
61 if not tir_module
.IsTimelineInteractionRecord(event
.name
):
63 r
= tir_module
.TimelineInteractionRecord
.FromAsyncEvent(event
)
64 if r
.label
== RUN_SMOOTH_ACTIONS
:
65 assert run_smooth_actions_record
is None, (
66 'TimelineController cannot issue more than 1 %s record' %
68 run_smooth_actions_record
= r
70 self
._smooth
_records
.append(
71 smooth_gesture_util
.GetAdjustedInteractionIfContainGesture(
74 # If there is no other smooth records, we make measurements on time range
75 # marked by timeline_controller itself.
76 # TODO(nednguyen): when crbug.com/239179 is marked fixed, makes sure that
77 # page sets are responsible for issueing the markers themselves.
78 if len(self
._smooth
_records
) == 0 and run_smooth_actions_record
:
79 self
._smooth
_records
= [run_smooth_actions_record
]
82 def CleanUp(self
, tab
):
83 if tab
.browser
.platform
.tracing_controller
.is_tracing_running
:
84 tab
.browser
.platform
.tracing_controller
.Stop()
91 def renderer_process(self
):
92 return self
._renderer
_process
95 def smooth_records(self
):
96 return self
._smooth
_records