Compare commits

..

42 Commits
1.9b ... 1.9.1b

Author SHA1 Message Date
mr. m
110d4e10bb Add option to hide tracking protection icon in URL bar 2025-03-11 23:29:21 +01:00
mr. m
6d458d3b16 Remove unnecessary console log for focused state in ZenGlanceManager 2025-03-11 21:43:06 +01:00
mr. m
40ce0b714e Refactor tab handling logic to improve neighbor tab selection in standalone mode 2025-03-11 21:41:27 +01:00
mr. m
8a5b0928c5 Update candidate version to 136.0.1 in surfer.json 2025-03-11 19:12:43 +01:00
mr. m
7e55497e20 Fixed tabs opening on the essentials container 2025-03-11 19:07:47 +01:00
mr. m
2d333a23a4 Fix hover attribute clearing logic in ZenCompactMode 2025-03-11 08:00:59 +01:00
mr. m
0a32810f36 Fix inconsistent quote style in sizemodechange event listener 2025-03-11 07:57:12 +01:00
mr. m
c6cbf7941c Merge pull request #6324 from dillontkh/fix-#6320
Fix toolbar not hiding after minimizing
2025-03-11 07:37:12 +01:00
dillontkh
33d8103335 Fix toolbar not hiding after minimizing 2025-03-11 14:32:32 +08:00
mr. M
3df1973ac9 Refactor tab drop handling and add workspace dropdown toggle functionality in bookmark editing 2025-03-10 21:31:13 +01:00
mr. M
d51391bb9b Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-10 21:15:25 +01:00
mr. M
94714e4f39 Add README generation for release builds and update session store attributes 2025-03-10 21:15:22 +01:00
mr. m
12266179d6 Changed apple team ID for entitlements 2025-03-10 20:34:01 +01:00
mr. M
a9f2bf2d54 Enable tab drop feature in split view and update event listener accordingly 2025-03-10 17:01:15 +01:00
mr. M
3972a181e6 Refactor CSS transitions and fix console log statements for clarity 2025-03-10 16:43:05 +01:00
mr. m
986661b6e8 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-10 16:34:53 +01:00
mr. m
99faa45d94 Fixed context menu allowing at split essential tabs 2025-03-10 16:34:49 +01:00
mr. M
daad62d939 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-10 16:30:30 +01:00
mr. M
f775a12de9 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-10 16:30:27 +01:00
mr. m
ebc33723b0 Fixed dragging undefined tabs 2025-03-10 13:28:01 +01:00
mr. m
2c8d2babdc Fixed removing workspaces deleting the empty tab as well 2025-03-10 01:12:10 +01:00
mr. m
7771b5af2d Fixed split view drop cursor and timing issues 2025-03-10 00:23:51 +01:00
mr. m
1729b553a4 Fixed changing icons on an extensial tab 2025-03-09 23:34:53 +01:00
mr. m
4f10a12869 Removed profiles enabled in config 2025-03-09 23:31:02 +01:00
mr. M
a0b372e7d9 Enhance Zen Glance functionality with confirmation on close and improved styling 2025-03-09 15:34:19 +01:00
mr. m
daded49ce8 Merge pull request #6256 from noaione/split-view-drag-fix
Fix wrong variable being used for splitting tab view
2025-03-09 14:16:17 +01:00
mr. M
d5d101d3f8 Update display version for Zen and Zen Twilight to 1.9.1 2025-03-09 12:15:48 +01:00
noaione
e83b698df4 Fix wrong variable being used for splitting tab view 2025-03-09 17:58:20 +07:00
mr. m
712cba1398 Merge pull request #6244 from noaione/ai-dont-want-this
Disable AI chat stuff by default
2025-03-09 09:05:37 +01:00
noaione
b954efe624 Disable AI chat stuff by default 2025-03-09 14:03:53 +07:00
mr. M
163d2c8d8f Add workspace selector to bookmark edit panel and ensure ZenWorkspaces is defined 2025-03-08 23:59:38 +01:00
mr. M
cf807ea93e Format export statement for consistency in AppRun script 2025-03-08 19:45:39 +01:00
mr. m
0a9942d01f Merge pull request #6156 from Samueru-sama/patch-3
remove unnecesary declation of several variables
2025-03-08 19:44:16 +01:00
mr. M
6d164511b4 Add error handling to tab animation and refine empty tab selection logic 2025-03-08 19:43:12 +01:00
mr. m
441ea2000b Merge pull request #6185 from noaione/privatebrowsing-newtab-fix
Pass new tab URL to Zen `selectEmptyTab`
2025-03-08 19:01:10 +01:00
mr. m
64281776f4 Merge pull request #6204 from zen-browser/right-split-drop
Enhance ZenViewSplitter to support dynamic side detection for split v…
2025-03-08 18:58:09 +01:00
mr. M
a93fdf5a17 Refactor URL bar height handling and improve drag-and-drop tab functionality in ZenViewSplitter 2025-03-08 18:51:46 +01:00
mr. m
050ed71c00 Merge branch 'dev' into right-split-drop 2025-03-08 18:20:43 +01:00
noaione
7b029cc7bc Pass new tab URL to Zen selectEmptyTab
This will ensure private browsing mode to not open the standard new tab.
2025-03-08 19:59:58 +07:00
mr. M
07afc4810a Adjust URL bar height and update layout handling for compact mode 2025-03-08 11:51:50 +01:00
Samuel
9a27b66661 remove unnecesary declation of several variables
Signed-off-by: Samuel <36420837+Samueru-sama@users.noreply.github.com>
2025-03-07 14:03:52 -04:00
mr. M
ee91ea86ff Enhance ZenViewSplitter to support dynamic side detection for split view animations 2025-03-07 18:53:45 +01:00
30 changed files with 359 additions and 192 deletions

View File

