| #!/usr/bin/env python |
| # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import logging |
| import os |
| import shutil |
| |
| import pyauto_functional # Must be imported before pyauto |
| import pyauto |
| import test_utils |
| |
| from webdriver_pages import settings |
| from webdriver_pages.settings import Behaviors, ContentTypes |
| |
| |
| class PrefsTest(pyauto.PyUITest): |
| """TestCase for Preferences.""" |
| |
| INFOBAR_TYPE = 'rph_infobar' |
| |
| def setUp(self): |
| pyauto.PyUITest.setUp(self) |
| self._driver = self.NewWebDriver() |
| |
| def Debug(self): |
| """Test method for experimentation. |
| |
| This method will not run automatically. |
| """ |
| while True: |
| raw_input('Interact with the browser and hit <enter> to dump prefs... ') |
| self.pprint(self.GetPrefsInfo().Prefs()) |
| |
| def testSessionRestore(self): |
| """Test session restore preference.""" |
| url1 = 'http://www.google.com/' |
| url2 = 'http://news.google.com/' |
| self.NavigateToURL(url1) |
| self.AppendTab(pyauto.GURL(url2)) |
| num_tabs = self.GetTabCount() |
| # Set pref to restore session on startup. |
| self.SetPrefs(pyauto.kRestoreOnStartup, 1) |
| logging.debug('Setting %s to 1' % pyauto.kRestoreOnStartup) |
| self.RestartBrowser(clear_profile=False) |
| self.assertEqual(self.GetPrefsInfo().Prefs(pyauto.kRestoreOnStartup), 1) |
| self.assertEqual(num_tabs, self.GetTabCount()) |
| self.ActivateTab(0) |
| self.assertEqual(url1, self.GetActiveTabURL().spec()) |
| self.ActivateTab(1) |
| self.assertEqual(url2, self.GetActiveTabURL().spec()) |
| |
| def testNavigationStateOnSessionRestore(self): |
| """Verify navigation state is preserved on session restore.""" |
| urls = ('http://www.google.com/', |
| 'http://news.google.com/', |
| 'http://dev.chromium.org/',) |
| for url in urls: |
| self.NavigateToURL(url) |
| self.TabGoBack() |
| self.assertEqual(self.GetActiveTabURL().spec(), urls[-2]) |
| self.SetPrefs(pyauto.kRestoreOnStartup, 1) # set pref to restore session |
| self.RestartBrowser(clear_profile=False) |
| # Verify that navigation state (forward/back state) is restored. |
| self.TabGoBack() |
| self.assertEqual(self.GetActiveTabURL().spec(), urls[0]) |
| for i in (-2, -1): |
| tab.GoForward() |
| self.assertEqual(self.GetActiveTabURL().spec(), urls[i]) |
| |
| def testSessionRestoreURLs(self): |
| """Verify restore URLs preference.""" |
| url1 = self.GetFileURLForPath(os.path.join(self.DataDir(), 'title1.html')) |
| url2 = self.GetFileURLForPath(os.path.join(self.DataDir(), 'title2.html')) |
| # Set pref to restore given URLs on startup |
| self.SetPrefs(pyauto.kRestoreOnStartup, 4) # 4 is for restoring URLs |
| self.SetPrefs(pyauto.kURLsToRestoreOnStartup, [url1, url2]) |
| self.RestartBrowser(clear_profile=False) |
| # Verify |
| self.assertEqual(self.GetPrefsInfo().Prefs(pyauto.kRestoreOnStartup), 4) |
| self.assertEqual(2, self.GetTabCount()) |
| self.ActivateTab(0) |
| self.assertEqual(url1, self.GetActiveTabURL().spec()) |
| self.ActivateTab(1) |
| self.assertEqual(url2, self.GetActiveTabURL().spec()) |
| |
| def testGeolocationPref(self): |
| """Verify geolocation pref. |
| |
| Checks for the geolocation infobar. |
| """ |
| # GetBrowserInfo() call seems to fail later on in this test. Call it early. |
| # crbug.com/89000 |
| branding = self.GetBrowserInfo()['properties']['branding'] |
| url = self.GetFileURLForPath(os.path.join( # triggers geolocation |
| self.DataDir(), 'geolocation', 'geolocation_on_load.html')) |
| self.assertEqual(3, # default state |
| self.GetPrefsInfo().Prefs(pyauto.kGeolocationDefaultContentSetting)) |
| self.NavigateToURL(url) |
| self.assertTrue(self.WaitForInfobarCount(1)) |
| self.assertTrue(self.GetBrowserInfo()['windows'][0]['tabs'][0]['infobars']) |
| # Disable geolocation |
| self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 2) |
| self.assertEqual(2, |
| self.GetPrefsInfo().Prefs(pyauto.kGeolocationDefaultContentSetting)) |
| self.ReloadTab() |
| # Fails on Win7/Vista Chromium bots. crbug.com/89000 |
| if (self.IsWin7() or self.IsWinVista()) and branding == 'Chromium': |
| return |
| behavior = self._driver.execute_async_script( |
| 'triggerGeoWithCallback(arguments[arguments.length - 1]);') |
| self.assertEqual( |
| behavior, Behaviors.BLOCK, |
| msg='Behavior is "%s" when it should be BLOCKED.' % behavior) |
| |
| def testAllowSelectedGeoTracking(self): |
| """Verify hostname pattern and behavior for allowed tracking.""" |
| # Default location tracking option "Ask me". |
| self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 3) |
| self.NavigateToURL( |
| self.GetHttpURLForDataPath('geolocation', 'geolocation_on_load.html')) |
| self.assertTrue(self.WaitForInfobarCount(1)) |
| self.PerformActionOnInfobar('accept', infobar_index=0) # Allow tracking. |
| # Get the hostname pattern (e.g. http://127.0.0.1:57622). |
| hostname_pattern = ( |
| '/'.join(self.GetHttpURLForDataPath('').split('/')[0:3])) |
| self.assertEqual( |
| # Allow the hostname. |
| {hostname_pattern+','+hostname_pattern: {'geolocation': 1}}, |
| self.GetPrefsInfo().Prefs(pyauto.kContentSettingsPatternPairs)) |
| |
| def testDismissedInfobarSavesNoEntry(self): |
| """Verify dismissing infobar does not save an exception entry.""" |
| # Default location tracking option "Ask me". |
| self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 3) |
| self.NavigateToURL( |
| self.GetFileURLForDataPath('geolocation', 'geolocation_on_load.html')) |
| self.assertTrue(self.WaitForInfobarCount(1)) |
| self.PerformActionOnInfobar('dismiss', infobar_index=0) |
| self.assertEqual( |
| {}, self.GetPrefsInfo().Prefs(pyauto.kContentSettingsPatternPairs)) |
| |
| def testGeolocationBlockedWhenTrackingDenied(self): |
| """Verify geolocations is blocked when tracking is denied. |
| |
| The test verifies the blocked hostname pattern entry on the Geolocations |
| exceptions page. |
| """ |
| # Ask for permission when site wants to track. |
| self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 3) |
| self.NavigateToURL( |
| self.GetHttpURLForDataPath('geolocation', 'geolocation_on_load.html')) |
| self.assertTrue(self.WaitForInfobarCount(1)) |
| self.PerformActionOnInfobar('cancel', infobar_index=0) # Deny tracking. |
| behavior = self._driver.execute_async_script( |
| 'triggerGeoWithCallback(arguments[arguments.length - 1]);') |
| self.assertEqual( |
| behavior, Behaviors.BLOCK, |
| msg='Behavior is "%s" when it should be BLOCKED.' % behavior) |
| # Get the hostname pattern (e.g. http://127.0.0.1:57622). |
| hostname_pattern = ( |
| '/'.join(self.GetHttpURLForDataPath('').split('/')[0:3])) |
| self.assertEqual( |
| # Block the hostname. |
| {hostname_pattern+','+hostname_pattern: {'geolocation': 2}}, |
| self.GetPrefsInfo().Prefs(pyauto.kContentSettingsPatternPairs)) |
| |
| def _CheckForVisibleImage(self, tab_index=0, windex=0): |
| """Checks whether or not an image is visible on the webpage. |
| |
| Args: |
| tab_index: Tab index. Defaults to 0 (first tab). |
| windex: Window index. Defaults to 0 (first window). |
| |
| Returns: |
| True if image is loaded, otherwise returns False if image is not loaded. |
| """ |
| # Checks whether an image is loaded by checking the area (width |
| # and height) of the image. If the area is non zero then the image is |
| # visible. If the area is zero then the image is not loaded. |
| # Chrome zeros the |naturalWidth| and |naturalHeight|. |
| script = """ |
| for (i=0; i < document.images.length; i++) { |
| if ((document.images[i].naturalWidth != 0) && |
| (document.images[i].naturalHeight != 0)) { |
| window.domAutomationController.send(true); |
| } |
| } |
| window.domAutomationController.send(false); |
| """ |
| return self.ExecuteJavascript(script, windex=windex, tab_index=tab_index) |
| |
| def testBlockImagesForHostname(self): |
| """Verify images blocked for defined hostname pattern.""" |
| url = 'http://www.google.com' |
| page = settings.ManageExceptionsPage.FromNavigation( |
| self._driver, ContentTypes.IMAGES) |
| pattern, behavior = (url, Behaviors.BLOCK) |
| # Add an exception BLOCK for hostname pattern 'www.google.com'. |
| page.AddNewException(pattern, behavior) |
| self.NavigateToURL(url) |
| self.assertFalse(self._CheckForVisibleImage(), |
| msg='At least one visible image found.') |
| |
| def testAllowImagesForHostname(self): |
| """Verify images allowed for defined hostname pattern.""" |
| url = 'http://www.google.com' |
| page = settings.ManageExceptionsPage.FromNavigation( |
| self._driver, ContentTypes.IMAGES) |
| pattern, behavior = (url, Behaviors.ALLOW) |
| # Add an exception ALLOW for hostname pattern 'www.google.com'. |
| page.AddNewException(pattern, behavior) |
| self.NavigateToURL(url) |
| self.assertTrue(self._CheckForVisibleImage(), |
| msg='No visible images found.') |
| |
| def testProtocolHandlerRegisteredCorrectly(self): |
| """Verify sites that ask to be default handlers registers correctly.""" |
| url = self.GetHttpURLForDataPath('settings', 'protocol_handler.html') |
| self.NavigateToURL(url) |
| # Returns a dictionary with the custom handler. |
| asked_handler_dict = self._driver.execute_script( |
| 'return registerCustomHandler()') |
| self.PerformActionOnInfobar( |
| 'accept', infobar_index=test_utils.WaitForInfobarTypeAndGetIndex( |
| self, self.INFOBAR_TYPE)) |
| self._driver.find_element_by_id('test_protocol').click() |
| self.assertTrue( |
| self._driver.execute_script( |
| 'return doesQueryConformsToProtocol("%s", "%s")' |
| % (asked_handler_dict['query_key'], |
| asked_handler_dict['query_value'])), |
| msg='Protocol did not register correctly.') |
| |
| |
| if __name__ == '__main__': |
| pyauto_functional.Main() |