Bug 1487113 - nsICacheInfoChannel.alternativeDataInputStream as attribute. r=necko-reviewers,valentin

Differential Revision: https://phabricator.services.mozilla.com/D117360
This commit is contained in:
Yury Delendik 2021-10-15 21:13:43 +00:00
Родитель b3b30b910b
Коммит 04ca8c2532
26 изменённых файлов: 239 добавлений и 129 удалений

Просмотреть файл

@ -808,8 +808,9 @@ nsresult FetchDriver::HttpFetch(
if (!aPreferredAlternativeDataType.IsEmpty()) {
nsCOMPtr<nsICacheInfoChannel> cic = do_QueryInterface(chan);
if (cic) {
cic->PreferAlternativeDataType(aPreferredAlternativeDataType, ""_ns,
true);
cic->PreferAlternativeDataType(
aPreferredAlternativeDataType, ""_ns,
nsICacheInfoChannel::PreferredAlternativeDataDeliveryType::ASYNC);
MOZ_ASSERT(!mAltDataListener);
mAltDataListener = new AlternativeDataStreamListener(
this, chan, aPreferredAlternativeDataType);
@ -822,9 +823,11 @@ nsresult FetchDriver::HttpFetch(
if (mRequest->GetIntegrity().IsEmpty()) {
nsCOMPtr<nsICacheInfoChannel> cic = do_QueryInterface(chan);
if (cic) {
cic->PreferAlternativeDataType(nsLiteralCString(WASM_ALT_DATA_TYPE_V1),
nsLiteralCString(WASM_CONTENT_TYPE),
false);
cic->PreferAlternativeDataType(
nsLiteralCString(WASM_ALT_DATA_TYPE_V1),
nsLiteralCString(WASM_CONTENT_TYPE),
nsICacheInfoChannel::PreferredAlternativeDataDeliveryType::
SERIALIZE);
}
}

Просмотреть файл

@ -1594,8 +1594,9 @@ nsresult ScriptLoader::StartLoad(ScriptLoadRequest* aRequest) {
// the bytecode cache instead of the sources, if such entry is already
// registered.
LOG(("ScriptLoadRequest (%p): Maybe request bytecode", aRequest));
cic->PreferAlternativeDataType(nsContentUtils::JSBytecodeMimeType(),
""_ns, true);
cic->PreferAlternativeDataType(
nsContentUtils::JSBytecodeMimeType(), ""_ns,
nsICacheInfoChannel::PreferredAlternativeDataDeliveryType::ASYNC);
} else {
// If we are explicitly loading from the sources, such as after a
// restarted request, we might still want to save the bytecode after.
@ -1604,7 +1605,9 @@ nsresult ScriptLoader::StartLoad(ScriptLoadRequest* aRequest) {
// does not exist, such that we can later save the bytecode with a
// different alternative data type.
LOG(("ScriptLoadRequest (%p): Request saving bytecode later", aRequest));
cic->PreferAlternativeDataType(kNullMimeType, ""_ns, true);
cic->PreferAlternativeDataType(
kNullMimeType, ""_ns,
nsICacheInfoChannel::PreferredAlternativeDataDeliveryType::ASYNC);
}
}

Просмотреть файл

@ -0,0 +1,24 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_net_CacheInfoIPCTypes_h_
#define mozilla_net_CacheInfoIPCTypes_h_
#include "ipc/IPCMessageUtils.h"
#include "ipc/IPCMessageUtilsSpecializations.h"
#include "nsICacheInfoChannel.h"
namespace IPC {
template <>
struct ParamTraits<nsICacheInfoChannel::PreferredAlternativeDataDeliveryType>
: public ContiguousEnumSerializerInclusive<
nsICacheInfoChannel::PreferredAlternativeDataDeliveryType,
nsICacheInfoChannel::PreferredAlternativeDataDeliveryType::NONE,
nsICacheInfoChannel::PreferredAlternativeDataDeliveryType::
SERIALIZE> {};
} // namespace IPC
#endif // mozilla_net_CacheInfoIPCTypes_h_

Просмотреть файл

@ -154,6 +154,7 @@ EXPORTS.mozilla += [
]
EXPORTS.mozilla.net += [
"CacheInfoIPCTypes.h",
"CaptivePortalService.h",
"Dashboard.h",
"DashboardTypes.h",

Просмотреть файл

@ -101,6 +101,23 @@ interface nsICacheInfoChannel : nsISupports
*/
attribute boolean preferCacheLoadOverBypass;
cenum PreferredAlternativeDataDeliveryType : 8 {
/**
* Do not deliver alternative data stream.
*/
NONE = 0,
/**
* Deliver alternative data stream upon additional request.
*/
ASYNC = 1,
/**
* Deliver alternative data stream during IPC parent/child serialization.
*/
SERIALIZE = 2,
};
/**
* Calling this method instructs the channel to serve the alternative data
* if that was previously saved in the cache, otherwise it will serve the
@ -119,7 +136,7 @@ interface nsICacheInfoChannel : nsISupports
* Must be called before AsyncOpen.
*/
void preferAlternativeDataType(in ACString type, in ACString contentType,
in boolean deliverAltData);
in nsICacheInfoChannel_PreferredAlternativeDataDeliveryType deliverAltData);
/**
* Get the preferred alternative data type set by preferAlternativeDataType().
@ -140,11 +157,10 @@ interface nsICacheInfoChannel : nsISupports
/**
* If preferAlternativeDataType() has been called passing deliverAltData
* equal to false, this method will expose the alt-data inputStream if
* aviable.
* equal to false, this attribute will expose the alt-data inputStream if
* avaiable.
*/
void getAltDataInputStream(in ACString type,
in nsIInputStreamReceiver aReceiver);
readonly attribute nsIInputStream alternativeDataInputStream;
/**
* Sometimes when the channel is delivering alt-data, we may want to somehow
@ -174,3 +190,13 @@ interface nsICacheInfoChannel : nsISupports
*/
nsIAsyncOutputStream openAlternativeOutputStream(in ACString type, in long long predictedSize);
};
%{ C++
namespace mozilla {
namespace net {
using PreferredAlternativeDataDeliveryTypeIPC = nsICacheInfoChannel::PreferredAlternativeDataDeliveryType;
}
} // namespace mozilla
%}

Просмотреть файл

@ -19,6 +19,7 @@ include ProtocolTypes;
include "mozilla/dom/PropertyBagUtils.h";
include "mozilla/dom/ReferrerInfoUtils.h";
include "mozilla/ipc/URIUtils.h";
include "mozilla/net/CacheInfoIPCTypes.h";
include "mozilla/AntiTrackingIPCUtils.h";
using mozilla::OriginAttributes from "mozilla/ipc/BackgroundUtils.h";
@ -29,6 +30,7 @@ using class mozilla::TimeStamp from "mozilla/TimeStamp.h";
[RefCounted] using class nsIPropertyBag2 from "nsIPropertyBag2.h";
[RefCounted] using class nsDOMNavigationTiming from "nsDOMNavigationTiming.h";
using nsContentPolicyType from "nsIContentPolicy.h";
using mozilla::net::PreferredAlternativeDataDeliveryTypeIPC from "nsICacheInfoChannel.h";
using nsILoadInfo::CrossOriginEmbedderPolicy from "nsILoadInfo.h";
using nsILoadInfo::StoragePermissionState from "nsILoadInfo.h";
using class mozilla::dom::LoadingSessionHistoryInfo from "mozilla/dom/SessionHistoryEntry.h";
@ -65,7 +67,7 @@ struct PreferredAlternativeDataTypeParams
{
nsCString type;
nsCString contentType;
bool deliverAltData;
PreferredAlternativeDataDeliveryTypeIPC deliverAltData;
};
//-----------------------------------------------------------------------------

Просмотреть файл

@ -189,7 +189,8 @@ bool HttpBackgroundChannelChild::IsWaitingOnStartRequest() {
IPCResult HttpBackgroundChannelChild::RecvOnStartRequest(
const nsHttpResponseHead& aResponseHead, const bool& aUseResponseHead,
const nsHttpHeaderArray& aRequestHeaders,
const HttpChannelOnStartRequestArgs& aArgs) {
const HttpChannelOnStartRequestArgs& aArgs,
const HttpChannelAltDataStream& aAltData) {
LOG((
"HttpBackgroundChannelChild::RecvOnStartRequest [this=%p, status=%" PRIx32
"]\n",
@ -204,7 +205,7 @@ IPCResult HttpBackgroundChannelChild::RecvOnStartRequest(
aArgs.dataFromSocketProcess() ? ODA_FROM_SOCKET : ODA_FROM_PARENT;
mChannelChild->ProcessOnStartRequest(aResponseHead, aUseResponseHead,
aRequestHeaders, aArgs);
aRequestHeaders, aArgs, aAltData);
// Allow to queue other runnable since OnStartRequest Event already hits the
// child's mEventQ.
OnStartRequestReceived(aArgs.multiPartID());

Просмотреть файл

@ -54,7 +54,8 @@ class HttpBackgroundChannelChild final : public PHttpBackgroundChannelChild {
IPCResult RecvOnStartRequest(const nsHttpResponseHead& aResponseHead,
const bool& aUseResponseHead,
const nsHttpHeaderArray& aRequestHeaders,
const HttpChannelOnStartRequestArgs& aArgs);
const HttpChannelOnStartRequestArgs& aArgs,
const HttpChannelAltDataStream& aAltData);
IPCResult RecvOnTransportAndData(const nsresult& aChannelStatus,
const nsresult& aTransportStatus,

Просмотреть файл

@ -146,7 +146,8 @@ void HttpBackgroundChannelParent::OnChannelClosed() {
bool HttpBackgroundChannelParent::OnStartRequest(
const nsHttpResponseHead& aResponseHead, const bool& aUseResponseHead,
const nsHttpHeaderArray& aRequestHeaders,
const HttpChannelOnStartRequestArgs& aArgs) {
const HttpChannelOnStartRequestArgs& aArgs,
const nsCOMPtr<nsICacheEntry>& aAltDataSource) {
LOG(("HttpBackgroundChannelParent::OnStartRequest [this=%p]\n", this));
AssertIsInMainProcess();
@ -157,12 +158,12 @@ bool HttpBackgroundChannelParent::OnStartRequest(
if (!IsOnBackgroundThread()) {
MutexAutoLock lock(mBgThreadMutex);
nsresult rv = mBackgroundThread->Dispatch(
NewRunnableMethod<const nsHttpResponseHead, const bool,
const nsHttpHeaderArray,
const HttpChannelOnStartRequestArgs>(
NewRunnableMethod<
const nsHttpResponseHead, const bool, const nsHttpHeaderArray,
const HttpChannelOnStartRequestArgs, const nsCOMPtr<nsICacheEntry>>(
"net::HttpBackgroundChannelParent::OnStartRequest", this,
&HttpBackgroundChannelParent::OnStartRequest, aResponseHead,
aUseResponseHead, aRequestHeaders, aArgs),
aUseResponseHead, aRequestHeaders, aArgs, aAltDataSource),
NS_DISPATCH_NORMAL);
MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv));
@ -170,8 +171,25 @@ bool HttpBackgroundChannelParent::OnStartRequest(
return NS_SUCCEEDED(rv);
}
HttpChannelAltDataStream altData;
ipc::AutoIPCStream altDataInputStream(true /* delay start */);
if (aAltDataSource) {
nsAutoCString altDataType;
Unused << aAltDataSource->GetAltDataType(altDataType);
if (!altDataType.IsEmpty()) {
nsCOMPtr<nsIInputStream> inputStream;
nsresult rv = aAltDataSource->OpenAlternativeInputStream(
altDataType, getter_AddRefs(inputStream));
if (NS_SUCCEEDED(rv)) {
Unused << altDataInputStream.Serialize(inputStream, Manager());
}
}
}
altData.altDataInputStream() = altDataInputStream.TakeOptionalValue();
return SendOnStartRequest(aResponseHead, aUseResponseHead, aRequestHeaders,
aArgs);
aArgs, altData);
}
bool HttpBackgroundChannelParent::OnTransportAndData(

Просмотреть файл

@ -43,7 +43,8 @@ class HttpBackgroundChannelParent final : public PHttpBackgroundChannelParent {
bool OnStartRequest(const nsHttpResponseHead& aResponseHead,
const bool& aUseResponseHead,
const nsHttpHeaderArray& aRequestHeaders,
const HttpChannelOnStartRequestArgs& aArgs);
const HttpChannelOnStartRequestArgs& aArgs,
const nsCOMPtr<nsICacheEntry>& aCacheEntry);
// To send OnTransportAndData message over background channel.
bool OnTransportAndData(const nsresult& aChannelStatus,

Просмотреть файл

@ -340,7 +340,8 @@ mozilla::ipc::IPCResult HttpChannelChild::RecvOnStartRequestSent() {
void HttpChannelChild::ProcessOnStartRequest(
const nsHttpResponseHead& aResponseHead, const bool& aUseResponseHead,
const nsHttpHeaderArray& aRequestHeaders,
const HttpChannelOnStartRequestArgs& aArgs) {
const HttpChannelOnStartRequestArgs& aArgs,
const HttpChannelAltDataStream& aAltData) {
LOG(("HttpChannelChild::ProcessOnStartRequest [this=%p]\n", this));
MOZ_ASSERT(OnSocketThread());
@ -348,6 +349,8 @@ void HttpChannelChild::ProcessOnStartRequest(
TimeStamp start = TimeStamp::Now();
#endif
mAltDataInputStream = DeserializeIPCStream(aAltData.altDataInputStream());
mEventQ->RunOrEnqueue(new NeckoTargetChannelFunctionEvent(
this, [self = UnsafePtr<HttpChannelChild>(this), aResponseHead,
#ifdef NIGHTLY_BUILD
@ -2420,9 +2423,9 @@ HttpChannelChild::GetPreferCacheLoadOverBypass(
}
NS_IMETHODIMP
HttpChannelChild::PreferAlternativeDataType(const nsACString& aType,
const nsACString& aContentType,
bool aDeliverAltData) {
HttpChannelChild::PreferAlternativeDataType(
const nsACString& aType, const nsACString& aContentType,
PreferredAlternativeDataDeliveryType aDeliverAltData) {
ENSURE_CALLED_BEFORE_ASYNC_OPEN();
mPreferredCachedAltDataTypes.AppendElement(PreferredAlternativeDataTypeParams(
@ -2493,18 +2496,11 @@ HttpChannelChild::GetOriginalInputStream(nsIInputStreamReceiver* aReceiver) {
}
NS_IMETHODIMP
HttpChannelChild::GetAltDataInputStream(const nsACString& aType,
nsIInputStreamReceiver* aReceiver) {
if (aReceiver == nullptr) {
return NS_ERROR_INVALID_ARG;
}
HttpChannelChild::GetAlternativeDataInputStream(nsIInputStream** aInputStream) {
NS_ENSURE_ARG_POINTER(aInputStream);
if (!CanSend()) {
return NS_ERROR_NOT_AVAILABLE;
}
mAltDataInputStreamReceiver = aReceiver;
Unused << SendOpenAltDataCacheInputStream(nsCString(aType));
nsCOMPtr<nsIInputStream> is = mAltDataInputStream;
is.forget(aInputStream);
return NS_OK;
}
@ -2521,18 +2517,6 @@ mozilla::ipc::IPCResult HttpChannelChild::RecvOriginalCacheInputStreamAvailable(
return IPC_OK();
}
mozilla::ipc::IPCResult HttpChannelChild::RecvAltDataCacheInputStreamAvailable(
const Maybe<IPCStream>& aStream) {
nsCOMPtr<nsIInputStream> stream = DeserializeIPCStream(aStream);
nsCOMPtr<nsIInputStreamReceiver> receiver;
receiver.swap(mAltDataInputStreamReceiver);
if (receiver) {
receiver->OnInputStreamReady(stream);
}
return IPC_OK();
}
//-----------------------------------------------------------------------------
// HttpChannelChild::nsIResumableChannel
//-----------------------------------------------------------------------------

Просмотреть файл

@ -142,9 +142,6 @@ class HttpChannelChild final : public PHttpChannelChild,
mozilla::ipc::IPCResult RecvOriginalCacheInputStreamAvailable(
const Maybe<IPCStream>& aStream) override;
mozilla::ipc::IPCResult RecvAltDataCacheInputStreamAvailable(
const Maybe<IPCStream>& aStream) override;
virtual void ActorDestroy(ActorDestroyReason aWhy) override;
virtual void DoNotifyListenerCleanup() override;
@ -197,7 +194,8 @@ class HttpChannelChild final : public PHttpChannelChild,
void ProcessOnStartRequest(const nsHttpResponseHead& aResponseHead,
const bool& aUseResponseHead,
const nsHttpHeaderArray& aRequestHeaders,
const HttpChannelOnStartRequestArgs& aArgs);
const HttpChannelOnStartRequestArgs& aArgs,
const HttpChannelAltDataStream& aAltData);
// Callbacks while receiving OnTransportAndData/OnStopRequest/OnProgress/
// OnStatus/FlushedForDiversion/DivertMessages on background IPC channel.
@ -274,7 +272,7 @@ class HttpChannelChild final : public PHttpChannelChild,
RefPtr<ChannelEventQueue> mEventQ;
nsCOMPtr<nsIInputStreamReceiver> mOriginalInputStreamReceiver;
nsCOMPtr<nsIInputStreamReceiver> mAltDataInputStreamReceiver;
nsCOMPtr<nsIInputStream> mAltDataInputStream;
// Used to ensure atomicity of mBgChild and mBgInitFailCallback
Mutex mBgChildMutex{"HttpChannelChild::BgChildMutex"};

Просмотреть файл

@ -8,6 +8,7 @@
include IPCServiceWorkerDescriptor;
include NeckoChannelParams;
include IPCStream;
include "mozilla/dom/ReferrerInfoUtils.h";
include "mozilla/net/NeckoMessageUtils.h";
@ -52,5 +53,10 @@ struct HttpChannelOnStartRequestArgs
bool hasHTTPSRR;
};
struct HttpChannelAltDataStream
{
IPCStream? altDataInputStream;
};
} // namespace ipc
} // namespace mozilla

Просмотреть файл

@ -25,6 +25,7 @@
#include "mozilla/Unused.h"
#include "HttpBackgroundChannelParent.h"
#include "ParentChannelListener.h"
#include "nsICacheInfoChannel.h"
#include "nsHttpHandler.h"
#include "nsNetCID.h"
#include "nsNetUtil.h"
@ -1201,11 +1202,26 @@ HttpChannelParent::OnStartRequest(nsIRequest* aRequest) {
rv = NS_OK;
nsCOMPtr<nsICacheEntry> altDataSource;
nsCOMPtr<nsICacheInfoChannel> cacheChannel =
do_QueryInterface(static_cast<nsIChannel*>(mChannel.get()));
if (cacheChannel) {
for (const auto& pref : cacheChannel->PreferredAlternativeDataTypes()) {
if (pref.type() == args.altDataType() &&
pref.deliverAltData() ==
nsICacheInfoChannel::PreferredAlternativeDataDeliveryType::
SERIALIZE) {
altDataSource = mCacheEntry;
break;
}
}
}
if (mIPCClosed ||
!mBgParent->OnStartRequest(
*responseHead, useResponseHead,
cleanedUpRequest ? cleanedUpRequestHeaders : requestHead->Headers(),
args)) {
args, altDataSource)) {
rv = NS_ERROR_UNEXPECTED;
}
requestHead->Exit();
@ -1468,28 +1484,6 @@ mozilla::ipc::IPCResult HttpChannelParent::RecvOpenOriginalCacheInputStream() {
return IPC_OK();
}
mozilla::ipc::IPCResult HttpChannelParent::RecvOpenAltDataCacheInputStream(
const nsCString& aType) {
if (mIPCClosed) {
return IPC_OK();
}
AutoIPCStream autoStream;
if (mCacheEntry) {
nsCOMPtr<nsIInputStream> inputStream;
nsresult rv = mCacheEntry->OpenAlternativeInputStream(
aType, getter_AddRefs(inputStream));
if (NS_SUCCEEDED(rv)) {
PContentParent* pcp = Manager()->Manager();
Unused << autoStream.Serialize(inputStream,
static_cast<ContentParent*>(pcp));
}
}
Unused << SendAltDataCacheInputStreamAvailable(
autoStream.TakeOptionalValue());
return IPC_OK();
}
//-----------------------------------------------------------------------------
// HttpChannelParent::nsIProgressEventSink
//-----------------------------------------------------------------------------

Просмотреть файл

@ -188,8 +188,6 @@ class HttpChannelParent final : public nsIInterfaceRequestor,
const OriginAttributes& originAttributes) override;
virtual mozilla::ipc::IPCResult RecvBytesRead(const int32_t& aCount) override;
virtual mozilla::ipc::IPCResult RecvOpenOriginalCacheInputStream() override;
virtual mozilla::ipc::IPCResult RecvOpenAltDataCacheInputStream(
const nsCString& aType) override;
virtual void ActorDestroy(ActorDestroyReason why) override;
friend class ParentChannelListener;

Просмотреть файл

@ -1236,7 +1236,7 @@ InterceptedHttpChannel::SetPreferCacheLoadOverBypass(
NS_IMETHODIMP
InterceptedHttpChannel::PreferAlternativeDataType(
const nsACString& aType, const nsACString& aContentType,
bool aDeliverAltData) {
PreferredAlternativeDataDeliveryType aDeliverAltData) {
ENSURE_CALLED_BEFORE_ASYNC_OPEN();
mPreferredCachedAltDataTypes.AppendElement(PreferredAlternativeDataTypeParams(
nsCString(aType), nsCString(aContentType), aDeliverAltData));
@ -1277,10 +1277,10 @@ InterceptedHttpChannel::GetOriginalInputStream(
}
NS_IMETHODIMP
InterceptedHttpChannel::GetAltDataInputStream(
const nsACString& aType, nsIInputStreamReceiver* aReceiver) {
InterceptedHttpChannel::GetAlternativeDataInputStream(
nsIInputStream** aInputStream) {
if (mSynthesizedCacheInfo) {
return mSynthesizedCacheInfo->GetAltDataInputStream(aType, aReceiver);
return mSynthesizedCacheInfo->GetAlternativeDataInputStream(aInputStream);
}
return NS_ERROR_NOT_AVAILABLE;
}

Просмотреть файл

@ -27,7 +27,8 @@ child:
async OnStartRequest(nsHttpResponseHead responseHead,
bool useResponseHead,
nsHttpHeaderArray requestHeaders,
HttpChannelOnStartRequestArgs args);
HttpChannelOnStartRequestArgs args,
HttpChannelAltDataStream altData);
// Combines a single OnDataAvailable and its associated OnProgress &
// OnStatus calls into one IPDL message

Просмотреть файл

@ -64,9 +64,6 @@ parent:
// Called to get the input stream when altData was delivered.
async OpenOriginalCacheInputStream();
// Called to get the input stream when altData is available.
async OpenAltDataCacheInputStream(nsCString aType);
// Tell the parent the amount bytes read by child for the e10s back pressure
// flow control
async BytesRead(int32_t count);
@ -121,8 +118,6 @@ child:
async OriginalCacheInputStreamAvailable(IPCStream? stream);
async AltDataCacheInputStreamAvailable(IPCStream? stream);
both:
async SetPriority(int16_t priority);

Просмотреть файл

@ -4316,7 +4316,9 @@ nsresult nsHttpChannel::OpenCacheInputStream(nsICacheEntry* cacheEntry,
if (pref.type() == altDataType &&
(pref.contentType().IsEmpty() || pref.contentType() == contentType)) {
foundAltData = true;
deliverAltData = pref.deliverAltData();
deliverAltData =
pref.deliverAltData() ==
nsICacheInfoChannel::PreferredAlternativeDataDeliveryType::ASYNC;
break;
}
}
@ -7944,9 +7946,9 @@ nsHttpChannel::GetPreferCacheLoadOverBypass(bool* aPreferCacheLoadOverBypass) {
}
NS_IMETHODIMP
nsHttpChannel::PreferAlternativeDataType(const nsACString& aType,
const nsACString& aContentType,
bool aDeliverAltData) {
nsHttpChannel::PreferAlternativeDataType(
const nsACString& aType, const nsACString& aContentType,
PreferredAlternativeDataDeliveryType aDeliverAltData) {
ENSURE_CALLED_BEFORE_ASYNC_OPEN();
mPreferredCachedAltDataTypes.AppendElement(PreferredAlternativeDataTypeParams(
nsCString(aType), nsCString(aContentType), aDeliverAltData));
@ -8006,22 +8008,18 @@ nsHttpChannel::GetOriginalInputStream(nsIInputStreamReceiver* aReceiver) {
}
NS_IMETHODIMP
nsHttpChannel::GetAltDataInputStream(const nsACString& aType,
nsIInputStreamReceiver* aReceiver) {
if (aReceiver == nullptr) {
return NS_ERROR_INVALID_ARG;
}
nsCOMPtr<nsIInputStream> inputStream;
nsHttpChannel::GetAlternativeDataInputStream(nsIInputStream** aInputStream) {
NS_ENSURE_ARG_POINTER(aInputStream);
*aInputStream = nullptr;
nsCOMPtr<nsICacheEntry> cacheEntry =
mCacheEntry ? mCacheEntry : mAltDataCacheEntry;
if (cacheEntry) {
if (!mAvailableCachedAltDataType.IsEmpty() && cacheEntry) {
nsresult rv = cacheEntry->OpenAlternativeInputStream(
aType, getter_AddRefs(inputStream));
mAvailableCachedAltDataType, aInputStream);
NS_ENSURE_SUCCESS(rv, rv);
}
aReceiver->OnInputStreamReady(inputStream);
return NS_OK;
}

Просмотреть файл

@ -104,7 +104,11 @@ function asyncOpen() {
var chan = make_channel(URL);
var cc = chan.QueryInterface(Ci.nsICacheInfoChannel);
cc.preferAlternativeDataType(altContentType, "", true);
cc.preferAlternativeDataType(
altContentType,
"",
Ci.nsICacheInfoChannel.ASYNC
);
chan.asyncOpen(new ChannelListener(readServerContent, null));
}
@ -158,9 +162,17 @@ function flushAndReadServerContentAgain() {
function readServerContentAgain() {
var chan = make_channel(URL);
var cc = chan.QueryInterface(Ci.nsICacheInfoChannel);
cc.preferAlternativeDataType("dummy1", "text/javascript", true);
cc.preferAlternativeDataType(altContentType, "text/plain", true);
cc.preferAlternativeDataType("dummy2", "", true);
cc.preferAlternativeDataType(
"dummy1",
"text/javascript",
Ci.nsICacheInfoChannel.ASYNC
);
cc.preferAlternativeDataType(
altContentType,
"text/plain",
Ci.nsICacheInfoChannel.ASYNC
);
cc.preferAlternativeDataType("dummy2", "", Ci.nsICacheInfoChannel.ASYNC);
chan.asyncOpen(new ChannelListener(readServerContentAgainCB, null));
}

Просмотреть файл

@ -87,7 +87,11 @@ function asyncOpen() {
var chan = make_channel(URL);
var cc = chan.QueryInterface(Ci.nsICacheInfoChannel);
cc.preferAlternativeDataType(altContentType, "", true);
cc.preferAlternativeDataType(
altContentType,
"",
Ci.nsICacheInfoChannel.ASYNC
);
chan.asyncOpen(new ChannelListener(readServerContent, null));
}
@ -123,7 +127,11 @@ function flushAndOpenAltChannel() {
function openAltChannel() {
var chan = make_channel(URL);
var cc = chan.QueryInterface(Ci.nsICacheInfoChannel);
cc.preferAlternativeDataType(altContentType, "", true);
cc.preferAlternativeDataType(
altContentType,
"",
Ci.nsICacheInfoChannel.ASYNC
);
chan.asyncOpen(new ChannelListener(readAltContent, null));
}

Просмотреть файл

@ -26,7 +26,11 @@ function make_and_open_channel(url, altContentType, callback) {
let chan = NetUtil.newChannel({ uri: url, loadUsingSystemPrincipal: true });
if (altContentType) {
let cc = chan.QueryInterface(Ci.nsICacheInfoChannel);
cc.preferAlternativeDataType(altContentType, "", true);
cc.preferAlternativeDataType(
altContentType,
"",
Ci.nsICacheInfoChannel.ASYNC
);
}
chan.asyncOpen(new ChannelListener(callback, null));
}

Просмотреть файл

@ -93,7 +93,11 @@ function asyncOpen() {
var chan = make_channel(URL);
var cc = chan.QueryInterface(Ci.nsICacheInfoChannel);
cc.preferAlternativeDataType(altContentType, "", true);
cc.preferAlternativeDataType(
altContentType,
"",
Ci.nsICacheInfoChannel.ASYNC
);
chan.asyncOpen(new ChannelListener(readServerContent, null));
}
@ -143,9 +147,17 @@ function flushAndOpenAltChannel() {
function openAltChannel() {
var chan = make_channel(URL);
var cc = chan.QueryInterface(Ci.nsICacheInfoChannel);
cc.preferAlternativeDataType("dummy1", "text/javascript", true);
cc.preferAlternativeDataType(altContentType, "text/plain", true);
cc.preferAlternativeDataType("dummy2", "", true);
cc.preferAlternativeDataType(
"dummy1",
"text/javascript",
Ci.nsICacheInfoChannel.ASYNC
);
cc.preferAlternativeDataType(
altContentType,
"text/plain",
Ci.nsICacheInfoChannel.ASYNC
);
cc.preferAlternativeDataType("dummy2", "", Ci.nsICacheInfoChannel.ASYNC);
chan.asyncOpen(new ChannelListener(readAltContent, null));
}
@ -182,7 +194,11 @@ function requestAgain() {
shouldPassRevalidation = false;
var chan = make_channel(URL);
var cc = chan.QueryInterface(Ci.nsICacheInfoChannel);
cc.preferAlternativeDataType(altContentType, "", true);
cc.preferAlternativeDataType(
altContentType,
"",
Ci.nsICacheInfoChannel.ASYNC
);
chan.asyncOpen(new ChannelListener(readEmptyAltContent, null));
}

Просмотреть файл

@ -59,7 +59,11 @@ function run_test() {
var chan = make_channel(URL);
var cc = chan.QueryInterface(Ci.nsICacheInfoChannel);
cc.preferAlternativeDataType(altContentType, "", true);
cc.preferAlternativeDataType(
altContentType,
"",
Ci.nsICacheInfoChannel.ASYNC
);
chan.asyncOpen(new ChannelListener(readServerContent, null));
do_test_pending();
@ -86,7 +90,11 @@ function readServerContent(request, buffer) {
function openAltChannel() {
var chan = make_channel(URL);
var cc = chan.QueryInterface(Ci.nsICacheInfoChannel);
cc.preferAlternativeDataType(altContentType, "", true);
cc.preferAlternativeDataType(
altContentType,
"",
Ci.nsICacheInfoChannel.ASYNC
);
chan.asyncOpen(altDataListener);
}
@ -122,7 +130,11 @@ var altDataListener = {
function openAltChannelWithOriginalContent() {
var chan = make_channel(URL);
var cc = chan.QueryInterface(Ci.nsICacheInfoChannel);
cc.preferAlternativeDataType(altContentType, "", false);
cc.preferAlternativeDataType(
altContentType,
"",
Ci.nsICacheInfoChannel.SERIALIZE
);
chan.asyncOpen(originalListener);
}
@ -144,10 +156,6 @@ var originalListener = {
};
function testAltDataStream(cc) {
cc.getAltDataInputStream(altContentType, {
onInputStreamReady(aInputStream) {
Assert.ok(!!aInputStream);
httpServer.stop(do_test_finished);
},
});
Assert.ok(!!cc.alternativeDataInputStream);
httpServer.stop(do_test_finished);
}

Просмотреть файл

@ -69,7 +69,11 @@ function fetch(preferredDataType = null) {
if (preferredDataType) {
var cc = chan.QueryInterface(Ci.nsICacheInfoChannel);
cc.preferAlternativeDataType(altContentType, "", true);
cc.preferAlternativeDataType(
altContentType,
"",
Ci.nsICacheInfoChannel.ASYNC
);
}
chan.asyncOpen(

Просмотреть файл

@ -39,7 +39,7 @@ function load_channel(url) {
URL = url; // save this to open the alt data channel later
var chan = make_channel(url);
var cc = chan.QueryInterface(Ci.nsICacheInfoChannel);
cc.preferAlternativeDataType("text/binary", "", true);
cc.preferAlternativeDataType("text/binary", "", Ci.nsICacheInfoChannel.ASYNC);
chan.asyncOpen(new ChannelListener(readTextData, null));
}
@ -75,7 +75,11 @@ function readTextData(request, buffer) {
function openAltChannel() {
var chan = make_channel(URL);
var cc = chan.QueryInterface(Ci.nsICacheInfoChannel);
cc.preferAlternativeDataType("text/parent-binary", "", true);
cc.preferAlternativeDataType(
"text/parent-binary",
"",
Ci.nsICacheInfoChannel.ASYNC
);
chan.asyncOpen(new ChannelListener(readAltData, null));
}