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:
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);
});