Bug 1647307 - Simplify SessionHistoryInfo ID handling, r=peterv

Differential Revision: https://phabricator.services.mozilla.com/D80553
This commit is contained in:
Olli Pettay 2020-06-25 16:20:32 +00:00
Родитель af1368e7aa
Коммит e7b1c3e32f
12 изменённых файлов: 94 добавлений и 143 удалений

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

@ -259,28 +259,24 @@ nsISHistory* CanonicalBrowsingContext::GetSessionHistory() {
return mSessionHistory; return mSessionHistory;
} }
static uint64_t gNextHistoryEntryId = 0; UniquePtr<SessionHistoryInfo>
UniquePtr<SessionHistoryInfoAndId>
CanonicalBrowsingContext::CreateSessionHistoryEntryForLoad( CanonicalBrowsingContext::CreateSessionHistoryEntryForLoad(
nsDocShellLoadState* aLoadState, nsIChannel* aChannel) { nsDocShellLoadState* aLoadState, nsIChannel* aChannel) {
MOZ_ASSERT(GetSessionHistory(), MOZ_ASSERT(GetSessionHistory(),
"Creating an entry but session history is not enabled for this " "Creating an entry but session history is not enabled for this "
"browsing context!"); "browsing context!");
uint64_t id = ++gNextHistoryEntryId;
RefPtr<SessionHistoryEntry> entry = RefPtr<SessionHistoryEntry> entry =
new SessionHistoryEntry(GetSessionHistory(), aLoadState, aChannel); new SessionHistoryEntry(GetSessionHistory(), aLoadState, aChannel);
mLoadingEntries.AppendElement(SessionHistoryEntryAndId(id, entry)); mLoadingEntries.AppendElement(entry);
return MakeUnique<SessionHistoryInfoAndId>( return MakeUnique<SessionHistoryInfo>(entry->Info());
id, MakeUnique<SessionHistoryInfo>(entry->GetInfo()));
} }
void CanonicalBrowsingContext::SessionHistoryCommit( void CanonicalBrowsingContext::SessionHistoryCommit(
uint64_t aSessionHistoryEntryId) { uint64_t aSessionHistoryEntryId) {
for (size_t i = 0; i < mLoadingEntries.Length(); ++i) { for (size_t i = 0; i < mLoadingEntries.Length(); ++i) {
if (mLoadingEntries[i].mId == aSessionHistoryEntryId) { if (mLoadingEntries[i]->Info().Id() == aSessionHistoryEntryId) {
RefPtr<SessionHistoryEntry> oldActiveEntry = mActiveEntry.forget(); RefPtr<SessionHistoryEntry> oldActiveEntry = mActiveEntry.forget();
mActiveEntry = mLoadingEntries[i].mEntry; mActiveEntry = mLoadingEntries[i];
mLoadingEntries.RemoveElementAt(i); mLoadingEntries.RemoveElementAt(i);
if (IsTop()) { if (IsTop()) {
GetSessionHistory()->AddEntry(mActiveEntry, GetSessionHistory()->AddEntry(mActiveEntry,

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

@ -32,18 +32,10 @@ namespace dom {
class BrowserParent; class BrowserParent;
class MediaController; class MediaController;
struct SessionHistoryInfoAndId; class SessionHistoryInfo;
class SessionHistoryEntry; class SessionHistoryEntry;
class WindowGlobalParent; class WindowGlobalParent;
struct SessionHistoryEntryAndId {
SessionHistoryEntryAndId(uint64_t aId, SessionHistoryEntry* aEntry)
: mId(aId), mEntry(aEntry) {}
uint64_t mId;
RefPtr<SessionHistoryEntry> mEntry;
};
// CanonicalBrowsingContext is a BrowsingContext living in the parent // CanonicalBrowsingContext is a BrowsingContext living in the parent
// process, with whatever extra data that a BrowsingContext in the // process, with whatever extra data that a BrowsingContext in the
// parent needs. // parent needs.
@ -99,7 +91,7 @@ class CanonicalBrowsingContext final : public BrowsingContext {
Nullable<WindowProxyHolder> GetTopChromeWindow(); Nullable<WindowProxyHolder> GetTopChromeWindow();
nsISHistory* GetSessionHistory(); nsISHistory* GetSessionHistory();
UniquePtr<SessionHistoryInfoAndId> CreateSessionHistoryEntryForLoad( UniquePtr<SessionHistoryInfo> CreateSessionHistoryEntryForLoad(
nsDocShellLoadState* aLoadState, nsIChannel* aChannel); nsDocShellLoadState* aLoadState, nsIChannel* aChannel);
void SessionHistoryCommit(uint64_t aSessionHistoryEntryId); void SessionHistoryCommit(uint64_t aSessionHistoryEntryId);
@ -249,7 +241,7 @@ class CanonicalBrowsingContext final : public BrowsingContext {
RefPtr<net::DocumentLoadListener> mCurrentLoad; RefPtr<net::DocumentLoadListener> mCurrentLoad;
nsTArray<SessionHistoryEntryAndId> mLoadingEntries; nsTArray<RefPtr<SessionHistoryEntry>> mLoadingEntries;
RefPtr<SessionHistoryEntry> mActiveEntry; RefPtr<SessionHistoryEntry> mActiveEntry;
RefPtr<nsSecureBrowserUI> mSecureBrowserUI; RefPtr<nsSecureBrowserUI> mSecureBrowserUI;

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

@ -346,7 +346,6 @@ nsDocShell::nsDocShell(BrowsingContext* aBrowsingContext,
mHistoryID(aBrowsingContext->GetHistoryID()), mHistoryID(aBrowsingContext->GetHistoryID()),
mContentWindowID(aContentWindowID), mContentWindowID(aContentWindowID),
mBrowsingContext(aBrowsingContext), mBrowsingContext(aBrowsingContext),
mLoadingEntryId(PR_UINT64_MAX),
mForcedCharset(nullptr), mForcedCharset(nullptr),
mParentCharset(nullptr), mParentCharset(nullptr),
mTreeOwner(nullptr), mTreeOwner(nullptr),
@ -5318,14 +5317,16 @@ nsresult nsDocShell::Embed(nsIContentViewer* aContentViewer,
if (StaticPrefs::fission_sessionHistoryInParent()) { if (StaticPrefs::fission_sessionHistoryInParent()) {
mActiveEntry = nullptr; mActiveEntry = nullptr;
mLoadingEntry.swap(mActiveEntry); mLoadingEntry.swap(mActiveEntry);
if (XRE_IsParentProcess()) { if (mActiveEntry) {
mBrowsingContext->Canonical()->SessionHistoryCommit(mLoadingEntryId); if (XRE_IsParentProcess()) {
} else { mBrowsingContext->Canonical()->SessionHistoryCommit(
ContentChild* cc = ContentChild::GetSingleton(); mActiveEntry->Id());
mozilla::Unused << cc->SendHistoryCommit(mBrowsingContext, } else {
mLoadingEntryId); ContentChild* cc = ContentChild::GetSingleton();
mozilla::Unused << cc->SendHistoryCommit(mBrowsingContext,
mActiveEntry->Id());
}
} }
mLoadingEntryId = 0;
} }
} }
@ -9346,10 +9347,9 @@ nsresult nsDocShell::DoURILoad(nsDocShellLoadState* aLoadState,
// FIXME We still have a ton of codepaths that don't pass through // FIXME We still have a ton of codepaths that don't pass through
// DocumentLoadListener, so probably need to create session history info // DocumentLoadListener, so probably need to create session history info
// in more places. // in more places.
if (aLoadState->GetSessionHistoryID() != 0) { if (aLoadState->GetSessionHistoryInfo()) {
mLoadingEntry = mLoadingEntry =
MakeUnique<SessionHistoryInfo>(aLoadState->GetSessionHistoryInfo()); MakeUnique<SessionHistoryInfo>(*aLoadState->GetSessionHistoryInfo());
mLoadingEntryId = aLoadState->GetSessionHistoryID();
} }
// open a channel for the url // open a channel for the url
@ -12443,8 +12443,7 @@ bool nsDocShell::GetIsAttemptingToNavigate() {
return false; return false;
} }
void nsDocShell::SetLoadingSessionHistoryInfoAndId( void nsDocShell::SetLoadingSessionHistoryInfo(
const mozilla::dom::SessionHistoryInfoAndId& aInfoAndId) { const mozilla::dom::SessionHistoryInfo& aInfo) {
mLoadingEntry = MakeUnique<SessionHistoryInfo>(*aInfoAndId.mInfo); mLoadingEntry = MakeUnique<SessionHistoryInfo>(aInfo);
mLoadingEntryId = aInfoAndId.mId;
} }

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

@ -65,7 +65,6 @@ class ClientInfo;
class ClientSource; class ClientSource;
class EventTarget; class EventTarget;
class SessionHistoryInfo; class SessionHistoryInfo;
struct SessionHistoryInfoAndId;
} // namespace dom } // namespace dom
namespace net { namespace net {
class LoadInfo; class LoadInfo;
@ -467,8 +466,8 @@ class nsDocShell final : public nsDocLoader,
static uint32_t ComputeURILoaderFlags( static uint32_t ComputeURILoaderFlags(
mozilla::dom::BrowsingContext* aBrowsingContext, uint32_t aLoadType); mozilla::dom::BrowsingContext* aBrowsingContext, uint32_t aLoadType);
void SetLoadingSessionHistoryInfoAndId( void SetLoadingSessionHistoryInfo(
const mozilla::dom::SessionHistoryInfoAndId& aInfoAndId); const mozilla::dom::SessionHistoryInfo& aInfo);
private: // member functions private: // member functions
friend class nsDSURIContentListener; friend class nsDSURIContentListener;
@ -1070,7 +1069,6 @@ class nsDocShell final : public nsDocLoader,
// These are only set when fission.sessionHistoryInParent is set. // These are only set when fission.sessionHistoryInParent is set.
mozilla::UniquePtr<mozilla::dom::SessionHistoryInfo> mActiveEntry; mozilla::UniquePtr<mozilla::dom::SessionHistoryInfo> mActiveEntry;
mozilla::UniquePtr<mozilla::dom::SessionHistoryInfo> mLoadingEntry; mozilla::UniquePtr<mozilla::dom::SessionHistoryInfo> mLoadingEntry;
uint64_t mLoadingEntryId;
// Holds a weak pointer to a RestorePresentationEvent object if any that // Holds a weak pointer to a RestorePresentationEvent object if any that
// holds a weak pointer back to us. We use this pointer to possibly revoke // holds a weak pointer back to us. We use this pointer to possibly revoke

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

@ -499,17 +499,13 @@ void nsDocShellLoadState::SetSHEntry(nsISHEntry* aSHEntry) {
} }
void nsDocShellLoadState::SetSessionHistoryInfo( void nsDocShellLoadState::SetSessionHistoryInfo(
const mozilla::dom::SessionHistoryInfoAndId& aIdAndInfo) { const mozilla::dom::SessionHistoryInfo& aInfo) {
mSessionHistoryInfo = aIdAndInfo; mSessionHistoryInfo = MakeUnique<SessionHistoryInfo>(aInfo);
} }
uint64_t nsDocShellLoadState::GetSessionHistoryID() const { const mozilla::dom::SessionHistoryInfo*
return mSessionHistoryInfo.mId;
}
const mozilla::dom::SessionHistoryInfo&
nsDocShellLoadState::GetSessionHistoryInfo() const { nsDocShellLoadState::GetSessionHistoryInfo() const {
return *mSessionHistoryInfo.mInfo; return mSessionHistoryInfo.get();
} }
const nsString& nsDocShellLoadState::Target() const { return mTarget; } const nsString& nsDocShellLoadState::Target() const { return mTarget; }

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

@ -132,11 +132,9 @@ class nsDocShellLoadState final {
void SetSHEntry(nsISHEntry* aSHEntry); void SetSHEntry(nsISHEntry* aSHEntry);
const mozilla::dom::SessionHistoryInfo& GetSessionHistoryInfo() const; const mozilla::dom::SessionHistoryInfo* GetSessionHistoryInfo() const;
uint64_t GetSessionHistoryID() const;
void SetSessionHistoryInfo( void SetSessionHistoryInfo(const mozilla::dom::SessionHistoryInfo& aInfo);
const mozilla::dom::SessionHistoryInfoAndId& aIdAndInfo);
const nsString& Target() const; const nsString& Target() const;
@ -365,7 +363,7 @@ class nsDocShellLoadState final {
nsCOMPtr<nsISHEntry> mSHEntry; nsCOMPtr<nsISHEntry> mSHEntry;
// Session history info for the load // Session history info for the load
mozilla::dom::SessionHistoryInfoAndId mSessionHistoryInfo; mozilla::UniquePtr<mozilla::dom::SessionHistoryInfo> mSessionHistoryInfo;
// Target for load, like _content, _blank etc. // Target for load, like _content, _blank etc.
nsString mTarget; nsString mTarget;

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

@ -13,6 +13,8 @@
namespace mozilla { namespace mozilla {
namespace dom { namespace dom {
static uint64_t gNextHistoryEntryId = 0;
SessionHistoryInfo::SessionHistoryInfo(nsDocShellLoadState* aLoadState, SessionHistoryInfo::SessionHistoryInfo(nsDocShellLoadState* aLoadState,
nsIChannel* aChannel) nsIChannel* aChannel)
: mURI(aLoadState->URI()), : mURI(aLoadState->URI()),
@ -25,6 +27,7 @@ SessionHistoryInfo::SessionHistoryInfo(nsDocShellLoadState* aLoadState,
mScrollPositionY(0), mScrollPositionY(0),
mSrcdocData(aLoadState->SrcdocData()), mSrcdocData(aLoadState->SrcdocData()),
mBaseURI(aLoadState->BaseURI()), mBaseURI(aLoadState->BaseURI()),
mId(++gNextHistoryEntryId),
mLoadReplace(aLoadState->LoadReplace()), mLoadReplace(aLoadState->LoadReplace()),
mURIWasModified(false), mURIWasModified(false),
/* FIXME Should this be aLoadState->IsSrcdocLoad()? */ /* FIXME Should this be aLoadState->IsSrcdocLoad()? */
@ -756,81 +759,75 @@ SessionHistoryEntry::SyncTreesForSubframeNavigation(
namespace ipc { namespace ipc {
void IPDLParamTraits<dom::SessionHistoryInfoAndId>::Write( void IPDLParamTraits<dom::SessionHistoryInfo>::Write(
IPC::Message* aMsg, IProtocol* aActor, IPC::Message* aMsg, IProtocol* aActor,
const dom::SessionHistoryInfoAndId& aParam) { const dom::SessionHistoryInfo& aParam) {
WriteIPDLParam(aMsg, aActor, aParam.mId);
const dom::SessionHistoryInfo* info = aParam.mInfo.get();
dom::ClonedMessageData stateData; dom::ClonedMessageData stateData;
if (info->mStateData) { if (aParam.mStateData) {
JSStructuredCloneData& data = info->mStateData->Data(); JSStructuredCloneData& data = aParam.mStateData->Data();
auto iter = data.Start(); auto iter = data.Start();
bool success; bool success;
stateData.data().data = data.Borrow(iter, data.Size(), &success); stateData.data().data = data.Borrow(iter, data.Size(), &success);
if (NS_WARN_IF(!success)) { if (NS_WARN_IF(!success)) {
return; return;
} }
MOZ_ASSERT(info->mStateData->PortIdentifiers().IsEmpty() && MOZ_ASSERT(aParam.mStateData->PortIdentifiers().IsEmpty() &&
info->mStateData->BlobImpls().IsEmpty() && aParam.mStateData->BlobImpls().IsEmpty() &&
info->mStateData->InputStreams().IsEmpty()); aParam.mStateData->InputStreams().IsEmpty());
} }
WriteIPDLParam(aMsg, aActor, info->mURI); WriteIPDLParam(aMsg, aActor, aParam.mURI);
WriteIPDLParam(aMsg, aActor, info->mOriginalURI); WriteIPDLParam(aMsg, aActor, aParam.mOriginalURI);
WriteIPDLParam(aMsg, aActor, info->mResultPrincipalURI); WriteIPDLParam(aMsg, aActor, aParam.mResultPrincipalURI);
WriteIPDLParam(aMsg, aActor, info->mReferrerInfo); WriteIPDLParam(aMsg, aActor, aParam.mReferrerInfo);
WriteIPDLParam(aMsg, aActor, info->mTitle); WriteIPDLParam(aMsg, aActor, aParam.mTitle);
WriteIPDLParam(aMsg, aActor, info->mPostData); WriteIPDLParam(aMsg, aActor, aParam.mPostData);
WriteIPDLParam(aMsg, aActor, info->mLoadType); WriteIPDLParam(aMsg, aActor, aParam.mLoadType);
WriteIPDLParam(aMsg, aActor, info->mScrollPositionX); WriteIPDLParam(aMsg, aActor, aParam.mScrollPositionX);
WriteIPDLParam(aMsg, aActor, info->mScrollPositionY); WriteIPDLParam(aMsg, aActor, aParam.mScrollPositionY);
WriteIPDLParam(aMsg, aActor, stateData); WriteIPDLParam(aMsg, aActor, stateData);
WriteIPDLParam(aMsg, aActor, info->mSrcdocData); WriteIPDLParam(aMsg, aActor, aParam.mSrcdocData);
WriteIPDLParam(aMsg, aActor, info->mBaseURI); WriteIPDLParam(aMsg, aActor, aParam.mBaseURI);
WriteIPDLParam(aMsg, aActor, info->mLoadReplace); WriteIPDLParam(aMsg, aActor, aParam.mId);
WriteIPDLParam(aMsg, aActor, info->mURIWasModified); WriteIPDLParam(aMsg, aActor, aParam.mLoadReplace);
WriteIPDLParam(aMsg, aActor, info->mIsSrcdocEntry); WriteIPDLParam(aMsg, aActor, aParam.mURIWasModified);
WriteIPDLParam(aMsg, aActor, info->mScrollRestorationIsManual); WriteIPDLParam(aMsg, aActor, aParam.mIsSrcdocEntry);
WriteIPDLParam(aMsg, aActor, info->mPersist); WriteIPDLParam(aMsg, aActor, aParam.mScrollRestorationIsManual);
WriteIPDLParam(aMsg, aActor, aParam.mPersist);
} }
bool IPDLParamTraits<dom::SessionHistoryInfoAndId>::Read( bool IPDLParamTraits<dom::SessionHistoryInfo>::Read(
const IPC::Message* aMsg, PickleIterator* aIter, IProtocol* aActor, const IPC::Message* aMsg, PickleIterator* aIter, IProtocol* aActor,
dom::SessionHistoryInfoAndId* aResult) { dom::SessionHistoryInfo* aResult) {
uint64_t id;
UniquePtr<dom::SessionHistoryInfo> info =
MakeUnique<dom::SessionHistoryInfo>();
dom::ClonedMessageData stateData; dom::ClonedMessageData stateData;
if (!ReadIPDLParam(aMsg, aIter, aActor, &id) || if (!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mURI) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mURI) || !ReadIPDLParam(aMsg, aIter, aActor, &aResult->mOriginalURI) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mOriginalURI) || !ReadIPDLParam(aMsg, aIter, aActor, &aResult->mResultPrincipalURI) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mResultPrincipalURI) || !ReadIPDLParam(aMsg, aIter, aActor, &aResult->mReferrerInfo) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mReferrerInfo) || !ReadIPDLParam(aMsg, aIter, aActor, &aResult->mTitle) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mTitle) || !ReadIPDLParam(aMsg, aIter, aActor, &aResult->mPostData) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mPostData) || !ReadIPDLParam(aMsg, aIter, aActor, &aResult->mLoadType) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mLoadType) || !ReadIPDLParam(aMsg, aIter, aActor, &aResult->mScrollPositionX) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mScrollPositionX) || !ReadIPDLParam(aMsg, aIter, aActor, &aResult->mScrollPositionY) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mScrollPositionY) ||
!ReadIPDLParam(aMsg, aIter, aActor, &stateData) || !ReadIPDLParam(aMsg, aIter, aActor, &stateData) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mSrcdocData) || !ReadIPDLParam(aMsg, aIter, aActor, &aResult->mSrcdocData) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mBaseURI) || !ReadIPDLParam(aMsg, aIter, aActor, &aResult->mBaseURI) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mLoadReplace) || !ReadIPDLParam(aMsg, aIter, aActor, &aResult->mId) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mURIWasModified) || !ReadIPDLParam(aMsg, aIter, aActor, &aResult->mLoadReplace) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mIsSrcdocEntry) || !ReadIPDLParam(aMsg, aIter, aActor, &aResult->mURIWasModified) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mScrollRestorationIsManual) || !ReadIPDLParam(aMsg, aIter, aActor, &aResult->mIsSrcdocEntry) ||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mPersist)) { !ReadIPDLParam(aMsg, aIter, aActor,
&aResult->mScrollRestorationIsManual) ||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mPersist)) {
aActor->FatalError("Error reading fields for SessionHistoryInfo"); aActor->FatalError("Error reading fields for SessionHistoryInfo");
return false; return false;
} }
info->mStateData = new nsStructuredCloneContainer(); aResult->mStateData = new nsStructuredCloneContainer();
if (aActor->GetSide() == ChildSide) { if (aActor->GetSide() == ChildSide) {
UnpackClonedMessageDataForChild(stateData, *info->mStateData); UnpackClonedMessageDataForChild(stateData, *aResult->mStateData);
} else { } else {
UnpackClonedMessageDataForParent(stateData, *info->mStateData); UnpackClonedMessageDataForParent(stateData, *aResult->mStateData);
} }
aResult->mId = id;
aResult->mInfo = std::move(info);
return true; return true;
} }

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

@ -21,7 +21,6 @@ class nsIURI;
namespace mozilla { namespace mozilla {
namespace dom { namespace dom {
struct SessionHistoryInfoAndId;
class SHEntrySharedParentState; class SHEntrySharedParentState;
// SessionHistoryInfo stores session history data for a load. It can be sent // SessionHistoryInfo stores session history data for a load. It can be sent
@ -37,9 +36,11 @@ class SessionHistoryInfo {
nsIURI* GetURI() const { return mURI; } nsIURI* GetURI() const { return mURI; }
uint64_t Id() const { return mId; }
private: private:
friend class SessionHistoryEntry; friend class SessionHistoryEntry;
friend struct mozilla::ipc::IPDLParamTraits<SessionHistoryInfoAndId>; friend struct mozilla::ipc::IPDLParamTraits<SessionHistoryInfo>;
nsCOMPtr<nsIURI> mURI; nsCOMPtr<nsIURI> mURI;
nsCOMPtr<nsIURI> mOriginalURI; nsCOMPtr<nsIURI> mOriginalURI;
@ -53,6 +54,7 @@ class SessionHistoryInfo {
RefPtr<nsStructuredCloneContainer> mStateData; RefPtr<nsStructuredCloneContainer> mStateData;
nsString mSrcdocData; nsString mSrcdocData;
nsCOMPtr<nsIURI> mBaseURI; nsCOMPtr<nsIURI> mBaseURI;
uint64_t mId = 0;
bool mLoadReplace = false; bool mLoadReplace = false;
bool mURIWasModified = false; bool mURIWasModified = false;
bool mIsSrcdocEntry = false; bool mIsSrcdocEntry = false;
@ -60,28 +62,6 @@ class SessionHistoryInfo {
bool mPersist = false; bool mPersist = false;
}; };
// XXX Not sure that the id shouldn't just live in SessionHistoryInfo.
struct SessionHistoryInfoAndId {
SessionHistoryInfoAndId() = default;
SessionHistoryInfoAndId(uint64_t aId,
UniquePtr<mozilla::dom::SessionHistoryInfo> aInfo)
: mId(aId), mInfo(std::move(aInfo)) {}
SessionHistoryInfoAndId(SessionHistoryInfoAndId&& aInfoAndId) = default;
SessionHistoryInfoAndId& operator=(
const SessionHistoryInfoAndId& aInfoAndId) {
mId = aInfoAndId.mId;
mInfo = MakeUnique<SessionHistoryInfo>(*aInfoAndId.mInfo);
return *this;
}
bool operator==(const SessionHistoryInfoAndId& aInfoAndId) const {
return mId == aInfoAndId.mId && !mInfo == !aInfoAndId.mInfo &&
*mInfo == *aInfoAndId.mInfo;
}
uint64_t mId = 0;
UniquePtr<mozilla::dom::SessionHistoryInfo> mInfo;
};
// SessionHistoryEntry is used to store session history data in the parent // SessionHistoryEntry is used to store session history data in the parent
// process. It holds a SessionHistoryInfo, some state shared amongst multiple // process. It holds a SessionHistoryInfo, some state shared amongst multiple
// SessionHistoryEntries, a parent and children. // SessionHistoryEntries, a parent and children.
@ -93,7 +73,7 @@ class SessionHistoryEntry : public nsISHEntry {
NS_DECL_ISUPPORTS NS_DECL_ISUPPORTS
NS_DECL_NSISHENTRY NS_DECL_NSISHENTRY
const SessionHistoryInfo& GetInfo() const { return *mInfo; } const SessionHistoryInfo& Info() const { return *mInfo; }
private: private:
virtual ~SessionHistoryEntry() = default; virtual ~SessionHistoryEntry() = default;
@ -111,11 +91,11 @@ class SessionHistoryEntry : public nsISHEntry {
namespace ipc { namespace ipc {
template <> template <>
struct IPDLParamTraits<dom::SessionHistoryInfoAndId> { struct IPDLParamTraits<dom::SessionHistoryInfo> {
static void Write(IPC::Message* aMsg, IProtocol* aActor, static void Write(IPC::Message* aMsg, IProtocol* aActor,
const dom::SessionHistoryInfoAndId& aParam); const dom::SessionHistoryInfo& aParam);
static bool Read(const IPC::Message* aMsg, PickleIterator* aIter, static bool Read(const IPC::Message* aMsg, PickleIterator* aIter,
IProtocol* aActor, dom::SessionHistoryInfoAndId* aResult); IProtocol* aActor, dom::SessionHistoryInfo* aResult);
}; };
} // namespace ipc } // namespace ipc

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

@ -216,10 +216,7 @@ IPCResult DocumentChannelChild::RecvRedirectToRealChannel(
nsDocShell* docShell = GetDocShell(); nsDocShell* docShell = GetDocShell();
if (docShell && aArgs.sessionHistoryInfo().isSome()) { if (docShell && aArgs.sessionHistoryInfo().isSome()) {
SessionHistoryInfoAndId& infoAndId = aArgs.sessionHistoryInfo().ref(); docShell->SetLoadingSessionHistoryInfo(aArgs.sessionHistoryInfo().ref());
if (infoAndId.mId != 0) {
docShell->SetLoadingSessionHistoryInfoAndId(infoAndId);
}
} }
// transfer any properties. This appears to be entirely a content-side // transfer any properties. This appears to be entirely a content-side

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

@ -1084,9 +1084,7 @@ void DocumentLoadListener::SerializeRedirectData(
aArgs.loadStateLoadFlags() = mLoadStateLoadFlags; aArgs.loadStateLoadFlags() = mLoadStateLoadFlags;
aArgs.loadStateLoadType() = mLoadStateLoadType; aArgs.loadStateLoadType() = mLoadStateLoadType;
if (mSessionHistoryInfo) { if (mSessionHistoryInfo) {
aArgs.sessionHistoryInfo().emplace( aArgs.sessionHistoryInfo().emplace(*mSessionHistoryInfo);
mSessionHistoryInfo->mId, MakeUnique<mozilla::dom::SessionHistoryInfo>(
*mSessionHistoryInfo->mInfo));
} }
} }

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

@ -403,7 +403,7 @@ class DocumentLoadListener : public nsIInterfaceRequestor,
nsString mSrcdocData; nsString mSrcdocData;
nsCOMPtr<nsIURI> mBaseURI; nsCOMPtr<nsIURI> mBaseURI;
mozilla::UniquePtr<mozilla::dom::SessionHistoryInfoAndId> mSessionHistoryInfo; mozilla::UniquePtr<mozilla::dom::SessionHistoryInfo> mSessionHistoryInfo;
// Flags from nsDocShellLoadState::LoadFlags/Type that we want to make // Flags from nsDocShellLoadState::LoadFlags/Type that we want to make
// available to the new docshell if we switch processes. // available to the new docshell if we switch processes.

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

@ -24,7 +24,7 @@ using class mozilla::TimeStamp from "mozilla/TimeStamp.h";
using refcounted class nsIPropertyBag2 from "mozilla/dom/PropertyBagUtils.h"; using refcounted class nsIPropertyBag2 from "mozilla/dom/PropertyBagUtils.h";
using refcounted class nsDOMNavigationTiming from "nsDOMNavigationTiming.h"; using refcounted class nsDOMNavigationTiming from "nsDOMNavigationTiming.h";
using nsILoadInfo::CrossOriginEmbedderPolicy from "nsILoadInfo.h"; using nsILoadInfo::CrossOriginEmbedderPolicy from "nsILoadInfo.h";
using moveonly mozilla::dom::SessionHistoryInfoAndId from "mozilla/dom/SessionHistoryEntry.h"; using moveonly mozilla::dom::SessionHistoryInfo from "mozilla/dom/SessionHistoryEntry.h";
namespace mozilla { namespace mozilla {
namespace net { namespace net {
@ -467,7 +467,7 @@ struct RedirectToRealChannelArgs {
nsDOMNavigationTiming? timing; nsDOMNavigationTiming? timing;
nsString srcdocData; nsString srcdocData;
nsIURI baseUri; nsIURI baseUri;
SessionHistoryInfoAndId? sessionHistoryInfo; SessionHistoryInfo? sessionHistoryInfo;
uint64_t loadIdentifier; uint64_t loadIdentifier;
}; };