Bug 1552441 - Test to verify that only unlinkable about pages can load script[type=module]. r=smaug,ckerschb
authorJared Wein <jwein@mozilla.com>
Tue, 21 May 2019 18:02:21 +0000
changeset 474808 60bf0ae446ce30b797a928d8f7961aadb00662b4
parent 474807 9953e8853243fe62ad2d74d30df1231cf5c5898f
child 474809 3c824624aa30a223ba960b0131b71882c872f0ae
push id36046
push useraiakab@mozilla.com
push dateTue, 21 May 2019 21:45:52 +0000
treeherdermozilla-central@257f2c96cef5 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerssmaug, ckerschb
bugs1552441
milestone69.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1552441 - Test to verify that only unlinkable about pages can load script[type=module]. r=smaug,ckerschb Differential Revision: https://phabricator.services.mozilla.com/D31678
dom/tests/browser/.eslintrc.js
dom/tests/browser/browser.ini
dom/tests/browser/browser_unlinkable_about_page_can_load_module_scripts.js
dom/tests/browser/file_load_module_script.html
dom/tests/browser/file_module_loaded.js
dom/tests/browser/file_module_loaded2.js
new file mode 100644
--- /dev/null
+++ b/dom/tests/browser/.eslintrc.js
@@ -0,0 +1,18 @@
+"use strict";
+
+module.exports = {
+  overrides: [
+    {
+      files: [
+        "file_module_loaded.js",
+        "file_module_loaded2.js",
+      ],
+      parserOptions: {
+        sourceType: "module",
+      },
+    },
+  ],
+  "extends": [
+    "plugin:mozilla/browser-test"
+  ]
+};
--- a/dom/tests/browser/browser.ini
+++ b/dom/tests/browser/browser.ini
@@ -74,16 +74,21 @@ support-files =
 [browser_test_new_window_from_content.js]
 tags = openwindow
 skip-if = toolkit == 'android'  || (os == "linux" && debug) # see bug 1261495 for Linux debug time outs
 support-files =
   test_new_window_from_content_child.html
 [browser_test_toolbars_visibility.js]
 support-files =
   test_new_window_from_content_child.html
+[browser_unlinkable_about_page_can_load_module_scripts.js]
+support-files =
+  file_load_module_script.html
+  file_module_loaded.js
+  file_module_loaded2.js
 [browser_xhr_sandbox.js]
 [browser_noopener.js]
 skip-if = (verify && debug && (os == 'linux'))
 support-files =
   test_noopener_source.html
   test_noopener_target.html
 [browser_noopener_null_uri.js]
 [browser_wakelock.js]
new file mode 100644
--- /dev/null
+++ b/dom/tests/browser/browser_unlinkable_about_page_can_load_module_scripts.js
@@ -0,0 +1,59 @@
+/* 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/.
+ */
+
+"use strict";
+
+const kTestPage = getRootDirectory(gTestPath) + "file_load_module_script.html";
+
+const kDefaultFlags = Ci.nsIAboutModule.ALLOW_SCRIPT |
+    Ci.nsIAboutModule.URI_MUST_LOAD_IN_CHILD |
+    Ci.nsIAboutModule.URI_CAN_LOAD_IN_PRIVILEGED_CHILD |
+    Ci.nsIAboutModule.URI_SAFE_FOR_UNTRUSTED_CONTENT;
+
+const kAboutPagesRegistered = Promise.all([
+  BrowserTestUtils.registerAboutPage(
+    registerCleanupFunction, "test-linkable-page", kTestPage,
+    kDefaultFlags | Ci.nsIAboutModule.MAKE_LINKABLE),
+  BrowserTestUtils.registerAboutPage(
+    registerCleanupFunction, "test-unlinkable-page", kTestPage,
+    kDefaultFlags),
+]);
+
+add_task(async function() {
+  await kAboutPagesRegistered;
+
+  let consoleListener = {
+    observe() {
+      errorCount++;
+      if (shouldHaveJSError) {
+        ok(true, "JS error is expected and received");
+      } else {
+        ok(false, "Unexpected JS error was received");
+      }
+    },
+  };
+  Services.console.registerListener(consoleListener);
+  registerCleanupFunction(() => Services.console.unregisterListener(consoleListener));
+
+  let shouldHaveJSError = true;
+  let errorCount = 0;
+  await BrowserTestUtils.withNewTab({gBrowser, url: "about:test-linkable-page"}, async (browser) => {
+    await ContentTask.spawn(browser, null, () => {
+      isnot(content.document.body.textContent, "scriptLoaded",
+        "The page content shouldn't be changed on the linkable page");
+    });
+  });
+  ok(errorCount > 0, "Should have an error when loading test-linkable-page, got " + errorCount);
+
+  shouldHaveJSError = false;
+  errorCount = 0;
+  await BrowserTestUtils.withNewTab({gBrowser, url: "about:test-unlinkable-page"}, async (browser) => {
+    await ContentTask.spawn(browser, null, () => {
+      is(content.document.body.textContent, "scriptLoaded",
+        "The page content should be changed on the unlinkable page");
+    });
+  });
+  is(errorCount, 0, "Should have no errors when loading test-unlinkable-page");
+});
new file mode 100644
--- /dev/null
+++ b/dom/tests/browser/file_load_module_script.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta http-equiv="Content-Security-Policy" content="default-src chrome:"/>
+  <script type="module" src="chrome://mochitests/content/browser/dom/tests/browser/file_module_loaded.js"></script>
+</head>
+<body></body>
+</html>
new file mode 100644
--- /dev/null
+++ b/dom/tests/browser/file_module_loaded.js
@@ -0,0 +1,6 @@
+"use strict";
+
+import setBodyText from "chrome://mochitests/content/browser/dom/tests/browser/file_module_loaded2.js";
+document.addEventListener("DOMContentLoaded", () => {
+  setBodyText();
+});
new file mode 100644
--- /dev/null
+++ b/dom/tests/browser/file_module_loaded2.js
@@ -0,0 +1,3 @@
+export default function setBodyText() {
+  document.body.textContent = "scriptLoaded";
+}