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 import random | 5 import random |
6 import unittest | 6 import unittest |
7 | 7 |
8 from metrics.rendering_stats import UI_COMP_NAME, BEGIN_COMP_NAME, END_COMP_NAME | 8 from metrics.rendering_stats import UI_COMP_NAME, BEGIN_COMP_NAME, END_COMP_NAME |
9 from metrics.rendering_stats import GetScrollInputLatencyEvents | 9 from metrics.rendering_stats import GetScrollInputLatencyEvents |
10 from metrics.rendering_stats import ComputeMouseWheelScrollLatency | 10 from metrics.rendering_stats import ComputeMouseWheelScrollLatency |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 self.record_times.append([]) | 54 self.record_times.append([]) |
55 self.recorded_pixel_counts.append([]) | 55 self.recorded_pixel_counts.append([]) |
56 self.rasterize_times.append([]) | 56 self.rasterize_times.append([]) |
57 self.rasterized_pixel_counts.append([]) | 57 self.rasterized_pixel_counts.append([]) |
58 | 58 |
59 class ReferenceInputLatencyStats(object): | 59 class ReferenceInputLatencyStats(object): |
60 """ Stores expected data for comparison with actual input latency stats """ | 60 """ Stores expected data for comparison with actual input latency stats """ |
61 def __init__(self): | 61 def __init__(self): |
62 self.mouse_wheel_scroll_latency = [] | 62 self.mouse_wheel_scroll_latency = [] |
63 self.touch_scroll_latency = [] | 63 self.touch_scroll_latency = [] |
| 64 self.js_touch_scroll_latency = [] |
64 self.mouse_wheel_scroll_events = [] | 65 self.mouse_wheel_scroll_events = [] |
65 self.touch_scroll_events = [] | 66 self.touch_scroll_events = [] |
| 67 self.js_touch_scroll_events = [] |
66 | 68 |
67 def AddMainThreadRenderingStats(mock_timer, thread, first_frame, | 69 def AddMainThreadRenderingStats(mock_timer, thread, first_frame, |
68 ref_stats = None): | 70 ref_stats = None): |
69 """ Adds a random main thread rendering stats event. | 71 """ Adds a random main thread rendering stats event. |
70 | 72 |
71 thread: The timeline model thread to which the event will be added. | 73 thread: The timeline model thread to which the event will be added. |
72 first_frame: Is this the first frame within the bounds of an action? | 74 first_frame: Is this the first frame within the bounds of an action? |
73 ref_stats: A ReferenceRenderingStats object to record expected values. | 75 ref_stats: A ReferenceRenderingStats object to record expected values. |
74 """ | 76 """ |
75 # Create randonm data and timestap for main thread rendering stats. | 77 # Create randonm data and timestap for main thread rendering stats. |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 start_thread.AddAsyncSlice(async_slice) | 181 start_thread.AddAsyncSlice(async_slice) |
180 | 182 |
181 if not ref_latency_stats: | 183 if not ref_latency_stats: |
182 return | 184 return |
183 | 185 |
184 if input_type == 'MouseWheel': | 186 if input_type == 'MouseWheel': |
185 ref_latency_stats.mouse_wheel_scroll_events.append(async_sub_slice) | 187 ref_latency_stats.mouse_wheel_scroll_events.append(async_sub_slice) |
186 ref_latency_stats.mouse_wheel_scroll_latency.append( | 188 ref_latency_stats.mouse_wheel_scroll_latency.append( |
187 (data[END_COMP_NAME]['time'] - data[BEGIN_COMP_NAME]['time']) / 1000.0) | 189 (data[END_COMP_NAME]['time'] - data[BEGIN_COMP_NAME]['time']) / 1000.0) |
188 | 190 |
189 | |
190 if input_type == 'GestureScrollUpdate': | 191 if input_type == 'GestureScrollUpdate': |
191 ref_latency_stats.touch_scroll_events.append(async_sub_slice) | 192 ref_latency_stats.touch_scroll_events.append(async_sub_slice) |
192 ref_latency_stats.touch_scroll_latency.append( | 193 ref_latency_stats.touch_scroll_latency.append( |
193 (data[END_COMP_NAME]['time'] - data[UI_COMP_NAME]['time']) / 1000.0) | 194 (data[END_COMP_NAME]['time'] - data[UI_COMP_NAME]['time']) / 1000.0) |
194 | 195 |
| 196 if input_type == 'TouchMove': |
| 197 ref_latency_stats.js_touch_scroll_events.append(async_sub_slice) |
| 198 ref_latency_stats.js_touch_scroll_latency.append( |
| 199 (data[END_COMP_NAME]['time'] - data[UI_COMP_NAME]['time']) / 1000.0) |
| 200 |
195 class RenderingStatsUnitTest(unittest.TestCase): | 201 class RenderingStatsUnitTest(unittest.TestCase): |
196 def testFromTimeline(self): | 202 def testFromTimeline(self): |
197 timeline = model.TimelineModel() | 203 timeline = model.TimelineModel() |
198 | 204 |
199 # Create a browser process and a renderer process, and a main thread and | 205 # Create a browser process and a renderer process, and a main thread and |
200 # impl thread for each. | 206 # impl thread for each. |
201 browser = timeline.GetOrCreateProcess(pid = 1) | 207 browser = timeline.GetOrCreateProcess(pid = 1) |
202 browser_main = browser.GetOrCreateThread(tid = 11) | 208 browser_main = browser.GetOrCreateThread(tid = 11) |
203 browser_compositor = browser.GetOrCreateThread(tid = 12) | 209 browser_compositor = browser.GetOrCreateThread(tid = 12) |
204 renderer = timeline.GetOrCreateProcess(pid = 2) | 210 renderer = timeline.GetOrCreateProcess(pid = 2) |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 ref_latency_stats = ReferenceInputLatencyStats() | 293 ref_latency_stats = ReferenceInputLatencyStats() |
288 | 294 |
289 # Create 10 input latency stats events for Action A. | 295 # Create 10 input latency stats events for Action A. |
290 timer.Advance() | 296 timer.Advance() |
291 renderer_main.BeginSlice('webkit.console', 'ActionA', timer.Get(), '') | 297 renderer_main.BeginSlice('webkit.console', 'ActionA', timer.Get(), '') |
292 for _ in xrange(0, 10): | 298 for _ in xrange(0, 10): |
293 AddInputLatencyStats(timer, 'MouseWheel', browser_main, | 299 AddInputLatencyStats(timer, 'MouseWheel', browser_main, |
294 renderer_main, ref_latency_stats) | 300 renderer_main, ref_latency_stats) |
295 AddInputLatencyStats(timer, 'GestureScrollUpdate', browser_main, | 301 AddInputLatencyStats(timer, 'GestureScrollUpdate', browser_main, |
296 renderer_main, ref_latency_stats) | 302 renderer_main, ref_latency_stats) |
| 303 AddInputLatencyStats(timer, 'TouchMove', browser_main, |
| 304 renderer_main, ref_latency_stats) |
297 renderer_main.EndSlice(timer.Get()) | 305 renderer_main.EndSlice(timer.Get()) |
298 | 306 |
299 # Create 5 input latency stats events not within any action. | 307 # Create 5 input latency stats events not within any action. |
300 for _ in xrange(0, 5): | 308 for _ in xrange(0, 5): |
301 AddInputLatencyStats(timer, 'MouseWheel', browser_main, | 309 AddInputLatencyStats(timer, 'MouseWheel', browser_main, |
302 renderer_main, None) | 310 renderer_main, None) |
303 AddInputLatencyStats(timer, 'GestureScrollUpdate', browser_main, | 311 AddInputLatencyStats(timer, 'GestureScrollUpdate', browser_main, |
304 renderer_main, None) | 312 renderer_main, None) |
| 313 AddInputLatencyStats(timer, 'TouchMove', browser_main, |
| 314 renderer_main, None) |
305 | 315 |
306 # Create 10 input latency stats events for Action B. | 316 # Create 10 input latency stats events for Action B. |
307 timer.Advance() | 317 timer.Advance() |
308 renderer_main.BeginSlice('webkit.console', 'ActionB', timer.Get(), '') | 318 renderer_main.BeginSlice('webkit.console', 'ActionB', timer.Get(), '') |
309 for _ in xrange(0, 10): | 319 for _ in xrange(0, 10): |
310 AddInputLatencyStats(timer, 'MouseWheel', browser_main, | 320 AddInputLatencyStats(timer, 'MouseWheel', browser_main, |
311 renderer_main, ref_latency_stats) | 321 renderer_main, ref_latency_stats) |
312 AddInputLatencyStats(timer, 'GestureScrollUpdate', browser_main, | 322 AddInputLatencyStats(timer, 'GestureScrollUpdate', browser_main, |
313 renderer_main, ref_latency_stats) | 323 renderer_main, ref_latency_stats) |
| 324 AddInputLatencyStats(timer, 'TouchMove', browser_main, |
| 325 renderer_main, ref_latency_stats) |
314 renderer_main.EndSlice(timer.Get()) | 326 renderer_main.EndSlice(timer.Get()) |
315 | 327 |
316 # Create 10 input latency stats events for Action A. | 328 # Create 10 input latency stats events for Action A. |
317 timer.Advance() | 329 timer.Advance() |
318 renderer_main.BeginSlice('webkit.console', 'ActionA', timer.Get(), '') | 330 renderer_main.BeginSlice('webkit.console', 'ActionA', timer.Get(), '') |
319 for _ in xrange(0, 10): | 331 for _ in xrange(0, 10): |
320 AddInputLatencyStats(timer, 'MouseWheel', browser_main, | 332 AddInputLatencyStats(timer, 'MouseWheel', browser_main, |
321 renderer_main, ref_latency_stats) | 333 renderer_main, ref_latency_stats) |
322 AddInputLatencyStats(timer, 'GestureScrollUpdate', browser_main, | 334 AddInputLatencyStats(timer, 'GestureScrollUpdate', browser_main, |
323 renderer_main, ref_latency_stats) | 335 renderer_main, ref_latency_stats) |
| 336 AddInputLatencyStats(timer, 'TouchMove', browser_main, |
| 337 renderer_main, ref_latency_stats) |
324 renderer_main.EndSlice(timer.Get()) | 338 renderer_main.EndSlice(timer.Get()) |
325 | 339 |
326 browser_main.FinalizeImport() | 340 browser_main.FinalizeImport() |
327 renderer_main.FinalizeImport() | 341 renderer_main.FinalizeImport() |
328 | 342 |
329 mouse_wheel_scroll_events = [] | 343 mouse_wheel_scroll_events = [] |
330 touch_scroll_events = [] | 344 touch_scroll_events = [] |
| 345 js_touch_scroll_events = [] |
331 | 346 |
332 timeline_markers = timeline.FindTimelineMarkers( | 347 timeline_markers = timeline.FindTimelineMarkers( |
333 ['ActionA', 'ActionB', 'ActionA']) | 348 ['ActionA', 'ActionB', 'ActionA']) |
334 for timeline_range in [ timeline_bounds.Bounds.CreateFromEvent(marker) | 349 for timeline_range in [ timeline_bounds.Bounds.CreateFromEvent(marker) |
335 for marker in timeline_markers ]: | 350 for marker in timeline_markers ]: |
336 if timeline_range.is_empty: | 351 if timeline_range.is_empty: |
337 continue | 352 continue |
338 tmp_mouse_events, tmp_touch_events = GetScrollInputLatencyEvents( | 353 tmp_mouse_events = GetScrollInputLatencyEvents( |
339 browser, timeline_range) | 354 'MouseWheel', browser, timeline_range) |
| 355 tmp_touch_scroll_events = GetScrollInputLatencyEvents( |
| 356 'GestureScrollUpdate', browser, timeline_range) |
| 357 tmp_js_touch_scroll_events = GetScrollInputLatencyEvents( |
| 358 'TouchMove', browser, timeline_range) |
340 mouse_wheel_scroll_events.extend(tmp_mouse_events) | 359 mouse_wheel_scroll_events.extend(tmp_mouse_events) |
341 touch_scroll_events.extend(tmp_touch_events) | 360 touch_scroll_events.extend(tmp_touch_scroll_events) |
| 361 js_touch_scroll_events.extend(tmp_js_touch_scroll_events) |
342 | 362 |
343 self.assertEquals(mouse_wheel_scroll_events, | 363 self.assertEquals(mouse_wheel_scroll_events, |
344 ref_latency_stats.mouse_wheel_scroll_events) | 364 ref_latency_stats.mouse_wheel_scroll_events) |
345 self.assertEquals(touch_scroll_events, | 365 self.assertEquals(touch_scroll_events, |
346 ref_latency_stats.touch_scroll_events) | 366 ref_latency_stats.touch_scroll_events) |
| 367 self.assertEquals(js_touch_scroll_events, |
| 368 ref_latency_stats.js_touch_scroll_events) |
347 self.assertEquals(ComputeMouseWheelScrollLatency(mouse_wheel_scroll_events), | 369 self.assertEquals(ComputeMouseWheelScrollLatency(mouse_wheel_scroll_events), |
348 ref_latency_stats.mouse_wheel_scroll_latency) | 370 ref_latency_stats.mouse_wheel_scroll_latency) |
349 self.assertEquals(ComputeTouchScrollLatency(touch_scroll_events), | 371 self.assertEquals(ComputeTouchScrollLatency(touch_scroll_events), |
350 ref_latency_stats.touch_scroll_latency) | 372 ref_latency_stats.touch_scroll_latency) |
| 373 self.assertEquals(ComputeTouchScrollLatency(js_touch_scroll_events), |
| 374 ref_latency_stats.js_touch_scroll_latency) |
OLD | NEW |