Bug 1598520 - Allow DocumentChannel for srcdoc= loads. r=kmag

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

--HG--
extra : source : 10ad2e4d27c3e66b8ce5190377ed672c72010732
This commit is contained in:
Matt Woodrow 2019-12-19 21:48:00 +00:00
Родитель d67e6c24b8
Коммит 620323f684
6 изменённых файлов: 50 добавлений и 12 удалений

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

@ -9338,7 +9338,7 @@ static bool SchemeUsesDocChannel(nsIURI* aURI) {
}
if (StaticPrefs::browser_tabs_documentchannel() && XRE_IsContentProcess() &&
SchemeUsesDocChannel(aLoadState->URI()) && !isSrcdoc) {
SchemeUsesDocChannel(aLoadState->URI())) {
RefPtr<DocumentChannelChild> child = new DocumentChannelChild(
aLoadState, aLoadInfo, aInitiatorType, aLoadFlags, aLoadType, aCacheKey,
aIsActive, aIsTopLevelDoc, aHasNonEmptySandboxingFlags);

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

@ -114,6 +114,7 @@
#include "nsIConsoleService.h"
#include "audio_thread_priority.h"
#include "nsIURIMutator.h"
#include "nsIInputStreamChannel.h"
#if !defined(XP_WIN)
# include "mozilla/Omnijar.h"
@ -3693,11 +3694,24 @@ mozilla::ipc::IPCResult ContentChild::RecvCrossProcessRedirect(
}
nsCOMPtr<nsIChannel> newChannel;
rv = NS_NewChannelInternal(getter_AddRefs(newChannel), aArgs.uri(), loadInfo,
nullptr, // PerformanceStorage
nullptr, // aLoadGroup
nullptr, // aCallbacks
aArgs.newLoadFlags());
if (aArgs.loadStateLoadFlags() &
nsDocShell::InternalLoad::INTERNAL_LOAD_FLAGS_IS_SRCDOC) {
rv = NS_NewInputStreamChannelInternal(
getter_AddRefs(newChannel), aArgs.uri(), aArgs.srcdocData(),
NS_LITERAL_CSTRING("text/html"), loadInfo, true);
if (NS_SUCCEEDED(rv)) {
nsCOMPtr<nsIInputStreamChannel> isc = do_QueryInterface(newChannel);
MOZ_ASSERT(isc);
isc->SetBaseURI(aArgs.baseUri());
}
} else {
rv =
NS_NewChannelInternal(getter_AddRefs(newChannel), aArgs.uri(), loadInfo,
nullptr, // PerformanceStorage
nullptr, // aLoadGroup
nullptr, // aCallbacks
aArgs.newLoadFlags());
}
// This is used to report any errors back to the parent by calling
// CrossProcessRedirectFinished.

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

@ -22,6 +22,7 @@
#include "nsContentSecurityManager.h"
#include "nsDocShellLoadState.h"
#include "nsHttpHandler.h"
#include "nsIInputStreamChannel.h"
#include "nsQueryObject.h"
#include "nsSerializationHelper.h"
#include "nsStreamListenerWrapper.h"
@ -320,12 +321,26 @@ IPCResult DocumentChannelChild::RecvRedirectToRealChannel(
mRedirectResolver = std::move(aResolve);
nsCOMPtr<nsIChannel> newChannel;
nsresult rv =
NS_NewChannelInternal(getter_AddRefs(newChannel), aArgs.uri(), loadInfo,
nullptr, // PerformanceStorage
mLoadGroup, // aLoadGroup
nullptr, // aCallbacks
aArgs.newLoadFlags());
nsresult rv;
if (aArgs.loadStateLoadFlags() &
nsDocShell::InternalLoad::INTERNAL_LOAD_FLAGS_IS_SRCDOC) {
rv = NS_NewInputStreamChannelInternal(
getter_AddRefs(newChannel), aArgs.uri(), aArgs.srcdocData(),
NS_LITERAL_CSTRING("text/html"), loadInfo, true);
if (NS_SUCCEEDED(rv)) {
nsCOMPtr<nsIInputStreamChannel> isc = do_QueryInterface(newChannel);
MOZ_ASSERT(isc);
isc->SetBaseURI(aArgs.baseUri());
newChannel->SetLoadGroup(mLoadGroup);
}
} else {
rv =
NS_NewChannelInternal(getter_AddRefs(newChannel), aArgs.uri(), loadInfo,
nullptr, // PerformanceStorage
mLoadGroup, // aLoadGroup
nullptr, // aCallbacks
aArgs.newLoadFlags());
}
// This is used to report any errors back to the parent by calling
// CrossProcessRedirectFinished.

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

@ -340,6 +340,8 @@ bool DocumentLoadListener::Open(
mChannelCreationURI = aLoadState->URI();
mLoadStateLoadFlags = aLoadState->LoadFlags();
mSrcdocData = aLoadState->SrcdocData();
mBaseURI = aLoadState->BaseURI();
return true;
}
@ -722,6 +724,8 @@ void DocumentLoadListener::SerializeRedirectData(
nsDocShell::ExtractLastVisit(mChannel, getter_AddRefs(previousURI),
&previousFlags);
aArgs.lastVisitInfo() = LastVisitInfo{previousURI, previousFlags};
aArgs.srcdocData() = mSrcdocData;
aArgs.baseUri() = mBaseURI;
}
void DocumentLoadListener::TriggerCrossProcessSwitch() {

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

@ -322,6 +322,9 @@ class DocumentLoadListener : public nsIInterfaceRequestor,
nsTArray<DocumentChannelRedirect> mRedirects;
nsString mSrcdocData;
nsCOMPtr<nsIURI> mBaseURI;
// Flags from nsDocShellLoadState::LoadFlags that we want to make available
// to the new docshell if we switch processes.
uint32_t mLoadStateLoadFlags = 0;

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

@ -441,6 +441,8 @@ struct RedirectToRealChannelArgs {
nsIPropertyBag2 properties;
LastVisitInfo lastVisitInfo;
uint32_t loadStateLoadFlags;
nsString srcdocData;
nsIURI baseUri;
};
struct TimingStructArgs {