OLD | NEW |
1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 from operator import attrgetter | 5 from operator import attrgetter |
6 | 6 |
7 # These are LatencyInfo component names indicating the various components | 7 # These are LatencyInfo component names indicating the various components |
8 # that the input event has travelled through. | 8 # that the input event has travelled through. |
9 # This is when the input event first reaches chrome. | 9 # This is when the input event first reaches chrome. |
10 UI_COMP_NAME = 'INPUT_EVENT_LATENCY_UI_COMPONENT' | 10 UI_COMP_NAME = 'INPUT_EVENT_LATENCY_UI_COMPONENT' |
11 # This is when the input event was originally created by OS. | 11 # This is when the input event was originally created by OS. |
12 ORIGINAL_COMP_NAME = 'INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT' | 12 ORIGINAL_COMP_NAME = 'INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT' |
13 # This is when the input event was sent from browser to renderer. | 13 # This is when the input event was sent from browser to renderer. |
14 BEGIN_COMP_NAME = 'INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT' | 14 BEGIN_COMP_NAME = 'INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT' |
15 # This is when the input event has reached swap buffer. | 15 # This is when the input event has reached swap buffer. |
16 END_COMP_NAME = 'INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT' | 16 END_COMP_NAME = 'INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT' |
17 | 17 |
18 def GetScrollInputLatencyEvents(browser_process, timeline_range): | 18 def GetScrollInputLatencyEvents(browser_process, timeline_range): |
19 """Get scroll events' LatencyInfo from the browser process's trace buffer | 19 """Get scroll events' LatencyInfo from the browser process's trace buffer |
20 that are within the timeline_range. | 20 that are within the timeline_range. |
21 | 21 |
22 Scroll events (MouseWheel or GestureScrollUpdate) dump their LatencyInfo | 22 Scroll events (MouseWheel, GestureScrollUpdate or JS scroll on TouchMove) |
23 into trace buffer as async trace event with name "InputLatency". The trace | 23 dump their LatencyInfo into trace buffer as async trace event with name |
24 event has a memeber 'step' containing its event type and a memeber 'data' | 24 "InputLatency". The trace event has a memeber 'step' containing its event |
25 containing its latency history. | 25 type and a memeber 'data' containing its latency history. |
26 | 26 |
27 """ | 27 """ |
28 mouse_wheel_events = [] | 28 mouse_wheel_events = [] |
29 touch_scroll_events = [] | 29 touch_scroll_events = [] |
30 if not browser_process: | 30 if not browser_process: |
31 return (mouse_wheel_events, touch_scroll_events) | 31 return (mouse_wheel_events, touch_scroll_events) |
32 for event in browser_process.IterAllAsyncSlicesOfName("InputLatency"): | 32 for event in browser_process.IterAllAsyncSlicesOfName("InputLatency"): |
33 if event.start >= timeline_range.min and event.end <= timeline_range.max: | 33 if event.start >= timeline_range.min and event.end <= timeline_range.max: |
34 for ss in event.sub_slices: | 34 for ss in event.sub_slices: |
35 if 'step' not in ss.args: | 35 if 'step' not in ss.args: |
36 continue | 36 continue |
37 if 'data' not in ss.args: | 37 if 'data' not in ss.args: |
38 continue | 38 continue |
39 if ss.args['step'] == 'MouseWheel': | 39 if ss.args['step'] == 'MouseWheel': |
40 mouse_wheel_events.append(ss) | 40 mouse_wheel_events.append(ss) |
41 elif ss.args['step'] == 'GestureScrollUpdate': | 41 elif ss.args['step'] == 'GestureScrollUpdate': |
42 touch_scroll_events.append(ss) | 42 touch_scroll_events.append(ss) |
| 43 elif ss.args['step'] == 'TouchMove': |
| 44 touch_scroll_events.append(ss) |
43 return (mouse_wheel_events, touch_scroll_events) | 45 return (mouse_wheel_events, touch_scroll_events) |
44 | 46 |
45 def ComputeMouseWheelScrollLatency(mouse_wheel_events): | 47 def ComputeMouseWheelScrollLatency(mouse_wheel_events): |
46 """ Compute the mouse wheel scroll latency. | 48 """ Compute the mouse wheel scroll latency. |
47 | 49 |
48 Mouse wheel scroll latency is the time from when mouse wheel event is sent | 50 Mouse wheel scroll latency is the time from when mouse wheel event is sent |
49 from browser RWH to renderer (the timestamp of component | 51 from browser RWH to renderer (the timestamp of component |
50 'INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT') to when the scrolled page is | 52 'INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT') to when the scrolled page is |
51 buffer swapped (the timestamp of component | 53 buffer swapped (the timestamp of component |
52 'INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT') | 54 'INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT') |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 self.frame_timestamps[-1].append( | 193 self.frame_timestamps[-1].append( |
192 event.start) | 194 event.start) |
193 if not first_frame: | 195 if not first_frame: |
194 self.frame_times[-1].append(round(self.frame_timestamps[-1][-1] - | 196 self.frame_times[-1].append(round(self.frame_timestamps[-1][-1] - |
195 self.frame_timestamps[-1][-2], 2)) | 197 self.frame_timestamps[-1][-2], 2)) |
196 first_frame = False | 198 first_frame = False |
197 self.rasterize_times[-1].append(1000.0 * | 199 self.rasterize_times[-1].append(1000.0 * |
198 event.args['data']['rasterize_time']) | 200 event.args['data']['rasterize_time']) |
199 self.rasterized_pixel_counts[-1].append( | 201 self.rasterized_pixel_counts[-1].append( |
200 event.args['data']['rasterized_pixel_count']) | 202 event.args['data']['rasterized_pixel_count']) |
OLD | NEW |