158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)# found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)"""A Telemetry page_action that loops media playback.
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7116680a4aac90f2aa7413d9095a592090648e557Ben MurdochAction parameters are:
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)- loop_count: The number of times to loop media.
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)- selector: If no selector is defined then the action attempts to loop the first
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            media element on the page. If 'all' then loop all media elements.
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch- timeout_in_seconds: Timeout to wait for media to loop. Default is
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                      60 sec x loop_count. 0 means do not wait.
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)"""
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)from telemetry.core import exceptions
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)from telemetry.page.actions import media_action
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)from telemetry.page.actions import page_action
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LoopAction(media_action.MediaAction):
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def __init__(self, loop_count, selector=None, timeout_in_seconds=None):
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    super(LoopAction, self).__init__()
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._loop_count = loop_count
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._selector = selector if selector else ''
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._timeout_in_seconds = (
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        timeout_in_seconds if timeout_in_seconds else 60 * loop_count)
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def WillRunAction(self, tab):
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    """Load the media metrics JS code prior to running the action."""
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    super(LoopAction, self).WillRunAction(tab)
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    self.LoadJS(tab, 'loop.js')
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def RunAction(self, tab):
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    try:
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      tab.ExecuteJavaScript('window.__loopMedia("%s", %i);' %
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            (self._selector, self._loop_count))
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      if self._timeout_in_seconds > 0:
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        self.WaitForEvent(tab, self._selector, 'loop', self._timeout_in_seconds)
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    except exceptions.EvaluateException:
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      raise page_action.PageActionFailed('Cannot loop media element(s) with '
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                         'selector = %s.' % self._selector)
42