# Copyright 2015 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from telemetry.page import shared_page_state

from page_sets.rendering import rendering_story
from page_sets.rendering import story_tags
from page_sets.system_health import platforms


class NoOpPage(rendering_story.RenderingStory):
  ABSTRACT_STORY = True
  TAGS = [story_tags.KEY_NOOP]
  SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY

  def __init__(
    self,
    page_set,
    shared_page_state_class=shared_page_state.SharedMobilePageState,
    name_suffix='',
    extra_browser_args=None,
  ):
    super(NoOpPage, self).__init__(
      page_set=page_set,
      shared_page_state_class=shared_page_state_class,
      name_suffix=name_suffix,
      extra_browser_args=['--disable-top-sites', '--report-silk-details'],
    )

  def RunNavigateSteps(self, action_runner):
    super(NoOpPage, self).RunNavigateSteps(action_runner)
    # Let load activity settle.
    action_runner.Wait(2)

  def RunPageInteractions(self, action_runner):
    # The default page interaction is simply waiting in an idle state.
    with action_runner.CreateInteraction('IdleWaiting'):
      action_runner.Wait(5)


# Why: An infinite rAF loop which does not modify the page should incur
# minimal activity.
class NoOpRafPage(NoOpPage):
  BASE_NAME = 'no_op_raf'
  URL = 'file://../key_noop_cases/no_op_raf.html'


# Why: An infinite setTimeout loop which does not modify the page should
# incur minimal activity.
class NoOpSetTimeoutPage(NoOpPage):
  BASE_NAME = 'no_op_settimeout'
  URL = 'file://../key_noop_cases/no_op_settimeout.html'


class NoOpTouchScrollPage(NoOpPage):
  ABSTRACT_STORY = True

  def RunPageInteractions(self, action_runner):
    # The noop touch motion should last ~5 seconds.
    with action_runner.CreateGestureInteraction('ScrollAction'):
      action_runner.ScrollPage(
        direction='down',
        use_touch=True,
        speed_in_pixels_per_second=300,
        distance=1500,
      )


# Why: Scrolling an empty, unscrollable page should have no expensive side
# effects, as overscroll is suppressed in such cases.
class NoOpScrollPage(NoOpTouchScrollPage):
  BASE_NAME = 'no_op_scroll'
  URL = 'file://../key_noop_cases/no_op_scroll.html'


# Why: Feeding a stream of touch events to a no-op handler should be cheap.
class NoOpTouchHandlerPage(NoOpTouchScrollPage):
  BASE_NAME = 'no_op_touch_handler'
  URL = 'file://../key_noop_cases/no_op_touch_handler.html'
