| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/env python | |
| 2 # Copyright 2013 The Chromium Authors. All rights reserved. | |
| 3 # Use of this source code is governed by a BSD-style license that can be | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 import logging | |
| 7 import os | |
| 8 import re | |
| 9 | |
| 10 import pyauto_functional # Must be imported before pyauto | |
| 11 import pyauto | |
| 12 import test_utils | |
| 13 | |
| 14 | |
| 15 class InfobarTest(pyauto.PyUITest): | |
| 16 """TestCase for Infobars.""" | |
| 17 | |
| 18 def Debug(self): | |
| 19 """Test method for experimentation. | |
| 20 | |
| 21 This method will not run automatically. | |
| 22 To run: | |
| 23 python chrome/test/functional/infobars.py infobars.InfobarTest.Debug | |
| 24 """ | |
| 25 while True: | |
| 26 raw_input('Hit <enter> to dump info.. ') | |
| 27 info = self.GetBrowserInfo() | |
| 28 for window in info['windows']: | |
| 29 for tab in window['tabs']: | |
| 30 print 'Window', window['index'], 'tab', tab['index'] | |
| 31 self.pprint(tab['infobars']) | |
| 32 | |
| 33 def setUp(self): | |
| 34 pyauto.PyUITest.setUp(self) | |
| 35 self._flash_plugin_type = 'Plug-in' | |
| 36 if self.GetBrowserInfo()['properties']['branding'] == 'Google Chrome': | |
| 37 self._flash_plugin_type = 'Pepper Plugin' | |
| 38 # Forcibly trigger all plugins to get registered. crbug.com/94123 | |
| 39 # Sometimes flash files loaded too quickly after firing browser | |
| 40 # ends up getting downloaded, which seems to indicate that the plugin | |
| 41 # hasn't been registered yet. | |
| 42 self.GetPluginsInfo() | |
| 43 | |
| 44 def _GetTabInfo(self, windex=0, tab_index=0): | |
| 45 """Helper to return info for the given tab in the given window. | |
| 46 | |
| 47 Defaults to first tab in first window. | |
| 48 """ | |
| 49 return self.GetBrowserInfo()['windows'][windex]['tabs'][tab_index] | |
| 50 | |
| 51 def testPluginCrashInfobar(self): | |
| 52 """Verify the "plugin crashed" infobar.""" | |
| 53 flash_url = self.GetFileURLForContentDataPath('plugin', 'flash.swf') | |
| 54 # Trigger flash plugin | |
| 55 self.NavigateToURL(flash_url) | |
| 56 child_processes = self.GetBrowserInfo()['child_processes'] | |
| 57 flash = [x for x in child_processes if | |
| 58 x['type'] == self._flash_plugin_type and | |
| 59 x['name'] == 'Shockwave Flash'][0] | |
| 60 self.assertTrue(flash) | |
| 61 logging.info('Killing flash plugin. pid %d' % flash['pid']) | |
| 62 self.Kill(flash['pid']) | |
| 63 self.assertTrue(self.WaitForInfobarCount(1)) | |
| 64 crash_infobar = self._GetTabInfo()['infobars'] | |
| 65 self.assertTrue(crash_infobar) | |
| 66 self.assertEqual(1, len(crash_infobar)) | |
| 67 self.assertTrue('crashed' in crash_infobar[0]['text']) | |
| 68 self.assertEqual('confirm_infobar', crash_infobar[0]['type']) | |
| 69 # Dismiss the infobar | |
| 70 self.PerformActionOnInfobar('dismiss', infobar_index=0) | |
| 71 self.assertFalse(self._GetTabInfo()['infobars']) | |
| 72 | |
| 73 def _VerifyGeolocationInfobar(self, windex, tab_index): | |
| 74 """Verify geolocation infobar properties. | |
| 75 | |
| 76 Assumes that geolocation infobar is showing up in the given tab in the | |
| 77 given window. | |
| 78 """ | |
| 79 # TODO(dyu): Remove this helper function when a function to identify | |
| 80 # infobar_type and index of the type is implemented. | |
| 81 tab_info = self._GetTabInfo(windex, tab_index) | |
| 82 geolocation_infobar = tab_info['infobars'] | |
| 83 self.assertTrue(geolocation_infobar) | |
| 84 self.assertEqual(1, len(geolocation_infobar)) | |
| 85 self.assertEqual('Learn more', geolocation_infobar[0]['link_text']) | |
| 86 self.assertEqual(2, len(geolocation_infobar[0]['buttons'])) | |
| 87 self.assertEqual('Allow', geolocation_infobar[0]['buttons'][0]) | |
| 88 self.assertEqual('Deny', geolocation_infobar[0]['buttons'][1]) | |
| 89 | |
| 90 def testGeolocationInfobar(self): | |
| 91 """Verify geoLocation infobar.""" | |
| 92 url = self.GetHttpURLForDataPath('geolocation', 'geolocation_on_load.html') | |
| 93 self.NavigateToURL(url) | |
| 94 self.assertTrue(self.WaitForInfobarCount(1)) | |
| 95 self._VerifyGeolocationInfobar(windex=0, tab_index=0) | |
| 96 # Accept, and verify that the infobar went away | |
| 97 self.PerformActionOnInfobar('accept', infobar_index=0) | |
| 98 self.assertFalse(self._GetTabInfo()['infobars']) | |
| 99 | |
| 100 def testGeolocationInfobarInMultipleTabsAndWindows(self): | |
| 101 """Verify GeoLocation inforbar in multiple tabs.""" | |
| 102 url = self.GetFileURLForDataPath( # triggers geolocation | |
| 103 'geolocation', 'geolocation_on_load.html') | |
| 104 for tab_index in range(1, 2): | |
| 105 self.AppendTab(pyauto.GURL(url)) | |
| 106 self.assertTrue( | |
| 107 self.WaitForInfobarCount(1, windex=0, tab_index=tab_index)) | |
| 108 self._VerifyGeolocationInfobar(windex=0, tab_index=tab_index) | |
| 109 # Try in a new window | |
| 110 self.OpenNewBrowserWindow(True) | |
| 111 self.NavigateToURL(url, 1, 0) | |
| 112 self.assertTrue(self.WaitForInfobarCount(1, windex=1, tab_index=0)) | |
| 113 self._VerifyGeolocationInfobar(windex=1, tab_index=0) | |
| 114 # Incognito window | |
| 115 self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW) | |
| 116 self.NavigateToURL(url, 2, 0) | |
| 117 self.assertTrue(self.WaitForInfobarCount(1, windex=2, tab_index=0)) | |
| 118 self._VerifyGeolocationInfobar(windex=2, tab_index=0) | |
| 119 | |
| 120 def _GetFlashCrashInfobarCount(self, windex=0, tab_index=0): | |
| 121 """Returns the count of 'Shockwave Flash has crashed' infobars.""" | |
| 122 browser_window = self.GetBrowserInfo()['windows'][windex] | |
| 123 infobars = browser_window['tabs'][tab_index]['infobars'] | |
| 124 flash_crash_infobar_count = 0 | |
| 125 for infobar in infobars: | |
| 126 if (('text' in infobar) and | |
| 127 infobar['text'].startswith('Shockwave Flash has crashed')): | |
| 128 flash_crash_infobar_count += 1 | |
| 129 return flash_crash_infobar_count | |
| 130 | |
| 131 def testPluginCrashForMultiTabs(self): | |
| 132 """Verify plugin crash infobar shows up only on the tabs using plugin.""" | |
| 133 non_flash_url = self.GetFileURLForDataPath('english_page.html') | |
| 134 flash_url = self.GetFileURLForContentDataPath('plugin', 'FlashSpin.swf') | |
| 135 # False = Non flash url, True = Flash url | |
| 136 # We have set of these values to compare a flash page and a non-flash page | |
| 137 urls_type = [False, True, False, True, False] | |
| 138 for _ in range(2): | |
| 139 self.AppendTab(pyauto.GURL(flash_url)) | |
| 140 self.AppendTab(pyauto.GURL(non_flash_url)) | |
| 141 # Killing flash process | |
| 142 child_processes = self.GetBrowserInfo()['child_processes'] | |
| 143 flash = [x for x in child_processes if | |
| 144 x['type'] == self._flash_plugin_type and | |
| 145 x['name'] == 'Shockwave Flash'][0] | |
| 146 self.assertTrue(flash) | |
| 147 self.Kill(flash['pid']) | |
| 148 # Crash plugin infobar should show up in the second tab of this window | |
| 149 # so passing window and tab argument in the wait for an infobar. | |
| 150 self.assertTrue(self.WaitForInfobarCount(1, windex=0, tab_index=1)) | |
| 151 for i in range(len(urls_type)): | |
| 152 # Verify that if page doesn't have flash plugin, | |
| 153 # it should not have infobar popped-up | |
| 154 self.ActivateTab(i) | |
| 155 if not urls_type[i]: | |
| 156 self.assertEqual( | |
| 157 self._GetFlashCrashInfobarCount(0, i), 0, | |
| 158 msg='Did not expect crash infobar in tab at index %d' % i) | |
| 159 elif urls_type[i]: | |
| 160 self.assertEqual( | |
| 161 self._GetFlashCrashInfobarCount(0, i), 1, | |
| 162 msg='Expected crash infobar in tab at index %d' % i) | |
| 163 infobar = self.GetBrowserInfo()['windows'][0]['tabs'][i]['infobars'] | |
| 164 self.assertEqual(infobar[0]['type'], 'confirm_infobar') | |
| 165 self.assertEqual(len(infobar), 1) | |
| 166 | |
| 167 | |
| 168 class OneClickInfobarTest(pyauto.PyUITest): | |
| 169 """Tests for one-click sign in infobar.""" | |
| 170 | |
| 171 BLOCK_COOKIE_PATTERN = {'https://accounts.google.com/': {'cookies': 2}} | |
| 172 OC_INFOBAR_TYPE = 'oneclicklogin_infobar' | |
| 173 PW_INFOBAR_TYPE = 'password_infobar' | |
| 174 URL = 'https://www.google.com/accounts/ServiceLogin' | |
| 175 URL_LOGIN = 'https://www.google.com/accounts/Login' | |
| 176 URL_LOGOUT = 'https://www.google.com/accounts/Logout' | |
| 177 | |
| 178 def setUp(self): | |
| 179 pyauto.PyUITest.setUp(self) | |
| 180 self._driver = self.NewWebDriver() | |
| 181 | |
| 182 def _LogIntoGoogleAccount(self, tab_index=0, windex=0): | |
| 183 """Log into Google account. | |
| 184 | |
| 185 Args: | |
| 186 tab_index: The tab index, default is 0. | |
| 187 windex: The window index, default is 0. | |
| 188 """ | |
| 189 creds = self.GetPrivateInfo()['test_google_account'] | |
| 190 username = creds['username'] | |
| 191 password = creds['password'] | |
| 192 test_utils.GoogleAccountsLogin(self, username, password, tab_index, windex) | |
| 193 # TODO(dyu): Use WaitUntilNavigationCompletes after investigating | |
| 194 # crbug.com/124877 | |
| 195 self.WaitUntil( | |
| 196 lambda: self.GetDOMValue('document.readyState'), | |
| 197 expect_retval='complete') | |
| 198 | |
| 199 def _PerformActionOnInfobar(self, action): | |
| 200 """Perform an action on the infobar: accept, cancel, or dismiss. | |
| 201 | |
| 202 The one-click sign in infobar must show in the first tab of the first | |
| 203 window. If action is 'accept' then the account is synced. If the action is | |
| 204 'cancel' then the infobar should be dismissed and never shown again. The | |
| 205 account will not be synced. If the action is 'dismiss' then the infobar will | |
| 206 shown again after the next login. | |
| 207 | |
| 208 Args: | |
| 209 action: The action to perform on the infobar. | |
| 210 """ | |
| 211 infobar_index = test_utils.WaitForInfobarTypeAndGetIndex( | |
| 212 self, self.OC_INFOBAR_TYPE) | |
| 213 self.PerformActionOnInfobar(action, infobar_index) | |
| 214 | |
| 215 def _DisplayOneClickInfobar(self, tab_index=0, windex=0): | |
| 216 """One-click sign in infobar appears after logging into google account. | |
| 217 | |
| 218 Args: | |
| 219 tab_index: The tab index, default is 0. | |
| 220 windex: The window index, default is 0. | |
| 221 """ | |
| 222 self._LogIntoGoogleAccount(tab_index=tab_index, windex=windex) | |
| 223 self.assertTrue(self.WaitUntil( | |
| 224 lambda: test_utils.GetInfobarIndexByType( | |
| 225 self, self.OC_INFOBAR_TYPE, | |
| 226 tab_index=tab_index, windex=windex) is not None), | |
| 227 msg='The one-click login infobar did not appear.') | |
| 228 | |
| 229 def testDisplayOneClickInfobar(self): | |
| 230 """Verify one-click infobar appears after login into google account. | |
| 231 | |
| 232 One-click infobar should appear after signing into a google account | |
| 233 for the first time using a clean profile. | |
| 234 """ | |
| 235 self._DisplayOneClickInfobar() | |
| 236 | |
| 237 def testNoOneClickInfobarAfterCancel(self): | |
| 238 """Verify one-click infobar does not appear again after clicking cancel. | |
| 239 | |
| 240 The one-click infobar should not display again after logging into an | |
| 241 account and selecting to reject sync the first time. The test covers | |
| 242 restarting the browser with the same profile and verifying the one-click | |
| 243 infobar does not show after login. | |
| 244 | |
| 245 This test also verifies that the password infobar displays. | |
| 246 """ | |
| 247 self._DisplayOneClickInfobar() | |
| 248 self._PerformActionOnInfobar(action='cancel') # Click 'No thanks' button. | |
| 249 self.NavigateToURL(self.URL_LOGOUT) | |
| 250 self._LogIntoGoogleAccount() | |
| 251 test_utils.WaitForInfobarTypeAndGetIndex(self, self.PW_INFOBAR_TYPE) | |
| 252 test_utils.AssertInfobarTypeDoesNotAppear(self, self.OC_INFOBAR_TYPE) | |
| 253 # Restart browser with the same profile. | |
| 254 self.RestartBrowser(clear_profile=False) | |
| 255 self.NavigateToURL(self.URL_LOGOUT) | |
| 256 self._LogIntoGoogleAccount() | |
| 257 test_utils.AssertInfobarTypeDoesNotAppear(self, self.OC_INFOBAR_TYPE) | |
| 258 | |
| 259 def testDisplayOneClickInfobarAfterDismiss(self): | |
| 260 """Verify one-click infobar appears again after clicking dismiss button. | |
| 261 | |
| 262 The one-click infobar should display again after logging into an | |
| 263 account and clicking to dismiss the infobar the first time. | |
| 264 | |
| 265 This test also verifies that the password infobar does not display. | |
| 266 The one-click infobar should supersede the password infobar. | |
| 267 """ | |
| 268 self._DisplayOneClickInfobar() | |
| 269 self._PerformActionOnInfobar(action='dismiss') # Click 'x' button. | |
| 270 self.NavigateToURL(self.URL_LOGOUT) | |
| 271 self._LogIntoGoogleAccount() | |
| 272 test_utils.WaitForInfobarTypeAndGetIndex(self, self.OC_INFOBAR_TYPE) | |
| 273 test_utils.AssertInfobarTypeDoesNotAppear(self, self.PW_INFOBAR_TYPE) | |
| 274 | |
| 275 def _OpenSecondProfile(self): | |
| 276 """Create a second profile.""" | |
| 277 self.OpenNewBrowserWindowWithNewProfile() | |
| 278 self.assertEqual(2, len(self.GetMultiProfileInfo()['profiles']), | |
| 279 msg='The second profile was not created.') | |
| 280 | |
| 281 def testDisplayOneClickInfobarPerProfile(self): | |
| 282 """Verify one-click infobar appears for each profile after sign-in.""" | |
| 283 # Default profile. | |
| 284 self._DisplayOneClickInfobar() | |
| 285 self._OpenSecondProfile() | |
| 286 self._DisplayOneClickInfobar(windex=1) | |
| 287 | |
| 288 def testNoOneClickInfobarWhenCookiesBlocked(self): | |
| 289 """Verify one-click infobar does not show when cookies are blocked. | |
| 290 | |
| 291 One-click sign in should not be enabled if cookies are blocked for Google | |
| 292 accounts domain. | |
| 293 | |
| 294 This test verifies the following bug: crbug.com/117841 | |
| 295 """ | |
| 296 # Block cookies for Google accounts domain. | |
| 297 self.SetPrefs(pyauto.kContentSettingsPatternPairs, | |
| 298 self.BLOCK_COOKIE_PATTERN) | |
| 299 self._LogIntoGoogleAccount() | |
| 300 test_utils.AssertInfobarTypeDoesNotAppear(self, self.OC_INFOBAR_TYPE) | |
| 301 | |
| 302 def testOneClickInfobarShownWhenWinLoseFocus(self): | |
| 303 """Verify one-click infobar still shows when window loses focus. | |
| 304 | |
| 305 This test verifies the following bug: crbug.com/121739 | |
| 306 """ | |
| 307 self._LogIntoGoogleAccount() | |
| 308 test_utils.WaitForInfobarTypeAndGetIndex(self, self.OC_INFOBAR_TYPE) | |
| 309 # Open new window to shift focus away. | |
| 310 self.OpenNewBrowserWindow(True) | |
| 311 test_utils.GetInfobarIndexByType(self, self.OC_INFOBAR_TYPE) | |
| 312 | |
| 313 def testNoOneClickInfobarInIncognito(self): | |
| 314 """Verify that one-click infobar does not show up in incognito mode.""" | |
| 315 self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW) | |
| 316 self._LogIntoGoogleAccount(windex=1) | |
| 317 test_utils.AssertInfobarTypeDoesNotAppear( | |
| 318 self, self.OC_INFOBAR_TYPE, windex=1) | |
| 319 | |
| 320 | |
| 321 if __name__ == '__main__': | |
| 322 pyauto_functional.Main() | |
| OLD | NEW |