From 78c37a122e7c1ddc3025a14ae83054590ec01598 Mon Sep 17 00:00:00 2001 From: jakubiakdev Date: Sun, 10 May 2026 23:26:52 +0200 Subject: [PATCH 1/6] no-bug: Improve flaky URLBar scrolling (gh-13645) Co-authored-by: mr. m --- .../urlbar/UrlbarValueFormatter-sys-mjs.patch | 29 +++++++++-- .../themes/shared/urlbar-searchbar-css.patch | 15 +++++- .../D284084.patch} | 0 .../native_macos_popovers/D299584.patch | 51 +++++++++++++++++++ src/external-patches/manifest.json | 9 +++- src/zen/common/modules/ZenUIManager.mjs | 11 ---- 6 files changed, 97 insertions(+), 18 deletions(-) rename src/external-patches/firefox/{native_macos_popovers.patch => native_macos_popovers/D284084.patch} (100%) create mode 100644 src/external-patches/firefox/native_macos_popovers/D299584.patch diff --git a/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch b/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch index 469665532..d5826627d 100644 --- a/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/urlbar/UrlbarValueFormatter.sys.mjs b/browser/components/urlbar/UrlbarValueFormatter.sys.mjs -index f28d277764158566bc9406ce0e6160d92d346a63..82dd5f8568ec1b12e87676e5c2b243824628b5af 100644 +index f28d277764158566bc9406ce0e6160d92d346a63..aee17083999f99670c2de7b47cb917e400da86a6 100644 --- a/browser/components/urlbar/UrlbarValueFormatter.sys.mjs +++ b/browser/components/urlbar/UrlbarValueFormatter.sys.mjs @@ -77,7 +77,7 @@ export class UrlbarValueFormatter { @@ -11,7 +11,30 @@ index f28d277764158566bc9406ce0e6160d92d346a63..82dd5f8568ec1b12e87676e5c2b24382 }); } -@@ -371,7 +371,7 @@ export class UrlbarValueFormatter { +@@ -105,6 +105,22 @@ export class UrlbarValueFormatter { + } + + #ensureFormattedHostVisible(urlMetaData) { ++ // Make sure the domain is visible even with long subdomains when the single sidebar is being used ++ if ( ++ this.#window.gZenVerticalTabsManager?._hasSetSingleToolbar ++ && Services.prefs.getBoolPref("zen.urlbar.show-domain-only-in-sidebar") ++ ) { ++ const hoverAttr = "zen-has-implicit-hover"; ++ const hasHover = this.#window.gNavToolbox.hasAttribute(hoverAttr); ++ this.#window.gNavToolbox.removeAttribute(hoverAttr); ++ ++ this.#inputField.scrollLeft = this.#inputField.scrollLeftMax; ++ ++ if (hasHover) { ++ this.#window.gNavToolbox.setAttribute(hoverAttr, true); ++ } ++ return; ++ } + // Make sure the host is always visible. Since it is aligned on + // the first strong directional character, we set scrollLeft + // appropriately to ensure the domain stays visible in case of an +@@ -371,7 +387,7 @@ export class UrlbarValueFormatter { * @returns {boolean} * True if formatting was applied and false if not. */ @@ -20,7 +43,7 @@ index f28d277764158566bc9406ce0e6160d92d346a63..82dd5f8568ec1b12e87676e5c2b24382 let urlMetaData = this.#getUrlMetaData(); if (!urlMetaData) { return false; -@@ -640,6 +640,7 @@ export class UrlbarValueFormatter { +@@ -640,6 +656,7 @@ export class UrlbarValueFormatter { this.#window.requestAnimationFrame(() => { if (instance == this.#resizeInstance) { this.#ensureFormattedHostVisible(); diff --git a/src/browser/themes/shared/urlbar-searchbar-css.patch b/src/browser/themes/shared/urlbar-searchbar-css.patch index 8f644678a..9e8591778 100644 --- a/src/browser/themes/shared/urlbar-searchbar-css.patch +++ b/src/browser/themes/shared/urlbar-searchbar-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/shared/urlbar-searchbar.css b/browser/themes/shared/urlbar-searchbar.css -index 0ee35cfe67c9bce37a844d4b7d9715d4fb50f709..5cdb8037e49a68ea4126af349690af8a16b5e59b 100644 +index 0ee35cfe67c9bce37a844d4b7d9715d4fb50f709..034cf876c8cef5a2b4c0ca5f209d127dbfc90b20 100644 --- a/browser/themes/shared/urlbar-searchbar.css +++ b/browser/themes/shared/urlbar-searchbar.css @@ -10,7 +10,7 @@ @@ -20,7 +20,18 @@ index 0ee35cfe67c9bce37a844d4b7d9715d4fb50f709..5cdb8037e49a68ea4126af349690af8a } /* Document Picture-in-Picture API window */ -@@ -333,10 +333,14 @@ toolbar[inactive="true"] .urlbar, +@@ -200,6 +200,10 @@ toolbar[inactive="true"] .urlbar, + .urlbar:not([focused])[textoverflow="left"][domaindir="rtl"] > .urlbar-input-container > .urlbar-input-box > & { + mask-image: linear-gradient(to right, transparent var(--urlbar-scheme-size), black calc(var(--urlbar-scheme-size) + 3ch)); + } ++ ++ #navigator-toolbox[zen-has-implicit-hover="true"] .urlbar:not([focused])[textoverflow="left"] > .urlbar-input-container > .urlbar-input-box > & { ++ mask-image: linear-gradient(to right, transparent, black 3ch, black calc(100% - 3ch), transparent); ++ } + } + + #urlbar-scheme { +@@ -333,10 +337,14 @@ toolbar[inactive="true"] .urlbar, .urlbar[breakout][breakout-extend] { height: auto; diff --git a/src/external-patches/firefox/native_macos_popovers.patch b/src/external-patches/firefox/native_macos_popovers/D284084.patch similarity index 100% rename from src/external-patches/firefox/native_macos_popovers.patch rename to src/external-patches/firefox/native_macos_popovers/D284084.patch diff --git a/src/external-patches/firefox/native_macos_popovers/D299584.patch b/src/external-patches/firefox/native_macos_popovers/D299584.patch new file mode 100644 index 000000000..a729c092c --- /dev/null +++ b/src/external-patches/firefox/native_macos_popovers/D299584.patch @@ -0,0 +1,51 @@ +diff --git a/widget/cocoa/nsCocoaWindow.h b/widget/cocoa/nsCocoaWindow.h +--- a/widget/cocoa/nsCocoaWindow.h ++++ b/widget/cocoa/nsCocoaWindow.h +@@ -140,10 +140,11 @@ + + // NSPopover support for native appearance + NSPopover* mPopover; + NSViewController* mPopoverViewController; + BOOL mUsePopover; ++ NSRect mLastPopoverRect; + } + + - (id)initWithContentRect:(NSRect)contentRect + styleMask:(NSUInteger)styleMask + backing:(NSBackingStoreType)bufferingType +diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm +--- a/widget/cocoa/nsCocoaWindow.mm ++++ b/widget/cocoa/nsCocoaWindow.mm +@@ -5597,11 +5597,10 @@ + return false; + } + nsMenuPopupFrame* popupFrame = GetPopupFrame(); + return [mWindow isKindOfClass:[PopupWindow class]] && + [(PopupWindow*)mWindow usePopover] && popupFrame && +- popupFrame->ShouldFollowAnchor() && + !popupFrame->PopupElement().GetBoolAttr(nsGkAtoms::nonnativepopover); + } + + TransparencyMode nsCocoaWindow::GetTransparencyMode() { + NS_OBJC_BEGIN_TRY_BLOCK_RETURN; +@@ -8775,10 +8774,19 @@ + NS_OBJC_BEGIN_TRY_IGNORE_BLOCK; + if (!mPopover) { + return; + } + ++ if (!positioningRect.size.width && !positioningRect.size.height && ++ mLastPopoverRect.size.width && mLastPopoverRect.size.height) { ++ // Sometimes, specially when downloading addons from unofficial sources, ++ // the popover is shown in a very fast motion and the positioningRect is ++ // empty. ++ positioningRect = mLastPopoverRect; ++ } ++ mLastPopoverRect = positioningRect; ++ + // Close existing popover if it's already shown + if (mPopover.shown) { + [mPopover close]; + } + + diff --git a/src/external-patches/manifest.json b/src/external-patches/manifest.json index 37edc43f6..21eb331a2 100644 --- a/src/external-patches/manifest.json +++ b/src/external-patches/manifest.json @@ -4,7 +4,10 @@ [ { "type": "phabricator", - "id": "D284084", + "ids": [ + "D284084", + "D299584" + ], "name": "Native MacOS popovers", "replaces": { // Specifically trying to target FeatureCallout.sys.mjs's change. @@ -22,7 +25,9 @@ " #include \"nsISupportsPrimitives.h\"\n": "", " Atom(\"nonnative\", \"nonnative\"),\n": "", - "Atom(\"noscript\", \"noscript\"),": "Atom(\"noscript\", \"noscript\"),\n Atom(\"noshade\", \"noshade\")," + "Atom(\"noscript\", \"noscript\"),": "Atom(\"noscript\", \"noscript\"),\n Atom(\"noshade\", \"noshade\"),", + + "GetBoolAttr(nsGkAtoms::nonnative)": "GetBoolAttr(nsGkAtoms::nonnativepopover)" } }, { diff --git a/src/zen/common/modules/ZenUIManager.mjs b/src/zen/common/modules/ZenUIManager.mjs index 541574d77..84fe3271b 100644 --- a/src/zen/common/modules/ZenUIManager.mjs +++ b/src/zen/common/modules/ZenUIManager.mjs @@ -698,17 +698,6 @@ window.gZenUIManager = { this.urlbarShowDomainOnly ) { let url = BrowserUIUtils.removeSingleTrailingSlashFromURL(aURL); - requestAnimationFrame(() => { - const hoverAttr = "zen-has-implicit-hover"; - const hasHover = gNavToolbox.hasAttribute(hoverAttr); - gNavToolbox.removeAttribute(hoverAttr); - // Scroll the urlbar all the way to the right so that - // the domain is always visible when the url is too long. - gURLBar.inputField.scrollLeft = gURLBar.inputField.scrollWidth; - if (hasHover) { - gNavToolbox.setAttribute(hoverAttr, true); - } - }); let stripped = url.startsWith("https://") ? url.split("/")[2] : url; if (stripped.startsWith("www.")) { stripped = stripped.substring(4); From c406e79c5d335dd14bdf0c53b85804f3fd370184 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sun, 10 May 2026 23:28:52 +0200 Subject: [PATCH 2/6] no-bug: Remove fullscreen prefs (gh-13648) --- prefs/firefox/fullscreen.yaml | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 prefs/firefox/fullscreen.yaml diff --git a/prefs/firefox/fullscreen.yaml b/prefs/firefox/fullscreen.yaml deleted file mode 100644 index 269f46209..000000000 --- a/prefs/firefox/fullscreen.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# 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/. - -# Fullscreen API preferences -- name: full-screen-api.transition-duration.enter - value: "0 0" - -- name: full-screen-api.transition-duration.leave - value: "0 0" - -- name: full-screen-api.warning.delay - value: -1 - -- name: full-screen-api.warning.timeout - value: 0 From 0a7ee3fcf0048c00b4e1e639b3c28a96b18a5f2f Mon Sep 17 00:00:00 2001 From: Guilherme Luiz Cella <151692400+guilherme-luiz-cella@users.noreply.github.com> Date: Tue, 12 May 2026 06:57:56 -0300 Subject: [PATCH 3/6] no-bug: Refactor _oppositeSide method using OPPOSITE_SIDES (gh-13613) Signed-off-by: Guilherme Luiz Cella <151692400+guilherme-luiz-cella@users.noreply.github.com> Co-authored-by: mr. m <91018726+mr-cheffy@users.noreply.github.com> --- src/zen/split-view/ZenViewSplitter.mjs | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs index 783f2646d..2dc68c03c 100644 --- a/src/zen/split-view/ZenViewSplitter.mjs +++ b/src/zen/split-view/ZenViewSplitter.mjs @@ -969,19 +969,14 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { }; _oppositeSide(side) { - if (side === "top") { - return "bottom"; - } - if (side === "bottom") { - return "top"; - } - if (side === "left") { - return "right"; - } - if (side === "right") { - return "left"; - } - return undefined; + const OPPOSITE_SIDES = { + top: "bottom", + bottom: "top", + left: "right", + right: "left", + }; + + return OPPOSITE_SIDES[side]; } calculateHoverSide(x, y, elementRect) { From ad5205411321522f8c96c8927b445928271042d4 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Tue, 12 May 2026 23:20:00 +0200 Subject: [PATCH 4/6] no-bug: Sync upstream Firefox to version 150.0.3 (gh-13670) --- .github/workflows/sync-upstream.yml | 2 +- README.md | 4 ++-- build/firefox-cache/l10n-last-commit-hash | 2 +- surfer.json | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/sync-upstream.yml b/.github/workflows/sync-upstream.yml index a8f81b400..e4bca9156 100644 --- a/.github/workflows/sync-upstream.yml +++ b/.github/workflows/sync-upstream.yml @@ -129,7 +129,7 @@ jobs: token: ${{ secrets.DEPLOY_KEY }} commit-message: "chore: Sync upstream to `Firefox ${{ steps.build-data.outputs.version }}`" branch: "chore/upstream-sync" - title: "Sync upstream Firefox to version ${{ steps.build-data.outputs.version }}" + title: "no-bug: Sync upstream Firefox to version ${{ steps.build-data.outputs.version }}" body: | This PR syncs the upstream Firefox to version ${{ steps.build-data.outputs.version }}. diff --git a/README.md b/README.md index 9df57ae26..f7b1a498c 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 `150.0.2`! 🚀 -- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 150.0.2`! +- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `150.0.3`! 🚀 +- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 150.0.3`! ### Contributing diff --git a/build/firefox-cache/l10n-last-commit-hash b/build/firefox-cache/l10n-last-commit-hash index 9b5d1a99d..d647e7537 100644 --- a/build/firefox-cache/l10n-last-commit-hash +++ b/build/firefox-cache/l10n-last-commit-hash @@ -1 +1 @@ -73901ca17f4a2159dd4488cea8684e9abbfdcc89 \ No newline at end of file +69c3d9ff05fd352d761a41ec35f59b06e166e3bc \ No newline at end of file diff --git a/surfer.json b/surfer.json index 80a50edc9..23f82d2f9 100644 --- a/surfer.json +++ b/surfer.json @@ -5,8 +5,8 @@ "binaryName": "zen", "version": { "product": "firefox", - "version": "150.0.2", - "candidate": "150.0.2", + "version": "150.0.3", + "candidate": "150.0.3", "candidateBuild": 1 }, "buildOptions": { From f0a63fa7c5f74a77ffc52143ca4b0f22c8e47c9e Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Wed, 13 May 2026 12:38:31 +0200 Subject: [PATCH 5/6] no-bug: Fixed overflowable addons clipping button badges (gh-13679) --- src/zen/common/styles/zen-overflowing-addons.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/zen/common/styles/zen-overflowing-addons.css b/src/zen/common/styles/zen-overflowing-addons.css index 5725ed868..b3120fb0f 100644 --- a/src/zen/common/styles/zen-overflowing-addons.css +++ b/src/zen/common/styles/zen-overflowing-addons.css @@ -37,12 +37,16 @@ justify-content: center; align-items: center; border-radius: calc(var(--border-radius-medium) - 2px); - overflow: clip; + overflow: visible; padding: 0; &:hover { background-color: var(--zen-toolbar-element-bg-hover); } + + & .toolbarbutton-badge { + transform: translate(4px, 2px); + } } .unified-extensions-item-contents, From 3dd0ec9b65b57e344973ef0e5b37c0e1cfb88fe8 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Wed, 13 May 2026 16:37:16 +0200 Subject: [PATCH 6/6] no-bug: Fixed startup hang when release notes open (gh-13683) --- src/zen/spaces/ZenSpaceManager.mjs | 1 + src/zen/tabs/zen-tabs/vertical-tabs.css | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/zen/spaces/ZenSpaceManager.mjs b/src/zen/spaces/ZenSpaceManager.mjs index 391a60e1b..b1db3ce0b 100644 --- a/src/zen/spaces/ZenSpaceManager.mjs +++ b/src/zen/spaces/ZenSpaceManager.mjs @@ -875,6 +875,7 @@ class nsZenWorkspaces { await selectPromise; if (this._initialTab) { + this.selectEmptyTab(); this._removedByStartupPage = true; gBrowser.removeTab(this._initialTab, { skipSessionStore: true, diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css index d8e117132..8dfbcbd58 100644 --- a/src/zen/tabs/zen-tabs/vertical-tabs.css +++ b/src/zen/tabs/zen-tabs/vertical-tabs.css @@ -304,7 +304,7 @@ --tab-block-margin: 2px; --tab-selected-bgcolor: light-dark(rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.18)); - --tab-selected-shadow: 0 1px 1px 0px light-dark(rgba(0, 0, 0, 0.09), rgba(0, 0, 0, 0.05)) !important; + --tab-selected-shadow: 0 0.8px 1.5px 0px light-dark(rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.05)) !important; grid-gap: 0 !important; &[overflow]::after,