| Index: chrome/test/pyautolib/chromotinglib.py | 
| =================================================================== | 
| --- chrome/test/pyautolib/chromotinglib.py	(revision 261231) | 
| +++ chrome/test/pyautolib/chromotinglib.py	(working copy) | 
| @@ -1,619 +0,0 @@ | 
| -# Copyright (c) 2012 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. | 
| - | 
| -"""Includes different methods to drive chromoting UI.""" | 
| - | 
| -import os | 
| -import subprocess | 
| -import sys | 
| -import time | 
| - | 
| -from pyauto_errors import JSONInterfaceError | 
| - | 
| - | 
| -class ChromotingMixIn(object): | 
| -  """MixIn for PyUITest that adds Chromoting-specific methods. | 
| - | 
| -  Prepend it as a base class of a test to enable Chromoting functionality. | 
| -  This is a separate class from PyUITest to avoid namespace collisions. | 
| - | 
| -  Example usage: | 
| -    class ChromotingExample(chromoting.ChromotingMixIn, pyauto.PyUITest): | 
| -      def testShare(self): | 
| -        app = self.InstallApp(self.GetWebappPath()) | 
| -        self.LaunchApp(app) | 
| -        self.Authenticate() | 
| -        self.assertTrue(self.Share()) | 
| -  """ | 
| - | 
| -  def _ExecuteJavascript(self, command, tab_index, windex): | 
| -    """Helper that returns immediately after running a Javascript command. | 
| -    """ | 
| -    try: | 
| -      self.ExecuteJavascript( | 
| -          '%s; window.domAutomationController.send("done");' % command, | 
| -          tab_index, windex) | 
| -      return True | 
| -    except JSONInterfaceError: | 
| -      print '_ExecuteJavascript threw JSONInterfaceError' | 
| -      return False | 
| - | 
| -  def _WaitForJavascriptCondition(self, condition, tab_index, windex, | 
| -                                  timeout=-1): | 
| -    """Waits until the Javascript condition is true. | 
| - | 
| -    This is different from a naive self.WaitUntil(lambda: self.GetDOMValue()) | 
| -    because it uses Javascript to check the condition instead of Python. | 
| - | 
| -    Returns: True if condition is satisfied or otherwise False. | 
| -    """ | 
| -    try: | 
| -      return self.WaitUntil(lambda: self.GetDOMValue( | 
| -          '(%s) ? "1" : ""' % condition, tab_index, windex), timeout) | 
| -    except JSONInterfaceError: | 
| -      print '_WaitForJavascriptCondition threw JSONInterfaceError' | 
| -      return False | 
| - | 
| -  def _ExecuteAndWaitForMode(self, command, mode, tab_index, windex): | 
| -    """ Executes JavaScript and wait for remoting app mode equal to | 
| -    the given mode. | 
| - | 
| -    Returns: True if condition is satisfied or otherwise False. | 
| -    """ | 
| -    if not self._ExecuteJavascript(command, tab_index, windex): | 
| -      return False | 
| -    return self._WaitForJavascriptCondition( | 
| -        'remoting.currentMode == remoting.AppMode.%s' % mode, | 
| -        tab_index, windex) | 
| - | 
| -  def _ExecuteAndWaitForMajorMode(self, command, mode, tab_index, windex): | 
| -    """ Executes JavaScript and wait for remoting app major mode equal to | 
| -    the given mode. | 
| - | 
| -    Returns: True if condition is satisfied or otherwise False. | 
| -    """ | 
| -    if not self._ExecuteJavascript(command, tab_index, windex): | 
| -      return False | 
| -    return self._WaitForJavascriptCondition( | 
| -        'remoting.getMajorMode() == remoting.AppMode.%s' % mode, | 
| -        tab_index, windex) | 
| - | 
| -  def GetWebappPath(self): | 
| -    """Returns the path to the webapp. | 
| - | 
| -    Expects the webapp to be in the same place as the pyautolib binaries. | 
| -    """ | 
| -    return os.path.join(self.BrowserPath(), 'remoting', 'remoting.webapp') | 
| - | 
| -  def _GetHelperRunner(self): | 
| -    """Returns the python binary name that runs chromoting_helper.py.""" | 
| -    if sys.platform.startswith('win'): | 
| -      return 'python' | 
| -    else: | 
| -      return 'suid-python' | 
| - | 
| -  def _GetHelper(self): | 
| -    """Get chromoting_helper.py.""" | 
| -    return os.path.join(os.path.dirname(__file__), 'chromoting_helper.py') | 
| - | 
| -  def InstallHostDaemon(self): | 
| -    """Installs the host daemon.""" | 
| -    subprocess.call([self._GetHelperRunner(), self._GetHelper(), | 
| -                     'install', self.BrowserPath()]) | 
| - | 
| -  def UninstallHostDaemon(self): | 
| -    """Uninstalls the host daemon.""" | 
| -    subprocess.call([self._GetHelperRunner(), self._GetHelper(), | 
| -                     'uninstall', self.BrowserPath()]) | 
| - | 
| -  def ContinueAuth(self, tab_index=1, windex=0): | 
| -    """Starts authentication.""" | 
| -    self.assertTrue( | 
| -        self._WaitForJavascriptCondition('window.remoting && remoting.oauth2', | 
| -                                         tab_index, windex), | 
| -        msg='Timed out while waiting for remoting app to finish loading.') | 
| -    self._ExecuteJavascript('remoting.oauth2.doAuthRedirect();', | 
| -                            tab_index, windex) | 
| - | 
| -  def SignIn(self, email=None, password=None, otp=None, | 
| -                   tab_index=1, windex=0): | 
| -    """Logs a user in. | 
| - | 
| -    PyAuto tests start with a clean profile, so Chromoting tests should call | 
| -    this for every run after launching the app. If email or password is | 
| -    omitted, the user can type it into the browser window manually. | 
| -    """ | 
| -    self.assertTrue( | 
| -        self._WaitForJavascriptCondition('document.getElementById("signIn")', | 
| -                                         tab_index, windex), | 
| -        msg='Unable to redirect for authentication.') | 
| - | 
| -    if email: | 
| -      self._ExecuteJavascript('document.getElementById("Email").value = "%s";' | 
| -                              'document.getElementById("Passwd").focus();' | 
| -                              % email, tab_index, windex) | 
| - | 
| -    if password: | 
| -      self._ExecuteJavascript('document.getElementById("Passwd").value = "%s";' | 
| -                              'document.getElementById("signIn").click();' | 
| -                              % password, tab_index, windex) | 
| - | 
| -    if otp: | 
| -      self.assertTrue( | 
| -          self._WaitForJavascriptCondition( | 
| -              'document.getElementById("smsVerifyPin")', | 
| -              tab_index, windex), | 
| -          msg='Invalid username or password.') | 
| -      self._ExecuteJavascript( | 
| -          'document.getElementById("smsUserPin").value = "%s";' | 
| -          'document.getElementById("smsVerifyPin").click();' % otp, | 
| -          tab_index, windex) | 
| - | 
| -    # If the account adder screen appears, then skip it. | 
| -    self.assertTrue( | 
| -        self._WaitForJavascriptCondition( | 
| -            'document.getElementById("skip") || ' | 
| -            'document.getElementById("submit_approve_access")', | 
| -            tab_index, windex), | 
| -        msg='No "skip adding account" or "approve access" link.') | 
| -    self._ExecuteJavascript( | 
| -        'if (document.getElementById("skip")) ' | 
| -        '{ document.getElementById("skip").click(); }', | 
| -        tab_index, windex) | 
| - | 
| -  def AllowAccess(self, tab_index=1, windex=0): | 
| -    """Allows access to chromoting webapp.""" | 
| -    # Approve access. | 
| -    self.assertTrue( | 
| -        self._WaitForJavascriptCondition( | 
| -            'document.getElementById("submit_approve_access")', | 
| -            tab_index, windex), | 
| -        msg='Did not go to permission page.') | 
| -    self._WaitForJavascriptCondition( | 
| -        '!document.getElementById("submit_approve_access").disabled', | 
| -        tab_index, windex) | 
| -    self._ExecuteJavascript( | 
| -        'document.getElementById("submit_approve_access").click();', | 
| -        tab_index, windex) | 
| - | 
| -    # Wait for some things to be ready. | 
| -    self.assertTrue( | 
| -        self._WaitForJavascriptCondition( | 
| -            'window.remoting && remoting.oauth2 && ' \ | 
| -            'remoting.oauth2.isAuthenticated()', | 
| -            tab_index, windex), | 
| -        msg='OAuth2 authentication failed.') | 
| -    self.assertTrue( | 
| -        self._WaitForJavascriptCondition( | 
| -            'window.localStorage.getItem("remoting-email")', | 
| -            tab_index, windex), | 
| -        msg='Chromoting app did not reload after authentication.') | 
| - | 
| -  def DenyAccess(self, tab_index=1, windex=0): | 
| -    """Deny and then allow access to chromoting webapp.""" | 
| -    self.assertTrue( | 
| -        self._WaitForJavascriptCondition( | 
| -            'document.getElementById("submit_deny_access")', | 
| -            tab_index, windex), | 
| -        msg='Did not go to permission page.') | 
| -    self._WaitForJavascriptCondition( | 
| -        '!document.getElementById("submit_deny_access").disabled', | 
| -        tab_index, windex) | 
| -    self._ExecuteJavascript( | 
| -        'document.getElementById("submit_deny_access").click();', | 
| -        tab_index, windex) | 
| - | 
| -  def SignOut(self, tab_index=1, windex=0): | 
| -    """Signs out from chromoting and signs back in.""" | 
| -    self._ExecuteAndWaitForMode( | 
| -        'document.getElementById("sign-out").click();', | 
| -        'UNAUTHENTICATED', tab_index, windex) | 
| - | 
| -  def Authenticate(self, tab_index=1, windex=0): | 
| -    """Finishes authentication flow for user.""" | 
| -    self.ContinueAuth(tab_index, windex) | 
| -    account = self.GetPrivateInfo()['test_chromoting_account'] | 
| -    self.host.SignIn(account['username'], account['password'], None, | 
| -                    tab_index, windex) | 
| -    self.host.AllowAccess(tab_index, windex) | 
| - | 
| -  def StartMe2Me(self, tab_index=1, windex=0): | 
| -    """Starts Me2Me. """ | 
| -    self._ExecuteJavascript( | 
| -        'document.getElementById("get-started-me2me").click();', | 
| -        tab_index, windex) | 
| -    self.assertTrue( | 
| -        self._WaitForJavascriptCondition( | 
| -            'document.getElementById("me2me-content").hidden == false', | 
| -            tab_index, windex), | 
| -        msg='No me2me content') | 
| - | 
| -  def Share(self, tab_index=1, windex=0): | 
| -    """Generates an access code and waits for incoming connections. | 
| - | 
| -    Returns: | 
| -      The access code on success; None otherwise. | 
| -    """ | 
| -    self._ExecuteAndWaitForMode( | 
| -        'remoting.tryShare();', | 
| -        'HOST_WAITING_FOR_CONNECTION', tab_index, windex) | 
| -    return self.GetDOMValue( | 
| -        'document.getElementById("access-code-display").innerText', | 
| -        tab_index, windex) | 
| - | 
| -  def CancelShare(self, tab_index=1, windex=0): | 
| -    """Stops sharing the desktop on the host side.""" | 
| -    self.assertTrue( | 
| -        self._ExecuteAndWaitForMode( | 
| -            'remoting.cancelShare();', | 
| -            'HOST_SHARE_FINISHED', tab_index, windex), | 
| -        msg='Stopping sharing from the host side failed') | 
| - | 
| -  def CleanupHostList(self, tab_index=1, windex=0): | 
| -    """Removes hosts due to failure on previous stop-daemon""" | 
| -    self.EnableConnectionsInstalled() | 
| -    this_host_name = self.GetDOMValue( | 
| -        'document.getElementById("this-host-name").textContent', | 
| -        tab_index, windex) | 
| -    if this_host_name.endswith(' (offline)'): | 
| -      this_host_name = this_host_name[:-10] | 
| -    self.DisableConnections() | 
| - | 
| -    total_hosts = self.GetDOMValue( | 
| -        'document.getElementById("host-list").childNodes.length', | 
| -        tab_index, windex) | 
| - | 
| -    # Start from the end while deleting bogus hosts | 
| -    index = total_hosts | 
| -    while index > 0: | 
| -      index -= 1 | 
| -      try: | 
| -        hostname = self.GetDOMValue( | 
| -            'document.getElementById("host-list")' | 
| -            '.childNodes[%s].textContent' % index, | 
| -            tab_index, windex) | 
| -        if hostname == this_host_name or \ | 
| -            hostname == this_host_name + ' (offline)': | 
| -          self._ExecuteJavascript( | 
| -              'document.getElementById("host-list")' | 
| -              '.childNodes[%s].childNodes[3].click()' % index, | 
| -              tab_index, windex) | 
| -          self._ExecuteJavascript( | 
| -              'document.getElementById("confirm-host-delete").click()', | 
| -              tab_index, windex) | 
| -      except JSONInterfaceError: | 
| -        print 'Ignore the error on deleting host' | 
| - | 
| -    if self._WaitForJavascriptCondition( | 
| -            'document.getElementById("this-host-connect")' | 
| -            '.getAttribute("data-daemon-state") == "enabled"', | 
| -            tab_index, windex, 1): | 
| -      self.DisableConnections() | 
| - | 
| -  def EnableConnectionsInstalled(self, pin_exercise=False, | 
| -                                 tab_index=1, windex=0): | 
| -    """Enables the remote connections on the host side.""" | 
| -    if sys.platform.startswith('darwin'): | 
| -      subprocess.call([self._GetHelperRunner(), self._GetHelper(), 'enable']) | 
| - | 
| -    self.assertTrue( | 
| -        self._ExecuteAndWaitForMode( | 
| -            'document.getElementById("start-daemon").click();', | 
| -            'HOST_SETUP_ASK_PIN', tab_index, windex), | 
| -        msg='Cannot start host setup') | 
| -    self.assertTrue( | 
| -        self._WaitForJavascriptCondition( | 
| -            'document.getElementById("ask-pin-form").hidden == false', | 
| -            tab_index, windex), | 
| -        msg='No ask pin dialog') | 
| - | 
| -    if pin_exercise: | 
| -      # Cancels the pin prompt | 
| -      self._ExecuteJavascript( | 
| -          'document.getElementById("daemon-pin-cancel").click();', | 
| -          tab_index, windex) | 
| - | 
| -      # Enables again | 
| -      self.assertTrue( | 
| -          self._ExecuteAndWaitForMode( | 
| -              'document.getElementById("start-daemon").click();', | 
| -              'HOST_SETUP_ASK_PIN', tab_index, windex), | 
| -          msg='Cannot start host setup') | 
| - | 
| -      # Click ok without typing in pins | 
| -      self._ExecuteJavascript( | 
| -          'document.getElementById("daemon-pin-ok").click();', | 
| -          tab_index, windex) | 
| -      self.assertTrue( | 
| -          self._WaitForJavascriptCondition( | 
| -              'document.getElementById("daemon-pin-error-message")', | 
| -              tab_index, windex), | 
| -          msg='No pin error message') | 
| - | 
| -      # Mis-matching pins | 
| -      self._ExecuteJavascript( | 
| -          'document.getElementById("daemon-pin-entry").value = "111111";', | 
| -          tab_index, windex) | 
| -      self._ExecuteJavascript( | 
| -          'document.getElementById("daemon-pin-confirm").value = "123456";', | 
| -          tab_index, windex) | 
| -      self.assertTrue( | 
| -          self._WaitForJavascriptCondition( | 
| -              'document.getElementById("daemon-pin-error-message")', | 
| -              tab_index, windex), | 
| -          msg='No pin error message') | 
| - | 
| -    # Types in correct pins | 
| -    self._ExecuteJavascript( | 
| -        'document.getElementById("daemon-pin-entry").value = "111111";', | 
| -        tab_index, windex) | 
| -    self._ExecuteJavascript( | 
| -        'document.getElementById("daemon-pin-confirm").value = "111111";', | 
| -        tab_index, windex) | 
| -    self.assertTrue( | 
| -        self._ExecuteAndWaitForMode( | 
| -            'document.getElementById("daemon-pin-ok").click();', | 
| -            'HOST_SETUP_PROCESSING', tab_index, windex), | 
| -        msg='Host setup was not started') | 
| - | 
| -    # Handles preference panes | 
| -    self.assertTrue( | 
| -        self._WaitForJavascriptCondition( | 
| -            'remoting.currentMode == remoting.AppMode.HOST_SETUP_DONE', | 
| -            tab_index, windex), | 
| -        msg='Host setup was not done') | 
| - | 
| -    # Dismisses the host config done dialog | 
| -    self.assertTrue( | 
| -        self._WaitForJavascriptCondition( | 
| -            'document.getElementById("host-setup-dialog")' | 
| -            '.childNodes[5].hidden == false', | 
| -            tab_index, windex), | 
| -        msg='No host setup done dialog') | 
| -    self.assertTrue( | 
| -        self._ExecuteAndWaitForMode( | 
| -            'document.getElementById("host-config-done-dismiss").click();', | 
| -            'HOME', tab_index, windex), | 
| -        msg='Failed to dismiss host setup confirmation dialog') | 
| - | 
| -  def EnableConnectionsUninstalledAndCancel(self, tab_index=1, windex=0): | 
| -    """Enables remote connections while host is not installed yet.""" | 
| -    self.assertTrue( | 
| -        self._ExecuteAndWaitForMode( | 
| -            'document.getElementById("start-daemon").click();', | 
| -            'HOST_SETUP_INSTALL', tab_index, windex), | 
| -        msg='Cannot start host install') | 
| -    self.assertTrue( | 
| -        self._ExecuteAndWaitForMode( | 
| -            'document.getElementById("host-config-install-dismiss").click();', | 
| -            'HOME', tab_index, windex), | 
| -        msg='Failed to dismiss host install dialog') | 
| - | 
| -  def DisableConnections(self, tab_index=1, windex=0): | 
| -    """Disables the remote connections on the host side.""" | 
| -    if sys.platform.startswith('darwin'): | 
| -      subprocess.call([self._GetHelperRunner(), self._GetHelper(), 'disable']) | 
| - | 
| -    # Re-try to make disabling connection more stable | 
| -    for _ in range (1, 4): | 
| -      self._ExecuteJavascript( | 
| -          'document.getElementById("stop-daemon").click();', | 
| -          tab_index, windex) | 
| - | 
| -      # Immediately waiting for host-setup-dialog hidden sometimes times out | 
| -      # even though visually it is hidden. Add some sleep here | 
| -      time.sleep(2) | 
| - | 
| -      if self._WaitForJavascriptCondition( | 
| -          'document.getElementById("host-setup-dialog")' | 
| -          '.childNodes[3].hidden == true', | 
| -          tab_index, windex, 1): | 
| -        break; | 
| - | 
| -    self.assertTrue( | 
| -        self._ExecuteAndWaitForMode( | 
| -            'document.getElementById("host-config-done-dismiss").click();', | 
| -            'HOME', tab_index, windex), | 
| -        msg='Failed to dismiss host setup confirmation dialog') | 
| - | 
| -  def Connect(self, access_code, tab_index=1, windex=0): | 
| -    """Connects to a Chromoting host and starts the session.""" | 
| -    self.assertTrue( | 
| -        self._ExecuteAndWaitForMode( | 
| -            'document.getElementById("access-code-entry").value = "%s";' | 
| -            'remoting.connectIt2Me();' % access_code, | 
| -            'IN_SESSION', tab_index, windex), | 
| -        msg='Cannot connect it2me session') | 
| - | 
| -  def ChangePin(self, pin='222222', tab_index=1, windex=0): | 
| -    """Changes pin for enabled host.""" | 
| -    if sys.platform.startswith('darwin'): | 
| -      subprocess.call([self._GetHelperRunner(), self._GetHelper(), 'changepin']) | 
| - | 
| -    self.assertTrue( | 
| -        self._ExecuteAndWaitForMode( | 
| -            'document.getElementById("change-daemon-pin").click();', | 
| -            'HOST_SETUP_ASK_PIN', tab_index, windex), | 
| -        msg='Cannot change daemon pin') | 
| -    self.assertTrue( | 
| -        self._WaitForJavascriptCondition( | 
| -            'document.getElementById("ask-pin-form").hidden == false', | 
| -            tab_index, windex), | 
| -        msg='No ask pin dialog') | 
| - | 
| -    self._ExecuteJavascript( | 
| -        'document.getElementById("daemon-pin-entry").value = "' + pin + '";', | 
| -        tab_index, windex) | 
| -    self._ExecuteJavascript( | 
| -        'document.getElementById("daemon-pin-confirm").value = "' + | 
| -        pin + '";', tab_index, windex) | 
| -    self.assertTrue( | 
| -        self._ExecuteAndWaitForMode( | 
| -            'document.getElementById("daemon-pin-ok").click();', | 
| -            'HOST_SETUP_PROCESSING', tab_index, windex), | 
| -        msg='Host setup was not started') | 
| - | 
| -    # Handles preference panes | 
| -    self.assertTrue( | 
| -        self._WaitForJavascriptCondition( | 
| -            'remoting.currentMode == remoting.AppMode.HOST_SETUP_DONE', | 
| -            tab_index, windex), | 
| -        msg='Host setup was not done') | 
| - | 
| -    # Dismisses the host config done dialog | 
| -    self.assertTrue( | 
| -        self._WaitForJavascriptCondition( | 
| -            'document.getElementById("host-setup-dialog")' | 
| -            '.childNodes[5].hidden == false', | 
| -            tab_index, windex), | 
| -        msg='No host setup done dialog') | 
| -    self.assertTrue( | 
| -        self._ExecuteAndWaitForMode( | 
| -            'document.getElementById("host-config-done-dismiss").click();', | 
| -            'HOME', tab_index, windex), | 
| -        msg='Failed to dismiss host setup confirmation dialog') | 
| - | 
| -  def ChangeName(self, new_name='Changed', tab_index=1, windex=0): | 
| -    """Changes the host name.""" | 
| -    self._ExecuteJavascript( | 
| -        'document.getElementById("this-host-rename").click();', | 
| -        tab_index, windex) | 
| -    self._ExecuteJavascript( | 
| -        'document.getElementById("this-host-name").childNodes[0].value = "' + | 
| -        new_name + '";', tab_index, windex) | 
| -    self._ExecuteJavascript( | 
| -        'document.getElementById("this-host-rename").click();', | 
| -        tab_index, windex) | 
| - | 
| -  def ConnectMe2Me(self, pin='111111', mode='IN_SESSION', | 
| -                   tab_index=1, windex=0): | 
| -    """Connects to a Chromoting host and starts the session.""" | 
| - | 
| -    # There is delay from the enabling remote connections to the host | 
| -    # showing up in the host list. We need to reload the web app to get | 
| -    # the host to show up. We will repeat this a few times to make sure | 
| -    # eventually host appears. | 
| -    for _ in range(1, 13): | 
| -      self._ExecuteJavascript( | 
| -          'window.location.reload();', | 
| -          tab_index, windex) | 
| - | 
| -      # pyauto _GetResultFromJSONRequest throws JSONInterfaceError after | 
| -      # 45 seconds if ExecuteJavascript is called right after reload. | 
| -      # Waiting 2s here can avoid this. So instead of getting the error and | 
| -      # wait 45s, we wait 2s here. If the error still happens, the following | 
| -      # retry will handle that. | 
| -      time.sleep(2) | 
| - | 
| -      # If this-host-connect is still not enabled, let's retry one more time. | 
| -      this_host_connect_enabled = False | 
| -      for _ in range(1, 3): | 
| -        daemon_state_enabled = self._WaitForJavascriptCondition( | 
| -            'document.getElementById("this-host-connect")' | 
| -            '.getAttribute("data-daemon-state") == "enabled"', | 
| -            tab_index, windex, 1) | 
| -        host_online = self._WaitForJavascriptCondition( | 
| -            'document.getElementById("this-host-name")' | 
| -            '.textContent.toString().indexOf("offline") == -1', | 
| -            tab_index, windex, 1) | 
| -        this_host_connect_enabled = daemon_state_enabled and host_online | 
| -        if this_host_connect_enabled: | 
| -          break | 
| -      if this_host_connect_enabled: | 
| -        break; | 
| - | 
| -    # Clicking this-host-connect does work right after this-host-connect | 
| -    # is enabled. Need to retry. | 
| -    for _ in range(1, 4): | 
| -      self._ExecuteJavascript( | 
| -          'document.getElementById("this-host-connect").click();', | 
| -          tab_index, windex) | 
| - | 
| -      # pyauto _GetResultFromJSONRequest throws JSONInterfaceError after | 
| -      # a long time out if WaitUntil is called right after click. | 
| -      # Waiting 2s here can avoid this. | 
| -      time.sleep(2) | 
| - | 
| -      # If cannot detect that pin-form appears, retry one more time. | 
| -      pin_form_exposed = False | 
| -      for _ in range(1, 3): | 
| -        pin_form_exposed = self._WaitForJavascriptCondition( | 
| -            'document.getElementById("client-dialog")' | 
| -            '.childNodes[9].hidden == false', | 
| -            tab_index, windex, 1) | 
| -        if pin_form_exposed: | 
| -          break | 
| - | 
| -      if pin_form_exposed: | 
| -        break | 
| - | 
| -      # Dismiss connect failure dialog before retry | 
| -      if self._WaitForJavascriptCondition( | 
| -          'document.getElementById("client-dialog")' | 
| -          '.childNodes[25].hidden == false', | 
| -          tab_index, windex, 1): | 
| -        self._ExecuteJavascript( | 
| -            'document.getElementById("client-finished-me2me-button")' | 
| -            '.click();', | 
| -            tab_index, windex) | 
| - | 
| -    self._ExecuteJavascript( | 
| -        'document.getElementById("pin-entry").value = "' + pin + '";', | 
| -        tab_index, windex) | 
| -    self.assertTrue( | 
| -        self._ExecuteAndWaitForMode( | 
| -            'document.getElementById("pin-form").childNodes[5].click();', | 
| -            mode, tab_index, windex), | 
| -        msg='Session was not started') | 
| - | 
| -  def Disconnect(self, tab_index=1, windex=0): | 
| -    """Disconnects from the Chromoting it2me session on the client side.""" | 
| -    self.assertTrue( | 
| -        self._ExecuteAndWaitForMode( | 
| -            'remoting.disconnect();', | 
| -            'CLIENT_SESSION_FINISHED_IT2ME', tab_index, windex), | 
| -        msg='Disconnecting it2me session from the client side failed') | 
| - | 
| -  def DisconnectMe2Me(self, confirmation=True, tab_index=1, windex=0): | 
| -    """Disconnects from the Chromoting me2me session on the client side.""" | 
| -    self.assertTrue( | 
| -        self._ExecuteAndWaitForMode( | 
| -            'remoting.disconnect();', | 
| -            'CLIENT_SESSION_FINISHED_ME2ME', tab_index, windex), | 
| -        msg='Disconnecting me2me session from the client side failed') | 
| - | 
| -    if confirmation: | 
| -      self.assertTrue( | 
| -          self._ExecuteAndWaitForMode( | 
| -              'document.getElementById("client-finished-me2me-button")' | 
| -              '.click();', 'HOME', tab_index, windex), | 
| -          msg='Failed to dismiss session finished dialog') | 
| - | 
| -  def ReconnectMe2Me(self, pin='111111', tab_index=1, windex=0): | 
| -    """Reconnects the me2me session.""" | 
| -    self._ExecuteJavascript( | 
| -        'document.getElementById("client-reconnect-button").click();', | 
| -        tab_index, windex) | 
| - | 
| -    # pyauto _GetResultFromJSONRequest throws JSONInterfaceError after | 
| -    # a long time out if WaitUntil is called right after click. | 
| -    time.sleep(2) | 
| - | 
| -    # If cannot detect that pin-form appears, retry one more time. | 
| -    for _ in range(1, 3): | 
| -      pin_form_exposed = self._WaitForJavascriptCondition( | 
| -          'document.getElementById("client-dialog")' | 
| -          '.childNodes[9].hidden == false', | 
| -          tab_index, windex, 1) | 
| -      if pin_form_exposed: | 
| -        break | 
| - | 
| -    self._ExecuteJavascript( | 
| -        'document.getElementById("pin-entry").value = "' + pin + '";', | 
| -        tab_index, windex) | 
| -    self.assertTrue( | 
| -        self._ExecuteAndWaitForMode( | 
| -            'document.getElementById("pin-form").childNodes[5].click();', | 
| -            'IN_SESSION', tab_index, windex), | 
| -        msg='Session was not started when reconnecting') | 
|  |