mirror of
https://github.com/classilla/tenfourfox.git
synced 2024-10-22 02:25:05 +00:00
235 lines
8.4 KiB
Python
235 lines
8.4 KiB
Python
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
from marionette_driver import By, Wait
|
|
from marionette_driver.errors import NoSuchWindowException, TimeoutException
|
|
|
|
import firefox_puppeteer.errors as errors
|
|
|
|
from firefox_puppeteer.testcases import FirefoxTestCase
|
|
from firefox_puppeteer.ui.windows import BaseWindow
|
|
|
|
|
|
class TestWindows(FirefoxTestCase):
|
|
|
|
def tearDown(self):
|
|
try:
|
|
self.windows.close_all([self.browser])
|
|
finally:
|
|
FirefoxTestCase.tearDown(self)
|
|
|
|
def test_switch_to(self):
|
|
url = self.marionette.absolute_url('layout/mozilla.html')
|
|
|
|
# Open two more windows
|
|
for index in range(0, 2):
|
|
self.marionette.execute_script(""" window.open(); """)
|
|
|
|
windows = self.windows.all
|
|
self.assertEquals(len(windows), 3)
|
|
|
|
# Switch to the 2nd window
|
|
self.windows.switch_to(windows[1].handle)
|
|
self.assertEquals(windows[1].handle, self.marionette.current_chrome_window_handle)
|
|
|
|
# TODO: Needs updated tabs module for improved navigation
|
|
with self.marionette.using_context('content'):
|
|
self.marionette.navigate(url)
|
|
|
|
# Switch to the last window and find 2nd window by URL
|
|
self.windows.switch_to(windows[2].handle)
|
|
|
|
# TODO: A window can have multiple tabs, so this may need an update
|
|
# when the tabs module gets implemented
|
|
def find_by_url(win):
|
|
with win.marionette.using_context('content'):
|
|
return win.marionette.get_url() == url
|
|
|
|
self.windows.switch_to(find_by_url)
|
|
self.assertEquals(windows[1].handle, self.marionette.current_chrome_window_handle)
|
|
|
|
self.windows.switch_to(find_by_url)
|
|
|
|
# Switching to an unknown handles has to fail
|
|
self.assertRaises(NoSuchWindowException,
|
|
self.windows.switch_to, "humbug")
|
|
self.assertRaises(NoSuchWindowException,
|
|
self.windows.switch_to, lambda win: False)
|
|
|
|
self.windows.close_all([self.browser])
|
|
self.browser.switch_to()
|
|
|
|
self.assertEqual(len(self.windows.all), 1)
|
|
|
|
def test_switch_to_unknown_window_type(self):
|
|
def open_by_js(_):
|
|
with self.marionette.using_context('chrome'):
|
|
self.marionette.execute_script("""
|
|
window.open('chrome://browser/content/safeMode.xul', '_blank',
|
|
'chrome,centerscreen,resizable=no');
|
|
""")
|
|
|
|
win = self.browser.open_window(callback=open_by_js, expected_window_class=BaseWindow)
|
|
win.close()
|
|
self.browser.switch_to()
|
|
|
|
|
|
class TestBaseWindow(FirefoxTestCase):
|
|
|
|
def tearDown(self):
|
|
try:
|
|
self.windows.close_all([self.browser])
|
|
finally:
|
|
FirefoxTestCase.tearDown(self)
|
|
|
|
def test_basics(self):
|
|
# force BaseWindow instance
|
|
win1 = BaseWindow(lambda: self.marionette, self.browser.handle)
|
|
|
|
self.assertEquals(win1.handle, self.marionette.current_chrome_window_handle)
|
|
self.assertEquals(win1.window_element,
|
|
self.marionette.find_element(By.CSS_SELECTOR, ':root'))
|
|
self.assertEquals(win1.window_element.get_attribute('windowtype'),
|
|
self.marionette.get_window_type())
|
|
self.assertFalse(win1.closed)
|
|
|
|
# Test invalid parameters for BaseWindow constructor
|
|
self.assertRaises(TypeError,
|
|
BaseWindow, self.marionette, self.browser.handle)
|
|
self.assertRaises(errors.UnknownWindowError,
|
|
BaseWindow, lambda: self.marionette, 10)
|
|
|
|
# Test invalid shortcuts
|
|
self.assertRaises(KeyError,
|
|
win1.send_shortcut, 'l', acel=True)
|
|
|
|
def test_open_close(self):
|
|
# force BaseWindow instance
|
|
win1 = BaseWindow(lambda: self.marionette, self.browser.handle)
|
|
|
|
# Open a new window (will be focused), and check states
|
|
win2 = win1.open_window()
|
|
|
|
# force BaseWindow instance
|
|
win2 = BaseWindow(lambda: self.marionette, win2.handle)
|
|
|
|
self.assertEquals(len(self.marionette.chrome_window_handles), 2)
|
|
self.assertNotEquals(win1.handle, win2.handle)
|
|
self.assertEquals(win2.handle, self.marionette.current_chrome_window_handle)
|
|
|
|
win2.close()
|
|
|
|
self.assertTrue(win2.closed)
|
|
self.assertEquals(len(self.marionette.chrome_window_handles), 1)
|
|
self.assertEquals(win2.handle, self.marionette.current_chrome_window_handle)
|
|
Wait(self.marionette).until(lambda _: win1.focused) # catch the no focused window
|
|
|
|
win1.focus()
|
|
|
|
# Open and close a new window by a custom callback
|
|
def opener(window):
|
|
window.marionette.execute_script(""" window.open(); """)
|
|
|
|
def closer(window):
|
|
window.marionette.execute_script(""" window.close(); """)
|
|
|
|
win2 = win1.open_window(callback=opener)
|
|
|
|
# force BaseWindow instance
|
|
win2 = BaseWindow(lambda: self.marionette, win2.handle)
|
|
|
|
self.assertEquals(len(self.marionette.chrome_window_handles), 2)
|
|
win2.close(callback=closer)
|
|
|
|
win1.focus()
|
|
|
|
# Check for an unexpected window class
|
|
self.assertRaises(errors.UnexpectedWindowTypeError,
|
|
win1.open_window, expected_window_class=BaseWindow)
|
|
self.windows.close_all([win1])
|
|
|
|
def test_switch_to_and_focus(self):
|
|
# force BaseWindow instance
|
|
win1 = BaseWindow(lambda: self.marionette, self.browser.handle)
|
|
|
|
# Open a new window (will be focused), and check states
|
|
win2 = win1.open_window()
|
|
|
|
# force BaseWindow instance
|
|
win2 = BaseWindow(lambda: self.marionette, win2.handle)
|
|
|
|
self.assertEquals(win2.handle, self.marionette.current_chrome_window_handle)
|
|
self.assertEquals(win2.handle, self.windows.focused_chrome_window_handle)
|
|
self.assertFalse(win1.focused)
|
|
self.assertTrue(win2.focused)
|
|
|
|
# Switch back to win1 without moving the focus, but focus separately
|
|
win1.switch_to()
|
|
self.assertEquals(win1.handle, self.marionette.current_chrome_window_handle)
|
|
self.assertTrue(win2.focused)
|
|
|
|
win1.focus()
|
|
self.assertTrue(win1.focused)
|
|
|
|
# Switch back to win2 by focusing it directly
|
|
win2.focus()
|
|
self.assertEquals(win2.handle, self.marionette.current_chrome_window_handle)
|
|
self.assertEquals(win2.handle, self.windows.focused_chrome_window_handle)
|
|
self.assertTrue(win2.focused)
|
|
|
|
# Close win2, and check that it keeps active but looses focus
|
|
win2.switch_to()
|
|
win2.close()
|
|
|
|
win1.switch_to()
|
|
|
|
|
|
class TestBrowserWindow(FirefoxTestCase):
|
|
|
|
def tearDown(self):
|
|
try:
|
|
self.windows.close_all([self.browser])
|
|
finally:
|
|
FirefoxTestCase.tearDown(self)
|
|
|
|
def test_basic(self):
|
|
self.assertNotEqual(self.browser.dtds, [])
|
|
self.assertNotEqual(self.browser.properties, [])
|
|
|
|
self.assertFalse(self.browser.is_private)
|
|
|
|
self.assertIsNotNone(self.browser.menubar)
|
|
self.assertIsNotNone(self.browser.navbar)
|
|
self.assertIsNotNone(self.browser.tabbar)
|
|
|
|
def test_open_close(self):
|
|
# open and close a new browser windows by menu
|
|
win2 = self.browser.open_browser(trigger='menu')
|
|
self.assertEquals(win2, self.windows.current)
|
|
self.assertFalse(self.browser.is_private)
|
|
win2.close(trigger='menu')
|
|
|
|
# open and close a new browser window by shortcut
|
|
win2 = self.browser.open_browser(trigger='shortcut')
|
|
self.assertEquals(win2, self.windows.current)
|
|
self.assertFalse(self.browser.is_private)
|
|
win2.close(trigger='shortcut')
|
|
|
|
# open and close a new private browsing window
|
|
win2 = self.browser.open_browser(is_private=True)
|
|
self.assertEquals(win2, self.windows.current)
|
|
self.assertTrue(win2.is_private)
|
|
win2.close()
|
|
|
|
# open and close a new private browsing window
|
|
win2 = self.browser.open_browser(trigger='shortcut', is_private=True)
|
|
self.assertEquals(win2, self.windows.current)
|
|
self.assertTrue(win2.is_private)
|
|
win2.close()
|
|
|
|
# force closing a window
|
|
win2 = self.browser.open_browser()
|
|
self.assertEquals(win2, self.windows.current)
|
|
win2.close(force=True)
|