Made the code look cleaner

This commit is contained in:
mauro-balades 2024-10-04 18:21:39 +02:00
parent 5822df61e5
commit 76d22a1f15
No known key found for this signature in database
GPG key ID: CBD57A2AEDBDA1FB
9 changed files with 429 additions and 410 deletions

View file

@ -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));
}
}

View file

@ -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');
},
};
};

View file

@ -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;
@ -748,7 +745,7 @@ class ZenKeyboardShortcutsVersioner {
}
}
var gZenKeyboardShortcutsManager = {
var ZenKeyboardShortcutsManager = {
loader: new ZenKeyboardShortcutsLoader(),
async init() {
if (window.location.href == 'chrome://browser/content/browser.xhtml') {
@ -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;
}
}

View file

@ -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();

View file

@ -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();
}

View file

@ -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) {

View file

@ -1,18 +1,14 @@
var gZenViewSplitter = new class {
constructor() {
this._data = [];
this.currentView = -1;
this._tabBrowserPanel = null;
this.__modifierElement = null;
this.__hasSetMenuListener = false;
this.canChangeTabOnHover = null;
class ZenViewSplitter extends ZenDOMOperatedFeature {
currentView = -1;
canChangeTabOnHover = false;
XPCOMUtils.defineLazyPreferenceGetter(
this,
"canChangeTabOnHover",
"zen.splitView.change-on-hover",
false
);
_data = [];
_tabBrowserPanel = null;
__modifierElement = null;
__hasSetMenuListener = false;
init() {
XPCOMUtils.defineLazyPreferenceGetter(this, 'canChangeTabOnHover', 'zen.splitView.change-on-hover', false);
window.addEventListener('TabClose', this.handleTabClose.bind(this));
this.initializeContextMenu();
@ -326,7 +322,7 @@ var gZenViewSplitter = new class {
this.setTabsDocShellState(splitData.tabs, true);
this.updateSplitViewButton(false);
this.updateGridSizes(splitData);
this.applySplitters(splitData.widths.length , splitData.heights.length);
this.applySplitters(splitData.widths.length, splitData.heights.length);
this.applyGridSizes();
}
@ -366,10 +362,10 @@ var gZenViewSplitter = new class {
splitter.setAttribute('gridIdx', gridIdx);
splitter.style.gridArea = `${orient === 'vertical' ? 'v' : 'h'}Splitter${i}`;
splitter.addEventListener('mousedown', this.handleSplitterMouseDown);
this.tabBrowserPanel.insertAdjacentElement("afterbegin", splitter);
}
this.tabBrowserPanel.insertAdjacentElement('afterbegin', splitter);
};
for (let i = 1; i <= vSplittersNeeded; i++) {
insertSplitter(i, 'vertical', Math.floor((i - 1) /nrOfRows) + 1);
insertSplitter(i, 'vertical', Math.floor((i - 1) / nrOfRows) + 1);
}
for (let i = 1; i <= hSplittersNeeded; i++) {
insertSplitter(i, 'horizontal', i);
@ -403,8 +399,8 @@ var gZenViewSplitter = new class {
removeSplitters() {
[...gZenViewSplitter.tabBrowserPanel.children]
.filter(e => e.classList.contains('zen-split-view-splitter'))
.forEach(s => s.remove());
.filter((e) => e.classList.contains('zen-split-view-splitter'))
.forEach((s) => s.remove());
}
/**
@ -419,10 +415,18 @@ var gZenViewSplitter = new class {
return this.calculateGridAreasForGrid(tabs);
}
if (gridType === 'vsep') {
return `'${tabs.slice(0, -1).map((_, j) => `tab${j + 1} vSplitter${j + 1}`).join(' ')} tab${tabs.length}'`;
return `'${tabs
.slice(0, -1)
.map((_, j) => `tab${j + 1} vSplitter${j + 1}`)
.join(' ')} tab${tabs.length}'`;
}
if (gridType === 'hsep') {
return tabs.slice(0, -1).map((_, j) => `'tab${j + 1}' 'hSplitter${j + 1}'`).join(' ') + `'tab${tabs.length}`;
return (
tabs
.slice(0, -1)
.map((_, j) => `'tab${j + 1}' 'hSplitter${j + 1}'`)
.join(' ') + `'tab${tabs.length}`
);
}
return '';
}
@ -447,11 +451,11 @@ var gZenViewSplitter = new class {
}
}
for (let i = tabs.length - 2; i < tabs.length; i++) {
if (i % 2 === 0) {
rows[0] += ` tab${i + 1}`;
} else {
rows[1] += ` tab${i + 1}`;
}
if (i % 2 === 0) {
rows[0] += ` tab${i + 1}`;
} else {
rows[1] += ` tab${i + 1}`;
}
}
let middleColumn = 'hSplitter1 '.repeat(tabs.length - 1);
@ -510,7 +514,8 @@ var gZenViewSplitter = new class {
const dragFunc = (dEvent) => {
requestAnimationFrame(() => {
const movementX = dEvent[clientAxis] - prevPosition;
let percentageChange = (movementX / this.tabBrowserPanel.getBoundingClientRect()[isVertical ? 'width' : 'height']) * 100;
let percentageChange =
(movementX / this.tabBrowserPanel.getBoundingClientRect()[isVertical ? 'width' : 'height']) * 100;
const currentSize = splitData[dimension][gridIdx - 1];
const neighborSize = splitData[dimension][gridIdx];
@ -530,16 +535,16 @@ var gZenViewSplitter = new class {
this.applyGridSizes();
if (!max) prevPosition = dEvent[clientAxis];
});
}
};
const stopListeners = () => {
removeEventListener('mousemove', dragFunc);
removeEventListener('mouseup', stopListeners);
setCursor('auto');
}
};
addEventListener('mousemove', dragFunc);
addEventListener('mouseup', stopListeners);
setCursor(isVertical ? 'ew-resize' : 'n-resize');
}
};
/**
* Applies the grid column and row sizes
@ -549,13 +554,15 @@ var gZenViewSplitter = new class {
const columnGap = 'var(--zen-split-column-gap)';
const rowGap = 'var(--zen-split-row-gap)';
this.tabBrowserPanel.style.gridTemplateColumns = splitData.widths.slice(0, -1).map(
(w) => `calc(${w}% - ${columnGap} * ${splitData.widths.length - 1}/${splitData.widths.length}) ${columnGap}`
).join(' ');
this.tabBrowserPanel.style.gridTemplateColumns = splitData.widths
.slice(0, -1)
.map((w) => `calc(${w}% - ${columnGap} * ${splitData.widths.length - 1}/${splitData.widths.length}) ${columnGap}`)
.join(' ');
this.tabBrowserPanel.style.gridTemplateRows = splitData.heights.slice(0, -1).map(
(h) => `calc(${h}% - ${rowGap} * ${splitData.heights.length - 1}/${splitData.heights.length}) ${rowGap}`
).join(' ');
this.tabBrowserPanel.style.gridTemplateRows = splitData.heights
.slice(0, -1)
.map((h) => `calc(${h}% - ${rowGap} * ${splitData.heights.length - 1}/${splitData.heights.length}) ${rowGap}`)
.join(' ');
}
/**
@ -740,4 +747,6 @@ var gZenViewSplitter = new class {
: [gBrowser.selectedTab, tabs[nextTabIndex]];
this.splitTabs(selected_tabs, gridType);
}
};
}
window.gZenViewSplitter = new ZenViewSplitter();

View file

@ -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);
}
};
})();

View file

@ -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 });
});
});
}
};
},
};