aboutsummaryrefslogtreecommitdiff
path: root/catapult/telemetry/telemetry/page/cache_temperature.py
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/telemetry/telemetry/page/cache_temperature.py')
-rw-r--r--catapult/telemetry/telemetry/page/cache_temperature.py96
1 files changed, 96 insertions, 0 deletions
diff --git a/catapult/telemetry/telemetry/page/cache_temperature.py b/catapult/telemetry/telemetry/page/cache_temperature.py
new file mode 100644
index 00000000..0c604575
--- /dev/null
+++ b/catapult/telemetry/telemetry/page/cache_temperature.py
@@ -0,0 +1,96 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+Cache temperature specifies how the browser cache should be configured before
+the page run.
+
+See design doc for details:
+https://docs.google.com/document/u/1/d/12D7tkhZi887g9d0U2askU9JypU_wYiEI7Lw0bfwxUgA
+"""
+
+import logging
+
+import py_utils
+
+# Default Cache Temperature. The page doesn't care which browser cache state
+# it is run on.
+ANY = 'any'
+# Emulates PageCycler V1 cold runs. Clears system DNS cache, browser DiskCache,
+# net/ predictor cache, and net/ host resolver cache.
+PCV1_COLD = 'pcv1-cold'
+# Emulates PageCycler V1 warm runs. Ensures that the page was visited at least
+# once just before the run.
+PCV1_WARM = 'pcv1-warm'
+
+class MarkTelemetryInternal(object):
+
+ def __init__(self, browser, identifier):
+ self.browser = browser
+ self.identifier = identifier
+
+ def __enter__(self):
+ # TODO(catapult:#3028): Fix interpolation of JavaScript values.
+ self.browser.tabs[0].ExecuteJavaScript(
+ """console.time('telemetry.internal.{0}.start');""".format(
+ self.identifier))
+ # TODO(catapult:#3028): Fix interpolation of JavaScript values.
+ self.browser.tabs[0].ExecuteJavaScript(
+ """console.timeEnd('telemetry.internal.{0}.start');""".format(
+ self.identifier))
+ return self
+
+ def __exit__(self, exception_type, exception_value, traceback):
+ if exception_type:
+ return True
+
+ # TODO(catapult:#3028): Fix interpolation of JavaScript values.
+ self.browser.tabs[0].ExecuteJavaScript(
+ """console.time('telemetry.internal.{0}.end');""".format(
+ self.identifier))
+ # TODO(catapult:#3028): Fix interpolation of JavaScript values.
+ self.browser.tabs[0].ExecuteJavaScript(
+ """console.timeEnd('telemetry.internal.{0}.end');""".format(
+ self.identifier))
+ return True
+
+def EnsurePageCacheTemperature(page, browser, previous_page=None):
+ temperature = page.cache_temperature
+ logging.info('PageCacheTemperature: %s', temperature)
+
+ if temperature == ANY:
+ return
+
+ if temperature == PCV1_COLD:
+ if previous_page is None:
+ with MarkTelemetryInternal(browser, 'ensure_diskcache'):
+ tab = browser.tabs[0]
+ tab.Navigate("http://does.not.exist")
+ tab.WaitForDocumentReadyStateToBeComplete()
+
+ any_tab = browser.tabs[0]
+ any_tab.ClearCache(force=True)
+ elif temperature == PCV1_WARM:
+ if (previous_page is not None and
+ previous_page.url == page.url and
+ (previous_page.cache_temperature == PCV1_COLD or
+ previous_page.cache_temperature == PCV1_WARM)):
+ 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()
+ return
+
+ with MarkTelemetryInternal(browser, 'warmCache'):
+ tab = browser.tabs[0]
+ tab.Navigate(page.url)
+ py_utils.WaitFor(tab.HasReachedQuiescence, 60)
+ tab.WaitForDocumentReadyStateToBeComplete()
+ tab.Navigate("about:blank")
+ tab.WaitForDocumentReadyStateToBeComplete()