tor-browser

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

commit 5619e4c9e6cd936697f6fa85ddeb1afdb15dc57d
parent 5ee39890ebfb07bcd649cc86e1df59dc6af87540
Author: Tooru Fujisawa <arai_a@mac.com>
Date:   Tue, 16 Dec 2025 08:58:15 +0000

Bug 2005943 - Fallback to nsHttpChannel::mAltDataCacheEntry in nsHttpChannel::GetCacheEntryWriteHandle. r=necko-reviewers,valentin

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

Diffstat:
Mnetwerk/protocol/http/nsHttpChannel.cpp | 6++++--
Mnetwerk/test/unit/test_cache-entry-write-handle.js | 48+++++++++++++++++++++++++++++-------------------
2 files changed, 33 insertions(+), 21 deletions(-)

diff --git a/netwerk/protocol/http/nsHttpChannel.cpp b/netwerk/protocol/http/nsHttpChannel.cpp @@ -10929,12 +10929,14 @@ CacheEntryWriteHandle::OpenAlternativeOutputStream( NS_IMETHODIMP nsHttpChannel::GetCacheEntryWriteHandle(nsICacheEntryWriteHandle** _retval) { - if (!mCacheEntry) { + nsCOMPtr<nsICacheEntry> cacheEntry = + mCacheEntry ? mCacheEntry : mAltDataCacheEntry; + if (!cacheEntry) { return NS_ERROR_NOT_AVAILABLE; } nsCOMPtr<nsICacheEntryWriteHandle> handle = - new CacheEntryWriteHandle(mCacheEntry); + new CacheEntryWriteHandle(cacheEntry); handle.forget(_retval); return NS_OK; } diff --git a/netwerk/test/unit/test_cache-entry-write-handle.js b/netwerk/test/unit/test_cache-entry-write-handle.js @@ -14,7 +14,7 @@ const responseContent = "response body"; // NOTE: This is executed both on the parent process and the content process. // Some variables are re-defined. -async function testTask(port, path, responseContent) { +async function testTask(port, path, responseContent, getHandleOnStopRequest) { const { NetUtil } = ChromeUtils.importESModule( "resource://gre/modules/NetUtil.sys.mjs" ); @@ -37,9 +37,6 @@ async function testTask(port, path, responseContent) { Ci.nsICacheInfoChannel.ASYNC ); - const { promise: handlePromise, resolve: handleResolve } = - Promise.withResolvers(); - function ChannelListener(callback) { this._callback = callback; this._buffer = ""; @@ -69,6 +66,9 @@ async function testTask(port, path, responseContent) { }, }; + const { promise: handleOrCcPromise, resolve: handleOrCcResolve } = + Promise.withResolvers(); + nonAltChan.asyncOpen( new ChannelListener((request, buffer) => { const cc = request.QueryInterface(Ci.nsICacheInfoChannel); @@ -76,11 +76,23 @@ async function testTask(port, path, responseContent) { Assert.equal(buffer, responseContent); Assert.equal(cc.alternativeDataType, ""); - handleResolve(cc.getCacheEntryWriteHandle()); + if (getHandleOnStopRequest) { + handleOrCcResolve(cc.getCacheEntryWriteHandle()); + } else { + handleOrCcResolve(cc); + } }) ); - const handle = await handlePromise; + let handle; + if (getHandleOnStopRequest) { + handle = await handleOrCcPromise; + } else { + const cc = await handleOrCcPromise; + // In nsHttpChannel's case, this is after clearing the mCacheEntry field, + // and this should fallback to mAltDataCacheEntry field. + handle = cc.getCacheEntryWriteHandle(); + } const os = handle.openAlternativeOutputStream( altContentType, @@ -125,18 +137,14 @@ add_setup(async function setup() { response.bodyOutputStream.write("", 0); }); - httpServer.registerPathHandler("/content1", (metadata, response) => { - response.setHeader("Content-Type", "text/plain"); - response.setHeader("Cache-Control", "max-age=86400"); - - response.bodyOutputStream.write(responseContent, responseContent.length); - }); - httpServer.registerPathHandler("/content2", (metadata, response) => { - response.setHeader("Content-Type", "text/plain"); - response.setHeader("Cache-Control", "max-age=86400"); + for (let i = 1; i <= 4; i++) { + httpServer.registerPathHandler(`/content${i}`, (metadata, response) => { + response.setHeader("Content-Type", "text/plain"); + response.setHeader("Cache-Control", "max-age=86400"); - response.bodyOutputStream.write(responseContent, responseContent.length); - }); + response.bodyOutputStream.write(responseContent, responseContent.length); + }); + } httpServer.start(-1); registerCleanupFunction(async () => { @@ -147,7 +155,8 @@ add_setup(async function setup() { add_task(async function test_CacheEntryWriteHandle_ParentProcess() { const port = httpServer.identity.primaryPort; - testTask(port, "/content1", responseContent); + testTask(port, "/content1", responseContent, true); + testTask(port, "/content2", responseContent, false); }); add_task(async function test_CacheEntryWriteHandle_ContentProcess() { @@ -158,5 +167,6 @@ add_task(async function test_CacheEntryWriteHandle_ContentProcess() { remote: true, }); - await page.spawn([port, "/content2", responseContent], testTask); + await page.spawn([port, "/content3", responseContent, true], testTask); + await page.spawn([port, "/content4", responseContent, false], testTask); });