@@ -516,11 +516,31 @@ jobs:
commit_user_email: zen-browser-auto@users.noreply.github.com
repository: ./updates-server
- name: Build release README
run: |
echo "# Zen Stable Release" > README.md
echo "This is the stable release of Zen Browser." >> README.md
echo "## Sha256 checksums" >> README.md
echo "```" >> README.md
sha256sum ./zen.source.tar.zst/* >> README.md
sha256sum ./zen.linux-x86_64.tar.xz/* >> README.md
sha256sum ./zen.linux-aarch64.tar.xz/* >> README.md
sha256sum ./zen-x86_64.AppImage/* >> README.md
sha256sum ./zen-x86_64.AppImage.zsync/* >> README.md
sha256sum ./zen-aarch64.AppImage/* >> README.md
sha256sum ./zen-aarch64.AppImage.zsync/* >> README.md
sha256sum ./linux-aarch64.mar/* >> README.md
sha256sum ./.github/workflows/object/windows-x64-signed-x86_64/zen.installer.exe >> README.md
sha256sum ./.github/workflows/object/windows-x64-signed-arm64/zen.installer-arm64.exe >> README.md
sha256sum ./zen.macos-universal.dmg/* >> README.md
echo "```" >> README.md
# If we are on Twilight, we want to just update the Twilight tag's release
- name: Update Twilight tag
if: ${{ inputs.update_branch == 'twilight' }}
uses: softprops/action-gh-release@v2
with:
body_path: README.md
files: |
./zen.source.tar.zst/*
./zen.linux-x86_64.tar.xz/*
@@ -559,6 +579,7 @@ jobs:
fail_on_unmatched_files: false
generate_release_notes: false
name: 'Release build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }})'
body_path: README.md
files: |
./zen.source.tar.zst/*
./zen.linux-x86_64.tar.xz/*

View File

@@ -1,15 +1,6 @@
#!/bin/sh
SELF=$(readlink -f "$0")
HERE=${SELF%/*}
export PATH="${HERE}:${HERE}/usr/bin/:${HERE}/usr/sbin/:${HERE}/usr/games/:${HERE}/bin/:${HERE}/sbin/${PATH:+:$PATH}"
export LD_LIBRARY_PATH="${HERE}/usr/lib/:${HERE}/usr/lib/i386-linux-gnu/:${HERE}/usr/lib/x86_64-linux-gnu/:${HERE}/usr/lib32/:${HERE}/usr/lib64/:${HERE}/lib/:${HERE}/lib/i386-linux-gnu/:${HERE}/lib/x86_64-linux-gnu/:${HERE}/lib32/:${HERE}/lib64/${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export PYTHONPATH="${HERE}/usr/share/pyshared/${PYTHONPATH:+:$PYTHONPATH}"
export MOZ_LEGACY_PROFILES=1 # Prevent per installation profiles
DEFAULT_XDG_DATA_DIRS='./share/:/usr/share/gnome:/usr/local/share/:/usr/share/'
export XDG_DATA_DIRS="${HERE}/usr/share/:${XDG_DATA_DIRS:-$DEFAULT_XDG_DATA_DIRS}"
export PERLLIB="${HERE}/usr/share/perl5/:${HERE}/usr/lib/perl5/${PERLLIB:+:$PERLLIB}"
export GSETTINGS_SCHEMA_DIR="${HERE}/usr/share/glib-2.0/schemas/${GSETTINGS_SCHEMA_DIR:+:$GSETTINGS_SCHEMA_DIR}"
export MOZ_APP_LAUNCHER="${APPIMAGE}"
export QT_PLUGIN_PATH="${HERE}/usr/lib/qt4/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt4/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt4/plugins/:${HERE}/usr/lib32/qt4/plugins/:${HERE}/usr/lib64/qt4/plugins/:${HERE}/usr/lib/qt5/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt5/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt5/plugins/:${HERE}/usr/lib32/qt5/plugins/:${HERE}/usr/lib64/qt5/plugins/${QT_PLUGIN_PATH:+:$QT_PLUGIN_PATH}"
EXEC=$(grep -e '^Exec=.*' "${HERE}"/*.desktop | head -n 1 | cut -d "=" -f 2 | cut -d " " -f 1)
exec "${EXEC}" "$@"
CURRENTDIR="$(dirname "$(readlink -f "$0")")"
export PATH="${CURRENTDIR}:${PATH}"
export MOZ_LEGACY_PROFILES=1 # Prevent per installation profiles
export MOZ_APP_LAUNCHER="${APPIMAGE}" # Allows setting as default browser
exec "${CURRENTDIR}/zen" "$@"

View File

@@ -28,7 +28,7 @@
## 🖥️ Compatibility
Zen is currently built using Firefox version `136.0`! 🚀
Zen is currently built using Firefox version `136.0.1`! 🚀
- [`Zen Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 136.0`!
- Check out the latest [release notes](https://zen-browser.app/release-notes)!

View File

@@ -0,0 +1 @@
6ad0ab3c43a6208d8bcd997b40e802fccd48ba0a

2
l10n

Submodule l10n updated: 1a15769b8d...1db9cb464e

View File

@@ -118,6 +118,7 @@ pref('zen.view.compact.animate-sidebar', true);
pref('zen.view.compact.show-sidebar-and-toolbar-on-hover', true);
pref('zen.urlbar.replace-newtab', true);
pref('zen.urlbar.show-protections-icon', false);
pref('zen.urlbar.behavior', 'floating-on-type'); // default, floating-on-type, float
pref('zen.urlbar.wait-to-clear', 45000); // in ms (default 45s)
pref('zen.urlbar.show-domain-only-in-sidebar', true);
@@ -178,7 +179,7 @@ pref('zen.pinned-tab-manager.restore-pinned-tabs-to-pinned-url', false);
pref('zen.pinned-tab-manager.close-shortcut-behavior', 'reset-unload-switch');
// TODO: Check this out!
pref("browser.profiles.enabled", true);
pref("browser.profiles.enabled", false);
// Zen webpanels (calling it sidebar due to legacy reasons)
pref('zen.sidebar.data', "{\"data\":\n {\"p1\":{\n \"url\":\"https://www.wikipedia.org/\"\n },\n\"p2\":{\n \"url\":\"https://m.twitter.com/\",\n\"ua\": true\n },\n\"p3\": {\n \"url\": \"https://www.youtube.com/\",\n\"ua\": true\n},\n\"p4\": {\n \"url\": \"https://translate.google.com/\",\n\"ua\": true\n},\n\"p5\": {\n \"url\": \"https://todoist.com/\",\n\"ua\": true\n}},\n\"index\":[\"p1\",\"p2\",\"p3\",\"p4\",\"p5\"]}");
@@ -187,6 +188,7 @@ pref('zen.sidebar.close-on-blur', true);
pref('zen.sidebar.max-webpanels', 8);
// Zen Split View
pref('zen.splitView.enable-tab-drop', true);
pref('zen.splitView.min-resize-width', 7);
pref('zen.splitView.change-on-hover', false);
pref('zen.splitView.rearrange-hover-size', 24);
@@ -437,6 +439,13 @@ pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features", false
pref("browser.preferences.moreFromMozilla", false, locked);
pref("browser.aboutwelcome.enabled", false);
// AI/ML stuff
pref("browser.ml.chat.enabled", false);
pref("browser.ml.chat.shortcuts", false);
pref("browser.ml.chat.shortcuts.custom", false);
pref("browser.ml.chat.sidebar", false);
pref("browser.ml.enable", false);
// ---- Experimental settings to try make zen faster
pref("gfx.canvas.accelerated.cache-items", 32768);
pref("gfx.canvas.accelerated.cache-size", 256);

View File

@@ -347,33 +347,37 @@ var gZenVerticalTabsManager = {
return visibleTabs[visibleTabs.length - 1] === aTab;
};
const tabSize = aTab.getBoundingClientRect().height;
const transform = `-${tabSize}px`;
gZenUIManager.motion
.animate(
aTab,
{
opacity: [0, 1],
transform: ['scale(0.95)', 'scale(1)'],
marginBottom: isLastTab() ? [] : [transform, '0px'],
},
{
duration: 0.2,
easing: 'ease-out',
}
)
.then(() => {
aTab.style.removeProperty('margin-bottom');
aTab.style.removeProperty('transform');
aTab.style.removeProperty('opacity');
});
gZenUIManager.motion
.animate(aTab.querySelector('.tab-content'), {
filter: ['blur(1px)', 'blur(0px)'],
})
.then(() => {
aTab.querySelector('.tab-stack').style.removeProperty('filter');
});
try {
const tabSize = aTab.getBoundingClientRect().height;
const transform = `-${tabSize}px`;
gZenUIManager.motion
.animate(
aTab,
{
opacity: [0, 1],
transform: ['scale(0.95)', 'scale(1)'],
marginBottom: isLastTab() ? [] : [transform, '0px'],
},
{
duration: 0.2,
easing: 'ease-out',
}
)
.then(() => {
aTab.style.removeProperty('margin-bottom');
aTab.style.removeProperty('transform');
aTab.style.removeProperty('opacity');
});
gZenUIManager.motion
.animate(aTab.querySelector('.tab-content'), {
filter: ['blur(1px)', 'blur(0px)'],
})
.then(() => {
aTab.querySelector('.tab-stack').style.removeProperty('filter');
});
} catch (e) {
console.error(e);
}
},
get actualWindowButtons() {
@@ -620,6 +624,12 @@ var gZenVerticalTabsManager = {
}
gZenCompactModeManager.updateCompactModeContext(isSingleToolbar);
document.getElementById('urlbar').removeAttribute('--urlbar-height');
if (!isSingleToolbar) {
document.getElementById('urlbar').style.setProperty('--urlbar-height', '32px');
} else {
gURLBar.updateLayoutBreakout();
}
// Always move the splitter next to the sidebar
this.navigatorToolbox.after(document.getElementById('zen-sidebar-splitter'));

View File

@@ -1,4 +1,4 @@
<vbox id="zen-glance-sidebar-container" hidden="true">
<toolbarbutton id="zen-glance-sidebar-close" class="toolbarbutton-1" oncommand="gZenGlanceManager.closeGlance({ onTabClose: true })"/>
<toolbarbutton id="zen-glance-sidebar-close" data-l10n-id="zen-general-confrim" class="toolbarbutton-1" oncommand="gZenGlanceManager.closeGlance({ onTabClose: true })"/>
<toolbarbutton id="zen-glance-sidebar-open" class="toolbarbutton-1" oncommand="gZenGlanceManager.fullyOpenGlance()"/>
</vbox>

View File

@@ -276,6 +276,10 @@
box-shadow: var(--zen-big-shadow);
overflow: hidden;
&[side='right'] {
right: 0;
}
&::after {
content: '';
position: absolute;

View File

@@ -36,6 +36,7 @@
appearance: none;
box-shadow: 0 0 12px 1px rgba(0, 0, 0, 0.07);
opacity: 0;
padding: 8px;
&:hover {
background: light-dark(rgb(41, 41, 41), rgb(204, 204, 204));
@@ -54,6 +55,33 @@
filter: invert(1);
}
}
& #zen-glance-sidebar-close {
width: fit-content;
& label {
display: block;
max-width: 0px;
margin: 0;
overflow: hidden;
transition:
max-width 0.2s ease,
margin-left 0.2s ease;
}
&[waitconfirmation] {
background: rgb(220, 53, 69);
color: white;
fill: white;
& label {
max-width: 100px;
margin-left: 8px;
}
& image {
filter: none;
}
}
}
}
.browserSidebarContainer.zen-glance-overlay {

View File

@@ -870,6 +870,7 @@
pointer-events: none;
width: 16px;
height: 16px;
border-radius: 4px;
}
&::after {

View File

@@ -16,6 +16,10 @@
--urlbarView-highlight-background: var(--toolbarbutton-hover-background);
border-radius: var(--toolbarbutton-border-radius);
padding: 1px;
:root:not([zen-single-toolbar='true']) &[zen-floating-urlbar='true'] {
--urlbar-container-padding: 2px !important;
}
}
.urlbar-input::placeholder {
@@ -90,6 +94,12 @@
justify-content: center !important;
align-items: center !important;
margin: 0;
:root[zen-single-toolbar='true'] & {
padding: 6px !important;
width: unset !important;
height: unset !important;
}
}
#tracking-protection-icon-container {
@@ -326,7 +336,7 @@ button.popup-notification-dropmarker {
background: transparent;
&[notificationside='top'] {
position: absolute;
position: fixed;
bottom: calc(var(--zen-element-separation) * 1.5);
right: calc(var(--zen-element-separation) * 1.5);
width: fit-content;
@@ -454,6 +464,12 @@ button.popup-notification-dropmarker {
}
}
@media not (-moz-bool-pref: 'zen.urlbar.show-protections-icon') {
#tracking-protection-icon-container {
display: none !important;
}
}
/* Code ~~stolen~~ taken inspiration from https://github.com/greeeen-dev/zen-arc-cmd-bar
*
* MIT License

View File

@@ -37,6 +37,9 @@ var gZenCompactModeManager = {
this.addMouseActions();
this.addContextMenu();
// Clear hover states when window state changes (minimize, maximize, etc.)
window.addEventListener('sizemodechange', () => this._clearAllHoverStates());
},
get preference() {
@@ -450,4 +453,15 @@ var gZenCompactModeManager = {
let toolbar = document.getElementById('zen-appcontent-navbar-container');
toolbar.toggleAttribute('zen-user-show');
},
_clearAllHoverStates() {
// Clear hover attributes from all hoverable elements
for (let entry of this.hoverableElements) {
const target = entry.element;
if (target && !target.matches(':hover') && target.hasAttribute('zen-has-hover')) {
target.removeAttribute('zen-has-hover');
this.clearFlashTimeout('has-hover' + target.id);
}
}
},
};

View File

@@ -6,8 +6,9 @@
#glances = new Map();
#currentGlanceID = null;
#confirmationTimeout = null;
init() {
window.addEventListener('keydown', this.onKeyDown.bind(this));
window.addEventListener('TabClose', this.onTabClose.bind(this));
window.addEventListener('TabSelect', this.onLocationChange.bind(this));
@@ -37,17 +38,6 @@
return this.#glances.get(this.#currentGlanceID)?.parentTab;
}
onKeyDown(event) {
if (event.defaultPrevented) {
return;
}
if (event.key === 'Escape' && this.#currentGlanceID) {
event.preventDefault();
event.stopPropagation();
this.closeGlance({ onTabClose: true });
}
}
onOverlayClick(event) {
if (event.target === this.overlay && event.originalTarget !== this.contentWrapper) {
this.closeGlance({ onTabClose: true });
@@ -216,11 +206,21 @@
});
}
closeGlance({ noAnimation = false, onTabClose = false, setNewID = null, isDifferent = false } = {}) {
closeGlance({ noAnimation = false, onTabClose = false, setNewID = null, isDifferent = false, hasFocused = false } = {}) {
if (this._animating || !this.#currentBrowser || this.animatingOpen || this._duringOpening) {
return;
}
if (onTabClose && hasFocused && !this.#confirmationTimeout) {
const cancelButton = document.getElementById('zen-glance-sidebar-close');
cancelButton.setAttribute('waitconfirmation', true);
this.#confirmationTimeout = setTimeout(() => {
cancelButton.removeAttribute('waitconfirmation');
this.#confirmationTimeout = null;
}, 3000);
return;
}
this.browserWrapper.removeAttribute('has-finished-animation');
if (noAnimation) {
this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').removeAttribute('style');
@@ -275,7 +275,7 @@
...originalPosition,
opacity: 0,
},
{ type: 'spring', bounce: 0, duration: 0.6, easing: 'ease-in' }
{ type: 'spring', bounce: 0, duration: 0.5, easing: 'ease-in' }
)
.then(() => {
this.browserWrapper.removeAttribute('animate');
@@ -398,9 +398,18 @@
}
}
// note: must be async to avoid timing issues
clearConfirmationTimeout() {
if (this.#confirmationTimeout) {
clearTimeout(this.#confirmationTimeout);
this.#confirmationTimeout = null;
}
document.getElementById('zen-glance-sidebar-close')?.removeAttribute('waitconfirmation');
}
// note: must be sync to avoid timing issues
onLocationChange(event) {
const tab = event.target;
this.clearConfirmationTimeout();
if (this.animatingFullOpen || this.closingGlance) {
return;
}
@@ -586,8 +595,12 @@
esModuleURI: 'chrome://browser/content/zen-components/actors/ZenGlanceChild.sys.mjs',
events: {
DOMContentLoaded: {},
keydown: {
capture: true,
},
},
},
allFrames: true,
matches: ['https://*/*'],
});
}

