blob: fff4278ca022f3d10ab912f9bbe33f9b21c90eae [file] [log] [blame]
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from functools import partial
import logging
from telemetry.core import exceptions
from telemetry.internal.browser import web_contents
import py_utils
class Oobe(web_contents.WebContents):
def __init__(self, inspector_backend):
super(Oobe, self).__init__(inspector_backend)
def _GaiaIFrameContext(self):
max_context_id = self.EnableAllContexts()
logging.debug('%d contexts in Gaia page' % max_context_id)
for gaia_iframe_context in range(max_context_id + 1):
try:
if self.EvaluateJavaScript(
"document.readyState == 'complete' && "
"document.getElementById('Email') != null",
context_id=gaia_iframe_context):
return gaia_iframe_context
except exceptions.EvaluateException:
pass
return None
def _GaiaWebviewContext(self):
webview_contexts = self.GetWebviewContexts()
if webview_contexts:
return webview_contexts[0]
return None
def _ExecuteOobeApi(self, api, *args):
logging.info('Invoking %s' % api)
self.WaitForJavaScriptCondition("typeof Oobe == 'function'", timeout=120)
if self.EvaluateJavaScript(
"typeof {{ @api }} == 'undefined'", api=api):
raise exceptions.LoginException('%s js api missing' % api)
# Example values:
# |api|: 'doLogin'
# |args|: ['username', 'pass', True]
# Executes: 'doLogin("username", "pass", true)'
self.ExecuteJavaScript('{{ @f }}({{ *args }})', f=api, args=args)
def NavigateGuestLogin(self):
"""Logs in as guest."""
self._ExecuteOobeApi('Oobe.guestLoginForTesting')
def NavigateFakeLogin(self, username, password, gaia_id,
enterprise_enroll=False):
"""Fake user login."""
self._ExecuteOobeApi('Oobe.loginForTesting', username, password, gaia_id,
enterprise_enroll)
def NavigateGaiaLogin(self, username, password,
enterprise_enroll=False,
for_user_triggered_enrollment=False):
"""Logs in using the GAIA webview or IFrame, whichever is
present. |enterprise_enroll| allows for enterprise enrollment.
|for_user_triggered_enrollment| should be False for remora enrollment."""
self._ExecuteOobeApi('Oobe.skipToLoginForTesting')
if for_user_triggered_enrollment:
self._ExecuteOobeApi('Oobe.switchToEnterpriseEnrollmentForTesting')
self._NavigateGaiaLogin(username, password, enterprise_enroll)
if enterprise_enroll:
self.WaitForJavaScriptCondition(
'Oobe.isEnrollmentSuccessfulForTest()', timeout=30)
self._ExecuteOobeApi('Oobe.enterpriseEnrollmentDone')
def _NavigateGaiaLogin(self, username, password, enterprise_enroll):
"""Invokes NavigateIFrameLogin or NavigateWebViewLogin as appropriate."""
def _GetGaiaFunction():
if self._GaiaWebviewContext() is not None:
return partial(Oobe._NavigateWebViewLogin,
wait_for_close=not enterprise_enroll)
elif self._GaiaIFrameContext() is not None:
return partial(Oobe._NavigateIFrameLogin,
add_user_for_testing=not enterprise_enroll)
return None
py_utils.WaitFor(_GetGaiaFunction, 20)(self, username, password)
def _NavigateIFrameLogin(self, username, password, add_user_for_testing):
"""Logs into the IFrame-based GAIA screen"""
gaia_iframe_context = py_utils.WaitFor(self._GaiaIFrameContext, timeout=30)
if add_user_for_testing:
self._ExecuteOobeApi('Oobe.showAddUserForTesting')
self.ExecuteJavaScript("""
document.getElementById('Email').value= {{ username }};
document.getElementById('Passwd').value= {{ password }};
document.getElementById('signIn').click();""",
username=username, password=password,
context_id=gaia_iframe_context)
def _NavigateWebViewLogin(self, username, password, wait_for_close):
"""Logs into the webview-based GAIA screen"""
self._NavigateWebViewEntry('identifierId', username, 'identifierNext')
self._NavigateWebViewEntry('password', password, 'passwordNext')
if wait_for_close:
py_utils.WaitFor(lambda: not self._GaiaWebviewContext(), 60)
def _NavigateWebViewEntry(self, field, value, next_field):
self._WaitForField(field)
self._WaitForField(next_field)
gaia_webview_context = self._GaiaWebviewContext()
gaia_webview_context.EvaluateJavaScript("""
document.getElementById({{ field }}).value= {{ value }};
document.getElementById({{ next_field }}).click()""",
field=field, value=value, next_field=next_field)
def _WaitForField(self, field):
gaia_webview_context = py_utils.WaitFor(self._GaiaWebviewContext, 5)
py_utils.WaitFor(gaia_webview_context.HasReachedQuiescence, 20)
gaia_webview_context.WaitForJavaScriptCondition(
"document.getElementById({{ field }}) != null",
field=field, timeout=20)