Compare commits

...

11 Commits

Author SHA1 Message Date
mr. m
6a218d109a feat: Use github runners instead of blacksmith for less intensive tasks, b=no-bug, c=workflows 2025-12-11 13:35:17 +01:00
mr. m
a6dd6ab984 fix: Move 'Any' import to the JSON with comments module, b=no-bug, c=scripts, tests 2025-12-11 13:31:44 +01:00
mr. m
0c0c982bc2 chore: Implement settings dump schema to update firefox remote servic…, p=#11579
* chore: Implement settings dump schema to update firefox remote services data, b=no-bug, c=configs, scripts

* feat: Also update with timestamps, b=no-bug, c=configs, scripts

* chore: Move JSON with comments to a new module, b=no-bug, c=scripts, tests

---------

Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
2025-12-11 13:26:28 +01:00
mr. m
bcf4c4d1a3 feat: Revert not modifying the opacity for windows and linux, b=no-bug, c=workspaces 2025-12-10 18:12:17 +01:00
mr. m
e4c36574b9 feat: Fixed coloring issue for urlbar and use lazy getters for gradient generator, b=no-bug, c=common, workspaces 2025-12-10 00:47:01 +01:00
mr. m
0be950c42a Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-12-09 20:23:03 +01:00
mr. m
ad7c9688b9 chore: Bump version, b=no-bug, c=no-component 2025-12-09 20:22:53 +01:00
mr. m
ef257649a8 chore: Sync upstream to Firefox 146.0, p=#11566 2025-12-09 16:49:43 +01:00
mr. m
cd4d2e4f53 fix: Fixed regression on tab label aligment, b=no-bug, c=tabs 2025-12-09 14:25:24 +01:00
mr. m
9caf32de38 feat: Lower the size for essential tabs, b=no-bug, c=tabs 2025-12-09 01:12:11 +01:00
mr. m
43de5c69e9 fix: Fixed minor aligment and coloring issues, b=no-bug, c=tabs, workspaces 2025-12-08 18:06:58 +01:00
14 changed files with 163 additions and 51 deletions

View File

@@ -190,7 +190,7 @@ jobs:
name: Lint
check-release:
runs-on: blacksmith-2vcpu-ubuntu-2404
runs-on: ubuntu-latest
needs: [build-data, lint]
steps:
- name: Checkout repository
@@ -231,7 +231,7 @@ jobs:
source:
permissions:
contents: write
runs-on: blacksmith-2vcpu-ubuntu-2404
runs-on: ubuntu-latest
needs: [build-data, check-release]
steps:

View File

