Compare commits

...

6 Commits

10 changed files with 103 additions and 50 deletions

1
locales/language-maps Normal file
View File

@@ -0,0 +1 @@
nb:nb-NO

8
package-lock.json generated
View File

@@ -9,7 +9,7 @@
"version": "1.0.0", "version": "1.0.0",
"license": "MPL-2.0", "license": "MPL-2.0",
"dependencies": { "dependencies": {
"@zen-browser/surfer": "^1.12.0" "@zen-browser/surfer": "^1.12.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/preset-typescript": "^7.27.0", "@babel/preset-typescript": "^7.27.0",
@@ -1115,9 +1115,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@zen-browser/surfer": { "node_modules/@zen-browser/surfer": {
"version": "1.12.0", "version": "1.12.1",
"resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.12.0.tgz", "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.12.1.tgz",
"integrity": "sha512-I5nxDgGpFGtdOAC9DZkoQp9GJ4cAqCW+0p0DoQRjW/jdnQJUH20ygvPyPr+sgjXISPFclYX+KrVoT2kJqTdlTw==", "integrity": "sha512-0KoJtT9awH0ZxC1G5i3gppL8SEkgqeOqxAYY7B5WOgaPv4uUyHfj8btQnmLasA7051iVn9EaCpUDOHV1JDs9pg==",
"license": "MPL-2.0", "license": "MPL-2.0",
"dependencies": { "dependencies": {
"@resvg/resvg-js": "^1.4.0", "@resvg/resvg-js": "^1.4.0",

View File

@@ -21,7 +21,7 @@
"sync:raw": "surfer update", "sync:raw": "surfer update",
"sync:rc": "python3 scripts/update_ff.py --rc", "sync:rc": "python3 scripts/update_ff.py --rc",
"sync:l10n": "python3 scripts/update_ff.py --just-l10n", "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": "npx eslint src/ && prettier . --check --cache",
"lint:fix": "npm run pretty && npx eslint src/ --fix", "lint:fix": "npm run pretty && npx eslint src/ --fix",
"prepare": "husky", "prepare": "husky",
@@ -50,7 +50,7 @@
}, },
"homepage": "https://github.com/zen-browser/desktop#readme", "homepage": "https://github.com/zen-browser/desktop#readme",
"dependencies": { "dependencies": {
"@zen-browser/surfer": "^1.12.0" "@zen-browser/surfer": "^1.12.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/preset-typescript": "^7.27.0", "@babel/preset-typescript": "^7.27.0",

View File

@@ -10,13 +10,32 @@ import sys
BROWSER_LOCALES = "engine/browser/locales" 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): def copy_browser_locales(lang_id: str):
""" """
Copies language pack files to the specified browser locale directory. Copies language pack files to the specified browser locale directory.
:param lang_id: Language identifier (e.g., 'en-US', 'fr', etc.) :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 # Create the directory for the language pack if it doesn't exist
os.makedirs(lang_path, exist_ok=True) os.makedirs(lang_path, exist_ok=True)

View File

@@ -39,10 +39,20 @@ fi
set -e set -e
update_language() { get_code_for_language() {
# Get the language code from locales/language-maps
langId=$1 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 ./locales
cd $langId cd $1
echo "Updating $langId" echo "Updating $langId"
# move the contents from ../firefox-l10n/$langId to ./locales/$langId # move the contents from ../firefox-l10n/$langId to ./locales/$langId

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs 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 --- a/browser/components/sessionstore/SessionStore.sys.mjs
+++ b/browser/components/sessionstore/SessionStore.sys.mjs +++ b/browser/components/sessionstore/SessionStore.sys.mjs
@@ -127,6 +127,8 @@ const TAB_EVENTS = [ @@ -127,6 +127,8 @@ const TAB_EVENTS = [
@@ -122,7 +122,15 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..61bfa1b530c407dd1236543f785eb221
selectTab = Math.min(selectTab, winData.tabs.length); 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.tabs,
winData.groups ?? [] winData.groups ?? []
); );
@@ -131,7 +139,7 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..61bfa1b530c407dd1236543f785eb221
this._log.debug( this._log.debug(
`restoreWindow, createTabsForSessionRestore returned ${tabs.length} tabs` `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 // Most of tabData has been restored, now continue with restoring
// attributes that may trigger external events. // attributes that may trigger external events.
@@ -157,7 +165,7 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..61bfa1b530c407dd1236543f785eb221
if (tabData.pinned) { if (tabData.pinned) {
tabbrowser.pinTab(tab); tabbrowser.pinTab(tab);
@@ -7290,7 +7322,7 @@ var SessionStoreInternal = { @@ -7290,7 +7323,7 @@ var SessionStoreInternal = {
let groupsToSave = new Map(); let groupsToSave = new Map();
for (let tIndex = 0; tIndex < window.tabs.length; ) { for (let tIndex = 0; tIndex < window.tabs.length; ) {
@@ -166,7 +174,7 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..61bfa1b530c407dd1236543f785eb221
// Adjust window.selected // Adjust window.selected
if (tIndex + 1 < window.selected) { if (tIndex + 1 < window.selected) {
window.selected -= 1; window.selected -= 1;
@@ -7305,7 +7337,7 @@ var SessionStoreInternal = { @@ -7305,7 +7338,7 @@ var SessionStoreInternal = {
); );
// We don't want to increment tIndex here. // We don't want to increment tIndex here.
continue; continue;

View File

@@ -1021,14 +1021,20 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
let tab = window.gBrowser.getTabForBrowser(browser); let tab = window.gBrowser.getTabForBrowser(browser);
const ignoreSplit = tab.hasAttribute('zen-dont-split-glance'); const ignoreSplit = tab.hasAttribute('zen-dont-split-glance');
tab.removeAttribute('zen-dont-split-glance'); tab.removeAttribute('zen-dont-split-glance');
let isGlanceTab = false;
if (tab.hasAttribute('zen-glance-tab') && !ignoreSplit) { if (tab.hasAttribute('zen-glance-tab') && !ignoreSplit) {
// Extract from parent node so we are not selecting the wrong (current) tab // Extract from parent node so we are not selecting the wrong (current) tab
tab = tab.parentNode.closest('.tabbrowser-tab'); tab = tab.parentNode.closest('.tabbrowser-tab');
isGlanceTab = true;
console.assert(tab, 'Tab not found for zen-glance-tab'); console.assert(tab, 'Tab not found for zen-glance-tab');
} }
if (tab) { if (tab) {
this.updateSplitView(tab); this.updateSplitView(tab);
tab.linkedBrowser.docShellIsActive = true; tab.linkedBrowser.docShellIsActive = true;
if (isGlanceTab) {
// See issues https://github.com/zen-browser/desktop/issues/11641
this.removeSplitters();
}
} }
this._maybeRemoveFakeBrowser(); this._maybeRemoveFakeBrowser();
{ {
@@ -1168,7 +1174,9 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
const oldView = this.currentView; const oldView = this.currentView;
const newView = this._data.findIndex((group) => group.tabs.includes(tab)); const newView = this._data.findIndex((group) => group.tabs.includes(tab));
if (oldView === newView) return; if (newView === oldView && oldView < 0) {
return;
}
if (newView < 0 && oldView >= 0) { if (newView < 0 && oldView >= 0) {
this.deactivateCurrentSplitView(); this.deactivateCurrentSplitView();
return; return;
@@ -1955,40 +1963,43 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
this._data.push(data); this._data.push(data);
this.activateSplitView(data); this.activateSplitView(data);
gBrowser.selectedTab = emptyTab; 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(() => { 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); gZenUIManager.handleNewTab(false, false, 'tab', true);
}, 0); });
} }
get splitViewBrowsers() { get splitViewBrowsers() {

View File

@@ -67,7 +67,7 @@
#tabbrowser-tabpanels[zen-split-view='true'] .browserSidebarContainer.deck-selected { #tabbrowser-tabpanels[zen-split-view='true'] .browserSidebarContainer.deck-selected {
&:not(.zen-glance-overlay) { &: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 { &.zen-glance-overlay {

View File

@@ -141,7 +141,10 @@
position: relative; position: relative;
opacity: 1; opacity: 1;
align-items: center; align-items: center;
padding: 0 5px;
@media (-moz-platform: macos) {
padding: 0 5px;
}
& toolbarseparator { & toolbarseparator {
height: 1px; height: 1px;

View File

@@ -973,6 +973,7 @@ class nsZenWorkspaces extends nsZenMultiWindowFeature {
const cleanup = () => { const cleanup = () => {
delete this._tabToSelect; delete this._tabToSelect;
delete this._tabToRemoveForEmpty; delete this._tabToRemoveForEmpty;
delete this._shouldOverrideTabs;
resolveSelectPromise(); resolveSelectPromise();
}; };
@@ -988,7 +989,7 @@ class nsZenWorkspaces extends nsZenMultiWindowFeature {
delete this._initialTab; delete this._initialTab;
} }
if (this._tabToRemoveForEmpty && !removedEmptyTab) { if (this._tabToRemoveForEmpty && !removedEmptyTab && !this._shouldOverrideTabs) {
const tabs = gBrowser.tabs.filter((tab) => !tab.collapsed); const tabs = gBrowser.tabs.filter((tab) => !tab.collapsed);
if ( if (
typeof this._tabToSelect === 'number' && typeof this._tabToSelect === 'number' &&