diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /dom/base/test/test_script_loader_js_cache_module.html | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/base/test/test_script_loader_js_cache_module.html')
-rw-r--r-- | dom/base/test/test_script_loader_js_cache_module.html | 537 |
1 files changed, 537 insertions, 0 deletions
diff --git a/dom/base/test/test_script_loader_js_cache_module.html b/dom/base/test/test_script_loader_js_cache_module.html new file mode 100644 index 0000000000..77a438c7ed --- /dev/null +++ b/dom/base/test/test_script_loader_js_cache_module.html @@ -0,0 +1,537 @@ +<!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 twice in an iframe +// encodeEvents +// Non-ordered multi-set of expected events dispatched during loading the +// HTML file at the first time +// decodeEvents +// Non-ordered multi-set of expected events dispatched during loading the +// HTML file at the second time +const tests = [ + // Module without import. + { + src: "file_script_module_single.html", + encodeEvents: [ + // file_script_module_single.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", + "scriptloader_encode", + "scriptloader_bytecode_saved", + "test_evaluated", + ], + decodeEvents: [ + // file_script_module_single.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", + "test_evaluated", + ], + }, + + // Module with import. + { + src: "file_script_module_import.html", + encodeEvents: [ + // file_script_module_import.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level + "scriptloader_encode", + "scriptloader_bytecode_saved", + "test_evaluated", + + // file_script_module_import_imported.mjs + "scriptloader_load_source", + "scriptloader_encode", + ], + decodeEvents: [ + // file_script_module_import.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level + "test_evaluated", + + // file_script_module_import_imported.mjs + "scriptloader_load_bytecode", + ], + }, + + // Single module is imported twice. + { + src: "file_script_module_import_multi.html", + encodeEvents: [ + // file_script_module_import_multi.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level + "scriptloader_encode", + "scriptloader_bytecode_saved", + "test_evaluated", + + // file_script_module_import_multi_imported_once.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_import_multi_imported_twice.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + ], + decodeEvents: [ + // file_script_module_import_multi.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level + "test_evaluated", + + // file_script_module_import_multi_imported_once.mjs + "scriptloader_load_bytecode", + + // file_script_module_import_multi_imported_twice.mjs + "scriptloader_load_bytecode", + ], + }, + + // Single module is imported twice from different elements. + { + src: "file_script_module_import_multi_elems.html", + encodeEvents: [ + // file_script_module_import_multi_elems_1.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level + "scriptloader_encode", + "scriptloader_bytecode_saved", + "test_evaluated", + + // file_script_module_import_multi_elems_2.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level + "scriptloader_encode", + "scriptloader_bytecode_saved", + "test_evaluated", + + // file_script_module_import_multi_elems_imported_once_1.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_import_multi_elems_imported_once_2.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_import_multi_elems_imported_once_3.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_import_multi_elems_imported_twice.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + ], + decodeEvents: [ + // file_script_module_import_multi_elems_1.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level + "test_evaluated", + + // file_script_module_import_multi_elems_2.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level + "test_evaluated", + + // file_script_module_import_multi_elems_imported_once_1.mjs + "scriptloader_load_bytecode", + + // file_script_module_import_multi_elems_imported_once_2.mjs + "scriptloader_load_bytecode", + + // file_script_module_import_multi_elems_imported_once_3.mjs + "scriptloader_load_bytecode", + + // file_script_module_import_multi_elems_imported_twice.mjs + "scriptloader_load_bytecode", + ], + }, + + // Single module is imported, and then loaded by element. + { + src: "file_script_module_import_and_element.html", + encodeEvents: [ + // file_script_module_import_and_element.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level + "scriptloader_encode", + "scriptloader_bytecode_saved", + "test_evaluated", + + // file_script_module_import_and_element_imported_1.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_import_and_element_imported_2.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_import_and_element_imported_3.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + ], + decodeEvents: [ + // file_script_module_import_and_element.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level + "test_evaluated", + + // file_script_module_import_and_element_imported_1.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level + + // file_script_module_import_and_element_imported_2.mjs + "scriptloader_load_bytecode", + + // file_script_module_import_and_element_imported_3.mjs + "scriptloader_load_bytecode", + ], + }, + + // Single module is loaded by element, and then imported. + { + src: "file_script_module_element_and_import.html", + encodeEvents: [ + // file_script_module_element_and_import.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level + "scriptloader_encode", + "scriptloader_bytecode_saved", + "test_evaluated", + + // file_script_module_element_and_import_imported_1.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_element_and_import_imported_2.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_element_and_import_imported_3.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + ], + decodeEvents: [ + // file_script_module_element_and_import.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level + "test_evaluated", + + // file_script_module_element_and_import_imported_1.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level + + // file_script_module_element_and_import_imported_2.mjs + "scriptloader_load_bytecode", + + // file_script_module_element_and_import_imported_3.mjs + "scriptloader_load_bytecode", + ], + }, + + // Module with dynamic import. + { + src: "file_script_module_dynamic_import.html", + encodeEvents: [ + // file_script_module_dynamic_import.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level (element) + "scriptloader_encode", + "scriptloader_bytecode_saved", + "test_evaluated", + + // file_script_module_dynamic_import_imported.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level (dynamic) + "scriptloader_encode", + "scriptloader_bytecode_saved", + ], + decodeEvents: [ + // file_script_module_dynamic_import.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level (element) + "test_evaluated", + + // file_script_module_dynamic_import_imported.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level (dynamic) + ], + }, + + // Single module is imported dynamically, and then loaded by element. + { + src: "file_script_module_dynamic_and_element.html", + encodeEvents: [ + // file_script_module_dynamic_and_element.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level (element) + "scriptloader_encode", + "scriptloader_bytecode_saved", + "test_evaluated", + + // file_script_module_dynamic_and_element_imported_1.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level (element) + "scriptloader_evaluate_module", // dispatched only for top-level (dynamic) + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_dynamic_and_element_imported_2.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_dynamic_and_element_imported_3.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + ], + decodeEvents: [ + // file_script_module_dynamic_and_element.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level (element) + "test_evaluated", + + // file_script_module_dynamic_and_element_imported_1.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level (element) + "scriptloader_evaluate_module", // dispatched only for top-level (dynamic) + + // file_script_module_dynamic_and_element_imported_2.mjs + "scriptloader_load_bytecode", + + // file_script_module_dynamic_and_element_imported_3.js + "scriptloader_load_bytecode", + ], + }, + + // Single module is loaded by element, and then imported dynamically. + { + src: "file_script_module_element_and_dynamic.html", + encodeEvents: [ + // file_script_module_element_and_dynamic.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level (element) + "scriptloader_encode", + "scriptloader_bytecode_saved", + "test_evaluated", + + // file_script_module_element_and_dynamic_imported_1.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level (element) + "scriptloader_evaluate_module", // dispatched only for top-level (dynamic) + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_element_and_dynamic_imported_2.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_element_and_dynamic_imported_3.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + ], + decodeEvents: [ + // file_script_module_element_and_dynamic.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level (element) + "test_evaluated", + + // file_script_module_element_and_dynamic_imported_1.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level (element) + "scriptloader_evaluate_module", // dispatched only for top-level (dynamic) + + // file_script_module_element_and_dynamic_imported_2.mjs + "scriptloader_load_bytecode", + + // file_script_module_element_and_dynamic_imported_3.mjs + "scriptloader_load_bytecode", + ], + }, + + // Single module is imported dynamically, and then statically. + { + src: "file_script_module_dynamic_and_static.html", + encodeEvents: [ + // file_script_module_dynamic_and_static.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level (element) + "scriptloader_encode", + "scriptloader_bytecode_saved", + "test_evaluated", + + // file_script_module_dynamic_and_static_imported_1.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level (dynamic) + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_dynamic_and_static_imported_2.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_dynamic_and_static_imported_3.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + ], + decodeEvents: [ + // file_script_module_dynamic_and_static.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level (element) + "test_evaluated", + + // file_script_module_dynamic_and_static_imported_1.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level (dynamic) + + // file_script_module_dynamic_and_static_imported_2.mjs + "scriptloader_load_bytecode", + + // file_script_module_dynamic_and_static_imported_3.mjs + "scriptloader_load_bytecode", + ], + }, + + // Single module is imported statically and then dynamically. + { + src: "file_script_module_static_and_dynamic.html", + encodeEvents: [ + // file_script_module_static_and_dynamic.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level (element) + "scriptloader_encode", + "scriptloader_bytecode_saved", + "test_evaluated", + + // file_script_module_static_and_dynamic_imported_1.mjs + "scriptloader_load_source", + "scriptloader_evaluate_module", // dispatched only for top-level (dynamic) + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_static_and_dynamic_imported_2.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + + // file_script_module_static_and_dynamic_imported_3.mjs + "scriptloader_load_source", + "scriptloader_encode", + "scriptloader_bytecode_saved", + ], + decodeEvents: [ + // file_script_module_static_and_dynamic.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level (element) + "test_evaluated", + + // file_script_module_static_and_dynamic_imported_1.mjs + "scriptloader_load_bytecode", + "scriptloader_evaluate_module", // dispatched only for top-level (dynamic) + + // file_script_module_static_and_dynamic_imported_2.mjs + "scriptloader_load_bytecode", + + // file_script_module_static_and_dynamic_imported_3.mjs + "scriptloader_load_bytecode", + ], + }, +]; + +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, encodeEvents, decodeEvents } of tests) { + for (let i = 0; i < 2; i++) { + const expectedEvents = i == 0 ? encodeEvents : decodeEvents; + + const iframe = document.createElement("iframe"); + document.body.appendChild(iframe); + + const iwin = iframe.contentWindow; + + dump("## Start: " + src + "\n"); + let observedEvents = []; + await new Promise(resolve => { + function logEvent(evt) { + if (evt.type != "test_evaluated") { + if (!/^watchme/.test(evt.target.id)) { + return; + } + } + dump("## ScriptLoader event: " + evt.type + "\n"); + observedEvents.push(evt.type); + if (observedEvents.length == expectedEvents.length) { + resolve(); + } + } + iwin.addEventListener("scriptloader_load_source", logEvent); + iwin.addEventListener("scriptloader_load_bytecode", logEvent); + iwin.addEventListener("scriptloader_execute", logEvent); + iwin.addEventListener("scriptloader_evaluate_module", logEvent); + iwin.addEventListener("scriptloader_encode", logEvent); + iwin.addEventListener("scriptloader_no_encode", logEvent); + iwin.addEventListener("scriptloader_bytecode_saved", logEvent); + iwin.addEventListener("scriptloader_bytecode_failed", logEvent); + iwin.addEventListener("scriptloader_fallback", logEvent); + iwin.addEventListener("test_evaluated", logEvent); + iframe.src = src; + }); + + // The event order is non-deterministic. + // Just compare them as multi-set. + expectedEvents.sort(); + observedEvents.sort(); + assert_equals( + JSON.stringify(observedEvents), + JSON.stringify(expectedEvents), + `Expected events should be observed for ${src} during ${i == 0 ? "encoding" : "decoding"}`); + + 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> |