зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1647307 - Simplify SessionHistoryInfo ID handling, r=peterv
Differential Revision: https://phabricator.services.mozilla.com/D80553
This commit is contained in:
Родитель
af1368e7aa
Коммит
e7b1c3e32f
|
@ -259,28 +259,24 @@ nsISHistory* CanonicalBrowsingContext::GetSessionHistory() {
|
|||
return mSessionHistory;
|
||||
}
|
||||
|
||||
static uint64_t gNextHistoryEntryId = 0;
|
||||
|
||||
UniquePtr<SessionHistoryInfoAndId>
|
||||
UniquePtr<SessionHistoryInfo>
|
||||
CanonicalBrowsingContext::CreateSessionHistoryEntryForLoad(
|
||||
nsDocShellLoadState* aLoadState, nsIChannel* aChannel) {
|
||||
MOZ_ASSERT(GetSessionHistory(),
|
||||
"Creating an entry but session history is not enabled for this "
|
||||
"browsing context!");
|
||||
uint64_t id = ++gNextHistoryEntryId;
|
||||
RefPtr<SessionHistoryEntry> entry =
|
||||
new SessionHistoryEntry(GetSessionHistory(), aLoadState, aChannel);
|
||||
mLoadingEntries.AppendElement(SessionHistoryEntryAndId(id, entry));
|
||||
return MakeUnique<SessionHistoryInfoAndId>(
|
||||
id, MakeUnique<SessionHistoryInfo>(entry->GetInfo()));
|
||||
mLoadingEntries.AppendElement(entry);
|
||||
return MakeUnique<SessionHistoryInfo>(entry->Info());
|
||||
}
|
||||
|
||||
void CanonicalBrowsingContext::SessionHistoryCommit(
|
||||
uint64_t aSessionHistoryEntryId) {
|
||||
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();
|
||||
mActiveEntry = mLoadingEntries[i].mEntry;
|
||||
mActiveEntry = mLoadingEntries[i];
|
||||
mLoadingEntries.RemoveElementAt(i);
|
||||
if (IsTop()) {
|
||||
GetSessionHistory()->AddEntry(mActiveEntry,
|
||||
|
|
|
@ -32,18 +32,10 @@ namespace dom {
|
|||
|
||||
class BrowserParent;
|
||||
class MediaController;
|
||||
struct SessionHistoryInfoAndId;
|
||||
class SessionHistoryInfo;
|
||||
class SessionHistoryEntry;
|
||||
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
|
||||
// process, with whatever extra data that a BrowsingContext in the
|
||||
// parent needs.
|
||||
|
@ -99,7 +91,7 @@ class CanonicalBrowsingContext final : public BrowsingContext {
|
|||
Nullable<WindowProxyHolder> GetTopChromeWindow();
|
||||
|
||||
nsISHistory* GetSessionHistory();
|
||||
UniquePtr<SessionHistoryInfoAndId> CreateSessionHistoryEntryForLoad(
|
||||
UniquePtr<SessionHistoryInfo> CreateSessionHistoryEntryForLoad(
|
||||
nsDocShellLoadState* aLoadState, nsIChannel* aChannel);
|
||||
void SessionHistoryCommit(uint64_t aSessionHistoryEntryId);
|
||||
|
||||
|
@ -249,7 +241,7 @@ class CanonicalBrowsingContext final : public BrowsingContext {
|
|||
|
||||
RefPtr<net::DocumentLoadListener> mCurrentLoad;
|
||||
|
||||
nsTArray<SessionHistoryEntryAndId> mLoadingEntries;
|
||||
nsTArray<RefPtr<SessionHistoryEntry>> mLoadingEntries;
|
||||
RefPtr<SessionHistoryEntry> mActiveEntry;
|
||||
|
||||
RefPtr<nsSecureBrowserUI> mSecureBrowserUI;
|
||||
|
|
|
@ -346,7 +346,6 @@ nsDocShell::nsDocShell(BrowsingContext* aBrowsingContext,
|
|||
mHistoryID(aBrowsingContext->GetHistoryID()),
|
||||
mContentWindowID(aContentWindowID),
|
||||
mBrowsingContext(aBrowsingContext),
|
||||
mLoadingEntryId(PR_UINT64_MAX),
|
||||
mForcedCharset(nullptr),
|
||||
mParentCharset(nullptr),
|
||||
mTreeOwner(nullptr),
|
||||
|
@ -5318,14 +5317,16 @@ nsresult nsDocShell::Embed(nsIContentViewer* aContentViewer,
|
|||
if (StaticPrefs::fission_sessionHistoryInParent()) {
|
||||
mActiveEntry = nullptr;
|
||||
mLoadingEntry.swap(mActiveEntry);
|
||||
if (XRE_IsParentProcess()) {
|
||||
mBrowsingContext->Canonical()->SessionHistoryCommit(mLoadingEntryId);
|
||||
} else {
|
||||
ContentChild* cc = ContentChild::GetSingleton();
|
||||
mozilla::Unused << cc->SendHistoryCommit(mBrowsingContext,
|
||||
mLoadingEntryId);
|
||||
if (mActiveEntry) {
|
||||
if (XRE_IsParentProcess()) {
|
||||
mBrowsingContext->Canonical()->SessionHistoryCommit(
|
||||
mActiveEntry->Id());
|
||||
} else {
|
||||
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
|
||||
// DocumentLoadListener, so probably need to create session history info
|
||||
// in more places.
|
||||
if (aLoadState->GetSessionHistoryID() != 0) {
|
||||
if (aLoadState->GetSessionHistoryInfo()) {
|
||||
mLoadingEntry =
|
||||
MakeUnique<SessionHistoryInfo>(aLoadState->GetSessionHistoryInfo());
|
||||
mLoadingEntryId = aLoadState->GetSessionHistoryID();
|
||||
MakeUnique<SessionHistoryInfo>(*aLoadState->GetSessionHistoryInfo());
|
||||
}
|
||||
|
||||
// open a channel for the url
|
||||
|
@ -12443,8 +12443,7 @@ bool nsDocShell::GetIsAttemptingToNavigate() {
|
|||
return false;
|
||||
}
|
||||
|
||||
void nsDocShell::SetLoadingSessionHistoryInfoAndId(
|
||||
const mozilla::dom::SessionHistoryInfoAndId& aInfoAndId) {
|
||||
mLoadingEntry = MakeUnique<SessionHistoryInfo>(*aInfoAndId.mInfo);
|
||||
mLoadingEntryId = aInfoAndId.mId;
|
||||
void nsDocShell::SetLoadingSessionHistoryInfo(
|
||||
const mozilla::dom::SessionHistoryInfo& aInfo) {
|
||||
mLoadingEntry = MakeUnique<SessionHistoryInfo>(aInfo);
|
||||
}
|
||||
|
|
|
@ -65,7 +65,6 @@ class ClientInfo;
|
|||
class ClientSource;
|
||||
class EventTarget;
|
||||
class SessionHistoryInfo;
|
||||
struct SessionHistoryInfoAndId;
|
||||
} // namespace dom
|
||||
namespace net {
|
||||
class LoadInfo;
|
||||
|
@ -467,8 +466,8 @@ class nsDocShell final : public nsDocLoader,
|
|||
static uint32_t ComputeURILoaderFlags(
|
||||
mozilla::dom::BrowsingContext* aBrowsingContext, uint32_t aLoadType);
|
||||
|
||||
void SetLoadingSessionHistoryInfoAndId(
|
||||
const mozilla::dom::SessionHistoryInfoAndId& aInfoAndId);
|
||||
void SetLoadingSessionHistoryInfo(
|
||||
const mozilla::dom::SessionHistoryInfo& aInfo);
|
||||
|
||||
private: // member functions
|
||||
friend class nsDSURIContentListener;
|
||||
|
@ -1070,7 +1069,6 @@ class nsDocShell final : public nsDocLoader,
|
|||
// These are only set when fission.sessionHistoryInParent is set.
|
||||
mozilla::UniquePtr<mozilla::dom::SessionHistoryInfo> mActiveEntry;
|
||||
mozilla::UniquePtr<mozilla::dom::SessionHistoryInfo> mLoadingEntry;
|
||||
uint64_t mLoadingEntryId;
|
||||
|
||||
// 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
|
||||
|
|
|
@ -499,17 +499,13 @@ void nsDocShellLoadState::SetSHEntry(nsISHEntry* aSHEntry) {
|
|||
}
|
||||
|
||||
void nsDocShellLoadState::SetSessionHistoryInfo(
|
||||
const mozilla::dom::SessionHistoryInfoAndId& aIdAndInfo) {
|
||||
mSessionHistoryInfo = aIdAndInfo;
|
||||
const mozilla::dom::SessionHistoryInfo& aInfo) {
|
||||
mSessionHistoryInfo = MakeUnique<SessionHistoryInfo>(aInfo);
|
||||
}
|
||||
|
||||
uint64_t nsDocShellLoadState::GetSessionHistoryID() const {
|
||||
return mSessionHistoryInfo.mId;
|
||||
}
|
||||
|
||||
const mozilla::dom::SessionHistoryInfo&
|
||||
const mozilla::dom::SessionHistoryInfo*
|
||||
nsDocShellLoadState::GetSessionHistoryInfo() const {
|
||||
return *mSessionHistoryInfo.mInfo;
|
||||
return mSessionHistoryInfo.get();
|
||||
}
|
||||
|
||||
const nsString& nsDocShellLoadState::Target() const { return mTarget; }
|
||||
|
|
|
@ -132,11 +132,9 @@ class nsDocShellLoadState final {
|
|||
|
||||
void SetSHEntry(nsISHEntry* aSHEntry);
|
||||
|
||||
const mozilla::dom::SessionHistoryInfo& GetSessionHistoryInfo() const;
|
||||
uint64_t GetSessionHistoryID() const;
|
||||
const mozilla::dom::SessionHistoryInfo* GetSessionHistoryInfo() const;
|
||||
|
||||
void SetSessionHistoryInfo(
|
||||
const mozilla::dom::SessionHistoryInfoAndId& aIdAndInfo);
|
||||
void SetSessionHistoryInfo(const mozilla::dom::SessionHistoryInfo& aInfo);
|
||||
|
||||
const nsString& Target() const;
|
||||
|
||||
|
@ -365,7 +363,7 @@ class nsDocShellLoadState final {
|
|||
nsCOMPtr<nsISHEntry> mSHEntry;
|
||||
|
||||
// Session history info for the load
|
||||
mozilla::dom::SessionHistoryInfoAndId mSessionHistoryInfo;
|
||||
mozilla::UniquePtr<mozilla::dom::SessionHistoryInfo> mSessionHistoryInfo;
|
||||
|
||||
// Target for load, like _content, _blank etc.
|
||||
nsString mTarget;
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
static uint64_t gNextHistoryEntryId = 0;
|
||||
|
||||
SessionHistoryInfo::SessionHistoryInfo(nsDocShellLoadState* aLoadState,
|
||||
nsIChannel* aChannel)
|
||||
: mURI(aLoadState->URI()),
|
||||
|
@ -25,6 +27,7 @@ SessionHistoryInfo::SessionHistoryInfo(nsDocShellLoadState* aLoadState,
|
|||
mScrollPositionY(0),
|
||||
mSrcdocData(aLoadState->SrcdocData()),
|
||||
mBaseURI(aLoadState->BaseURI()),
|
||||
mId(++gNextHistoryEntryId),
|
||||
mLoadReplace(aLoadState->LoadReplace()),
|
||||
mURIWasModified(false),
|
||||
/* FIXME Should this be aLoadState->IsSrcdocLoad()? */
|
||||
|
@ -756,81 +759,75 @@ SessionHistoryEntry::SyncTreesForSubframeNavigation(
|
|||
|
||||
namespace ipc {
|
||||
|
||||
void IPDLParamTraits<dom::SessionHistoryInfoAndId>::Write(
|
||||
void IPDLParamTraits<dom::SessionHistoryInfo>::Write(
|
||||
IPC::Message* aMsg, IProtocol* aActor,
|
||||
const dom::SessionHistoryInfoAndId& aParam) {
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mId);
|
||||
|
||||
const dom::SessionHistoryInfo* info = aParam.mInfo.get();
|
||||
const dom::SessionHistoryInfo& aParam) {
|
||||
dom::ClonedMessageData stateData;
|
||||
if (info->mStateData) {
|
||||
JSStructuredCloneData& data = info->mStateData->Data();
|
||||
if (aParam.mStateData) {
|
||||
JSStructuredCloneData& data = aParam.mStateData->Data();
|
||||
auto iter = data.Start();
|
||||
bool success;
|
||||
stateData.data().data = data.Borrow(iter, data.Size(), &success);
|
||||
if (NS_WARN_IF(!success)) {
|
||||
return;
|
||||
}
|
||||
MOZ_ASSERT(info->mStateData->PortIdentifiers().IsEmpty() &&
|
||||
info->mStateData->BlobImpls().IsEmpty() &&
|
||||
info->mStateData->InputStreams().IsEmpty());
|
||||
MOZ_ASSERT(aParam.mStateData->PortIdentifiers().IsEmpty() &&
|
||||
aParam.mStateData->BlobImpls().IsEmpty() &&
|
||||
aParam.mStateData->InputStreams().IsEmpty());
|
||||
}
|
||||
|
||||
WriteIPDLParam(aMsg, aActor, info->mURI);
|
||||
WriteIPDLParam(aMsg, aActor, info->mOriginalURI);
|
||||
WriteIPDLParam(aMsg, aActor, info->mResultPrincipalURI);
|
||||
WriteIPDLParam(aMsg, aActor, info->mReferrerInfo);
|
||||
WriteIPDLParam(aMsg, aActor, info->mTitle);
|
||||
WriteIPDLParam(aMsg, aActor, info->mPostData);
|
||||
WriteIPDLParam(aMsg, aActor, info->mLoadType);
|
||||
WriteIPDLParam(aMsg, aActor, info->mScrollPositionX);
|
||||
WriteIPDLParam(aMsg, aActor, info->mScrollPositionY);
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mURI);
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mOriginalURI);
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mResultPrincipalURI);
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mReferrerInfo);
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mTitle);
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mPostData);
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mLoadType);
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mScrollPositionX);
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mScrollPositionY);
|
||||
WriteIPDLParam(aMsg, aActor, stateData);
|
||||
WriteIPDLParam(aMsg, aActor, info->mSrcdocData);
|
||||
WriteIPDLParam(aMsg, aActor, info->mBaseURI);
|
||||
WriteIPDLParam(aMsg, aActor, info->mLoadReplace);
|
||||
WriteIPDLParam(aMsg, aActor, info->mURIWasModified);
|
||||
WriteIPDLParam(aMsg, aActor, info->mIsSrcdocEntry);
|
||||
WriteIPDLParam(aMsg, aActor, info->mScrollRestorationIsManual);
|
||||
WriteIPDLParam(aMsg, aActor, info->mPersist);
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mSrcdocData);
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mBaseURI);
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mId);
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mLoadReplace);
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mURIWasModified);
|
||||
WriteIPDLParam(aMsg, aActor, aParam.mIsSrcdocEntry);
|
||||
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,
|
||||
dom::SessionHistoryInfoAndId* aResult) {
|
||||
uint64_t id;
|
||||
UniquePtr<dom::SessionHistoryInfo> info =
|
||||
MakeUnique<dom::SessionHistoryInfo>();
|
||||
dom::SessionHistoryInfo* aResult) {
|
||||
dom::ClonedMessageData stateData;
|
||||
if (!ReadIPDLParam(aMsg, aIter, aActor, &id) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mURI) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mOriginalURI) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mResultPrincipalURI) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mReferrerInfo) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mTitle) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mPostData) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mLoadType) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mScrollPositionX) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mScrollPositionY) ||
|
||||
if (!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mURI) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mOriginalURI) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mResultPrincipalURI) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mReferrerInfo) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mTitle) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mPostData) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mLoadType) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mScrollPositionX) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mScrollPositionY) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &stateData) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mSrcdocData) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mBaseURI) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mLoadReplace) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mURIWasModified) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mIsSrcdocEntry) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mScrollRestorationIsManual) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &info->mPersist)) {
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mSrcdocData) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mBaseURI) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mId) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mLoadReplace) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mURIWasModified) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mIsSrcdocEntry) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor,
|
||||
&aResult->mScrollRestorationIsManual) ||
|
||||
!ReadIPDLParam(aMsg, aIter, aActor, &aResult->mPersist)) {
|
||||
aActor->FatalError("Error reading fields for SessionHistoryInfo");
|
||||
return false;
|
||||
}
|
||||
info->mStateData = new nsStructuredCloneContainer();
|
||||
aResult->mStateData = new nsStructuredCloneContainer();
|
||||
if (aActor->GetSide() == ChildSide) {
|
||||
UnpackClonedMessageDataForChild(stateData, *info->mStateData);
|
||||
UnpackClonedMessageDataForChild(stateData, *aResult->mStateData);
|
||||
} else {
|
||||
UnpackClonedMessageDataForParent(stateData, *info->mStateData);
|
||||
UnpackClonedMessageDataForParent(stateData, *aResult->mStateData);
|
||||
}
|
||||
aResult->mId = id;
|
||||
aResult->mInfo = std::move(info);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@ class nsIURI;
|
|||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
struct SessionHistoryInfoAndId;
|
||||
class SHEntrySharedParentState;
|
||||
|
||||
// SessionHistoryInfo stores session history data for a load. It can be sent
|
||||
|
@ -37,9 +36,11 @@ class SessionHistoryInfo {
|
|||
|
||||
nsIURI* GetURI() const { return mURI; }
|
||||
|
||||
uint64_t Id() const { return mId; }
|
||||
|
||||
private:
|
||||
friend class SessionHistoryEntry;
|
||||
friend struct mozilla::ipc::IPDLParamTraits<SessionHistoryInfoAndId>;
|
||||
friend struct mozilla::ipc::IPDLParamTraits<SessionHistoryInfo>;
|
||||
|
||||
nsCOMPtr<nsIURI> mURI;
|
||||
nsCOMPtr<nsIURI> mOriginalURI;
|
||||
|
@ -53,6 +54,7 @@ class SessionHistoryInfo {
|
|||
RefPtr<nsStructuredCloneContainer> mStateData;
|
||||
nsString mSrcdocData;
|
||||
nsCOMPtr<nsIURI> mBaseURI;
|
||||
uint64_t mId = 0;
|
||||
bool mLoadReplace = false;
|
||||
bool mURIWasModified = false;
|
||||
bool mIsSrcdocEntry = false;
|
||||
|
@ -60,28 +62,6 @@ class SessionHistoryInfo {
|
|||
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
|
||||
// process. It holds a SessionHistoryInfo, some state shared amongst multiple
|
||||
// SessionHistoryEntries, a parent and children.
|
||||
|
@ -93,7 +73,7 @@ class SessionHistoryEntry : public nsISHEntry {
|
|||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSISHENTRY
|
||||
|
||||
const SessionHistoryInfo& GetInfo() const { return *mInfo; }
|
||||
const SessionHistoryInfo& Info() const { return *mInfo; }
|
||||
|
||||
private:
|
||||
virtual ~SessionHistoryEntry() = default;
|
||||
|
@ -111,11 +91,11 @@ class SessionHistoryEntry : public nsISHEntry {
|
|||
namespace ipc {
|
||||
|
||||
template <>
|
||||
struct IPDLParamTraits<dom::SessionHistoryInfoAndId> {
|
||||
struct IPDLParamTraits<dom::SessionHistoryInfo> {
|
||||
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,
|
||||
IProtocol* aActor, dom::SessionHistoryInfoAndId* aResult);
|
||||
IProtocol* aActor, dom::SessionHistoryInfo* aResult);
|
||||
};
|
||||
|
||||
} // namespace ipc
|
||||
|
|
|
@ -216,10 +216,7 @@ IPCResult DocumentChannelChild::RecvRedirectToRealChannel(
|
|||
|
||||
nsDocShell* docShell = GetDocShell();
|
||||
if (docShell && aArgs.sessionHistoryInfo().isSome()) {
|
||||
SessionHistoryInfoAndId& infoAndId = aArgs.sessionHistoryInfo().ref();
|
||||
if (infoAndId.mId != 0) {
|
||||
docShell->SetLoadingSessionHistoryInfoAndId(infoAndId);
|
||||
}
|
||||
docShell->SetLoadingSessionHistoryInfo(aArgs.sessionHistoryInfo().ref());
|
||||
}
|
||||
|
||||
// transfer any properties. This appears to be entirely a content-side
|
||||
|
|
|
@ -1084,9 +1084,7 @@ void DocumentLoadListener::SerializeRedirectData(
|
|||
aArgs.loadStateLoadFlags() = mLoadStateLoadFlags;
|
||||
aArgs.loadStateLoadType() = mLoadStateLoadType;
|
||||
if (mSessionHistoryInfo) {
|
||||
aArgs.sessionHistoryInfo().emplace(
|
||||
mSessionHistoryInfo->mId, MakeUnique<mozilla::dom::SessionHistoryInfo>(
|
||||
*mSessionHistoryInfo->mInfo));
|
||||
aArgs.sessionHistoryInfo().emplace(*mSessionHistoryInfo);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -403,7 +403,7 @@ class DocumentLoadListener : public nsIInterfaceRequestor,
|
|||
nsString mSrcdocData;
|
||||
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
|
||||
// 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 nsDOMNavigationTiming from "nsDOMNavigationTiming.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 net {
|
||||
|
@ -467,7 +467,7 @@ struct RedirectToRealChannelArgs {
|
|||
nsDOMNavigationTiming? timing;
|
||||
nsString srcdocData;
|
||||
nsIURI baseUri;
|
||||
SessionHistoryInfoAndId? sessionHistoryInfo;
|
||||
SessionHistoryInfo? sessionHistoryInfo;
|
||||
uint64_t loadIdentifier;
|
||||
};
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче