tor-browser

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

commit b096c129a4a78302dbfb83d4a3a3f43c14deca2c
parent ca6e20dc42a8193f407adb8c57c2ac2b1b3a2d82
Author: Tooru Fujisawa <arai_a@mac.com>
Date:   Tue,  9 Dec 2025 05:11:36 +0000

Bug 2002960 - Part 1: Eagerly reflect the necko fetch count to LoadedScript. r=nbp

Differential Revision: https://phabricator.services.mozilla.com/D274746

Diffstat:
Mdom/base/test/browser_script_loader_js_cache_sri_after_save.js | 11+++++++++--
Mdom/base/test/browser_script_loader_js_cache_sri_different.js | 28+++++++---------------------
Mdom/script/ScriptLoader.cpp | 31++++++++++---------------------
3 files changed, 26 insertions(+), 44 deletions(-)

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 @@ -199,6 +199,11 @@ add_task(async function testMemoryCache_SRIAfterSave() { ev("load:diskcache", "file_js_cache_large.js"), ev("load:fallback", "file_js_cache_large.js"), ev("load:source", "file_js_cache_large.js"), + // At this point, the necko's fetch count is 3, + // because of the following: + // * 0-th item's source load + // * this items's diskcache load + // * this items's source load ev("memorycache:saved", "file_js_cache_large.js"), ev("evaluate:classic", "file_js_cache_large.js"), ev("diskcache:noschedule"), @@ -210,7 +215,8 @@ add_task(async function testMemoryCache_SRIAfterSave() { events: [ ev("load:memorycache", "file_js_cache_large.js"), ev("evaluate:classic", "file_js_cache_large.js"), - ev("diskcache:noschedule"), + // Loading again should save it. + ev("diskcache:saved", "file_js_cache_large.js", false), ], }, ], @@ -260,6 +266,7 @@ add_task(async function testMemoryCache_SRIAfterSave() { ev("load:diskcache", "file_js_cache_large.js"), ev("load:fallback", "file_js_cache_large.js"), ev("load:source", "file_js_cache_large.js"), + // At this point, the necko's fetch count is 3. ev("memorycache:saved", "file_js_cache_large.js"), ev("evaluate:module", "file_js_cache_large.js"), ev("diskcache:noschedule"), @@ -271,7 +278,7 @@ add_task(async function testMemoryCache_SRIAfterSave() { events: [ ev("load:memorycache", "file_js_cache_large.js"), ev("evaluate:module", "file_js_cache_large.js"), - ev("diskcache:noschedule"), + ev("diskcache:saved", "file_js_cache_large.js", false), ], }, ], 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 @@ -211,28 +211,13 @@ add_task(async function testMemoryCache_DifferentSRI() { ev("load:diskcache", "file_js_cache_large.js"), ev("load:fallback", "file_js_cache_large.js"), ev("load:source", "file_js_cache_large.js"), + // At this point, the necko's fetch count is 3, + // because of the following: + // * 0-th item's source load + // * this items's diskcache load + // * this items's source load 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"), ], }, @@ -296,6 +281,7 @@ add_task(async function testMemoryCache_DifferentSRI() { ev("load:diskcache", "file_js_cache_large.js"), ev("load:fallback", "file_js_cache_large.js"), ev("load:source", "file_js_cache_large.js"), + // At this point, the necko's fetch count is 3. ev("memorycache:saved", "file_js_cache_large.js"), ev("evaluate:module", "file_js_cache_large.js"), ev("diskcache:noschedule"), @@ -307,7 +293,7 @@ add_task(async function testMemoryCache_DifferentSRI() { events: [ ev("load:memorycache", "file_js_cache_large.js"), ev("evaluate:module", "file_js_cache_large.js"), - ev("diskcache:noschedule"), + ev("diskcache:saved", "file_js_cache_large.js", false), ], }, ], diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp @@ -2872,27 +2872,7 @@ void ScriptLoader::CalculateCacheFlag(ScriptLoadRequest* aRequest) { // disk cache optimization, such that we do not waste time on entry which // are going to be dropped soon. if (strategy.mHasFetchCountMin) { - uint32_t fetchCount = 0; - if (aRequest->IsCachedStencil()) { - fetchCount = aRequest->mLoadedScript->mFetchCount; - } else { - if (NS_FAILED( - aRequest->getLoadedScript()->mCacheInfo->GetCacheTokenFetchCount( - &fetchCount))) { - LOG( - ("ScriptLoadRequest (%p): Bytecode-cache: Skip disk: Cannot get " - "fetchCount.", - aRequest)); - aRequest->MarkSkippedDiskCaching(); - aRequest->getLoadedScript()->DropDiskCacheReferenceAndSRI(); - return; - } - if (fetchCount < UINT8_MAX) { - aRequest->mLoadedScript->mFetchCount = fetchCount; - } else { - aRequest->mLoadedScript->mFetchCount = UINT8_MAX; - } - } + uint8_t fetchCount = aRequest->mLoadedScript->mFetchCount; LOG(("ScriptLoadRequest (%p): Bytecode-cache: fetchCount = %d.", aRequest, fetchCount)); if (fetchCount < strategy.mFetchCountMin) { @@ -4136,6 +4116,15 @@ nsresult ScriptLoader::OnStreamComplete( // save the this script in the disk cache. if (aRequest->IsTextSource() && StaticPrefs::dom_script_loader_bytecode_cache_enabled()) { + uint32_t fetchCount; + if (NS_SUCCEEDED(cacheInfo->GetCacheTokenFetchCount(&fetchCount))) { + if (fetchCount < UINT8_MAX) { + aRequest->getLoadedScript()->mFetchCount = fetchCount; + } else { + aRequest->getLoadedScript()->mFetchCount = UINT8_MAX; + } + } + aRequest->getLoadedScript()->mCacheInfo = cacheInfo; LOG(("ScriptLoadRequest (%p): nsICacheInfoChannel = %p", aRequest, aRequest->getLoadedScript()->mCacheInfo.get()));