# Copyright 2018 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.

from contrib.vr_benchmarks.vr_sample_page import XrSamplePage
from contrib.vr_benchmarks.vr_story_set import VrStorySet


class WebXrSamplePage(XrSamplePage):

  def __init__(self, page_set, url_parameters, sample_page,
      extra_browser_args=None):
    super(WebXrSamplePage, self).__init__(
        sample_page=sample_page,
        page_set=page_set,
        url_parameters=url_parameters,
        extra_browser_args=extra_browser_args)

  def RunPageInteractions(self, action_runner):
    action_runner.TapElement(selector='button[title="Enter XR"]')
    action_runner.MeasureMemory(True)
    # We don't want to be in VR or on a page with a WebGL canvas at the end of
    # the test, as this generates unnecessary heat while the trace data is being
    # processed, so navigate to a blank page.
    action_runner.Navigate("about:blank")


class WebXrSamplePageSet(VrStorySet):
  """A page set using the official WebXR samples with settings tweaked."""

  def __init__(self, use_fake_pose_tracker=True):
    super(WebXrSamplePageSet, self).__init__(
        use_fake_pose_tracker=use_fake_pose_tracker)

    # Test cases that use the synthetic cube field page with VSync alignment
    # turned off.
    cube_test_cases_no_vsync = [
      # Standard sample app with no changes.
      ['framebufferScale=1.0'],
      # Increased render scale.
      ['framebufferScale=1.4'],
      # Default render scale, increased load.
      ['framebufferScale=1.0', 'heavyGpu=1', 'cubeScale=0.2', 'workTime=5'],
      # Further increased load.
      ['framebufferScale=1.0', 'heavyGpu=1', 'cubeScale=0.3', 'workTime=10'],
      # Absurd load for fill-rate testing. Only half the cube sea is rendered,
      # and the page automatically rotates the view between the rendered and
      # unrendered halves.
      ['frameBufferScale=1.4', 'heavyGpu=1', 'cubeScale=0.4', 'workTime=4',
       'halfOnly=1', 'autorotate=1'],
    ]

    for url_parameters in cube_test_cases_no_vsync:
      self.AddStory(WebXrSamplePage(self, url_parameters, 'tests/cube-sea',
          extra_browser_args=['--disable-features=WebVrVsyncAlign']))
