Chromium Code Reviews| Index: chrome/test/functional/fullscreen_mouselock.py |
| =================================================================== |
| --- chrome/test/functional/fullscreen_mouselock.py (revision 132411) |
| +++ chrome/test/functional/fullscreen_mouselock.py (working copy) |
| @@ -5,17 +5,36 @@ |
| import logging |
| import os |
| +import re |
| import shutil |
| import pyauto_functional # Must be imported before pyauto |
| import pyauto |
| import test_utils |
| from selenium.webdriver.common.keys import Keys |
| +from webdriver_pages import settings |
| class FullscreenMouselockTest(pyauto.PyUITest): |
| """TestCase for Fullscreen and Mouse Lock.""" |
| + def setUp(self): |
| + pyauto.PyUITest.setUp(self) |
| + self._driver = self.NewWebDriver() |
| + # Get the hostname pattern (e.g. http://127.0.0.1:57622). |
| + self._hostname_pattern = ( |
| + re.sub('/files/$', '', self.GetHttpURLForDataPath(''))) |
| + |
| + def Debug(self): |
| + """Test method for experimentation. |
| + |
| + This method will not run automatically. |
| + """ |
| + self._driver = self.NewWebDriver() |
|
Nirnimesh
2012/04/23 19:16:26
Why repeat?
dyu1
2012/04/23 19:26:43
Done.
|
| + page = settings.ContentSettingsPage.FromNavigation(self._driver) |
| + import pdb |
| + pdb.set_trace() |
| + |
| def ExtraChromeFlags(self): |
| """Ensures Chrome is launched with custom flags. |
| @@ -28,10 +47,6 @@ |
| def testFullScreenMouseLockHooks(self): |
| """Verify fullscreen and mouse lock automation hooks work.""" |
| - |
| - from webdriver_pages import settings |
| - from webdriver_pages.settings import Behaviors, ContentTypes |
| - driver = self.NewWebDriver() |
| self.NavigateToURL(self.GetHttpURLForDataPath( |
| 'fullscreen_mouselock', 'fullscreen_mouselock.html')) |
| @@ -40,7 +55,7 @@ |
| self.assertFalse(self.IsFullscreenForTab()) |
| # Go fullscreen |
| - driver.find_element_by_id('enterFullscreen').click() |
| + self._driver.find_element_by_id('enterFullscreen').click() |
| self.assertTrue(self.WaitUntil(self.IsFullscreenForTab)) |
| # Bubble should be up prompting to allow fullscreen |
| @@ -55,7 +70,7 @@ |
| # Try to lock mouse, it won't lock yet but permision will be requested. |
| self.assertFalse(self.IsMouseLocked()) |
| - driver.find_element_by_id('lockMouse1').click() |
| + self._driver.find_element_by_id('lockMouse1').click() |
| self.assertTrue(self.WaitUntil(self.IsMouseLockPermissionRequested)) |
| self.assertFalse(self.IsMouseLocked()) |
| @@ -66,7 +81,7 @@ |
| self.assertFalse(self.IsMouseLocked()) |
| # Try mouse lock again, and accept it. |
| - driver.find_element_by_id('lockMouse1').click() |
| + self._driver.find_element_by_id('lockMouse1').click() |
| self.assertTrue(self.WaitUntil(self.IsMouseLockPermissionRequested)) |
| self.AcceptCurrentFullscreenOrMouseLockRequest() |
| self.assertTrue(self.WaitUntil(self.IsMouseLocked)) |
| @@ -91,6 +106,281 @@ |
| # keys_target.send_keys(Keys.F11) |
| # self.assertTrue(self.WaitUntil(self.IsFullscreenForBrowser)) |
| + def _LaunchFSAndExpectPrompt(self, button_action='enterFullscreen'): |
| + """Helper function to launch fullscreen and expect a prompt. |
| + Fullscreen is initiated and a bubble prompt appears asking to allow or |
| + cancel from fullscreen mode. The actual fullscreen mode doesn't take place |
| + until after approving the prompt. |
| + |
| + If the helper is not successful then the tests will fail. |
| + |
| + Args: |
| + button_action: The button id to click to initiate an action. Default is to |
| + click enterFullscreen. |
| + """ |
| + self.NavigateToURL(self.GetHttpURLForDataPath( |
| + 'fullscreen_mouselock', 'fullscreen_mouselock.html')) |
| + # Should not be in fullscreen mode during initial launch. |
| + self.assertFalse(self.IsFullscreenForBrowser()) |
| + self.assertFalse(self.IsFullscreenForTab()) |
| + # Go into fullscreen mode. |
| + self._driver.find_element_by_id(button_action).click() |
| + self.assertTrue(self.WaitUntil(self.IsFullscreenForTab)) |
| + # Bubble should display prompting to allow fullscreen. |
| + self.assertTrue(self.IsFullscreenPermissionRequested()) |
| + |
| + def _InitiateBrowserFullscreen(self): |
| + """Helper function that initiates browser fullscreen.""" |
| + self.NavigateToURL(self.GetHttpURLForDataPath( |
| + 'fullscreen_mouselock', 'fullscreen_mouselock.html')) |
| + # Should not be in fullscreen mode during initial launch. |
| + self.assertFalse(self.IsFullscreenForBrowser()) |
| + self.assertFalse(self.IsFullscreenForTab()) |
| + # Initiate browser fullscreen. |
| + self.ApplyAccelerator(pyauto.IDC_FULLSCREEN) |
| + self.assertTrue(self.WaitUntil(self.IsFullscreenForBrowser)) |
| + self.assertTrue(self.WaitUntil(lambda: not self.IsFullscreenForTab())) |
| + self.assertTrue(self.WaitUntil(lambda: not self.IsMouseLocked())) |
| + |
| + def _AcceptFullscreenOrMouseLockRequest(self): |
| + """Helper function to accept fullscreen or mouse lock request.""" |
| + self.AcceptCurrentFullscreenOrMouseLockRequest() |
| + self.assertTrue(self.WaitUntil( |
| + lambda: not self.IsFullscreenBubbleDisplayingButtons())) |
| + |
| + def _EnableFullscreenAndMouseLockMode(self): |
| + """Helper function to enable fullscreen and mouse lock mode.""" |
| + self._LaunchFSAndExpectPrompt(button_action='enterFullscreenAndLockMouse1') |
| + # Allow fullscreen. |
| + self.AcceptCurrentFullscreenOrMouseLockRequest() |
| + # The wait is needed due to crbug.com/123396. Should be able to click the |
| + # fullscreen and mouselock button and be both accepted in a single action. |
| + self.assertTrue(self.WaitUntil(self.IsMouseLockPermissionRequested)) |
| + # Allow mouse lock. |
| + self.AcceptCurrentFullscreenOrMouseLockRequest() |
| + self.assertTrue(self.WaitUntil(self.IsMouseLocked)) |
| + |
| + def _EnableMouseLockMode(self, button_action='lockMouse1'): |
| + """Helper function to enable mouse lock mode. |
| + |
| + For now, to lock the mouse, the browser needs to be in fullscreen mode. |
| + |
| + Args: |
| + button_action: The button id to click to initiate an action. Default is to |
| + click lockMouse1. |
| + """ |
| + self._driver.find_element_by_id(button_action).click() |
| + self.assertTrue(self.IsMouseLockPermissionRequested()) |
| + self.AcceptCurrentFullscreenOrMouseLockRequest() |
| + self.assertTrue(self.IsMouseLocked()) |
| + |
| + def testPrefsLineEntryForFullscreenAllowed(self): |
|
Nirnimesh
2012/04/23 19:16:26
LineEntry -> Prefs
dyu1
2012/04/23 19:26:43
Done.
|
| + """Verify line entry when fullscreen is allowed.""" |
|
Nirnimesh
2012/04/23 19:16:26
it's not clear what you mean by 'line entry'. Chan
dyu1
2012/04/23 19:26:43
Done.
|
| + self._LaunchFSAndExpectPrompt() |
| + self._AcceptFullscreenOrMouseLockRequest() |
| + content_settings = ( |
| + self.GetPrefsInfo().Prefs()['profile']['content_settings']) |
| + self.assertEqual( |
| + {self._hostname_pattern + ',*': {'fullscreen': 1}}, # Allow hostname. |
| + content_settings['pattern_pairs'], |
| + msg='Saved hostname pattern does not match expected pattern.') |
| + |
| + def testPrefsLineEntryForFullscreenExit(self): |
|
Nirnimesh
2012/04/23 19:16:26
LineEntry -> Prefs
dyu1
2012/04/23 19:26:43
Done.
|
| + """Verify line entry is empty when exit fullscreen mode before allowing.""" |
| + self._LaunchFSAndExpectPrompt() |
| + self._driver.find_element_by_id('exitFullscreen').click() |
| + # Verify exit from fullscreen mode. |
| + self.assertTrue(self.WaitUntil(lambda: not self.IsFullscreenForTab())) |
| + content_settings = ( |
| + self.GetPrefsInfo().Prefs()['profile']['content_settings']) |
| + self.assertEqual( |
| + {}, content_settings['pattern_pairs'], |
| + msg='Line entry saved when there should be none.') |
| + |
| + def testPatternsForFSAndML(self): |
| + """Verify hostname pattern and behavior for allowed mouse cursor lock. |
| + |
| + To lock the mouse, the browser needs to be in fullscreen mode. |
| + """ |
| + self._EnableFullscreenAndMouseLockMode() |
| + self._EnableMouseLockMode() |
| + expected_pattern = ( |
| + {self._hostname_pattern + ',*': {'fullscreen': 1, 'mouselock': 1}}) |
| + content_settings = ( |
| + self.GetPrefsInfo().Prefs()['profile']['content_settings']) |
| + self.assertEqual( |
| + expected_pattern, content_settings['pattern_pairs'], |
| + msg='Saved hostname and behavior patterns does not match expected.') |
| + |
| + def testPatternsForAllowMouseLock(self): |
| + """Verify hostname pattern and behavior for allowed mouse cursor lock. |
| + |
| + Enable fullscreen mode and enable mouse lock separately. |
| + """ |
| + self._LaunchFSAndExpectPrompt() |
| + self.AcceptCurrentFullscreenOrMouseLockRequest() |
| + self._EnableMouseLockMode() |
| + expected_pattern = ( |
| + {self._hostname_pattern + ',*': {'fullscreen': 1, 'mouselock': 1}}) |
| + content_settings = ( |
| + self.GetPrefsInfo().Prefs()['profile']['content_settings']) |
| + self.assertEqual( |
| + expected_pattern, content_settings['pattern_pairs'], |
| + msg='Saved hostname and behavior patterns does not match expected.') |
| + |
| + def testNoMouseLockRequest(self): |
| + """Verify mouse lock request does not appear. |
| + |
| + When allowing all sites to disable the mouse cursor, the mouse lock request |
| + bubble should not show. The mouse cursor should be automatically disabled |
| + when clicking on a disable mouse button. |
| + """ |
| + # Allow all sites to disable mouse cursor. |
| + self.SetPrefs(pyauto.kDefaultContentSettings, {u'mouselock': 1}) |
| + self._LaunchFSAndExpectPrompt() |
| + # Allow for fullscreen mode. |
| + self._AcceptFullscreenOrMouseLockRequest() |
| + self._driver.set_script_timeout(2) |
| + # Receive callback status (success or failure) from javascript that the |
| + # click has registered and the mouse lock status has changed. |
| + lock_result = self._driver.execute_async_script( |
| + 'lockMouse1(arguments[arguments.length - 1])') |
| + self.assertEqual(lock_result, 'success', msg='Mouse lock unsuccessful.') |
| + self.assertTrue(self.WaitUntil( |
| + lambda: not self.IsMouseLockPermissionRequested())) |
| + self.assertTrue(self.IsMouseLocked()) |
| + |
| + def testUnableToLockMouse(self): |
| + """Verify mouse lock is disabled. |
| + |
| + When not allowing any site to disable the mouse cursor, the mouse lock |
| + request bubble should not show and the mouse cursor should not be disabled. |
| + """ |
| + # Do not allow any site to disable mouse cursor. |
| + self.SetPrefs(pyauto.kDefaultContentSettings, {u'mouselock': 2}) |
| + self._LaunchFSAndExpectPrompt() |
| + # Allow for fullscreen mode. |
| + self._AcceptFullscreenOrMouseLockRequest() |
| + self._driver.set_script_timeout(2) |
| + # Receive callback status (success or failure) from javascript that the |
| + # click has registered and the mouse lock status has changed. |
| + lock_result = self._driver.execute_async_script( |
| + 'lockMouse1(arguments[arguments.length - 1])') |
| + self.assertEqual(lock_result, 'failure', msg='Mouse locked unexpectedly.') |
| + self.assertTrue(self.WaitUntil( |
| + lambda: not self.IsMouseLockPermissionRequested())) |
| + self.assertTrue(self.WaitUntil(lambda: not self.IsMouseLocked())) |
| + |
| + def testEnterTabFSWhileInBrowserFS(self): |
| + """Verify able to enter into tab fullscreen while in browser fullscreen.""" |
| + self._InitiateBrowserFullscreen() |
| + # Initiate tab fullscreen. |
| + self._driver.find_element_by_id('enterFullscreen').click() |
| + self.assertTrue(self.WaitUntil(lambda: self.IsFullscreenForTab())) |
| + self.assertTrue(self.WaitUntil(lambda: not self.IsMouseLocked())) |
| + |
| + def testNoMouseLockInBrowserFS(self): |
| + """Verify mouse lock can't be activated in browser fullscreen. |
| + |
| + Later on when windowed-mode mouse lock is allowed, this test will adjust to |
| + verify that mouse lock in browser fullscreen requires an allow prompt, even |
| + when there is a content setting for Allow. |
| + """ |
| + self._InitiateBrowserFullscreen() |
| + self._driver.find_element_by_id('lockMouse1').click() |
| + self.assertTrue(self.WaitUntil(lambda: not self.IsMouseLocked()), |
| + msg='Mouse is locked in browser fullscreen.') |
| + |
| + def testMouseLockExitWhenBrowserLoseFocus(self): |
| + """Verify mouse lock breaks when browser loses focus. |
| + |
| + Mouse lock breaks when the focus is placed on another new window. |
| + """ |
| + self.NavigateToURL(self.GetHttpURLForDataPath( |
| + 'fullscreen_mouselock', 'fullscreen_mouselock.html')) |
| + self._driver.find_element_by_id('enterFullscreen').click() |
| + self._driver.find_element_by_id('lockMouse1').click() |
| + self.AcceptCurrentFullscreenOrMouseLockRequest() |
| + # Open a new window to shift focus away. |
| + self.OpenNewBrowserWindow(True) |
| + self.assertTrue(self.WaitUntil(lambda: self.IsFullscreenForTab())) |
| + self.assertTrue(self.WaitUntil(lambda: not self.IsMouseLocked()), |
| + msg='Alert dialog did not break mouse lock.') |
| + |
| + def ExitTabFSToBrowserFS(self): |
| + """Verify exiting tab fullscreen leaves browser in browser fullscreen. |
| + |
| + The browser initiates browser fullscreen, then initiates tab fullscreen. The |
| + test verifies that existing tab fullscreen by simulating ESC key press or |
| + clicking the js function to exitFullscreen() will exit the tab fullscreen |
| + leaving browser fullscreen intact. |
| + """ |
| + self._InitiateBrowserFullscreen() |
| + # Initiate tab fullscreen. |
| + self._driver.find_element_by_id('enterFullscreen').click() |
| + self.assertTrue(self.WaitUntil(lambda: self.IsFullscreenForTab())) |
| + # Require manual intervention to send ESC key due to crbug.com/123930. |
| + import time |
|
Nirnimesh
2012/04/23 19:16:26
move to the top of this file
dyu1
2012/04/23 19:26:43
Done.
|
| + print "Press ESC key to exit tab fullscreen." |
| + time.sleep(5) |
| + self.assertTrue(self.WaitUntil(lambda: not self.IsFullscreenForTab())) |
| + self.assertTrue(self.WaitUntil(lambda: self.IsFullscreenForBrowser()), |
| + msg='Not in browser fullscreen mode.') |
| + |
| + self._driver.find_element_by_id('enterFullscreen').click() |
| + self.assertTrue(self.WaitUntil(lambda: self.IsFullscreenForTab())) |
| + # Exit tab fullscreen by clicking button exitFullscreen(). |
| + self._driver.find_element_by_id('exitFullscreen').click() |
| + self.assertTrue(self.WaitUntil(lambda: not self.IsFullscreenForTab())) |
| + self.assertTrue(self.WaitUntil(lambda: self.IsFullscreenForBrowser()), |
| + msg='Not in browser fullscreen mode.') |
| + |
| + def F11KeyExistsTabAndBrowserFS(self): |
| + """Verify existing tab fullscreen exists all fullscreen modes. |
| + |
| + The browser initiates browser fullscreen, then initiates tab fullscreen. The |
| + test verifies that existing tab fullscreen by simulating F11 key press or |
| + CMD + SHIFT + F keys on the Mac will exit the tab fullscreen and the |
| + browser fullscreen. |
| + """ |
| + self._InitiateBrowserFullscreen() |
| + # Initiate tab fullscreen. |
| + self._driver.find_element_by_id('enterFullscreen').click() |
| + self.assertTrue(self.WaitUntil(lambda: self.IsFullscreenForTab())) |
| + # Require manual intervention to send F11 key due to crbug.com/123930. |
| + import time |
| + print "Press F11 key to exit tab fullscreen." |
| + time.sleep(5) |
| + self.assertTrue(self.WaitUntil(lambda: not self.IsFullscreenForTab())) |
| + self.assertTrue(self.WaitUntil(lambda: not self.IsFullscreenForBrowser()), |
| + msg='Browser is in fullscreen mode.') |
| + |
| + def SearchForTextOutsideOfContainer(self): |
| + """Verify text outside of container is not visible when fullscreen. |
| + |
| + Verify this test manually until there is a way to find text on screen |
| + without using FindInPage(). |
| + |
| + The text that is outside of the fullscreen container should only be visible |
| + when fullscreen is off. The text should not be visible while in fullscreen |
| + mode. |
| + """ |
| + self.NavigateToURL(self.GetHttpURLForDataPath( |
| + 'fullscreen_mouselock', 'fullscreen_mouselock.html')) |
| + # Should not be in fullscreen mode during initial launch. |
| + self.assertFalse(self.IsFullscreenForBrowser()) |
| + self.assertFalse(self.IsFullscreenForTab()) |
| + self.assertTrue( |
| + self.WaitUntil(lambda: self.FindInPage( |
| + 'This text is outside of the container')['match_count'], |
| + expect_retval=1)) |
| + # Go into fullscreen mode. |
| + self._driver.find_element_by_id('enterFullscreen').click() |
| + self.assertTrue(self.WaitUntil(self.IsFullscreenForTab)) |
| + # TODO(dyu): find a way to verify on screen text instead of using |
| + # FindInPage() which searches for text in the HTML. |
| + |
| + |
| if __name__ == '__main__': |
| pyauto_functional.Main() |