@@ -34,7 +34,7 @@ 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 `145.0.2`! 🚀
- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `146.0`! 🚀
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 146.0`!
### Contributing

View File

@@ -1 +1 @@
acd4663cd1530303fcca85b420a78f4686c4628b
8908c8eb566c64521e2a777ad8a80b62bd6aa193

View File

@@ -0,0 +1,20 @@
// 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/.
{
"remove": {
"identifiers": [
// Firefox adds Perplexity by default, we don't want it as
// its not very privacy focused.
"perplexity",
// These are not search engines, Firefox adds them by default
// but we don't want them.
"wikipedia",
"wikipedia-*",
"ebay",
"ebay-*"
]
},
"timestamp": 1765455207275
}

View File

@@ -10,7 +10,8 @@
"build": "surfer build",
"build:ui": "surfer build --ui",
"start": "cd engine && python3 ./mach run --noprofile",
"import": "npm run ffprefs && surfer import",
"import": "npm run ffprefs && npm run import:dumps && surfer import",
"import:dumps": "python3 scripts/update_service_dumps.py",
"export": "surfer export",
"init": "npm run download && npm run import && npm run bootstrap",
"download": "surfer download",

View File

@@ -20,3 +20,6 @@
- name: browser.ml.chat.menu
value: false
- name: browser.ml.linkPreview.enabled
value: false

View File

@@ -0,0 +1,14 @@
# 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/.
import json
from typing import Any
class JSONWithCommentsDecoder(json.JSONDecoder):
def __init__(self, **kw):
super().__init__(**kw)
def decode(self, s: str) -> Any:
s = '\n'.join(l for l in s.split('\n') if not l.lstrip(' ').startswith('//'))
return super().decode(s)

View File

@@ -6,7 +6,7 @@ import os
import sys
import json
from pathlib import Path
from typing import Any
from json_with_comments import JSONWithCommentsDecoder
IGNORE_PREFS_FILE_IN = os.path.join(
'src', 'zen', 'tests', 'ignorePrefs.json'
@@ -16,15 +16,6 @@ IGNORE_PREFS_FILE_OUT = os.path.join(
)
class JSONWithCommentsDecoder(json.JSONDecoder):
def __init__(self, **kw):
super().__init__(**kw)
def decode(self, s: str) -> Any:
s = '\n'.join(l for l in s.split('\n') if not l.lstrip(' ').startswith('//'))
return super().decode(s)
def copy_ignore_prefs():
print("Copying ignorePrefs.json from src/zen/tests to engine/testing/mochitest...")
# if there are prefs that dont exist on output file, copy them from input file

View File

@@ -0,0 +1,63 @@
# 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/.
import os
import json
from json_with_comments import JSONWithCommentsDecoder
DUMPS_FOLDER = os.path.join(
'configs', 'dumps'
)
ENGINE_DUMPS_FOLDER = os.path.join(
'engine', 'services', 'settings', 'dumps', 'main'
)
def merge_dumps(original, updates):
"""Filters entries from the original dump, removing those whose identifiers are specified in the updates removal list."""
remove_ids = updates.get('remove', {"identifiers": []}).get('identifiers', [])
# Filter out entries in original that are in remove_ids.
#  We may find example-* patterns, so we need to handle that as well.
merged_data = [
entry for entry in original.get('data', [])
if not any(
entry.get('identifier', '') == rid or
(rid.endswith('*') and entry.get('identifier', '').startswith(rid[:-1]))
for rid in remove_ids
)
]
return {
'data': merged_data,
**{k: v for k, v in original.items() if k != 'data'},
'timestamp': updates.get('timestamp', original.get('timestamp'))
}
def main():
for filename in os.listdir(DUMPS_FOLDER):
if filename.endswith('.json'):
#  parse json with comments
with open(os.path.join(DUMPS_FOLDER, filename), 'r') as f:
data = json.load(f, cls=JSONWithCommentsDecoder)
original_path = os.path.join(ENGINE_DUMPS_FOLDER, filename)
if os.path.exists(original_path):
with open(original_path, 'r', encoding='utf-8') as f:
original_content = f.read()
original_content = '\n'.join(
line for line in original_content.split('\n') if not line.lstrip(' ').startswith('//')
)
original_data = json.loads(original_content)
merged_data = merge_dumps(original_data, data)
with open(original_path, 'w', encoding='utf-8') as f:
json.dump(merged_data, f, indent=2, ensure_ascii=False)
print(f"Updated dump: {filename}")
else:
print(f"Original dump file not found: {original_path}")
exit(1)
if __name__ == "__main__":
main()

View File

@@ -82,21 +82,23 @@
# They must all go from the middle to the right side. They must always stay verically centered.
# And reach to 180 on the right side, meaning we must divide the width in 16 segments.
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="180,180" style="background: rgb(0, 0, 0);"></box>
data-position="337.5,180" style="background: rgb(224, 224, 224);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="202.5,180" style="background: rgb(32, 32, 32);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="225,180" style="background: rgb(64, 64, 64);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="247.5,180" style="background: rgb(96, 96, 96);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="270,180" style="background: rgb(128, 128, 128);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="292.5,180" style="background: rgb(160, 160, 160);"></box>
data-position="337.5,180" style="background: rgb(224, 224, 224);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="315,180" style="background: rgb(192, 192, 192);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="337.5,180" style="background: rgb(224, 224, 224);"></box>
data-position="292.5,180" style="background: rgb(160, 160, 160);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="270,180" style="background: rgb(128, 128, 128);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="247.5,180" style="background: rgb(96, 96, 96);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="225,180" style="background: rgb(64, 64, 64);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="202.5,180" style="background: rgb(32, 32, 32);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="180,180" style="background: rgb(0, 0, 0);"></box>
</hbox>
</hbox>
<toolbarbutton id="PanelUI-zen-gradient-generator-color-page-right" class="toolbarbutton-1" />
@@ -120,10 +122,12 @@
</defs>
</svg>
</box>
<html:input type="range" max="0.9" value="0.4" step="0.001" id="PanelUI-zen-gradient-generator-opacity"
<html:input type="range" value="0.4" step="0.001" id="PanelUI-zen-gradient-generator-opacity"
#ifdef XP_MACOSX
min="0.25"
max="0.75"
min="0.35"
#else
max="0.9"
min="0.35"
#endif
/>

View File

@@ -263,7 +263,7 @@
& .urlbar-background {
--zen-urlbar-background-base: light-dark(
#fbfbfb,
color-mix(in srgb, hsl(0, 0%, 1%), var(--zen-colors-primary) 30%)
color-mix(in srgb, hsl(0, 0%, 6.7%), var(--zen-colors-primary) 30%)
);
@media -moz-pref('zen.theme.acrylic-elements') {
--zen-urlbar-background-transparent: color-mix(
@@ -505,8 +505,8 @@
--urlbar-container-height: 62px !important;
--urlbar-margin-inline: 10px !important;
min-width: min(90%, 50rem) !important;
width: var(--zen-urlbar-width, min(90%, 50rem)) !important;
min-width: min(90%, 62rem) !important;
width: var(--zen-urlbar-width, min(90%, 62rem)) !important;
font-size: 1.15em !important;
@media (-moz-platform: macos) {
font-size: 1.5em !important;

View File

@@ -131,7 +131,6 @@
========================================================================== */
.pinned-tabs-container-separator {
height: 22px;
padding-bottom: 2px;
border: none;
width: 100%;
transition:
@@ -142,6 +141,7 @@
position: relative;
opacity: 1;
align-items: center;
padding: 0 5px;
& toolbarseparator {
height: 1px;
@@ -488,7 +488,6 @@
#navigator-toolbox[zen-sidebar-expanded='true'] {
--zen-toolbox-min-width: fit-content;
--tab-icon-end-margin: 8.5px;
padding: var(--zen-toolbox-padding);
padding-left: 0;
padding-top: 0;
@@ -566,8 +565,8 @@
& #tabbrowser-arrowscrollbox-periphery > toolbarbutton {
width: 100% !important;
border-radius: var(--border-radius-medium) !important;
padding-left: var(--toolbarbutton-inner-padding) !important;
padding-right: var(--toolbarbutton-inner-padding) !important;
padding-left: var(--tab-inline-padding) !important;
padding-right: var(--tab-inline-padding) !important;
& label {
display: flex;
@@ -600,6 +599,7 @@
& #tabbrowser-tabs {
--tab-inline-padding: 8px;
--tab-icon-end-margin: 8.5px;
& .tabbrowser-tab {
& .tab-label-container {
@@ -1110,14 +1110,22 @@
max-height 0.3s ease-out,
grid-template-columns 0.3s ease-out;
opacity: 1;
grid-template-columns: repeat(auto-fit, minmax(max(23.7%, 48px), 1fr));
--min-essentials-width-wrap: calc(var(--tab-min-height) + 4px);
grid-template-columns: repeat(
auto-fit,
minmax(max(23.7%, var(--min-essentials-width-wrap)), 1fr)
);
&[data-hack-type='1'] {
grid-template-columns: repeat(auto-fit, minmax(max(30%, 48px), auto));
grid-template-columns: repeat(
auto-fit,
minmax(max(30%, var(--min-essentials-width-wrap)), auto)
);
}
&[data-hack-type='2'] {
grid-template-columns: repeat(
auto-fit,
minmax(max(23%, 48px), 1fr) minmax(max(23%, 48px), 1fr)
minmax(max(23%, var(--min-essentials-width-wrap)), 1fr)
minmax(max(23%, var(--min-essentials-width-wrap)), 1fr)
);
}
&[data-hack-type='3'] {
@@ -1160,7 +1168,6 @@
& .tab-background {
border-radius: var(--border-radius-medium) !important;
transition: background 0.1s ease-in-out;
}
--tab-selected-bgcolor: light-dark(rgba(255, 255, 255, 0.85), rgba(255, 255, 255, 0.2));

View File

@@ -41,8 +41,15 @@ function parseSinePath(pathStr) {
return points;
}
const MAX_OPACITY = 0.9;
const MIN_OPACITY = AppConstants.platform === 'macosx' ? 0.25 : 0.35;
const lazy = {};
ChromeUtils.defineLazyGetter(lazy, 'MAX_OPACITY', () => {
return parseFloat(document.getElementById('PanelUI-zen-gradient-generator-opacity').max);
});
ChromeUtils.defineLazyGetter(lazy, 'MIN_OPACITY', () => {
return parseFloat(document.getElementById('PanelUI-zen-gradient-generator-opacity').min);
});
const EXPLICIT_LIGHTNESS_TYPE = 'explicit-lightness';
const EXPLICIT_BLACKWHITE_TYPE = 'explicit-black-white';
@@ -440,7 +447,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
const gradient = this.panel.querySelector('.zen-theme-picker-gradient');
const rect = gradient.getBoundingClientRect();
const padding = 30; // each side
const dotHalfSize = 38 / 2; // half the size of the dot
const dotHalfSize = 29; // half the size of the dot. -11 for correct centering
x += dotHalfSize;
y += dotHalfSize;
rect.width += padding * 2; // Adjust width and height for padding
@@ -1095,15 +1102,17 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
colorToBlendOpacity = 0.35;
} else if (AppConstants.platform === 'macosx') {
colorToBlend = [255, 255, 255];
colorToBlendOpacity = 0.3;
colorToBlendOpacity = 0.35;
}
if (colorToBlend) {
const blendedAlpha = Math.min(
1,
opacity + MIN_OPACITY + colorToBlendOpacity * (1 - (opacity + MIN_OPACITY))
opacity + lazy.MIN_OPACITY + colorToBlendOpacity * (1 - (opacity + lazy.MIN_OPACITY))
);
baseColor = this.blendColors(baseColor, colorToBlend, blendedAlpha * 100);
opacity += colorToBlendOpacity * (1 - opacity);
if (AppConstants.platform !== 'macosx') {
opacity += colorToBlendOpacity * (1 - opacity);
}
}
return `rgba(${baseColor[0]}, ${baseColor[1]}, ${baseColor[2]}, ${opacity})`;
}
@@ -1386,13 +1395,13 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
const [_, secondStop, thirdStop] = document.querySelectorAll(
'#PanelUI-zen-gradient-generator-slider-wave-gradient stop'
);
// Opacity can only be between MIN_OPACITY to MAX_OPACITY. Make opacity relative to that range
if (opacity < MIN_OPACITY) {
// Opacity can only be between lazy.MIN_OPACITY to lazy.MAX_OPACITY. Make opacity relative to that range
if (opacity < lazy.MIN_OPACITY) {
opacity = 0;
} else if (opacity > MAX_OPACITY) {
} else if (opacity > lazy.MAX_OPACITY) {
opacity = 1;
} else {
opacity = (opacity - MIN_OPACITY) / (MAX_OPACITY - MIN_OPACITY);
opacity = (opacity - lazy.MIN_OPACITY) / (lazy.MAX_OPACITY - lazy.MIN_OPACITY);
}
if (isDefaultTheme) {
opacity = 1; // If it's the default theme, we want the wave to be

View File

@@ -5,7 +5,7 @@
"binaryName": "zen",
"version": {
"product": "firefox",
"version": "145.0.2",
"version": "146.0",
"candidate": "146.0"
},
"buildOptions": {
@@ -19,7 +19,7 @@
"brandShortName": "Zen",
"brandFullName": "Zen Browser",
"release": {
"displayVersion": "1.17.12b",
"displayVersion": "1.17.13b",
"github": {
"repo": "zen-browser/desktop"
},