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