| 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 page_sets import repeatable_synthesize_scroll_gesture_shared_state | 5 from page_sets import repeatable_synthesize_scroll_gesture_shared_state |
| 6 | 6 |
| 7 from telemetry.core import util | 7 from telemetry.core import util |
| 8 from telemetry.page import page as page_module | 8 from telemetry.page import page as page_module |
| 9 from telemetry import story | 9 from telemetry import story |
| 10 | 10 |
| 11 | 11 |
| 12 class SwiffyPage(page_module.Page): | 12 class SwiffyPage(page_module.Page): |
| 13 | 13 |
| 14 def __init__(self, url, page_set): | 14 def __init__(self, url, page_set): |
| 15 super(SwiffyPage, self).__init__(url=url, page_set=page_set, | 15 super(SwiffyPage, self).__init__(url=url, page_set=page_set, |
| 16 make_javascript_deterministic=False) | 16 make_javascript_deterministic=False) |
| 17 | 17 |
| 18 def RunNavigateSteps(self, action_runner): | 18 def RunNavigateSteps(self, action_runner): |
| 19 super(SwiffyPage, self).RunNavigateSteps(action_runner) | 19 super(SwiffyPage, self).RunNavigateSteps(action_runner) |
| 20 # Make sure the ad has finished loading. | 20 # Make sure the ad has finished loading. |
| 21 util.WaitFor(action_runner.tab.HasReachedQuiescence, 60) | 21 util.WaitFor(action_runner.tab.HasReachedQuiescence, 60) |
| 22 # Swiffy overwrites toString() to return a constant string, so "undo" that | 22 # Swiffy overwrites toString() to return a constant string, so "undo" that |
| 23 # here so that we don't think it has stomped over console.time. | 23 # here so that we don't think it has stomped over console.time. |
| 24 action_runner.EvaluateJavaScript2( | 24 action_runner.EvaluateJavaScript( |
| 25 'Function.prototype.toString = function() { return "[native code]"; }') | 25 'Function.prototype.toString = function() { return "[native code]"; }') |
| 26 # Make sure we have a reasonable viewport for mobile. | 26 # Make sure we have a reasonable viewport for mobile. |
| 27 action_runner.EvaluateJavaScript2(""" | 27 action_runner.EvaluateJavaScript(""" |
| 28 var meta = document.createElement("meta"); | 28 var meta = document.createElement("meta"); |
| 29 meta.name = "viewport"; | 29 meta.name = "viewport"; |
| 30 meta.content = "width=device-width"; | 30 meta.content = "width=device-width"; |
| 31 document.getElementsByTagName("head")[0].appendChild(meta); | 31 document.getElementsByTagName("head")[0].appendChild(meta); |
| 32 """) | 32 """) |
| 33 | 33 |
| 34 def RunPageInteractions(self, action_runner): | 34 def RunPageInteractions(self, action_runner): |
| 35 with action_runner.CreateInteraction('ToughAd'): | 35 with action_runner.CreateInteraction('ToughAd'): |
| 36 action_runner.Wait(10) | 36 action_runner.Wait(10) |
| 37 | 37 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 61 url[len('file://'):]) | 61 url[len('file://'):]) |
| 62 else: | 62 else: |
| 63 url = self._url | 63 url = self._url |
| 64 action_runner.tab.Navigate(url) | 64 action_runner.tab.Navigate(url) |
| 65 | 65 |
| 66 # Wait for the page to be scrollable. Simultaneously (to reduce latency due | 66 # Wait for the page to be scrollable. Simultaneously (to reduce latency due |
| 67 # to main thread round trips), insert a no-op touch handler on the body. | 67 # to main thread round trips), insert a no-op touch handler on the body. |
| 68 # Most ads have touch handlers and we want to simulate the worst case of the | 68 # Most ads have touch handlers and we want to simulate the worst case of the |
| 69 # user trying to scroll the page by grabbing an ad. | 69 # user trying to scroll the page by grabbing an ad. |
| 70 if self._wait_for_interactive_or_better: | 70 if self._wait_for_interactive_or_better: |
| 71 action_runner.WaitForJavaScriptCondition2( | 71 action_runner.WaitForJavaScriptCondition( |
| 72 '(document.readyState == "interactive" || ' | 72 '(document.readyState == "interactive" || ' |
| 73 'document.readyState == "complete") &&' | 73 'document.readyState == "complete") &&' |
| 74 'document.body != null && ' | 74 'document.body != null && ' |
| 75 'document.body.scrollHeight > window.innerHeight && ' | 75 'document.body.scrollHeight > window.innerHeight && ' |
| 76 '!document.body.addEventListener("touchstart", function() {})') | 76 '!document.body.addEventListener("touchstart", function() {})') |
| 77 else: | 77 else: |
| 78 action_runner.WaitForJavaScriptCondition2( | 78 action_runner.WaitForJavaScriptCondition( |
| 79 'document.body != null && ' | 79 'document.body != null && ' |
| 80 'document.body.scrollHeight > window.innerHeight && ' | 80 'document.body.scrollHeight > window.innerHeight && ' |
| 81 '!document.body.addEventListener("touchstart", function() {})') | 81 '!document.body.addEventListener("touchstart", function() {})') |
| 82 | 82 |
| 83 def RunPageInteractions(self, action_runner): | 83 def RunPageInteractions(self, action_runner): |
| 84 if not self._scroll: | 84 if not self._scroll: |
| 85 with action_runner.CreateInteraction('ToughAd'): | 85 with action_runner.CreateInteraction('ToughAd'): |
| 86 action_runner.Wait(30) | 86 action_runner.Wait(30) |
| 87 else: | 87 else: |
| 88 action_runner.RepeatableBrowserDrivenScroll( | 88 action_runner.RepeatableBrowserDrivenScroll( |
| 89 y_scroll_distance_ratio=self._y_scroll_distance_multiplier, | 89 y_scroll_distance_ratio=self._y_scroll_distance_multiplier, |
| 90 repeat_count=9) | 90 repeat_count=9) |
| 91 | 91 |
| 92 | 92 |
| 93 class ForbesAdPage(AdPage): | 93 class ForbesAdPage(AdPage): |
| 94 | 94 |
| 95 def __init__(self, url, page_set, scroll=False): | 95 def __init__(self, url, page_set, scroll=False): |
| 96 # forbes.com uses a strange dynamic transform on the body element, | 96 # forbes.com uses a strange dynamic transform on the body element, |
| 97 # which occasionally causes us to try scrolling from outside the | 97 # which occasionally causes us to try scrolling from outside the |
| 98 # screen. Start at the very top of the viewport to avoid this. | 98 # screen. Start at the very top of the viewport to avoid this. |
| 99 super(ForbesAdPage, self).__init__( | 99 super(ForbesAdPage, self).__init__( |
| 100 url=url, page_set=page_set, make_javascript_deterministic=False, | 100 url=url, page_set=page_set, make_javascript_deterministic=False, |
| 101 scroll=scroll, | 101 scroll=scroll, |
| 102 wait_for_interactive_or_better=True) | 102 wait_for_interactive_or_better=True) |
| 103 | 103 |
| 104 def RunNavigateSteps(self, action_runner): | 104 def RunNavigateSteps(self, action_runner): |
| 105 super(ForbesAdPage, self).RunNavigateSteps(action_runner) | 105 super(ForbesAdPage, self).RunNavigateSteps(action_runner) |
| 106 # Wait until the interstitial banner goes away. | 106 # Wait until the interstitial banner goes away. |
| 107 action_runner.WaitForJavaScriptCondition2( | 107 action_runner.WaitForJavaScriptCondition( |
| 108 'window.location.pathname.indexOf("welcome") == -1') | 108 'window.location.pathname.indexOf("welcome") == -1') |
| 109 | 109 |
| 110 | 110 |
| 111 class SyntheticToughAdCasesPageSet(story.StorySet): | 111 class SyntheticToughAdCasesPageSet(story.StorySet): |
| 112 """Pages for measuring rendering performance with advertising content.""" | 112 """Pages for measuring rendering performance with advertising content.""" |
| 113 | 113 |
| 114 def __init__(self): | 114 def __init__(self): |
| 115 super(SyntheticToughAdCasesPageSet, self).__init__( | 115 super(SyntheticToughAdCasesPageSet, self).__init__( |
| 116 archive_data_file='data/tough_ad_cases.json', | 116 archive_data_file='data/tough_ad_cases.json', |
| 117 cloud_storage_bucket=story.INTERNAL_BUCKET) | 117 cloud_storage_bucket=story.INTERNAL_BUCKET) |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 self.AddStory(AdPage('http://androidpolice.com', self, scroll=scroll, | 207 self.AddStory(AdPage('http://androidpolice.com', self, scroll=scroll, |
| 208 wait_for_interactive_or_better=True)) | 208 wait_for_interactive_or_better=True)) |
| 209 | 209 |
| 210 | 210 |
| 211 class ScrollingToughAdCasesPageSet(ToughAdCasesPageSet): | 211 class ScrollingToughAdCasesPageSet(ToughAdCasesPageSet): |
| 212 """Pages for measuring scrolling performance with advertising content.""" | 212 """Pages for measuring scrolling performance with advertising content.""" |
| 213 | 213 |
| 214 def __init__(self): | 214 def __init__(self): |
| 215 super(ScrollingToughAdCasesPageSet, self).__init__( | 215 super(ScrollingToughAdCasesPageSet, self).__init__( |
| 216 scroll=True) | 216 scroll=True) |
| OLD | NEW |