diff --git a/README.md b/README.md index 4f4b702ec..f3252b7ba 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,8 @@ Zen is a firefox-based browser with the aim of pushing your productivity to a ne ### Firefox Versions -- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `153.0.1`! 🚀 -- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 153.0.1`! +- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `153.0.3`! 🚀 +- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 153.0.3`! ### Contributing diff --git a/build/firefox-cache/l10n-last-commit-hash b/build/firefox-cache/l10n-last-commit-hash index c712cf24e..18180d8e5 100644 --- a/build/firefox-cache/l10n-last-commit-hash +++ b/build/firefox-cache/l10n-last-commit-hash @@ -1 +1 @@ -30959a45eaaf0bc499f3054793c76c6d7f0c8bc2 \ No newline at end of file +8a0a534248f80d8c53a8997f24683521c3a50ebc \ No newline at end of file diff --git a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch index 02f1ac127..b421fd11b 100644 --- a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch +++ b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs -index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1db40aecce 100644 +index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee4aa3be28 100644 --- a/browser/components/sessionstore/SessionStore.sys.mjs +++ b/browser/components/sessionstore/SessionStore.sys.mjs @@ -129,6 +129,9 @@ const TAB_EVENTS = [ @@ -12,7 +12,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d ]; const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; -@@ -199,6 +202,8 @@ ChromeUtils.defineESModuleGetters(lazy, { +@@ -201,6 +204,8 @@ ChromeUtils.defineESModuleGetters(lazy, { TabStateCache: "resource:///modules/sessionstore/TabStateCache.sys.mjs", TabStateFlusher: "resource:///modules/sessionstore/TabStateFlusher.sys.mjs", setTimeout: "resource://gre/modules/Timer.sys.mjs", @@ -21,7 +21,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d }); ChromeUtils.defineLazyGetter(lazy, "blankURI", () => { -@@ -1287,10 +1292,7 @@ var SessionStoreInternal = { +@@ -1300,10 +1305,7 @@ var SessionStoreInternal = { */ get willAutoRestore() { return ( @@ -33,7 +33,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d ); }, -@@ -1965,6 +1967,9 @@ var SessionStoreInternal = { +@@ -1990,6 +1992,9 @@ var SessionStoreInternal = { case "TabPinned": case "TabUnpinned": case "SwapDocShells": @@ -43,7 +43,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d this.saveStateDelayed(win); break; case "TabGroupCreate": -@@ -2074,6 +2079,10 @@ var SessionStoreInternal = { +@@ -2099,6 +2104,10 @@ var SessionStoreInternal = { this._windows[aWindow.__SSi].isTaskbarTab = true; } @@ -54,7 +54,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d if (lazy.AIWindow.isAIWindowActiveAndEnabled(aWindow)) { this._windows[aWindow.__SSi].isAIWindow = true; } -@@ -2110,7 +2119,7 @@ var SessionStoreInternal = { +@@ -2135,7 +2144,7 @@ var SessionStoreInternal = { let isTaskbarTab = this._windows[aWindow.__SSi].isTaskbarTab; // A regular window is not a private window, taskbar tab window, or popup window let isRegularWindow = @@ -63,7 +63,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d // perform additional initialization when the first window is loading if (lazy.RunState.isStopped) { -@@ -2122,7 +2131,7 @@ var SessionStoreInternal = { +@@ -2147,7 +2156,7 @@ var SessionStoreInternal = { // to disk to NOW() to enforce a full interval before the next write. lazy.SessionSaver.updateLastSaveTime(); @@ -72,7 +72,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d this._log.debug( "initializeWindow, the window is private or a web app. Saving SessionStartup.state for possibly restoring later" ); -@@ -2164,6 +2173,7 @@ var SessionStoreInternal = { +@@ -2191,6 +2200,7 @@ var SessionStoreInternal = { null, "sessionstore-one-or-no-tab-restored" ); @@ -80,7 +80,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d this._deferredAllWindowsRestored.resolve(); } // this window was opened by _openWindowWithState -@@ -2213,7 +2223,6 @@ var SessionStoreInternal = { +@@ -2240,7 +2250,6 @@ var SessionStoreInternal = { if (closedWindowState) { let newWindowState; if ( @@ -88,7 +88,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d !lazy.SessionStartup.willRestore() ) { // We want to split the window up into pinned tabs and unpinned tabs. -@@ -2249,6 +2258,7 @@ var SessionStoreInternal = { +@@ -2276,6 +2285,7 @@ var SessionStoreInternal = { } if (newWindowState) { @@ -96,23 +96,17 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d // Ensure that the window state isn't hidden this._restoreCount = 1; let state = { windows: [newWindowState] }; -@@ -2277,6 +2287,15 @@ var SessionStoreInternal = { +@@ -2312,6 +2322,9 @@ var SessionStoreInternal = { }); this._shouldRestoreLastSession = false; } + else if (!aInitialState && isRegularWindow) { -+ let windowPromises = []; -+ for (let window of this._browserWindows) { -+ windowPromises.push(lazy.TabStateFlusher.flushWindow(window)); -+ } -+ Promise.all(windowPromises).finally(() => { -+ lazy.ZenSessionStore.restoreNewWindow(aWindow, this); -+ }); ++ lazy.ZenSessionStore.restoreNewWindow(aWindow, this); + } if (this._restoreLastWindow && aWindow.toolbar.visible) { // always reset (if not a popup window) -@@ -2427,7 +2446,7 @@ var SessionStoreInternal = { +@@ -2462,7 +2475,7 @@ var SessionStoreInternal = { var tabbrowser = aWindow.gBrowser; @@ -121,7 +115,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d TAB_EVENTS.forEach(function (aEvent) { tabbrowser.tabContainer.removeEventListener(aEvent, this, true); -@@ -2478,7 +2497,7 @@ var SessionStoreInternal = { +@@ -2513,7 +2526,7 @@ var SessionStoreInternal = { let isLastRegularWindow = Object.values(this._windows).filter( @@ -130,7 +124,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d ).length == 1; this._log.debug( `onClose, closing window isLastRegularWindow? ${isLastRegularWindow}` -@@ -2535,8 +2554,8 @@ var SessionStoreInternal = { +@@ -2570,8 +2583,8 @@ var SessionStoreInternal = { // 2) Flush the window. // 3) When the flush is complete, revisit our decision to store the window // in _closedWindows, and add/remove as necessary. @@ -141,7 +135,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d } completionPromise = lazy.TabStateFlusher.flushWindow(aWindow).then(() => { -@@ -2556,8 +2575,9 @@ var SessionStoreInternal = { +@@ -2591,8 +2604,9 @@ var SessionStoreInternal = { // Save non-private windows if they have at // least one saveable tab or are the last window. @@ -153,7 +147,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d if (!isLastWindow && winData.closedId > -1) { this._addClosedAction( -@@ -2633,7 +2653,7 @@ var SessionStoreInternal = { +@@ -2668,7 +2682,7 @@ var SessionStoreInternal = { * to call this method again asynchronously (for example, after * a window flush). */ @@ -162,7 +156,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d // Make sure SessionStore is still running, and make sure that we // haven't chosen to forget this window. if ( -@@ -2650,6 +2670,7 @@ var SessionStoreInternal = { +@@ -2685,6 +2699,7 @@ var SessionStoreInternal = { // _closedWindows from a previous call to this function. let winIndex = this._closedWindows.indexOf(winData); let alreadyStored = winIndex != -1; @@ -170,7 +164,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d // If sidebar command is truthy, i.e. sidebar is open, store sidebar settings let shouldStore = hasSaveableTabs || isLastWindow; -@@ -3467,7 +3488,7 @@ var SessionStoreInternal = { +@@ -3507,7 +3522,7 @@ var SessionStoreInternal = { if (!isPrivateWindow && tabState.isPrivate) { return; } @@ -179,7 +173,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d return; } -@@ -4206,6 +4227,12 @@ var SessionStoreInternal = { +@@ -4246,6 +4261,12 @@ var SessionStoreInternal = { Math.min(tabState.index, tabState.entries.length) ); tabState.pinned = false; @@ -192,7 +186,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d if (inBackground === false) { aWindow.gBrowser.selectedTab = newTab; -@@ -4642,6 +4669,8 @@ var SessionStoreInternal = { +@@ -4679,6 +4700,8 @@ var SessionStoreInternal = { // Append the tab if we're opening into a different window, tabIndex: aSource == aTargetWindow ? pos : Infinity, pinned: state.pinned, @@ -201,7 +195,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d userContextId: state.userContextId, skipLoad: true, preferredRemoteType, -@@ -5146,9 +5175,10 @@ var SessionStoreInternal = { +@@ -5176,9 +5199,10 @@ var SessionStoreInternal = { if (activePageData.title && activePageData.title != activePageData.url) { win.gBrowser.setInitialTabTitle(tab, activePageData.title, { isContentTitle: true, @@ -213,7 +207,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d } } -@@ -5513,7 +5543,7 @@ var SessionStoreInternal = { +@@ -5543,7 +5567,7 @@ var SessionStoreInternal = { for (let i = tabbrowser.pinnedTabCount; i < tabbrowser.tabs.length; i++) { let tab = tabbrowser.tabs[i]; @@ -222,7 +216,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d removableTabs.push(tab); } } -@@ -5626,7 +5656,7 @@ var SessionStoreInternal = { +@@ -5656,7 +5680,7 @@ var SessionStoreInternal = { // collect the data for all windows for (ix in this._windows) { @@ -231,7 +225,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d // window data is still in _statesToRestore continue; } -@@ -5770,11 +5800,12 @@ var SessionStoreInternal = { +@@ -5800,11 +5824,12 @@ var SessionStoreInternal = { } let tabbrowser = aWindow.gBrowser; @@ -245,7 +239,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d // update the internal state data for this window for (let tab of tabs) { if (tab == aWindow.FirefoxViewHandler.tab) { -@@ -5785,6 +5816,9 @@ var SessionStoreInternal = { +@@ -5815,6 +5840,9 @@ var SessionStoreInternal = { tabsData.push(tabData); } @@ -255,7 +249,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d // update tab group state for this window winData.groups = []; for (let tabGroup of aWindow.gBrowser.tabGroups) { -@@ -5801,7 +5835,7 @@ var SessionStoreInternal = { +@@ -5831,7 +5859,7 @@ var SessionStoreInternal = { // a window is closed, point to the first item in the tab strip instead (it will never be the Firefox View tab, // since it's only inserted into the tab strip after it's selected). if (aWindow.FirefoxViewHandler.tab?.selected) { @@ -264,7 +258,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d winData.title = tabbrowser.tabs[0].label; } winData.selected = selectedIndex; -@@ -6003,8 +6037,8 @@ var SessionStoreInternal = { +@@ -6033,8 +6061,8 @@ var SessionStoreInternal = { // selectTab represents. let selectTab = 0; if (overwriteTabs) { @@ -275,7 +269,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d selectTab = Math.min(selectTab, winData.tabs.length); } -@@ -6026,6 +6060,7 @@ var SessionStoreInternal = { +@@ -6056,6 +6084,7 @@ var SessionStoreInternal = { if (overwriteTabs) { for (let i = tabbrowser.browsers.length - 1; i >= 0; i--) { if (!tabbrowser.tabs[i].selected) { @@ -283,7 +277,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d tabbrowser.removeTab(tabbrowser.tabs[i]); } } -@@ -6060,6 +6095,12 @@ var SessionStoreInternal = { +@@ -6090,6 +6119,12 @@ var SessionStoreInternal = { savedTabGroup => !openTabGroupIdsInWindow.has(savedTabGroup.id) ); } @@ -296,7 +290,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d // Move the originally open tabs to the end. if (initialTabs) { -@@ -6626,6 +6667,25 @@ var SessionStoreInternal = { +@@ -6656,6 +6691,25 @@ var SessionStoreInternal = { // Most of tabData has been restored, now continue with restoring // attributes that may trigger external events. @@ -322,7 +316,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d if (tabData.pinned) { tabbrowser.pinTab(tab); -@@ -6793,6 +6853,9 @@ var SessionStoreInternal = { +@@ -6838,6 +6892,9 @@ var SessionStoreInternal = { aWindow.gURLBar.readOnly = false; } } @@ -332,7 +326,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d let promiseParts = Promise.withResolvers(); aWindow.setTimeout(() => { -@@ -7588,7 +7651,7 @@ var SessionStoreInternal = { +@@ -7633,7 +7690,7 @@ var SessionStoreInternal = { let groupsToSave = new Map(); for (let tIndex = 0; tIndex < window.tabs.length; ) { @@ -341,7 +335,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d // Adjust window.selected if (tIndex + 1 < window.selected) { window.selected -= 1; -@@ -7603,7 +7666,7 @@ var SessionStoreInternal = { +@@ -7648,7 +7705,7 @@ var SessionStoreInternal = { ); // We don't want to increment tIndex here. continue; @@ -350,7 +344,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d // Convert any open groups into saved groups. let groupStateToSave = window.groups.find( groupState => groupState.id == window.tabs[tIndex].groupId -@@ -8062,7 +8125,6 @@ var SessionStoreInternal = { +@@ -8193,7 +8250,6 @@ var SessionStoreInternal = { timer.initWithCallback( function () { if (beats <= 0) { @@ -358,7 +352,7 @@ index 183543c5f29ff4c879d3058e4c09faf376a69cb7..ab482c32cc697ccef82bf0aeaa0e3a1d Glean.sessionRestore.shutdownFlushAllOutcomes.timed_out.add(1); deferred.resolve(); } -@@ -8540,6 +8602,7 @@ var SessionStoreInternal = { +@@ -8671,6 +8727,7 @@ var SessionStoreInternal = { if ( !savedTabGroupState.tabs.length || this.getSavedTabGroup(savedTabGroupState.id) diff --git a/src/zen/common/modules/ZenStartup.mjs b/src/zen/common/modules/ZenStartup.mjs index 307fa0dbf..a1683d6ad 100644 --- a/src/zen/common/modules/ZenStartup.mjs +++ b/src/zen/common/modules/ZenStartup.mjs @@ -7,7 +7,7 @@ import checkForZenUpdates, { } from "chrome://browser/content/ZenUpdates.mjs"; class ZenStartup { - #watermarkIgnoreElements = ["zen-toast-container"]; + #watermarkIgnoreElements = ["zen-toast-container", "zen-browser-background"]; #hasInitializedLayout = false; isReady = false; @@ -53,12 +53,11 @@ class ZenStartup { // overlap and interaction issues with vertical tabs document.getElementById("browser").prepend(deckTemplate); - gZenWorkspaces.init(); - setTimeout(() => { + gZenWorkspaces.init().then(() => { gZenUIManager.init(); this.#initUIComponents(); this.#checkForWelcomePage(); - }, 0); + }); } catch (e) { console.error("ZenThemeModifier: Error initializing browser layout", e); } @@ -119,7 +118,9 @@ class ZenStartup { document.documentElement.removeAttribute("zen-before-loaded"); return; } - for (let elem of document.querySelectorAll("#browser > *, #urlbar")) { + for (let elem of document.querySelectorAll( + `#browser > *:not(${this.#watermarkIgnoreElements.map(id => "#" + id).join(", ")}), #urlbar` + )) { elem.style.opacity = 0; } } diff --git a/src/zen/common/styles/zen-browser-ui.css b/src/zen/common/styles/zen-browser-ui.css index 32be5043d..01966ce3d 100644 --- a/src/zen/common/styles/zen-browser-ui.css +++ b/src/zen/common/styles/zen-browser-ui.css @@ -27,7 +27,7 @@ body, } } -:root[zen-before-loaded="true"] #browser > *:not(#zen-toast-container), +:root[zen-before-loaded="true"] #browser > *:not(#zen-toast-container, #zen-browser-background), :root[zen-before-loaded="true"] #urlbar { opacity: 0 !important; } diff --git a/src/zen/sessionstore/ZenSessionManager.sys.mjs b/src/zen/sessionstore/ZenSessionManager.sys.mjs index bccec81c6..594ae490c 100644 --- a/src/zen/sessionstore/ZenSessionManager.sys.mjs +++ b/src/zen/sessionstore/ZenSessionManager.sys.mjs @@ -14,6 +14,7 @@ ChromeUtils.defineESModuleGetters(lazy, { PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs", SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs", SessionStartup: "resource:///modules/sessionstore/SessionStartup.sys.mjs", + TabStateFlusher: "resource:///modules/sessionstore/TabStateFlusher.sys.mjs", gWindowSyncEnabled: "resource:///modules/zen/ZenWindowSync.sys.mjs", gSyncOnlyPinnedTabs: "resource:///modules/zen/ZenWindowSync.sys.mjs", DeferredTask: "resource://gre/modules/DeferredTask.sys.mjs", @@ -914,6 +915,79 @@ export class nsZenSessionManager { aWindow.__isNewZenWindow = true; SessionStoreInternal._deferredInitialState = newState; SessionStoreInternal.initializeWindow(aWindow, newState); + this.#refreshRestoredTabsState(aWindow, SessionStoreInternal).catch(e => + console.error("ZenSessionManager: Failed to refresh restored tabs", e) + ); + } + + /** + * The state we clone into a new window comes from the parent process + * cache, which may lag behind the content processes (e.g. for a tab that + * was opened or navigated right before opening the new window). After the + * new window has been restored, flush the previous window and update each + * counterpart tab that hasn't started loading yet. + * + * @param {Window} aWindow + * The newly restored window. + * @param {object} SessionStoreInternal + * The SessionStore module instance. + */ + async #refreshRestoredTabsState(aWindow, SessionStoreInternal) { + // Wait until the tabs have actually been created in the new window. + await aWindow.gZenWorkspaces.promiseInitialized; + if (aWindow.closed) { + return; + } + // Only refresh from the most recently used window: any other window + // already reported its state when it lost focus, so the cloned data + // is up to date for it. + let previousWindow = null; + for (const win of SessionStoreInternal._browserWindows) { + if (win !== aWindow && !win.closed) { + previousWindow = win; + break; + } + } + if (!previousWindow) { + return; + } + for (const tab of previousWindow.gZenWorkspaces.allStoredTabs) { + const syncId = tab.getAttribute("id"); + // A tab that has never loaded has no state in the content process, + // so there's nothing newer to flush out of it. + if (!syncId || tab.closing || !tab.linkedPanel) { + continue; + } + const targetTab = aWindow.document.getElementById(syncId); + // Only refresh a tab that hasn't started loading: setting the state + // of a loaded tab would reload it. + if ( + !aWindow.gBrowser.isTab(targetTab) || + targetTab.linkedPanel || + targetTab.closing + ) { + continue; + } + lazy.TabStateFlusher.flush(tab.linkedBrowser) + .then(() => { + // Things may have changed while the flush was in flight. + if ( + aWindow.closed || + tab.closing || + targetTab.linkedPanel || + targetTab.closing + ) { + return; + } + lazy.SessionStore.setTabState( + targetTab, + lazy.SessionStore.getTabState(tab) + ); + }) + .catch(e => + console.error("ZenSessionManager: Failed to refresh tab state", e) + ); + } } /** diff --git a/src/zen/spaces/ZenSpaceManager.mjs b/src/zen/spaces/ZenSpaceManager.mjs index 912e39bef..e4a31b5a8 100644 --- a/src/zen/spaces/ZenSpaceManager.mjs +++ b/src/zen/spaces/ZenSpaceManager.mjs @@ -779,6 +779,7 @@ class nsZenWorkspaces { restoreWorkspacesFromSessionStore(aWinData = {}) { if (this.#hasInitialized || !this.workspaceEnabled) { + this._resolveInitialized?.(); return Promise.resolve(); } const spacesFromStore = aWinData.spaces || []; diff --git a/surfer.json b/surfer.json index 19770b353..de5b254d8 100644 --- a/surfer.json +++ b/surfer.json @@ -5,8 +5,8 @@ "binaryName": "zen", "version": { "product": "firefox", - "version": "153.0.1", - "candidate": "153.0.1", + "version": "153.0.3", + "candidate": "153.0.3", "candidateBuild": 1 }, "buildOptions": {