Bug 1602501: Update TabListener owner content when swapping frame loaders. r=peterv

Differential Revision: https://phabricator.services.mozilla.com/D103722
This commit is contained in:
Kris Maglione 2021-02-03 19:28:06 +00:00
parent a28d2450d7
commit 4c823d6e30
4 changed files with 53 additions and 36 deletions

View File

@ -140,7 +140,6 @@ skip-if = fission # Bug 1572084
[browser_sizemodeBeforeMinimized.js]
[browser_tab_label_during_restore.js]
[browser_swapDocShells.js]
fail-if = sessionHistoryInParent # Bug 1602501
[browser_switch_remoteness.js]
run-if = e10s
[browser_upgrade_backup.js]

View File

@ -2059,6 +2059,12 @@ void nsFrameLoader::SetOwnerContent(Element* aContent) {
}
mOwnerContent = aContent;
if (mSessionStoreListener && mOwnerContent) {
// mOwnerContent will only be null when the frame loader is being destroyed,
// so the session store listener will be destroyed along with it.
mSessionStoreListener->SetOwnerContent(mOwnerContent);
}
if (RefPtr<BrowsingContext> browsingContext = GetExtantBrowsingContext()) {
browsingContext->SetEmbedderElement(mOwnerContent);
}

View File

@ -221,24 +221,52 @@ nsresult TabListener::Init() {
mStorageObserverRegistered = true;
}
nsCOMPtr<EventTarget> eventTarget = GetEventTarget();
if (!eventTarget) {
return NS_OK;
}
eventTarget->AddSystemEventListener(u"mozvisualscroll"_ns, this, false);
eventTarget->AddSystemEventListener(u"input"_ns, this, false);
if (mozilla::SessionHistoryInParent()) {
eventTarget->AddSystemEventListener(u"DOMTitleChanged"_ns, this, false);
}
mEventListenerRegistered = true;
eventTarget->AddSystemEventListener(u"MozSessionStorageChanged"_ns, this,
false);
mStorageChangeListenerRegistered = true;
AddEventListeners();
return NS_OK;
}
void TabListener::AddEventListeners() {
if (nsCOMPtr<EventTarget> eventTarget = GetEventTarget()) {
eventTarget->AddSystemEventListener(u"mozvisualscroll"_ns, this, false);
eventTarget->AddSystemEventListener(u"input"_ns, this, false);
if (mozilla::SessionHistoryInParent()) {
eventTarget->AddSystemEventListener(u"DOMTitleChanged"_ns, this, false);
}
mEventListenerRegistered = true;
eventTarget->AddSystemEventListener(u"MozSessionStorageChanged"_ns, this,
false);
mStorageChangeListenerRegistered = true;
}
}
void TabListener::RemoveEventListeners() {
if (nsCOMPtr<EventTarget> eventTarget = GetEventTarget()) {
if (mEventListenerRegistered) {
eventTarget->RemoveSystemEventListener(u"mozvisualscroll"_ns, this,
false);
eventTarget->RemoveSystemEventListener(u"input"_ns, this, false);
if (mozilla::SessionHistoryInParent()) {
eventTarget->RemoveSystemEventListener(u"DOMTitleChanged"_ns, this,
false);
}
mEventListenerRegistered = false;
}
if (mStorageChangeListenerRegistered) {
eventTarget->RemoveSystemEventListener(u"MozSessionStorageChanged"_ns,
this, false);
mStorageChangeListenerRegistered = false;
}
}
}
void TabListener::SetOwnerContent(Element* aElement) {
MOZ_DIAGNOSTIC_ASSERT(aElement);
RemoveEventListeners();
mOwnerContent = aElement;
AddEventListeners();
}
/* static */
void TabListener::TimerCallback(nsITimer* aTimer, void* aClosure) {
auto listener = static_cast<TabListener*>(aClosure);
@ -811,26 +839,7 @@ void TabListener::RemoveListeners() {
}
}
if (mEventListenerRegistered || mStorageChangeListenerRegistered) {
nsCOMPtr<EventTarget> eventTarget = GetEventTarget();
if (eventTarget) {
if (mEventListenerRegistered) {
eventTarget->RemoveSystemEventListener(u"mozvisualscroll"_ns, this,
false);
eventTarget->RemoveSystemEventListener(u"input"_ns, this, false);
if (mozilla::SessionHistoryInParent()) {
eventTarget->RemoveSystemEventListener(u"DOMTitleChanged"_ns, this,
false);
}
mEventListenerRegistered = false;
}
if (mStorageChangeListenerRegistered) {
eventTarget->RemoveSystemEventListener(u"MozSessionStorageChanged"_ns,
this, false);
mStorageChangeListenerRegistered = false;
}
}
}
RemoveEventListeners();
if (mPrefObserverRegistered || mStorageObserverRegistered) {
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();

View File

@ -135,6 +135,7 @@ class TabListener : public nsIDOMEventListener,
void SetEpoch(uint32_t aEpoch) { mEpoch = aEpoch; }
uint32_t GetEpoch() { return mEpoch; }
void UpdateSHistoryChanges(bool aImmediately);
void SetOwnerContent(Element* aElement);
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(TabListener, nsIDOMEventListener)
@ -148,6 +149,8 @@ class TabListener : public nsIDOMEventListener,
static void TimerCallback(nsITimer* aTimer, void* aClosure);
void AddTimerForUpdate();
void StopTimerForUpdate();
void AddEventListeners();
void RemoveEventListeners();
bool UpdateSessionStore(uint32_t aFlushId = 0, bool aIsFinal = false);
void ResetStorageChangeListener();
void RemoveStorageChangeListener();