mirror of
https://github.com/zen-browser/desktop.git
synced 2026-07-10 19:09:30 +00:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7904f3264a | ||
|
|
dbd090a576 | ||
|
|
ddc10c7e42 | ||
|
|
decd9548dd | ||
|
|
27d290c77d | ||
|
|
5ecbc13eb6 | ||
|
|
58611690b5 | ||
|
|
68c8fe18bc | ||
|
|
3a72290f16 | ||
|
|
79d3d6a993 | ||
|
|
e9c35b0f92 | ||
|
|
647e219639 |
@@ -34,8 +34,8 @@ Zen is a firefox-based browser with the aim of pushing your productivity to a ne
|
|||||||
|
|
||||||
### Firefox Versions
|
### Firefox Versions
|
||||||
|
|
||||||
- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `152.0.4`! 🚀
|
- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `152.0.5`! 🚀
|
||||||
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 152.0.4`!
|
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 152.0.5`!
|
||||||
|
|
||||||
### Contributing
|
### Contributing
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
3985a970489e32fc751e1b80abf4d5534c905e45
|
6bd10168f81fb90f878132d87cf681200afbcd91
|
||||||
@@ -24,3 +24,5 @@ files:
|
|||||||
translation: browser/browser/zen-boosts.ftl
|
translation: browser/browser/zen-boosts.ftl
|
||||||
- source: en-US/browser/browser/zen-space-routing.ftl
|
- source: en-US/browser/browser/zen-space-routing.ftl
|
||||||
translation: browser/browser/zen-space-routing.ftl
|
translation: browser/browser/zen-space-routing.ftl
|
||||||
|
- source: en-US/browser/browser/zen-command-palette.ftl
|
||||||
|
translation: browser/browser/zen-command-palette.ftl
|
||||||
|
|||||||
36
locales/en-US/browser/browser/zen-command-palette.ftl
Normal file
36
locales/en-US/browser/browser/zen-command-palette.ftl
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# 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/.
|
||||||
|
|
||||||
|
zen-action-toggle-compact-mode = Toggle Compact Mode
|
||||||
|
zen-action-open-theme-picker = Open Theme Picker
|
||||||
|
zen-action-new-split-view = New Split View
|
||||||
|
zen-action-new-folder = New Folder
|
||||||
|
zen-action-copy-current-url = Copy Current URL
|
||||||
|
zen-action-settings = Settings
|
||||||
|
zen-action-open-private-window = Open Private Window
|
||||||
|
zen-action-open-new-window = Open New Window
|
||||||
|
zen-action-new-blank-window = New Blank Window
|
||||||
|
zen-action-pin-tab = Pin Tab
|
||||||
|
zen-action-unpin-tab = Unpin Tab
|
||||||
|
zen-action-open-space-routing = Open Space Routing
|
||||||
|
zen-action-new-boost = New Boost
|
||||||
|
zen-action-next-space = Next Space
|
||||||
|
zen-action-previous-space = Previous Space
|
||||||
|
zen-action-close-tab = Close Tab
|
||||||
|
zen-action-reload-tab = Reload Tab
|
||||||
|
zen-action-reload-tab-without-cache = Reload Tab Without Cache
|
||||||
|
zen-action-next-tab = Next Tab
|
||||||
|
zen-action-previous-tab = Previous Tab
|
||||||
|
zen-action-capture-screenshot = Capture Screenshot
|
||||||
|
zen-action-toggle-tabs-on-right = Toggle Tabs on right
|
||||||
|
zen-action-add-to-essentials = Add to Essentials
|
||||||
|
zen-action-remove-from-essentials = Remove from Essentials
|
||||||
|
zen-action-find-in-page = Find in Page
|
||||||
|
zen-action-manage-extensions = Manage Extensions
|
||||||
|
zen-action-switch-to-automatic-appearance = Switch to Automatic Appearance
|
||||||
|
zen-action-switch-to-light-mode = Switch to Light Mode
|
||||||
|
zen-action-switch-to-dark-mode = Switch to Dark Mode
|
||||||
|
zen-action-print = Print
|
||||||
|
zen-action-focus-on = Focus on
|
||||||
|
zen-action-extension = Extension
|
||||||
@@ -87,6 +87,8 @@ zen-icons-picker-emoji =
|
|||||||
.label = Emojis
|
.label = Emojis
|
||||||
zen-icons-picker-svg =
|
zen-icons-picker-svg =
|
||||||
.label = Icons
|
.label = Icons
|
||||||
|
zen-emojis-picker-search =
|
||||||
|
.placeholder = Search emojis
|
||||||
|
|
||||||
urlbar-search-mode-zen_actions = Actions
|
urlbar-search-mode-zen_actions = Actions
|
||||||
zen-site-data-settings = Settings
|
zen-site-data-settings = Settings
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
<hbox id="PanelUI-zen-emojis-picker-pages">
|
<hbox id="PanelUI-zen-emojis-picker-pages">
|
||||||
<vbox emojis="true">
|
<vbox emojis="true">
|
||||||
<hbox id="PanelUI-zen-emojis-picker-header">
|
<hbox id="PanelUI-zen-emojis-picker-header">
|
||||||
<html:input type="search" id="PanelUI-zen-emojis-picker-search" placeholder="Search emojis" />
|
<html:input type="search" id="PanelUI-zen-emojis-picker-search" data-l10n-id="zen-emojis-picker-search" />
|
||||||
</hbox>
|
</hbox>
|
||||||
<hbox id="PanelUI-zen-emojis-picker-list" />
|
<hbox id="PanelUI-zen-emojis-picker-list" />
|
||||||
</vbox>
|
</vbox>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
|
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
|
||||||
index 08b5b56e069d038d72c87355920c4ce8a55ed805..209c0ddc0297adb8340180c58de07ae107790751 100644
|
index 08b5b56e069d038d72c87355920c4ce8a55ed805..e1a3a18081c7a8153f8d12c187bf4dd522944fcb 100644
|
||||||
--- a/browser/components/tabbrowser/content/tabbrowser.js
|
--- a/browser/components/tabbrowser/content/tabbrowser.js
|
||||||
+++ b/browser/components/tabbrowser/content/tabbrowser.js
|
+++ b/browser/components/tabbrowser/content/tabbrowser.js
|
||||||
@@ -511,6 +511,7 @@
|
@@ -511,6 +511,7 @@
|
||||||
@@ -308,7 +308,7 @@ index 08b5b56e069d038d72c87355920c4ce8a55ed805..209c0ddc0297adb8340180c58de07ae1
|
|||||||
+
|
+
|
||||||
+ let hasZenDefaultUserContextId = false;
|
+ let hasZenDefaultUserContextId = false;
|
||||||
+ let zenForcedWorkspaceId = undefined;
|
+ let zenForcedWorkspaceId = undefined;
|
||||||
+ if (beforeRouteResult.isRouteFound && typeof userContextId !== "undefined") {
|
+ if (beforeRouteResult.isRouteFound && typeof userContextId === "undefined") {
|
||||||
+ userContextId = beforeRouteResult.userContextId;
|
+ userContextId = beforeRouteResult.userContextId;
|
||||||
+ hasZenDefaultUserContextId = true;
|
+ hasZenDefaultUserContextId = true;
|
||||||
+ } else if (typeof gZenWorkspaces !== "undefined" && !_forZenEmptyTab) {
|
+ } else if (typeof gZenWorkspaces !== "undefined" && !_forZenEmptyTab) {
|
||||||
|
|||||||
@@ -1,167 +0,0 @@
|
|||||||
diff --git a/gfx/webrender_bindings/WebRenderAPI.cpp b/gfx/webrender_bindings/WebRenderAPI.cpp
|
|
||||||
--- a/gfx/webrender_bindings/WebRenderAPI.cpp
|
|
||||||
+++ b/gfx/webrender_bindings/WebRenderAPI.cpp
|
|
||||||
@@ -298,11 +298,13 @@
|
|
||||||
panic_on_gl_error, picTileWidth, picTileHeight,
|
|
||||||
gfx::gfxVars::WebRenderRequiresHardwareDriver(),
|
|
||||||
StaticPrefs::gfx_webrender_low_quality_pinch_zoom_AtStartup(),
|
|
||||||
StaticPrefs::gfx_webrender_max_shared_surface_size_AtStartup(),
|
|
||||||
StaticPrefs::gfx_webrender_enable_subpixel_aa_AtStartup(),
|
|
||||||
- compositor->ShouldUseLayerCompositor())) {
|
|
||||||
+ compositor->ShouldUseLayerCompositor(),
|
|
||||||
+ StaticPrefs::
|
|
||||||
+ gfx_webrender_opaque_backdrop_fallback_AtStartup())) {
|
|
||||||
// wr_window_new puts a message into gfxCriticalNote if it returns
|
|
||||||
// false
|
|
||||||
MOZ_ASSERT(errorMessage);
|
|
||||||
error.AssignASCII(errorMessage);
|
|
||||||
wr_api_free_error_msg(errorMessage);
|
|
||||||
diff --git a/gfx/webrender_bindings/src/bindings.rs b/gfx/webrender_bindings/src/bindings.rs
|
|
||||||
--- a/gfx/webrender_bindings/src/bindings.rs
|
|
||||||
+++ b/gfx/webrender_bindings/src/bindings.rs
|
|
||||||
@@ -1998,10 +1998,11 @@
|
|
||||||
reject_software_rasterizer: bool,
|
|
||||||
low_quality_pinch_zoom: bool,
|
|
||||||
max_shared_surface_size: i32,
|
|
||||||
enable_subpixel_aa: bool,
|
|
||||||
use_layer_compositor: bool,
|
|
||||||
+ opaque_backdrop_fallback: bool,
|
|
||||||
) -> bool {
|
|
||||||
assert!(unsafe { is_in_render_thread() });
|
|
||||||
|
|
||||||
// Ensure the WR profiler callbacks are hooked up to the Gecko profiler.
|
|
||||||
set_profiler_hooks(Some(&PROFILER_HOOKS));
|
|
||||||
@@ -2164,10 +2165,11 @@
|
|
||||||
texture_cache_config,
|
|
||||||
reject_software_rasterizer,
|
|
||||||
low_quality_pinch_zoom,
|
|
||||||
max_shared_surface_size,
|
|
||||||
enable_dithering,
|
|
||||||
+ opaque_backdrop_fallback,
|
|
||||||
..Default::default()
|
|
||||||
};
|
|
||||||
|
|
||||||
let window_size = DeviceIntSize::new(window_width, window_height);
|
|
||||||
let notifier = Box::new(CppNotifier { window_id });
|
|
||||||
diff --git a/gfx/wr/webrender/src/device/gl.rs b/gfx/wr/webrender/src/device/gl.rs
|
|
||||||
--- a/gfx/wr/webrender/src/device/gl.rs
|
|
||||||
+++ b/gfx/wr/webrender/src/device/gl.rs
|
|
||||||
@@ -3982,10 +3982,14 @@
|
|
||||||
|
|
||||||
pub fn disable_color_write(&self) {
|
|
||||||
self.gl.color_mask(false, false, false, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ pub fn set_color_mask(&self, r: bool, g: bool, b: bool, a: bool) {
|
|
||||||
+ self.gl.color_mask(r, g, b, a);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
pub fn set_blend(&mut self, enable: bool) {
|
|
||||||
if enable {
|
|
||||||
self.gl.enable(gl::BLEND);
|
|
||||||
} else {
|
|
||||||
self.gl.disable(gl::BLEND);
|
|
||||||
diff --git a/gfx/wr/webrender/src/renderer/init.rs b/gfx/wr/webrender/src/renderer/init.rs
|
|
||||||
--- a/gfx/wr/webrender/src/renderer/init.rs
|
|
||||||
+++ b/gfx/wr/webrender/src/renderer/init.rs
|
|
||||||
@@ -204,6 +204,8 @@
|
|
||||||
pub low_quality_pinch_zoom: bool,
|
|
||||||
pub max_shared_surface_size: i32,
|
|
||||||
/// If true, open a debug socket to listen for remote debugger.
|
|
||||||
/// Relies on `debugger` cargo feature being enabled.
|
|
||||||
pub enable_debugger: bool,
|
|
||||||
+ /// See explanation of `gfx.webrender.opaque-backdrop-fallback`.
|
|
||||||
+ pub opaque_backdrop_fallback: bool,
|
|
||||||
}
|
|
||||||
@@ -277,9 +279,10 @@
|
|
||||||
enable_instancing: true,
|
|
||||||
reject_software_rasterizer: false,
|
|
||||||
low_quality_pinch_zoom: false,
|
|
||||||
max_shared_surface_size: 2048,
|
|
||||||
enable_debugger: true,
|
|
||||||
+ opaque_backdrop_fallback: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -802,10 +805,11 @@
|
|
||||||
allocated_native_surfaces: FastHashSet::default(),
|
|
||||||
debug_overlay_state: DebugOverlayState::new(),
|
|
||||||
buffer_damage_tracker: BufferDamageTracker::default(),
|
|
||||||
max_primitive_instance_count,
|
|
||||||
enable_instancing: options.enable_instancing,
|
|
||||||
+ opaque_backdrop_fallback: options.opaque_backdrop_fallback,
|
|
||||||
consecutive_oom_frames: 0,
|
|
||||||
target_frame_publish_id: None,
|
|
||||||
pending_result_msg: None,
|
|
||||||
layer_compositor_frame_state_in_prev_frame: None,
|
|
||||||
external_composite_debug_items: Vec::new(),
|
|
||||||
diff --git a/gfx/wr/webrender/src/renderer/mod.rs b/gfx/wr/webrender/src/renderer/mod.rs
|
|
||||||
--- a/gfx/wr/webrender/src/renderer/mod.rs
|
|
||||||
+++ b/gfx/wr/webrender/src/renderer/mod.rs
|
|
||||||
@@ -867,10 +867,12 @@
|
|
||||||
buffer_damage_tracker: BufferDamageTracker,
|
|
||||||
|
|
||||||
max_primitive_instance_count: usize,
|
|
||||||
enable_instancing: bool,
|
|
||||||
|
|
||||||
+ opaque_backdrop_fallback: bool,
|
|
||||||
+
|
|
||||||
/// Count consecutive oom frames to detectif we are stuck unable to render
|
|
||||||
/// in a loop.
|
|
||||||
consecutive_oom_frames: u32,
|
|
||||||
|
|
||||||
/// update() defers processing of ResultMsg, if frame_publish_id of
|
|
||||||
@@ -2787,18 +2789,29 @@
|
|
||||||
let read_target = ReadTarget::from_texture(cache_texture);
|
|
||||||
|
|
||||||
// Should always be drawing to picture cache tiles or off-screen surface!
|
|
||||||
debug_assert!(!draw_target.is_default());
|
|
||||||
let device_to_framebuffer = Scale::new(1i32);
|
|
||||||
+ let dest_fb_rect = dest * device_to_framebuffer;
|
|
||||||
|
|
||||||
self.device.blit_render_target(
|
|
||||||
read_target,
|
|
||||||
src * device_to_framebuffer,
|
|
||||||
draw_target,
|
|
||||||
- dest * device_to_framebuffer,
|
|
||||||
+ dest_fb_rect,
|
|
||||||
TextureFilter::Linear,
|
|
||||||
);
|
|
||||||
+
|
|
||||||
+ if self.opaque_backdrop_fallback {
|
|
||||||
+ self.device.set_color_mask(false, false, false, true);
|
|
||||||
+ self.device.clear_target(
|
|
||||||
+ Some([0.0, 0.0, 0.0, 1.0]),
|
|
||||||
+ None,
|
|
||||||
+ Some(dest_fb_rect),
|
|
||||||
+ );
|
|
||||||
+ self.device.set_color_mask(true, true, true, true);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn draw_picture_cache_target(
|
|
||||||
diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
|
|
||||||
--- a/modules/libpref/init/StaticPrefList.yaml
|
|
||||||
+++ b/modules/libpref/init/StaticPrefList.yaml
|
|
||||||
@@ -8439,10 +8439,17 @@
|
|
||||||
#else
|
|
||||||
value: false
|
|
||||||
#endif
|
|
||||||
mirror: once
|
|
||||||
|
|
||||||
+# Make backdrop-filter treat its captured backdrop as if it had been
|
|
||||||
+# composited over an opaque-black background. (See bug 2036640)
|
|
||||||
+- name: gfx.webrender.opaque-backdrop-fallback
|
|
||||||
+ type: bool
|
|
||||||
+ value: true
|
|
||||||
+ mirror: once
|
|
||||||
+
|
|
||||||
# Disable wait of GPU execution completion
|
|
||||||
- name: gfx.webrender.wait-gpu-finished.disabled
|
|
||||||
type: bool
|
|
||||||
value: false
|
|
||||||
mirror: once
|
|
||||||
|
|
||||||
@@ -289,6 +289,9 @@ export class nsZenFolder extends MozTabbrowserTabGroup {
|
|||||||
addTabs(tabs) {
|
addTabs(tabs) {
|
||||||
let tabsFromOutside = [];
|
let tabsFromOutside = [];
|
||||||
for (let tab of tabs) {
|
for (let tab of tabs) {
|
||||||
|
if (tab.hasAttribute("zen-essential")) {
|
||||||
|
gZenPinnedTabManager.removeEssentials(tab, false);
|
||||||
|
}
|
||||||
if (tab.group !== this) {
|
if (tab.group !== this) {
|
||||||
tabsFromOutside.push(tab);
|
tabsFromOutside.push(tab);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -622,15 +622,13 @@ class nsZenFolders extends nsZenDOMOperatedFeature {
|
|||||||
}
|
}
|
||||||
|
|
||||||
createFolder(tabs = [], options = {}) {
|
createFolder(tabs = [], options = {}) {
|
||||||
const filteredTabs = tabs
|
const filteredTabs = tabs.map(tab => {
|
||||||
.filter(tab => !tab.hasAttribute("zen-essential"))
|
gBrowser.pinTab(tab);
|
||||||
.map(tab => {
|
if (tab?.group?.hasAttribute("split-view-group")) {
|
||||||
gBrowser.pinTab(tab);
|
tab = tab.group;
|
||||||
if (tab?.group?.hasAttribute("split-view-group")) {
|
}
|
||||||
tab = tab.group;
|
return tab;
|
||||||
}
|
});
|
||||||
return tab;
|
|
||||||
});
|
|
||||||
|
|
||||||
const workspacePinned = gZenWorkspaces.workspaceElement(
|
const workspacePinned = gZenWorkspaces.workspaceElement(
|
||||||
options.workspaceId
|
options.workspaceId
|
||||||
|
|||||||
@@ -1551,6 +1551,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
|
|||||||
return (
|
return (
|
||||||
owner &&
|
owner &&
|
||||||
owner.pinned &&
|
owner.pinned &&
|
||||||
|
!owner.hasAttribute("glance-id") &&
|
||||||
this._lazyPref.SHOULD_OPEN_EXTERNAL_TABS_IN_GLANCE &&
|
this._lazyPref.SHOULD_OPEN_EXTERNAL_TABS_IN_GLANCE &&
|
||||||
owner.linkedBrowser?.browsingContext?.isAppTab &&
|
owner.linkedBrowser?.browsingContext?.isAppTab &&
|
||||||
this.tabDomainsDiffer(owner, uri) &&
|
this.tabDomainsDiffer(owner, uri) &&
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ class nsZenWorkspaceCreation extends MozXULElement {
|
|||||||
|
|
||||||
this.currentProfile = {
|
this.currentProfile = {
|
||||||
id: 0,
|
id: 0,
|
||||||
name: "Default",
|
name: ContextualIdentityService.formatContextLabel("user-context-none"),
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
this.inputProfile.parentNode.hidden = true;
|
this.inputProfile.parentNode.hidden = true;
|
||||||
|
|||||||
@@ -391,7 +391,7 @@ class nsZenWorkspaces {
|
|||||||
container = 0;
|
container = 0;
|
||||||
}
|
}
|
||||||
let essentialsContainer = document.querySelector(
|
let essentialsContainer = document.querySelector(
|
||||||
`.zen-essentials-container[container="${container}"]:not([cloned])`
|
`.zen-essentials-container[container="${container}"]`
|
||||||
);
|
);
|
||||||
if (!essentialsContainer) {
|
if (!essentialsContainer) {
|
||||||
essentialsContainer = document.createXULElement("hbox");
|
essentialsContainer = document.createXULElement("hbox");
|
||||||
@@ -1927,28 +1927,20 @@ class nsZenWorkspaces {
|
|||||||
diff += spaceLen;
|
diff += spaceLen;
|
||||||
}
|
}
|
||||||
const isGoingLeft = diff < 0;
|
const isGoingLeft = diff < 0;
|
||||||
const clonedEssentials = [];
|
const essentialsAnimData = [];
|
||||||
if (shouldAnimate && this.shouldAnimateEssentials && previousWorkspace) {
|
if (shouldAnimate && this.shouldAnimateEssentials && previousWorkspace) {
|
||||||
|
const containerIds = new Map();
|
||||||
for (const workspace of workspaces) {
|
for (const workspace of workspaces) {
|
||||||
const essentialsContainer = this.getEssentialsSection(
|
const containerId = workspace.containerTabId;
|
||||||
workspace.containerTabId
|
if (!containerIds.has(containerId)) {
|
||||||
);
|
containerIds.set(containerId, []);
|
||||||
let lastCloned = clonedEssentials[clonedEssentials.length - 1];
|
|
||||||
if (lastCloned && lastCloned.contextId == workspace.containerTabId) {
|
|
||||||
lastCloned.repeat++;
|
|
||||||
lastCloned.workspaces.push(workspace);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
essentialsContainer.setAttribute("hidden", "true");
|
containerIds.get(containerId).push(workspace);
|
||||||
const essentialsClone = essentialsContainer.cloneNode(true);
|
}
|
||||||
essentialsClone.removeAttribute("hidden");
|
for (const [containerId, spaces] of containerIds) {
|
||||||
essentialsClone.setAttribute("cloned", "true");
|
essentialsAnimData.push({
|
||||||
clonedEssentials.push({
|
element: this.getEssentialsSection(containerId),
|
||||||
container: essentialsClone,
|
workspaces: spaces,
|
||||||
workspaces: [workspace],
|
|
||||||
contextId: workspace.containerTabId,
|
|
||||||
originalContainer: essentialsContainer,
|
|
||||||
repeat: 0,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2055,190 +2047,48 @@ class nsZenWorkspaces {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.shouldAnimateEssentials && previousWorkspace) {
|
if (this.shouldAnimateEssentials && previousWorkspace) {
|
||||||
// Animate essentials
|
for (const data of essentialsAnimData) {
|
||||||
const newWorkspaceEssentialsContainer = clonedEssentials.find(cloned =>
|
const container = data.element;
|
||||||
cloned.workspaces.some(w => w.uuid === newWorkspace.uuid)
|
const essentialsWorkspaces = data.workspaces;
|
||||||
);
|
|
||||||
// Get a list of essentials containers that are in between the first and last workspace
|
const containsPrev = essentialsWorkspaces.some(
|
||||||
const essentialsContainersInBetween = clonedEssentials.filter(cloned => {
|
w => w.uuid === previousWorkspace.uuid
|
||||||
const essentialsWorkspaces = cloned.workspaces;
|
|
||||||
const firstIndex = workspaces.findIndex(
|
|
||||||
w => w.uuid === essentialsWorkspaces[0].uuid
|
|
||||||
);
|
);
|
||||||
const lastIndex = workspaces.findIndex(
|
const containsNew = essentialsWorkspaces.some(
|
||||||
w =>
|
w => w.uuid === newWorkspace.uuid
|
||||||
w.uuid ===
|
|
||||||
essentialsWorkspaces[essentialsWorkspaces.length - 1].uuid
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const [start, end] = [
|
if (!containsPrev && !containsNew) {
|
||||||
Math.min(previousWorkspaceIndex, newWorkspaceIndex),
|
container.setAttribute("hidden", "true");
|
||||||
Math.max(previousWorkspaceIndex, newWorkspaceIndex),
|
|
||||||
];
|
|
||||||
|
|
||||||
// Check if any part of the container overlaps with the movement range
|
|
||||||
return firstIndex <= end && lastIndex >= start;
|
|
||||||
});
|
|
||||||
for (const cloned of clonedEssentials) {
|
|
||||||
const container = cloned.container;
|
|
||||||
const essentialsWorkspaces = cloned.workspaces;
|
|
||||||
const repeats = cloned.repeat;
|
|
||||||
// Animate like the workspaces above expect essentials are a bit more
|
|
||||||
// complicated because they are not based on workspaces but on containers
|
|
||||||
// So, if we have the following arangement:
|
|
||||||
// | [workspace1] [workspace2] [workspace3] [workspace4]
|
|
||||||
// | [container1] [container1] [container2] [container1]
|
|
||||||
// And if we are changing from workspace 1 to workspace 4,
|
|
||||||
// we should be doing the following:
|
|
||||||
// First container (repeat 2 times) will stay in place until
|
|
||||||
// we reach container 3, then animate to the left and container 2
|
|
||||||
// also move to the left after that while container 1 in workspace 4
|
|
||||||
// will slide in from the right
|
|
||||||
|
|
||||||
// Get the index from first and last workspace
|
|
||||||
const firstWorkspaceIndex = workspaces.findIndex(
|
|
||||||
w => w.uuid === essentialsWorkspaces[0].uuid
|
|
||||||
);
|
|
||||||
const lastWorkspaceIndex = workspaces.findIndex(
|
|
||||||
w =>
|
|
||||||
w.uuid ===
|
|
||||||
essentialsWorkspaces[essentialsWorkspaces.length - 1].uuid
|
|
||||||
);
|
|
||||||
cloned.originalContainer.style.removeProperty("transform");
|
|
||||||
// Check if the container is even going to appear on the screen, to save on animation
|
|
||||||
if (
|
|
||||||
// We also need to check if the container is even going to appear on the screen.
|
|
||||||
// In order to do this, we need to check if the container is between the first and last workspace.
|
|
||||||
// Note that essential containers can have multiple workspaces,
|
|
||||||
// so we need to check if any of the workspaces in the container are between the
|
|
||||||
// first and last workspace.
|
|
||||||
!essentialsContainersInBetween.find(
|
|
||||||
ce =>
|
|
||||||
ce.workspaces.some(
|
|
||||||
w => w.uuid === essentialsWorkspaces[0].uuid
|
|
||||||
) &&
|
|
||||||
ce.workspaces.some(
|
|
||||||
w =>
|
|
||||||
w.uuid ===
|
|
||||||
essentialsWorkspaces[essentialsWorkspaces.length - 1].uuid
|
|
||||||
)
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
cloned.originalContainer.parentNode.appendChild(container);
|
|
||||||
let stepsInBetween =
|
|
||||||
Math.abs(
|
|
||||||
newWorkspaceIndex -
|
|
||||||
(isGoingLeft ? firstWorkspaceIndex : lastWorkspaceIndex)
|
|
||||||
) + 1;
|
|
||||||
const usingSameContainer =
|
|
||||||
newWorkspaceEssentialsContainer?.workspaces.some(
|
|
||||||
w => w.uuid === newWorkspace.uuid
|
|
||||||
) &&
|
|
||||||
newWorkspaceEssentialsContainer?.workspaces.some(
|
|
||||||
w => w.uuid === previousWorkspace.uuid
|
|
||||||
);
|
|
||||||
let newOffset =
|
|
||||||
-(
|
|
||||||
newWorkspaceIndex -
|
|
||||||
(isGoingLeft ? firstWorkspaceIndex : lastWorkspaceIndex) +
|
|
||||||
(!isGoingLeft ? repeats - 1 : -repeats + 1)
|
|
||||||
) * 100;
|
|
||||||
|
|
||||||
let existingOffset =
|
container.removeAttribute("hidden");
|
||||||
-(
|
|
||||||
newWorkspaceIndex -
|
|
||||||
(isGoingLeft ? lastWorkspaceIndex : firstWorkspaceIndex) +
|
|
||||||
(isGoingLeft ? repeats - 1 : -repeats + 1)
|
|
||||||
) * 100;
|
|
||||||
|
|
||||||
// If we are on the same container and both new and old workspace are in the same "essentialsWorkspaces"
|
if (containsPrev && containsNew) {
|
||||||
// we can simply not animate the essentials
|
container.style.transform = "translateX(0%)";
|
||||||
if (
|
continue;
|
||||||
usingSameContainer &&
|
}
|
||||||
essentialsWorkspaces.some(w => w.uuid === newWorkspace.uuid) &&
|
|
||||||
essentialsWorkspaces.some(w => w.uuid === previousWorkspace.uuid)
|
let existingOffset, newOffset;
|
||||||
) {
|
const currentTransform =
|
||||||
|
parseFloat(container.style.transform.split("(")[1]) || 0;
|
||||||
|
if (containsPrev && !containsNew) {
|
||||||
|
existingOffset = currentTransform;
|
||||||
|
newOffset = isGoingLeft ? 100 : -100;
|
||||||
|
} else {
|
||||||
|
existingOffset = currentTransform || (isGoingLeft ? -100 : 100);
|
||||||
newOffset = 0;
|
newOffset = 0;
|
||||||
existingOffset = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const needsOffsetAdjustment =
|
|
||||||
stepsInBetween > essentialsWorkspaces.length || usingSameContainer;
|
|
||||||
|
|
||||||
if (repeats > 0 && needsOffsetAdjustment) {
|
|
||||||
if (!isGoingLeft) {
|
|
||||||
if (existingOffset !== 0) {
|
|
||||||
existingOffset += 100;
|
|
||||||
}
|
|
||||||
if (newOffset !== 0) {
|
|
||||||
newOffset += 100;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (existingOffset !== 0) {
|
|
||||||
existingOffset -= 100;
|
|
||||||
}
|
|
||||||
if (newOffset !== 0) {
|
|
||||||
newOffset -= 100;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Special case: going forward from single reused container to a new one
|
|
||||||
if (
|
|
||||||
!usingSameContainer &&
|
|
||||||
!isGoingLeft &&
|
|
||||||
lastWorkspaceIndex === newWorkspaceIndex - 1
|
|
||||||
) {
|
|
||||||
existingOffset = 0;
|
|
||||||
newOffset = -100;
|
|
||||||
stepsInBetween = 1;
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
!usingSameContainer &&
|
|
||||||
isGoingLeft &&
|
|
||||||
firstWorkspaceIndex === newWorkspaceIndex + 1
|
|
||||||
) {
|
|
||||||
existingOffset = 0;
|
|
||||||
newOffset = 100;
|
|
||||||
stepsInBetween = 1;
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
!usingSameContainer &&
|
|
||||||
isGoingLeft &&
|
|
||||||
(firstWorkspaceIndex === newWorkspaceIndex - 1 ||
|
|
||||||
firstWorkspaceIndex === newWorkspaceIndex)
|
|
||||||
) {
|
|
||||||
existingOffset = -100;
|
|
||||||
newOffset = 0;
|
|
||||||
stepsInBetween = 1;
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
!usingSameContainer &&
|
|
||||||
!isGoingLeft &&
|
|
||||||
firstWorkspaceIndex === newWorkspaceIndex
|
|
||||||
) {
|
|
||||||
existingOffset = 100;
|
|
||||||
newOffset = 0;
|
|
||||||
stepsInBetween = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const newTransform = `translateX(${newOffset}%)`;
|
const newTransform = `translateX(${newOffset}%)`;
|
||||||
let existingTransform = `translateX(${existingOffset}%)`;
|
let existingTransform = `translateX(${existingOffset}%)`;
|
||||||
if (container.style.transform && container.style.transform !== "none") {
|
|
||||||
existingTransform = container.style.transform;
|
|
||||||
}
|
|
||||||
if (shouldAnimate) {
|
if (shouldAnimate) {
|
||||||
container.style.transform = existingTransform;
|
container.style.transform = existingTransform;
|
||||||
animations.push(
|
animations.push(
|
||||||
gZenUIManager.motion.animate(
|
gZenUIManager.motion.animate(
|
||||||
container,
|
container,
|
||||||
{
|
{
|
||||||
transform: [
|
transform: [existingTransform, newTransform],
|
||||||
existingTransform,
|
|
||||||
new Array(stepsInBetween).fill(newTransform).join(","),
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "spring",
|
type: "spring",
|
||||||
@@ -2267,17 +2117,12 @@ class nsZenWorkspaces {
|
|||||||
this.#currentSpaceSwitchContext.animations = [];
|
this.#currentSpaceSwitchContext.animations = [];
|
||||||
document.documentElement.removeAttribute("animating-background");
|
document.documentElement.removeAttribute("animating-background");
|
||||||
if (shouldAnimate) {
|
if (shouldAnimate) {
|
||||||
for (const cloned of clonedEssentials) {
|
for (const data of essentialsAnimData) {
|
||||||
cloned.container.remove();
|
data.element.style.removeProperty("transform");
|
||||||
}
|
}
|
||||||
this._alwaysAnimatePaddingTop = true;
|
this._alwaysAnimatePaddingTop = true;
|
||||||
this.updateTabsContainers();
|
this.updateTabsContainers();
|
||||||
}
|
}
|
||||||
const essentialsContainer = this.getEssentialsSection(
|
|
||||||
newWorkspace.containerTabId
|
|
||||||
);
|
|
||||||
essentialsContainer.removeAttribute("hidden");
|
|
||||||
essentialsContainer.style.transform = "none";
|
|
||||||
gBrowser.tabContainer._invalidateCachedTabs();
|
gBrowser.tabContainer._invalidateCachedTabs();
|
||||||
gZenUIManager.tabsWrapper.style.removeProperty("scrollbar-width");
|
gZenUIManager.tabsWrapper.style.removeProperty("scrollbar-width");
|
||||||
this._animatingChange = false;
|
this._animatingChange = false;
|
||||||
@@ -3152,9 +2997,6 @@ class nsZenWorkspaces {
|
|||||||
...normalContainers,
|
...normalContainers,
|
||||||
];
|
];
|
||||||
for (const container of containers) {
|
for (const container of containers) {
|
||||||
if (container.hasAttribute("cloned")) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (const tab of container.children) {
|
for (const tab of container.children) {
|
||||||
if (gBrowser.isTab(tab)) {
|
if (gBrowser.isTab(tab)) {
|
||||||
tabs.push(tab);
|
tabs.push(tab);
|
||||||
|
|||||||
@@ -1156,10 +1156,6 @@
|
|||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
position: fixed; /* Fix position to prevent scrolling */
|
position: fixed; /* Fix position to prevent scrolling */
|
||||||
}
|
}
|
||||||
|
|
||||||
&[cloned] {
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.tabbrowser-tab[zen-essential="true"],
|
.tabbrowser-tab[zen-essential="true"],
|
||||||
|
|||||||
@@ -27,6 +27,10 @@ ChromeUtils.defineESModuleGetters(lazy, {
|
|||||||
UrlUtils: "resource://gre/modules/UrlUtils.sys.mjs",
|
UrlUtils: "resource://gre/modules/UrlUtils.sys.mjs",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ChromeUtils.defineLazyGetter(lazy, "l10n", () => {
|
||||||
|
return new Localization(["browser/zen-command-palette.ftl"], true);
|
||||||
|
});
|
||||||
|
|
||||||
XPCOMUtils.defineLazyPreferenceGetter(
|
XPCOMUtils.defineLazyPreferenceGetter(
|
||||||
lazy,
|
lazy,
|
||||||
"enabledPref",
|
"enabledPref",
|
||||||
@@ -182,7 +186,7 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
|
|||||||
.workspaceElement(workspace.uuid)
|
.workspaceElement(workspace.uuid)
|
||||||
?.style.getPropertyValue("--zen-primary-color");
|
?.style.getPropertyValue("--zen-primary-color");
|
||||||
actions.push({
|
actions.push({
|
||||||
label: "Focus on",
|
label: lazy.l10n.formatValueSync("zen-action-focus-on"),
|
||||||
extraPayload: {
|
extraPayload: {
|
||||||
workspaceId: workspace.uuid,
|
workspaceId: workspace.uuid,
|
||||||
prettyName: workspace.name,
|
prettyName: workspace.name,
|
||||||
@@ -215,7 +219,7 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
|
|||||||
.map(addon => {
|
.map(addon => {
|
||||||
return {
|
return {
|
||||||
icon: "chrome://browser/skin/zen-icons/extension.svg",
|
icon: "chrome://browser/skin/zen-icons/extension.svg",
|
||||||
label: "Extension",
|
label: lazy.l10n.formatValueSync("zen-action-extension"),
|
||||||
commandId: `zen:extension-${addon.id}`,
|
commandId: `zen:extension-${addon.id}`,
|
||||||
extraPayload: {
|
extraPayload: {
|
||||||
extensionId: addon.id,
|
extensionId: addon.id,
|
||||||
|
|||||||
@@ -13,58 +13,62 @@ XPCOMUtils.defineLazyPreferenceGetter(
|
|||||||
2
|
2
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ChromeUtils.defineLazyGetter(lazy, "l10n", () => {
|
||||||
|
return new Localization(["browser/zen-command-palette.ftl"], true);
|
||||||
|
});
|
||||||
|
|
||||||
function isNotEmptyTab(window) {
|
function isNotEmptyTab(window) {
|
||||||
return !window.gBrowser.selectedTab.hasAttribute("zen-empty-tab");
|
return !window.gBrowser.selectedTab.hasAttribute("zen-empty-tab");
|
||||||
}
|
}
|
||||||
|
|
||||||
const globalActionsTemplate = [
|
const globalActionsTemplate = [
|
||||||
{
|
{
|
||||||
label: "Toggle Compact Mode",
|
l10nId: "zen-action-toggle-compact-mode",
|
||||||
command: "cmd_zenCompactModeToggle",
|
command: "cmd_zenCompactModeToggle",
|
||||||
icon: "chrome://browser/skin/zen-icons/sidebar.svg",
|
icon: "chrome://browser/skin/zen-icons/sidebar.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Open Theme Picker",
|
l10nId: "zen-action-open-theme-picker",
|
||||||
command: "cmd_zenOpenZenThemePicker",
|
command: "cmd_zenOpenZenThemePicker",
|
||||||
icon: "chrome://browser/skin/zen-icons/edit-theme.svg",
|
icon: "chrome://browser/skin/zen-icons/edit-theme.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "New Split View",
|
l10nId: "zen-action-new-split-view",
|
||||||
command: "cmd_zenNewEmptySplit",
|
command: "cmd_zenNewEmptySplit",
|
||||||
icon: "chrome://browser/skin/zen-icons/split.svg",
|
icon: "chrome://browser/skin/zen-icons/split.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "New Folder",
|
l10nId: "zen-action-new-folder",
|
||||||
command: "cmd_zenOpenFolderCreation",
|
command: "cmd_zenOpenFolderCreation",
|
||||||
icon: "chrome://browser/skin/zen-icons/folder.svg",
|
icon: "chrome://browser/skin/zen-icons/folder.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Copy Current URL",
|
l10nId: "zen-action-copy-current-url",
|
||||||
command: "cmd_zenCopyCurrentURL",
|
command: "cmd_zenCopyCurrentURL",
|
||||||
icon: "chrome://browser/skin/zen-icons/link.svg",
|
icon: "chrome://browser/skin/zen-icons/link.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Settings",
|
l10nId: "zen-action-settings",
|
||||||
command: window => window.openPreferences(),
|
command: window => window.openPreferences(),
|
||||||
icon: "chrome://browser/skin/zen-icons/settings.svg",
|
icon: "chrome://browser/skin/zen-icons/settings.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Open Private Window",
|
l10nId: "zen-action-open-private-window",
|
||||||
command: "Tools:PrivateBrowsing",
|
command: "Tools:PrivateBrowsing",
|
||||||
icon: "chrome://browser/skin/zen-icons/private-window.svg",
|
icon: "chrome://browser/skin/zen-icons/private-window.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Open New Window",
|
l10nId: "zen-action-open-new-window",
|
||||||
command: "cmd_newNavigator",
|
command: "cmd_newNavigator",
|
||||||
icon: "chrome://browser/skin/zen-icons/window.svg",
|
icon: "chrome://browser/skin/zen-icons/window.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "New Blank Window",
|
l10nId: "zen-action-new-blank-window",
|
||||||
command: "cmd_zenNewNavigatorUnsynced",
|
command: "cmd_zenNewNavigatorUnsynced",
|
||||||
icon: "chrome://browser/skin/zen-icons/window.svg",
|
icon: "chrome://browser/skin/zen-icons/window.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Pin Tab",
|
l10nId: "zen-action-pin-tab",
|
||||||
command: "cmd_zenTogglePinTab",
|
command: "cmd_zenTogglePinTab",
|
||||||
icon: "chrome://browser/skin/zen-icons/pin.svg",
|
icon: "chrome://browser/skin/zen-icons/pin.svg",
|
||||||
isAvailable: window => {
|
isAvailable: window => {
|
||||||
@@ -73,7 +77,7 @@ const globalActionsTemplate = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Unpin Tab",
|
l10nId: "zen-action-unpin-tab",
|
||||||
command: "cmd_zenTogglePinTab",
|
command: "cmd_zenTogglePinTab",
|
||||||
icon: "chrome://browser/skin/zen-icons/unpin.svg",
|
icon: "chrome://browser/skin/zen-icons/unpin.svg",
|
||||||
isAvailable: window => {
|
isAvailable: window => {
|
||||||
@@ -82,12 +86,12 @@ const globalActionsTemplate = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Open Space Routing",
|
l10nId: "zen-action-open-space-routing",
|
||||||
command: "cmd_zenOpenSpaceRoutingSettings",
|
command: "cmd_zenOpenSpaceRoutingSettings",
|
||||||
icon: "chrome://browser/skin/zen-icons/selectable/airplane.svg",
|
icon: "chrome://browser/skin/zen-icons/selectable/airplane.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "New Boost",
|
l10nId: "zen-action-new-boost",
|
||||||
icon: "chrome://browser/skin/zen-icons/boost.svg",
|
icon: "chrome://browser/skin/zen-icons/boost.svg",
|
||||||
isAvailable: window => {
|
isAvailable: window => {
|
||||||
if (!isNotEmptyTab(window)) {
|
if (!isNotEmptyTab(window)) {
|
||||||
@@ -130,7 +134,7 @@ const globalActionsTemplate = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Next Space",
|
l10nId: "zen-action-next-space",
|
||||||
command: "cmd_zenWorkspaceForward",
|
command: "cmd_zenWorkspaceForward",
|
||||||
icon: "chrome://browser/skin/zen-icons/forward.svg",
|
icon: "chrome://browser/skin/zen-icons/forward.svg",
|
||||||
isAvailable: window => {
|
isAvailable: window => {
|
||||||
@@ -138,7 +142,7 @@ const globalActionsTemplate = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Previous Space",
|
l10nId: "zen-action-previous-space",
|
||||||
command: "cmd_zenWorkspaceBackward",
|
command: "cmd_zenWorkspaceBackward",
|
||||||
icon: "chrome://browser/skin/zen-icons/back.svg",
|
icon: "chrome://browser/skin/zen-icons/back.svg",
|
||||||
isAvailable: window => {
|
isAvailable: window => {
|
||||||
@@ -147,7 +151,7 @@ const globalActionsTemplate = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Close Tab",
|
l10nId: "zen-action-close-tab",
|
||||||
command: "cmd_close",
|
command: "cmd_close",
|
||||||
icon: "chrome://browser/skin/zen-icons/close.svg",
|
icon: "chrome://browser/skin/zen-icons/close.svg",
|
||||||
isAvailable: window => {
|
isAvailable: window => {
|
||||||
@@ -155,27 +159,27 @@ const globalActionsTemplate = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Reload Tab",
|
l10nId: "zen-action-reload-tab",
|
||||||
command: "Browser:Reload",
|
command: "Browser:Reload",
|
||||||
icon: "chrome://browser/skin/zen-icons/reload.svg",
|
icon: "chrome://browser/skin/zen-icons/reload.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Reload Tab Without Cache",
|
l10nId: "zen-action-reload-tab-without-cache",
|
||||||
command: "Browser:ReloadSkipCache",
|
command: "Browser:ReloadSkipCache",
|
||||||
icon: "chrome://browser/skin/zen-icons/reload.svg",
|
icon: "chrome://browser/skin/zen-icons/reload.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Next Tab",
|
l10nId: "zen-action-next-tab",
|
||||||
command: "Browser:NextTab",
|
command: "Browser:NextTab",
|
||||||
icon: "chrome://browser/skin/zen-icons/forward.svg",
|
icon: "chrome://browser/skin/zen-icons/forward.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Previous Tab",
|
l10nId: "zen-action-previous-tab",
|
||||||
command: "Browser:PrevTab",
|
command: "Browser:PrevTab",
|
||||||
icon: "chrome://browser/skin/zen-icons/back.svg",
|
icon: "chrome://browser/skin/zen-icons/back.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Capture Screenshot",
|
l10nId: "zen-action-capture-screenshot",
|
||||||
command: "Browser:Screenshot",
|
command: "Browser:Screenshot",
|
||||||
icon: "chrome://browser/skin/zen-icons/screenshot.svg",
|
icon: "chrome://browser/skin/zen-icons/screenshot.svg",
|
||||||
isAvailable: window => {
|
isAvailable: window => {
|
||||||
@@ -183,12 +187,12 @@ const globalActionsTemplate = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Toggle Tabs on right",
|
l10nId: "zen-action-toggle-tabs-on-right",
|
||||||
command: "cmd_zenToggleTabsOnRight",
|
command: "cmd_zenToggleTabsOnRight",
|
||||||
icon: "chrome://browser/skin/zen-icons/sidebars-right.svg",
|
icon: "chrome://browser/skin/zen-icons/sidebars-right.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Add to Essentials",
|
l10nId: "zen-action-add-to-essentials",
|
||||||
command: window =>
|
command: window =>
|
||||||
window.gZenPinnedTabManager.addToEssentials(window.gBrowser.selectedTab),
|
window.gZenPinnedTabManager.addToEssentials(window.gBrowser.selectedTab),
|
||||||
isAvailable: window => {
|
isAvailable: window => {
|
||||||
@@ -201,7 +205,7 @@ const globalActionsTemplate = [
|
|||||||
icon: "chrome://browser/skin/zen-icons/essential-add.svg",
|
icon: "chrome://browser/skin/zen-icons/essential-add.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Remove from Essentials",
|
l10nId: "zen-action-remove-from-essentials",
|
||||||
command: window =>
|
command: window =>
|
||||||
window.gZenPinnedTabManager.removeEssentials(window.gBrowser.selectedTab),
|
window.gZenPinnedTabManager.removeEssentials(window.gBrowser.selectedTab),
|
||||||
isAvailable: window =>
|
isAvailable: window =>
|
||||||
@@ -209,7 +213,7 @@ const globalActionsTemplate = [
|
|||||||
icon: "chrome://browser/skin/zen-icons/essential-remove.svg",
|
icon: "chrome://browser/skin/zen-icons/essential-remove.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Find in Page",
|
l10nId: "zen-action-find-in-page",
|
||||||
command: "cmd_find",
|
command: "cmd_find",
|
||||||
icon: "chrome://browser/skin/zen-icons/search-page.svg",
|
icon: "chrome://browser/skin/zen-icons/search-page.svg",
|
||||||
isAvailable: window => {
|
isAvailable: window => {
|
||||||
@@ -217,12 +221,12 @@ const globalActionsTemplate = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Manage Extensions",
|
l10nId: "zen-action-manage-extensions",
|
||||||
command: "Tools:Addons",
|
command: "Tools:Addons",
|
||||||
icon: "chrome://browser/skin/zen-icons/extension.svg",
|
icon: "chrome://browser/skin/zen-icons/extension.svg",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Switch to Automatic Appearance",
|
l10nId: "zen-action-switch-to-automatic-appearance",
|
||||||
command: () => Services.prefs.setIntPref("zen.view.window.scheme", 2),
|
command: () => Services.prefs.setIntPref("zen.view.window.scheme", 2),
|
||||||
icon: "chrome://browser/skin/zen-icons/sparkles.svg",
|
icon: "chrome://browser/skin/zen-icons/sparkles.svg",
|
||||||
isAvailable: () => {
|
isAvailable: () => {
|
||||||
@@ -230,7 +234,7 @@ const globalActionsTemplate = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Switch to Light Mode",
|
l10nId: "zen-action-switch-to-light-mode",
|
||||||
command: () => Services.prefs.setIntPref("zen.view.window.scheme", 1),
|
command: () => Services.prefs.setIntPref("zen.view.window.scheme", 1),
|
||||||
icon: "chrome://browser/skin/zen-icons/face-sun.svg",
|
icon: "chrome://browser/skin/zen-icons/face-sun.svg",
|
||||||
isAvailable: () => {
|
isAvailable: () => {
|
||||||
@@ -238,7 +242,7 @@ const globalActionsTemplate = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Switch to Dark Mode",
|
l10nId: "zen-action-switch-to-dark-mode",
|
||||||
command: () => Services.prefs.setIntPref("zen.view.window.scheme", 0),
|
command: () => Services.prefs.setIntPref("zen.view.window.scheme", 0),
|
||||||
icon: "chrome://browser/skin/zen-icons/moon-stars.svg",
|
icon: "chrome://browser/skin/zen-icons/moon-stars.svg",
|
||||||
isAvailable: () => {
|
isAvailable: () => {
|
||||||
@@ -246,7 +250,7 @@ const globalActionsTemplate = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Print",
|
l10nId: "zen-action-print",
|
||||||
command: "cmd_print",
|
command: "cmd_print",
|
||||||
icon: "chrome://browser/skin/zen-icons/print.svg",
|
icon: "chrome://browser/skin/zen-icons/print.svg",
|
||||||
isAvailable: window => {
|
isAvailable: window => {
|
||||||
@@ -266,7 +270,10 @@ export const globalActions = globalActionsTemplate.map(action => ({
|
|||||||
commandId:
|
commandId:
|
||||||
typeof action.command === "string"
|
typeof action.command === "string"
|
||||||
? action.command
|
? action.command
|
||||||
: `zen:global-action-${action.label.toLowerCase().replace(/\s+/g, "-")}`,
|
: `zen:global-action-${action.l10nId.replace("zen-action-", "")}`,
|
||||||
extraPayload: {},
|
extraPayload: {},
|
||||||
...action,
|
...action,
|
||||||
|
get label() {
|
||||||
|
return lazy.l10n.formatValueSync(action.l10nId);
|
||||||
|
},
|
||||||
}));
|
}));
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
"binaryName": "zen",
|
"binaryName": "zen",
|
||||||
"version": {
|
"version": {
|
||||||
"product": "firefox",
|
"product": "firefox",
|
||||||
"version": "152.0.4",
|
"version": "152.0.5",
|
||||||
"candidate": "152.0.4",
|
"candidate": "152.0.5",
|
||||||
"candidateBuild": 1
|
"candidateBuild": 1
|
||||||
},
|
},
|
||||||
"buildOptions": {
|
"buildOptions": {
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
"brandShortName": "Zen",
|
"brandShortName": "Zen",
|
||||||
"brandFullName": "Zen Browser",
|
"brandFullName": "Zen Browser",
|
||||||
"release": {
|
"release": {
|
||||||
"displayVersion": "1.21.5b",
|
"displayVersion": "1.21.6b",
|
||||||
"github": {
|
"github": {
|
||||||
"repo": "zen-browser/desktop"
|
"repo": "zen-browser/desktop"
|
||||||
},
|
},
|
||||||
@@ -54,4 +54,4 @@
|
|||||||
"licenseType": "MPL-2.0"
|
"licenseType": "MPL-2.0"
|
||||||
},
|
},
|
||||||
"updateHostname": "updates.zen-browser.app"
|
"updateHostname": "updates.zen-browser.app"
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user