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

"""A Telemetry page_action that performs the "play" action on media elements.

Media elements can be specified by a selector argument. If no selector is
defined then then the action attempts to play the first video element or audio
element on the page. A selector can also be 'all' to play all media elements.

Other arguments to use are: playing_event_timeout_in_seconds and
ended_event_timeout_in_seconds, which forces the action to wait until
playing and ended events get fired respectively.
"""

from telemetry.core import exceptions
from telemetry.page.actions import media_action
from telemetry.page.actions import page_action


class PlayAction(media_action.MediaAction):
  def __init__(self, selector=None,
               playing_event_timeout_in_seconds=0,
               ended_event_timeout_in_seconds=0):
    super(PlayAction, self).__init__()
    self._selector = selector if selector else ''
    self._playing_event_timeout_in_seconds = playing_event_timeout_in_seconds
    self._ended_event_timeout_in_seconds = ended_event_timeout_in_seconds

  def WillRunAction(self, tab):
    """Load the media metrics JS code prior to running the action."""
    super(PlayAction, self).WillRunAction(tab)
    self.LoadJS(tab, 'play.js')

  def RunAction(self, tab):
    try:
      tab.ExecuteJavaScript('window.__playMedia("%s");' % self._selector)
      # Check if we need to wait for 'playing' event to fire.
      if self._playing_event_timeout_in_seconds > 0:
        self.WaitForEvent(tab, self._selector, 'playing',
                          self._playing_event_timeout_in_seconds)
      # Check if we need to wait for 'ended' event to fire.
      if self._ended_event_timeout_in_seconds > 0:
        self.WaitForEvent(tab, self._selector, 'ended',
                          self._ended_event_timeout_in_seconds)
    except exceptions.EvaluateException:
      raise page_action.PageActionFailed('Cannot play media element(s) with '
                                         'selector = %s.' % self._selector)
