chore: Started working on browser swaping, b=(no-bug), c=workspaces

This commit is contained in:
mr. m 2025-04-30 19:06:12 +02:00
parent 7fe7e898af
commit 0d0967c823
No known key found for this signature in database
GPG key ID: 419302196C23B258

View file

@ -2930,6 +2930,8 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
#ignoreNextEvents = false;
#waitForPromise = null;
lastSelectedWindow = false;
constructor() {
super();
if (!window.closed) {
@ -2941,6 +2943,8 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
await ZenWorkspaces.promiseInitialized;
this.#makeSureAllTabsHaveIds();
this.#setUpEventListeners();
this.lastSelectedWindow = ZenMultiWindowFeature.isActiveWindow;
}
#makeSureAllTabsHaveIds() {
@ -2971,12 +2975,60 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
for (const event of kEvents) {
window.addEventListener(event, eventListener);
}
window.addEventListener('unload', () => {
for (const event of kEvents) {
window.removeEventListener(event, eventListener);
}
});
window.addEventListener('focus', this.#onWindowFocus.bind(this));
}
#handleEvent(event) {
this.#propagateToOtherWindows(event);
}
#getLastSelectedWindow() {
return new Promise(async (resolve) => {
await this.foreachWindowAsActive(async (browser) => {
if (browser.gZenWorkspaceWindowSync && browser.gZenWorkspaceWindowSync.lastSelectedWindow) {
resolve(browser);
}
});
resolve(null);
});
}
async #onWindowFocus(event) {
const lastSelectedWindow = await this.#getLastSelectedWindow();
if (lastSelectedWindow && lastSelectedWindow !== window) {
lastSelectedWindow.gZenWorkspaceWindowSync.lastSelectedWindow = false;
this.lastSelectedWindow = true;
this.#replaceBrowsersWithLastSelectedWindow(lastSelectedWindow);
} else {
this.lastSelectedWindow = false;
}
}
#replaceBrowsersWithLastSelectedWindow(lastSelectedWindow) {
// Replace all `linkedBrowser` elements with the last selected window's browsers
// from all the tabs in the current window
const allTabs = lastSelectedWindow.ZenWorkspaces.allStoredTabs;
for (const oldTab of allTabs) {
const tabId = this.#getTabId(oldTab);
const targetTab = this.#getTabWithId(tabId);
if (targetTab) {
const browserToReplace = oldTab.linkedBrowser;
const browserReplaced = targetTab.linkedBrowser;
const parentNode = browserReplaced.parentNode;
if (browserToReplace && parentNode) {
gBrowser.swapBrowsers(browserToReplace, browserReplaced);
}
}
}
}
async #propagateToOtherWindows(event) {
if (this.#ignoreNextEvents) {
return;
@ -3148,7 +3200,6 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
async #onTabOpen(event) {
await new Promise((resolve) => {
setTimeout(() => {
const targetTab = event.target;
const isPinned = targetTab.pinned;
const isEssential = isPinned && targetTab.hasAttribute('zen-essential');
@ -3163,7 +3214,6 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
gBrowser.moveTabTo(duplicatedTab, { tabIndex, forceUngrouped: !!targetTab.group });
resolve();
}, 0);
});
}
}