Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(205)

Unified Diff: tools/telemetry/telemetry/page/__init__.py

Issue 556453003: [Telemetry] Move page logic into page/__init__.py. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address Ned's comment Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tools/telemetry/telemetry/page/page.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/telemetry/telemetry/page/__init__.py
diff --git a/tools/telemetry/telemetry/page/__init__.py b/tools/telemetry/telemetry/page/__init__.py
index efcc9c35d2400dba3428197c75b08b1bb64b1b81..9b552194e545bcb9efd995bc164276375cd7fef8 100644
--- a/tools/telemetry/telemetry/page/__init__.py
+++ b/tools/telemetry/telemetry/page/__init__.py
@@ -1,3 +1,191 @@
# Copyright 2012 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.
+import inspect
+import os
+import re
+import urlparse
+
+_next_page_id = 0
+
+class Page(object):
+
+ def __init__(self, url, page_set=None, base_dir=None, name=''):
+ self._url = url
+ self._page_set = page_set
+ # Default value of base_dir is the directory of the file that defines the
+ # class of this page instance.
+ if base_dir is None:
+ base_dir = os.path.dirname(inspect.getfile(self.__class__))
+ self._base_dir = base_dir
+ self._name = name
+
+ global _next_page_id
+ self._id = _next_page_id
+ _next_page_id += 1
+
+ # These attributes can be set dynamically by the page.
+ self.synthetic_delays = dict()
+ self.startup_url = page_set.startup_url if page_set else ''
+ self.credentials = None
+ self.disabled = False
+ self.skip_waits = False
+ self.script_to_evaluate_on_commit = None
+ self._SchemeErrorCheck()
+
+ def _SchemeErrorCheck(self):
+ if not self._scheme:
+ raise ValueError('Must prepend the URL with scheme (e.g. file://)')
+
+ if self.startup_url:
+ startup_url_scheme = urlparse.urlparse(self.startup_url).scheme
+ if not startup_url_scheme:
+ raise ValueError('Must prepend the URL with scheme (e.g. http://)')
+ if startup_url_scheme == 'file':
+ raise ValueError('startup_url with local file scheme is not supported')
+
+ def TransferToPageSet(self, another_page_set):
+ """ Transfer this page to another page set.
+ Args:
+ another_page_set: an instance of telemetry.page.PageSet to transfer this
+ page to.
+ Note:
+ This method removes this page instance from the pages list of its current
+ page_set, so one should be careful not to iterate through the list of
+ pages of a page_set and calling this method.
+ For example, the below loop is erroneous:
+ for p in page_set_A.pages:
+ p.TransferToPageSet(page_set_B.pages)
+ """
+ assert self._page_set
+ if another_page_set is self._page_set:
+ return
+ self._page_set.pages.remove(self)
+ self._page_set = another_page_set
+ self._page_set.AddPage(self)
+
+ def RunNavigateSteps(self, action_runner):
+ action_runner.NavigateToPage(self)
+
+ def CanRunOnBrowser(self, browser_info):
+ """Override this to returns whether this page can be run on specific
+ browser.
+
+ Args:
+ browser_info: an instance of telemetry.core.browser_info.BrowserInfo
+ """
+ assert browser_info
+ return True
+
+ def AsDict(self):
+ """Converts a page object to a dict suitable for JSON output."""
+ d = {
+ 'id': self._id,
+ 'url': self._url,
+ }
+ if self._name:
+ d['name'] = self._name
+ return d
+
+ @property
+ def page_set(self):
+ return self._page_set
+
+ @property
+ def name(self):
+ return self._name
+
+ @property
+ def url(self):
+ return self._url
+
+ @property
+ def id(self):
+ return self._id
+
+ def GetSyntheticDelayCategories(self):
+ result = []
+ for delay, options in self.synthetic_delays.items():
+ options = '%f;%s' % (options.get('target_duration', 0),
+ options.get('mode', 'static'))
+ result.append('DELAY(%s;%s)' % (delay, options))
+ return result
+
+ def __lt__(self, other):
+ return self.url < other.url
+
+ def __cmp__(self, other):
+ x = cmp(self.name, other.name)
+ if x != 0:
+ return x
+ return cmp(self.url, other.url)
+
+ def __str__(self):
+ return self.url
+
+ def AddCustomizeBrowserOptions(self, options):
+ """ Inherit page overrides this to add customized browser options."""
+ pass
+
+ @property
+ def _scheme(self):
+ return urlparse.urlparse(self.url).scheme
+
+ @property
+ def is_file(self):
+ """Returns True iff this URL points to a file."""
+ return self._scheme == 'file'
+
+ @property
+ def is_local(self):
+ """Returns True iff this URL is local. This includes chrome:// URLs."""
+ return self._scheme in ['file', 'chrome', 'about']
+
+ @property
+ def file_path(self):
+ """Returns the path of the file, stripping the scheme and query string."""
+ assert self.is_file
+ # Because ? is a valid character in a filename,
+ # we have to treat the url as a non-file by removing the scheme.
+ parsed_url = urlparse.urlparse(self.url[7:])
+ return os.path.normpath(os.path.join(
+ self._base_dir, parsed_url.netloc + parsed_url.path))
+
+ @property
+ def file_path_url(self):
+ """Returns the file path, including the params, query, and fragment."""
+ assert self.is_file
+ file_path_url = os.path.normpath(os.path.join(self._base_dir, self.url[7:]))
+ # Preserve trailing slash or backslash.
+ # It doesn't matter in a file path, but it does matter in a URL.
+ if self.url.endswith('/'):
+ file_path_url += os.sep
+ return file_path_url
+
+ @property
+ def serving_dir(self):
+ file_path = os.path.realpath(self.file_path)
+ if os.path.isdir(file_path):
+ return file_path
+ else:
+ return os.path.dirname(file_path)
+
+ @property
+ def file_safe_name(self):
+ """A version of display_name that's safe to use as a filename."""
+ # Just replace all special characters in the url with underscore.
+ return re.sub('[^a-zA-Z0-9]', '_', self.display_name)
+
+ @property
+ def display_name(self):
+ if self.name:
+ return self.name
+ if not self.is_file:
+ return self.url
+ all_urls = [p.url.rstrip('/') for p in self.page_set if p.is_file]
+ common_prefix = os.path.dirname(os.path.commonprefix(all_urls))
+ return self.url[len(common_prefix):].strip('/')
+
+ @property
+ def archive_path(self):
+ return self.page_set.WprFilePathForPage(self)
« no previous file with comments | « no previous file | tools/telemetry/telemetry/page/page.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698