Bug 1590762 - Part 2: Bump the id for channel registration to uint64_t. r=mattwoodrow,necko-reviewers,valentin
This patch also makes the identifier for channels global, in the sense that the generated identifier is generated outside of and passed to the nsIRedirectChannelRegistrar. Differential Revision: https://phabricator.services.mozilla.com/D79820
This commit is contained in:
@@ -1585,7 +1585,7 @@ nsresult BrowsingContext::LoadURI(nsDocShellLoadState* aLoadState,
|
|||||||
if (ContentParent* cp = Canonical()->GetContentParent()) {
|
if (ContentParent* cp = Canonical()->GetContentParent()) {
|
||||||
// Attempt to initiate this load immediately in the parent, if it succeeds
|
// Attempt to initiate this load immediately in the parent, if it succeeds
|
||||||
// it'll return a unique identifier so that we can find it later.
|
// it'll return a unique identifier so that we can find it later.
|
||||||
uint32_t loadIdentifier = 0;
|
uint64_t loadIdentifier = 0;
|
||||||
if (Canonical()->AttemptLoadURIInParent(aLoadState, &loadIdentifier)) {
|
if (Canonical()->AttemptLoadURIInParent(aLoadState, &loadIdentifier)) {
|
||||||
aLoadState->SetLoadIdentifier(loadIdentifier);
|
aLoadState->SetLoadIdentifier(loadIdentifier);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -813,7 +813,7 @@ MediaController* CanonicalBrowsingContext::GetMediaController() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool CanonicalBrowsingContext::AttemptLoadURIInParent(
|
bool CanonicalBrowsingContext::AttemptLoadURIInParent(
|
||||||
nsDocShellLoadState* aLoadState, uint32_t* aLoadIdentifier) {
|
nsDocShellLoadState* aLoadState, uint64_t* aLoadIdentifier) {
|
||||||
// We currently only support starting loads directly from the
|
// We currently only support starting loads directly from the
|
||||||
// CanonicalBrowsingContext for top-level BCs.
|
// CanonicalBrowsingContext for top-level BCs.
|
||||||
if (!IsTopContent() || !GetContentParent() ||
|
if (!IsTopContent() || !GetContentParent() ||
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ class CanonicalBrowsingContext final : public BrowsingContext {
|
|||||||
MediaController* GetMediaController();
|
MediaController* GetMediaController();
|
||||||
|
|
||||||
bool AttemptLoadURIInParent(nsDocShellLoadState* aLoadState,
|
bool AttemptLoadURIInParent(nsDocShellLoadState* aLoadState,
|
||||||
uint32_t* aLoadIdentifier);
|
uint64_t* aLoadIdentifier);
|
||||||
|
|
||||||
// Get or create a secure browser UI for this BrowsingContext
|
// Get or create a secure browser UI for this BrowsingContext
|
||||||
nsISecureBrowserUI* GetSecureBrowserUI();
|
nsISecureBrowserUI* GetSecureBrowserUI();
|
||||||
|
|||||||
@@ -238,8 +238,8 @@ class nsDocShellLoadState final {
|
|||||||
return mCancelContentJSEpoch;
|
return mCancelContentJSEpoch;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetLoadIdentifier(uint32_t aIdent) { mLoadIdentifier = aIdent; }
|
void SetLoadIdentifier(uint64_t aIdent) { mLoadIdentifier = aIdent; }
|
||||||
uint32_t GetLoadIdentifier() const { return mLoadIdentifier; }
|
uint64_t GetLoadIdentifier() const { return mLoadIdentifier; }
|
||||||
|
|
||||||
// When loading a document through nsDocShell::LoadURI(), a special set of
|
// When loading a document through nsDocShell::LoadURI(), a special set of
|
||||||
// flags needs to be set based on other values in nsDocShellLoadState. This
|
// flags needs to be set based on other values in nsDocShellLoadState. This
|
||||||
@@ -415,7 +415,7 @@ class nsDocShellLoadState final {
|
|||||||
// created in the parent process for this loads. DocumentChannels
|
// created in the parent process for this loads. DocumentChannels
|
||||||
// created in the content process can use this to find and attach
|
// created in the content process can use this to find and attach
|
||||||
// to the in progress load.
|
// to the in progress load.
|
||||||
uint32_t mLoadIdentifier;
|
uint64_t mLoadIdentifier;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* nsDocShellLoadState_h__ */
|
#endif /* nsDocShellLoadState_h__ */
|
||||||
|
|||||||
@@ -9709,6 +9709,14 @@ uint64_t nsContentUtils::GenerateWindowId() {
|
|||||||
return GenerateProcessSpecificId(++gNextWindowId);
|
return GenerateProcessSpecificId(++gNextWindowId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Next process-local load.
|
||||||
|
static Atomic<uint64_t> gNextLoadIdentifier(0);
|
||||||
|
|
||||||
|
/* static */
|
||||||
|
uint64_t nsContentUtils::GenerateLoadIdentifier() {
|
||||||
|
return GenerateProcessSpecificId(++gNextLoadIdentifier);
|
||||||
|
}
|
||||||
|
|
||||||
/* static */
|
/* static */
|
||||||
bool nsContentUtils::GetUserIsInteracting() {
|
bool nsContentUtils::GetUserIsInteracting() {
|
||||||
return UserInteractionObserver::sUserActive;
|
return UserInteractionObserver::sUserActive;
|
||||||
|
|||||||
@@ -3149,6 +3149,12 @@ class nsContentUtils {
|
|||||||
*/
|
*/
|
||||||
static uint64_t GenerateWindowId();
|
static uint64_t GenerateWindowId();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate an ID for a load which is unique across processes and will never
|
||||||
|
* be recycled.
|
||||||
|
*/
|
||||||
|
static uint64_t GenerateLoadIdentifier();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine whether or not the user is currently interacting with the web
|
* Determine whether or not the user is currently interacting with the web
|
||||||
* browser. This method is safe to call from off of the main thread.
|
* browser. This method is safe to call from off of the main thread.
|
||||||
|
|||||||
@@ -4090,7 +4090,7 @@ mozilla::ipc::IPCResult ContentParent::RecvLoadURIExternal(
|
|||||||
}
|
}
|
||||||
|
|
||||||
mozilla::ipc::IPCResult ContentParent::RecvExtProtocolChannelConnectParent(
|
mozilla::ipc::IPCResult ContentParent::RecvExtProtocolChannelConnectParent(
|
||||||
const uint32_t& registrarId) {
|
const uint64_t& registrarId) {
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
|
|
||||||
// First get the real channel created before redirect on the parent.
|
// First get the real channel created before redirect on the parent.
|
||||||
|
|||||||
@@ -1036,7 +1036,7 @@ class ContentParent final
|
|||||||
nsIURI* uri, nsIPrincipal* triggeringPrincipal,
|
nsIURI* uri, nsIPrincipal* triggeringPrincipal,
|
||||||
const MaybeDiscarded<BrowsingContext>& aContext);
|
const MaybeDiscarded<BrowsingContext>& aContext);
|
||||||
mozilla::ipc::IPCResult RecvExtProtocolChannelConnectParent(
|
mozilla::ipc::IPCResult RecvExtProtocolChannelConnectParent(
|
||||||
const uint32_t& registrarId);
|
const uint64_t& registrarId);
|
||||||
|
|
||||||
mozilla::ipc::IPCResult RecvSyncMessage(
|
mozilla::ipc::IPCResult RecvSyncMessage(
|
||||||
const nsString& aMsg, const ClonedMessageData& aData,
|
const nsString& aMsg, const ClonedMessageData& aData,
|
||||||
|
|||||||
@@ -277,7 +277,7 @@ struct DocShellLoadStateInit
|
|||||||
// bool mIsSrcDocLoad; // useless without sourcedocshell
|
// bool mIsSrcDocLoad; // useless without sourcedocshell
|
||||||
// nsIChannel pendingRedirectedChannel; // sent through other mechanism
|
// nsIChannel pendingRedirectedChannel; // sent through other mechanism
|
||||||
|
|
||||||
uint32_t LoadIdentifier;
|
uint64_t LoadIdentifier;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TimedChannelInfo
|
struct TimedChannelInfo
|
||||||
|
|||||||
@@ -978,7 +978,7 @@ parent:
|
|||||||
async SetURITitle(nsIURI uri, nsString title);
|
async SetURITitle(nsIURI uri, nsString title);
|
||||||
|
|
||||||
async LoadURIExternal(nsIURI uri, nsIPrincipal triggeringPrincipal, MaybeDiscardedBrowsingContext browsingContext);
|
async LoadURIExternal(nsIURI uri, nsIPrincipal triggeringPrincipal, MaybeDiscardedBrowsingContext browsingContext);
|
||||||
async ExtProtocolChannelConnectParent(uint32_t registrarId);
|
async ExtProtocolChannelConnectParent(uint64_t registrarId);
|
||||||
|
|
||||||
// PrefService message
|
// PrefService message
|
||||||
sync GetGfxVars() returns (GfxVarUpdate[] vars);
|
sync GetGfxVars() returns (GfxVarUpdate[] vars);
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ NS_IMPL_ISUPPORTS(RedirectChannelRegistrar, nsIRedirectChannelRegistrar)
|
|||||||
RedirectChannelRegistrar::RedirectChannelRegistrar()
|
RedirectChannelRegistrar::RedirectChannelRegistrar()
|
||||||
: mRealChannels(32),
|
: mRealChannels(32),
|
||||||
mParentChannels(32),
|
mParentChannels(32),
|
||||||
mId(1),
|
|
||||||
mLock("RedirectChannelRegistrar") {
|
mLock("RedirectChannelRegistrar") {
|
||||||
MOZ_ASSERT(!gSingleton);
|
MOZ_ASSERT(!gSingleton);
|
||||||
}
|
}
|
||||||
@@ -38,23 +37,16 @@ void RedirectChannelRegistrar::Shutdown() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
RedirectChannelRegistrar::RegisterChannel(nsIChannel* channel,
|
RedirectChannelRegistrar::RegisterChannel(nsIChannel* channel, uint64_t id) {
|
||||||
uint32_t* _retval) {
|
|
||||||
MutexAutoLock lock(mLock);
|
MutexAutoLock lock(mLock);
|
||||||
|
|
||||||
mRealChannels.Put(mId, channel);
|
mRealChannels.Put(id, channel);
|
||||||
*_retval = mId;
|
|
||||||
|
|
||||||
++mId;
|
|
||||||
|
|
||||||
// Ensure we always provide positive ids
|
|
||||||
if (!mId) mId = 1;
|
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
RedirectChannelRegistrar::GetRegisteredChannel(uint32_t id,
|
RedirectChannelRegistrar::GetRegisteredChannel(uint64_t id,
|
||||||
nsIChannel** _retval) {
|
nsIChannel** _retval) {
|
||||||
MutexAutoLock lock(mLock);
|
MutexAutoLock lock(mLock);
|
||||||
|
|
||||||
@@ -64,7 +56,7 @@ RedirectChannelRegistrar::GetRegisteredChannel(uint32_t id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
RedirectChannelRegistrar::LinkChannels(uint32_t id, nsIParentChannel* channel,
|
RedirectChannelRegistrar::LinkChannels(uint64_t id, nsIParentChannel* channel,
|
||||||
nsIChannel** _retval) {
|
nsIChannel** _retval) {
|
||||||
MutexAutoLock lock(mLock);
|
MutexAutoLock lock(mLock);
|
||||||
|
|
||||||
@@ -75,7 +67,7 @@ RedirectChannelRegistrar::LinkChannels(uint32_t id, nsIParentChannel* channel,
|
|||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
RedirectChannelRegistrar::GetParentChannel(uint32_t id,
|
RedirectChannelRegistrar::GetParentChannel(uint64_t id,
|
||||||
nsIParentChannel** _retval) {
|
nsIParentChannel** _retval) {
|
||||||
MutexAutoLock lock(mLock);
|
MutexAutoLock lock(mLock);
|
||||||
|
|
||||||
@@ -85,7 +77,7 @@ RedirectChannelRegistrar::GetParentChannel(uint32_t id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
RedirectChannelRegistrar::DeregisterChannels(uint32_t id) {
|
RedirectChannelRegistrar::DeregisterChannels(uint64_t id) {
|
||||||
MutexAutoLock lock(mLock);
|
MutexAutoLock lock(mLock);
|
||||||
|
|
||||||
mRealChannels.Remove(id);
|
mRealChannels.Remove(id);
|
||||||
|
|||||||
@@ -33,13 +33,12 @@ class RedirectChannelRegistrar final : public nsIRedirectChannelRegistrar {
|
|||||||
static void Shutdown();
|
static void Shutdown();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
typedef nsInterfaceHashtable<nsUint32HashKey, nsIChannel> ChannelHashtable;
|
using ChannelHashtable = nsInterfaceHashtable<nsUint64HashKey, nsIChannel>;
|
||||||
typedef nsInterfaceHashtable<nsUint32HashKey, nsIParentChannel>
|
using ParentChannelHashtable =
|
||||||
ParentChannelHashtable;
|
nsInterfaceHashtable<nsUint64HashKey, nsIParentChannel>;
|
||||||
|
|
||||||
ChannelHashtable mRealChannels;
|
ChannelHashtable mRealChannels;
|
||||||
ParentChannelHashtable mParentChannels;
|
ParentChannelHashtable mParentChannels;
|
||||||
uint32_t mId;
|
|
||||||
Mutex mLock;
|
Mutex mLock;
|
||||||
|
|
||||||
static StaticRefPtr<RedirectChannelRegistrar> gSingleton;
|
static StaticRefPtr<RedirectChannelRegistrar> gSingleton;
|
||||||
|
|||||||
@@ -14,10 +14,10 @@ namespace net {
|
|||||||
|
|
||||||
NS_IMPL_ISUPPORTS(SimpleChannelParent, nsIParentChannel, nsIStreamListener)
|
NS_IMPL_ISUPPORTS(SimpleChannelParent, nsIParentChannel, nsIStreamListener)
|
||||||
|
|
||||||
bool SimpleChannelParent::Init(const uint32_t& channelId) {
|
bool SimpleChannelParent::Init(const uint64_t& aChannelId) {
|
||||||
nsCOMPtr<nsIChannel> channel;
|
nsCOMPtr<nsIChannel> channel;
|
||||||
MOZ_ALWAYS_SUCCEEDS(
|
MOZ_ALWAYS_SUCCEEDS(
|
||||||
NS_LinkRedirectChannels(channelId, this, getter_AddRefs(channel)));
|
NS_LinkRedirectChannels(aChannelId, this, getter_AddRefs(channel)));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class SimpleChannelParent : public nsIParentChannel,
|
|||||||
NS_DECL_NSIREQUESTOBSERVER
|
NS_DECL_NSIREQUESTOBSERVER
|
||||||
NS_DECL_NSISTREAMLISTENER; // semicolon for clang-format bug 1629756
|
NS_DECL_NSISTREAMLISTENER; // semicolon for clang-format bug 1629756
|
||||||
|
|
||||||
[[nodiscard]] bool Init(const uint32_t& aArgs);
|
[[nodiscard]] bool Init(const uint64_t& aChannelId);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
~SimpleChannelParent() = default;
|
~SimpleChannelParent() = default;
|
||||||
|
|||||||
@@ -19,13 +19,13 @@ interface nsIParentChannel;
|
|||||||
interface nsIRedirectChannelRegistrar : nsISupports
|
interface nsIRedirectChannelRegistrar : nsISupports
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Register the redirect target channel and obtain a unique ID for that
|
* Register the redirect target channel. The passed id needs to be a
|
||||||
* channel.
|
* unique ID for that channel (see `nsContentUtils::GenerateLoadIdentifier`).
|
||||||
*
|
*
|
||||||
* Primarily used in ParentChannelListener::AsyncOnChannelRedirect to get
|
* Primarily used in ParentChannelListener::AsyncOnChannelRedirect to get
|
||||||
* a channel id sent to the HttpChannelChild being redirected.
|
* a channel id sent to the HttpChannelChild being redirected.
|
||||||
*/
|
*/
|
||||||
uint32_t registerChannel(in nsIChannel channel);
|
void registerChannel(in nsIChannel channel, in uint64_t id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* First, search for the channel registered under the id. If found return
|
* First, search for the channel registered under the id. If found return
|
||||||
@@ -38,7 +38,7 @@ interface nsIRedirectChannelRegistrar : nsISupports
|
|||||||
* in reaction to nsIChildChannel.connectParent(id) called from the child
|
* in reaction to nsIChildChannel.connectParent(id) called from the child
|
||||||
* process.
|
* process.
|
||||||
*/
|
*/
|
||||||
nsIChannel linkChannels(in uint32_t id, in nsIParentChannel channel);
|
nsIChannel linkChannels(in uint64_t id, in nsIParentChannel channel);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns back the channel previously registered under the ID with
|
* Returns back the channel previously registered under the ID with
|
||||||
@@ -47,7 +47,7 @@ interface nsIRedirectChannelRegistrar : nsISupports
|
|||||||
* Primarilly used in chrome IPC side of protocols when attaching a redirect
|
* Primarilly used in chrome IPC side of protocols when attaching a redirect
|
||||||
* target channel to an existing 'real' channel implementation.
|
* target channel to an existing 'real' channel implementation.
|
||||||
*/
|
*/
|
||||||
nsIChannel getRegisteredChannel(in uint32_t id);
|
nsIChannel getRegisteredChannel(in uint64_t id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the stream listener that shall be attached to the redirect target
|
* Returns the stream listener that shall be attached to the redirect target
|
||||||
@@ -58,7 +58,7 @@ interface nsIRedirectChannelRegistrar : nsISupports
|
|||||||
* to grab the created parent side of the channel and forward notifications
|
* to grab the created parent side of the channel and forward notifications
|
||||||
* to it.
|
* to it.
|
||||||
*/
|
*/
|
||||||
nsIParentChannel getParentChannel(in uint32_t id);
|
nsIParentChannel getParentChannel(in uint64_t id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To not force all channel implementations to support weak reference
|
* To not force all channel implementations to support weak reference
|
||||||
@@ -68,5 +68,5 @@ interface nsIRedirectChannelRegistrar : nsISupports
|
|||||||
*
|
*
|
||||||
* Primarilly used in ParentChannelListener::OnRedirectResult callback.
|
* Primarilly used in ParentChannelListener::OnRedirectResult callback.
|
||||||
*/
|
*/
|
||||||
void deregisterChannels(in uint32_t id);
|
void deregisterChannels(in uint64_t id);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2527,7 +2527,7 @@ bool NS_IsHSTSUpgradeRedirect(nsIChannel* aOldChannel, nsIChannel* aNewChannel,
|
|||||||
return NS_SUCCEEDED(upgradedURI->Equals(newURI, &res)) && res;
|
return NS_SUCCEEDED(upgradedURI->Equals(newURI, &res)) && res;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult NS_LinkRedirectChannels(uint32_t channelId,
|
nsresult NS_LinkRedirectChannels(uint64_t channelId,
|
||||||
nsIParentChannel* parentChannel,
|
nsIParentChannel* parentChannel,
|
||||||
nsIChannel** _result) {
|
nsIChannel** _result) {
|
||||||
nsCOMPtr<nsIRedirectChannelRegistrar> registrar =
|
nsCOMPtr<nsIRedirectChannelRegistrar> registrar =
|
||||||
|
|||||||
@@ -771,7 +771,7 @@ bool NS_IsInternalSameURIRedirect(nsIChannel* aOldChannel,
|
|||||||
bool NS_IsHSTSUpgradeRedirect(nsIChannel* aOldChannel, nsIChannel* aNewChannel,
|
bool NS_IsHSTSUpgradeRedirect(nsIChannel* aOldChannel, nsIChannel* aNewChannel,
|
||||||
uint32_t aFlags);
|
uint32_t aFlags);
|
||||||
|
|
||||||
nsresult NS_LinkRedirectChannels(uint32_t channelId,
|
nsresult NS_LinkRedirectChannels(uint64_t channelId,
|
||||||
nsIParentChannel* parentChannel,
|
nsIParentChannel* parentChannel,
|
||||||
nsIChannel** _result);
|
nsIChannel** _result);
|
||||||
|
|
||||||
|
|||||||
@@ -540,8 +540,7 @@ auto DocumentLoadListener::Open(
|
|||||||
/* static */
|
/* static */
|
||||||
bool DocumentLoadListener::OpenFromParent(
|
bool DocumentLoadListener::OpenFromParent(
|
||||||
dom::CanonicalBrowsingContext* aBrowsingContext,
|
dom::CanonicalBrowsingContext* aBrowsingContext,
|
||||||
nsDocShellLoadState* aLoadState, uint64_t aOuterWindowId,
|
nsDocShellLoadState* aLoadState, uint64_t aOuterWindowId, uint64_t* aOutIdent) {
|
||||||
uint32_t* aOutIdent) {
|
|
||||||
LOG(("DocumentLoadListener::OpenFromParent"));
|
LOG(("DocumentLoadListener::OpenFromParent"));
|
||||||
|
|
||||||
// We currently only support passing nullptr for aLoadInfo for
|
// We currently only support passing nullptr for aLoadInfo for
|
||||||
@@ -616,16 +615,18 @@ bool DocumentLoadListener::OpenFromParent(
|
|||||||
// allocate an identifier for this load.
|
// allocate an identifier for this load.
|
||||||
nsCOMPtr<nsIRedirectChannelRegistrar> registrar =
|
nsCOMPtr<nsIRedirectChannelRegistrar> registrar =
|
||||||
RedirectChannelRegistrar::GetOrCreate();
|
RedirectChannelRegistrar::GetOrCreate();
|
||||||
rv = registrar->RegisterChannel(nullptr, aOutIdent);
|
uint64_t loadIdentifier = aLoadState->GetLoadIdentifier();
|
||||||
|
*aOutIdent = loadIdentifier;
|
||||||
|
rv = registrar->RegisterChannel(nullptr, loadIdentifier);
|
||||||
MOZ_ASSERT(NS_SUCCEEDED(rv));
|
MOZ_ASSERT(NS_SUCCEEDED(rv));
|
||||||
// Register listener (as an nsIParentChannel) under our new identifier.
|
// Register listener (as an nsIParentChannel) under our new identifier.
|
||||||
rv = registrar->LinkChannels(*aOutIdent, listener, nullptr);
|
rv = registrar->LinkChannels(loadIdentifier, listener, nullptr);
|
||||||
MOZ_ASSERT(NS_SUCCEEDED(rv));
|
MOZ_ASSERT(NS_SUCCEEDED(rv));
|
||||||
}
|
}
|
||||||
return !!promise;
|
return !!promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DocumentLoadListener::CleanupParentLoadAttempt(uint32_t aLoadIdent) {
|
void DocumentLoadListener::CleanupParentLoadAttempt(uint64_t aLoadIdent) {
|
||||||
nsCOMPtr<nsIRedirectChannelRegistrar> registrar =
|
nsCOMPtr<nsIRedirectChannelRegistrar> registrar =
|
||||||
RedirectChannelRegistrar::GetOrCreate();
|
RedirectChannelRegistrar::GetOrCreate();
|
||||||
|
|
||||||
@@ -643,7 +644,7 @@ void DocumentLoadListener::CleanupParentLoadAttempt(uint32_t aLoadIdent) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto DocumentLoadListener::ClaimParentLoad(DocumentLoadListener** aListener,
|
auto DocumentLoadListener::ClaimParentLoad(DocumentLoadListener** aListener,
|
||||||
uint32_t aLoadIdent)
|
uint64_t aLoadIdent)
|
||||||
-> RefPtr<OpenPromise> {
|
-> RefPtr<OpenPromise> {
|
||||||
nsCOMPtr<nsIRedirectChannelRegistrar> registrar =
|
nsCOMPtr<nsIRedirectChannelRegistrar> registrar =
|
||||||
RedirectChannelRegistrar::GetOrCreate();
|
RedirectChannelRegistrar::GetOrCreate();
|
||||||
@@ -1369,8 +1370,9 @@ DocumentLoadListener::RedirectToRealChannel(
|
|||||||
nsCOMPtr<nsIRedirectChannelRegistrar> registrar =
|
nsCOMPtr<nsIRedirectChannelRegistrar> registrar =
|
||||||
RedirectChannelRegistrar::GetOrCreate();
|
RedirectChannelRegistrar::GetOrCreate();
|
||||||
MOZ_ASSERT(registrar);
|
MOZ_ASSERT(registrar);
|
||||||
|
mRedirectChannelId = nsContentUtils::GenerateLoadIdentifier();
|
||||||
MOZ_ALWAYS_SUCCEEDS(
|
MOZ_ALWAYS_SUCCEEDS(
|
||||||
registrar->RegisterChannel(mChannel, &mRedirectChannelId));
|
registrar->RegisterChannel(mChannel, mRedirectChannelId));
|
||||||
|
|
||||||
if (aDestinationProcess) {
|
if (aDestinationProcess) {
|
||||||
dom::ContentParent* cp =
|
dom::ContentParent* cp =
|
||||||
|
|||||||
@@ -137,16 +137,16 @@ class DocumentLoadListener : public nsIInterfaceRequestor,
|
|||||||
// and clean up.
|
// and clean up.
|
||||||
static bool OpenFromParent(dom::CanonicalBrowsingContext* aBrowsingContext,
|
static bool OpenFromParent(dom::CanonicalBrowsingContext* aBrowsingContext,
|
||||||
nsDocShellLoadState* aLoadState,
|
nsDocShellLoadState* aLoadState,
|
||||||
uint64_t aOuterWindowId, uint32_t* aOutIdent);
|
uint64_t aOuterWindowId, uint64_t* aOutIdent);
|
||||||
|
|
||||||
// Ensures that a load identifier allocated by OpenFromParent has
|
// Ensures that a load identifier allocated by OpenFromParent has
|
||||||
// been deregistered if it hasn't already been claimed.
|
// been deregistered if it hasn't already been claimed.
|
||||||
// This also cancels the load.
|
// This also cancels the load.
|
||||||
static void CleanupParentLoadAttempt(uint32_t aLoadIdent);
|
static void CleanupParentLoadAttempt(uint64_t aLoadIdent);
|
||||||
|
|
||||||
// Looks up aLoadIdent to find the associated, cleans up the registration
|
// Looks up aLoadIdent to find the associated, cleans up the registration
|
||||||
static RefPtr<OpenPromise> ClaimParentLoad(DocumentLoadListener** aListener,
|
static RefPtr<OpenPromise> ClaimParentLoad(DocumentLoadListener** aListener,
|
||||||
uint32_t aLoadIdent);
|
uint64_t aLoadIdent);
|
||||||
|
|
||||||
// Called by the DocumentChannelParent if actor got destroyed or the parent
|
// Called by the DocumentChannelParent if actor got destroyed or the parent
|
||||||
// channel got deleted.
|
// channel got deleted.
|
||||||
@@ -415,7 +415,7 @@ class DocumentLoadListener : public nsIInterfaceRequestor,
|
|||||||
// Corresponding redirect channel registrar Id for the final channel that
|
// Corresponding redirect channel registrar Id for the final channel that
|
||||||
// we want to use when redirecting the child, or doing a process switch.
|
// we want to use when redirecting the child, or doing a process switch.
|
||||||
// 0 means redirection is not started.
|
// 0 means redirection is not started.
|
||||||
uint32_t mRedirectChannelId = 0;
|
uint64_t mRedirectChannelId = 0;
|
||||||
// Set to true once we initiate the redirect to a real channel (either
|
// Set to true once we initiate the redirect to a real channel (either
|
||||||
// via a process switch or a same-process redirect, and Suspend the
|
// via a process switch or a same-process redirect, and Suspend the
|
||||||
// underlying channel.
|
// underlying channel.
|
||||||
|
|||||||
@@ -14,10 +14,10 @@ namespace net {
|
|||||||
|
|
||||||
NS_IMPL_ISUPPORTS(DataChannelParent, nsIParentChannel, nsIStreamListener)
|
NS_IMPL_ISUPPORTS(DataChannelParent, nsIParentChannel, nsIStreamListener)
|
||||||
|
|
||||||
bool DataChannelParent::Init(const uint32_t& channelId) {
|
bool DataChannelParent::Init(const uint64_t& aChannelId) {
|
||||||
nsCOMPtr<nsIChannel> channel;
|
nsCOMPtr<nsIChannel> channel;
|
||||||
MOZ_ALWAYS_SUCCEEDS(
|
MOZ_ALWAYS_SUCCEEDS(
|
||||||
NS_LinkRedirectChannels(channelId, this, getter_AddRefs(channel)));
|
NS_LinkRedirectChannels(aChannelId, this, getter_AddRefs(channel)));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class DataChannelParent : public nsIParentChannel, public PDataChannelParent {
|
|||||||
NS_DECL_NSISTREAMLISTENER
|
NS_DECL_NSISTREAMLISTENER
|
||||||
|
|
||||||
[[nodiscard]] bool
|
[[nodiscard]] bool
|
||||||
Init(const uint32_t& aArgs);
|
Init(const uint64_t& aChannelId);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
~DataChannelParent() = default;
|
~DataChannelParent() = default;
|
||||||
|
|||||||
@@ -14,10 +14,10 @@ namespace net {
|
|||||||
|
|
||||||
NS_IMPL_ISUPPORTS(FileChannelParent, nsIParentChannel, nsIStreamListener)
|
NS_IMPL_ISUPPORTS(FileChannelParent, nsIParentChannel, nsIStreamListener)
|
||||||
|
|
||||||
bool FileChannelParent::Init(const uint32_t& channelId) {
|
bool FileChannelParent::Init(const uint64_t& aChannelId) {
|
||||||
nsCOMPtr<nsIChannel> channel;
|
nsCOMPtr<nsIChannel> channel;
|
||||||
MOZ_ALWAYS_SUCCEEDS(
|
MOZ_ALWAYS_SUCCEEDS(
|
||||||
NS_LinkRedirectChannels(channelId, this, getter_AddRefs(channel)));
|
NS_LinkRedirectChannels(aChannelId, this, getter_AddRefs(channel)));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class FileChannelParent : public nsIParentChannel, public PFileChannelParent {
|
|||||||
NS_DECL_NSISTREAMLISTENER
|
NS_DECL_NSISTREAMLISTENER
|
||||||
|
|
||||||
[[nodiscard]] bool
|
[[nodiscard]] bool
|
||||||
Init(const uint32_t& aArgs);
|
Init(const uint64_t& aChannelId);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
~FileChannelParent() = default;
|
~FileChannelParent() = default;
|
||||||
|
|||||||
@@ -165,10 +165,11 @@ bool FTPChannelParent::DoAsyncOpen(const URIParams& aURI,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FTPChannelParent::ConnectChannel(const uint32_t& channelId) {
|
bool FTPChannelParent::ConnectChannel(const uint64_t& channelId) {
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
|
|
||||||
LOG(("Looking for a registered channel [this=%p, id=%d]", this, channelId));
|
LOG(("Looking for a registered channel [this=%p, id=%" PRIx64 "]", this,
|
||||||
|
channelId));
|
||||||
|
|
||||||
nsCOMPtr<nsIChannel> channel;
|
nsCOMPtr<nsIChannel> channel;
|
||||||
rv = NS_LinkRedirectChannels(channelId, this, getter_AddRefs(channel));
|
rv = NS_LinkRedirectChannels(channelId, this, getter_AddRefs(channel));
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ class FTPChannelParent final : public PFTPChannelParent,
|
|||||||
|
|
||||||
// used to connect redirected-to channel in parent with just created
|
// used to connect redirected-to channel in parent with just created
|
||||||
// ChildChannel. Used during HTTP->FTP redirects.
|
// ChildChannel. Used during HTTP->FTP redirects.
|
||||||
bool ConnectChannel(const uint32_t& channelId);
|
bool ConnectChannel(const uint64_t& channelId);
|
||||||
|
|
||||||
void DivertOnDataAvailable(const nsCString& data, const uint64_t& offset,
|
void DivertOnDataAvailable(const nsCString& data, const uint64_t& offset,
|
||||||
const uint32_t& count);
|
const uint32_t& count);
|
||||||
|
|||||||
@@ -1994,10 +1994,12 @@ HttpChannelParent::StartRedirect(nsIChannel* newChannel, uint32_t redirectFlags,
|
|||||||
RedirectChannelRegistrar::GetOrCreate();
|
RedirectChannelRegistrar::GetOrCreate();
|
||||||
MOZ_ASSERT(registrar);
|
MOZ_ASSERT(registrar);
|
||||||
|
|
||||||
rv = registrar->RegisterChannel(newChannel, &mRedirectChannelId);
|
mRedirectChannelId = nsContentUtils::GenerateLoadIdentifier();
|
||||||
|
rv = registrar->RegisterChannel(newChannel, mRedirectChannelId);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
LOG(("Registered %p channel under id=%d", newChannel, mRedirectChannelId));
|
LOG(("Registered %p channel under id=%" PRIx64, newChannel,
|
||||||
|
mRedirectChannelId));
|
||||||
|
|
||||||
if (mIPCClosed) {
|
if (mIPCClosed) {
|
||||||
return NS_BINDING_ABORTED;
|
return NS_BINDING_ABORTED;
|
||||||
@@ -2588,7 +2590,7 @@ HttpChannelParent::OnRedirectResult(bool succeeded) {
|
|||||||
getter_AddRefs(redirectChannel));
|
getter_AddRefs(redirectChannel));
|
||||||
if (NS_FAILED(rv) || !redirectChannel) {
|
if (NS_FAILED(rv) || !redirectChannel) {
|
||||||
// Redirect might get canceled before we got AsyncOnChannelRedirect
|
// Redirect might get canceled before we got AsyncOnChannelRedirect
|
||||||
LOG(("Registered parent channel not found under id=%d",
|
LOG(("Registered parent channel not found under id=%" PRIx64,
|
||||||
mRedirectChannelId));
|
mRedirectChannelId));
|
||||||
|
|
||||||
nsCOMPtr<nsIChannel> newChannel;
|
nsCOMPtr<nsIChannel> newChannel;
|
||||||
|
|||||||
@@ -309,7 +309,7 @@ class HttpChannelParent final : public nsIInterfaceRequestor,
|
|||||||
|
|
||||||
// Corresponding redirect channel registrar Id. 0 means redirection is not
|
// Corresponding redirect channel registrar Id. 0 means redirection is not
|
||||||
// started.
|
// started.
|
||||||
uint32_t mRedirectChannelId = 0;
|
uint64_t mRedirectChannelId = 0;
|
||||||
|
|
||||||
PBOverrideStatus mPBOverride;
|
PBOverrideStatus mPBOverride;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user