commit c71c5c3c218a6628ccdcbcd808487378609adf43
parent 65f479e282054783fba9a44be7f9222bbbab8494
Author: Tooru Fujisawa <arai_a@mac.com>
Date: Wed, 5 Nov 2025 04:09:46 +0000
Bug 1853173 - Part 4: Add tests for invalid SRI. r=nbp
Differential Revision: https://phabricator.services.mozilla.com/D271025
Diffstat:
1 file changed, 448 insertions(+), 0 deletions(-)
diff --git a/dom/base/test/browser_script_loader_js_cache.js b/dom/base/test/browser_script_loader_js_cache.js
@@ -90,6 +90,9 @@ async function contentTask(test, item) {
if (test.module || item.module) {
script.type = "module";
}
+ if (item.sri) {
+ script.integrity = item.sri;
+ }
script.src = item.file;
content.document.body.appendChild(script);
@@ -1056,3 +1059,448 @@ add_task(async function testMemoryCache_classicVsModules() {
await SpecialPowers.popPrefEnv();
});
+
+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 runTests([
+ // 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 runTests([
+ // 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();
+});