Chromium Code Reviews| Index: tools/perf/page_sets/system_health/browsing_stories.py |
| diff --git a/tools/perf/page_sets/system_health/browsing_stories.py b/tools/perf/page_sets/system_health/browsing_stories.py |
| index 75ba50a20f98d63a565a72f0a2f8a61929710949..4b07d3889fb9ca72b17bc37a6fb666dc0e9aa792 100644 |
| --- a/tools/perf/page_sets/system_health/browsing_stories.py |
| +++ b/tools/perf/page_sets/system_health/browsing_stories.py |
| @@ -7,6 +7,7 @@ from page_sets.system_health import platforms |
| from page_sets.system_health import story_tags |
| from page_sets.system_health import system_health_story |
| +from page_sets.login_helpers import facebook_login |
| from page_sets.login_helpers import pinterest_login |
| from telemetry import decorators |
| @@ -770,3 +771,130 @@ class GoogleEarthStory(_BrowsingStory): |
| action_runner.RepeatableBrowserDrivenScroll( |
| x_scroll_distance_ratio = 1, y_scroll_distance_ratio = 0, |
| repeat_count=3, speed=500, timeout=120) |
| + |
| + |
| +############################################################################## |
| +# Browsing stories with infinite scrolling |
| +############################################################################## |
| + |
| + |
| +class _InfiniteScrollStory(system_health_story.SystemHealthStory): |
| + SUPPORTED_PLATFORMS = platforms.ALL_PLATFORMS |
| + |
| + SCROLL_DISTANCE = 25000 |
| + SCROLL_STEP = 1000 |
| + MAX_SCROLL_RETRIES = 3 |
| + TIME_BEFORE_SCROLL_RETRY_IN_SECONDS = 1 |
| + TIME_TO_WAIT_BEFORE_STARTING_IN_SECONDS = 5 |
| + |
| + def __init__(self, story_set, take_memory_measurement): |
| + super(_InfiniteScrollStory, self).__init__(story_set, |
| + take_memory_measurement) |
| + self.script_to_evaluate_on_commit = ''' |
| + window.WebSocket = undefined; |
| + window.Worker = undefined; |
| + window.performance = undefined;''' |
| + |
| + def RunPageInteractions(self, action_runner): |
|
perezju
2017/05/19 09:40:35
I don't thing we should override this method.
Cou
nednguyen
2017/05/24 21:08:49
Oh, it's just me copy & paste the stories from v8
|
| + with action_runner.CreateInteraction('Load'): |
|
perezju
2017/05/19 09:40:36
Do we still want to create all of these interactio
nednguyen
2017/05/24 21:08:49
Nope.
|
| + action_runner.WaitForJavaScriptCondition( |
| + 'document.body != null && ' |
| + 'document.body.scrollHeight > window.innerHeight && ' |
| + '!document.body.addEventListener("touchstart", function() {})') |
| + with action_runner.CreateInteraction('Wait'): |
| + action_runner.Wait(self.TIME_TO_WAIT_BEFORE_STARTING_IN_SECONDS) |
| + with action_runner.CreateInteraction('GC'): |
| + action_runner.ForceGarbageCollection() |
| + with action_runner.CreateInteraction('Begin'): |
| + action_runner.tab.browser.DumpMemory() |
| + with action_runner.CreateInteraction('Scrolling'): |
| + self._Scroll(action_runner, self.SCROLL_DISTANCE, self.SCROLL_STEP) |
| + with action_runner.CreateInteraction('End'): |
| + action_runner.tab.browser.DumpMemory() |
| + |
| + def _Scroll(self, action_runner, distance, step_size): |
|
perezju
2017/05/19 09:40:35
Could we use some of the Scroll methods in action_
hjd
2017/05/19 10:42:21
This does use action_runner.ScrollPage underneath
|
| + """ This function scrolls the webpage by the given scroll distance in |
| + multiple steps, where each step (except the last one) has the given size. |
| + |
| + If scrolling gets stuck, the functions retries scrolling MAX_SCROLL_RETRIES |
| + times waiting TIME_BEFORE_SCROLL_RETRY_IN_SECONDS seconds between retries. |
| + """ |
| + remaining = distance - action_runner.EvaluateJavaScript('window.scrollY') |
|
hjd
2017/05/19 10:42:21
I think scrollY can be overwritten in JavaScript t
nednguyen
2017/05/24 21:08:49
Acknowledged.
|
| + retry_count = 0 |
| + # Scroll until the window.scrollY is within 1 pixel of the target distance. |
| + while remaining > 1: |
| + action_runner.ScrollPage(distance=min(remaining, step_size) + 1) |
| + new_remaining = (distance - |
| + action_runner.EvaluateJavaScript('window.scrollY')) |
| + if remaining == new_remaining: |
|
hjd
2017/05/19 10:42:21
This could be remaining >= new_remaining to guaran
nednguyen
2017/05/24 21:08:49
Done.
|
| + # Scrolling is stuck. This can happen if the page is loading |
| + # resources. Give the page some time and retry scrolling. |
| + if retry_count == self.MAX_SCROLL_RETRIES: |
| + raise Exception('Scrolling stuck at %d' % remaining) |
| + retry_count += 1 |
| + action_runner.Wait(self.TIME_BEFORE_SCROLL_RETRY_IN_SECONDS) |
| + else: |
| + retry_count = 0 |
| + remaining = new_remaining |
| + |
| + |
| +class DiscourseDesktopStory(_InfiniteScrollStory): |
| + NAME = 'browse_infinite_scroll:forum:discourse' |
|
perezju
2017/05/19 09:40:35
I would call this: browse:social:discourse
And add
ulan
2017/05/19 12:59:00
How about browse:infinite_scroll:discourse? I woul
perezju
2017/05/19 14:34:40
I think "tags" should be the correct way to group
|
| + URL = ('https://meta.discourse.org/t/the-official-discourse-tags-plugin' + |
| + '-discourse-tagging/26482') |
| + SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY |
| + |
| + |
| +class DiscourseMobileStory(_InfiniteScrollStory): |
| + NAME = 'browse_infinite_scroll:forum:discourse' |
|
perezju
2017/05/19 09:40:35
ditto
|
| + URL = ('https://meta.discourse.org/t/the-official-discourse-tags-plugin' + |
| + '-discourse-tagging/26482') |
| + SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY |
| + SCROLL_DISTANCE = 15000 |
| + |
| + |
| +class FacebookScrollDesktopStory(_InfiniteScrollStory): |
| + NAME = 'browse_infinite_scroll:social:facebook' |
|
perezju
2017/05/19 09:40:35
Could this replace our existing browse:social:face
ulan
2017/05/19 12:59:00
They execute different work loads and should be co
perezju
2017/05/19 14:34:40
For system health, IMO, we should pick representat
|
| + URL = 'https://www.facebook.com/shakira' |
| + SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY |
| + |
| + |
| +class FacebookScrollMobileStory(_InfiniteScrollStory): |
| + NAME = 'browse_infinite_scroll:social:facebook' |
| + URL = 'https://m.facebook.com/shakira' |
| + SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY |
| + |
| + def RunNavigateSteps(self, action_runner): |
|
perezju
2017/05/19 09:40:36
We should be overriding _Login instead.
nednguyen
2017/05/24 21:08:49
Done.
|
| + facebook_login.LoginWithMobileSite( |
| + action_runner, 'facebook3', self.credentials_path) |
| + super(FacebookScrollMobileStory, self).RunNavigateSteps(action_runner) |
| + |
| + |
| +class FlickrDesktopStory(_InfiniteScrollStory): |
| + NAME = 'browse_infinite_scroll:media:flickr' |
|
perezju
2017/05/19 09:40:35
Call this just browse:media:flickr
ulan
2017/05/19 12:59:00
How about browse:infinite_scroll:flickr?
|
| + URL = 'https://www.flickr.com/explore' |
| + SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY |
| + |
| + |
| +class FlickrMobileStory(_InfiniteScrollStory): |
| + NAME = 'browse_infinite_scroll:media:flickr' |
| + URL = 'https://www.flickr.com/explore' |
| + SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY |
| + SCROLL_DISTANCE = 10000 |
| + |
| + |
| +class PinterestMobileStory(_InfiniteScrollStory): |
| + NAME = 'browse_infinite_scroll:social:pinterest' |
|
perezju
2017/05/19 09:40:36
browse:social:pinterest
ulan
2017/05/19 12:59:00
How about browse:infinite_scroll:pinterest?
|
| + URL = 'https://www.pinterest.com/all' |
| + SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY |
|
perezju
2017/05/19 09:40:35
No desktop version?
nednguyen
2017/05/24 21:08:49
Nope
|
| + |
| + |
| +class TumblrStory(_InfiniteScrollStory): |
| + NAME = 'browse_infinite_scroll:social:tumblr' |
|
perezju
2017/05/19 09:40:36
browse:social:tumblr
ulan
2017/05/19 12:59:00
How about browse:infinite_scroll:pinterest?
|
| + URL = 'http://techcrunch.tumblr.com/' |
|
hjd
2017/05/19 10:42:21
nit: maybe a comment that techcrunch.tumblr.com do
nednguyen
2017/05/24 21:08:49
Done.
|
| + |
| + |
| +class TwitterScrollDesktopStory(_InfiniteScrollStory): |
| + NAME = 'browse_infinite_scroll:social:twitter' |
| + URL = 'https://twitter.com/taylorswift13' |
| + SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY |