From 02e0cd8717983976ef1fc8d796755edded01b67e Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Fri, 19 Dec 2025 16:13:28 +0100 Subject: [PATCH 1/6] feat: Apply a language code map for certain locales, p=#11669, c=scripts --- locales/language-maps | 1 + package.json | 2 +- scripts/copy_language_pack.py | 21 ++++++++++++++++++++- scripts/download-language-packs.sh | 14 ++++++++++++-- 4 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 locales/language-maps diff --git a/locales/language-maps b/locales/language-maps new file mode 100644 index 000000000..e12f62b15 --- /dev/null +++ b/locales/language-maps @@ -0,0 +1 @@ +nb:nb-NO \ No newline at end of file diff --git a/package.json b/package.json index 963e0b0b2..43347ed83 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "sync:raw": "surfer update", "sync:rc": "python3 scripts/update_ff.py --rc", "sync:l10n": "python3 scripts/update_ff.py --just-l10n", - "pretty": "prettier . --write --cache && autopep8 -r --in-place scripts/ src/", + "pretty": "prettier . --write --cache && autopep8 -r --in-place scripts/ src/ --exclude */tests/*", "lint": "npx eslint src/ && prettier . --check --cache", "lint:fix": "npm run pretty && npx eslint src/ --fix", "prepare": "husky", diff --git a/scripts/copy_language_pack.py b/scripts/copy_language_pack.py index eb471b0bf..857cc55d8 100644 --- a/scripts/copy_language_pack.py +++ b/scripts/copy_language_pack.py @@ -10,13 +10,32 @@ import sys BROWSER_LOCALES = "engine/browser/locales" +def get_language_code(lang_id: str) -> str: + """ + Retrieves the language code from the language-maps file. + + :param lang_id: Language identifier (e.g., 'nb', 'fr', etc.) + :return: Corresponding language code (e.g., 'nb-NO', 'fr-FR', etc.) + """ + language_maps_path = os.path.join("locales", "language-maps") + if not os.path.exists(language_maps_path): + return lang_id # Return the original if the file doesn't exist + + with open(language_maps_path, "r", encoding="utf-8") as f: + for line in f: + if line.startswith(f"{lang_id}:"): + return line.split(":", 1)[1].strip() + return lang_id # Return the original if no mapping is found + + def copy_browser_locales(lang_id: str): """ Copies language pack files to the specified browser locale directory. :param lang_id: Language identifier (e.g., 'en-US', 'fr', etc.) """ - lang_path = os.path.join(BROWSER_LOCALES, lang_id) + lang_code = get_language_code(lang_id) + lang_path = os.path.join(BROWSER_LOCALES, lang_code) # Create the directory for the language pack if it doesn't exist os.makedirs(lang_path, exist_ok=True) diff --git a/scripts/download-language-packs.sh b/scripts/download-language-packs.sh index d14b78164..aa4633ef7 100644 --- a/scripts/download-language-packs.sh +++ b/scripts/download-language-packs.sh @@ -39,10 +39,20 @@ fi set -e -update_language() { +get_code_for_language() { + # Get the language code from locales/language-maps langId=$1 + code=$(grep "^$langId:" ./locales/language-maps | cut -d':' -f2) + if [ -z "$code" ]; then + code=$langId + fi + echo $code +} + +update_language() { + langId=$(get_code_for_language $1) cd ./locales - cd $langId + cd $1 echo "Updating $langId" # move the contents from ../firefox-l10n/$langId to ./locales/$langId From ae2077ab7c070319a474740e9323016203587178 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Fri, 19 Dec 2025 23:27:07 +0100 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20Fixed=20locale=20for=20`Norwegian=20?= =?UTF-8?q?Bokm=C3=A5l`=20not=20being=20applied=20correctly,=20p=3D#11673,?= =?UTF-8?q?=20c=3Dno-component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index db79a9ecd..289e49bff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "MPL-2.0", "dependencies": { - "@zen-browser/surfer": "^1.12.0" + "@zen-browser/surfer": "^1.12.1" }, "devDependencies": { "@babel/preset-typescript": "^7.27.0", @@ -1115,9 +1115,9 @@ "license": "MIT" }, "node_modules/@zen-browser/surfer": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.12.0.tgz", - "integrity": "sha512-I5nxDgGpFGtdOAC9DZkoQp9GJ4cAqCW+0p0DoQRjW/jdnQJUH20ygvPyPr+sgjXISPFclYX+KrVoT2kJqTdlTw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.12.1.tgz", + "integrity": "sha512-0KoJtT9awH0ZxC1G5i3gppL8SEkgqeOqxAYY7B5WOgaPv4uUyHfj8btQnmLasA7051iVn9EaCpUDOHV1JDs9pg==", "license": "MPL-2.0", "dependencies": { "@resvg/resvg-js": "^1.4.0", diff --git a/package.json b/package.json index 43347ed83..07f9eda3a 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ }, "homepage": "https://github.com/zen-browser/desktop#readme", "dependencies": { - "@zen-browser/surfer": "^1.12.0" + "@zen-browser/surfer": "^1.12.1" }, "devDependencies": { "@babel/preset-typescript": "^7.27.0", From 59072ee9320747adfb341e832e5842cb477a6ff2 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Fri, 19 Dec 2025 23:46:40 +0100 Subject: [PATCH 3/6] fix: Fixed new split command not working correctly, b=closes #11637, c=split-view --- src/zen/split-view/ZenViewSplitter.mjs | 67 ++++++++++++++------------ 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs index 89488cd43..feac3928d 100644 --- a/src/zen/split-view/ZenViewSplitter.mjs +++ b/src/zen/split-view/ZenViewSplitter.mjs @@ -1955,40 +1955,43 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { this._data.push(data); this.activateSplitView(data); gBrowser.selectedTab = emptyTab; - window.addEventListener( - 'ZenURLBarClosed', - (event) => { - const { onElementPicked, onSwitch } = event.detail; - const groupIndex = this._data.findIndex((group) => group.tabs.includes(emptyTab)); - const newSelectedTab = gBrowser.selectedTab; - const cleanup = () => { - this.removeTabFromGroup(emptyTab, groupIndex, { changeTab: !onSwitch, forUnsplit: true }); - const command = document.getElementById('cmd_zenNewEmptySplit'); - command.removeAttribute('disabled'); - }; - if (onElementPicked) { - if ( - newSelectedTab === emptyTab || - newSelectedTab === selectedTab || - selectedTab.getAttribute('zen-workspace-id') !== - newSelectedTab.getAttribute('zen-workspace-id') - ) { - cleanup(); - return; - } - this.removeTabFromGroup(emptyTab, groupIndex, { forUnsplit: true }); - gBrowser.selectedTab = selectedTab; - this.resetTabState(emptyTab, false); - this.splitTabs([selectedTab, newSelectedTab], 'grid', 1); - } else { - cleanup(); - } - }, - { once: true } - ); setTimeout(() => { + window.addEventListener( + 'ZenURLBarClosed', + (event) => { + const { onElementPicked, onSwitch } = event.detail; + const groupIndex = this._data.findIndex((group) => group.tabs.includes(emptyTab)); + const newSelectedTab = gBrowser.selectedTab; + const cleanup = () => { + this.removeTabFromGroup(emptyTab, groupIndex, { + changeTab: !onSwitch, + forUnsplit: true, + }); + const command = document.getElementById('cmd_zenNewEmptySplit'); + command.removeAttribute('disabled'); + }; + if (onElementPicked) { + if ( + newSelectedTab === emptyTab || + newSelectedTab === selectedTab || + selectedTab.getAttribute('zen-workspace-id') !== + newSelectedTab.getAttribute('zen-workspace-id') + ) { + cleanup(); + return; + } + this.removeTabFromGroup(emptyTab, groupIndex, { forUnsplit: true }); + gBrowser.selectedTab = selectedTab; + this.resetTabState(emptyTab, false); + this.splitTabs([selectedTab, newSelectedTab], 'grid', 1); + } else { + cleanup(); + } + }, + { once: true } + ); gZenUIManager.handleNewTab(false, false, 'tab', true); - }, 0); + }); } get splitViewBrowsers() { From 3e5c35554392df9f42604f604f771f6c17c73ee0 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Sat, 20 Dec 2025 00:18:41 +0100 Subject: [PATCH 4/6] fix: Fixed hyperlinks being removed at startup, b=closes #11639, c=tabs, workspaces --- .../sessionstore/SessionStore-sys-mjs.patch | 18 +++++++++++++----- src/zen/tabs/zen-tabs/vertical-tabs.css | 5 ++++- src/zen/workspaces/ZenWorkspaces.mjs | 3 ++- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch index 7efaefb17..bab8fea24 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 2c2f43bf743ef458b378e85e9ed44a971711e1d9..61bfa1b530c407dd1236543f785eb22176c60c4e 100644 +index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..6894412f5dcf632c1d4c3dabeffabf9e5dd96222 100644 --- a/browser/components/sessionstore/SessionStore.sys.mjs +++ b/browser/components/sessionstore/SessionStore.sys.mjs @@ -127,6 +127,8 @@ const TAB_EVENTS = [ @@ -122,7 +122,15 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..61bfa1b530c407dd1236543f785eb221 selectTab = Math.min(selectTab, winData.tabs.length); } -@@ -5809,6 +5820,8 @@ var SessionStoreInternal = { +@@ -5788,6 +5799,7 @@ var SessionStoreInternal = { + if (overwriteTabs) { + for (let i = tabbrowser.browsers.length - 1; i >= 0; i--) { + if (!tabbrowser.tabs[i].selected) { ++ aWindow.gZenWorkspaces._shouldOverrideTabs = true; + tabbrowser.removeTab(tabbrowser.tabs[i]); + } + } +@@ -5809,6 +5821,8 @@ var SessionStoreInternal = { winData.tabs, winData.groups ?? [] ); @@ -131,7 +139,7 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..61bfa1b530c407dd1236543f785eb221 this._log.debug( `restoreWindow, createTabsForSessionRestore returned ${tabs.length} tabs` ); -@@ -6372,6 +6385,25 @@ var SessionStoreInternal = { +@@ -6372,6 +6386,25 @@ var SessionStoreInternal = { // Most of tabData has been restored, now continue with restoring // attributes that may trigger external events. @@ -157,7 +165,7 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..61bfa1b530c407dd1236543f785eb221 if (tabData.pinned) { tabbrowser.pinTab(tab); -@@ -7290,7 +7322,7 @@ var SessionStoreInternal = { +@@ -7290,7 +7323,7 @@ var SessionStoreInternal = { let groupsToSave = new Map(); for (let tIndex = 0; tIndex < window.tabs.length; ) { @@ -166,7 +174,7 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..61bfa1b530c407dd1236543f785eb221 // Adjust window.selected if (tIndex + 1 < window.selected) { window.selected -= 1; -@@ -7305,7 +7337,7 @@ var SessionStoreInternal = { +@@ -7305,7 +7338,7 @@ var SessionStoreInternal = { ); // We don't want to increment tIndex here. continue; diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css index 5414b54db..d28936b74 100644 --- a/src/zen/tabs/zen-tabs/vertical-tabs.css +++ b/src/zen/tabs/zen-tabs/vertical-tabs.css @@ -141,7 +141,10 @@ position: relative; opacity: 1; align-items: center; - padding: 0 5px; + + @media (-moz-platform: macos) { + padding: 0 5px; + } & toolbarseparator { height: 1px; diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index 5d87a17c4..5cdca400c 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -973,6 +973,7 @@ class nsZenWorkspaces extends nsZenMultiWindowFeature { const cleanup = () => { delete this._tabToSelect; delete this._tabToRemoveForEmpty; + delete this._shouldOverrideTabs; resolveSelectPromise(); }; @@ -988,7 +989,7 @@ class nsZenWorkspaces extends nsZenMultiWindowFeature { delete this._initialTab; } - if (this._tabToRemoveForEmpty && !removedEmptyTab) { + if (this._tabToRemoveForEmpty && !removedEmptyTab && !this._shouldOverrideTabs) { const tabs = gBrowser.tabs.filter((tab) => !tab.collapsed); if ( typeof this._tabToSelect === 'number' && From cf4c754e57eb72c5c24f90e079df1c7dd73e5592 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Sat, 20 Dec 2025 00:26:03 +0100 Subject: [PATCH 5/6] fix: Fixed split view splitters showing up when opening glance, b=closes #11641, c=split-view --- src/zen/split-view/ZenViewSplitter.mjs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs index feac3928d..5a11b4dd1 100644 --- a/src/zen/split-view/ZenViewSplitter.mjs +++ b/src/zen/split-view/ZenViewSplitter.mjs @@ -1021,14 +1021,20 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { let tab = window.gBrowser.getTabForBrowser(browser); const ignoreSplit = tab.hasAttribute('zen-dont-split-glance'); tab.removeAttribute('zen-dont-split-glance'); + let isGlanceTab = false; if (tab.hasAttribute('zen-glance-tab') && !ignoreSplit) { // Extract from parent node so we are not selecting the wrong (current) tab tab = tab.parentNode.closest('.tabbrowser-tab'); + isGlanceTab = true; console.assert(tab, 'Tab not found for zen-glance-tab'); } if (tab) { this.updateSplitView(tab); tab.linkedBrowser.docShellIsActive = true; + if (isGlanceTab) { + // See issues https://github.com/zen-browser/desktop/issues/11641 + this.removeSplitters(); + } } this._maybeRemoveFakeBrowser(); { @@ -1168,7 +1174,6 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { const oldView = this.currentView; const newView = this._data.findIndex((group) => group.tabs.includes(tab)); - if (oldView === newView) return; if (newView < 0 && oldView >= 0) { this.deactivateCurrentSplitView(); return; From 53d223b9c5e37e0a2639d3790b1cb50fa5a41491 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Sat, 20 Dec 2025 13:05:44 +0100 Subject: [PATCH 6/6] fix: Fixed always recalculating split view leafs on location changes, b=no-bug, c=split-view --- src/zen/split-view/ZenViewSplitter.mjs | 3 +++ src/zen/split-view/zen-decks.css | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs index 5a11b4dd1..d354fe474 100644 --- a/src/zen/split-view/ZenViewSplitter.mjs +++ b/src/zen/split-view/ZenViewSplitter.mjs @@ -1174,6 +1174,9 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { const oldView = this.currentView; const newView = this._data.findIndex((group) => group.tabs.includes(tab)); + if (newView === oldView && oldView < 0) { + return; + } if (newView < 0 && oldView >= 0) { this.deactivateCurrentSplitView(); return; diff --git a/src/zen/split-view/zen-decks.css b/src/zen/split-view/zen-decks.css index 9c4ff3f3a..6678a395f 100644 --- a/src/zen/split-view/zen-decks.css +++ b/src/zen/split-view/zen-decks.css @@ -67,7 +67,7 @@ #tabbrowser-tabpanels[zen-split-view='true'] .browserSidebarContainer.deck-selected { &:not(.zen-glance-overlay) { - outline: 2px solid var(--zen-primary-color) !important; + outline: 2px solid light-dark(var(--zen-primary-color), var(--button-background-color-primary)) !important; } &.zen-glance-overlay {