Chromium Code Reviews| Index: telemetry/telemetry/page/cache_temperature.py |
| diff --git a/telemetry/telemetry/page/cache_temperature.py b/telemetry/telemetry/page/cache_temperature.py |
| index 3e22d02eac6e41389f4778bb07582113bbae4631..beca59e2c87a477652dd5740f1caab4f3385e2e7 100644 |
| --- a/telemetry/telemetry/page/cache_temperature.py |
| +++ b/telemetry/telemetry/page/cache_temperature.py |
| @@ -12,7 +12,7 @@ https://docs.google.com/document/u/1/d/12D7tkhZi887g9d0U2askU9JypU_wYiEI7Lw0bfwx |
| import logging |
| -import py_utils |
| +from telemetry.core import exceptions |
| # Default Cache Temperature. The page doesn't care which browser cache state |
| # it is run on. |
| @@ -20,9 +20,11 @@ ANY = 'any' |
| # Emulates cold runs. Clears various caches and data with using tab.ClearCache() |
| # and tab.ClearDataForOrigin(). |
| COLD = 'cold' |
| -# Emulates warm runs. Ensures that the page was visited at least once just |
| -# before the run. |
| +# Emulates warm runs. Ensures that the page was visited once before the run. |
| WARM = 'warm' |
| +# Emulates hot runs. Ensures that the page was visited at least twice before |
| +# the run. |
| +HOT = 'hot' |
| # These regacy states will be removed after chromium test scripts are adapted |
| # to new states. |
| @@ -46,7 +48,6 @@ class MarkTelemetryInternal(object): |
| def __exit__(self, exception_type, exception_value, traceback): |
| if exception_type: |
| return True |
| - |
| marker = 'telemetry.internal.%s.end' % self.identifier |
| self.browser.tabs[0].ExecuteJavaScript( |
| "console.time({{ marker }});", marker=marker) |
| @@ -54,19 +55,32 @@ class MarkTelemetryInternal(object): |
| "console.timeEnd({{ marker }});", marker=marker) |
| return True |
| -def ClearCache(browser): |
| +def ClearCacheAndData(browser, url): |
| tab = browser.tabs[0] |
| tab.ClearCache(force=True) |
| + tab.ClearDataForOrigin(url) |
| def WarmCache(page, browser): |
| with MarkTelemetryInternal(browser, 'warm_cache'): |
| tab = browser.tabs[0] |
| - tab.Navigate(page.url) |
| - py_utils.WaitFor(tab.HasReachedQuiescence, 60) |
| - tab.WaitForDocumentReadyStateToBeComplete() |
| + page.RunNavigateSteps(tab.action_runner) |
| + page.RunPageInteractions(tab.action_runner) |
| tab.Navigate("about:blank") |
| tab.WaitForDocumentReadyStateToBeComplete() |
| +def StopServiceWorker(browser, timeout=60): |
|
nednguyen
2017/09/22 08:35:14
s/StopServiceWorker/InstallServiceWorker
yukiy
2017/09/22 10:04:59
Acknowledged.
|
| + tab = browser.tabs[0] |
| + res = tab._inspector_backend._websocket.SyncRequest({ |
|
nednguyen
2017/09/22 08:35:14
Please don't access private APIs at inspector back
yukiy
2017/09/22 10:04:59
OK! I created new CL so please check it :)
https:/
|
| + 'method': 'ServiceWorker.enable' |
| + }, timeout) |
| + if 'error' in res: |
| + raise exceptions.StoryActionError(res['error']['message']) |
| + tab._inspector_backend._websocket.SyncRequest({ |
| + 'method': 'ServiceWorker.stopAllWorkers', |
| + }, timeout) |
| + if 'error' in res: |
| + raise exceptions.StoryActionError(res['error']['message']) |
| + |
| def EnsurePageCacheTemperature(page, browser, previous_page=None): |
| temperature = page.cache_temperature |
| logging.info('PageCacheTemperature: %s', temperature) |
| @@ -84,12 +98,11 @@ def EnsurePageCacheTemperature(page, browser, previous_page=None): |
| tab = browser.tabs[0] |
| tab.Navigate("http://does.not.exist") |
| tab.WaitForDocumentReadyStateToBeComplete() |
| - ClearCache(browser) |
| + ClearCacheAndData(browser, page.url) |
| elif temperature == WARM: |
| if (previous_page is not None and |
| previous_page.url == page.url and |
| - (previous_page.cache_temperature == COLD or |
| - previous_page.cache_temperature == WARM)): |
| + previous_page.cache_temperature == COLD): |
| if '#' in page.url: |
| # Navigate to inexistent URL to avoid in-page hash navigation. |
| # Note: Unlike PCv1, PCv2 iterates the same URL for different cache |
| @@ -99,5 +112,27 @@ def EnsurePageCacheTemperature(page, browser, previous_page=None): |
| tab = browser.tabs[0] |
| tab.Navigate("http://does.not.exist") |
| tab.WaitForDocumentReadyStateToBeComplete() |
| - return |
| - WarmCache(page, browser) |
| + else: |
| + ClearCacheAndData(browser, page.url) |
| + WarmCache(page, browser) |
| + elif temperature == HOT: |
| + if (previous_page is not None and |
| + previous_page.url == page.url and |
| + previous_page.cache_temperature != ANY): |
| + if previous_page.cache_temperature == COLD: |
| + WarmCache(page, browser) |
| + else: |
| + if '#' in page.url: |
| + # Navigate to inexistent URL to avoid in-page hash navigation. |
| + # Note: Unlike PCv1, PCv2 iterates the same URL for different cache |
| + # configurations. This may issue blink in-page hash navigations, |
| + # which isn't intended here. |
| + with MarkTelemetryInternal(browser, 'avoid_double_hash_navigation'): |
| + tab = browser.tabs[0] |
| + tab.Navigate("http://does.not.exist") |
| + tab.WaitForDocumentReadyStateToBeComplete() |
| + else: |
| + ClearCacheAndData(browser, page.url) |
| + WarmCache(page, browser) |
| + WarmCache(page, browser) |
| + StopServiceWorker(browser) |