chromium/tools/perf/contrib/vr_benchmarks/vr_sample_page.py

# Copyright 2017 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import re
from telemetry import page
from contrib.vr_benchmarks import shared_vr_page_state as vr_state

WEBVR_SAMPLE_DIR = os.path.join(
    os.path.dirname(__file__), '..', '..', '..', '..', 'chrome', 'test',
    'data', 'xr', 'webvr_info', 'samples')


WEBXR_SAMPLE_DIR = os.path.join(
    os.path.dirname(__file__), '..', '..', '..', '..', 'third_party',
        'webxr_test_pages', 'webxr-samples')


class _VrXrSamplePage(page.Page):
  """Superclass for all VR and XR sample pages."""

  def __init__(self, sample_directory, sample_page, page_set,
      url_parameters=None, extra_browser_args=None):
    url = '%s.html' % sample_page
    if url_parameters is not None:
      url += '?' + '&'.join(url_parameters)
    name = url.replace('.html', '')
    # Replace characters that are unsupported by the perf dashboard here so that
    # the name reported on the dashboard can be used as a story filter.
    # We don't use a the \W+ regex like other benchmarks because we need to
    # keep certain non-alphanumeric characters around for backwards naming
    # compatibility. This regex should replace anything except alphanumeric,
    # question mark, dash, and period characters with underscores.
    name = re.sub(r'[^a-zA-Z\d\?\-\.]+', '_', name)
    url = 'file://' + os.path.join(sample_directory, url)
    super(_VrXrSamplePage, self).__init__(
        url=url,
        page_set=page_set,
        name=name,
        extra_browser_args=extra_browser_args,
        shared_page_state_class=vr_state.SharedVrPageStateFactory)
    self._shared_page_state = None

  def Run(self, shared_state):
    self._shared_page_state = shared_state
    super(_VrXrSamplePage, self).Run(shared_state)

  @property
  def platform(self):
    return self._shared_page_state.platform


class VrSamplePage(_VrXrSamplePage):
  """Superclass for all VR sample pages."""

  def __init__(self, sample_page, page_set, url_parameters=None,
      extra_browser_args=None):
    super(VrSamplePage, self).__init__(
        sample_directory=WEBVR_SAMPLE_DIR,
        sample_page=sample_page,
        page_set=page_set,
        url_parameters=url_parameters,
        extra_browser_args=extra_browser_args)


class XrSamplePage(_VrXrSamplePage):
  """Superclass for all XR sample pages."""

  def __init__(self, sample_page, page_set, url_parameters=None,
      extra_browser_args=None):
    super(XrSamplePage, self).__init__(
        sample_directory=WEBXR_SAMPLE_DIR,
        sample_page=sample_page,
        page_set=page_set,
        url_parameters=url_parameters,
        extra_browser_args=extra_browser_args)

  @property
  def serving_dir(self):
    # The default implementation of serving_dir results in the WebXR pages not
    # loading properly since the JS resources are in webxr_samples/js/, and the
    # default implementation results in webxr_samples/tests/ being the serving
    # directory.
    return WEBXR_SAMPLE_DIR