mirror of
https://github.com/zen-browser/components.git
synced 2025-07-07 22:29:59 +02:00
Merge remote-tracking branch 'origin/main' into feature/rearrange-split-view
# Conflicts: # src/ZenViewSplitter.mjs
This commit is contained in:
commit
2ee7350abc
9 changed files with 403 additions and 389 deletions
|
@ -1,4 +1,3 @@
|
|||
|
||||
var gZenOperatingSystemCommonUtils = {
|
||||
kZenOSToSmallName: {
|
||||
WINNT: 'windows',
|
||||
|
@ -38,5 +37,11 @@ class ZenMultiWindowFeature {
|
|||
console.error(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ZenDOMOperatedFeature {
|
||||
constructor() {
|
||||
window.addEventListener('DOMContentLoaded', this.init.bind(this));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
|
||||
const lazyCompactMode = {};
|
||||
|
||||
XPCOMUtils.defineLazyPreferenceGetter(
|
||||
lazyCompactMode,
|
||||
"COMPACT_MODE_FLASH_DURATION",
|
||||
"zen.view.compact.toolbar-flash-popup.duration",
|
||||
'COMPACT_MODE_FLASH_DURATION',
|
||||
'zen.view.compact.toolbar-flash-popup.duration',
|
||||
800
|
||||
);
|
||||
|
||||
|
@ -43,7 +42,7 @@ var gZenCompactModeManager = {
|
|||
|
||||
get sidebar() {
|
||||
if (!this._sidebar) {
|
||||
this._sidebar= document.getElementById('navigator-toolbox');
|
||||
this._sidebar = document.getElementById('navigator-toolbox');
|
||||
}
|
||||
return this._sidebar;
|
||||
},
|
||||
|
@ -90,8 +89,9 @@ var gZenCompactModeManager = {
|
|||
},
|
||||
|
||||
updateContextMenu() {
|
||||
document.getElementById('zen-context-menu-compact-mode-toggle')
|
||||
.setAttribute('checked', Services.prefs.getBoolPref('zen.view.compact'));
|
||||
document
|
||||
.getElementById('zen-context-menu-compact-mode-toggle')
|
||||
.setAttribute('checked', Services.prefs.getBoolPref('zen.view.compact'));
|
||||
|
||||
const hideTabBar = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar');
|
||||
const hideToolbar = Services.prefs.getBoolPref('zen.view.compact.hide-toolbar');
|
||||
|
@ -104,14 +104,13 @@ var gZenCompactModeManager = {
|
|||
},
|
||||
|
||||
_disableTabsOnHoverIfConflict() {
|
||||
if (Services.prefs.getBoolPref('zen.view.compact')
|
||||
&& Services.prefs.getBoolPref('zen.view.compact.hide-tabbar')) {
|
||||
if (Services.prefs.getBoolPref('zen.view.compact') && Services.prefs.getBoolPref('zen.view.compact.hide-tabbar')) {
|
||||
Services.prefs.setBoolPref('zen.view.sidebar-expanded.on-hover', false);
|
||||
}
|
||||
},
|
||||
|
||||
toggle() {
|
||||
return this.preference = !this.prefefence;
|
||||
return (this.preference = !this.prefefence);
|
||||
},
|
||||
|
||||
_updateSidebarIsOnRight() {
|
||||
|
@ -133,12 +132,12 @@ var gZenCompactModeManager = {
|
|||
return [
|
||||
{
|
||||
element: this.sidebar,
|
||||
screenEdge: this.sidebarIsOnRight ? "right" : "left",
|
||||
screenEdge: this.sidebarIsOnRight ? 'right' : 'left',
|
||||
},
|
||||
{
|
||||
element: document.getElementById('zen-appcontent-navbar-container'),
|
||||
screenEdge:"top",
|
||||
}
|
||||
screenEdge: 'top',
|
||||
},
|
||||
];
|
||||
},
|
||||
|
||||
|
@ -181,7 +180,7 @@ var gZenCompactModeManager = {
|
|||
|
||||
target.addEventListener('mouseleave', (event) => {
|
||||
if (this.hoverableElements[i].keepHoverDuration) {
|
||||
this.flashElement(target, keepHoverDuration, "has-hover" + target.id, 'zen-has-hover');
|
||||
this.flashElement(target, keepHoverDuration, 'has-hover' + target.id, 'zen-has-hover');
|
||||
} else {
|
||||
this._removeHoverFrames[target.id] = window.requestAnimationFrame(() => target.removeAttribute('zen-has-hover'));
|
||||
}
|
||||
|
@ -194,18 +193,22 @@ var gZenCompactModeManager = {
|
|||
for (let entry of this.hoverableElements) {
|
||||
if (screenEdgeCrossed !== entry.screenEdge) continue;
|
||||
const target = entry.element;
|
||||
const boundAxis = (entry.screenEdge === "right" || entry.screenEdge === "left" ? "y" : "x");
|
||||
const boundAxis = entry.screenEdge === 'right' || entry.screenEdge === 'left' ? 'y' : 'x';
|
||||
if (!this._positionInBounds(boundAxis, target, event.pageX, event.pageY, 7)) {
|
||||
continue;
|
||||
}
|
||||
window.cancelAnimationFrame(this._removeHoverFrames[target.id]);
|
||||
|
||||
this.flashElement(target, this.hideAfterHoverDuration, "has-hover" + target.id, 'zen-has-hover');
|
||||
document.addEventListener('mousemove', () => {
|
||||
if (target.matches(':hover')) return;
|
||||
target.removeAttribute('zen-has-hover');
|
||||
this.clearFlashTimeout('has-hover' + target.id);
|
||||
}, {once: true});
|
||||
this.flashElement(target, this.hideAfterHoverDuration, 'has-hover' + target.id, 'zen-has-hover');
|
||||
document.addEventListener(
|
||||
'mousemove',
|
||||
() => {
|
||||
if (target.matches(':hover')) return;
|
||||
target.removeAttribute('zen-has-hover');
|
||||
this.clearFlashTimeout('has-hover' + target.id);
|
||||
},
|
||||
{ once: true }
|
||||
);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
@ -214,15 +217,15 @@ var gZenCompactModeManager = {
|
|||
const targetBox = element.getBoundingClientRect();
|
||||
posX = Math.max(targetBox.left, Math.min(posX, targetBox.right));
|
||||
posY = Math.max(targetBox.top, Math.min(posY, targetBox.bottom));
|
||||
return ["top", "bottom", "left", "right"].find((edge, i) => {
|
||||
return ['top', 'bottom', 'left', 'right'].find((edge, i) => {
|
||||
const distance = Math.abs((i < 2 ? posY : posX) - targetBox[edge]);
|
||||
return distance <= maxDistance;
|
||||
});
|
||||
},
|
||||
|
||||
_positionInBounds(axis = "x", element, x, y, error = 0) {
|
||||
_positionInBounds(axis = 'x', element, x, y, error = 0) {
|
||||
const bBox = element.getBoundingClientRect();
|
||||
if (axis === "y") return bBox.top - error < y && y < bBox.bottom + error;
|
||||
if (axis === 'y') return bBox.top - error < y && y < bBox.bottom + error;
|
||||
else return bBox.left - error < x && x < bBox.right + error;
|
||||
},
|
||||
|
||||
|
@ -230,4 +233,4 @@ var gZenCompactModeManager = {
|
|||
let toolbar = document.getElementById('zen-appcontent-navbar-container');
|
||||
toolbar.toggleAttribute('zen-user-show');
|
||||
},
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
const KEYCODE_MAP = {
|
||||
F1: 'VK_F1',
|
||||
F2: 'VK_F2',
|
||||
|
@ -26,75 +25,75 @@ const KEYCODE_MAP = {
|
|||
|
||||
const defaultKeyboardGroups = {
|
||||
windowAndTabManagement: [
|
||||
"zen-window-new-shortcut",
|
||||
"zen-tab-new-shortcut",
|
||||
"zen-key-enter-full-screen",
|
||||
"zen-key-exit-full-screen",
|
||||
"zen-quit-app-shortcut",
|
||||
"zen-close-tab-shortcut",
|
||||
"zen-close-shortcut",
|
||||
"id:key_selectTab1",
|
||||
"id:key_selectTab2",
|
||||
"id:key_selectTab3",
|
||||
"id:key_selectTab4",
|
||||
"id:key_selectTab5",
|
||||
"id:key_selectTab6",
|
||||
"id:key_selectTab7",
|
||||
"id:key_selectTab8",
|
||||
"id:key_selectLastTab",
|
||||
'zen-window-new-shortcut',
|
||||
'zen-tab-new-shortcut',
|
||||
'zen-key-enter-full-screen',
|
||||
'zen-key-exit-full-screen',
|
||||
'zen-quit-app-shortcut',
|
||||
'zen-close-tab-shortcut',
|
||||
'zen-close-shortcut',
|
||||
'id:key_selectTab1',
|
||||
'id:key_selectTab2',
|
||||
'id:key_selectTab3',
|
||||
'id:key_selectTab4',
|
||||
'id:key_selectTab5',
|
||||
'id:key_selectTab6',
|
||||
'id:key_selectTab7',
|
||||
'id:key_selectTab8',
|
||||
'id:key_selectLastTab',
|
||||
],
|
||||
navigation: [
|
||||
"zen-nav-back-shortcut-alt",
|
||||
"zen-nav-fwd-shortcut-alt",
|
||||
"zen-nav-reload-shortcut-2",
|
||||
"zen-nav-reload-shortcut-skip-cache",
|
||||
"zen-nav-reload-shortcut",
|
||||
"zen-key-stop",
|
||||
"zen-window-new-shortcut",
|
||||
"zen-private-browsing-shortcut",
|
||||
"id:goHome",
|
||||
"id:key_gotoHistory",
|
||||
"id:goBackKb",
|
||||
"id:goForwardKb",
|
||||
'zen-nav-back-shortcut-alt',
|
||||
'zen-nav-fwd-shortcut-alt',
|
||||
'zen-nav-reload-shortcut-2',
|
||||
'zen-nav-reload-shortcut-skip-cache',
|
||||
'zen-nav-reload-shortcut',
|
||||
'zen-key-stop',
|
||||
'zen-window-new-shortcut',
|
||||
'zen-private-browsing-shortcut',
|
||||
'id:goHome',
|
||||
'id:key_gotoHistory',
|
||||
'id:goBackKb',
|
||||
'id:goForwardKb',
|
||||
],
|
||||
searchAndFind: [
|
||||
"zen-search-focus-shortcut",
|
||||
"zen-search-focus-shortcut-alt",
|
||||
"zen-find-shortcut",
|
||||
"zen-search-find-again-shortcut-2",
|
||||
"zen-search-find-again-shortcut",
|
||||
"zen-search-find-again-shortcut-prev",
|
||||
'zen-search-focus-shortcut',
|
||||
'zen-search-focus-shortcut-alt',
|
||||
'zen-find-shortcut',
|
||||
'zen-search-find-again-shortcut-2',
|
||||
'zen-search-find-again-shortcut',
|
||||
'zen-search-find-again-shortcut-prev',
|
||||
],
|
||||
pageOperations: [
|
||||
"zen-location-open-shortcut",
|
||||
"zen-location-open-shortcut-alt",
|
||||
"zen-save-page-shortcut",
|
||||
"zen-print-shortcut",
|
||||
"zen-page-source-shortcut",
|
||||
"zen-page-info-shortcut",
|
||||
"zen-reader-mode-toggle-shortcut-other",
|
||||
"zen-picture-in-picture-toggle-shortcut"
|
||||
'zen-location-open-shortcut',
|
||||
'zen-location-open-shortcut-alt',
|
||||
'zen-save-page-shortcut',
|
||||
'zen-print-shortcut',
|
||||
'zen-page-source-shortcut',
|
||||
'zen-page-info-shortcut',
|
||||
'zen-reader-mode-toggle-shortcut-other',
|
||||
'zen-picture-in-picture-toggle-shortcut',
|
||||
],
|
||||
historyAndBookmarks: [
|
||||
"zen-history-show-all-shortcut",
|
||||
"zen-bookmark-this-page-shortcut",
|
||||
"zen-bookmark-show-library-shortcut"
|
||||
'zen-history-show-all-shortcut',
|
||||
'zen-bookmark-this-page-shortcut',
|
||||
'zen-bookmark-show-library-shortcut',
|
||||
],
|
||||
mediaAndDisplay: [
|
||||
"zen-mute-toggle-shortcut",
|
||||
"zen-full-zoom-reduce-shortcut",
|
||||
"zen-full-zoom-enlarge-shortcut",
|
||||
"zen-full-zoom-reset-shortcut",
|
||||
"zen-bidi-switch-direction-shortcut",
|
||||
"zen-screenshot-shortcut"
|
||||
'zen-mute-toggle-shortcut',
|
||||
'zen-full-zoom-reduce-shortcut',
|
||||
'zen-full-zoom-enlarge-shortcut',
|
||||
'zen-full-zoom-reset-shortcut',
|
||||
'zen-bidi-switch-direction-shortcut',
|
||||
'zen-screenshot-shortcut',
|
||||
],
|
||||
};
|
||||
|
||||
const fixedL10nIds = {
|
||||
cmd_findPrevious: 'zen-search-find-again-shortcut-prev',
|
||||
"Browser:ReloadSkipCache": "zen-nav-reload-shortcut-skip-cache",
|
||||
cmd_close: "zen-close-tab-shortcut",
|
||||
"History:RestoreLastClosedTabOrWindowOrSession": "zen-restore-last-closed-tab-shortcut",
|
||||
'Browser:ReloadSkipCache': 'zen-nav-reload-shortcut-skip-cache',
|
||||
cmd_close: 'zen-close-tab-shortcut',
|
||||
'History:RestoreLastClosedTabOrWindowOrSession': 'zen-restore-last-closed-tab-shortcut',
|
||||
};
|
||||
|
||||
const ZEN_COMPACT_MODE_SHORTCUTS_GROUP = 'zen-compact-mode';
|
||||
|
@ -103,10 +102,12 @@ const ZEN_OTHER_SHORTCUTS_GROUP = 'zen-other';
|
|||
const ZEN_SPLIT_VIEW_SHORTCUTS_GROUP = 'zen-split-view';
|
||||
const FIREFOX_SHORTCUTS_GROUP = 'zen-kbs-invalid';
|
||||
const VALID_SHORTCUT_GROUPS = [
|
||||
ZEN_COMPACT_MODE_SHORTCUTS_GROUP,
|
||||
ZEN_WORKSPACE_SHORTCUTS_GROUP,
|
||||
ZEN_COMPACT_MODE_SHORTCUTS_GROUP,
|
||||
ZEN_WORKSPACE_SHORTCUTS_GROUP,
|
||||
ZEN_SPLIT_VIEW_SHORTCUTS_GROUP,
|
||||
...Object.keys(defaultKeyboardGroups), ZEN_OTHER_SHORTCUTS_GROUP, 'other'
|
||||
...Object.keys(defaultKeyboardGroups),
|
||||
ZEN_OTHER_SHORTCUTS_GROUP,
|
||||
'other',
|
||||
];
|
||||
|
||||
class KeyShortcutModifiers {
|
||||
|
@ -159,7 +160,7 @@ class KeyShortcutModifiers {
|
|||
}
|
||||
|
||||
// used to avoid any future changes to the object
|
||||
static fromObject({ctrl = false, alt = false, shift = false, meta = false, accel = false}) {
|
||||
static fromObject({ ctrl = false, alt = false, shift = false, meta = false, accel = false }) {
|
||||
return new KeyShortcutModifiers(ctrl, alt, shift, meta, accel);
|
||||
}
|
||||
|
||||
|
@ -192,10 +193,9 @@ class KeyShortcutModifiers {
|
|||
this.#alt == other.#alt &&
|
||||
this.#shift == other.#shift &&
|
||||
this.#control == other.#control &&
|
||||
(AppConstants.platform == 'macosx' ?
|
||||
(this.#meta || this.#accel) == (other.#meta || other.#accel) :
|
||||
(this.#meta == other.#meta && this.#accel == other.#accel)
|
||||
)
|
||||
(AppConstants.platform == 'macosx'
|
||||
? (this.#meta || this.#accel) == (other.#meta || other.#accel)
|
||||
: this.#meta == other.#meta && this.#accel == other.#accel)
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -302,7 +302,7 @@ class KeyShortcut {
|
|||
// Find inside defaultKeyboardGroups
|
||||
for (let group of Object.keys(defaultKeyboardGroups)) {
|
||||
for (let shortcut of defaultKeyboardGroups[group]) {
|
||||
if (shortcut == l10nId || shortcut == "id:" + id) {
|
||||
if (shortcut == l10nId || shortcut == 'id:' + id) {
|
||||
return group;
|
||||
}
|
||||
}
|
||||
|
@ -472,12 +472,7 @@ class KeyShortcut {
|
|||
}
|
||||
|
||||
isUserEditable() {
|
||||
if (
|
||||
!this.#id ||
|
||||
this.#internal ||
|
||||
this.#reserved ||
|
||||
(this.#group == FIREFOX_SHORTCUTS_GROUP && this.#disabled)
|
||||
) {
|
||||
if (!this.#id || this.#internal || this.#reserved || (this.#group == FIREFOX_SHORTCUTS_GROUP && this.#disabled)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
@ -502,9 +497,7 @@ class KeyShortcut {
|
|||
}
|
||||
|
||||
class ZenKeyboardShortcutsLoader {
|
||||
|
||||
constructor() {
|
||||
}
|
||||
constructor() {}
|
||||
|
||||
get shortcutsFile() {
|
||||
return PathUtils.join(PathUtils.profileDir, 'zen-keyboard-shortcuts.json');
|
||||
|
@ -555,7 +548,7 @@ function zenGetDefaultShortcuts() {
|
|||
'C',
|
||||
'',
|
||||
ZEN_COMPACT_MODE_SHORTCUTS_GROUP,
|
||||
KeyShortcutModifiers.fromObject({accel: true, alt: true}),
|
||||
KeyShortcutModifiers.fromObject({ accel: true, alt: true }),
|
||||
'code:gZenCompactModeManager.toggle()',
|
||||
'zen-compact-mode-shortcut-toggle'
|
||||
)
|
||||
|
@ -566,7 +559,7 @@ function zenGetDefaultShortcuts() {
|
|||
'S',
|
||||
'',
|
||||
ZEN_COMPACT_MODE_SHORTCUTS_GROUP,
|
||||
KeyShortcutModifiers.fromObject({accel: true, alt: true}),
|
||||
KeyShortcutModifiers.fromObject({ accel: true, alt: true }),
|
||||
'code:gZenCompactModeManager.toggleSidebar()',
|
||||
'zen-compact-mode-shortcut-show-sidebar'
|
||||
)
|
||||
|
@ -577,7 +570,7 @@ function zenGetDefaultShortcuts() {
|
|||
'T',
|
||||
'',
|
||||
ZEN_COMPACT_MODE_SHORTCUTS_GROUP,
|
||||
KeyShortcutModifiers.fromObject({accel: true, alt: true}),
|
||||
KeyShortcutModifiers.fromObject({ accel: true, alt: true }),
|
||||
'code:gZenCompactModeManager.toggleToolbar()',
|
||||
'zen-compact-mode-shortcut-show-toolbar'
|
||||
)
|
||||
|
@ -603,7 +596,7 @@ function zenGetDefaultShortcuts() {
|
|||
'E',
|
||||
'',
|
||||
ZEN_WORKSPACE_SHORTCUTS_GROUP,
|
||||
KeyShortcutModifiers.fromObject({accel: true, alt: true}),
|
||||
KeyShortcutModifiers.fromObject({ accel: true, alt: true }),
|
||||
'code:ZenWorkspaces.changeWorkspaceShortcut()',
|
||||
'zen-workspace-shortcut-forward'
|
||||
)
|
||||
|
@ -614,7 +607,7 @@ function zenGetDefaultShortcuts() {
|
|||
'Q',
|
||||
'',
|
||||
ZEN_WORKSPACE_SHORTCUTS_GROUP,
|
||||
KeyShortcutModifiers.fromObject({accel: true, alt: true}),
|
||||
KeyShortcutModifiers.fromObject({ accel: true, alt: true }),
|
||||
'code:ZenWorkspaces.changeWorkspaceShortcut(-1)',
|
||||
'zen-workspace-shortcut-backward'
|
||||
)
|
||||
|
@ -627,7 +620,7 @@ function zenGetDefaultShortcuts() {
|
|||
'P',
|
||||
'',
|
||||
ZEN_OTHER_SHORTCUTS_GROUP,
|
||||
KeyShortcutModifiers.fromObject({alt: true}),
|
||||
KeyShortcutModifiers.fromObject({ alt: true }),
|
||||
'code:gZenBrowserManagerSidebar.toggle()',
|
||||
'zen-web-panel-shortcut-toggle'
|
||||
)
|
||||
|
@ -638,7 +631,7 @@ function zenGetDefaultShortcuts() {
|
|||
'B',
|
||||
'',
|
||||
ZEN_OTHER_SHORTCUTS_GROUP,
|
||||
KeyShortcutModifiers.fromObject({alt: true}),
|
||||
KeyShortcutModifiers.fromObject({ alt: true }),
|
||||
'code:gZenVerticalTabsManager.toggleExpand()',
|
||||
'zen-sidebar-shortcut-toggle'
|
||||
)
|
||||
|
@ -651,8 +644,8 @@ function zenGetDefaultShortcuts() {
|
|||
'G',
|
||||
'',
|
||||
ZEN_SPLIT_VIEW_SHORTCUTS_GROUP,
|
||||
KeyShortcutModifiers.fromObject({accel: true, alt: true}),
|
||||
'code:gZenViewSplitter.toggleShortcut(\'grid\')',
|
||||
KeyShortcutModifiers.fromObject({ accel: true, alt: true }),
|
||||
"code:gZenViewSplitter.toggleShortcut('grid')",
|
||||
'zen-split-view-shortcut-grid'
|
||||
)
|
||||
);
|
||||
|
@ -662,8 +655,8 @@ function zenGetDefaultShortcuts() {
|
|||
'V',
|
||||
'',
|
||||
ZEN_SPLIT_VIEW_SHORTCUTS_GROUP,
|
||||
KeyShortcutModifiers.fromObject({accel: true, alt: true}),
|
||||
'code:gZenViewSplitter.toggleShortcut(\'vsep\')',
|
||||
KeyShortcutModifiers.fromObject({ accel: true, alt: true }),
|
||||
"code:gZenViewSplitter.toggleShortcut('vsep')",
|
||||
'zen-split-view-shortcut-vertical'
|
||||
)
|
||||
);
|
||||
|
@ -673,8 +666,8 @@ function zenGetDefaultShortcuts() {
|
|||
'H',
|
||||
'',
|
||||
ZEN_SPLIT_VIEW_SHORTCUTS_GROUP,
|
||||
KeyShortcutModifiers.fromObject({accel: true, alt: true}),
|
||||
'code:gZenViewSplitter.toggleShortcut(\'hsep\')',
|
||||
KeyShortcutModifiers.fromObject({ accel: true, alt: true }),
|
||||
"code:gZenViewSplitter.toggleShortcut('hsep')",
|
||||
'zen-split-view-shortcut-horizontal'
|
||||
)
|
||||
);
|
||||
|
@ -684,8 +677,8 @@ function zenGetDefaultShortcuts() {
|
|||
'U',
|
||||
'',
|
||||
ZEN_SPLIT_VIEW_SHORTCUTS_GROUP,
|
||||
KeyShortcutModifiers.fromObject({accel: true, alt: true}),
|
||||
'code:gZenViewSplitter.toggleShortcut(\'unsplit\')',
|
||||
KeyShortcutModifiers.fromObject({ accel: true, alt: true }),
|
||||
"code:gZenViewSplitter.toggleShortcut('unsplit')",
|
||||
'zen-split-view-shortcut-unsplit'
|
||||
)
|
||||
);
|
||||
|
@ -696,8 +689,7 @@ function zenGetDefaultShortcuts() {
|
|||
class ZenKeyboardShortcutsVersioner {
|
||||
static LATEST_KBS_VERSION = 1;
|
||||
|
||||
constructor() {
|
||||
}
|
||||
constructor() {}
|
||||
|
||||
get version() {
|
||||
return Services.prefs.getIntPref('zen.keyboard.shortcuts.version', 0);
|
||||
|
@ -728,7 +720,12 @@ class ZenKeyboardShortcutsVersioner {
|
|||
|
||||
if (this.isVersionOutdated()) {
|
||||
const version = this.version;
|
||||
console.info('Zen CKS: Migrating shortcuts from version', version, 'to', ZenKeyboardShortcutsVersioner.LATEST_KBS_VERSION);
|
||||
console.info(
|
||||
'Zen CKS: Migrating shortcuts from version',
|
||||
version,
|
||||
'to',
|
||||
ZenKeyboardShortcutsVersioner.LATEST_KBS_VERSION
|
||||
);
|
||||
const newData = this.migrate(data, version);
|
||||
this.version = ZenKeyboardShortcutsVersioner.LATEST_KBS_VERSION;
|
||||
return newData;
|
||||
|
@ -766,7 +763,7 @@ var gZenKeyboardShortcutsManager = {
|
|||
},
|
||||
|
||||
async _loadSaved() {
|
||||
var innerLoad = async() => {
|
||||
var innerLoad = async () => {
|
||||
let data = await this.loader.load();
|
||||
if (!data || data.length == 0) {
|
||||
return zenGetDefaultShortcuts();
|
||||
|
@ -778,12 +775,10 @@ var gZenKeyboardShortcutsManager = {
|
|||
console.error('Zen CKS: Error parsing saved shortcuts. Resetting to defaults...', e);
|
||||
return zenGetDefaultShortcuts();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const loadedShortcuts = await innerLoad();
|
||||
this.versioner = new ZenKeyboardShortcutsVersioner(
|
||||
loadedShortcuts,
|
||||
);
|
||||
this.versioner = new ZenKeyboardShortcutsVersioner(loadedShortcuts);
|
||||
return loadedShortcuts;
|
||||
},
|
||||
|
||||
|
@ -881,7 +876,7 @@ var gZenKeyboardShortcutsManager = {
|
|||
}
|
||||
|
||||
if (targetShortcut.getModifiers().equals(modifiers) && targetShortcut.getKeyNameOrCode() == shortcut) {
|
||||
return true
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
var gZenBrowserManagerSidebar = {
|
||||
_sidebarElement: null,
|
||||
_currentPanel: null,
|
||||
_lastOpenedPanel: null,
|
||||
_hasChangedConfig: true,
|
||||
_splitterElement: null,
|
||||
_hSplitterElement: null,
|
||||
_hasRegisteredPinnedClickOutside: false,
|
||||
_isDragging: false,
|
||||
contextTab: null,
|
||||
sidebar: null,
|
||||
forwardButton: null,
|
||||
backButton: null,
|
||||
progressListener: null,
|
||||
class ZenBrowserManagerSidebar extends ZenDOMOperatedFeature {
|
||||
_sidebarElement = null;
|
||||
_currentPanel = null;
|
||||
_lastOpenedPanel = null;
|
||||
_hasChangedConfig = true;
|
||||
_splitterElement = null;
|
||||
_hSplitterElement = null;
|
||||
_hasRegisteredPinnedClickOutside = false;
|
||||
_isDragging = false;
|
||||
contextTab = null;
|
||||
sidebar = null;
|
||||
forwardButton = null;
|
||||
backButton = null;
|
||||
progressListener = null;
|
||||
|
||||
DEFAULT_MOBILE_USER_AGENT: 'Mozilla/5.0 (Android 12; Mobile; rv:129.0) Gecko/20100101 Firefox/131.0',
|
||||
MAX_SIDEBAR_PANELS: 9, // +1 for the add panel button
|
||||
MAX_RUNS: 3,
|
||||
DEFAULT_MOBILE_USER_AGENT = 'Mozilla/5.0 (Android 12; Mobile; rv:129.0) Gecko/20100101 Firefox/131.0';
|
||||
MAX_SIDEBAR_PANELS = 9; // +1 for the add panel button
|
||||
MAX_RUNS = 3;
|
||||
|
||||
init() {
|
||||
ChromeUtils.defineLazyGetter(this, 'sidebar', () => document.getElementById('zen-sidebar-web-panel'));
|
||||
|
@ -30,24 +30,21 @@ var gZenBrowserManagerSidebar = {
|
|||
this.listenForPrefChanges();
|
||||
this.insertIntoContextMenu();
|
||||
this.addPositioningListeners();
|
||||
},
|
||||
}
|
||||
|
||||
onlySafeWidthAndHeight() {
|
||||
const panel = document.getElementById('zen-sidebar-web-panel');
|
||||
const width = panel.style.width;
|
||||
const height = panel.style.height;
|
||||
panel.setAttribute('style', "");
|
||||
panel.setAttribute('style', '');
|
||||
panel.style.width = width;
|
||||
panel.style.height = height;
|
||||
},
|
||||
}
|
||||
|
||||
initProgressListener() {
|
||||
this.progressListener = {
|
||||
QueryInterface: ChromeUtils.generateQI([
|
||||
"nsIWebProgressListener",
|
||||
"nsISupportsWeakReference",
|
||||
]),
|
||||
onLocationChange: function(aWebProgress, aRequest, aLocation, aFlags) {
|
||||
this.progressListener = {
|
||||
QueryInterface: ChromeUtils.generateQI(['nsIWebProgressListener', 'nsISupportsWeakReference']),
|
||||
onLocationChange: function (aWebProgress, aRequest, aLocation, aFlags) {
|
||||
const browser = this._getCurrentBrowser();
|
||||
if (!browser) return;
|
||||
const forwardDisabled = this.forwardButton.hasAttribute('disabled');
|
||||
|
@ -68,8 +65,8 @@ var gZenBrowserManagerSidebar = {
|
|||
}
|
||||
}
|
||||
}.bind(gZenBrowserManagerSidebar),
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
get sidebarData() {
|
||||
let services = Services.prefs.getStringPref('zen.sidebar.data');
|
||||
|
@ -77,35 +74,36 @@ var gZenBrowserManagerSidebar = {
|
|||
return {};
|
||||
}
|
||||
return JSON.parse(services);
|
||||
},
|
||||
}
|
||||
|
||||
get shouldCloseOnBlur() {
|
||||
return Services.prefs.getBoolPref('zen.sidebar.close-on-blur');
|
||||
},
|
||||
}
|
||||
|
||||
listenForPrefChanges() {
|
||||
Services.prefs.addObserver('zen.sidebar.data', this.handleEvent.bind(this));
|
||||
Services.prefs.addObserver('zen.sidebar.enabled', this.handleEvent.bind(this));
|
||||
|
||||
this.handleEvent();
|
||||
},
|
||||
}
|
||||
|
||||
addPositioningListeners() {
|
||||
this.sidebar.querySelectorAll('.zen-sidebar-web-panel-splitter')
|
||||
.forEach(s => s.addEventListener('mousedown', this.handleSplitterMouseDown.bind(this)));
|
||||
this.sidebar
|
||||
.querySelectorAll('.zen-sidebar-web-panel-splitter')
|
||||
.forEach((s) => s.addEventListener('mousedown', this.handleSplitterMouseDown.bind(this)));
|
||||
this.sidebarHeader.addEventListener('mousedown', this.handleDragPanel.bind(this));
|
||||
window.addEventListener('resize', this.onWindowResize.bind(this));
|
||||
},
|
||||
}
|
||||
|
||||
handleSplitterMouseDown(mouseDownEvent) {
|
||||
if (this._isDragging) return
|
||||
if (this._isDragging) return;
|
||||
this._isDragging = true;
|
||||
|
||||
const isHorizontal = mouseDownEvent.target.getAttribute('orient') === 'horizontal';
|
||||
setCursor(isHorizontal ? 'n-resize' : 'ew-resize');
|
||||
const reverse = ['left', 'top'].includes(mouseDownEvent.target.getAttribute('side'));
|
||||
const direction = isHorizontal ? "height" : "width";
|
||||
const axis = isHorizontal ? "Y" : "X";
|
||||
const direction = isHorizontal ? 'height' : 'width';
|
||||
const axis = isHorizontal ? 'Y' : 'X';
|
||||
|
||||
const computedStyle = window.getComputedStyle(this.sidebar);
|
||||
const maxSize = parseInt(computedStyle.getPropertyValue(`max-${direction}`).match(/(\d+)px/)?.[1]) || Infinity;
|
||||
|
@ -115,7 +113,7 @@ var gZenBrowserManagerSidebar = {
|
|||
|
||||
const startPos = mouseDownEvent[`screen${axis}`];
|
||||
|
||||
const toAdjust = isHorizontal ? "top" : "left";
|
||||
const toAdjust = isHorizontal ? 'top' : 'left';
|
||||
const sidebarPosStart = parseInt(this.sidebar.style[toAdjust].match(/\d+/));
|
||||
|
||||
let mouseMove = function (e) {
|
||||
|
@ -128,29 +126,33 @@ var gZenBrowserManagerSidebar = {
|
|||
const wrapperBox = this.sidebarWrapper.getBoundingClientRect();
|
||||
let maxWrapperSize = Infinity;
|
||||
if (this.isFloating) {
|
||||
maxWrapperSize = reverse ? (sidebarPosStart + sidebarSizeStart) : (wrapperBox[direction] - sidebarPosStart);
|
||||
maxWrapperSize = reverse ? sidebarPosStart + sidebarSizeStart : wrapperBox[direction] - sidebarPosStart;
|
||||
}
|
||||
newSize = Math.max(minSize, Math.min(currentMax, maxWrapperSize,newSize));
|
||||
newSize = Math.max(minSize, Math.min(currentMax, maxWrapperSize, newSize));
|
||||
|
||||
window.requestAnimationFrame(() => {
|
||||
if (reverse) {
|
||||
const actualMoved = newSize - sidebarSizeStart;
|
||||
this.sidebar.style[toAdjust] = (sidebarPosStart - actualMoved) + 'px';
|
||||
this.sidebar.style[toAdjust] = sidebarPosStart - actualMoved + 'px';
|
||||
}
|
||||
this.sidebar.style[direction] = `${newSize}px`;
|
||||
});
|
||||
}.bind(this);
|
||||
|
||||
document.addEventListener('mousemove', mouseMove);
|
||||
document.addEventListener('mouseup', () => {
|
||||
document.removeEventListener('mousemove', mouseMove);
|
||||
this._isDragging = false;
|
||||
setCursor('auto');
|
||||
}, {once: true});
|
||||
},
|
||||
document.addEventListener(
|
||||
'mouseup',
|
||||
() => {
|
||||
document.removeEventListener('mousemove', mouseMove);
|
||||
this._isDragging = false;
|
||||
setCursor('auto');
|
||||
},
|
||||
{ once: true }
|
||||
);
|
||||
}
|
||||
|
||||
handleDragPanel(mouseDownEvent) {
|
||||
if (this.sidebarHeaderButtons.find(b => b.contains(mouseDownEvent.target))) {
|
||||
if (this.sidebarHeaderButtons.find((b) => b.contains(mouseDownEvent.target))) {
|
||||
return;
|
||||
}
|
||||
this._isDragging = true;
|
||||
|
@ -177,13 +179,16 @@ var gZenBrowserManagerSidebar = {
|
|||
});
|
||||
};
|
||||
|
||||
|
||||
document.addEventListener('mousemove', moveListener);
|
||||
document.addEventListener('mouseup', () => {
|
||||
document.removeEventListener('mousemove', moveListener);
|
||||
this._isDragging = false;
|
||||
}, {once: true});
|
||||
},
|
||||
document.addEventListener(
|
||||
'mouseup',
|
||||
() => {
|
||||
document.removeEventListener('mousemove', moveListener);
|
||||
this._isDragging = false;
|
||||
},
|
||||
{ once: true }
|
||||
);
|
||||
}
|
||||
|
||||
onWindowResize() {
|
||||
if (!this.isFloating) return;
|
||||
|
@ -193,16 +198,16 @@ var gZenBrowserManagerSidebar = {
|
|||
const sidebarRect = this.sidebar.getBoundingClientRect();
|
||||
|
||||
if (sidebarRect.height < wrapperRect.height && top + sidebarRect.height > wrapperRect.height) {
|
||||
this.sidebar.style.top = (wrapperRect.height - sidebarRect.height) + 'px';
|
||||
this.sidebar.style.top = wrapperRect.height - sidebarRect.height + 'px';
|
||||
}
|
||||
if (sidebarRect.width < wrapperRect.width && left + sidebarRect.width > wrapperRect.width) {
|
||||
this.sidebar.style.left = (wrapperRect.width - sidebarRect.width) + 'px';
|
||||
this.sidebar.style.left = wrapperRect.width - sidebarRect.width + 'px';
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
get isFloating() {
|
||||
return document.getElementById('zen-sidebar-web-panel').hasAttribute('pinned');
|
||||
},
|
||||
}
|
||||
|
||||
handleEvent() {
|
||||
this._hasChangedConfig = true;
|
||||
|
@ -229,7 +234,7 @@ var gZenBrowserManagerSidebar = {
|
|||
this._closeSidebarPanel();
|
||||
return;
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
_handleClickOutside(event) {
|
||||
let sidebar = document.getElementById('zen-sidebar-web-panel');
|
||||
|
@ -248,7 +253,7 @@ var gZenBrowserManagerSidebar = {
|
|||
return;
|
||||
}
|
||||
this.close();
|
||||
},
|
||||
}
|
||||
|
||||
toggle() {
|
||||
if (!this._currentPanel) {
|
||||
|
@ -259,20 +264,20 @@ var gZenBrowserManagerSidebar = {
|
|||
return;
|
||||
}
|
||||
this.close();
|
||||
},
|
||||
}
|
||||
|
||||
open() {
|
||||
let sidebar = document.getElementById('zen-sidebar-web-panel');
|
||||
sidebar.removeAttribute('hidden');
|
||||
this.update();
|
||||
},
|
||||
}
|
||||
|
||||
update() {
|
||||
this._updateWebPanels();
|
||||
this._updateSidebarButton();
|
||||
this._updateWebPanel();
|
||||
this._updateButtons();
|
||||
},
|
||||
}
|
||||
|
||||
_updateSidebarButton() {
|
||||
let button = document.getElementById('zen-sidepanel-button');
|
||||
|
@ -282,7 +287,7 @@ var gZenBrowserManagerSidebar = {
|
|||
} else {
|
||||
button.removeAttribute('open');
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
_updateWebPanels() {
|
||||
if (Services.prefs.getBoolPref('zen.sidebar.enabled')) {
|
||||
|
@ -322,7 +327,7 @@ var gZenBrowserManagerSidebar = {
|
|||
} else {
|
||||
addButton.setAttribute('hidden', 'true');
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
async _openAddPanelDialog() {
|
||||
let dialogURL = 'chrome://browser/content/places/zenNewWebPanel.xhtml';
|
||||
|
@ -334,26 +339,26 @@ var gZenBrowserManagerSidebar = {
|
|||
} else {
|
||||
aParentWindow.openDialog(dialogURL, '', features, {});
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
_setPinnedToElements() {
|
||||
let sidebar = document.getElementById('zen-sidebar-web-panel');
|
||||
sidebar.setAttribute('pinned', 'true');
|
||||
document.getElementById('zen-sidebar-web-panel-pinned').setAttribute('pinned', 'true');
|
||||
},
|
||||
}
|
||||
|
||||
_removePinnedFromElements() {
|
||||
let sidebar = document.getElementById('zen-sidebar-web-panel');
|
||||
sidebar.removeAttribute('pinned');
|
||||
document.getElementById('zen-sidebar-web-panel-pinned').removeAttribute('pinned');
|
||||
},
|
||||
}
|
||||
|
||||
_closeSidebarPanel() {
|
||||
let sidebar = document.getElementById('zen-sidebar-web-panel');
|
||||
sidebar.setAttribute('hidden', 'true');
|
||||
this._lastOpenedPanel = this._currentPanel;
|
||||
this._currentPanel = null;
|
||||
},
|
||||
}
|
||||
|
||||
_handleClick(event) {
|
||||
let target = event.target;
|
||||
|
@ -363,7 +368,7 @@ var gZenBrowserManagerSidebar = {
|
|||
}
|
||||
this._currentPanel = panelId;
|
||||
this._updateWebPanel();
|
||||
},
|
||||
}
|
||||
|
||||
_handleDragStart(event) {
|
||||
this.__dragingElement = event.target;
|
||||
|
@ -373,9 +378,9 @@ var gZenBrowserManagerSidebar = {
|
|||
event.dataTransfer.effectAllowed = 'move';
|
||||
event.dataTransfer.setData('text/html', event.target.innerHTML);
|
||||
event.dataTransfer.setData('text/plain', event.target.id);
|
||||
},
|
||||
}
|
||||
|
||||
_handleDragOver(event) {},
|
||||
_handleDragOver(event) {}
|
||||
|
||||
_handleDragEnter(event) {
|
||||
if (typeof this.__dragingElement === 'undefined') {
|
||||
|
@ -389,7 +394,7 @@ var gZenBrowserManagerSidebar = {
|
|||
}
|
||||
target.after(this.__dragingElement);
|
||||
this.__dragingIndex = elIndex + 1;
|
||||
},
|
||||
}
|
||||
|
||||
_handleDragEnd(event) {
|
||||
event.target.style.opacity = '1';
|
||||
|
@ -405,7 +410,7 @@ var gZenBrowserManagerSidebar = {
|
|||
this._currentPanel = this.__dragingElement.getAttribute('zen-sidebar-id');
|
||||
this.open();
|
||||
this.__dragingElement = undefined;
|
||||
},
|
||||
}
|
||||
|
||||
_createNewPanel(url) {
|
||||
let data = this.sidebarData;
|
||||
|
@ -418,7 +423,7 @@ var gZenBrowserManagerSidebar = {
|
|||
Services.prefs.setStringPref('zen.sidebar.data', JSON.stringify(data));
|
||||
this._currentPanel = newName;
|
||||
this.open();
|
||||
},
|
||||
}
|
||||
|
||||
_updateButtons() {
|
||||
for (let button of this.sidebarElement.querySelectorAll('.zen-sidebar-panel-button')) {
|
||||
|
@ -428,7 +433,7 @@ var gZenBrowserManagerSidebar = {
|
|||
button.removeAttribute('selected');
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
_hideAllWebPanels() {
|
||||
let sidebar = document.getElementById('zen-sidebar-web-panel');
|
||||
|
@ -436,11 +441,11 @@ var gZenBrowserManagerSidebar = {
|
|||
browser.setAttribute('hidden', 'true');
|
||||
browser.docShellIsActive = false;
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
get introductionPanel() {
|
||||
return document.getElementById('zen-sidebar-introduction-panel');
|
||||
},
|
||||
}
|
||||
|
||||
_updateWebPanel() {
|
||||
this._updateButtons();
|
||||
|
@ -470,7 +475,7 @@ var gZenBrowserManagerSidebar = {
|
|||
browser.reload();
|
||||
}
|
||||
browser.docShellIsActive = true;
|
||||
},
|
||||
}
|
||||
|
||||
_getWebPanelData(id) {
|
||||
let data = this.sidebarData;
|
||||
|
@ -482,7 +487,7 @@ var gZenBrowserManagerSidebar = {
|
|||
id: id,
|
||||
...panel,
|
||||
};
|
||||
},
|
||||
}
|
||||
|
||||
_createWebPanelBrowser(data) {
|
||||
const titleContainer = document.getElementById('zen-sidebar-web-panel-title');
|
||||
|
@ -512,7 +517,7 @@ var gZenBrowserManagerSidebar = {
|
|||
}.bind(this)
|
||||
);
|
||||
return browser;
|
||||
},
|
||||
}
|
||||
|
||||
_getWebPanelIcon(url, element) {
|
||||
let { preferredURI } = Services.uriFixup.getFixupURIInfo(url);
|
||||
|
@ -527,50 +532,50 @@ var gZenBrowserManagerSidebar = {
|
|||
reader.readAsDataURL(blob);
|
||||
}
|
||||
});
|
||||
},
|
||||
}
|
||||
|
||||
_getBrowserById(id) {
|
||||
let sidebar = document.getElementById('zen-sidebar-web-panel');
|
||||
return sidebar.querySelector(`browser[zen-sidebar-id="${id}"]`);
|
||||
},
|
||||
}
|
||||
|
||||
_getCurrentBrowser() {
|
||||
return this._getBrowserById(this._currentPanel);
|
||||
},
|
||||
}
|
||||
|
||||
reload() {
|
||||
let browser = this._getCurrentBrowser();
|
||||
if (browser) {
|
||||
browser.reload();
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
forward() {
|
||||
let browser = this._getCurrentBrowser();
|
||||
if (browser) {
|
||||
browser.goForward();
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
back() {
|
||||
let browser = this._getCurrentBrowser();
|
||||
if (browser) {
|
||||
browser.goBack();
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
home() {
|
||||
let browser = this._getCurrentBrowser();
|
||||
if (browser) {
|
||||
browser.gotoIndex();
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
close() {
|
||||
this._hideAllWebPanels();
|
||||
this._closeSidebarPanel();
|
||||
this._updateSidebarButton();
|
||||
},
|
||||
}
|
||||
|
||||
togglePinned(elem) {
|
||||
let sidebar = document.getElementById('zen-sidebar-web-panel');
|
||||
|
@ -580,49 +585,49 @@ var gZenBrowserManagerSidebar = {
|
|||
this._setPinnedToElements();
|
||||
}
|
||||
this.update();
|
||||
},
|
||||
}
|
||||
|
||||
get sidebarElement() {
|
||||
if (!this._sidebarElement) {
|
||||
this._sidebarElement = document.getElementById('zen-sidebar-panels-sites');
|
||||
}
|
||||
return this._sidebarElement;
|
||||
},
|
||||
}
|
||||
|
||||
get splitterElement() {
|
||||
if (!this._splitterElement) {
|
||||
this._splitterElement = document.getElementById('zen-sidebar-web-panel-splitter');
|
||||
}
|
||||
return this._splitterElement;
|
||||
},
|
||||
}
|
||||
|
||||
get hSplitterElement() {
|
||||
if (!this._hSplitterElement) {
|
||||
this._hSplitterElement = document.getElementById('zen-sidebar-web-panel-hsplitter');
|
||||
}
|
||||
return this._hSplitterElement;
|
||||
},
|
||||
}
|
||||
|
||||
get sidebarHeader() {
|
||||
if (!this._sidebarHeader) {
|
||||
this._sidebarHeader = document.getElementById('zen-sidebar-web-header');
|
||||
}
|
||||
return this._sidebarHeader;
|
||||
},
|
||||
}
|
||||
|
||||
get sidebarWrapper() {
|
||||
if (!this._sideBarWrapper) {
|
||||
this._sideBarWrapper = document.getElementById('zen-sidebar-web-panel-wrapper');
|
||||
this._sideBarWrapper = document.getElementById('zen-sidebar-web-panel-wrapper');
|
||||
}
|
||||
return this._sideBarWrapper;
|
||||
},
|
||||
}
|
||||
|
||||
get sidebarHeaderButtons() {
|
||||
if (!this._sidebarHeaderButtons) {
|
||||
this._sidebarHeaderButtons = [...this.sidebarHeader.querySelectorAll('.toolbarbutton-1')];
|
||||
}
|
||||
return this._sidebarHeaderButtons;
|
||||
},
|
||||
}
|
||||
|
||||
// Context menu
|
||||
|
||||
|
@ -656,7 +661,7 @@ var gZenBrowserManagerSidebar = {
|
|||
} else {
|
||||
document.getElementById('context_zenUnloadWebPanel').removeAttribute('disabled');
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
contextOpenNewTab() {
|
||||
let browser = this._getBrowserById(this.contextTab);
|
||||
|
@ -665,7 +670,7 @@ var gZenBrowserManagerSidebar = {
|
|||
let url = browser == null ? panel.url : browser.currentURI.spec;
|
||||
gZenUIManager.openAndChangeToTab(url);
|
||||
this.close();
|
||||
},
|
||||
}
|
||||
|
||||
contextToggleMuteAudio() {
|
||||
let browser = this._getBrowserById(this.contextTab);
|
||||
|
@ -674,7 +679,7 @@ var gZenBrowserManagerSidebar = {
|
|||
} else {
|
||||
browser.mute();
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
contextToggleUserAgent() {
|
||||
let browser = this._getBrowserById(this.contextTab);
|
||||
|
@ -683,7 +688,7 @@ var gZenBrowserManagerSidebar = {
|
|||
data.data[this.contextTab].ua = !data.data[this.contextTab].ua;
|
||||
Services.prefs.setStringPref('zen.sidebar.data', JSON.stringify(data));
|
||||
browser.reload();
|
||||
},
|
||||
}
|
||||
|
||||
contextDelete() {
|
||||
let data = this.sidebarData;
|
||||
|
@ -698,7 +703,7 @@ var gZenBrowserManagerSidebar = {
|
|||
this._lastOpenedPanel = null;
|
||||
this.update();
|
||||
Services.prefs.setStringPref('zen.sidebar.data', JSON.stringify(data));
|
||||
},
|
||||
}
|
||||
|
||||
contextUnload() {
|
||||
let browser = this._getBrowserById(this.contextTab);
|
||||
|
@ -707,7 +712,7 @@ var gZenBrowserManagerSidebar = {
|
|||
this._closeSidebarPanel();
|
||||
this.close();
|
||||
this._lastOpenedPanel = null;
|
||||
},
|
||||
}
|
||||
|
||||
insertIntoContextMenu() {
|
||||
const sibling = document.getElementById('context-stripOnShareLink');
|
||||
|
@ -717,12 +722,12 @@ var gZenBrowserManagerSidebar = {
|
|||
menuitem.setAttribute('oncommand', 'gZenBrowserManagerSidebar.addPanelFromContextMenu();');
|
||||
menuitem.setAttribute('data-l10n-id', 'zen-web-side-panel-context-add-to-panel');
|
||||
sibling.insertAdjacentElement('afterend', menuitem);
|
||||
},
|
||||
}
|
||||
|
||||
addPanelFromContextMenu() {
|
||||
const url = gContextMenu.linkURL || gContextMenu.target.ownerDocument.location.href;
|
||||
this._createNewPanel(url);
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
gZenBrowserManagerSidebar.init();
|
||||
window.gZenBrowserManagerSidebar = new ZenBrowserManagerSidebar();
|
||||
|
|
|
@ -1,52 +1,36 @@
|
|||
|
||||
{
|
||||
const lazy = {};
|
||||
|
||||
XPCOMUtils.defineLazyPreferenceGetter(
|
||||
lazy,
|
||||
"zenTabUnloaderEnabled",
|
||||
"zen.tab-unloader.enabled",
|
||||
false
|
||||
);
|
||||
XPCOMUtils.defineLazyPreferenceGetter(lazy, 'zenTabUnloaderEnabled', 'zen.tab-unloader.enabled', false);
|
||||
|
||||
XPCOMUtils.defineLazyPreferenceGetter(
|
||||
lazy,
|
||||
"zenTabUnloaderTimeout",
|
||||
"zen.tab-unloader.timeout-minutes",
|
||||
20
|
||||
);
|
||||
XPCOMUtils.defineLazyPreferenceGetter(lazy, 'zenTabUnloaderTimeout', 'zen.tab-unloader.timeout-minutes', 20);
|
||||
|
||||
XPCOMUtils.defineLazyPreferenceGetter(
|
||||
lazy,
|
||||
"zenTabUnloaderExcludedUrls",
|
||||
"zen.tab-unloader.excluded-urls",
|
||||
""
|
||||
);
|
||||
XPCOMUtils.defineLazyPreferenceGetter(lazy, 'zenTabUnloaderExcludedUrls', 'zen.tab-unloader.excluded-urls', '');
|
||||
|
||||
const ZEN_TAB_UNLOADER_DEFAULT_EXCLUDED_URLS = [
|
||||
"^about:",
|
||||
"^chrome:",
|
||||
"^devtools:",
|
||||
"^file:",
|
||||
"^resource:",
|
||||
"^view-source:",
|
||||
"^view-image:",
|
||||
'^about:',
|
||||
'^chrome:',
|
||||
'^devtools:',
|
||||
'^file:',
|
||||
'^resource:',
|
||||
'^view-source:',
|
||||
'^view-image:',
|
||||
];
|
||||
|
||||
class ZenTabsObserver {
|
||||
static ALL_EVENTS = [
|
||||
"TabAttrModified",
|
||||
"TabPinned",
|
||||
"TabUnpinned",
|
||||
"TabBrowserInserted",
|
||||
"TabBrowserDiscarded",
|
||||
"TabShow",
|
||||
"TabHide",
|
||||
"TabOpen",
|
||||
"TabClose",
|
||||
"TabSelect",
|
||||
"TabMultiSelect",
|
||||
]
|
||||
'TabAttrModified',
|
||||
'TabPinned',
|
||||
'TabUnpinned',
|
||||
'TabBrowserInserted',
|
||||
'TabBrowserDiscarded',
|
||||
'TabShow',
|
||||
'TabHide',
|
||||
'TabOpen',
|
||||
'TabClose',
|
||||
'TabSelect',
|
||||
'TabMultiSelect',
|
||||
];
|
||||
|
||||
#listeners = [];
|
||||
|
||||
|
@ -59,7 +43,7 @@
|
|||
for (const event of ZenTabsObserver.ALL_EVENTS) {
|
||||
window.addEventListener(event, eventListener);
|
||||
}
|
||||
window.addEventListener("unload", () => {
|
||||
window.addEventListener('unload', () => {
|
||||
for (const event of ZenTabsObserver.ALL_EVENTS) {
|
||||
window.removeEventListener(event, eventListener);
|
||||
}
|
||||
|
@ -79,7 +63,7 @@
|
|||
|
||||
class ZenTabsIntervalUnloader {
|
||||
static INTERVAL = 1000 * 60; // 1 minute
|
||||
|
||||
|
||||
interval = null;
|
||||
unloader = null;
|
||||
|
||||
|
@ -95,7 +79,7 @@
|
|||
get lazyExcludeUrls() {
|
||||
return [
|
||||
...ZEN_TAB_UNLOADER_DEFAULT_EXCLUDED_URLS,
|
||||
...lazy.zenTabUnloaderExcludedUrls.split(",").map(url => url.trim())
|
||||
...lazy.zenTabUnloaderExcludedUrls.split(',').map((url) => url.trim()),
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -103,24 +87,24 @@
|
|||
if (a === b) return true;
|
||||
if (a == null || b == null) return false;
|
||||
if (a.length !== b.length) return false;
|
||||
|
||||
|
||||
// If you don't care about the order of the elements inside
|
||||
// the array, you should sort both arrays here.
|
||||
// Please note that calling sort on an array will modify that array.
|
||||
// you might want to clone your array first.
|
||||
|
||||
|
||||
for (var i = 0; i < a.length; ++i) {
|
||||
if (a[i] !== b[i]) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
get excludedUrls() {
|
||||
// Check if excludedrls is the same as the pref value
|
||||
const excludedUrls = this.lazyExcludeUrls;
|
||||
if (!this.arraysEqual(this.#excludedUrls, excludedUrls) || !this.#compiledExcludedUrls.length) {
|
||||
this.#excludedUrls = excludedUrls;
|
||||
this.#compiledExcludedUrls = excludedUrls.map(url => new RegExp(url));
|
||||
this.#compiledExcludedUrls = excludedUrls.map((url) => new RegExp(url));
|
||||
}
|
||||
return this.#compiledExcludedUrls;
|
||||
}
|
||||
|
@ -136,16 +120,10 @@
|
|||
}
|
||||
}
|
||||
|
||||
class ZenTabUnloader extends ZenDOMOperatedFeature {
|
||||
static ACTIVITY_MODIFIERS = ['muted', 'soundplaying', 'label', 'attention'];
|
||||
|
||||
class ZenTabUnloader {
|
||||
static ACTIVITY_MODIFIERS = [
|
||||
"muted",
|
||||
"soundplaying",
|
||||
"label",
|
||||
"attention",
|
||||
]
|
||||
|
||||
constructor() {
|
||||
init() {
|
||||
if (!lazy.zenTabUnloaderEnabled) {
|
||||
return;
|
||||
}
|
||||
|
@ -158,28 +136,28 @@
|
|||
onTabEvent(action, event) {
|
||||
const tab = event.target;
|
||||
switch (action) {
|
||||
case "TabPinned":
|
||||
case "TabUnpinned":
|
||||
case "TabBrowserInserted":
|
||||
case "TabBrowserDiscarded":
|
||||
case "TabShow":
|
||||
case "TabHide":
|
||||
case 'TabPinned':
|
||||
case 'TabUnpinned':
|
||||
case 'TabBrowserInserted':
|
||||
case 'TabBrowserDiscarded':
|
||||
case 'TabShow':
|
||||
case 'TabHide':
|
||||
break;
|
||||
case "TabAttrModified":
|
||||
case 'TabAttrModified':
|
||||
this.handleTabAttrModified(tab, event);
|
||||
break;
|
||||
case "TabOpen":
|
||||
case 'TabOpen':
|
||||
this.handleTabOpen(tab);
|
||||
break;
|
||||
case "TabClose":
|
||||
case 'TabClose':
|
||||
this.handleTabClose(tab);
|
||||
break;
|
||||
case "TabSelect":
|
||||
case "TabMultiSelect":
|
||||
case 'TabSelect':
|
||||
case 'TabMultiSelect':
|
||||
this.updateTabActivity(tab);
|
||||
break;
|
||||
default:
|
||||
console.warn("ZenTabUnloader: Unhandled tab event", action);
|
||||
console.warn('ZenTabUnloader: Unhandled tab event', action);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -260,11 +238,19 @@
|
|||
}
|
||||
|
||||
canUnloadTab(tab, currentTimestamp, excludedUrls) {
|
||||
if (tab.pinned || tab.selected || tab.multiselected
|
||||
|| tab.hasAttribute("busy") || tab.hasAttribute("pending")
|
||||
|| !tab.linkedPanel || tab.splitView || tab.attention || tab.soundPlaying
|
||||
|| tab.zenIgnoreUnload
|
||||
|| excludedUrls.some(url => url.test(tab.linkedBrowser.currentURI.spec))) {
|
||||
if (
|
||||
tab.pinned ||
|
||||
tab.selected ||
|
||||
tab.multiselected ||
|
||||
tab.hasAttribute('busy') ||
|
||||
tab.hasAttribute('pending') ||
|
||||
!tab.linkedPanel ||
|
||||
tab.splitView ||
|
||||
tab.attention ||
|
||||
tab.soundPlaying ||
|
||||
tab.zenIgnoreUnload ||
|
||||
excludedUrls.some((url) => url.test(tab.linkedBrowser.currentURI.spec))
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
const lastActivity = tab.lastActivity;
|
||||
|
@ -276,6 +262,6 @@
|
|||
return diff > lazy.zenTabUnloaderTimeout * 60 * 1000;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
window.gZenTabUnloader = new ZenTabUnloader();
|
||||
}
|
||||
|
|
|
@ -69,7 +69,9 @@ var ZenThemesCommon = {
|
|||
return newThemePreferences;
|
||||
}
|
||||
|
||||
return preferences.filter(({ disabledOn = [] }) => !disabledOn.includes(gZenOperatingSystemCommonUtils.currentOperatingSystem));
|
||||
return preferences.filter(
|
||||
({ disabledOn = [] }) => !disabledOn.includes(gZenOperatingSystemCommonUtils.currentOperatingSystem)
|
||||
);
|
||||
},
|
||||
|
||||
throttle(mainFunction, delay) {
|
||||
|
|
|
@ -49,24 +49,26 @@ class SplitLeafNode {
|
|||
this.heightInParent = heightInParent;
|
||||
}
|
||||
}
|
||||
var gZenViewSplitter = new class {
|
||||
constructor() {
|
||||
this._data = [];
|
||||
this.currentView = -1;
|
||||
this._tabBrowserPanel = null;
|
||||
this.__modifierElement = null;
|
||||
this.__hasSetMenuListener = false;
|
||||
this.canChangeTabOnHover = null;
|
||||
this.splitterBox = null;
|
||||
this._splitNodeToSplitters = new Map();
|
||||
this._tabToSplitNode = new Map();
|
||||
|
||||
XPCOMUtils.defineLazyPreferenceGetter(
|
||||
this,
|
||||
"canChangeTabOnHover",
|
||||
"zen.splitView.change-on-hover",
|
||||
false
|
||||
);
|
||||
class ZenViewSplitter extends ZenDOMOperatedFeature {
|
||||
currentView = -1;
|
||||
canChangeTabOnHover = false;
|
||||
_data = [];
|
||||
_tabBrowserPanel = null;
|
||||
__modifierElement = null;
|
||||
__hasSetMenuListener = false;
|
||||
_data = [];
|
||||
currentView = -1;
|
||||
_tabBrowserPanel = null;
|
||||
__modifierElement = null;
|
||||
__hasSetMenuListener = false;
|
||||
canChangeTabOnHover = null;
|
||||
splitterBox = null;
|
||||
_splitNodeToSplitters = new Map();
|
||||
_tabToSplitNode = new Map();
|
||||
|
||||
init() {
|
||||
XPCOMUtils.defineLazyPreferenceGetter(this, 'canChangeTabOnHover', 'zen.splitView.change-on-hover', false);
|
||||
|
||||
XPCOMUtils.defineLazyPreferenceGetter(
|
||||
this,
|
||||
|
@ -952,4 +954,6 @@ var gZenViewSplitter = new class {
|
|||
: [gBrowser.selectedTab, tabs[nextTabIndex]];
|
||||
this.splitTabs(selected_tabs, gridType);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
window.gZenViewSplitter = new ZenViewSplitter();
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
|
||||
var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
||||
var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
|
||||
/**
|
||||
* Stores workspace IDs and their last selected tabs.
|
||||
*/
|
||||
_lastSelectedWorkspaceTabs = {}
|
||||
_lastSelectedWorkspaceTabs = {};
|
||||
|
||||
async init() {
|
||||
if (!this.shouldHaveWorkspaces) {
|
||||
|
@ -13,8 +12,8 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
console.info('ZenWorkspaces: Initializing ZenWorkspaces...');
|
||||
XPCOMUtils.defineLazyPreferenceGetter(
|
||||
this,
|
||||
"shouldShowIconStrip",
|
||||
"zen.workspaces.show-icon-strip",
|
||||
'shouldShowIconStrip',
|
||||
'zen.workspaces.show-icon-strip',
|
||||
true,
|
||||
this._expandWorkspacesStrip.bind(this)
|
||||
);
|
||||
|
@ -27,9 +26,11 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
get shouldHaveWorkspaces() {
|
||||
if (typeof this._shouldHaveWorkspaces === 'undefined') {
|
||||
let docElement = document.documentElement;
|
||||
this._shouldHaveWorkspaces = !(docElement.hasAttribute('privatebrowsingmode')
|
||||
|| docElement.getAttribute('chromehidden').includes('toolbar')
|
||||
|| docElement.getAttribute('chromehidden').includes('menubar'));
|
||||
this._shouldHaveWorkspaces = !(
|
||||
docElement.hasAttribute('privatebrowsingmode') ||
|
||||
docElement.getAttribute('chromehidden').includes('toolbar') ||
|
||||
docElement.getAttribute('chromehidden').includes('menubar')
|
||||
);
|
||||
return this._shouldHaveWorkspaces;
|
||||
}
|
||||
return this._shouldHaveWorkspaces;
|
||||
|
@ -45,7 +46,7 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
|
||||
getActiveWorkspaceFromCache() {
|
||||
try {
|
||||
const activeWorkspaceId = Services.prefs.getStringPref("zen.workspaces.active", "");
|
||||
const activeWorkspaceId = Services.prefs.getStringPref('zen.workspaces.active', '');
|
||||
return this._workspaceCache.workspaces.find((workspace) => workspace.uuid === activeWorkspaceId);
|
||||
} catch (e) {
|
||||
return null;
|
||||
|
@ -56,17 +57,17 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
if (!this._workspaceCache) {
|
||||
this._workspaceCache = { workspaces: await ZenWorkspacesStorage.getWorkspaces() };
|
||||
// Get the active workspace ID from preferences
|
||||
const activeWorkspaceId = Services.prefs.getStringPref("zen.workspaces.active", "");
|
||||
const activeWorkspaceId = Services.prefs.getStringPref('zen.workspaces.active', '');
|
||||
|
||||
if (activeWorkspaceId) {
|
||||
const activeWorkspace = this._workspaceCache.workspaces.find(w => w.uuid === activeWorkspaceId);
|
||||
const activeWorkspace = this._workspaceCache.workspaces.find((w) => w.uuid === activeWorkspaceId);
|
||||
// Set the active workspace ID to the first one if the one with selected id doesn't exist
|
||||
if (!activeWorkspace) {
|
||||
Services.prefs.setStringPref("zen.workspaces.active", this._workspaceCache.workspaces[0]?.uuid);
|
||||
Services.prefs.setStringPref('zen.workspaces.active', this._workspaceCache.workspaces[0]?.uuid);
|
||||
}
|
||||
} else {
|
||||
// Set the active workspace ID to the first one if active workspace doesn't exist
|
||||
Services.prefs.setStringPref("zen.workspaces.active", this._workspaceCache.workspaces[0]?.uuid);
|
||||
Services.prefs.setStringPref('zen.workspaces.active', this._workspaceCache.workspaces[0]?.uuid);
|
||||
}
|
||||
}
|
||||
return this._workspaceCache;
|
||||
|
@ -101,11 +102,11 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
let activeWorkspace = await this.getActiveWorkspace();
|
||||
if (!activeWorkspace) {
|
||||
activeWorkspace = workspaces.workspaces.find((workspace) => workspace.default);
|
||||
Services.prefs.setStringPref("zen.workspaces.active", activeWorkspace.uuid);
|
||||
Services.prefs.setStringPref('zen.workspaces.active', activeWorkspace.uuid);
|
||||
}
|
||||
if (!activeWorkspace) {
|
||||
activeWorkspace = workspaces.workspaces[0];
|
||||
Services.prefs.setStringPref("zen.workspaces.active", activeWorkspace.uuid);
|
||||
Services.prefs.setStringPref('zen.workspaces.active', activeWorkspace.uuid);
|
||||
}
|
||||
this.changeWorkspace(activeWorkspace, true);
|
||||
}
|
||||
|
@ -129,9 +130,9 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
}
|
||||
}
|
||||
|
||||
_kIcons = JSON.parse(Services.prefs.getStringPref("zen.workspaces.icons")).map((icon) => (
|
||||
(typeof Intl.Segmenter !== 'undefined') ? new Intl.Segmenter().segment(icon).containing().segment : Array.from(icon)[0]
|
||||
))
|
||||
_kIcons = JSON.parse(Services.prefs.getStringPref('zen.workspaces.icons')).map((icon) =>
|
||||
typeof Intl.Segmenter !== 'undefined' ? new Intl.Segmenter().segment(icon).containing().segment : Array.from(icon)[0]
|
||||
);
|
||||
|
||||
_initializeWorkspaceCreationIcons() {
|
||||
let container = document.getElementById('PanelUI-zen-workspaces-create-icons-container');
|
||||
|
@ -192,14 +193,14 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
}
|
||||
|
||||
isWorkspaceActive(workspace) {
|
||||
const activeWorkspaceId = Services.prefs.getStringPref("zen.workspaces.active", "");
|
||||
const activeWorkspaceId = Services.prefs.getStringPref('zen.workspaces.active', '');
|
||||
return workspace.uuid === activeWorkspaceId;
|
||||
}
|
||||
|
||||
async getActiveWorkspace() {
|
||||
const workspaces = await this._workspaces();
|
||||
const activeWorkspaceId = Services.prefs.getStringPref("zen.workspaces.active", "");
|
||||
return workspaces.workspaces.find(workspace => workspace.uuid === activeWorkspaceId);
|
||||
const activeWorkspaceId = Services.prefs.getStringPref('zen.workspaces.active', '');
|
||||
return workspaces.workspaces.find((workspace) => workspace.uuid === activeWorkspaceId);
|
||||
}
|
||||
// Workspaces dialog UI management
|
||||
|
||||
|
@ -248,13 +249,12 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
}
|
||||
|
||||
get shouldShowContainers() {
|
||||
return Services.prefs.getBoolPref('privacy.userContext.ui.enabled') &&
|
||||
ContextualIdentityService.getPublicIdentities().length > 0;
|
||||
return (
|
||||
Services.prefs.getBoolPref('privacy.userContext.ui.enabled') && ContextualIdentityService.getPublicIdentities().length > 0
|
||||
);
|
||||
}
|
||||
|
||||
async _propagateWorkspaceData({
|
||||
ignoreStrip = false
|
||||
} = {}) {
|
||||
async _propagateWorkspaceData({ ignoreStrip = false } = {}) {
|
||||
await this.foreachWindowAsActive(async (browser) => {
|
||||
let currentContainer = browser.document.getElementById('PanelUI-zen-workspaces-current-info');
|
||||
let workspaceList = browser.document.getElementById('PanelUI-zen-workspaces-list');
|
||||
|
@ -301,7 +301,9 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
|
||||
childs.querySelector('.zen-workspace-actions').addEventListener('command', (event) => {
|
||||
let button = event.target;
|
||||
browser.ZenWorkspaces._contextMenuId = button.closest('toolbarbutton[zen-workspace-id]').getAttribute('zen-workspace-id');
|
||||
browser.ZenWorkspaces._contextMenuId = button
|
||||
.closest('toolbarbutton[zen-workspace-id]')
|
||||
.getAttribute('zen-workspace-id');
|
||||
const popup = button.ownerDocument.getElementById('zenWorkspaceActionsMenu');
|
||||
popup.openPopup(button, 'after_end');
|
||||
});
|
||||
|
@ -353,7 +355,7 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
let target = document.getElementById('zen-workspaces-button');
|
||||
let panel = document.getElementById('PanelUI-zen-workspaces');
|
||||
await this._propagateWorkspaceData({
|
||||
ignoreStrip: true
|
||||
ignoreStrip: true,
|
||||
});
|
||||
PanelMultiView.openPopup(panel, target, {
|
||||
position: 'bottomright topright',
|
||||
|
@ -407,10 +409,13 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
newWorkspacesButton.appendChild(button);
|
||||
}
|
||||
// Listen for context menu events and open the all workspaces dialog
|
||||
newWorkspacesButton.addEventListener('contextmenu', ((event) => {
|
||||
event.preventDefault();
|
||||
browser.ZenWorkspaces.openWorkspacesDialog(event);
|
||||
}).bind(this));
|
||||
newWorkspacesButton.addEventListener(
|
||||
'contextmenu',
|
||||
((event) => {
|
||||
event.preventDefault();
|
||||
browser.ZenWorkspaces.openWorkspacesDialog(event);
|
||||
}).bind(this)
|
||||
);
|
||||
}
|
||||
|
||||
workspaceList.after(newWorkspacesButton);
|
||||
|
@ -440,7 +445,6 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
icon.className = 'zen-workspace-sidebar-icon';
|
||||
icon.textContent = this.getWorkspaceIcon(activeWorkspace);
|
||||
|
||||
|
||||
// use text content instead of innerHTML to avoid XSS
|
||||
const name = browser.document.createElement('div');
|
||||
name.className = 'zen-workspace-sidebar-name';
|
||||
|
@ -449,7 +453,7 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
if (!this.workspaceHasIcon(activeWorkspace)) {
|
||||
icon.setAttribute('no-icon', 'true');
|
||||
}
|
||||
|
||||
|
||||
wrapper.appendChild(icon);
|
||||
wrapper.appendChild(name);
|
||||
|
||||
|
@ -571,7 +575,7 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
return;
|
||||
}
|
||||
|
||||
Services.prefs.setStringPref("zen.workspaces.active", window.uuid);
|
||||
Services.prefs.setStringPref('zen.workspaces.active', window.uuid);
|
||||
|
||||
const shouldAllowPinnedTabs = this._shouldAllowPinTab;
|
||||
await this.foreachWindowAsActive(async (browser) => {
|
||||
|
@ -579,7 +583,10 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
let firstTab = undefined;
|
||||
console.info('ZenWorkspaces: Changing workspace to', window.uuid);
|
||||
for (let tab of browser.gBrowser.tabs) {
|
||||
if ((tab.getAttribute('zen-workspace-id') === window.uuid && !(tab.pinned && !shouldAllowPinnedTabs)) || !tab.hasAttribute('zen-workspace-id')) {
|
||||
if (
|
||||
(tab.getAttribute('zen-workspace-id') === window.uuid && !(tab.pinned && !shouldAllowPinnedTabs)) ||
|
||||
!tab.hasAttribute('zen-workspace-id')
|
||||
) {
|
||||
if (!firstTab) {
|
||||
firstTab = tab;
|
||||
} else if (browser.gBrowser.selectedTab === tab) {
|
||||
|
@ -689,7 +696,7 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
|
||||
// Context menu management
|
||||
|
||||
_contextMenuId = null
|
||||
_contextMenuId = null;
|
||||
async updateContextMenu(_) {
|
||||
console.assert(this._contextMenuId, 'No context menu ID set');
|
||||
document
|
||||
|
@ -712,7 +719,9 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
defaultMenuItem.removeAttribute('disabled');
|
||||
}
|
||||
let openMenuItem = document.getElementById('context_zenOpenWorkspace');
|
||||
if (workspaces.workspaces.find((workspace) => workspace.uuid === this._contextMenuId && this.isWorkspaceActive(workspace))) {
|
||||
if (
|
||||
workspaces.workspaces.find((workspace) => workspace.uuid === this._contextMenuId && this.isWorkspaceActive(workspace))
|
||||
) {
|
||||
openMenuItem.setAttribute('disabled', 'true');
|
||||
} else {
|
||||
openMenuItem.removeAttribute('disabled');
|
||||
|
@ -736,7 +745,7 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
|
||||
onContextMenuClose() {
|
||||
let target = document.querySelector(
|
||||
`#PanelUI-zen-workspaces [zen-workspace-id="${this._contextMenuId}"] .zen-workspace-actions`
|
||||
`#PanelUI-zen-workspaces [zen-workspace-id="${this._contextMenuId}"] .zen-workspace-actions`
|
||||
);
|
||||
if (target) {
|
||||
target.removeAttribute('active');
|
||||
|
@ -774,7 +783,8 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
let activeWorkspace = await this.getActiveWorkspace();
|
||||
let workspaceIndex = workspaces.workspaces.indexOf(activeWorkspace);
|
||||
// note: offset can be negative
|
||||
let nextWorkspace = workspaces.workspaces[(workspaceIndex + offset + workspaces.workspaces.length) % workspaces.workspaces.length];
|
||||
let nextWorkspace =
|
||||
workspaces.workspaces[(workspaceIndex + offset + workspaces.workspaces.length) % workspaces.workspaces.length];
|
||||
await this.changeWorkspace(nextWorkspace);
|
||||
}
|
||||
|
||||
|
@ -822,8 +832,7 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
getContextIdIfNeeded(userContextId) {
|
||||
const activeWorkspace = this.getActiveWorkspaceFromCache();
|
||||
const activeWorkspaceUserContextId = activeWorkspace?.containerTabId;
|
||||
if ((typeof userContextId !== 'undefined' && userContextId !== activeWorkspaceUserContextId)
|
||||
|| !this.workspaceEnabled) {
|
||||
if ((typeof userContextId !== 'undefined' && userContextId !== activeWorkspaceUserContextId) || !this.workspaceEnabled) {
|
||||
return [userContextId, false];
|
||||
}
|
||||
return [activeWorkspaceUserContextId, true];
|
||||
|
@ -838,5 +847,4 @@ var ZenWorkspaces = new class extends ZenMultiWindowFeature {
|
|||
const workspaceToSwitch = workspaces.workspaces[index];
|
||||
await this.changeWorkspace(workspaceToSwitch);
|
||||
}
|
||||
};
|
||||
|
||||
})();
|
||||
|
|
|
@ -5,7 +5,7 @@ var ZenWorkspacesStorage = {
|
|||
},
|
||||
|
||||
async _ensureTable() {
|
||||
await PlacesUtils.withConnectionWrapper("ZenWorkspacesStorage._ensureTable", async db => {
|
||||
await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage._ensureTable', async (db) => {
|
||||
await db.execute(`
|
||||
CREATE TABLE IF NOT EXISTS zen_workspaces (
|
||||
id INTEGER PRIMARY KEY,
|
||||
|
@ -37,9 +37,10 @@ var ZenWorkspacesStorage = {
|
|||
},
|
||||
|
||||
async saveWorkspace(workspace) {
|
||||
await PlacesUtils.withConnectionWrapper("ZenWorkspacesStorage.saveWorkspace", async db => {
|
||||
await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.saveWorkspace', async (db) => {
|
||||
const now = Date.now();
|
||||
await db.executeCached(`
|
||||
await db.executeCached(
|
||||
`
|
||||
INSERT OR REPLACE INTO zen_workspaces (
|
||||
uuid, name, icon, is_default, container_id, created_at, updated_at
|
||||
) VALUES (
|
||||
|
@ -47,14 +48,16 @@ var ZenWorkspacesStorage = {
|
|||
COALESCE((SELECT created_at FROM zen_workspaces WHERE uuid = :uuid), :now),
|
||||
:now
|
||||
)
|
||||
`, {
|
||||
uuid: workspace.uuid,
|
||||
name: workspace.name,
|
||||
icon: workspace.icon || null,
|
||||
is_default: workspace.default ? 1 : 0,
|
||||
container_id: workspace.containerTabId || null,
|
||||
now
|
||||
});
|
||||
`,
|
||||
{
|
||||
uuid: workspace.uuid,
|
||||
name: workspace.name,
|
||||
icon: workspace.icon || null,
|
||||
is_default: workspace.default ? 1 : 0,
|
||||
container_id: workspace.containerTabId || null,
|
||||
now,
|
||||
}
|
||||
);
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -63,29 +66,32 @@ var ZenWorkspacesStorage = {
|
|||
const rows = await db.execute(`
|
||||
SELECT * FROM zen_workspaces ORDER BY created_at ASC
|
||||
`);
|
||||
return rows.map(row => ({
|
||||
uuid: row.getResultByName("uuid"),
|
||||
name: row.getResultByName("name"),
|
||||
icon: row.getResultByName("icon"),
|
||||
default: !!row.getResultByName("is_default"),
|
||||
containerTabId: row.getResultByName("container_id")
|
||||
return rows.map((row) => ({
|
||||
uuid: row.getResultByName('uuid'),
|
||||
name: row.getResultByName('name'),
|
||||
icon: row.getResultByName('icon'),
|
||||
default: !!row.getResultByName('is_default'),
|
||||
containerTabId: row.getResultByName('container_id'),
|
||||
}));
|
||||
},
|
||||
|
||||
async removeWorkspace(uuid) {
|
||||
await PlacesUtils.withConnectionWrapper("ZenWorkspacesStorage.removeWorkspace", async db => {
|
||||
await db.execute(`
|
||||
await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.removeWorkspace', async (db) => {
|
||||
await db.execute(
|
||||
`
|
||||
DELETE FROM zen_workspaces WHERE uuid = :uuid
|
||||
`, { uuid });
|
||||
`,
|
||||
{ uuid }
|
||||
);
|
||||
});
|
||||
},
|
||||
|
||||
async setDefaultWorkspace(uuid) {
|
||||
await PlacesUtils.withConnectionWrapper("ZenWorkspacesStorage.setDefaultWorkspace", async db => {
|
||||
await db.executeTransaction(async function() {
|
||||
await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.setDefaultWorkspace', async (db) => {
|
||||
await db.executeTransaction(async function () {
|
||||
await db.execute(`UPDATE zen_workspaces SET is_default = 0`);
|
||||
await db.execute(`UPDATE zen_workspaces SET is_default = 1 WHERE uuid = :uuid`, { uuid });
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
},
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue