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"""Utils for webrtc-related functionality. 6 7Note that this module is shared by both server side and client side. 8Do not put something only usable in client side in this module. 9 10""" 11 12import logging 13import time 14import uuid 15 16 17class AppRTCParameters(object): 18 """Class to hold parameters for AppRTC webpage.""" 19 def __init__(self): 20 """Initializes an AppRTCParameters.""" 21 self.debug = 'loopback' 22 self.audio = {'googEchoCancellation': False, 23 'googAutoGainControl': False, 24 'googNoiseReduction': False} 25 26 27 def _get_audio_parameter_string(self): 28 """Converts the audio parameters into parameter string used in URL. 29 30 @return: Audio parameter string like "audio=googEchoCancellation=False,..." 31 32 """ 33 audio_params = [] 34 for key, value in self.audio.iteritems(): 35 audio_params.append('%s=%s' % (key, 'true' if value else 'false')) 36 audio_params_str = ','.join(audio_params) 37 return audio_params_str 38 39 40 def get_parameter_string(self): 41 """Converts the parameters into parameter string used in URL. 42 43 @return: Parameter string used in URL. 44 45 """ 46 param_str = '?debug=%s' % self.debug 47 param_str += '&' 48 param_str += 'audio=' + self._get_audio_parameter_string() 49 return param_str 50 51 52class AppRTCController(object): 53 """Class to control AppRTC webpage.""" 54 55 BASE_URL = 'https://appr.tc/r/' 56 WAIT_FOR_JOIN_CALL_SECS = 10 57 CLICK_JOIN_BUTTON_TIMEOUT_SECS = 10 58 59 def __init__(self, browser_facade): 60 """Initializes an AppRTCController. 61 62 @param browser_facade: A BrowserFacadeNative (for client side) or 63 BrowserFacadeAdapter (for server side). 64 65 """ 66 # Only use default parameters for now. If different parameter is needed 67 # we can takes an AppRTCParameters from argument. 68 self.param = AppRTCParameters() 69 self.browser_facade = browser_facade 70 71 72 def new_apprtc_loopback_page(self): 73 """Loads a AppRTC webpage in a new tab with loopback enabled.""" 74 room_name = str(uuid.uuid4()) 75 url = self.BASE_URL + room_name + self.param.get_parameter_string() 76 logging.debug('Open AppRTC loopback page %s', url) 77 tab_desc = self.browser_facade.new_tab(url) 78 self.click_join_button(tab_desc) 79 # After clicking join button, it takes some time to actually join the 80 # call. 81 time.sleep(self.WAIT_FOR_JOIN_CALL_SECS) 82 83 84 def click_join_button(self, tab_desc): 85 """Clicks 'join' button on the webpage. 86 87 @param tab_desc: Tab descriptor returned by new_tab of browser facade. 88 89 """ 90 click_button_js = """document.getElementById('confirm-join-button').click();""" 91 self.browser_facade.execute_javascript( 92 tab_desc, click_button_js, self.CLICK_JOIN_BUTTON_TIMEOUT_SECS) 93