Bug 1614847 - Construct nsDocShellLoadState in ContentChild to avoid needing to pass excess parameters into nsDocShell. r=nika

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

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Matt Woodrow 2020-02-24 02:16:24 +00:00
parent 57693b7a1f
commit ebf189ed47
4 changed files with 34 additions and 36 deletions

View File

@ -14,22 +14,20 @@ static StaticRefPtr<ChildProcessChannelListener> sCPCLSingleton;
void ChildProcessChannelListener::RegisterCallback(uint64_t aIdentifier,
Callback&& aCallback) {
if (auto args = mChannelArgs.GetAndRemove(aIdentifier)) {
aCallback(args->mChannel, std::move(args->mRedirects),
args->mLoadStateLoadFlags, args->mTiming);
aCallback(args->mLoadState, std::move(args->mRedirects), args->mTiming);
} else {
mCallbacks.Put(aIdentifier, std::move(aCallback));
}
}
void ChildProcessChannelListener::OnChannelReady(
nsIChannel* aChannel, uint64_t aIdentifier,
nsDocShellLoadState* aLoadState, uint64_t aIdentifier,
nsTArray<net::DocumentChannelRedirect>&& aRedirects,
uint32_t aLoadStateLoadFlags, nsDOMNavigationTiming* aTiming) {
nsDOMNavigationTiming* aTiming) {
if (auto callback = mCallbacks.GetAndRemove(aIdentifier)) {
(*callback)(aChannel, std::move(aRedirects), aLoadStateLoadFlags, aTiming);
(*callback)(aLoadState, std::move(aRedirects), aTiming);
} else {
mChannelArgs.Put(aIdentifier, {aChannel, std::move(aRedirects),
aLoadStateLoadFlags, aTiming});
mChannelArgs.Put(aIdentifier, {aLoadState, std::move(aRedirects), aTiming});
}
}

View File

@ -20,15 +20,14 @@ namespace dom {
class ChildProcessChannelListener final {
NS_INLINE_DECL_REFCOUNTING(ChildProcessChannelListener)
using Callback =
std::function<void(nsIChannel*, nsTArray<net::DocumentChannelRedirect>&&,
uint32_t, nsDOMNavigationTiming*)>;
using Callback = std::function<void(nsDocShellLoadState*,
nsTArray<net::DocumentChannelRedirect>&&,
nsDOMNavigationTiming*)>;
void RegisterCallback(uint64_t aIdentifier, Callback&& aCallback);
void OnChannelReady(nsIChannel* aChannel, uint64_t aIdentifier,
void OnChannelReady(nsDocShellLoadState* aLoadState, uint64_t aIdentifier,
nsTArray<net::DocumentChannelRedirect>&& aRedirects,
uint32_t aLoadStateLoadFlags,
nsDOMNavigationTiming* aTiming);
static already_AddRefed<ChildProcessChannelListener> GetSingleton();
@ -37,9 +36,8 @@ class ChildProcessChannelListener final {
ChildProcessChannelListener() = default;
~ChildProcessChannelListener() = default;
struct CallbackArgs {
nsCOMPtr<nsIChannel> mChannel;
RefPtr<nsDocShellLoadState> mLoadState;
nsTArray<net::DocumentChannelRedirect> mRedirects;
uint32_t mLoadStateLoadFlags;
RefPtr<nsDOMNavigationTiming> mTiming;
};

View File

@ -12741,28 +12741,22 @@ nsDocShell::ResumeRedirectedLoad(uint64_t aIdentifier, int32_t aHistoryIndex) {
// Call into InternalLoad with the pending channel when it is received.
cpcl->RegisterCallback(
aIdentifier,
[self, aHistoryIndex](nsIChannel* aChannel,
[self, aHistoryIndex](nsDocShellLoadState* aLoadState,
nsTArray<net::DocumentChannelRedirect>&& aRedirects,
uint32_t aLoadStateLoadFlags,
nsDOMNavigationTiming* aTiming) {
MOZ_ASSERT(aLoadState->GetPendingRedirectedChannel());
if (NS_WARN_IF(self->mIsBeingDestroyed)) {
aChannel->Cancel(NS_BINDING_ABORTED);
aLoadState->GetPendingRedirectedChannel()->Cancel(NS_BINDING_ABORTED);
return;
}
RefPtr<nsDocShellLoadState> loadState;
nsresult rv = nsDocShellLoadState::CreateFromPendingChannel(
aChannel, getter_AddRefs(loadState));
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
loadState->SetLoadFlags(aLoadStateLoadFlags);
nsCOMPtr<nsIURI> previousURI;
uint32_t previousFlags = 0;
ExtractLastVisit(aChannel, getter_AddRefs(previousURI), &previousFlags);
self->SavePreviousRedirectsAndLastVisit(aChannel, previousURI,
previousFlags, aRedirects);
ExtractLastVisit(aLoadState->GetPendingRedirectedChannel(),
getter_AddRefs(previousURI), &previousFlags);
self->SavePreviousRedirectsAndLastVisit(
aLoadState->GetPendingRedirectedChannel(), previousURI,
previousFlags, aRedirects);
MOZ_ASSERT(
(self->mCurrentURI && NS_IsAboutBlank(self->mCurrentURI)) ||
@ -12777,16 +12771,16 @@ nsDocShell::ResumeRedirectedLoad(uint64_t aIdentifier, int32_t aHistoryIndex) {
self->mSessionHistory->LegacySHistory();
nsCOMPtr<nsISHEntry> entry;
rv = legacySHistory->GetEntryAtIndex(aHistoryIndex,
getter_AddRefs(entry));
nsresult rv = legacySHistory->GetEntryAtIndex(aHistoryIndex,
getter_AddRefs(entry));
if (NS_SUCCEEDED(rv)) {
legacySHistory->InternalSetRequestedIndex(aHistoryIndex);
loadState->SetLoadType(LOAD_HISTORY);
loadState->SetSHEntry(entry);
aLoadState->SetLoadType(LOAD_HISTORY);
aLoadState->SetSHEntry(entry);
}
}
self->InternalLoad(loadState, nullptr, nullptr);
self->InternalLoad(aLoadState, nullptr, nullptr);
});
return NS_OK;
}

View File

@ -3732,12 +3732,20 @@ mozilla::ipc::IPCResult ContentChild::RecvCrossProcessRedirect(
nsHashPropertyBag::CopyFrom(bag, aArgs.properties());
}
RefPtr<nsDocShellLoadState> loadState;
rv = nsDocShellLoadState::CreateFromPendingChannel(newChannel,
getter_AddRefs(loadState));
if (NS_WARN_IF(NS_FAILED(rv))) {
return IPC_OK();
}
loadState->SetLoadFlags(aArgs.loadStateLoadFlags());
RefPtr<ChildProcessChannelListener> processListener =
ChildProcessChannelListener::GetSingleton();
// The listener will call completeRedirectSetup or asyncOpen on the channel.
processListener->OnChannelReady(
newChannel, aArgs.redirectIdentifier(), std::move(aArgs.redirects()),
aArgs.loadStateLoadFlags(), aArgs.timing().refOr(nullptr));
processListener->OnChannelReady(loadState, aArgs.redirectIdentifier(),
std::move(aArgs.redirects()),
aArgs.timing().refOr(nullptr));
// scopeExit will call CrossProcessRedirectFinished(rv) here
return IPC_OK();