зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1487113 - nsICacheInfoChannel.alternativeDataInputStream as attribute. r=necko-reviewers,valentin
Differential Revision: https://phabricator.services.mozilla.com/D117360
This commit is contained in:
Родитель
b3b30b910b
Коммит
04ca8c2532
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче