summaryrefslogtreecommitdiffstats
path: root/dom/base/test/test_script_loader_js_cache_frames.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/base/test/test_script_loader_js_cache_frames.html')
-rw-r--r--dom/base/test/test_script_loader_js_cache_frames.html202
1 files changed, 202 insertions, 0 deletions
diff --git a/dom/base/test/test_script_loader_js_cache_frames.html b/dom/base/test/test_script_loader_js_cache_frames.html
new file mode 100644
index 0000000000..e104dd7101
--- /dev/null
+++ b/dom/base/test/test_script_loader_js_cache_frames.html
@@ -0,0 +1,202 @@
+<!DOCTYPE html>
+<html>
+<!-- https://bugzilla.mozilla.org/show_bug.cgi?id=1436400 -->
+<!-- The JS bytecode cache is not supposed to be observable. To make it
+ observable, the ScriptLoader is instrumented to trigger events on the
+ script tag.
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for saving and loading module bytecode in/from the necko cache</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="application/javascript">
+
+// List of testcases
+//
+// src
+// HTML file loaded in iframe
+// saveEvents
+// Non-ordered multi-set of expected events dispatched during loading the
+// "save" iframe in the HTML file
+// loadEvents
+// Non-ordered multi-set of expected events dispatched during loading the
+// "load" iframe in the HTML file
+const tests = [
+ // Same module is loaded by script element in 2 frames.
+ {
+ src: "file_script_module_frames_element.html",
+ saveEvents: [
+ // file_script_module_frames_element_shared.mjs
+ "scriptloader_load_source",
+ "scriptloader_evaluate_module",
+ "scriptloader_encode",
+ "scriptloader_bytecode_saved",
+ "test_evaluated",
+ ],
+ loadEvents: [
+ // file_script_module_frames_element_shared.mjs
+ "scriptloader_load_bytecode",
+ "scriptloader_evaluate_module",
+ "test_evaluated",
+ ],
+ },
+
+ // Same module is imported in 2 frames.
+ {
+ src: "file_script_module_frames_import.html",
+ saveEvents: [
+ // file_script_module_frames_import_save.mjs
+ "scriptloader_load_source",
+ "scriptloader_evaluate_module",
+ "scriptloader_encode",
+ "scriptloader_bytecode_saved",
+ "test_evaluated",
+
+ // file_script_module_frames_import_shared.mjs
+ "scriptloader_load_source",
+ "scriptloader_encode",
+ "scriptloader_bytecode_saved",
+ ],
+ loadEvents: [
+ // file_script_module_frames_import_load.mjs
+ "scriptloader_load_source",
+ "scriptloader_evaluate_module",
+ "scriptloader_encode",
+ "scriptloader_bytecode_saved",
+ "test_evaluated",
+
+ // file_script_module_frames_import_shared.mjs
+ "scriptloader_load_bytecode",
+ ],
+ },
+
+ // Same module is dynamically imported in 2 frames.
+ {
+ src: "file_script_module_frames_dynamic.html",
+ saveEvents: [
+ // file_script_module_frames_dynamic_save.mjs
+ "scriptloader_load_source",
+ "scriptloader_evaluate_module",
+ "scriptloader_encode",
+ "scriptloader_bytecode_saved",
+ "test_evaluated",
+
+ // file_script_module_frames_dynamic_shared.mjs
+ "scriptloader_load_source",
+ "scriptloader_evaluate_module",
+ "scriptloader_encode",
+ "scriptloader_bytecode_saved",
+ ],
+ loadEvents: [
+ // file_script_module_frames_dynamic_load.mjs
+ "scriptloader_load_source",
+ "scriptloader_evaluate_module",
+ "scriptloader_encode",
+ "scriptloader_bytecode_saved",
+ "test_evaluated",
+
+ // file_script_module_frames_dynamic_shared.mjs
+ "scriptloader_load_bytecode",
+ "scriptloader_evaluate_module",
+ ],
+ },
+];
+
+promise_test(async function() {
+ await SpecialPowers.pushPrefEnv({set: [
+ ['dom.script_loader.bytecode_cache.enabled', true],
+ ['dom.expose_test_interfaces', true],
+ ['dom.script_loader.bytecode_cache.strategy', -1]
+ ]});
+
+ for (const { src, saveEvents, loadEvents } of tests) {
+ const iframe = document.createElement("iframe");
+ document.body.appendChild(iframe);
+
+ const iwin = iframe.contentWindow;
+
+ dump("## Start: " + src + "\n");
+ let observedSaveEvents = [];
+ await new Promise(resolve => {
+ function logEvent(evt) {
+ const type = evt.type.replace(/^save_/, "");
+
+ dump("## ScriptLoader event: " + type + "\n");
+ observedSaveEvents.push(type);
+ if (observedSaveEvents.length == saveEvents.length) {
+ resolve();
+ }
+ }
+ iwin.addEventListener("save_scriptloader_load_source", logEvent);
+ iwin.addEventListener("save_scriptloader_load_bytecode", logEvent);
+ iwin.addEventListener("save_scriptloader_execute", logEvent);
+ iwin.addEventListener("save_scriptloader_evaluate_module", logEvent);
+ iwin.addEventListener("save_scriptloader_encode", logEvent);
+ iwin.addEventListener("save_scriptloader_no_encode", logEvent);
+ iwin.addEventListener("save_scriptloader_bytecode_saved", logEvent);
+ iwin.addEventListener("save_scriptloader_bytecode_failed", logEvent);
+ iwin.addEventListener("save_scriptloader_fallback", logEvent);
+ iwin.addEventListener("save_test_evaluated", logEvent);
+ iframe.src = src;
+ });
+
+ // The event order is non-deterministic.
+ // Just compare them as multi-set.
+ saveEvents.sort();
+ observedSaveEvents.sort();
+ assert_equals(
+ JSON.stringify(observedSaveEvents),
+ JSON.stringify(saveEvents),
+ `Expected events should be observed for ${src} while saving`);
+
+ let observedLoadEvents = [];
+ const loadFrameEventPromise = new Promise(resolve => {
+ function logEvent(evt) {
+ const type = evt.type.replace(/^load_/, "");
+
+ dump("## ScriptLoader event: " + type + "\n");
+ observedLoadEvents.push(type);
+ if (observedLoadEvents.length == loadEvents.length) {
+ resolve();
+ }
+ }
+ iwin.addEventListener("load_scriptloader_load_source", logEvent);
+ iwin.addEventListener("load_scriptloader_load_bytecode", logEvent);
+ iwin.addEventListener("load_scriptloader_execute", logEvent);
+ iwin.addEventListener("load_scriptloader_evaluate_module", logEvent);
+ iwin.addEventListener("load_scriptloader_encode", logEvent);
+ iwin.addEventListener("load_scriptloader_no_encode", logEvent);
+ iwin.addEventListener("load_scriptloader_bytecode_saved", logEvent);
+ iwin.addEventListener("load_scriptloader_bytecode_failed", logEvent);
+ iwin.addEventListener("load_scriptloader_fallback", logEvent);
+ iwin.addEventListener("load_test_evaluated", logEvent);
+
+ });
+
+ // Make sure the "load" iframe is fully loaded.
+ await iwin.loadFramePromise;
+ iwin.document.getElementById("load").contentWindow.doLoad();
+
+ await loadFrameEventPromise;
+
+ // The event order is non-deterministic.
+ // Just compare them as multi-set.
+ loadEvents.sort();
+ observedLoadEvents.sort();
+ assert_equals(
+ JSON.stringify(observedLoadEvents),
+ JSON.stringify(loadEvents),
+ `Expected events should be observed for ${src} while loading`);
+
+ document.body.removeChild(iframe);
+ }
+}, "Test module bytecode save and load");
+
+done();
+ </script>
+ <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1436400">Mozilla Bug 1436400</a>
+</body>
+</html>