summaryrefslogtreecommitdiffstats
path: root/testing/marionette/harness/marionette_harness/tests/unit/test_modal_dialogs.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/marionette/harness/marionette_harness/tests/unit/test_modal_dialogs.py')
-rw-r--r--testing/marionette/harness/marionette_harness/tests/unit/test_modal_dialogs.py161
1 files changed, 161 insertions, 0 deletions
diff --git a/testing/marionette/harness/marionette_harness/tests/unit/test_modal_dialogs.py b/testing/marionette/harness/marionette_harness/tests/unit/test_modal_dialogs.py
new file mode 100644
index 0000000000..e738625899
--- /dev/null
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_modal_dialogs.py
@@ -0,0 +1,161 @@
+from marionette_driver.by import By
+from marionette_driver.expected import element_present
+from marionette_driver import errors
+from marionette_driver.marionette import Alert
+from marionette_driver.wait import Wait
+
+from marionette_harness import MarionetteTestCase, parameterized, WindowManagerMixin
+
+
+class TestModalDialogs(WindowManagerMixin, MarionetteTestCase):
+ def setUp(self):
+ super(TestModalDialogs, self).setUp()
+ self.new_tab = self.open_tab()
+ self.marionette.switch_to_window(self.new_tab)
+
+ self.http_auth_pref = (
+ "network.auth.non-web-content-triggered-resources-http-auth-allow"
+ )
+
+ def tearDown(self):
+ # Ensure to close all possible remaining tab modal dialogs
+ try:
+ while True:
+ alert = self.marionette.switch_to_alert()
+ alert.dismiss()
+ except errors.NoAlertPresentException:
+ pass
+
+ self.close_all_tabs()
+ self.close_all_windows()
+
+ super(TestModalDialogs, self).tearDown()
+
+ @property
+ def alert_present(self):
+ try:
+ Alert(self.marionette).text
+ return True
+ except errors.NoAlertPresentException:
+ return False
+
+ def wait_for_alert(self, timeout=None):
+ Wait(self.marionette, timeout=timeout).until(lambda _: self.alert_present)
+
+ def open_custom_prompt(self, modal_type, delay=0):
+ browsing_context_id = self.marionette.execute_script(
+ """
+ return window.browsingContext.id;
+ """,
+ sandbox="system",
+ )
+
+ with self.marionette.using_context("chrome"):
+ self.marionette.execute_script(
+ """
+ const [ modalType, browsingContextId, delay ] = arguments;
+
+ const modalTypes = {
+ 1: Services.prompt.MODAL_TYPE_CONTENT,
+ 2: Services.prompt.MODAL_TYPE_TAB,
+ 3: Services.prompt.MODAL_TYPE_WINDOW,
+ 4: Services.prompt.MODAL_TYPE_INTERNAL_WINDOW,
+ }
+
+ window.setTimeout(() => {
+ Services.prompt.alertBC(
+ BrowsingContext.get(browsingContextId),
+ modalTypes[modalType],
+ "title",
+ "text"
+ );
+ }, delay);
+ """,
+ script_args=(modal_type, browsing_context_id, delay * 1000),
+ )
+
+ @parameterized("content", 1)
+ @parameterized("tab", 2)
+ @parameterized("window", 3)
+ @parameterized("internal_window", 4)
+ def test_detect_modal_type_in_current_tab_for_type(self, type):
+ self.open_custom_prompt(type)
+ self.wait_for_alert()
+
+ self.assertTrue(self.alert_present)
+
+ # Restart the session to ensure we still find the formerly left-open dialog.
+ self.marionette.delete_session()
+ self.marionette.start_session()
+
+ alert = self.marionette.switch_to_alert()
+ alert.dismiss()
+
+ @parameterized("content", 1)
+ @parameterized("tab", 2)
+ def test_dont_detect_content_and_tab_modal_type_in_another_tab_for_type(self, type):
+ self.open_custom_prompt(type, delay=0.25)
+
+ self.marionette.switch_to_window(self.start_tab)
+ with self.assertRaises(errors.TimeoutException):
+ self.wait_for_alert(2)
+
+ self.marionette.switch_to_window(self.new_tab)
+ alert = self.marionette.switch_to_alert()
+ alert.dismiss()
+
+ @parameterized("window", 3)
+ @parameterized("internal_window", 4)
+ def test_detect_window_modal_type_in_another_tab_for_type(self, type):
+ self.open_custom_prompt(type, delay=0.25)
+
+ self.marionette.switch_to_window(self.start_tab)
+ self.wait_for_alert()
+
+ alert = self.marionette.switch_to_alert()
+ alert.dismiss()
+
+ self.marionette.switch_to_window(self.new_tab)
+ self.assertFalse(self.alert_present)
+
+ @parameterized("window", 3)
+ @parameterized("internal_window", 4)
+ def test_detect_window_modal_type_in_another_window_for_type(self, type):
+ self.new_window = self.open_window()
+
+ self.marionette.switch_to_window(self.new_window)
+
+ self.open_custom_prompt(type, delay=0.25)
+
+ self.marionette.switch_to_window(self.new_tab)
+ with self.assertRaises(errors.TimeoutException):
+ self.wait_for_alert(2)
+
+ self.marionette.switch_to_window(self.new_window)
+ alert = self.marionette.switch_to_alert()
+ alert.dismiss()
+
+ self.marionette.switch_to_window(self.new_tab)
+ self.assertFalse(self.alert_present)
+
+ def test_http_auth_dismiss(self):
+ with self.marionette.using_prefs({self.http_auth_pref: True}):
+ self.marionette.navigate(self.marionette.absolute_url("http_auth"))
+ self.wait_for_alert(timeout=self.marionette.timeout.page_load)
+
+ alert = self.marionette.switch_to_alert()
+ alert.dismiss()
+
+ status = Wait(
+ self.marionette, timeout=self.marionette.timeout.page_load
+ ).until(element_present(By.ID, "status"))
+ self.assertEqual(status.text, "restricted")
+
+ def test_http_auth_send_keys(self):
+ with self.marionette.using_prefs({self.http_auth_pref: True}):
+ self.marionette.navigate(self.marionette.absolute_url("http_auth"))
+ self.wait_for_alert(timeout=self.marionette.timeout.page_load)
+
+ alert = self.marionette.switch_to_alert()
+ with self.assertRaises(errors.UnsupportedOperationException):
+ alert.send_keys("foo")