98 lines
3.2 KiB
98 lines
3.2 KiB
# Lint as: python2, python3
|
|
# Copyright 2016 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
"""Utils for webrtc-related functionality.
|
|
|
|
Note that this module is shared by both server side and client side.
|
|
Do not put something only usable in client side in this module.
|
|
|
|
"""
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import print_function
|
|
import logging
|
|
import time
|
|
import uuid
|
|
import six
|
|
|
|
|
|
class AppRTCParameters(object):
|
|
"""Class to hold parameters for AppRTC webpage."""
|
|
def __init__(self):
|
|
"""Initializes an AppRTCParameters."""
|
|
self.debug = 'loopback'
|
|
self.audio = {'googEchoCancellation': False,
|
|
'googAutoGainControl': False,
|
|
'googNoiseReduction': False}
|
|
|
|
|
|
def _get_audio_parameter_string(self):
|
|
"""Converts the audio parameters into parameter string used in URL.
|
|
|
|
@return: Audio parameter string like "audio=googEchoCancellation=False,..."
|
|
|
|
"""
|
|
audio_params = []
|
|
for key, value in six.iteritems(self.audio):
|
|
audio_params.append('%s=%s' % (key, 'true' if value else 'false'))
|
|
audio_params_str = ','.join(audio_params)
|
|
return audio_params_str
|
|
|
|
|
|
def get_parameter_string(self):
|
|
"""Converts the parameters into parameter string used in URL.
|
|
|
|
@return: Parameter string used in URL.
|
|
|
|
"""
|
|
param_str = '?debug=%s' % self.debug
|
|
param_str += '&'
|
|
param_str += 'audio=' + self._get_audio_parameter_string()
|
|
return param_str
|
|
|
|
|
|
class AppRTCController(object):
|
|
"""Class to control AppRTC webpage."""
|
|
|
|
BASE_URL = 'https://appr.tc/r/'
|
|
WAIT_FOR_JOIN_CALL_SECS = 10
|
|
CLICK_JOIN_BUTTON_TIMEOUT_SECS = 10
|
|
|
|
def __init__(self, browser_facade):
|
|
"""Initializes an AppRTCController.
|
|
|
|
@param browser_facade: A BrowserFacadeNative (for client side) or
|
|
BrowserFacadeAdapter (for server side).
|
|
|
|
"""
|
|
# Only use default parameters for now. If different parameter is needed
|
|
# we can takes an AppRTCParameters from argument.
|
|
self.param = AppRTCParameters()
|
|
self.browser_facade = browser_facade
|
|
|
|
|
|
def new_apprtc_loopback_page(self):
|
|
"""Loads a AppRTC webpage in a new tab with loopback enabled."""
|
|
room_name = str(uuid.uuid4())
|
|
url = self.BASE_URL + room_name + self.param.get_parameter_string()
|
|
logging.debug('Open AppRTC loopback page %s', url)
|
|
tab_desc = self.browser_facade.new_tab(url)
|
|
self.click_join_button(tab_desc)
|
|
# After clicking join button, it takes some time to actually join the
|
|
# call.
|
|
time.sleep(self.WAIT_FOR_JOIN_CALL_SECS)
|
|
|
|
|
|
def click_join_button(self, tab_desc):
|
|
"""Clicks 'join' button on the webpage.
|
|
|
|
@param tab_desc: Tab descriptor returned by new_tab of browser facade.
|
|
|
|
"""
|
|
click_button_js = """document.getElementById('confirm-join-button').click();"""
|
|
self.browser_facade.execute_javascript(
|
|
tab_desc, click_button_js, self.CLICK_JOIN_BUTTON_TIMEOUT_SECS)
|