mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
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:
parent
57693b7a1f
commit
ebf189ed47
@ -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});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user