Home | History | Annotate | Download | only in cros
      1 # Copyright 2016 The Chromium OS 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 import logging
      6 import time
      7 
      8 from telemetry.core import exceptions
      9 from autotest_lib.client.bin import utils
     10 from autotest_lib.client.common_lib import error
     11 from autotest_lib.client.common_lib.cros import chrome
     12 
     13 DEFAULT_TIMEOUT = 30
     14 SHORT_TIMEOUT = 5
     15 
     16 
     17 def get_webview_contexts(browser, ext_id):
     18     """Get all webview contexts for an extension.
     19 
     20     @param browser: Telemetry browser object.
     21     @param ext_id: Extension id of the kiosk app.
     22     @return A list of webview contexts.
     23     """
     24     ext_contexts = wait_for_kiosk_ext(browser, ext_id)
     25 
     26     for context in ext_contexts:
     27         context.WaitForDocumentReadyStateToBeInteractiveOrBetter()
     28         tagName = context.EvaluateJavaScript(
     29             "document.querySelector('webview') ? 'WEBVIEW' : 'NOWEBVIEW'")
     30         if tagName == "WEBVIEW":
     31             def _webview_context():
     32                 try:
     33                     return context.GetWebviewContexts()
     34                 except (chrome.Error):
     35                     logging.exception(
     36                         'An error occured while getting the webview contexts.')
     37                 return None
     38 
     39             return utils.poll_for_condition(
     40                     _webview_context,
     41                     exception=error.TestFail('Webview not available.'),
     42                     timeout=DEFAULT_TIMEOUT,
     43                     sleep_interval=1)
     44 
     45 
     46 # TODO(dtosic): deprecate this method in favor of 'get_webview_contexts()'
     47 def get_webview_context(browser, ext_id):
     48     """Get context for CFM webview.
     49 
     50     @param browser: Telemetry browser object.
     51     @param ext_id: Extension id of the kiosk app.
     52     @return webview context.
     53     """
     54     ext_contexts = wait_for_kiosk_ext(browser, ext_id)
     55 
     56     for context in ext_contexts:
     57         context.WaitForDocumentReadyStateToBeInteractiveOrBetter()
     58         tagName = context.EvaluateJavaScript(
     59             "document.querySelector('webview') ? 'WEBVIEW' : 'NOWEBVIEW'")
     60         if tagName == "WEBVIEW":
     61             def _webview_context():
     62                 try:
     63                     wb_contexts = context.GetWebviewContexts()
     64                     if len(wb_contexts) == 1:
     65                         return wb_contexts[0]
     66                     if len(wb_contexts) == 2:
     67                         return wb_contexts[1]
     68 
     69                 except (KeyError, chrome.Error):
     70                     pass
     71                 return None
     72             return utils.poll_for_condition(
     73                     _webview_context,
     74                     exception=error.TestFail('Webview not available.'),
     75                     timeout=DEFAULT_TIMEOUT,
     76                     sleep_interval=1)
     77 
     78 
     79 def wait_for_kiosk_ext(browser, ext_id):
     80     """Wait for kiosk extension launch.
     81 
     82     @param browser: Telemetry browser object.
     83     @param ext_id: Extension id of the kiosk app.
     84     @return extension contexts.
     85     """
     86     def _kiosk_ext_contexts():
     87         try:
     88             ext_contexts = browser.extensions.GetByExtensionId(ext_id)
     89             if len(ext_contexts) > 1:
     90                 return ext_contexts
     91         except (KeyError, chrome.Error):
     92             pass
     93         return []
     94     return utils.poll_for_condition(
     95             _kiosk_ext_contexts,
     96             exception=error.TestFail('Kiosk app failed to launch'),
     97             timeout=DEFAULT_TIMEOUT,
     98             sleep_interval=1)
     99 
    100 
    101 def config_riseplayer(browser, ext_id, app_config_id):
    102     """
    103     Configure Rise Player app with a specific display id.
    104 
    105     Step through the configuration screen of the Rise Player app
    106     which is launched within the browser and enter a display id
    107     within the configuration frame to initiate media display.
    108 
    109     @param browser: browser instance containing the Rise Player kiosk app.
    110     @param ext_id: extension id of the Rise Player Kiosk App.
    111     @param app_config_id: display id for the Rise Player app .
    112 
    113     """
    114     if not app_config_id:
    115         raise error.TestFail(
    116                 'Error in configuring Rise Player: app_config_id is None')
    117     config_js = """
    118                 var frameId = 'btn btn-primary display-register-button'
    119                 document.getElementsByClassName(frameId)[0].click();
    120                 $( "input:text" ).val("%s");
    121                 document.getElementsByClassName(frameId)[4].click();
    122                 """ % app_config_id
    123 
    124     kiosk_webview_context = get_webview_context(
    125             browser, ext_id)
    126     # Wait for the configuration frame to load.
    127     time.sleep(SHORT_TIMEOUT)
    128     kiosk_webview_context.ExecuteJavaScript(config_js)
    129     # TODO (krishnargv): Find a way to verify that content is playing
    130     #                    within the RisePlayer app.
    131     verify_app_config_id = """
    132             /rvashow.*.display&id=%s.*/.test(location.href)
    133             """ % app_config_id
    134     #Verify that Risepplayer successfully validates the display id.
    135     try:
    136         kiosk_webview_context.WaitForJavaScriptCondition(
    137                 verify_app_config_id,
    138                 timeout=DEFAULT_TIMEOUT)
    139     except exceptions.TimeoutException:
    140         raise error.TestFail('Error in configuring Rise Player with id: %s'
    141                              % app_config_id)
    142