| 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 |