View File

@@ -82,11 +82,9 @@
}
onTabIconChanged(tab, url = null) {
if (tab.hasAttribute('zen-essential') && this._pinsCache) {
const pin = this._pinsCache.find((pin) => pin.uuid === tab.getAttribute('zen-pin-id'));
if (pin) {
tab.querySelector('.tab-background').style.setProperty('--zen-tab-icon', `url(${pin.iconUrl})`);
}
const iconUrl = url ?? tab.iconImage.src;
if (tab.hasAttribute('zen-essential')) {
tab.querySelector('.tab-background').style.setProperty('--zen-tab-icon', `url(${iconUrl})`);
}
// TODO: work on this
//if (tab.hasAttribute('zen-pinned-changed') || !this._pinsCache) {
@@ -468,6 +466,7 @@
if (!isClosing) {
tab.removeAttribute('zen-pin-id');
tab.removeAttribute('zen-essential'); // Just in case
if (!tab.hasAttribute('zen-workspace-id') && ZenWorkspaces.workspaceEnabled) {
const workspace = await ZenWorkspaces.getActiveWorkspace();

View File

@@ -176,7 +176,7 @@
<checkbox data-l10n-id="zen-rice-share-include-workspace-themes" id="zen-rice-share-include-workspace-themes" />
</vbox>
<html:moz-button-group class="panel-footer">
<button onclick="gZenThemePicker.riceManager.cancel()" class="footer-button" data-l10n-id="zen-rice-share-cancel" />
<button onclick="gZenThemePicker.riceManager.cancel()" class="footer-button" data-l10n-id="zen-general-cancel" />
<button onclick="gZenThemePicker.riceManager.submit()" class="footer-button" data-l10n-id="zen-rice-share-save" default="true" slot="primary" id="zen-rice-share-save" disabled="true" />
</html:moz-button-group>
</vbox>

View File

@@ -89,9 +89,11 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
this.insertIntoContextMenu();
// Add drag over listener to the browser view
const tabBox = document.getElementById('tabbrowser-tabbox');
tabBox.addEventListener('dragover', this.onBrowserDragOverToSplit.bind(this));
this.onBrowserDragEndToSplit = this.onBrowserDragEndToSplit.bind(this);
if (Services.prefs.getBoolPref('zen.splitView.enable-tab-drop')) {
const tabBox = document.getElementById('tabbrowser-tabbox');
tabBox.addEventListener('dragover', this.onBrowserDragOverToSplit.bind(this));
this.onBrowserDragEndToSplit = this.onBrowserDragEndToSplit.bind(this);
}
}
insertIntoContextMenu() {
@@ -196,21 +198,24 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
if (currentView?.tabs.length >= this.MAX_TABS) {
return;
}
// only show if we are 1/4 of the way to the edge
const panelsRect = gBrowser.tabbox.getBoundingClientRect();
const panelsWidth = panelsRect.width;
if (
event.clientX > panelsWidth / 2 ||
event.clientX > panelsRect.left + panelsWidth - 10 ||
event.clientX < panelsRect.left + 10 ||
event.clientY < panelsRect.top + 10 ||
event.clientY > panelsRect.bottom - 10
) {
return;
}
// first quarter or last quarter of the screen, but not the middle
if (!(event.clientX < panelsRect.left + panelsWidth / 4 || event.clientX > panelsRect.left + (panelsWidth / 4) * 3)) {
return;
}
dt.mozCursor = 'default';
const oldTab = this._lastOpenedTab;
this._canDrop = true;
// wait some time before showing the split view
this._showSplitViewTimeout = setTimeout(() => {
{
this._draggingTab = draggedTab;
gBrowser.selectedTab = oldTab;
this._hasAnimated = true;
@@ -219,22 +224,31 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
}
const panelsWidth = gBrowser.tabbox.getBoundingClientRect().width;
const halfWidth = panelsWidth / 2;
const side = event.clientX > halfWidth ? 'right' : 'left';
this.fakeBrowser = document.createXULElement('vbox');
this.fakeBrowser.addEventListener('dragleave', this.onBrowserDragEndToSplit);
window.addEventListener('dragend', this.onBrowserDragEndToSplit, { once: true });
const padding = Services.prefs.getIntPref('zen.theme.content-element-separation', 0);
this.fakeBrowser.setAttribute('flex', '1');
this.fakeBrowser.id = 'zen-split-view-fake-browser';
gBrowser.tabbox.appendChild(this.fakeBrowser);
this.fakeBrowser.style.setProperty('--zen-split-view-fake-icon', `url(${draggedTab.getAttribute('image')})`);
draggedTab._visuallySelected = true;
this.fakeBrowser.setAttribute('side', side);
this._finishAllAnimatingPromise = Promise.all([
gZenUIManager.motion.animate(
gBrowser.tabbox,
side === 'left'
? {
paddingLeft: [0, `${halfWidth}px`],
paddingRight: 0,
}
: {
paddingRight: [0, `${halfWidth}px`],
paddingLeft: 0,
},
{
paddingLeft: [0, `${halfWidth}px`],
},
{
duration: 0.15,
duration: 0.08,
easing: 'ease-out',
}
),
@@ -242,10 +256,14 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
this.fakeBrowser,
{
width: [0, `${halfWidth - padding}px`],
marginLeft: [0, `${-halfWidth}px`],
...(side === 'left'
? {
marginLeft: [0, `${-halfWidth}px`],
}
: {}),
},
{
duration: 0.15,
duration: 0.08,
easing: 'ease-out',
}
),
@@ -256,7 +274,7 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
draggedTab._visuallySelected = true;
});
}
}, 100);
}
}
onBrowserDragEndToSplit(event) {
@@ -276,9 +294,6 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
) {
return;
}
if (this._showSplitViewTimeout) {
clearTimeout(this._showSplitViewTimeout);
}
if (!this._hasAnimated || !this.fakeBrowser) {
return;
}
@@ -289,17 +304,23 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
return;
}
this.fakeBrowser.classList.add('fade-out');
gBrowser.selectedTab = this._draggingTab;
const side = this.fakeBrowser.getAttribute('side');
if (this._draggingTab) this._draggingTab.setAttribute('zen-has-splitted', 'true');
this._lastOpenedTab = gBrowser.selectedTab;
this._draggingTab = null;
try {
Promise.all([
gZenUIManager.motion.animate(
gBrowser.tabbox,
side === 'left'
? {
paddingLeft: [`${halfWidth}px`, 0],
}
: {
paddingRight: [`${halfWidth}px`, 0],
},
{
paddingLeft: [`${halfWidth}px`, 0],
},
{
duration: 0.15,
duration: 0.1,
easing: 'ease-out',
}
),
@@ -307,10 +328,14 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
this.fakeBrowser,
{
width: [`${halfWidth - padding * 2}px`, 0],
marginLeft: [`${-(halfWidth - padding)}px`, 0],
...(side === 'left'
? {
marginLeft: [`${-halfWidth}px`, 0],
}
: {}),
},
{
duration: 0.15,
duration: 0.1,
easing: 'ease-out',
}
),
@@ -861,7 +886,7 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
return false;
}
for (const tab of window.gBrowser.selectedTabs) {
if (tab.splitView) {
if (tab.splitView || tab.hasAttribute('zen-empty-tab') || tab.hasAttribute('zen-essential')) {
return false;
}
}
@@ -1498,7 +1523,7 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
delete this._hasAnimated;
this.fakeBrowser.remove();
this.fakeBrowser = null;
this._draggingTab._visuallySelected = false;
if (this._draggingTab) this._draggingTab._visuallySelected = false;
if (select) {
gBrowser.selectedTab = this._draggingTab;
this._draggingTab = null;
@@ -1521,9 +1546,13 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
return false;
}
const dropSide = this.fakeBrowser?.getAttribute('side');
const containerRect = this.fakeBrowser.getBoundingClientRect();
const padding = Services.prefs.getIntPref('zen.theme.content-element-separation', 0);
const dropTarget = document.elementFromPoint(containerRect.left + containerRect.width + padding + 5, event.clientY);
const dropTarget = document.elementFromPoint(
dropSide === 'left' ? containerRect.left + containerRect.width + padding + 5 : containerRect.left - padding - 5,
event.clientY
);
const browser = dropTarget?.closest('browser');
if (!browser) {
@@ -1543,7 +1572,7 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
// Calculate which side of the target browser the drop occurred
// const browserRect = browser.getBoundingClientRect();
// const hoverSide = this.calculateHoverSide(event.clientX, event.clientY, browserRect);
const hoverSide = 'left';
const hoverSide = dropSide;
if (droppedOnTab.splitView) {
// Add to existing split view
@@ -1595,7 +1624,7 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
//}
// Put tabs always as if it was dropped from the left
this.splitTabs([draggedTab, droppedOnTab], gridType, 1);
this.splitTabs(dropSide == 'left' ? [draggedTab, droppedOnTab] : [droppedOnTab, draggedTab], gridType, 1);
}
}
if (this._finishAllAnimatingPromise) {
@@ -1628,7 +1657,7 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
}
handleTabDrop(event, urls, replace, inBackground) {
if (!inBackground || replace || urls.length !== 1) {
if (replace || urls.length !== 1) {
return false;
}
const url = urls[0];

View File

@@ -111,12 +111,13 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
);
}
selectEmptyTab() {
selectEmptyTab(newTabTarget = null) {
if (this._emptyTab && gZenVerticalTabsManager._canReplaceNewTab) {
gBrowser.selectedTab = this._emptyTab;
return this._emptyTab;
}
let tab = gZenUIManager.openAndChangeToTab(Services.prefs.getStringPref('browser.startup.homepage'));
const newTabUrl = newTabTarget || Services.prefs.getStringPref('browser.startup.homepage');
let tab = gZenUIManager.openAndChangeToTab(newTabUrl);
if (window.uuid) {
tab.setAttribute('zen-workspace-id', this.activeWorkspace);
}
@@ -627,7 +628,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
(currentTab.isEmpty &&
(currentTab.getAttribute('image') === gPageIcons[currentTabURL] || !currentTab.hasAttribute('image'))) ||
currentTab.hasAttribute('zen-empty-tab') ||
currentTab._possibleEmptyTab
(currentTab._possibleEmptyTab && currentTab.isEmpty)
) {
this.selectEmptyTab();
this._removedByStartupPage = true;
@@ -1404,15 +1405,16 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
}
_deleteAllTabsInWorkspace(workspaceID) {
for (let tab of this.allStoredTabs) {
if (tab.getAttribute('zen-workspace-id') === workspaceID) {
gBrowser.removeTab(tab, {
animate: false,
skipSessionStore: true,
closeWindowWithLastTab: false,
});
gBrowser.removeTabs(
Array.from(gBrowser.tabs).filter(
(tab) => tab.getAttribute('zen-workspace-id') === workspaceID && !tab.hasAttribute('zen-empty-tab')
),
{
animate: false,
skipSessionStore: true,
closeWindowWithLastTab: false,
}
}
);
}
moveTabToWorkspace(tab, workspaceID) {

View File

@@ -7,6 +7,7 @@ var ZenWorkspacesStorage = {
Weave: 'resource://services-sync/main.sys.mjs',
});
if (!window.ZenWorkspaces) return;
await this._ensureTable();
await ZenWorkspaceBookmarksStorage.init();
},

View File

@@ -12,6 +12,9 @@ export class ZenGlanceChild extends JSWindowActorChild {
case 'DOMContentLoaded':
await this.initiateGlance();
break;
case 'keydown':
this.onKeyDown(event);
break;
default:
}
}
@@ -120,4 +123,13 @@ export class ZenGlanceChild extends JSWindowActorChild {
this.openGlance(target);
}
}
onKeyDown(event) {
if (event.defaultPrevented || event.key !== 'Escape') {
return;
}
this.sendAsyncMessage('ZenGlance:CloseGlance', {
hasFocused: this.contentWindow.document.activeElement !== this.contentWindow.document.body,
});
}
}

