# 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
+# TODO(eakuefner): Refactor references to Page and kill this hack.
+from telemetry import page
-_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)
+Page = page.Page