diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:44:51 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:44:51 +0000 |
commit | 9e3c08db40b8916968b9f30096c7be3f00ce9647 (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /browser/actors/AboutTabCrashedParent.sys.mjs | |
parent | Initial commit. (diff) | |
download | thunderbird-9e3c08db40b8916968b9f30096c7be3f00ce9647.tar.xz thunderbird-9e3c08db40b8916968b9f30096c7be3f00ce9647.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'browser/actors/AboutTabCrashedParent.sys.mjs')
-rw-r--r-- | browser/actors/AboutTabCrashedParent.sys.mjs | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/browser/actors/AboutTabCrashedParent.sys.mjs b/browser/actors/AboutTabCrashedParent.sys.mjs new file mode 100644 index 0000000000..4c11c3430d --- /dev/null +++ b/browser/actors/AboutTabCrashedParent.sys.mjs @@ -0,0 +1,92 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs"; + +const lazy = {}; + +ChromeUtils.defineESModuleGetters(lazy, { + SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs", +}); + +XPCOMUtils.defineLazyModuleGetters(lazy, { + TabCrashHandler: "resource:///modules/ContentCrashHandlers.jsm", +}); + +// A list of all of the open about:tabcrashed pages. +let gAboutTabCrashedPages = new Map(); + +export class AboutTabCrashedParent extends JSWindowActorParent { + didDestroy() { + this.removeCrashedPage(); + } + + async receiveMessage(message) { + let browser = this.browsingContext.top.embedderElement; + if (!browser) { + // If there is no browser, remove the crashed page from the set + // and return. + this.removeCrashedPage(); + return; + } + + let gBrowser = browser.getTabBrowser(); + let tab = gBrowser.getTabForBrowser(browser); + + switch (message.name) { + case "Load": { + gAboutTabCrashedPages.set(this, browser); + this.updateTabCrashedCount(); + + let report = lazy.TabCrashHandler.onAboutTabCrashedLoad(browser); + this.sendAsyncMessage("SetCrashReportAvailable", report); + break; + } + + case "closeTab": { + lazy.TabCrashHandler.maybeSendCrashReport(browser, message); + gBrowser.removeTab(tab, { animate: true }); + break; + } + + case "restoreTab": { + lazy.TabCrashHandler.maybeSendCrashReport(browser, message); + lazy.SessionStore.reviveCrashedTab(tab); + break; + } + + case "restoreAll": { + lazy.TabCrashHandler.maybeSendCrashReport(browser, message); + lazy.SessionStore.reviveAllCrashedTabs(); + break; + } + } + } + + removeCrashedPage() { + let browser = + this.browsingContext.top.embedderElement || + gAboutTabCrashedPages.get(this); + + gAboutTabCrashedPages.delete(this); + this.updateTabCrashedCount(); + + lazy.TabCrashHandler.onAboutTabCrashedUnload(browser); + } + + updateTabCrashedCount() { + // Broadcast to all about:tabcrashed pages a count of + // how many about:tabcrashed pages exist, so that they + // can decide whether or not to display the "Restore All + // Crashed Tabs" button. + let count = gAboutTabCrashedPages.size; + + for (let actor of gAboutTabCrashedPages.keys()) { + let browser = actor.browsingContext.top.embedderElement; + if (browser) { + browser.sendMessageToActor("UpdateCount", { count }, "AboutTabCrashed"); + } + } + } +} |