Home | History | Annotate | Download | only in actions
      1 # Copyright 2013 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 """Common media action functions."""
      6 
      7 import logging
      8 import os
      9 
     10 from telemetry.core import util
     11 from telemetry.page.actions import page_action
     12 
     13 
     14 class MediaAction(page_action.PageAction):
     15   def WillRunAction(self, page, tab):
     16     """Loads the common media action JS code prior to running the action."""
     17     self.LoadJS(tab, 'media_action.js')
     18 
     19   def RunAction(self, page, tab, previous_action):
     20     super(MediaAction, self).RunAction(page, tab, previous_action)
     21 
     22   def LoadJS(self, tab, js_file_name):
     23     """Loads and executes a JS file in the tab."""
     24     with open(os.path.join(os.path.dirname(__file__), js_file_name)) as f:
     25       js = f.read()
     26       tab.ExecuteJavaScript(js)
     27 
     28   def WaitForEvent(self, tab, selector, event_name, timeout):
     29     """Halts media action until the selector's event is fired.
     30 
     31     Args:
     32       tab: The tab to check for event on.
     33       selector: Media element selector.
     34       event_name: Name of the event to check if fired or not.
     35       timeout: Timeout to check for event, throws an exception if not fired.
     36     """
     37     util.WaitFor(lambda:
     38                      self.HasEventCompletedOrError(tab, selector, event_name),
     39                  timeout=timeout)
     40 
     41   def HasEventCompletedOrError(self, tab, selector, event_name):
     42     if tab.EvaluateJavaScript(
     43         'window.__hasEventCompleted("%s", "%s");' % (selector, event_name)):
     44       return True
     45     error = tab.EvaluateJavaScript('window.__error')
     46     if error:
     47       logging.error('Detected media error while waiting for %s: %s', event_name,
     48                     error)
     49       return True
     50     return False
     51