15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import logging
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import re
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import pyauto_functional  # Must be imported before pyauto
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import pyauto
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import test_utils
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InfobarTest(pyauto.PyUITest):
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """TestCase for Infobars."""
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Debug(self):
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Test method for experimentation.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    This method will not run automatically.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    To run:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      python chrome/test/functional/infobars.py infobars.InfobarTest.Debug
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while True:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      raw_input('Hit <enter> to dump info.. ')
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      info = self.GetBrowserInfo()
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for window in info['windows']:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for tab in window['tabs']:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          print 'Window', window['index'], 'tab', tab['index']
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          self.pprint(tab['infobars'])
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def setUp(self):
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pyauto.PyUITest.setUp(self)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._flash_plugin_type = 'Plug-in'
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.GetBrowserInfo()['properties']['branding'] == 'Google Chrome':
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self._flash_plugin_type = 'Pepper Plugin'
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Forcibly trigger all plugins to get registered.  crbug.com/94123
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Sometimes flash files loaded too quickly after firing browser
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # ends up getting downloaded, which seems to indicate that the plugin
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # hasn't been registered yet.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.GetPluginsInfo()
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _GetTabInfo(self, windex=0, tab_index=0):
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Helper to return info for the given tab in the given window.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Defaults to first tab in first window.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self.GetBrowserInfo()['windows'][windex]['tabs'][tab_index]
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPluginCrashInfobar(self):
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Verify the "plugin crashed" infobar."""
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash_url = self.GetFileURLForContentDataPath('plugin', 'flash.swf')
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Trigger flash plugin
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.NavigateToURL(flash_url)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_processes = self.GetBrowserInfo()['child_processes']
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash = [x for x in child_processes if
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             x['type'] == self._flash_plugin_type and
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             x['name'] == 'Shockwave Flash'][0]
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(flash)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    logging.info('Killing flash plugin. pid %d' % flash['pid'])
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.Kill(flash['pid'])
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(self.WaitForInfobarCount(1))
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    crash_infobar = self._GetTabInfo()['infobars']
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(crash_infobar)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, len(crash_infobar))
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue('crashed' in crash_infobar[0]['text'])
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('confirm_infobar', crash_infobar[0]['type'])
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Dismiss the infobar
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.PerformActionOnInfobar('dismiss', infobar_index=0)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(self._GetTabInfo()['infobars'])
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _VerifyGeolocationInfobar(self, windex, tab_index):
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Verify geolocation infobar properties.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Assumes that geolocation infobar is showing up in the given tab in the
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    given window.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # TODO(dyu): Remove this helper function when a function to identify
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # infobar_type and index of the type is implemented.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tab_info = self._GetTabInfo(windex, tab_index)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    geolocation_infobar = tab_info['infobars']
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(geolocation_infobar)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(1, len(geolocation_infobar))
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('Learn more', geolocation_infobar[0]['link_text'])
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, len(geolocation_infobar[0]['buttons']))
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('Allow', geolocation_infobar[0]['buttons'][0])
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual('Deny', geolocation_infobar[0]['buttons'][1])
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGeolocationInfobar(self):
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Verify geoLocation infobar."""
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url = self.GetHttpURLForDataPath('geolocation', 'geolocation_on_load.html')
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.NavigateToURL(url)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(self.WaitForInfobarCount(1))
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._VerifyGeolocationInfobar(windex=0, tab_index=0)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Accept, and verify that the infobar went away
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.PerformActionOnInfobar('accept', infobar_index=0)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(self._GetTabInfo()['infobars'])
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGeolocationInfobarInMultipleTabsAndWindows(self):
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Verify GeoLocation inforbar in multiple tabs."""
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url = self.GetFileURLForDataPath(  # triggers geolocation
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'geolocation', 'geolocation_on_load.html')
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for tab_index in range(1, 2):
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.AppendTab(pyauto.GURL(url))
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          self.WaitForInfobarCount(1, windex=0, tab_index=tab_index))
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self._VerifyGeolocationInfobar(windex=0, tab_index=tab_index)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Try in a new window
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.OpenNewBrowserWindow(True)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.NavigateToURL(url, 1, 0)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(self.WaitForInfobarCount(1, windex=1, tab_index=0))
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._VerifyGeolocationInfobar(windex=1, tab_index=0)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Incognito window
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.NavigateToURL(url, 2, 0)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(self.WaitForInfobarCount(1, windex=2, tab_index=0))
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._VerifyGeolocationInfobar(windex=2, tab_index=0)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _GetFlashCrashInfobarCount(self, windex=0, tab_index=0):
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Returns the count of 'Shockwave Flash has crashed' infobars."""
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_window = self.GetBrowserInfo()['windows'][windex]
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    infobars = browser_window['tabs'][tab_index]['infobars']
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash_crash_infobar_count = 0
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for infobar in infobars:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (('text' in infobar) and
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          infobar['text'].startswith('Shockwave Flash has crashed')):
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        flash_crash_infobar_count += 1
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return flash_crash_infobar_count
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPluginCrashForMultiTabs(self):
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Verify plugin crash infobar shows up only on the tabs using plugin."""
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    non_flash_url = self.GetFileURLForDataPath('english_page.html')
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash_url = self.GetFileURLForContentDataPath('plugin', 'FlashSpin.swf')
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # False = Non flash url, True = Flash url
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # We have set of these values to compare a flash page and a non-flash page
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    urls_type = [False, True, False, True, False]
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for _ in range(2):
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.AppendTab(pyauto.GURL(flash_url))
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.AppendTab(pyauto.GURL(non_flash_url))
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Killing flash process
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_processes = self.GetBrowserInfo()['child_processes']
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash = [x for x in child_processes if
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             x['type'] == self._flash_plugin_type and
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             x['name'] == 'Shockwave Flash'][0]
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(flash)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.Kill(flash['pid'])
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Crash plugin infobar should show up in the second tab of this window
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # so passing window and tab argument in the wait for an infobar.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(self.WaitForInfobarCount(1, windex=0, tab_index=1))
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for i in range(len(urls_type)):
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Verify that if page doesn't have flash plugin,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # it should not have infobar popped-up
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.ActivateTab(i)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if not urls_type[i]:
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEqual(
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            self._GetFlashCrashInfobarCount(0, i), 0,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            msg='Did not expect crash infobar in tab at index %d' % i)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      elif urls_type[i]:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEqual(
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            self._GetFlashCrashInfobarCount(0, i), 1,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            msg='Expected crash infobar in tab at index %d' % i)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        infobar = self.GetBrowserInfo()['windows'][0]['tabs'][i]['infobars']
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEqual(infobar[0]['type'], 'confirm_infobar')
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEqual(len(infobar), 1)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OneClickInfobarTest(pyauto.PyUITest):
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Tests for one-click sign in infobar."""
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BLOCK_COOKIE_PATTERN = {'https://accounts.google.com/': {'cookies': 2}}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OC_INFOBAR_TYPE = 'oneclicklogin_infobar'
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PW_INFOBAR_TYPE = 'password_infobar'
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URL = 'https://www.google.com/accounts/ServiceLogin'
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URL_LOGIN = 'https://www.google.com/accounts/Login'
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URL_LOGOUT = 'https://www.google.com/accounts/Logout'
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def setUp(self):
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pyauto.PyUITest.setUp(self)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver = self.NewWebDriver()
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _LogIntoGoogleAccount(self, tab_index=0, windex=0):
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Log into Google account.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tab_index: The tab index, default is 0.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      windex: The window index, default is 0.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    creds = self.GetPrivateInfo()['test_google_account']
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    username = creds['username']
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    password = creds['password']
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_utils.GoogleAccountsLogin(self, username, password, tab_index, windex)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # TODO(dyu): Use WaitUntilNavigationCompletes after investigating
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # crbug.com/124877
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WaitUntil(
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lambda: self.GetDOMValue('document.readyState'),
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        expect_retval='complete')
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _PerformActionOnInfobar(self, action):
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Perform an action on the infobar: accept, cancel, or dismiss.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    The one-click sign in infobar must show in the first tab of the first
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window. If action is 'accept' then the account is synced. If the action is
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cancel' then the infobar should be dismissed and never shown again. The
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    account will not be synced. If the action is 'dismiss' then the infobar will
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shown again after the next login.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      action: The action to perform on the infobar.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    infobar_index = test_utils.WaitForInfobarTypeAndGetIndex(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self, self.OC_INFOBAR_TYPE)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.PerformActionOnInfobar(action, infobar_index)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _DisplayOneClickInfobar(self, tab_index=0, windex=0):
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """One-click sign in infobar appears after logging into google account.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tab_index: The tab index, default is 0.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      windex: The window index, default is 0.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._LogIntoGoogleAccount(tab_index=tab_index, windex=windex)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(self.WaitUntil(
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lambda: test_utils.GetInfobarIndexByType(
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            self, self.OC_INFOBAR_TYPE,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            tab_index=tab_index, windex=windex) is not None),
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    msg='The one-click login infobar did not appear.')
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDisplayOneClickInfobar(self):
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Verify one-click infobar appears after login into google account.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    One-click infobar should appear after signing into a google account
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for the first time using a clean profile.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._DisplayOneClickInfobar()
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNoOneClickInfobarAfterCancel(self):
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Verify one-click infobar does not appear again after clicking cancel.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    The one-click infobar should not display again after logging into an
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    account and selecting to reject sync the first time. The test covers
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    restarting the browser with the same profile and verifying the one-click
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    infobar does not show after login.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    This test also verifies that the password infobar displays.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._DisplayOneClickInfobar()
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._PerformActionOnInfobar(action='cancel')  # Click 'No thanks' button.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.NavigateToURL(self.URL_LOGOUT)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._LogIntoGoogleAccount()
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_utils.WaitForInfobarTypeAndGetIndex(self, self.PW_INFOBAR_TYPE)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_utils.AssertInfobarTypeDoesNotAppear(self, self.OC_INFOBAR_TYPE)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Restart browser with the same profile.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.RestartBrowser(clear_profile=False)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.NavigateToURL(self.URL_LOGOUT)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._LogIntoGoogleAccount()
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_utils.AssertInfobarTypeDoesNotAppear(self, self.OC_INFOBAR_TYPE)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDisplayOneClickInfobarAfterDismiss(self):
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Verify one-click infobar appears again after clicking dismiss button.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    The one-click infobar should display again after logging into an
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    account and clicking to dismiss the infobar the first time.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    This test also verifies that the password infobar does not display.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    The one-click infobar should supersede the password infobar.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._DisplayOneClickInfobar()
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._PerformActionOnInfobar(action='dismiss')  # Click 'x' button.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.NavigateToURL(self.URL_LOGOUT)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._LogIntoGoogleAccount()
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_utils.WaitForInfobarTypeAndGetIndex(self, self.OC_INFOBAR_TYPE)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_utils.AssertInfobarTypeDoesNotAppear(self, self.PW_INFOBAR_TYPE)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _OpenSecondProfile(self):
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Create a second profile."""
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.OpenNewBrowserWindowWithNewProfile()
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(2, len(self.GetMultiProfileInfo()['profiles']),
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        msg='The second profile was not created.')
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDisplayOneClickInfobarPerProfile(self):
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Verify one-click infobar appears for each profile after sign-in."""
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Default profile.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._DisplayOneClickInfobar()
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._OpenSecondProfile()
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._DisplayOneClickInfobar(windex=1)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNoOneClickInfobarWhenCookiesBlocked(self):
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Verify one-click infobar does not show when cookies are blocked.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    One-click sign in should not be enabled if cookies are blocked for Google
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    accounts domain.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    This test verifies the following bug: crbug.com/117841
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Block cookies for Google accounts domain.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.SetPrefs(pyauto.kContentSettingsPatternPairs,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  self.BLOCK_COOKIE_PATTERN)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._LogIntoGoogleAccount()
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_utils.AssertInfobarTypeDoesNotAppear(self, self.OC_INFOBAR_TYPE)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testOneClickInfobarShownWhenWinLoseFocus(self):
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Verify one-click infobar still shows when window loses focus.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    This test verifies the following bug: crbug.com/121739
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._LogIntoGoogleAccount()
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_utils.WaitForInfobarTypeAndGetIndex(self, self.OC_INFOBAR_TYPE)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Open new window to shift focus away.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.OpenNewBrowserWindow(True)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_utils.GetInfobarIndexByType(self, self.OC_INFOBAR_TYPE)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNoOneClickInfobarInIncognito(self):
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Verify that one-click infobar does not show up in incognito mode."""
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._LogIntoGoogleAccount(windex=1)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_utils.AssertInfobarTypeDoesNotAppear(
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self, self.OC_INFOBAR_TYPE, windex=1)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pyauto_functional.Main()
323