Bug 1703692 - Store the latest embedder's permanent key on CanonicalBrowsingContext, r=nika,mccr8
And include it in Session Store flushes to avoid dropping updates in case the browser is unavailable. Differential Revision: https://phabricator.services.mozilla.com/D118385
This commit is contained in:
@@ -78,7 +78,8 @@ CanonicalBrowsingContext::CanonicalBrowsingContext(WindowContext* aParentWindow,
|
||||
: BrowsingContext(aParentWindow, aGroup, aBrowsingContextId, aType,
|
||||
std::move(aInit)),
|
||||
mProcessId(aOwnerProcessId),
|
||||
mEmbedderProcessId(aEmbedderProcessId) {
|
||||
mEmbedderProcessId(aEmbedderProcessId),
|
||||
mPermanentKey(JS::NullValue()) {
|
||||
// You are only ever allowed to create CanonicalBrowsingContexts in the
|
||||
// parent process.
|
||||
MOZ_RELEASE_ASSERT(XRE_IsParentProcess());
|
||||
@@ -86,6 +87,12 @@ CanonicalBrowsingContext::CanonicalBrowsingContext(WindowContext* aParentWindow,
|
||||
// The initial URI in a BrowsingContext is always "about:blank".
|
||||
MOZ_ALWAYS_SUCCEEDS(
|
||||
NS_NewURI(getter_AddRefs(mCurrentRemoteURI), "about:blank"));
|
||||
|
||||
mozilla::HoldJSObjects(this);
|
||||
}
|
||||
|
||||
CanonicalBrowsingContext::~CanonicalBrowsingContext() {
|
||||
mozilla::DropJSObjects(this);
|
||||
}
|
||||
|
||||
/* static */
|
||||
@@ -288,6 +295,9 @@ void CanonicalBrowsingContext::ReplacedBy(
|
||||
mLoadingEntries.SwapElements(aNewContext->mLoadingEntries);
|
||||
MOZ_ASSERT(!aNewContext->mActiveEntry);
|
||||
mActiveEntry.swap(aNewContext->mActiveEntry);
|
||||
|
||||
aNewContext->mPermanentKey = mPermanentKey;
|
||||
mPermanentKey = JS::NullValue();
|
||||
}
|
||||
|
||||
void CanonicalBrowsingContext::UpdateSecurityState() {
|
||||
@@ -1765,6 +1775,19 @@ CanonicalBrowsingContext::ChangeRemoteness(
|
||||
return promise.forget();
|
||||
}
|
||||
|
||||
void CanonicalBrowsingContext::MaybeSetPermanentKey(Element* aEmbedder) {
|
||||
MOZ_DIAGNOSTIC_ASSERT(IsTop());
|
||||
|
||||
if (aEmbedder) {
|
||||
if (nsCOMPtr<nsIBrowser> browser = aEmbedder->AsBrowser()) {
|
||||
JS::RootedValue key(RootingCx());
|
||||
if (NS_SUCCEEDED(browser->GetPermanentKey(&key)) && key.isObject()) {
|
||||
mPermanentKey = key;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MediaController* CanonicalBrowsingContext::GetMediaController() {
|
||||
// We would only create one media controller per tab, so accessing the
|
||||
// controller via the top-level browsing context.
|
||||
@@ -2083,17 +2106,6 @@ void CanonicalBrowsingContext::RestoreState::Resolve() {
|
||||
|
||||
nsresult CanonicalBrowsingContext::WriteSessionStorageToSessionStore(
|
||||
const nsTArray<SSCacheCopy>& aSesssionStorage, uint32_t aEpoch) {
|
||||
RefPtr<WindowGlobalParent> windowParent = GetCurrentWindowGlobal();
|
||||
|
||||
if (!windowParent) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
Element* frameElement = windowParent->GetRootOwnerElement();
|
||||
if (!frameElement) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsISessionStoreFunctions> funcs =
|
||||
do_ImportModule("resource://gre/modules/SessionStoreFunctions.jsm");
|
||||
if (!funcs) {
|
||||
@@ -2119,8 +2131,10 @@ nsresult CanonicalBrowsingContext::WriteSessionStorageToSessionStore(
|
||||
update.setNull();
|
||||
}
|
||||
|
||||
return funcs->UpdateSessionStoreForStorage(frameElement, this, aEpoch,
|
||||
update);
|
||||
JS::RootedValue key(jsapi.cx(), Top()->PermanentKey());
|
||||
|
||||
return funcs->UpdateSessionStoreForStorage(Top()->GetEmbedderElement(), this,
|
||||
key, aEpoch, update);
|
||||
}
|
||||
|
||||
void CanonicalBrowsingContext::UpdateSessionStoreSessionStorage(
|
||||
@@ -2407,10 +2421,28 @@ void CanonicalBrowsingContext::SetTouchEventsOverride(
|
||||
SetTouchEventsOverrideInternal(aOverride, aRv);
|
||||
}
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_INHERITED(CanonicalBrowsingContext, BrowsingContext,
|
||||
mSessionHistory, mContainerFeaturePolicy,
|
||||
mCurrentBrowserParent, mWebProgress,
|
||||
mSessionStoreSessionStorageUpdateTimer)
|
||||
NS_IMPL_CYCLE_COLLECTION_CLASS(CanonicalBrowsingContext)
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(CanonicalBrowsingContext,
|
||||
BrowsingContext)
|
||||
tmp->mPermanentKey.setNull();
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mSessionHistory, mContainerFeaturePolicy,
|
||||
mCurrentBrowserParent, mWebProgress,
|
||||
mSessionStoreSessionStorageUpdateTimer)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(CanonicalBrowsingContext,
|
||||
BrowsingContext)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSessionHistory, mContainerFeaturePolicy,
|
||||
mCurrentBrowserParent, mWebProgress,
|
||||
mSessionStoreSessionStorageUpdateTimer)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(CanonicalBrowsingContext,
|
||||
BrowsingContext)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mPermanentKey)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRACE_END
|
||||
|
||||
NS_IMPL_ADDREF_INHERITED(CanonicalBrowsingContext, BrowsingContext)
|
||||
NS_IMPL_RELEASE_INHERITED(CanonicalBrowsingContext, BrowsingContext)
|
||||
|
||||
Reference in New Issue
Block a user