OLD | NEW |
| (Empty) |
1 #!/usr/bin/env python | |
2 # Copyright (c) 2012 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 shutil | |
9 | |
10 import pyauto_functional # Must be imported before pyauto | |
11 import pyauto | |
12 import test_utils | |
13 | |
14 from webdriver_pages import settings | |
15 from webdriver_pages.settings import Behaviors, ContentTypes | |
16 | |
17 | |
18 class PrefsTest(pyauto.PyUITest): | |
19 """TestCase for Preferences.""" | |
20 | |
21 INFOBAR_TYPE = 'rph_infobar' | |
22 | |
23 def setUp(self): | |
24 pyauto.PyUITest.setUp(self) | |
25 self._driver = self.NewWebDriver() | |
26 | |
27 def Debug(self): | |
28 """Test method for experimentation. | |
29 | |
30 This method will not run automatically. | |
31 """ | |
32 while True: | |
33 raw_input('Interact with the browser and hit <enter> to dump prefs... ') | |
34 self.pprint(self.GetPrefsInfo().Prefs()) | |
35 | |
36 def testSessionRestore(self): | |
37 """Test session restore preference.""" | |
38 url1 = 'http://www.google.com/' | |
39 url2 = 'http://news.google.com/' | |
40 self.NavigateToURL(url1) | |
41 self.AppendTab(pyauto.GURL(url2)) | |
42 num_tabs = self.GetTabCount() | |
43 # Set pref to restore session on startup. | |
44 self.SetPrefs(pyauto.kRestoreOnStartup, 1) | |
45 logging.debug('Setting %s to 1' % pyauto.kRestoreOnStartup) | |
46 self.RestartBrowser(clear_profile=False) | |
47 self.assertEqual(self.GetPrefsInfo().Prefs(pyauto.kRestoreOnStartup), 1) | |
48 self.assertEqual(num_tabs, self.GetTabCount()) | |
49 self.ActivateTab(0) | |
50 self.assertEqual(url1, self.GetActiveTabURL().spec()) | |
51 self.ActivateTab(1) | |
52 self.assertEqual(url2, self.GetActiveTabURL().spec()) | |
53 | |
54 def testNavigationStateOnSessionRestore(self): | |
55 """Verify navigation state is preserved on session restore.""" | |
56 urls = ('http://www.google.com/', | |
57 'http://news.google.com/', | |
58 'http://dev.chromium.org/',) | |
59 for url in urls: | |
60 self.NavigateToURL(url) | |
61 self.TabGoBack() | |
62 self.assertEqual(self.GetActiveTabURL().spec(), urls[-2]) | |
63 self.SetPrefs(pyauto.kRestoreOnStartup, 1) # set pref to restore session | |
64 self.RestartBrowser(clear_profile=False) | |
65 # Verify that navigation state (forward/back state) is restored. | |
66 self.TabGoBack() | |
67 self.assertEqual(self.GetActiveTabURL().spec(), urls[0]) | |
68 for i in (-2, -1): | |
69 tab.GoForward() | |
70 self.assertEqual(self.GetActiveTabURL().spec(), urls[i]) | |
71 | |
72 def testSessionRestoreURLs(self): | |
73 """Verify restore URLs preference.""" | |
74 url1 = self.GetFileURLForPath(os.path.join(self.DataDir(), 'title1.html')) | |
75 url2 = self.GetFileURLForPath(os.path.join(self.DataDir(), 'title2.html')) | |
76 # Set pref to restore given URLs on startup | |
77 self.SetPrefs(pyauto.kRestoreOnStartup, 4) # 4 is for restoring URLs | |
78 self.SetPrefs(pyauto.kURLsToRestoreOnStartup, [url1, url2]) | |
79 self.RestartBrowser(clear_profile=False) | |
80 # Verify | |
81 self.assertEqual(self.GetPrefsInfo().Prefs(pyauto.kRestoreOnStartup), 4) | |
82 self.assertEqual(2, self.GetTabCount()) | |
83 self.ActivateTab(0) | |
84 self.assertEqual(url1, self.GetActiveTabURL().spec()) | |
85 self.ActivateTab(1) | |
86 self.assertEqual(url2, self.GetActiveTabURL().spec()) | |
87 | |
88 def testGeolocationPref(self): | |
89 """Verify geolocation pref. | |
90 | |
91 Checks for the geolocation infobar. | |
92 """ | |
93 # GetBrowserInfo() call seems to fail later on in this test. Call it early. | |
94 # crbug.com/89000 | |
95 branding = self.GetBrowserInfo()['properties']['branding'] | |
96 url = self.GetFileURLForPath(os.path.join( # triggers geolocation | |
97 self.DataDir(), 'geolocation', 'geolocation_on_load.html')) | |
98 self.assertEqual(3, # default state | |
99 self.GetPrefsInfo().Prefs(pyauto.kGeolocationDefaultContentSetting)) | |
100 self.NavigateToURL(url) | |
101 self.assertTrue(self.WaitForInfobarCount(1)) | |
102 self.assertTrue(self.GetBrowserInfo()['windows'][0]['tabs'][0]['infobars']) | |
103 # Disable geolocation | |
104 self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 2) | |
105 self.assertEqual(2, | |
106 self.GetPrefsInfo().Prefs(pyauto.kGeolocationDefaultContentSetting)) | |
107 self.ReloadTab() | |
108 # Fails on Win7/Vista Chromium bots. crbug.com/89000 | |
109 if (self.IsWin7() or self.IsWinVista()) and branding == 'Chromium': | |
110 return | |
111 behavior = self._driver.execute_async_script( | |
112 'triggerGeoWithCallback(arguments[arguments.length - 1]);') | |
113 self.assertEqual( | |
114 behavior, Behaviors.BLOCK, | |
115 msg='Behavior is "%s" when it should be BLOCKED.' % behavior) | |
116 | |
117 def testAllowSelectedGeoTracking(self): | |
118 """Verify hostname pattern and behavior for allowed tracking.""" | |
119 # Default location tracking option "Ask me". | |
120 self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 3) | |
121 self.NavigateToURL( | |
122 self.GetHttpURLForDataPath('geolocation', 'geolocation_on_load.html')) | |
123 self.assertTrue(self.WaitForInfobarCount(1)) | |
124 self.PerformActionOnInfobar('accept', infobar_index=0) # Allow tracking. | |
125 # Get the hostname pattern (e.g. http://127.0.0.1:57622). | |
126 hostname_pattern = ( | |
127 '/'.join(self.GetHttpURLForDataPath('').split('/')[0:3])) | |
128 self.assertEqual( | |
129 # Allow the hostname. | |
130 {hostname_pattern+','+hostname_pattern: {'geolocation': 1}}, | |
131 self.GetPrefsInfo().Prefs(pyauto.kContentSettingsPatternPairs)) | |
132 | |
133 def testDismissedInfobarSavesNoEntry(self): | |
134 """Verify dismissing infobar does not save an exception entry.""" | |
135 # Default location tracking option "Ask me". | |
136 self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 3) | |
137 self.NavigateToURL( | |
138 self.GetFileURLForDataPath('geolocation', 'geolocation_on_load.html')) | |
139 self.assertTrue(self.WaitForInfobarCount(1)) | |
140 self.PerformActionOnInfobar('dismiss', infobar_index=0) | |
141 self.assertEqual( | |
142 {}, self.GetPrefsInfo().Prefs(pyauto.kContentSettingsPatternPairs)) | |
143 | |
144 def testGeolocationBlockedWhenTrackingDenied(self): | |
145 """Verify geolocations is blocked when tracking is denied. | |
146 | |
147 The test verifies the blocked hostname pattern entry on the Geolocations | |
148 exceptions page. | |
149 """ | |
150 # Ask for permission when site wants to track. | |
151 self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 3) | |
152 self.NavigateToURL( | |
153 self.GetHttpURLForDataPath('geolocation', 'geolocation_on_load.html')) | |
154 self.assertTrue(self.WaitForInfobarCount(1)) | |
155 self.PerformActionOnInfobar('cancel', infobar_index=0) # Deny tracking. | |
156 behavior = self._driver.execute_async_script( | |
157 'triggerGeoWithCallback(arguments[arguments.length - 1]);') | |
158 self.assertEqual( | |
159 behavior, Behaviors.BLOCK, | |
160 msg='Behavior is "%s" when it should be BLOCKED.' % behavior) | |
161 # Get the hostname pattern (e.g. http://127.0.0.1:57622). | |
162 hostname_pattern = ( | |
163 '/'.join(self.GetHttpURLForDataPath('').split('/')[0:3])) | |
164 self.assertEqual( | |
165 # Block the hostname. | |
166 {hostname_pattern+','+hostname_pattern: {'geolocation': 2}}, | |
167 self.GetPrefsInfo().Prefs(pyauto.kContentSettingsPatternPairs)) | |
168 | |
169 def _CheckForVisibleImage(self, tab_index=0, windex=0): | |
170 """Checks whether or not an image is visible on the webpage. | |
171 | |
172 Args: | |
173 tab_index: Tab index. Defaults to 0 (first tab). | |
174 windex: Window index. Defaults to 0 (first window). | |
175 | |
176 Returns: | |
177 True if image is loaded, otherwise returns False if image is not loaded. | |
178 """ | |
179 # Checks whether an image is loaded by checking the area (width | |
180 # and height) of the image. If the area is non zero then the image is | |
181 # visible. If the area is zero then the image is not loaded. | |
182 # Chrome zeros the |naturalWidth| and |naturalHeight|. | |
183 script = """ | |
184 for (i=0; i < document.images.length; i++) { | |
185 if ((document.images[i].naturalWidth != 0) && | |
186 (document.images[i].naturalHeight != 0)) { | |
187 window.domAutomationController.send(true); | |
188 } | |
189 } | |
190 window.domAutomationController.send(false); | |
191 """ | |
192 return self.ExecuteJavascript(script, windex=windex, tab_index=tab_index) | |
193 | |
194 def testBlockImagesForHostname(self): | |
195 """Verify images blocked for defined hostname pattern.""" | |
196 url = 'http://www.google.com' | |
197 page = settings.ManageExceptionsPage.FromNavigation( | |
198 self._driver, ContentTypes.IMAGES) | |
199 pattern, behavior = (url, Behaviors.BLOCK) | |
200 # Add an exception BLOCK for hostname pattern 'www.google.com'. | |
201 page.AddNewException(pattern, behavior) | |
202 self.NavigateToURL(url) | |
203 self.assertFalse(self._CheckForVisibleImage(), | |
204 msg='At least one visible image found.') | |
205 | |
206 def testAllowImagesForHostname(self): | |
207 """Verify images allowed for defined hostname pattern.""" | |
208 url = 'http://www.google.com' | |
209 page = settings.ManageExceptionsPage.FromNavigation( | |
210 self._driver, ContentTypes.IMAGES) | |
211 pattern, behavior = (url, Behaviors.ALLOW) | |
212 # Add an exception ALLOW for hostname pattern 'www.google.com'. | |
213 page.AddNewException(pattern, behavior) | |
214 self.NavigateToURL(url) | |
215 self.assertTrue(self._CheckForVisibleImage(), | |
216 msg='No visible images found.') | |
217 | |
218 def testProtocolHandlerRegisteredCorrectly(self): | |
219 """Verify sites that ask to be default handlers registers correctly.""" | |
220 url = self.GetHttpURLForDataPath('settings', 'protocol_handler.html') | |
221 self.NavigateToURL(url) | |
222 # Returns a dictionary with the custom handler. | |
223 asked_handler_dict = self._driver.execute_script( | |
224 'return registerCustomHandler()') | |
225 self.PerformActionOnInfobar( | |
226 'accept', infobar_index=test_utils.WaitForInfobarTypeAndGetIndex( | |
227 self, self.INFOBAR_TYPE)) | |
228 self._driver.find_element_by_id('test_protocol').click() | |
229 self.assertTrue( | |
230 self._driver.execute_script( | |
231 'return doesQueryConformsToProtocol("%s", "%s")' | |
232 % (asked_handler_dict['query_key'], | |
233 asked_handler_dict['query_value'])), | |
234 msg='Protocol did not register correctly.') | |
235 | |
236 | |
237 if __name__ == '__main__': | |
238 pyauto_functional.Main() | |
OLD | NEW |