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 |