commit 3728e0c87fc4fa87ddf0c7a8183f2dd2329be96a
parent e697a404bb6e0b1be96b679ed6b384f7d736aa4c
Author: Tooru Fujisawa <arai_a@mac.com>
Date: Wed, 19 Nov 2025 00:44:40 +0000
Bug 1998925 - Part 3: Add tests. r=nbp
Differential Revision: https://phabricator.services.mozilla.com/D271877
Diffstat:
4 files changed, 562 insertions(+), 0 deletions(-)
diff --git a/dom/base/test/browser.toml b/dom/base/test/browser.toml
@@ -174,6 +174,22 @@ support-files = [
"file_js_cache_large.js",
]
+["browser_script_loader_js_cache_dirty.js"]
+support-files = [
+ "empty.html",
+ "file_js_cache_large.js",
+]
+
+["browser_script_loader_js_cache_dirty_module.js"]
+support-files = [
+ "empty.html",
+ "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_dyn_import.js"]
support-files = [
"empty.html",
diff --git a/dom/base/test/browser_script_loader_js_cache_dirty.js b/dom/base/test/browser_script_loader_js_cache_dirty.js
@@ -0,0 +1,146 @@
+// ev, unordered, and runJSCacheTests are defined in head.js
+
+add_task(async function testMemoryCache_dirtyStateClassic() {
+ 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: "dirty state revive classic",
+ 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"),
+ ],
+ },
+ {
+ invalidateMemory: true,
+ file: "file_js_cache_large.js",
+ events: [
+ ev("memorycache:dirty:hit", "file_js_cache_large.js"),
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:dirty:revived", "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"),
+ ],
+ },
+ ],
+ },
+ {
+ title: "dirty state evict classic",
+ 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"),
+ ],
+ },
+ {
+ invalidateMemory: true,
+ clearDisk: true,
+ file: "file_js_cache_large.js",
+ events: [
+ ev("memorycache:dirty:hit", "file_js_cache_large.js"),
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:dirty:evicted", "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"),
+ ],
+ },
+ ],
+ },
+ ]);
+
+ await SpecialPowers.popPrefEnv();
+});
diff --git a/dom/base/test/browser_script_loader_js_cache_dirty_module.js b/dom/base/test/browser_script_loader_js_cache_dirty_module.js
@@ -0,0 +1,396 @@
+// ev, unordered, and runJSCacheTests are defined in head.js
+
+add_task(async function testMemoryCache_dirtyStateModule() {
+ 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: "dirty state revive module",
+ 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"),
+ ],
+ },
+ {
+ invalidateMemory: true,
+ file: "file_js_cache_large.js",
+ module: true,
+ events: [
+ ev("memorycache:dirty:hit", "file_js_cache_large.js"),
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:dirty:revived", "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",
+ 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"),
+ ],
+ },
+ ],
+ },
+ {
+ title: "dirty state evict module",
+ 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"),
+ ],
+ },
+ {
+ invalidateMemory: true,
+ clearDisk: true,
+ file: "file_js_cache_large.js",
+ module: true,
+ events: [
+ ev("memorycache:dirty:hit", "file_js_cache_large.js"),
+ ev("load:source", "file_js_cache_large.js"),
+ ev("memorycache:dirty:evicted", "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_js_cache_large.js", false),
+ ],
+ },
+ {
+ 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",
+ module: true,
+ events: [
+ ev("load:memorycache", "file_js_cache_large.js"),
+ ev("evaluate:module", "file_js_cache_large.js"),
+ ev("diskcache:noschedule"),
+ ],
+ },
+ ],
+ },
+ {
+ title: "dirty state revive imported",
+ 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"),
+ unordered([
+ 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"),
+ unordered([
+ 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"),
+ ],
+ },
+ {
+ invalidateMemory: true,
+ file: "file_js_cache_importer.mjs",
+ events: [
+ ev("memorycache:dirty:hit", "file_js_cache_large.js"),
+ ev("load:source", "file_js_cache_importer.mjs"),
+ ev("memorycache:dirty:revived", "file_js_cache_importer.mjs"),
+ unordered([
+ ev("memorycache:dirty:hit", "file_js_cache_imported1.mjs", false),
+ ev("load:source", "file_js_cache_imported1.mjs", false),
+ ev(
+ "memorycache:dirty:revived",
+ "file_js_cache_imported1.mjs",
+ false
+ ),
+
+ ev("memorycache:dirty:hit", "file_js_cache_imported2.mjs", false),
+ ev("load:source", "file_js_cache_imported2.mjs", false),
+ ev(
+ "memorycache:dirty:revived",
+ "file_js_cache_imported2.mjs",
+ false
+ ),
+
+ ev("memorycache:dirty:hit", "file_js_cache_imported3.mjs", false),
+ ev("load:source", "file_js_cache_imported3.mjs", false),
+ ev(
+ "memorycache:dirty:revived",
+ "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"),
+ unordered([
+ 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"),
+ 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"),
+ unordered([
+ 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"),
+ ],
+ },
+ ],
+ },
+ {
+ title: "dirty state evict imported",
+ 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"),
+ unordered([
+ 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"),
+ unordered([
+ 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"),
+ ],
+ },
+ {
+ invalidateMemory: true,
+ clearDisk: true,
+ file: "file_js_cache_importer.mjs",
+ events: [
+ ev("memorycache:dirty:hit", "file_js_cache_large.js"),
+ ev("load:source", "file_js_cache_importer.mjs"),
+ ev("memorycache:dirty:evicted", "file_js_cache_importer.mjs"),
+ ev("memorycache:saved", "file_js_cache_importer.mjs"),
+ unordered([
+ ev("memorycache:dirty:hit", "file_js_cache_imported1.mjs", false),
+ ev("load:source", "file_js_cache_imported1.mjs", false),
+ ev(
+ "memorycache:dirty:evicted",
+ "file_js_cache_imported1.mjs",
+ false
+ ),
+ ev("memorycache:saved", "file_js_cache_imported1.mjs", false),
+
+ ev("memorycache:dirty:hit", "file_js_cache_imported2.mjs", false),
+ ev("load:source", "file_js_cache_imported2.mjs", false),
+ ev(
+ "memorycache:dirty:evicted",
+ "file_js_cache_imported2.mjs",
+ false
+ ),
+ ev("memorycache:saved", "file_js_cache_imported2.mjs", false),
+
+ ev("memorycache:dirty:hit", "file_js_cache_imported3.mjs", false),
+ ev("load:source", "file_js_cache_imported3.mjs", false),
+ ev(
+ "memorycache:dirty:evicted",
+ "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"),
+ unordered([
+ 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"),
+ unordered([
+ 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"),
+ unordered([
+ 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"),
+ 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"),
+ unordered([
+ 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/head.js b/dom/base/test/head.js
@@ -189,6 +189,10 @@ async function runJSCacheTests(tests) {
info("clear memory cache");
ChromeUtils.clearResourceCache();
}
+ if (item.invalidateMemory) {
+ info("invalidate memory cache");
+ ChromeUtils.invalidateResourceCache();
+ }
if (item.clearDisk) {
info("clear disk cache");
Services.cache2.clear();