diff --git a/src/ZenCommonUtils.mjs b/src/ZenCommonUtils.mjs index 484a3db..24bca5d 100644 --- a/src/ZenCommonUtils.mjs +++ b/src/ZenCommonUtils.mjs @@ -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)); + } } diff --git a/src/ZenCompactMode.mjs b/src/ZenCompactMode.mjs index d192e87..3c3984b 100644 --- a/src/ZenCompactMode.mjs +++ b/src/ZenCompactMode.mjs @@ -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'); }, -}; \ No newline at end of file +}; diff --git a/src/ZenKeyboardShortcuts.mjs b/src/ZenKeyboardShortcuts.mjs index efabf72..cd97f51 100644 --- a/src/ZenKeyboardShortcuts.mjs +++ b/src/ZenKeyboardShortcuts.mjs @@ -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; } } diff --git a/src/ZenSidebarManager.mjs b/src/ZenSidebarManager.mjs index b508292..50975a7 100644 --- a/src/ZenSidebarManager.mjs +++ b/src/ZenSidebarManager.mjs @@ -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(); diff --git a/src/ZenTabUnloader.mjs b/src/ZenTabUnloader.mjs index cb208fc..b97354b 100644 --- a/src/ZenTabUnloader.mjs +++ b/src/ZenTabUnloader.mjs @@ -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(); } diff --git a/src/ZenThemesCommon.mjs b/src/ZenThemesCommon.mjs index 487d0f3..7c1feaf 100644 --- a/src/ZenThemesCommon.mjs +++ b/src/ZenThemesCommon.mjs @@ -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) { diff --git a/src/ZenViewSplitter.mjs b/src/ZenViewSplitter.mjs index f796166..cdc9c3e 100644 --- a/src/ZenViewSplitter.mjs +++ b/src/ZenViewSplitter.mjs @@ -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); } -}; \ No newline at end of file +} + +window.gZenViewSplitter = new ZenViewSplitter(); diff --git a/src/ZenWorkspaces.mjs b/src/ZenWorkspaces.mjs index 181ad6b..a92fcc6 100644 --- a/src/ZenWorkspaces.mjs +++ b/src/ZenWorkspaces.mjs @@ -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); } -}; - +})(); diff --git a/src/ZenWorkspacesStorage.mjs b/src/ZenWorkspacesStorage.mjs index 633948c..5ae9363 100644 --- a/src/ZenWorkspacesStorage.mjs +++ b/src/ZenWorkspacesStorage.mjs @@ -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 }); }); }); - } -}; \ No newline at end of file + }, +};