Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. | 1 # Copyright 2015 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 telemetry.core import exceptions | 5 from page_sets import repeatable_synthesize_scroll_gesture_shared_state |
| 6 | |
| 6 from telemetry.page import page as page_module | 7 from telemetry.page import page as page_module |
| 8 from telemetry.web_perf import timeline_interaction_record | |
| 7 from telemetry import story | 9 from telemetry import story |
| 8 | 10 |
| 9 | 11 |
| 10 class SwiffyPage(page_module.Page): | 12 class SwiffyPage(page_module.Page): |
| 11 | 13 |
| 12 def __init__(self, url, page_set): | 14 def __init__(self, url, page_set): |
| 13 super(SwiffyPage, self).__init__(url=url, page_set=page_set, | 15 super(SwiffyPage, self).__init__(url=url, page_set=page_set, |
| 14 make_javascript_deterministic=False) | 16 make_javascript_deterministic=False) |
| 15 | 17 |
| 16 def RunNavigateSteps(self, action_runner): | 18 def RunNavigateSteps(self, action_runner): |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 28 action_runner.EvaluateJavaScript(viewport_js) | 30 action_runner.EvaluateJavaScript(viewport_js) |
| 29 | 31 |
| 30 def RunPageInteractions(self, action_runner): | 32 def RunPageInteractions(self, action_runner): |
| 31 with action_runner.CreateInteraction('ToughAd'): | 33 with action_runner.CreateInteraction('ToughAd'): |
| 32 action_runner.Wait(10) | 34 action_runner.Wait(10) |
| 33 | 35 |
| 34 | 36 |
| 35 class ScrollingPage(page_module.Page): | 37 class ScrollingPage(page_module.Page): |
| 36 | 38 |
| 37 def __init__(self, url, page_set, top_start_ratio=.5, | 39 def __init__(self, url, page_set, top_start_ratio=.5, |
| 38 make_javascript_deterministic=True): | 40 make_javascript_deterministic=True, scroll_multiplier=0.5): |
|
Sami
2015/08/19 11:54:46
What does it mean to scroll .5 times?-)
alex clarke (OOO till 29th)
2015/08/19 15:40:58
It's a distance multiplier, hopefully that is more
| |
| 39 super(ScrollingPage, self).__init__(url=url, page_set=page_set, | 41 super(ScrollingPage, self).__init__( |
| 40 make_javascript_deterministic=make_javascript_deterministic) | 42 url=url, |
| 43 page_set=page_set, | |
| 44 make_javascript_deterministic=make_javascript_deterministic, | |
| 45 shared_page_state_class=( | |
| 46 repeatable_synthesize_scroll_gesture_shared_state.\ | |
| 47 RepeatableSynthesizeScrollGestureSharedState)) | |
| 41 self._top_start_ratio = top_start_ratio | 48 self._top_start_ratio = top_start_ratio |
| 49 self._scroll_multiplier = scroll_multiplier | |
| 50 self._screensize = [] | |
| 42 | 51 |
| 43 def RunNavigateSteps(self, action_runner): | 52 def RunNavigateSteps(self, action_runner): |
| 44 # Rewrite file urls to point to the replay server instead. | 53 # Rewrite file urls to point to the replay server instead. |
| 45 if self.is_file: | 54 if self.is_file: |
| 46 url = self.file_path_url_with_scheme | 55 url = self.file_path_url_with_scheme |
| 47 url = action_runner.tab.browser.http_server.UrlOf(url[len('file://'):]) | 56 url = action_runner.tab.browser.http_server.UrlOf(url[len('file://'):]) |
| 48 else: | 57 else: |
| 49 url = self._url | 58 url = self._url |
| 50 action_runner.tab.Navigate(url) | 59 action_runner.tab.Navigate(url) |
| 51 | 60 |
| 52 # Give the page one second to become interactive and start scrolling after | 61 # Wait for the page to be scrollable. |
| 53 # the timeout regardless of the document's ready state. | |
| 54 try: | |
| 55 action_runner.tab.WaitForDocumentReadyStateToBeInteractiveOrBetter(1) | |
| 56 except exceptions.TimeoutException: | |
| 57 pass | |
| 58 # Wait for the document to have a body so that we can scroll. | |
| 59 # Simultaneously (to reduce latency), insert a no-op touch handler on the | |
| 60 # body. Most ads have touch handlers and we want to simulate the worst case | |
| 61 # of the user trying to scroll the page by grabbing an ad. | |
| 62 action_runner.WaitForJavaScriptCondition( | 62 action_runner.WaitForJavaScriptCondition( |
| 63 '!(document.body == null || ' | 63 'document.body != null && ' |
| 64 ' document.body.addEventListener("touchstart", function() {}))') | 64 'document.body.scrollHeight > window.screen.height') |
| 65 | |
| 66 # Get the dimensions of the screen. Simultaneously (to reduce latency), | |
| 67 # insert a no-op touch handler on the body. Most ads have touch handlers | |
| 68 # and we want to simulate the worst case of the user trying to scroll the | |
| 69 # page by grabbing an ad. | |
| 70 js_result = action_runner.EvaluateJavaScript( | |
| 71 'window.screen.availWidth + "," + window.screen.availHeight + "," + ' | |
| 72 '(document.body.addEventListener("touchstart", function() {}) ? 1 : 0)') | |
| 73 self._screensize = [int(n) for n in js_result.split(',')] | |
| 74 | |
| 65 | 75 |
| 66 def RunPageInteractions(self, action_runner): | 76 def RunPageInteractions(self, action_runner): |
| 67 for _ in range(10): | 77 scroll_distance = int(self._scroll_multiplier * self._screensize[1]) |
| 68 with action_runner.CreateGestureInteraction('ScrollAction', | |
| 69 repeatable=True): | |
| 70 action_runner.ScrollPage(distance=500, | |
| 71 top_start_ratio=self._top_start_ratio) | |
| 72 action_runner.Wait(.25) | |
| 73 | 78 |
| 79 # Set up a browser driven repeating scroll. The delay between the scrolls | |
| 80 # should be unaffected by render thread responsivness (or lack there of). | |
| 81 action_runner.tab.SynthesizeScrollGesture( | |
| 82 x=int(self._screensize[0] / 2), | |
| 83 y=self._screensize[1] - int(self._screensize[1] * 0.25), | |
| 84 xDistance=0, | |
| 85 yDistance=-scroll_distance, | |
| 86 repeatCount=9, | |
| 87 repeatDelayMs=250, | |
| 88 interactionMarkerName=timeline_interaction_record.GetJavaScriptMarker( | |
| 89 'Gesture_ScrollAction', [timeline_interaction_record.REPEATABLE])) | |
| 74 | 90 |
| 75 class ScrollingForbesPage(ScrollingPage): | 91 class ScrollingForbesPage(ScrollingPage): |
| 76 | 92 |
| 77 def __init__(self, url, page_set): | 93 def __init__(self, url, page_set): |
| 78 # forbes.com uses a strange dynamic transform on the body element, | 94 # forbes.com uses a strange dynamic transform on the body element, |
| 79 # which occasionally causes us to try scrolling from outside the | 95 # which occasionally causes us to try scrolling from outside the |
| 80 # screen. Start at the very top of the viewport to avoid this. | 96 # screen. Start at the very top of the viewport to avoid this. |
| 81 super(ScrollingForbesPage, self).__init__( | 97 super(ScrollingForbesPage, self).__init__( |
| 82 url=url, page_set=page_set, top_start_ratio=0, | 98 url=url, page_set=page_set, top_start_ratio=0, |
| 83 make_javascript_deterministic=False) | 99 make_javascript_deterministic=False) |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 121 | 137 |
| 122 class ScrollingToughAdCasesPageSet(story.StorySet): | 138 class ScrollingToughAdCasesPageSet(story.StorySet): |
| 123 """Pages for measuring scrolling performance with advertising content.""" | 139 """Pages for measuring scrolling performance with advertising content.""" |
| 124 | 140 |
| 125 def __init__(self): | 141 def __init__(self): |
| 126 super(ScrollingToughAdCasesPageSet, self).__init__( | 142 super(ScrollingToughAdCasesPageSet, self).__init__( |
| 127 archive_data_file='data/tough_ad_cases.json', | 143 archive_data_file='data/tough_ad_cases.json', |
| 128 cloud_storage_bucket=story.INTERNAL_BUCKET) | 144 cloud_storage_bucket=story.INTERNAL_BUCKET) |
| 129 | 145 |
| 130 self.AddStory(ScrollingPage('file://tough_ad_cases/' | 146 self.AddStory(ScrollingPage('file://tough_ad_cases/' |
| 131 'swiffy_collection.html', self, make_javascript_deterministic=False)) | 147 'swiffy_collection.html', self, make_javascript_deterministic=False, |
| 148 scroll_multiplier=0.25)) | |
| 132 self.AddStory(ScrollingPage('http://www.latimes.com', self)) | 149 self.AddStory(ScrollingPage('http://www.latimes.com', self)) |
| 133 self.AddStory(ScrollingForbesPage('http://www.forbes.com/sites/parmyolson/' | 150 self.AddStory(ScrollingForbesPage('http://www.forbes.com/sites/parmyolson/' |
| 134 '2015/07/29/jana-mobile-data-facebook-internet-org/', self)) | 151 '2015/07/29/jana-mobile-data-facebook-internet-org/', self)) |
| 135 self.AddStory(ScrollingPage('http://androidcentral.com', self)) | 152 self.AddStory(ScrollingPage('http://androidcentral.com', self)) |
| 136 self.AddStory(ScrollingPage('http://mashable.com', self, top_start_ratio=0)) | 153 self.AddStory(ScrollingPage('http://mashable.com', self, top_start_ratio=0)) |
| 137 self.AddStory(ScrollingPage('http://www.androidauthority.com/' | 154 self.AddStory(ScrollingPage('http://www.androidauthority.com/' |
| 138 'reduce-data-use-turn-on-data-compression-in-chrome-630064/', self)) | 155 'reduce-data-use-turn-on-data-compression-in-chrome-630064/', self)) |
| 139 self.AddStory(ScrollingPage('http://www.cnn.com/2015/01/09/politics/' | 156 self.AddStory(ScrollingPage('http://www.cnn.com/2015/01/09/politics/' |
| 140 'nebraska-keystone-pipeline/index.html', self, top_start_ratio=0)) | 157 'nebraska-keystone-pipeline/index.html', self, top_start_ratio=0)) |
| 141 # Disabled: crbug.com/520509 | 158 # Disabled: crbug.com/520509 |
| 142 #self.AddStory(ScrollingPage('http://time.com/3977891/' | 159 #self.AddStory(ScrollingPage('http://time.com/3977891/' |
| 143 # 'donald-trump-debate-republican/', self)) | 160 # 'donald-trump-debate-republican/', self)) |
| 144 self.AddStory(ScrollingPage('http://www.theguardian.com/uk', self)) | 161 self.AddStory(ScrollingPage('http://www.theguardian.com/uk', self)) |
| 145 self.AddStory(ScrollingPage('http://m.tmz.com', self)) | 162 self.AddStory(ScrollingPage('http://m.tmz.com', self, |
| 163 scroll_multiplier=0.25)) | |
| 146 self.AddStory(ScrollingPage('http://androidpolice.com', self, | 164 self.AddStory(ScrollingPage('http://androidpolice.com', self, |
| 147 top_start_ratio=0)) | 165 top_start_ratio=0)) |
| OLD | NEW |