commit fa684179439b086d349f9acb845bfbafe1fa9975
parent 99a9d9b82c33a4c60ce1e5767109cd9a84a17e9f
Author: Tooru Fujisawa <arai_a@mac.com>
Date: Sat, 8 Nov 2025 02:36:09 +0000
Bug 1998322 - Part 2: Split js cache tests. r=nbp
Differential Revision: https://phabricator.services.mozilla.com/D271705
Diffstat:
11 files changed, 3070 insertions(+), 5 deletions(-)
diff --git a/dom/base/test/browser.toml b/dom/base/test/browser.toml
@@ -154,22 +154,76 @@ support-files = [
["browser_screen_orientation_override.js"]
-["browser_script_loader_js_cache.js"]
+["browser_script_loader_js_cache_basic.js"]
support-files = [
"empty.html",
"file_js_cache_small.js",
"file_js_cache_large.js",
"file_js_cache_large_syntax_error.js",
- "file_js_cache_importer.mjs",
- "file_js_cache_imported1.mjs",
- "file_js_cache_imported2.mjs",
- "file_js_cache_imported3.mjs",
+]
+
+["browser_script_loader_js_cache_classic_vs_module.js"]
+support-files = [
+ "empty.html",
+ "file_js_cache_large.js",
+]
+
+["browser_script_loader_js_cache_compression.js"]
+support-files = [
+ "empty.html",
+ "file_js_cache_large.js",
+]
+
+["browser_script_loader_js_cache_dyn_import.js"]
+support-files = [
+ "empty.html",
"file_js_cache_dyn_importer.mjs",
"file_js_cache_dyn_imported1.mjs",
"file_js_cache_dyn_imported2.mjs",
"file_js_cache_dyn_imported3.mjs",
]
+["browser_script_loader_js_cache_module.js"]
+support-files = [
+ "empty.html",
+ "file_js_cache_small.js",
+ "file_js_cache_large.js",
+ "file_js_cache_importer.mjs",
+ "file_js_cache_imported1.mjs",
+ "file_js_cache_imported2.mjs",
+ "file_js_cache_imported3.mjs",
+]
+
+["browser_script_loader_js_cache_sri_after_save.js"]
+support-files = [
+ "empty.html",
+ "file_js_cache_large.js",
+]
+
+["browser_script_loader_js_cache_sri_basic.js"]
+support-files = [
+ "empty.html",
+ "file_js_cache_large.js",
+]
+
+["browser_script_loader_js_cache_sri_different.js"]
+support-files = [
+ "empty.html",
+ "file_js_cache_large.js",
+]
+
+["browser_script_loader_js_cache_sri_invalid.js"]
+support-files = [
+ "empty.html",
+ "file_js_cache_large.js",
+]
+
+["browser_script_loader_js_cache_sri_mismatch.js"]
+support-files = [
+ "empty.html",
+ "file_js_cache_large.js",
+]
+
["browser_set_focus_after_reuse_bcg.js"]
["browser_state_notifications.js"]
diff --git a/dom/base/test/browser_script_loader_js_cache_basic.js b/dom/base/test/browser_script_loader_js_cache_basic.js
@@ -0,0 +1,329 @@
+// ev, unordered, and runJSCacheTests are defined in head.js
+
+add_task(async function testDiskCache() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", false],
+ ],
+ });
+
+ await runJSCacheTests([
+ // A small file shouldn't be saved to the disk.
+ {
+ title: "small file",
+ items: [
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:source", "file_js_cache_small.js"),
+ ev("evaluate:classic", "file_js_cache_small.js"),
+ ev("diskcache:disabled", "file_js_cache_small.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:source", "file_js_cache_small.js"),
+ ev("evaluate:classic", "file_js_cache_small.js"),
+ ev("diskcache:disabled", "file_js_cache_small.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:source", "file_js_cache_small.js"),
+ ev("evaluate:classic", "file_js_cache_small.js"),
+ ev("diskcache:disabled", "file_js_cache_small.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:source", "file_js_cache_small.js"),
+ ev("evaluate:classic", "file_js_cache_small.js"),
+ ev("diskcache:disabled", "file_js_cache_small.js"),
+ ],
+ },
+ ],
+ },
+
+ // A large file should be saved to the disk on the 4th load, and should be
+ // used on the 5th load. Also the 5th load shouldn't overwrite the cache.
+ {
+ title: "large file",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+
+ // A file with compile error shouldn't be saved to the disk.
+ {
+ title: "syntax error",
+ items: [
+ {
+ file: "file_js_cache_large_syntax_error.js",
+ events: [
+ ev("load:source", "file_js_cache_large_syntax_error.js"),
+ ev("diskcache:disabled", "file_js_cache_large_syntax_error.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large_syntax_error.js",
+ events: [
+ ev("load:source", "file_js_cache_large_syntax_error.js"),
+ ev("diskcache:disabled", "file_js_cache_large_syntax_error.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large_syntax_error.js",
+ events: [
+ ev("load:source", "file_js_cache_large_syntax_error.js"),
+ ev("diskcache:disabled", "file_js_cache_large_syntax_error.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large_syntax_error.js",
+ events: [
+ ev("load:source", "file_js_cache_large_syntax_error.js"),
+ ev("diskcache:disabled", "file_js_cache_large_syntax_error.js"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function testMemoryCache() {
+ if (!AppConstants.NIGHTLY_BUILD) {
+ todo(false, "navigation cache is not yet enabled on non-nightly");
+ return;
+ }
+
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", true],
+ ],
+ });
+
+ // If in-memory cache is enabled, the disk cache is handled by the
+ // SharedScriptCache, and following differences happen:
+ // * diskcache:disabled and diskcache:register are not notified for
+ // each script
+ // * diskcache:noschedule is notified without associated script
+ // if there's no script to be saved
+
+ await runJSCacheTests([
+ // A small file should be saved to the memory on the 1st load, and used on
+ // the 2nd load. But it shouldn't be saved to the disk cache.
+ {
+ title: "small file",
+ items: [
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:source", "file_js_cache_small.js"),
+ ev("memorycache:saved", "file_js_cache_small.js"),
+ ev("evaluate:classic", "file_js_cache_small.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_small.js"),
+ ev("evaluate:classic", "file_js_cache_small.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_small.js"),
+ ev("evaluate:classic", "file_js_cache_small.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_small.js"),
+ ev("evaluate:classic", "file_js_cache_small.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+
+ // A large file should be saved to the memory on the 1st load, and used on
+ // the 2nd load. Also it should be saved to the disk on the 4th load.
+ // Also the 5th load shouldn't overwrite the cache.
+ // Once the memory cache is purged, it should be populated from the disk
+ // cache response.
+ {
+ title: "large file",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+
+ {
+ clearMemory: true,
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+
+ // A file with compile error shouldn't be saved to any cache.
+ {
+ title: "syntax error",
+ items: [
+ {
+ file: "file_js_cache_large_syntax_error.js",
+ events: [
+ ev("load:source", "file_js_cache_large_syntax_error.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large_syntax_error.js",
+ events: [
+ ev("load:source", "file_js_cache_large_syntax_error.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large_syntax_error.js",
+ events: [
+ ev("load:source", "file_js_cache_large_syntax_error.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large_syntax_error.js",
+ events: [
+ ev("load:source", "file_js_cache_large_syntax_error.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
diff --git a/dom/base/test/browser_script_loader_js_cache_classic_vs_module.js b/dom/base/test/browser_script_loader_js_cache_classic_vs_module.js
@@ -0,0 +1,247 @@
+// ev, unordered, and runJSCacheTests are defined in head.js
+
+add_task(async function testDiskCache_classicVsModules() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", false],
+ ],
+ });
+
+ await runJSCacheTests([
+ // A classic script's disk cache shouldn't be used by module.
+ // A large module file should be saved to the disk.
+ {
+ title: "classic script disk cache vs module",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ module: true,
+ events: [
+ // This should load source.
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "module script disk cache vs classic",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ module: true,
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ module: true,
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ module: true,
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ module: true,
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ // This should load source.
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function testMemoryCache_classicVsModules() {
+ if (!AppConstants.NIGHTLY_BUILD) {
+ todo(false, "navigation cache is not yet enabled on non-nightly");
+ return;
+ }
+
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", true],
+ ],
+ });
+
+ await runJSCacheTests([
+ // A classic script's disk cache shouldn't be used by module.
+ // A large module file should be saved to the disk.
+ {
+ title: "classic script disk cache vs module",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ module: true,
+ events: [
+ // Memory cached item is classic.
+ // Module load should immediately fetch source from necko.
+ ev("load:source", "file_js_cache_large.js"),
+ // and save a separate item.
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "module script disk cache vs script",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ module: true,
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ module: true,
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ module: true,
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ module: true,
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
diff --git a/dom/base/test/browser_script_loader_js_cache_compression.js b/dom/base/test/browser_script_loader_js_cache_compression.js
@@ -0,0 +1,148 @@
+// ev, unordered, and runJSCacheTests are defined in head.js
+
+add_task(async function testDiskCache_compression() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", false],
+ ["browser.cache.jsbc_compression_level", 2],
+ ],
+ });
+
+ await runJSCacheTests([
+ {
+ title: "large file with compression",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function testMemoryCache_compression() {
+ if (!AppConstants.NIGHTLY_BUILD) {
+ todo(false, "navigation cache is not yet enabled on non-nightly");
+ return;
+ }
+
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", true],
+ ["browser.cache.jsbc_compression_level", 2],
+ ],
+ });
+
+ await runJSCacheTests([
+ {
+ title: "large file with compression",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
diff --git a/dom/base/test/browser_script_loader_js_cache_dyn_import.js b/dom/base/test/browser_script_loader_js_cache_dyn_import.js
@@ -0,0 +1,188 @@
+// ev, unordered, and runJSCacheTests are defined in head.js
+
+add_task(async function testDiskCache_dynamicImport() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", false],
+ ],
+ });
+
+ await runJSCacheTests([
+ {
+ title: "dynamically imported modules",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_dyn_importer.mjs",
+ events: [
+ ev("load:source", "file_js_cache_dyn_importer.mjs"),
+ ev("evaluate:module", "file_js_cache_dyn_importer.mjs"),
+ ev("diskcache:disabled", "file_js_cache_dyn_importer.mjs"),
+ ev("load:source", "file_js_cache_dyn_imported1.mjs", false),
+ ev("diskcache:disabled", "file_js_cache_dyn_imported1.mjs", false),
+ ev("load:source", "file_js_cache_dyn_imported2.mjs", false),
+ ev("diskcache:disabled", "file_js_cache_dyn_imported2.mjs", false),
+ ev("load:source", "file_js_cache_dyn_imported3.mjs", false),
+ ev("diskcache:disabled", "file_js_cache_dyn_imported3.mjs", false),
+ ],
+ },
+ {
+ file: "file_js_cache_dyn_importer.mjs",
+ events: [
+ ev("load:source", "file_js_cache_dyn_importer.mjs"),
+ ev("evaluate:module", "file_js_cache_dyn_importer.mjs"),
+ ev("diskcache:disabled", "file_js_cache_dyn_importer.mjs"),
+ ev("load:source", "file_js_cache_dyn_imported1.mjs", false),
+ ev("diskcache:disabled", "file_js_cache_dyn_imported1.mjs", false),
+ ev("load:source", "file_js_cache_dyn_imported2.mjs", false),
+ ev("diskcache:disabled", "file_js_cache_dyn_imported2.mjs", false),
+ ev("load:source", "file_js_cache_dyn_imported3.mjs", false),
+ ev("diskcache:disabled", "file_js_cache_dyn_imported3.mjs", false),
+ ],
+ },
+ {
+ file: "file_js_cache_dyn_importer.mjs",
+ events: [
+ ev("load:source", "file_js_cache_dyn_importer.mjs"),
+ ev("evaluate:module", "file_js_cache_dyn_importer.mjs"),
+ ev("diskcache:disabled", "file_js_cache_dyn_importer.mjs"),
+ ev("load:source", "file_js_cache_dyn_imported1.mjs", false),
+ ev("diskcache:disabled", "file_js_cache_dyn_imported1.mjs", false),
+ ev("load:source", "file_js_cache_dyn_imported2.mjs", false),
+ ev("diskcache:disabled", "file_js_cache_dyn_imported2.mjs", false),
+ ev("load:source", "file_js_cache_dyn_imported3.mjs", false),
+ ev("diskcache:disabled", "file_js_cache_dyn_imported3.mjs", false),
+ ],
+ },
+ {
+ file: "file_js_cache_dyn_importer.mjs",
+ events: [
+ ev("load:source", "file_js_cache_dyn_importer.mjs"),
+ ev("evaluate:module", "file_js_cache_dyn_importer.mjs"),
+ ev("diskcache:register", "file_js_cache_dyn_importer.mjs"),
+ ev("load:source", "file_js_cache_dyn_imported1.mjs", false),
+ ev("diskcache:register", "file_js_cache_dyn_imported1.mjs", false),
+ ev("load:source", "file_js_cache_dyn_imported2.mjs", false),
+ ev("diskcache:register", "file_js_cache_dyn_imported2.mjs", false),
+ ev("load:source", "file_js_cache_dyn_imported3.mjs", false),
+ ev("diskcache:register", "file_js_cache_dyn_imported3.mjs", false),
+ ev("diskcache:saved", "file_js_cache_dyn_importer.mjs", false),
+ ev("diskcache:saved", "file_js_cache_dyn_imported1.mjs", false),
+ ev("diskcache:saved", "file_js_cache_dyn_imported2.mjs", false),
+ ev("diskcache:saved", "file_js_cache_dyn_imported3.mjs", false),
+ ],
+ },
+ {
+ file: "file_js_cache_dyn_importer.mjs",
+ events: [
+ ev("load:diskcache", "file_js_cache_dyn_importer.mjs"),
+ ev("evaluate:module", "file_js_cache_dyn_importer.mjs"),
+ ev("diskcache:disabled", "file_js_cache_dyn_importer.mjs"),
+ ev("load:diskcache", "file_js_cache_dyn_imported1.mjs", false),
+ ev("diskcache:disabled", "file_js_cache_dyn_imported1.mjs", false),
+ ev("load:diskcache", "file_js_cache_dyn_imported2.mjs", false),
+ ev("diskcache:disabled", "file_js_cache_dyn_imported2.mjs", false),
+ ev("load:diskcache", "file_js_cache_dyn_imported3.mjs", false),
+ ev("diskcache:disabled", "file_js_cache_dyn_imported3.mjs", false),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function testMemoryCache_dynamicImport() {
+ if (!AppConstants.NIGHTLY_BUILD) {
+ todo(false, "navigation cache is not yet enabled on non-nightly");
+ return;
+ }
+
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", true],
+ ],
+ });
+
+ await runJSCacheTests([
+ {
+ title: "dynamically imported modules",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_dyn_importer.mjs",
+ events: [
+ ev("load:source", "file_js_cache_dyn_importer.mjs"),
+ ev("memorycache:saved", "file_js_cache_dyn_importer.mjs"),
+ ev("evaluate:module", "file_js_cache_dyn_importer.mjs"),
+ ev("load:source", "file_js_cache_dyn_imported1.mjs", false),
+ ev("memorycache:saved", "file_js_cache_dyn_imported1.mjs", false),
+ ev("load:source", "file_js_cache_dyn_imported2.mjs", false),
+ ev("memorycache:saved", "file_js_cache_dyn_imported2.mjs", false),
+ ev("load:source", "file_js_cache_dyn_imported3.mjs", false),
+ ev("memorycache:saved", "file_js_cache_dyn_imported3.mjs", false),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_dyn_importer.mjs",
+ events: [
+ ev("load:memorycache", "file_js_cache_dyn_importer.mjs"),
+ ev("evaluate:module", "file_js_cache_dyn_importer.mjs"),
+ ev("load:memorycache", "file_js_cache_dyn_imported1.mjs", false),
+ ev("load:memorycache", "file_js_cache_dyn_imported2.mjs", false),
+ ev("load:memorycache", "file_js_cache_dyn_imported3.mjs", false),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_dyn_importer.mjs",
+ events: [
+ ev("load:memorycache", "file_js_cache_dyn_importer.mjs"),
+ ev("evaluate:module", "file_js_cache_dyn_importer.mjs"),
+ ev("load:memorycache", "file_js_cache_dyn_imported1.mjs", false),
+ ev("load:memorycache", "file_js_cache_dyn_imported2.mjs", false),
+ ev("load:memorycache", "file_js_cache_dyn_imported3.mjs", false),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_dyn_importer.mjs",
+ events: [
+ ev("load:memorycache", "file_js_cache_dyn_importer.mjs"),
+ ev("evaluate:module", "file_js_cache_dyn_importer.mjs"),
+ ev("load:memorycache", "file_js_cache_dyn_imported1.mjs", false),
+ ev("load:memorycache", "file_js_cache_dyn_imported2.mjs", false),
+ ev("load:memorycache", "file_js_cache_dyn_imported3.mjs", false),
+ unordered([
+ ev("diskcache:saved", "file_js_cache_dyn_importer.mjs", false),
+ ev("diskcache:saved", "file_js_cache_dyn_imported1.mjs", false),
+ ev("diskcache:saved", "file_js_cache_dyn_imported2.mjs", false),
+ ev("diskcache:saved", "file_js_cache_dyn_imported3.mjs", false),
+ ]),
+ ],
+ },
+ {
+ file: "file_js_cache_dyn_importer.mjs",
+ events: [
+ ev("load:memorycache", "file_js_cache_dyn_importer.mjs"),
+ ev("evaluate:module", "file_js_cache_dyn_importer.mjs"),
+ ev("load:memorycache", "file_js_cache_dyn_imported1.mjs", false),
+ ev("load:memorycache", "file_js_cache_dyn_imported2.mjs", false),
+ ev("load:memorycache", "file_js_cache_dyn_imported3.mjs", false),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
diff --git a/dom/base/test/browser_script_loader_js_cache_module.js b/dom/base/test/browser_script_loader_js_cache_module.js
@@ -0,0 +1,353 @@
+// ev, unordered, and runJSCacheTests are defined in head.js
+
+add_task(async function testDiskCache_modules() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", false],
+ ],
+ });
+
+ await runJSCacheTests([
+ // A small module shouldn't be saved to the disk.
+ {
+ title: "small module",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:source", "file_js_cache_small.js"),
+ ev("evaluate:module", "file_js_cache_small.js"),
+ ev("diskcache:disabled", "file_js_cache_small.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:source", "file_js_cache_small.js"),
+ ev("evaluate:module", "file_js_cache_small.js"),
+ ev("diskcache:disabled", "file_js_cache_small.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:source", "file_js_cache_small.js"),
+ ev("evaluate:module", "file_js_cache_small.js"),
+ ev("diskcache:disabled", "file_js_cache_small.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:source", "file_js_cache_small.js"),
+ ev("evaluate:module", "file_js_cache_small.js"),
+ ev("diskcache:disabled", "file_js_cache_small.js"),
+ ],
+ },
+ ],
+ },
+
+ // A large module file should be saved to the disk.
+ {
+ title: "large module",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ ],
+ },
+
+ // All imported modules should be saved to the disk.
+ {
+ title: "imported modules",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_importer.mjs",
+ events: [
+ ev("load:source", "file_js_cache_importer.mjs"),
+ ev("load:source", "file_js_cache_imported1.mjs", false),
+ ev("load:source", "file_js_cache_imported2.mjs", false),
+ ev("load:source", "file_js_cache_imported3.mjs", false),
+ ev("evaluate:module", "file_js_cache_importer.mjs"),
+ ev("diskcache:disabled", "file_js_cache_importer.mjs"),
+ // non-top-level modules that don't pass the condition
+ // don't emit events.
+ ],
+ },
+ {
+ file: "file_js_cache_importer.mjs",
+ events: [
+ ev("load:source", "file_js_cache_importer.mjs"),
+ ev("load:source", "file_js_cache_imported1.mjs", false),
+ ev("load:source", "file_js_cache_imported2.mjs", false),
+ ev("load:source", "file_js_cache_imported3.mjs", false),
+ ev("evaluate:module", "file_js_cache_importer.mjs"),
+ ev("diskcache:disabled", "file_js_cache_importer.mjs"),
+ ],
+ },
+ {
+ file: "file_js_cache_importer.mjs",
+ events: [
+ ev("load:source", "file_js_cache_importer.mjs"),
+ ev("load:source", "file_js_cache_imported1.mjs", false),
+ ev("load:source", "file_js_cache_imported2.mjs", false),
+ ev("load:source", "file_js_cache_imported3.mjs", false),
+ ev("evaluate:module", "file_js_cache_importer.mjs"),
+ ev("diskcache:disabled", "file_js_cache_importer.mjs"),
+ ],
+ },
+ {
+ file: "file_js_cache_importer.mjs",
+ events: [
+ ev("load:source", "file_js_cache_importer.mjs"),
+ ev("load:source", "file_js_cache_imported1.mjs", false),
+ ev("load:source", "file_js_cache_imported2.mjs", false),
+ ev("load:source", "file_js_cache_imported3.mjs", false),
+ ev("evaluate:module", "file_js_cache_importer.mjs"),
+ ev("diskcache:register", "file_js_cache_importer.mjs"),
+ ev("diskcache:register", "file_js_cache_imported1.mjs", false),
+ ev("diskcache:register", "file_js_cache_imported2.mjs", false),
+ ev("diskcache:register", "file_js_cache_imported3.mjs", false),
+ ev("diskcache:saved", "file_js_cache_importer.mjs", false),
+ ev("diskcache:saved", "file_js_cache_imported1.mjs", false),
+ ev("diskcache:saved", "file_js_cache_imported2.mjs", false),
+ ev("diskcache:saved", "file_js_cache_imported3.mjs", false),
+ ],
+ },
+ {
+ file: "file_js_cache_importer.mjs",
+ events: [
+ ev("load:diskcache", "file_js_cache_importer.mjs"),
+ ev("load:diskcache", "file_js_cache_imported1.mjs", false),
+ ev("load:diskcache", "file_js_cache_imported2.mjs", false),
+ ev("load:diskcache", "file_js_cache_imported3.mjs", false),
+ ev("evaluate:module", "file_js_cache_importer.mjs"),
+ ev("diskcache:disabled", "file_js_cache_importer.mjs"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function testMemoryCache_modules() {
+ if (!AppConstants.NIGHTLY_BUILD) {
+ todo(false, "navigation cache is not yet enabled on non-nightly");
+ return;
+ }
+
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", true],
+ ],
+ });
+
+ await runJSCacheTests([
+ // A small module shouldn't be saved to the disk.
+ {
+ title: "small module",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:source", "file_js_cache_small.js"),
+ ev("memorycache:saved", "file_js_cache_small.js"),
+ ev("evaluate:module", "file_js_cache_small.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_small.js"),
+ ev("evaluate:module", "file_js_cache_small.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_small.js"),
+ ev("evaluate:module", "file_js_cache_small.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_small.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_small.js"),
+ ev("evaluate:module", "file_js_cache_small.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+
+ // A large module file should be saved to the disk.
+ {
+ title: "large module",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+
+ // All imported modules should be saved to the disk.
+ {
+ title: "imported modules",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_importer.mjs",
+ events: [
+ ev("load:source", "file_js_cache_importer.mjs"),
+ ev("memorycache:saved", "file_js_cache_importer.mjs"),
+ ev("load:source", "file_js_cache_imported1.mjs", false),
+ ev("memorycache:saved", "file_js_cache_imported1.mjs", false),
+ ev("load:source", "file_js_cache_imported2.mjs", false),
+ ev("memorycache:saved", "file_js_cache_imported2.mjs", false),
+ ev("load:source", "file_js_cache_imported3.mjs", false),
+ ev("memorycache:saved", "file_js_cache_imported3.mjs", false),
+ ev("evaluate:module", "file_js_cache_importer.mjs"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_importer.mjs",
+ events: [
+ ev("load:memorycache", "file_js_cache_importer.mjs"),
+ ev("load:memorycache", "file_js_cache_imported1.mjs", false),
+ ev("load:memorycache", "file_js_cache_imported2.mjs", false),
+ ev("load:memorycache", "file_js_cache_imported3.mjs", false),
+ ev("evaluate:module", "file_js_cache_importer.mjs"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_importer.mjs",
+ events: [
+ ev("load:memorycache", "file_js_cache_importer.mjs"),
+ ev("load:memorycache", "file_js_cache_imported1.mjs", false),
+ ev("load:memorycache", "file_js_cache_imported2.mjs", false),
+ ev("load:memorycache", "file_js_cache_imported3.mjs", false),
+ ev("evaluate:module", "file_js_cache_importer.mjs"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_importer.mjs",
+ events: [
+ ev("load:memorycache", "file_js_cache_importer.mjs"),
+ ev("load:memorycache", "file_js_cache_imported1.mjs", false),
+ ev("load:memorycache", "file_js_cache_imported2.mjs", false),
+ ev("load:memorycache", "file_js_cache_imported3.mjs", false),
+ ev("evaluate:module", "file_js_cache_importer.mjs"),
+ // SharedScriptCache iterates over unordered hashmap while
+ // saving.
+ unordered([
+ ev("diskcache:saved", "file_js_cache_importer.mjs", false),
+ ev("diskcache:saved", "file_js_cache_imported1.mjs", false),
+ ev("diskcache:saved", "file_js_cache_imported2.mjs", false),
+ ev("diskcache:saved", "file_js_cache_imported3.mjs", false),
+ ]),
+ ],
+ },
+ {
+ file: "file_js_cache_importer.mjs",
+ events: [
+ ev("load:memorycache", "file_js_cache_importer.mjs"),
+ ev("load:memorycache", "file_js_cache_imported1.mjs", false),
+ ev("load:memorycache", "file_js_cache_imported2.mjs", false),
+ ev("load:memorycache", "file_js_cache_imported3.mjs", false),
+ ev("evaluate:module", "file_js_cache_importer.mjs"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
diff --git a/dom/base/test/browser_script_loader_js_cache_sri_after_save.js b/dom/base/test/browser_script_loader_js_cache_sri_after_save.js
@@ -0,0 +1,280 @@
+// ev, unordered, and runJSCacheTests are defined in head.js
+
+add_task(async function testDiskCache_SRIAfterSave() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", false],
+ ],
+ });
+
+ // If SRI is specified after the disk cache is created, it should
+ // fallback to the source, and then save again with the SRI.
+ await runJSCacheTests([
+ {
+ title: "SRI on classic after save",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("load:fallback", "file_js_cache_large.js"),
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "SRI on module after save",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("load:fallback", "file_js_cache_large.js"),
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function testMemoryCache_SRIAfterSave() {
+ if (!AppConstants.NIGHTLY_BUILD) {
+ todo(false, "navigation cache is not yet enabled on non-nightly");
+ return;
+ }
+
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", true],
+ ],
+ });
+
+ // If SRI is specified after the disk cache is created, it should
+ // fallback to the source, and then save again with the SRI.
+ await runJSCacheTests([
+ {
+ title: "SRI on classic after save",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ // Memory cache doesn't support different SRI, but
+ // disk cache does.
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "SRI on module after save",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
diff --git a/dom/base/test/browser_script_loader_js_cache_sri_basic.js b/dom/base/test/browser_script_loader_js_cache_sri_basic.js
@@ -0,0 +1,246 @@
+// ev, unordered, and runJSCacheTests are defined in head.js
+
+add_task(async function testDiskCache_SRI() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", false],
+ ],
+ });
+
+ await runJSCacheTests([
+ {
+ title: "SRI on classic",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "SRI on module",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function testMemoryCache_SRI() {
+ if (!AppConstants.NIGHTLY_BUILD) {
+ todo(false, "navigation cache is not yet enabled on non-nightly");
+ return;
+ }
+
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", true],
+ ],
+ });
+
+ await runJSCacheTests([
+ {
+ title: "SRI on classic",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "SRI on module",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
diff --git a/dom/base/test/browser_script_loader_js_cache_sri_different.js b/dom/base/test/browser_script_loader_js_cache_sri_different.js
@@ -0,0 +1,318 @@
+// ev, unordered, and runJSCacheTests are defined in head.js
+
+add_task(async function testDiskCache_DifferentSRI() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", false],
+ ],
+ });
+
+ // If different SRI is specified after the disk cache is created, it should
+ // fallback to the source, and then save again with the SRI.
+ await runJSCacheTests([
+ {
+ title: "different SRI on classic after save",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha512-NN5Pp0blZjckIohQdMbZwclYHNV3QXnL/UiR1R0h66KMc2zRCgfFQ56zpTd8UCYB/RkAQ6HUbPzlGr8JWUp6AQ==",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("load:fallback", "file_js_cache_large.js"),
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha512-NN5Pp0blZjckIohQdMbZwclYHNV3QXnL/UiR1R0h66KMc2zRCgfFQ56zpTd8UCYB/RkAQ6HUbPzlGr8JWUp6AQ==",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "different SRI on module after save",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha512-NN5Pp0blZjckIohQdMbZwclYHNV3QXnL/UiR1R0h66KMc2zRCgfFQ56zpTd8UCYB/RkAQ6HUbPzlGr8JWUp6AQ==",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("load:fallback", "file_js_cache_large.js"),
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha512-NN5Pp0blZjckIohQdMbZwclYHNV3QXnL/UiR1R0h66KMc2zRCgfFQ56zpTd8UCYB/RkAQ6HUbPzlGr8JWUp6AQ==",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function testMemoryCache_DifferentSRI() {
+ if (!AppConstants.NIGHTLY_BUILD) {
+ todo(false, "navigation cache is not yet enabled on non-nightly");
+ return;
+ }
+
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", true],
+ ],
+ });
+
+ // If different SRI is specified after the disk cache is created, it should
+ // fallback to the source, and then save again with the SRI.
+ await runJSCacheTests([
+ {
+ title: "different SRI on classic after save",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha512-NN5Pp0blZjckIohQdMbZwclYHNV3QXnL/UiR1R0h66KMc2zRCgfFQ56zpTd8UCYB/RkAQ6HUbPzlGr8JWUp6AQ==",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("load:fallback", "file_js_cache_large.js"),
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ // Disk cache's fetch count is not incremented for non-first
+ // load, and the fetch count here doesn't hit the minimum.
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha512-NN5Pp0blZjckIohQdMbZwclYHNV3QXnL/UiR1R0h66KMc2zRCgfFQ56zpTd8UCYB/RkAQ6HUbPzlGr8JWUp6AQ==",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha512-NN5Pp0blZjckIohQdMbZwclYHNV3QXnL/UiR1R0h66KMc2zRCgfFQ56zpTd8UCYB/RkAQ6HUbPzlGr8JWUp6AQ==",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha512-NN5Pp0blZjckIohQdMbZwclYHNV3QXnL/UiR1R0h66KMc2zRCgfFQ56zpTd8UCYB/RkAQ6HUbPzlGr8JWUp6AQ==",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "different SRI on module after save",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha512-NN5Pp0blZjckIohQdMbZwclYHNV3QXnL/UiR1R0h66KMc2zRCgfFQ56zpTd8UCYB/RkAQ6HUbPzlGr8JWUp6AQ==",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("load:fallback", "file_js_cache_large.js"),
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha512-NN5Pp0blZjckIohQdMbZwclYHNV3QXnL/UiR1R0h66KMc2zRCgfFQ56zpTd8UCYB/RkAQ6HUbPzlGr8JWUp6AQ==",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
diff --git a/dom/base/test/browser_script_loader_js_cache_sri_invalid.js b/dom/base/test/browser_script_loader_js_cache_sri_invalid.js
@@ -0,0 +1,446 @@
+// ev, unordered, and runJSCacheTests are defined in head.js
+
+add_task(async function testDiskCache_InvalidSRI() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", false],
+ ],
+ });
+
+ await runJSCacheTests([
+ // Invalid integrity attribute should be ignored.
+ {
+ title: "invalid SRI on classic",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "invalid SRI on classic only after cached",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "invalid SRI on module",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "invalid SRI on module only after cached",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function testMemoryCache_InvalidSRI() {
+ if (!AppConstants.NIGHTLY_BUILD) {
+ todo(false, "navigation cache is not yet enabled on non-nightly");
+ return;
+ }
+
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", true],
+ ],
+ });
+
+ await runJSCacheTests([
+ // Invalid integrity attribute should be ignored.
+ {
+ title: "invalid SRI on classic",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "invalid SRI on classic only after cached",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ // Integrity attribute contributes to the memory cache key
+ // even if it's invalid.
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "invalid SRI on module",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "invalid SRI on module only after cached",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "invalid",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
diff --git a/dom/base/test/browser_script_loader_js_cache_sri_mismatch.js b/dom/base/test/browser_script_loader_js_cache_sri_mismatch.js
@@ -0,0 +1,456 @@
+// ev, unordered, and runJSCacheTests are defined in head.js
+
+add_task(async function testDiskCache_SRIMismatchAfterSave() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", false],
+ ],
+ });
+
+ // If different SRI is specified after the disk cache is created, it should
+ // fallback to the source, and then save again with the SRI.
+ await runJSCacheTests([
+ {
+ title: "wrong SRI with same algorithm on classic after save",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-fxijQE3W3lWbCjRZx0MCS6pJpCz+dGnNujsFYBzzag9G/fz/6ZiWdM/GAsMzGlAI",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("sri:corrupt", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "wrong SRI with different algorithm on classic after save",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha512-8fAu+4y0SKpriy0fz4IuLgiXLyTCGVInfJHvIl8JOdxm+xKJVHVhX7RTfEUpExZYoOJqzpVRkK/6nfglpK7Dow==",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("sri:corrupt", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "wrong SRI with same algorithm on module after save",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-fxijQE3W3lWbCjRZx0MCS6pJpCz+dGnNujsFYBzzag9G/fz/6ZiWdM/GAsMzGlAI",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("sri:corrupt", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "wrong SRI with different algorithm on module after save",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:disabled", "file_js_cache_large.js"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:register", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha512-8fAu+4y0SKpriy0fz4IuLgiXLyTCGVInfJHvIl8JOdxm+xKJVHVhX7RTfEUpExZYoOJqzpVRkK/6nfglpK7Dow==",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("load:fallback", "file_js_cache_large.js"),
+ ev("load:source", "file_js_cache_large.js"),
+ ev("sri:corrupt", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function testMemoryCache_SRIMismatchAfterSave() {
+ if (!AppConstants.NIGHTLY_BUILD) {
+ todo(false, "navigation cache is not yet enabled on non-nightly");
+ return;
+ }
+
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["dom.expose_test_interfaces", true],
+ ["dom.script_loader.bytecode_cache.enabled", true],
+ ["dom.script_loader.bytecode_cache.strategy", 0],
+ ["dom.script_loader.experimental.navigation_cache", true],
+ ],
+ });
+
+ // If different SRI is specified after the disk cache is created, it should
+ // fallback to the source, and then save again with the SRI.
+ await runJSCacheTests([
+ {
+ title: "wrong SRI with same algorithm on classic after save",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-fxijQE3W3lWbCjRZx0MCS6pJpCz+dGnNujsFYBzzag9G/fz/6ZiWdM/GAsMzGlAI",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("sri:corrupt", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "wrong SRI with different algorithm on classic after save",
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:classic", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha512-8fAu+4y0SKpriy0fz4IuLgiXLyTCGVInfJHvIl8JOdxm+xKJVHVhX7RTfEUpExZYoOJqzpVRkK/6nfglpK7Dow==",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("sri:corrupt", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "wrong SRI with same algorithm on module after save",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-fxijQE3W3lWbCjRZx0MCS6pJpCz+dGnNujsFYBzzag9G/fz/6ZiWdM/GAsMzGlAI",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("sri:corrupt", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+
+ {
+ title: "wrong SRI with different algorithm on module after save",
+ module: true,
+ items: [
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:saved", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha384-vJ7r8qsSxGVQwKbj+5A1avW8CEb6bODkGULlUVOmqN81D6XQzaTFhspcWmO+PVSQ",
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:saved", "file_js_cache_large.js", false),
+ ],
+ },
+ {
+ file: "file_js_cache_large.js",
+ sri: "sha512-8fAu+4y0SKpriy0fz4IuLgiXLyTCGVInfJHvIl8JOdxm+xKJVHVhX7RTfEUpExZYoOJqzpVRkK/6nfglpK7Dow==",
+ events: [
+ ev("load:diskcache", "file_js_cache_large.js"),
+ ev("load:fallback", "file_js_cache_large.js"),
+ ev("load:source", "file_js_cache_large.js"),
+ ev("sri:corrupt", "file_js_cache_large.js"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});