tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mdom/base/test/browser_script_loader_js_cache.js | 448+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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(); +});