View File

@@ -15,6 +15,16 @@ export class ZenGlanceParent extends JSWindowActorParent {
this.openGlance(this.browsingContext.topChromeWindow, message.data);
break;
}
case 'ZenGlance:CloseGlance': {
const params = {
onTabClose: true,
...message.data,
};
this.browsingContext.topChromeWindow.gZenGlanceManager.closeGlance(params);
break;
}
default:
console.warn(`[glance]: Unknown message: ${message.name}`);
}
}

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/places/content/editBookmark.js b/browser/components/places/content/editBookmark.js
index 9f17174fdd9cc1eaefb4330da1e10f40eeda2f31..e2c38872ee3a5c45d2e288e67d33f9ce24cab2b9 100644
index 9ab4e96cc4738d0ba549dca67b8559e0f9534f37..07b9087b0b17e33853d78c66ea1e5321a2bfef80 100644
--- a/browser/components/places/content/editBookmark.js
+++ b/browser/components/places/content/editBookmark.js
@@ -370,6 +370,10 @@ var gEditItemOverlay = {
@@ -386,6 +386,10 @@ var gEditItemOverlay = {
this._keywordField.readOnly = this.readOnly;
}
@@ -13,7 +13,7 @@ index 9f17174fdd9cc1eaefb4330da1e10f40eeda2f31..e2c38872ee3a5c45d2e288e67d33f9ce
// Collapse the tag selector if the item does not accept tags.
if (showOrCollapse("tagsRow", isBookmark || bulkTagging, "tags")) {
this._initTagsField();
@@ -682,6 +686,7 @@ var gEditItemOverlay = {
@@ -692,6 +696,7 @@ var gEditItemOverlay = {
if (this._paneInfo.isBookmark) {
options.tags = this._element("tagsField").value;
options.keyword = this._keyword;
@@ -21,7 +21,17 @@ index 9f17174fdd9cc1eaefb4330da1e10f40eeda2f31..e2c38872ee3a5c45d2e288e67d33f9ce
}
if (this._paneInfo.bulkTagging) {
@@ -1232,6 +1237,148 @@ var gEditItemOverlay = {
@@ -1193,6 +1198,9 @@ var gEditItemOverlay = {
case "editBMPanel_tagsSelectorExpander":
this.toggleTagsSelector().catch(console.error);
break;
+ case "editBMPanel_workspacesSelectorExpander":
+ this.onWorkspaceDropdownToggle();
+ break;
}
break;
}
@@ -1279,6 +1287,148 @@ var gEditItemOverlay = {
get bookmarkState() {
return this._bookmarkState;
},
@@ -170,7 +180,7 @@ index 9f17174fdd9cc1eaefb4330da1e10f40eeda2f31..e2c38872ee3a5c45d2e288e67d33f9ce
};
ChromeUtils.defineLazyGetter(gEditItemOverlay, "_folderTree", () => {
@@ -1267,6 +1414,9 @@ for (let elt of [
@@ -1317,6 +1467,9 @@ for (let elt of [
"locationField",
"keywordField",
"tagsField",

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/places/content/editBookmarkPanel.inc.xhtml b/browser/components/places/content/editBookmarkPanel.inc.xhtml
index 40366677b60123c66bf0739d1b2374b423d3061c..3e722dce6b21ab62535369f20afe5f0acd43838f 100644
index 40366677b60123c66bf0739d1b2374b423d3061c..a2774e99726407d95011126ea2a272f08eaf0961 100644
--- a/browser/components/places/content/editBookmarkPanel.inc.xhtml
+++ b/browser/components/places/content/editBookmarkPanel.inc.xhtml
@@ -12,14 +12,15 @@
@@ -20,11 +20,10 @@ index 40366677b60123c66bf0739d1b2374b423d3061c..3e722dce6b21ab62535369f20afe5f0a
<label data-l10n-id="bookmark-overlay-location-2"
class="editBMPanel_folderRow hideable"
control="editBMPanel_folderMenuList"/>
@@ -47,7 +48,26 @@
@@ -47,7 +48,25 @@
class="expander-down panel-button"
data-l10n-id="bookmark-overlay-folders-expander2"/>
</hbox>
-
+ </hbox>
+ <hbox flex="1" class="zenEditBMPanel_fieldContainer">
+ <label data-l10n-id="zen-bookmark-edit-panel-workspace-selector"
@@ -37,12 +36,11 @@ index 40366677b60123c66bf0739d1b2374b423d3061c..3e722dce6b21ab62535369f20afe5f0a
+ class="workspace-trigger">-</div>
+ <button id="editBMPanel_workspacesSelectorExpander"
+ class="expander-down panel-button"
+ data-l10n-id="bookmark-overlay-tags-expander2"
+ oncommand="gEditItemOverlay.onWorkspaceDropdownToggle();"/>
+
+ data-l10n-id="bookmark-overlay-tags-expander2"/>
+
+ </div>
+ </hbox>
+
+ <ul id="editBMPanel_workspaceList" class="workspace-list hideable" hidden="true">
+ </ul>
<vbox id="editBMPanel_folderTreeRow"

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
index f814772114948f87cbb3c3a7231c95ea1f68d776..f7d1f1f05f33b42be6856fad52ee323751af56ee 100644
index f814772114948f87cbb3c3a7231c95ea1f68d776..ae35daa518ca25f4fc95ef983519c390bf088a68 100644
--- a/browser/components/sessionstore/SessionStore.sys.mjs
+++ b/browser/components/sessionstore/SessionStore.sys.mjs
@@ -3171,7 +3171,7 @@ var SessionStoreInternal = {
@@ -11,14 +11,14 @@ index f814772114948f87cbb3c3a7231c95ea1f68d776..f7d1f1f05f33b42be6856fad52ee3237
return;
}
@@ -3881,6 +3881,7 @@ var SessionStoreInternal = {
aWindow.gBrowser.selectedTab = newTab;
}
@@ -3876,6 +3876,7 @@ var SessionStoreInternal = {
Math.min(tabState.index, tabState.entries.length)
);
tabState.pinned = false;
+ tabState.zenEssential = undefined;
+ if (aTab.hasAttribute("zenDefaultUserContextId")) newTab.setAttribute("zenDefaultUserContextId", true);
// Restore the state into the new tab.
this.restoreTab(newTab, tabState, {
restoreImmediately: aRestoreImmediately,
if (inBackground === false) {
aWindow.gBrowser.selectedTab = newTab;
@@ -5355,14 +5356,14 @@ var SessionStoreInternal = {
}
@@ -45,7 +45,7 @@ index f814772114948f87cbb3c3a7231c95ea1f68d776..f7d1f1f05f33b42be6856fad52ee3237
selectedIndex = 1;
winData.title = tabbrowser.tabs[0].label;
}
@@ -6086,6 +6087,18 @@ var SessionStoreInternal = {
@@ -6086,8 +6087,23 @@ var SessionStoreInternal = {
// Most of tabData has been restored, now continue with restoring
// attributes that may trigger external events.
@@ -61,6 +61,12 @@ index f814772114948f87cbb3c3a7231c95ea1f68d776..f7d1f1f05f33b42be6856fad52ee3237
+ if (tabData.zenPinnedId) {
+ tab.setAttribute("zen-pin-id", tabData.zenPinnedId);
+ }
+ if (tabData.zenDefaultUserContextId) {
+ tab.setAttribute("zenDefaultUserContextId", true);
+ }
if (tabData.pinned) {
- if (tabData.pinned) {
+ if (tabData.pinned || tabData.zenEssential) {
tabbrowser.pinTab(tab);
} else {
tabbrowser.unpinTab(tab);

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/sessionstore/TabState.sys.mjs b/browser/components/sessionstore/TabState.sys.mjs
index 8f7ed557e6aa61e7e16ed4a8d785ad5fe651b3d8..4c9f17408b912a2c51ebc1a670062203bf4994f3 100644
index 8f7ed557e6aa61e7e16ed4a8d785ad5fe651b3d8..aff63696d198055886960072a6130318e099ae42 100644
--- a/browser/components/sessionstore/TabState.sys.mjs
+++ b/browser/components/sessionstore/TabState.sys.mjs
@@ -80,10 +80,19 @@ class _TabState {
@@ -80,10 +80,20 @@ class _TabState {
tabData.muteReason = tab.muteReason;
}
@@ -14,6 +14,7 @@ index 8f7ed557e6aa61e7e16ed4a8d785ad5fe651b3d8..4c9f17408b912a2c51ebc1a670062203
+ tabData.zenWorkspace = tab.getAttribute("zen-workspace-id");
+ tabData.zenPinnedId = tab.getAttribute("zen-pin-id");
+ tabData.zenEssential = tab.getAttribute("zen-essential");
+ tabData.pinned = tabData.pinned || tabData.zenEssential;
+ tabData.zenDefaultUserContextId = tab.getAttribute("zenDefaultUserContextId");
+ tabData.zenPinnedEntry = tab.getAttribute("zen-pinned-entry");
+ tabData.zenPinnedIcon = tab.getAttribute("zen-pinned-icon");

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
index 628aa6596627c85efe361fc1ece8fd58f7ee653e..c62727bad57eda3b9d9a73c1df739a92f194f0c2 100644
index 628aa6596627c85efe361fc1ece8fd58f7ee653e..cd3ad53dbe399383178d0eff459ad72079b02024 100644
--- a/browser/components/tabbrowser/content/tabbrowser.js
+++ b/browser/components/tabbrowser/content/tabbrowser.js
@@ -412,11 +412,50 @@
@@ -476,7 +476,7 @@ index 628aa6596627c85efe361fc1ece8fd58f7ee653e..c62727bad57eda3b9d9a73c1df739a92
- this.addTrustedTab(BROWSER_NEW_TAB_URL, {
- skipAnimation: true,
- });
+ ZenWorkspaces.selectEmptyTab();
+ ZenWorkspaces.selectEmptyTab(BROWSER_NEW_TAB_URL);
} else {
TabBarVisibility.update();
}
@@ -529,13 +529,11 @@ index 628aa6596627c85efe361fc1ece8fd58f7ee653e..c62727bad57eda3b9d9a73c1df739a92
} else {
aIndex = Math.max(aIndex, this.pinnedTabCount);
}
@@ -5684,11 +5821,18 @@
}
@@ -5685,10 +5822,17 @@
this._handleTabMove(aTab, () => {
- let neighbor = this.tabs[aIndex];
let neighbor = this.tabs[aIndex];
- if (forceStandaloneTab && neighbor.group) {
+ let neighbor = this.tabs.filter(tab => !tab.hasAttribute("zen-glance-tab"))[aIndex];
+ const _tPos = aTab._tPos;
+ if ((forceStandaloneTab && neighbor.group) || neighbor.group?.hasAttribute("split-view-group")) {
neighbor = neighbor.group;

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620036896db 100644
index fa96568d366fd3608f9bd583fa793150bd815c8b..a13d501f2f0f190b9dc8fe0ce4f1d7af66b0495e 100644
--- a/browser/components/tabbrowser/content/tabs.js
+++ b/browser/components/tabbrowser/content/tabs.js
@@ -94,7 +94,7 @@
@@ -56,10 +56,14 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
if (
(effects == "move" || effects == "copy") &&
this == draggedTab.container &&
@@ -996,6 +1002,14 @@
@@ -996,6 +1002,18 @@
this._tabDropIndicator.hidden = true;
event.stopPropagation();
+ if (draggedTab?.hasAttribute("zen-has-splitted")) {
+ draggedTab.removeAttribute("zen-has-splitted");
+ draggedTab._visuallySelected = false;
+ }
+ if (draggedTab && dropEffect == "move") {
+ let moved = gZenPinnedTabManager.moveToAnotherTabContainerIfNecessary(event, movingTabs);
+
@@ -71,7 +75,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
if (draggedTab && dropEffect == "copy") {
// copy the dropped tab (wherever it's from)
let newIndex = this._getDropIndex(event);
@@ -1034,10 +1048,11 @@
@@ -1034,10 +1052,11 @@
}
} else {
let pinned = draggedTab.pinned;
@@ -87,7 +91,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
);
let size = this.verticalMode ? "height" : "width";
let screenAxis = this.verticalMode ? "screenY" : "screenX";
@@ -1114,7 +1129,7 @@
@@ -1114,7 +1133,7 @@
let postTransitionCleanup = () => {
tab.removeAttribute("tabdrop-samewindow");
@@ -96,7 +100,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
if (dropIndex !== false) {
gBrowser.moveTabTo(tab, dropIndex);
if (!directionForward) {
@@ -1122,7 +1137,7 @@
@@ -1122,7 +1141,7 @@
}
}
};
@@ -105,7 +109,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
postTransitionCleanup();
} else {
let onTransitionEnd = transitionendEvent => {
@@ -1249,7 +1264,7 @@
@@ -1249,7 +1268,7 @@
return;
}
}
@@ -114,7 +118,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
gBrowser.loadTabs(urls, {
inBackground,
replace,
@@ -1279,13 +1294,23 @@
@@ -1279,13 +1298,23 @@
return;
}
@@ -140,7 +144,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
) {
delete draggedTab._dragData;
return;
@@ -1517,7 +1542,7 @@
@@ -1517,7 +1546,7 @@
}
get newTabButton() {
@@ -149,7 +153,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
}
get verticalMode() {
@@ -1537,28 +1562,40 @@
@@ -1537,28 +1566,40 @@
if (this.#allTabs) {
return this.#allTabs;
}
@@ -198,7 +202,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
return children.filter(node => node.tagName == "tab-group");
}
@@ -1579,7 +1616,7 @@
@@ -1579,7 +1620,7 @@
*/
get visibleTabs() {
if (!this.#visibleTabs) {
@@ -207,7 +211,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
}
return this.#visibleTabs;
}
@@ -1613,10 +1650,8 @@
@@ -1613,10 +1654,8 @@
return this.#focusableItems;
}
@@ -220,7 +224,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
let focusableItems = [];
for (let child of children) {
@@ -1632,6 +1667,7 @@
@@ -1632,6 +1671,7 @@
}
this.#focusableItems = [
@@ -228,7 +232,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
...verticalPinnedTabsContainer.children,
...focusableItems,
];
@@ -1642,6 +1678,7 @@
@@ -1642,6 +1682,7 @@
_invalidateCachedTabs() {
this.#allTabs = null;
this._invalidateCachedVisibleTabs();
@@ -236,7 +240,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
}
_invalidateCachedVisibleTabs() {
@@ -1656,8 +1693,8 @@
@@ -1656,8 +1697,8 @@
#isContainerVerticalPinnedExpanded(tab) {
return (
this.verticalMode &&
@@ -247,7 +251,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
);
}
@@ -1672,7 +1709,7 @@
@@ -1672,7 +1713,7 @@
if (node == null) {
// We have a container for non-tab elements at the end of the scrollbox.
@@ -256,7 +260,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
}
node.before(tab);
@@ -1772,7 +1809,7 @@
@@ -1772,7 +1813,7 @@
// There are separate "new tab" buttons for horizontal tabs toolbar, vertical tabs and
// for when the tab strip is overflowed (which is shared by vertical and horizontal tabs);
// Attach the long click popup to all of them.
@@ -265,7 +269,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
const newTab2 = this.newTabButton;
const newTabVertical = document.getElementById(
"vertical-tabs-newtab-button"
@@ -1855,7 +1892,7 @@
@@ -1855,7 +1896,7 @@
let rect = ele => {
return window.windowUtils.getBoundsWithoutFlushing(ele);
};
@@ -274,7 +278,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
if (tab && rect(tab).width <= this._tabClipWidth) {
this.setAttribute("closebuttons", "activetab");
} else {
@@ -1867,10 +1904,12 @@
@@ -1867,10 +1908,12 @@
_handleTabSelect(aInstant) {
let selectedTab = this.selectedItem;
@@ -287,7 +291,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
selectedTab._notselectedsinceload = false;
}
@@ -1882,7 +1921,7 @@
@@ -1882,7 +1925,7 @@
return;
}
@@ -296,7 +300,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
if (!tabs.length) {
return;
}
@@ -1918,7 +1957,7 @@
@@ -1918,7 +1961,7 @@
if (isEndTab && !this._hasTabTempMaxWidth) {
return;
}
@@ -305,7 +309,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
// Force tabs to stay the same width, unless we're closing the last tab,
// which case we need to let them expand just enough so that the overall
// tabbar width is the same.
@@ -1933,7 +1972,7 @@
@@ -1933,7 +1976,7 @@
let tabsToReset = [];
for (let i = numPinned; i < tabs.length; i++) {
let tab = tabs[i];
@@ -314,7 +318,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
if (!isEndTab) {
// keep tabs the same width
tab.style.transition = "none";
@@ -1999,16 +2038,15 @@
@@ -1999,16 +2042,15 @@
// Move pinned tabs to another container when the tabstrip is toggled to vertical
// and when session restore code calls _positionPinnedTabs; update styling whenever
// the number of pinned tabs changes.
@@ -337,7 +341,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
}
}
@@ -2016,9 +2054,7 @@
@@ -2016,9 +2058,7 @@
}
_resetVerticalPinnedTabs() {
@@ -348,7 +352,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
if (!verticalTabsContainer.children.length) {
return;
@@ -2031,8 +2067,8 @@
@@ -2031,8 +2071,8 @@
}
_positionPinnedTabs() {
@@ -359,7 +363,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
let absPositionHorizontalTabs =
this.overflowing && tabs.length > numPinned && numPinned > 0;
@@ -2041,7 +2077,7 @@
@@ -2041,7 +2081,7 @@
if (this.verticalMode) {
this._updateVerticalPinnedTabs();
@@ -368,7 +372,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
let layoutData = this._pinnedTabsLayoutCache;
let uiDensity = document.documentElement.getAttribute("uidensity");
if (!layoutData || layoutData.uiDensity != uiDensity) {
@@ -2113,7 +2149,7 @@
@@ -2113,7 +2153,7 @@
return;
}
@@ -377,7 +381,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
let directionX = screenX > dragData.animLastScreenX;
let directionY = screenY > dragData.animLastScreenY;
@@ -2121,7 +2157,7 @@
@@ -2121,7 +2161,7 @@
dragData.animLastScreenX = screenX;
let { width: tabWidth, height: tabHeight } =
@@ -386,7 +390,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
let shiftSizeX = tabWidth * movingTabs.length;
let shiftSizeY = tabHeight;
dragData.tabWidth = tabWidth;
@@ -2296,10 +2332,11 @@
@@ -2296,10 +2336,11 @@
}
let pinned = draggedTab.pinned;
@@ -402,7 +406,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
);
if (this.#rtlMode) {
@@ -2348,7 +2385,11 @@
@@ -2348,7 +2389,11 @@
translate = Math.min(Math.max(translate, firstBound), lastBound);
for (let tab of movingTabs) {
@@ -415,7 +419,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
}
dragData.translatePos = translate;
@@ -2484,12 +2525,16 @@
@@ -2484,12 +2529,16 @@
// Shift background tabs to leave a gap where the dragged tab
// would currently be dropped.
for (let tab of tabs) {
@@ -433,7 +437,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
if (tab.group?.tabs[0] == tab) {
tab.group.style.setProperty(
"--tabgroup-dragover-transform",
@@ -2541,8 +2586,9 @@
@@ -2541,8 +2590,9 @@
);
}
@@ -445,7 +449,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
return;
}
@@ -2553,6 +2599,7 @@
@@ -2553,6 +2603,7 @@
tab.style.transform = "";
if (tab.group) {
tab.group.style.removeProperty("--tabgroup-dragover-transform");
@@ -453,7 +457,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
}
tab.removeAttribute("dragover-createGroup");
}
@@ -2604,7 +2651,7 @@
@@ -2604,7 +2655,7 @@
movingTab._moveTogetherSelectedTabsData.newIndex = movingTabNewIndex;
movingTab._moveTogetherSelectedTabsData.animate = false;
};
@@ -462,7 +466,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
postTransitionCleanup();
} else {
let onTransitionEnd = transitionendEvent => {
@@ -2707,9 +2754,9 @@
@@ -2707,9 +2758,9 @@
function newIndex(aTab, index) {
// Don't allow mixing pinned and unpinned tabs.
if (aTab.pinned) {
@@ -474,7 +478,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..64e93a414f1544b89af05c636c587620
}
}
@@ -2793,7 +2840,7 @@
@@ -2793,7 +2844,7 @@
}
_notifyBackgroundTab(aTab) {

View File

@@ -1,5 +1,5 @@
diff --git a/browser/themes/shared/urlbar-searchbar.css b/browser/themes/shared/urlbar-searchbar.css
index 574f83af7fa49ddcdff6711ca8b1d3bed1a35e0c..7919f21f6b0b4df2f197b9c6f0e134ff85d50d0a 100644
index 574f83af7fa49ddcdff6711ca8b1d3bed1a35e0c..c2e8cb8b37438176db07a47e1e975ae1aea42252 100644
--- a/browser/themes/shared/urlbar-searchbar.css
+++ b/browser/themes/shared/urlbar-searchbar.css
@@ -5,7 +5,7 @@
@@ -22,14 +22,3 @@ index 574f83af7fa49ddcdff6711ca8b1d3bed1a35e0c..7919f21f6b0b4df2f197b9c6f0e134ff
width: calc(var(--urlbar-width) + 2 * var(--urlbar-margin-inline));
> .urlbar-input-container {
@@ -583,8 +585,8 @@
.urlbar-revert-button,
.urlbar-go-button,
.search-go-button {
- width: calc(var(--urlbar-min-height) - 2px /* border */ - 2 * var(--urlbar-container-padding));
- height: calc(var(--urlbar-min-height) - 2px /* border */ - 2 * var(--urlbar-container-padding));
+ width: calc(var(--urlbar-min-height) + 2px /* border */ - 2 * var(--urlbar-container-padding));
+ height: calc(var(--urlbar-min-height) + 2px /* border */ - 2 * var(--urlbar-container-padding));
border-radius: var(--urlbar-icon-border-radius);
padding: var(--urlbar-icon-padding);
color: inherit;

View File

@@ -1,5 +1,5 @@
diff --git a/security/mac/hardenedruntime/v2/production/firefox.browser.xml b/security/mac/hardenedruntime/v2/production/firefox.browser.xml
index abbf33e9d2b3c9d1e0a34bd46e7cd289c435533b..4d988ca8201fa6aba6ca049e97d3cdc6b772b5eb 100644
index abbf33e9d2b3c9d1e0a34bd46e7cd289c435533b..d580b156fed13f4de8eb73e5c29c646a7a22a1d2 100644
--- a/security/mac/hardenedruntime/v2/production/firefox.browser.xml
+++ b/security/mac/hardenedruntime/v2/production/firefox.browser.xml
@@ -26,7 +26,7 @@
@@ -7,7 +7,7 @@ index abbf33e9d2b3c9d1e0a34bd46e7cd289c435533b..4d988ca8201fa6aba6ca049e97d3cdc6
<!-- Required for com.apple.developer.web-browser.public-key-credential -->
<key>com.apple.application-identifier</key>
- <string>43AQ936H96.org.mozilla.firefox</string>
+ <string>H36NPCN86W.app.zen-browser.zen</string>
+ <string>9V5K9TP787.app.zen-browser.zen</string>
<!-- For platform passkey (webauthn) support -->
<key>com.apple.developer.web-browser.public-key-credential</key><true/>

View File

@@ -5,8 +5,8 @@
"binaryName": "zen",
"version": {
"product": "firefox",
"version": "136.0",
"candidate": "136.0"
"version": "136.0.1",
"candidate": "136.0.1"
},
"buildOptions": {
"generateBranding": true
@@ -19,7 +19,7 @@
"brandShortName": "Zen",
"brandFullName": "Zen Browser",
"release": {
"displayVersion": "1.9b",
"displayVersion": "1.9.1b",
"github": {
"repo": "zen-browser/desktop"
},
@@ -39,7 +39,7 @@
"brandShortName": "Twilight",
"brandFullName": "Zen Twilight",
"release": {
"displayVersion": "1.9t",
"displayVersion": "1.9.1t",
"github": {
"repo": "zen-browser/desktop"
}
@@ -53,4 +53,4 @@
"licenseType": "MPL-2.0"
},
"updateHostname": "updates.zen-browser.app"
}
}