summaryrefslogtreecommitdiffstats
path: root/testing/marionette/harness/marionette_harness/tests/unit/test_import_script.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/marionette/harness/marionette_harness/tests/unit/test_import_script.py')
-rw-r--r--testing/marionette/harness/marionette_harness/tests/unit/test_import_script.py138
1 files changed, 138 insertions, 0 deletions
diff --git a/testing/marionette/harness/marionette_harness/tests/unit/test_import_script.py b/testing/marionette/harness/marionette_harness/tests/unit/test_import_script.py
new file mode 100644
index 000000000..e86de2bd5
--- /dev/null
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_import_script.py
@@ -0,0 +1,138 @@
+# 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/.
+
+import os
+
+from marionette_driver.by import By
+from marionette_driver.errors import JavascriptException
+
+from marionette_harness import (
+ MarionetteTestCase,
+ skip_if_chrome,
+ skip_if_mobile,
+ WindowManagerMixin,
+)
+
+
+class TestImportScriptContent(WindowManagerMixin, MarionetteTestCase):
+ contexts = set(["chrome", "content"])
+
+ script_file = os.path.abspath(
+ os.path.join(__file__, os.path.pardir, "importscript.js"))
+ another_script_file = os.path.abspath(
+ os.path.join(__file__, os.path.pardir, "importanotherscript.js"))
+
+ def setUp(self):
+ super(TestImportScriptContent, self).setUp()
+
+ for context in self.contexts:
+ with self.marionette.using_context(context):
+ self.marionette.clear_imported_scripts()
+ self.reset_context()
+
+ def tearDown(self):
+ self.close_all_windows()
+
+ super(TestImportScriptContent, self).tearDown()
+
+ def reset_context(self):
+ self.marionette.set_context("content")
+
+ @property
+ def current_context(self):
+ return self.marionette._send_message("getContext", key="value")
+
+ @property
+ def other_context(self):
+ return self.contexts.copy().difference([self.current_context]).pop()
+
+ def is_defined(self, symbol):
+ return self.marionette.execute_script(
+ "return typeof {} != 'undefined'".format(symbol))
+
+ def assert_defined(self, symbol, msg=None):
+ if msg is None:
+ msg = "Expected symbol {} to be defined".format(symbol)
+ self.assertTrue(self.is_defined(symbol), msg)
+
+ def assert_undefined(self, symbol, msg=None):
+ if msg is None:
+ msg = "Expected symbol {} to be undefined".format(symbol)
+ self.assertFalse(self.is_defined(symbol), msg)
+
+ def assert_scripts_cleared(self):
+ self.marionette.import_script(self.script_file)
+ self.assert_defined("testFunc")
+ self.marionette.clear_imported_scripts()
+ self.assert_undefined("testFunc")
+
+ def test_import_script(self):
+ self.marionette.import_script(self.script_file)
+ self.assertEqual(
+ "i'm a test function!", self.marionette.execute_script("return testFunc();"))
+ self.assertEqual("i'm a test function!", self.marionette.execute_async_script(
+ "marionetteScriptFinished(testFunc());"))
+
+ def test_import_script_twice(self):
+ self.marionette.import_script(self.script_file)
+ self.assert_defined("testFunc")
+
+ # TODO(ato): Note that the WebDriver command primitives
+ # does not allow us to check what scripts have been imported.
+ # I suspect we must to do this through an xpcshell test.
+
+ self.marionette.import_script(self.script_file)
+ self.assert_defined("testFunc")
+
+ def test_import_script_and_clear(self):
+ self.marionette.import_script(self.script_file)
+ self.assert_defined("testFunc")
+ self.marionette.clear_imported_scripts()
+ self.assert_scripts_cleared()
+ self.assert_undefined("testFunc")
+ with self.assertRaises(JavascriptException):
+ self.marionette.execute_script("return testFunc()")
+ with self.assertRaises(JavascriptException):
+ self.marionette.execute_async_script(
+ "marionetteScriptFinished(testFunc())")
+
+ def test_clear_scripts_in_other_context(self):
+ self.marionette.import_script(self.script_file)
+ self.assert_defined("testFunc")
+
+ # clearing other context's script file should not affect ours
+ with self.marionette.using_context(self.other_context):
+ self.marionette.clear_imported_scripts()
+ self.assert_undefined("testFunc")
+
+ self.assert_defined("testFunc")
+
+ def test_multiple_imports(self):
+ self.marionette.import_script(self.script_file)
+ self.marionette.import_script(self.another_script_file)
+ self.assert_defined("testFunc")
+ self.assert_defined("testAnotherFunc")
+
+ @skip_if_chrome("Needs content scope")
+ @skip_if_mobile("New windows not supported in Fennec")
+ def test_imports_apply_globally(self):
+ self.marionette.navigate(
+ self.marionette.absolute_url("test_windows.html"))
+
+ def open_window_with_link():
+ self.marionette.find_element(By.LINK_TEXT, "Open new window").click()
+
+ new_window = self.open_window(trigger=open_window_with_link)
+ self.marionette.switch_to_window(new_window)
+
+ self.marionette.import_script(self.script_file)
+ self.marionette.close_chrome_window()
+
+ self.marionette.switch_to_window(self.start_window)
+ self.assert_defined("testFunc")
+
+
+class TestImportScriptChrome(TestImportScriptContent):
+ def reset_context(self):
+ self.marionette.set_context("chrome")