From cd2df06a107bd61271eb0d9df7c87b75cd52daa1 Mon Sep 17 00:00:00 2001 From: "mr. M" Date: Fri, 3 Jan 2025 00:59:15 +0100 Subject: [PATCH 1/8] Refactor ZenKeyboardShortcuts to use static method for default shortcuts retrieval --- .../zen-components/ZenKeyboardShortcuts.mjs | 282 +++++++++--------- 1 file changed, 141 insertions(+), 141 deletions(-) diff --git a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs index ed7997026..c6bcc9f43 100644 --- a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs +++ b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs @@ -578,155 +578,155 @@ class ZenKeyboardShortcutsLoader { async remove() { await IOUtils.remove(this.shortcutsFile); } -} -function zenGetDefaultShortcuts() { - // DO NOT CHANGE ANYTHING HERE - // For adding new default shortcuts, add them to inside the migration function - // and increment the version number. + static zenGetDefaultShortcuts() { + // DO NOT CHANGE ANYTHING HERE + // For adding new default shortcuts, add them to inside the migration function + // and increment the version number. - let keySet = document.getElementById(ZEN_MAIN_KEYSET_ID); - let newShortcutList = []; + let keySet = document.getElementById(ZEN_MAIN_KEYSET_ID); + let newShortcutList = []; - // Firefox's standard keyset. Reverse order to keep the order of the keys - for (let i = keySet.children.length - 1; i >= 0; i--) { - let key = keySet.children[i]; - let parsed = KeyShortcut.parseFromXHTML(key); - newShortcutList.push(parsed); - } + // Firefox's standard keyset. Reverse order to keep the order of the keys + for (let i = keySet.children.length - 1; i >= 0; i--) { + let key = keySet.children[i]; + let parsed = KeyShortcut.parseFromXHTML(key); + newShortcutList.push(parsed); + } - // Compact mode's keyset - newShortcutList.push( - new KeyShortcut( - 'zen-compact-mode-toggle', - 'C', - '', - ZEN_COMPACT_MODE_SHORTCUTS_GROUP, - KeyShortcutModifiers.fromObject({ accel: true, alt: true }), - 'code:gZenCompactModeManager.toggle()', - 'zen-compact-mode-shortcut-toggle' - ) - ); - newShortcutList.push( - new KeyShortcut( - 'zen-compact-mode-show-sidebar', - 'S', - '', - ZEN_COMPACT_MODE_SHORTCUTS_GROUP, - KeyShortcutModifiers.fromObject({ accel: true, alt: true }), - 'code:gZenCompactModeManager.toggleSidebar()', - 'zen-compact-mode-shortcut-show-sidebar' - ) - ); - newShortcutList.push( - new KeyShortcut( - 'zen-compact-mode-show-toolbar', - 'T', - '', - ZEN_COMPACT_MODE_SHORTCUTS_GROUP, - KeyShortcutModifiers.fromObject({ accel: true, alt: true }), - 'code:gZenCompactModeManager.toggleToolbar()', - 'zen-compact-mode-shortcut-show-toolbar' - ) - ); - - // Workspace's keyset - for (let i = 10; i > 0; i--) { + // Compact mode's keyset newShortcutList.push( new KeyShortcut( - `zen-workspace-switch-${i}`, + 'zen-compact-mode-toggle', + 'C', '', - '', - ZEN_WORKSPACE_SHORTCUTS_GROUP, - KeyShortcutModifiers.fromObject({}), - `code:ZenWorkspaces.shortcutSwitchTo(${i - 1})`, - `zen-workspace-shortcut-switch-${i}` + ZEN_COMPACT_MODE_SHORTCUTS_GROUP, + KeyShortcutModifiers.fromObject({ accel: true, alt: true }), + 'code:gZenCompactModeManager.toggle()', + 'zen-compact-mode-shortcut-toggle' ) ); + newShortcutList.push( + new KeyShortcut( + 'zen-compact-mode-show-sidebar', + 'S', + '', + ZEN_COMPACT_MODE_SHORTCUTS_GROUP, + KeyShortcutModifiers.fromObject({ accel: true, alt: true }), + 'code:gZenCompactModeManager.toggleSidebar()', + 'zen-compact-mode-shortcut-show-sidebar' + ) + ); + newShortcutList.push( + new KeyShortcut( + 'zen-compact-mode-show-toolbar', + 'T', + '', + ZEN_COMPACT_MODE_SHORTCUTS_GROUP, + KeyShortcutModifiers.fromObject({ accel: true, alt: true }), + 'code:gZenCompactModeManager.toggleToolbar()', + 'zen-compact-mode-shortcut-show-toolbar' + ) + ); + + // Workspace's keyset + for (let i = 10; i > 0; i--) { + newShortcutList.push( + new KeyShortcut( + `zen-workspace-switch-${i}`, + '', + '', + ZEN_WORKSPACE_SHORTCUTS_GROUP, + KeyShortcutModifiers.fromObject({}), + `code:ZenWorkspaces.shortcutSwitchTo(${i - 1})`, + `zen-workspace-shortcut-switch-${i}` + ) + ); + } + newShortcutList.push( + new KeyShortcut( + 'zen-workspace-forward', + 'E', + '', + ZEN_WORKSPACE_SHORTCUTS_GROUP, + KeyShortcutModifiers.fromObject({ accel: true, alt: true }), + 'code:ZenWorkspaces.changeWorkspaceShortcut()', + 'zen-workspace-shortcut-forward' + ) + ); + newShortcutList.push( + new KeyShortcut( + 'zen-workspace-backward', + 'Q', + '', + ZEN_WORKSPACE_SHORTCUTS_GROUP, + KeyShortcutModifiers.fromObject({ accel: true, alt: true }), + 'code:ZenWorkspaces.changeWorkspaceShortcut(-1)', + 'zen-workspace-shortcut-backward' + ) + ); + + // Other keyset + newShortcutList.push( + new KeyShortcut( + 'zen-toggle-web-panel', + 'P', + '', + ZEN_OTHER_SHORTCUTS_GROUP, + KeyShortcutModifiers.fromObject({ alt: true }), + 'code:gZenBrowserManagerSidebar.toggle()', + 'zen-web-panel-shortcut-toggle' + ) + ); + + // Split view + newShortcutList.push( + new KeyShortcut( + 'zen-split-view-grid', + 'G', + '', + ZEN_SPLIT_VIEW_SHORTCUTS_GROUP, + KeyShortcutModifiers.fromObject({ accel: true, alt: true }), + "code:gZenViewSplitter.toggleShortcut('grid')", + 'zen-split-view-shortcut-grid' + ) + ); + newShortcutList.push( + new KeyShortcut( + 'zen-split-view-vertical', + 'V', + '', + ZEN_SPLIT_VIEW_SHORTCUTS_GROUP, + KeyShortcutModifiers.fromObject({ accel: true, alt: true }), + "code:gZenViewSplitter.toggleShortcut('vsep')", + 'zen-split-view-shortcut-vertical' + ) + ); + newShortcutList.push( + new KeyShortcut( + 'zen-split-view-horizontal', + 'H', + '', + ZEN_SPLIT_VIEW_SHORTCUTS_GROUP, + KeyShortcutModifiers.fromObject({ accel: true, alt: true }), + "code:gZenViewSplitter.toggleShortcut('hsep')", + 'zen-split-view-shortcut-horizontal' + ) + ); + newShortcutList.push( + new KeyShortcut( + 'zen-split-view-unsplit', + 'U', + '', + ZEN_SPLIT_VIEW_SHORTCUTS_GROUP, + KeyShortcutModifiers.fromObject({ accel: true, alt: true }), + "code:gZenViewSplitter.toggleShortcut('unsplit')", + 'zen-split-view-shortcut-unsplit' + ) + ); + + return newShortcutList; } - newShortcutList.push( - new KeyShortcut( - 'zen-workspace-forward', - 'E', - '', - ZEN_WORKSPACE_SHORTCUTS_GROUP, - KeyShortcutModifiers.fromObject({ accel: true, alt: true }), - 'code:ZenWorkspaces.changeWorkspaceShortcut()', - 'zen-workspace-shortcut-forward' - ) - ); - newShortcutList.push( - new KeyShortcut( - 'zen-workspace-backward', - 'Q', - '', - ZEN_WORKSPACE_SHORTCUTS_GROUP, - KeyShortcutModifiers.fromObject({ accel: true, alt: true }), - 'code:ZenWorkspaces.changeWorkspaceShortcut(-1)', - 'zen-workspace-shortcut-backward' - ) - ); - - // Other keyset - newShortcutList.push( - new KeyShortcut( - 'zen-toggle-web-panel', - 'P', - '', - ZEN_OTHER_SHORTCUTS_GROUP, - KeyShortcutModifiers.fromObject({ alt: true }), - 'code:gZenBrowserManagerSidebar.toggle()', - 'zen-web-panel-shortcut-toggle' - ) - ); - - // Split view - newShortcutList.push( - new KeyShortcut( - 'zen-split-view-grid', - 'G', - '', - ZEN_SPLIT_VIEW_SHORTCUTS_GROUP, - KeyShortcutModifiers.fromObject({ accel: true, alt: true }), - "code:gZenViewSplitter.toggleShortcut('grid')", - 'zen-split-view-shortcut-grid' - ) - ); - newShortcutList.push( - new KeyShortcut( - 'zen-split-view-vertical', - 'V', - '', - ZEN_SPLIT_VIEW_SHORTCUTS_GROUP, - KeyShortcutModifiers.fromObject({ accel: true, alt: true }), - "code:gZenViewSplitter.toggleShortcut('vsep')", - 'zen-split-view-shortcut-vertical' - ) - ); - newShortcutList.push( - new KeyShortcut( - 'zen-split-view-horizontal', - 'H', - '', - ZEN_SPLIT_VIEW_SHORTCUTS_GROUP, - KeyShortcutModifiers.fromObject({ accel: true, alt: true }), - "code:gZenViewSplitter.toggleShortcut('hsep')", - 'zen-split-view-shortcut-horizontal' - ) - ); - newShortcutList.push( - new KeyShortcut( - 'zen-split-view-unsplit', - 'U', - '', - ZEN_SPLIT_VIEW_SHORTCUTS_GROUP, - KeyShortcutModifiers.fromObject({ accel: true, alt: true }), - "code:gZenViewSplitter.toggleShortcut('unsplit')", - 'zen-split-view-shortcut-unsplit' - ) - ); - - return newShortcutList; } class ZenKeyboardShortcutsVersioner { @@ -789,7 +789,7 @@ class ZenKeyboardShortcutsVersioner { // Migrate from 0 to 1 // Here, we do a complet reset of the shortcuts, // since nothing seems to work properly. - data = zenGetDefaultShortcuts(); + data = ZenKeyboardShortcutsLoader.zenGetDefaultShortcuts(); } if (version < 2) { // Migrate from 1 to 2 @@ -819,7 +819,7 @@ class ZenKeyboardShortcutsVersioner { // detection for internal keys was not working properly, so every internal // shortcut was being saved as a user-editable shortcut. // This migration will fix this issue. - const defaultShortcuts = zenGetDefaultShortcuts(); + const defaultShortcuts = ZenKeyboardShortcutsLoader.zenGetDefaultShortcuts(); // Get the default shortcut, compare the id and set the internal flag if needed for (let shortcut of data) { for (let defaultShortcut of defaultShortcuts) { From 766c16dc3ce9ba5caec155ddedec1605ae68fae2 Mon Sep 17 00:00:00 2001 From: "mr. M" Date: Fri, 3 Jan 2025 01:20:30 +0100 Subject: [PATCH 2/8] Add support for default DevTools keyboard shortcuts and update versioning --- docs/changes.md | 1 + l10n | 2 +- .../zen-components/ZenKeyboardShortcuts.mjs | 83 ++++++++++++++++++- 3 files changed, 82 insertions(+), 4 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index c2f7e9a83..39d27ab15 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -12,3 +12,4 @@ - Overall UX - Themes Page - Settings Page +- Keyboard shortcuts, check if there are any missing or not working diff --git a/l10n b/l10n index c350a101d..8ef008fb6 160000 --- a/l10n +++ b/l10n @@ -1 +1 @@ -Subproject commit c350a101d97a2d0bfbf052479bd061ce9538b792 +Subproject commit 8ef008fb65093e7f5b604725bd6960e1a07b17eb diff --git a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs index c6bcc9f43..990104a61 100644 --- a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs +++ b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs @@ -103,6 +103,7 @@ const defaultKeyboardGroups = { 'zen-bidi-switch-direction-shortcut', 'zen-screenshot-shortcut', ], + devTools: [/*Filled automatically*/], }; const fixedL10nIds = { @@ -110,9 +111,25 @@ const fixedL10nIds = { 'Browser:ReloadSkipCache': 'zen-nav-reload-shortcut-skip-cache', cmd_close: 'zen-close-tab-shortcut', 'History:RestoreLastClosedTabOrWindowOrSession': 'zen-restore-last-closed-tab-shortcut', + + // Devtools + key_toggleToolbox: 'zen-devtools-toggle-shortcut', + key_browserToolbox: 'zen-devtools-toggle-browser-toolbox-shortcut', + key_browserConsole: 'zen-devtools-toggle-browser-console-shortcut', + key_responsiveDesignMode: 'zen-devtools-toggle-responsive-design-mode-shortcut', + key_inspector: 'zen-devtools-toggle-inspector-shortcut', + key_webconsole: 'zen-devtools-toggle-web-console-shortcut', + key_jsdebugger: 'zen-devtools-toggle-js-debugger-shortcut', + key_netmonitor: 'zen-devtools-toggle-net-monitor-shortcut', + key_styleeditor: 'zen-devtools-toggle-style-editor-shortcut', + key_performance: 'zen-devtools-toggle-performance-shortcut', + key_storage: 'zen-devtools-toggle-storage-shortcut', + key_dom: 'zen-devtools-toggle-dom-shortcut', + key_accessibility: 'zen-devtools-toggle-accessibility-shortcut', }; const ZEN_MAIN_KEYSET_ID = 'mainKeyset'; +const ZEN_DEVTOOLS_KEYSET_ID = 'devtoolsKeyset'; const ZEN_KEYSET_ID = 'zenKeyset'; const ZEN_COMPACT_MODE_SHORTCUTS_GROUP = 'zen-compact-mode'; @@ -355,12 +372,12 @@ class KeyShortcut { ); } - static parseFromXHTML(key) { + static parseFromXHTML(key, { group = undefined } = {}) { return new KeyShortcut( key.getAttribute('id'), key.getAttribute('key'), key.getAttribute('keycode'), - KeyShortcut.getGroupFromL10nId(KeyShortcut.sanitizeL10nId(key.getAttribute('data-l10n-id')), key.getAttribute('id')), + group ?? KeyShortcut.getGroupFromL10nId(KeyShortcut.sanitizeL10nId(key.getAttribute('data-l10n-id')), key.getAttribute('id')), KeyShortcutModifiers.parseFromXHTMLAttribute(key.getAttribute('modifiers')), key.getAttribute('command'), key.getAttribute('data-l10n-id'), @@ -727,10 +744,26 @@ class ZenKeyboardShortcutsLoader { return newShortcutList; } + + static IGNORED_DEVTOOLS_SHORTCUTS = ['key_toggleToolboxF12']; + + static zenGetDefaultDevToolsShortcuts() { + let keySet = document.getElementById(ZEN_DEVTOOLS_KEYSET_ID); + let newShortcutList = []; + + for (let i = keySet.children.length - 1; i >= 0; i--) { + let key = keySet.children[i]; + if (this.IGNORED_DEVTOOLS_SHORTCUTS.includes(key.id)) { + continue; + } + let parsed = KeyShortcut.parseFromXHTML(key, { group: 'devTools' }); + newShortcutList.push(parsed); + } + } } class ZenKeyboardShortcutsVersioner { - static LATEST_KBS_VERSION = 6; + static LATEST_KBS_VERSION = 7; constructor() {} @@ -865,6 +898,12 @@ class ZenKeyboardShortcutsVersioner { ) ); } + if (version < 7) { + // Migrate from 6 to 7 + // In this new version, we add the devtools shortcuts + const devToolsShortcuts = ZenKeyboardShortcutsLoader.zenGetDefaultDevToolsShortcuts(); + data.push(...devToolsShortcuts); + } return data; } } @@ -948,6 +987,18 @@ var gZenKeyboardShortcutsManager = { return browser.gZenKeyboardShortcutsManager._zenKeyset; }, + getZenDevtoolsKeyset(browser = window) { + if (!browser.gZenKeyboardShortcutsManager._zenDevtoolsKeyset) { + const existingKeyset = browser.document.getElementById(ZEN_DEVTOOLS_KEYSET_ID); + if (existingKeyset) { + browser.gZenKeyboardShortcutsManager._zenDevtoolsKeyset = existingKeyset; + return browser.gZenKeyboardShortcutsManager._zenDevtoolsKeyset; + } + + throw new Error('[zen CKS]: Devtools keyset not found!'); + } + }, + clearMainKeyset(element) { if (this._hasCleared) { return; @@ -993,6 +1044,32 @@ var gZenKeyboardShortcutsManager = { } mainKeyset.after(keyset); + + this._applyDevtoolsShortcuts(browser); + } + }, + + _applyDevtoolsShortcuts(browser) { + let devtoolsKeyset = browser.gZenKeyboardShortcutsManager.getZenDevtoolsKeyset(browser); + const remainingChildren = []; + for (let i = devtoolsKeyset.children.length - 1; i >= 0; i--) { + const key = devtoolsKeyset.children[i]; + if (ZenKeyboardShortcutsLoader.IGNORED_DEVTOOLS_SHORTCUTS.includes(key.id)) { + remainingChildren.push(key); + } + } + + devtoolsKeyset.innerHTML = ''; + for (let key of this._currentShortcutList) { + if (key.getGroup() != 'devTools') { + continue; + } + let child = key.toXHTMLElement(browser); + devtoolsKeyset.appendChild(child); + } + + for (let key of remainingChildren) { + devtoolsKeyset.appendChild(key); } }, From 13726e1e8adf7479aee7916680433fb4eb25d7ce Mon Sep 17 00:00:00 2001 From: "mr. M" Date: Fri, 3 Jan 2025 01:51:15 +0100 Subject: [PATCH 3/8] Implement dynamic loading of DevTools shortcuts and enhance shortcut management --- .../zen-components/ZenKeyboardShortcuts.mjs | 42 +++++++++++++++---- .../startup/DevToolsStartup-sys-mjs.patch | 13 ++++++ 2 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 src/devtools/startup/DevToolsStartup-sys-mjs.patch diff --git a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs index 990104a61..e0e321c55 100644 --- a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs +++ b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs @@ -759,6 +759,8 @@ class ZenKeyboardShortcutsLoader { let parsed = KeyShortcut.parseFromXHTML(key, { group: 'devTools' }); newShortcutList.push(parsed); } + + return newShortcutList; } } @@ -901,8 +903,16 @@ class ZenKeyboardShortcutsVersioner { if (version < 7) { // Migrate from 6 to 7 // In this new version, we add the devtools shortcuts - const devToolsShortcuts = ZenKeyboardShortcutsLoader.zenGetDefaultDevToolsShortcuts(); - data.push(...devToolsShortcuts); + const listener = (event) => { + event.stopPropagation(); + + const devToolsShortcuts = ZenKeyboardShortcutsLoader.zenGetDefaultDevToolsShortcuts(); + gZenKeyboardShortcutsManager.updatedDefaultDevtoolsShortcuts(devToolsShortcuts); + + window.removeEventListener('zen-devtools-keyset-added', listener); + }; + + window.addEventListener('zen-devtools-keyset-added', listener); } return data; } @@ -910,6 +920,7 @@ class ZenKeyboardShortcutsVersioner { var gZenKeyboardShortcutsManager = { loader: new ZenKeyboardShortcutsLoader(), + _hasToLoadDevtools: false, beforeInit() { if (!this.inBrowserView) { return; @@ -920,6 +931,7 @@ var gZenKeyboardShortcutsManager = { void(this.getZenKeyset()); this._hasCleared = Services.prefs.getBoolPref('zen.keyboard.shortcuts.disable-mainkeyset-clear', false); + window.addEventListener('zen-devtools-keyset-added', this._hasAddedDevtoolShortcuts.bind(this)); this.init(); }, @@ -987,16 +999,18 @@ var gZenKeyboardShortcutsManager = { return browser.gZenKeyboardShortcutsManager._zenKeyset; }, - getZenDevtoolsKeyset(browser = window) { - if (!browser.gZenKeyboardShortcutsManager._zenDevtoolsKeyset) { - const existingKeyset = browser.document.getElementById(ZEN_DEVTOOLS_KEYSET_ID); + getZenDevtoolsKeyset() { + // note: we use `this` here because we are in the context of the browser + if (!this._zenDevtoolsKeyset) { + const existingKeyset = document.getElementById(ZEN_DEVTOOLS_KEYSET_ID); if (existingKeyset) { - browser.gZenKeyboardShortcutsManager._zenDevtoolsKeyset = existingKeyset; - return browser.gZenKeyboardShortcutsManager._zenDevtoolsKeyset; + this._zenDevtoolsKeyset = existingKeyset; + return existingKeyset; } throw new Error('[zen CKS]: Devtools keyset not found!'); } + return this._zenDevtoolsKeyset; }, clearMainKeyset(element) { @@ -1019,6 +1033,17 @@ var gZenKeyboardShortcutsManager = { parent.prepend(element); }, + async updatedDefaultDevtoolsShortcuts(shortcuts) { + this._currentShortcutList = this._currentShortcutList.concat(shortcuts); + await this._saveShortcuts(); + this._hasAddedDevtoolShortcuts(); + }, + + _hasAddedDevtoolShortcuts() { + this._hasToLoadDevtools = true; + this.triggerShortcutRebuild(); + }, + _applyShortcuts() { for (const browser of ZenMultiWindowFeature.browsers) { let mainKeyset = browser.document.getElementById(ZEN_MAIN_KEYSET_ID); @@ -1050,6 +1075,9 @@ var gZenKeyboardShortcutsManager = { }, _applyDevtoolsShortcuts(browser) { + if (!browser.gZenKeyboardShortcutsManager?._hasToLoadDevtools) { + return; + } let devtoolsKeyset = browser.gZenKeyboardShortcutsManager.getZenDevtoolsKeyset(browser); const remainingChildren = []; for (let i = devtoolsKeyset.children.length - 1; i >= 0; i--) { diff --git a/src/devtools/startup/DevToolsStartup-sys-mjs.patch b/src/devtools/startup/DevToolsStartup-sys-mjs.patch new file mode 100644 index 000000000..9607d3aac --- /dev/null +++ b/src/devtools/startup/DevToolsStartup-sys-mjs.patch @@ -0,0 +1,13 @@ +diff --git a/devtools/startup/DevToolsStartup.sys.mjs b/devtools/startup/DevToolsStartup.sys.mjs +index 0c9db6cb85c491a9f0fc216071afc66e553dcd51..10faeb699a35bb53bd0bd4bce36f18626a8f3288 100644 +--- a/devtools/startup/DevToolsStartup.sys.mjs ++++ b/devtools/startup/DevToolsStartup.sys.mjs +@@ -806,6 +806,8 @@ DevToolsStartup.prototype = { + // account (see bug 832984). + const mainKeyset = doc.getElementById("mainKeyset"); + mainKeyset.parentNode.insertBefore(keyset, mainKeyset); ++ ++ window.dispatchEvent(new window.Event("zen-devtools-keyset-added")); + }, + + /** From bdf46c5d96780f0c1a2cc38ac7275cc8b90e4065 Mon Sep 17 00:00:00 2001 From: "mr. M" Date: Fri, 3 Jan 2025 02:45:15 +0100 Subject: [PATCH 4/8] Refactor DevTools keyboard shortcuts management and restore default shortcuts --- .../zen-components/ZenKeyboardShortcuts.mjs | 25 +++++++------------ .../components/preferences/zen-settings.js | 17 +++++++++++++ .../startup/DevToolsStartup-sys-mjs.patch | 22 ++++++++++++++-- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs index e0e321c55..d9e25d67f 100644 --- a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs +++ b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs @@ -111,21 +111,6 @@ const fixedL10nIds = { 'Browser:ReloadSkipCache': 'zen-nav-reload-shortcut-skip-cache', cmd_close: 'zen-close-tab-shortcut', 'History:RestoreLastClosedTabOrWindowOrSession': 'zen-restore-last-closed-tab-shortcut', - - // Devtools - key_toggleToolbox: 'zen-devtools-toggle-shortcut', - key_browserToolbox: 'zen-devtools-toggle-browser-toolbox-shortcut', - key_browserConsole: 'zen-devtools-toggle-browser-console-shortcut', - key_responsiveDesignMode: 'zen-devtools-toggle-responsive-design-mode-shortcut', - key_inspector: 'zen-devtools-toggle-inspector-shortcut', - key_webconsole: 'zen-devtools-toggle-web-console-shortcut', - key_jsdebugger: 'zen-devtools-toggle-js-debugger-shortcut', - key_netmonitor: 'zen-devtools-toggle-net-monitor-shortcut', - key_styleeditor: 'zen-devtools-toggle-style-editor-shortcut', - key_performance: 'zen-devtools-toggle-performance-shortcut', - key_storage: 'zen-devtools-toggle-storage-shortcut', - key_dom: 'zen-devtools-toggle-dom-shortcut', - key_accessibility: 'zen-devtools-toggle-accessibility-shortcut', }; const ZEN_MAIN_KEYSET_ID = 'mainKeyset'; @@ -750,7 +735,6 @@ class ZenKeyboardShortcutsLoader { static zenGetDefaultDevToolsShortcuts() { let keySet = document.getElementById(ZEN_DEVTOOLS_KEYSET_ID); let newShortcutList = []; - for (let i = keySet.children.length - 1; i >= 0; i--) { let key = keySet.children[i]; if (this.IGNORED_DEVTOOLS_SHORTCUTS.includes(key.id)) { @@ -912,6 +896,7 @@ class ZenKeyboardShortcutsVersioner { window.removeEventListener('zen-devtools-keyset-added', listener); }; + gZenKeyboardShortcutsManager._hasToLoadDefaultDevtools = true; window.addEventListener('zen-devtools-keyset-added', listener); } return data; @@ -1034,12 +1019,16 @@ var gZenKeyboardShortcutsManager = { }, async updatedDefaultDevtoolsShortcuts(shortcuts) { + this._hasToLoadDefaultDevtools = false; this._currentShortcutList = this._currentShortcutList.concat(shortcuts); await this._saveShortcuts(); this._hasAddedDevtoolShortcuts(); }, _hasAddedDevtoolShortcuts() { + if (this._hasToLoadDevtools || this._hasToLoadDefaultDevtools) { + return; + } this._hasToLoadDevtools = true; this.triggerShortcutRebuild(); }, @@ -1093,12 +1082,16 @@ var gZenKeyboardShortcutsManager = { continue; } let child = key.toXHTMLElement(browser); + // child.addEventListener('command', event); devtoolsKeyset.appendChild(child); } for (let key of remainingChildren) { devtoolsKeyset.appendChild(key); } + + const mainKeyset = browser.document.getElementById(ZEN_MAIN_KEYSET_ID); + mainKeyset.before(devtoolsKeyset); }, async resetAllShortcuts() { diff --git a/src/browser/components/preferences/zen-settings.js b/src/browser/components/preferences/zen-settings.js index f96b360ce..db990e532 100644 --- a/src/browser/components/preferences/zen-settings.js +++ b/src/browser/components/preferences/zen-settings.js @@ -733,6 +733,21 @@ var zenMissingKeyboardShortcutL10n = { goHome: 'zen-key-go-home', key_redo: 'zen-key-redo', + + // Devtools + key_toggleToolbox: 'zen-devtools-toggle-shortcut', + key_browserToolbox: 'zen-devtools-toggle-browser-toolbox-shortcut', + key_browserConsole: 'zen-devtools-toggle-browser-console-shortcut', + key_responsiveDesignMode: 'zen-devtools-toggle-responsive-design-mode-shortcut', + key_inspector: 'zen-devtools-toggle-inspector-shortcut', + key_webconsole: 'zen-devtools-toggle-web-console-shortcut', + key_jsdebugger: 'zen-devtools-toggle-js-debugger-shortcut', + key_netmonitor: 'zen-devtools-toggle-net-monitor-shortcut', + key_styleeditor: 'zen-devtools-toggle-style-editor-shortcut', + key_performance: 'zen-devtools-toggle-performance-shortcut', + key_storage: 'zen-devtools-toggle-storage-shortcut', + key_dom: 'zen-devtools-toggle-dom-shortcut', + key_accessibility: 'zen-devtools-toggle-accessibility-shortcut', }; var gZenCKSSettings = { @@ -742,9 +757,11 @@ var gZenCKSSettings = { this.__hasInitialized = true; this._currentActionID = null; this._initializeEvents(); + gZenKeyboardShortcutsManager._devToolsEvents = ZenMultiWindowFeature.currentBrowser.gZenKeyboardShortcutsManager._devToolsEvents; window.addEventListener('unload', () => { this.__hasInitialized = false; document.getElementById(ZEN_CKS_WRAPPER_ID).innerHTML = ''; + gZenKeyboardShortcutsManager._devToolsEvents = {}; }); }, diff --git a/src/devtools/startup/DevToolsStartup-sys-mjs.patch b/src/devtools/startup/DevToolsStartup-sys-mjs.patch index 9607d3aac..401b92b2f 100644 --- a/src/devtools/startup/DevToolsStartup-sys-mjs.patch +++ b/src/devtools/startup/DevToolsStartup-sys-mjs.patch @@ -1,8 +1,18 @@ diff --git a/devtools/startup/DevToolsStartup.sys.mjs b/devtools/startup/DevToolsStartup.sys.mjs -index 0c9db6cb85c491a9f0fc216071afc66e553dcd51..10faeb699a35bb53bd0bd4bce36f18626a8f3288 100644 +index 0c9db6cb85c491a9f0fc216071afc66e553dcd51..f0e7911c1e284c9d9f20fc8a6a370f387419c8da 100644 --- a/devtools/startup/DevToolsStartup.sys.mjs +++ b/devtools/startup/DevToolsStartup.sys.mjs -@@ -806,6 +806,8 @@ DevToolsStartup.prototype = { +@@ -798,14 +798,18 @@ DevToolsStartup.prototype = { + + const keyset = doc.createXULElement("keyset"); + keyset.setAttribute("id", "devtoolsKeyset"); ++ this._zenTempWindow = window; + + this.attachKeys(doc, lazy.KeyShortcuts, keyset); + ++ this._zenTempWindow = null; + // Appending a element is not always enough. The needs + // to be detached and reattached to make sure the is taken into // account (see bug 832984). const mainKeyset = doc.getElementById("mainKeyset"); mainKeyset.parentNode.insertBefore(keyset, mainKeyset); @@ -11,3 +21,11 @@ index 0c9db6cb85c491a9f0fc216071afc66e553dcd51..10faeb699a35bb53bd0bd4bce36f1862 }, /** +@@ -935,6 +939,7 @@ DevToolsStartup.prototype = { + k.setAttribute("modifiers", mod); + } + ++ this._zenTempWindow.gZenKeyboardShortcutsManager._devToolsEvents[k.id] = oncommand; + k.addEventListener("command", oncommand); + + return k; From 21cd1c4e405345d97dc7a6b1f73da83822929915 Mon Sep 17 00:00:00 2001 From: "mr. M" Date: Fri, 3 Jan 2025 02:46:59 +0100 Subject: [PATCH 5/8] Refactor DevTools startup to streamline event management and remove unnecessary assignments --- .../components/preferences/zen-settings.js | 2 -- .../startup/DevToolsStartup-sys-mjs.patch | 22 ++----------------- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/src/browser/components/preferences/zen-settings.js b/src/browser/components/preferences/zen-settings.js index db990e532..b4d3f4ce8 100644 --- a/src/browser/components/preferences/zen-settings.js +++ b/src/browser/components/preferences/zen-settings.js @@ -757,11 +757,9 @@ var gZenCKSSettings = { this.__hasInitialized = true; this._currentActionID = null; this._initializeEvents(); - gZenKeyboardShortcutsManager._devToolsEvents = ZenMultiWindowFeature.currentBrowser.gZenKeyboardShortcutsManager._devToolsEvents; window.addEventListener('unload', () => { this.__hasInitialized = false; document.getElementById(ZEN_CKS_WRAPPER_ID).innerHTML = ''; - gZenKeyboardShortcutsManager._devToolsEvents = {}; }); }, diff --git a/src/devtools/startup/DevToolsStartup-sys-mjs.patch b/src/devtools/startup/DevToolsStartup-sys-mjs.patch index 401b92b2f..9607d3aac 100644 --- a/src/devtools/startup/DevToolsStartup-sys-mjs.patch +++ b/src/devtools/startup/DevToolsStartup-sys-mjs.patch @@ -1,18 +1,8 @@ diff --git a/devtools/startup/DevToolsStartup.sys.mjs b/devtools/startup/DevToolsStartup.sys.mjs -index 0c9db6cb85c491a9f0fc216071afc66e553dcd51..f0e7911c1e284c9d9f20fc8a6a370f387419c8da 100644 +index 0c9db6cb85c491a9f0fc216071afc66e553dcd51..10faeb699a35bb53bd0bd4bce36f18626a8f3288 100644 --- a/devtools/startup/DevToolsStartup.sys.mjs +++ b/devtools/startup/DevToolsStartup.sys.mjs -@@ -798,14 +798,18 @@ DevToolsStartup.prototype = { - - const keyset = doc.createXULElement("keyset"); - keyset.setAttribute("id", "devtoolsKeyset"); -+ this._zenTempWindow = window; - - this.attachKeys(doc, lazy.KeyShortcuts, keyset); - -+ this._zenTempWindow = null; - // Appending a element is not always enough. The needs - // to be detached and reattached to make sure the is taken into +@@ -806,6 +806,8 @@ DevToolsStartup.prototype = { // account (see bug 832984). const mainKeyset = doc.getElementById("mainKeyset"); mainKeyset.parentNode.insertBefore(keyset, mainKeyset); @@ -21,11 +11,3 @@ index 0c9db6cb85c491a9f0fc216071afc66e553dcd51..f0e7911c1e284c9d9f20fc8a6a370f38 }, /** -@@ -935,6 +939,7 @@ DevToolsStartup.prototype = { - k.setAttribute("modifiers", mod); - } - -+ this._zenTempWindow.gZenKeyboardShortcutsManager._devToolsEvents[k.id] = oncommand; - k.addEventListener("command", oncommand); - - return k; From 1fd231b96c94def4e08e6462b8fd5f4ca9b8ae54 Mon Sep 17 00:00:00 2001 From: "mr. M" Date: Fri, 3 Jan 2025 02:52:56 +0100 Subject: [PATCH 6/8] Update ignored DevTools shortcuts and add devtoolsShortcutListener placeholder --- .../zen-components/ZenKeyboardShortcuts.mjs | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs index d9e25d67f..6f0dfeb7a 100644 --- a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs +++ b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs @@ -730,7 +730,10 @@ class ZenKeyboardShortcutsLoader { return newShortcutList; } - static IGNORED_DEVTOOLS_SHORTCUTS = ['key_toggleToolboxF12']; + // Make sure to stay in sync with https://searchfox.org/mozilla-central/source/devtools/startup/DevToolsStartup.sys.mjs#879 + static IGNORED_DEVTOOLS_SHORTCUTS = ['key_toggleToolboxF12', 'profilerStartStop', + 'profilerStartStopAlternate', 'profilerCapture', 'profilerCaptureAlternate', + 'javascriptTracingToggle']; static zenGetDefaultDevToolsShortcuts() { let keySet = document.getElementById(ZEN_DEVTOOLS_KEYSET_ID); @@ -906,6 +909,25 @@ class ZenKeyboardShortcutsVersioner { var gZenKeyboardShortcutsManager = { loader: new ZenKeyboardShortcutsLoader(), _hasToLoadDevtools: false, + + devtoolsShortcutListener: { + //async onKey(window, key) { + // try { + // // Record the timing at which this event started in order to compute later in + // // gDevTools.showToolbox, the complete time it takes to open the toolbox. + // // i.e. especially take `initDevTools` into account. + // const startTime = Cu.now(); + // const require = this.initDevTools("KeyShortcut", key); + // const { + // gDevToolsBrowser, + // } = require("devtools/client/framework/devtools-browser"); + // await gDevToolsBrowser.onKeyShortcut(window, key, startTime); + // } catch (e) { + // console.error(`Exception while trigerring key ${key}: ${e}\n${e.stack}`); + // } + //}, + }, + beforeInit() { if (!this.inBrowserView) { return; From c419189ffaf3e8355aaa2f4c19dc6bed653ef76e Mon Sep 17 00:00:00 2001 From: "mr. M" Date: Fri, 3 Jan 2025 13:21:51 +0100 Subject: [PATCH 7/8] Refactor keyboard shortcut handling to improve key replacement logic and streamline event management --- .../zen-components/ZenKeyboardShortcuts.mjs | 58 +++++++------------ 1 file changed, 20 insertions(+), 38 deletions(-) diff --git a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs index 6f0dfeb7a..e5dd354c4 100644 --- a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs +++ b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs @@ -226,14 +226,14 @@ class KeyShortcutModifiers { if (this.#control) { str += 'control,'; } - if (this.#alt) { - str += 'alt,'; + if (this.#accel) { + str += 'accel,'; } if (this.#shift) { str += 'shift,'; } - if (this.#accel) { - str += 'accel,'; + if (this.#alt) { + str += 'alt,'; } if (this.#meta) { str += 'meta,'; @@ -385,13 +385,19 @@ class KeyShortcut { toXHTMLElement(window) { let key = window.document.createXULElement('key'); + return this.replaceWithChild(key); + } + + replaceWithChild(key) { key.id = this.#id; if (this.#keycode) { key.setAttribute('keycode', this.#keycode); + key.removeAttribute('key'); } else { // note to "mr. macos": Better use setAttribute, because without it, there's a // risk of malforming the XUL element. key.setAttribute('key', this.#key); + key.removeAttribute('keycode'); } key.setAttribute('group', this.#group); @@ -899,6 +905,8 @@ class ZenKeyboardShortcutsVersioner { window.removeEventListener('zen-devtools-keyset-added', listener); }; + // We need to load after an event because the devtools keyset is not in the DOM yet + // and we need to wait for it to be added. gZenKeyboardShortcutsManager._hasToLoadDefaultDevtools = true; window.addEventListener('zen-devtools-keyset-added', listener); } @@ -910,24 +918,6 @@ var gZenKeyboardShortcutsManager = { loader: new ZenKeyboardShortcutsLoader(), _hasToLoadDevtools: false, - devtoolsShortcutListener: { - //async onKey(window, key) { - // try { - // // Record the timing at which this event started in order to compute later in - // // gDevTools.showToolbox, the complete time it takes to open the toolbox. - // // i.e. especially take `initDevTools` into account. - // const startTime = Cu.now(); - // const require = this.initDevTools("KeyShortcut", key); - // const { - // gDevToolsBrowser, - // } = require("devtools/client/framework/devtools-browser"); - // await gDevToolsBrowser.onKeyShortcut(window, key, startTime); - // } catch (e) { - // console.error(`Exception while trigerring key ${key}: ${e}\n${e.stack}`); - // } - //}, - }, - beforeInit() { if (!this.inBrowserView) { return; @@ -1090,29 +1080,21 @@ var gZenKeyboardShortcutsManager = { return; } let devtoolsKeyset = browser.gZenKeyboardShortcutsManager.getZenDevtoolsKeyset(browser); - const remainingChildren = []; - for (let i = devtoolsKeyset.children.length - 1; i >= 0; i--) { - const key = devtoolsKeyset.children[i]; - if (ZenKeyboardShortcutsLoader.IGNORED_DEVTOOLS_SHORTCUTS.includes(key.id)) { - remainingChildren.push(key); - } - } - - devtoolsKeyset.innerHTML = ''; for (let key of this._currentShortcutList) { if (key.getGroup() != 'devTools') { continue; } - let child = key.toXHTMLElement(browser); - // child.addEventListener('command', event); - devtoolsKeyset.appendChild(child); - } - - for (let key of remainingChildren) { - devtoolsKeyset.appendChild(key); + if (ZenKeyboardShortcutsLoader.IGNORED_DEVTOOLS_SHORTCUTS.includes(key.getID())) { + continue; + } + const originalKey = browser.document.getElementById(key.getID()); + // We do not want to remove and create a new key in these cases, + // because it will lose the event listeners. + key.replaceWithChild(originalKey); } const mainKeyset = browser.document.getElementById(ZEN_MAIN_KEYSET_ID); + mainKeyset.after(devtoolsKeyset); mainKeyset.before(devtoolsKeyset); }, From d916d8f8df8a86710678fa3673f21e39b20b9fd2 Mon Sep 17 00:00:00 2001 From: "mr. M" Date: Fri, 3 Jan 2025 17:08:03 +0100 Subject: [PATCH 8/8] Refactor DevTools keyset management to ensure proper keyset creation and placement --- .../zen-components/ZenKeyboardShortcuts.mjs | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs index e5dd354c4..947cbcd96 100644 --- a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs +++ b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs @@ -999,13 +999,18 @@ var gZenKeyboardShortcutsManager = { getZenDevtoolsKeyset() { // note: we use `this` here because we are in the context of the browser if (!this._zenDevtoolsKeyset) { - const existingKeyset = document.getElementById(ZEN_DEVTOOLS_KEYSET_ID); + const id = `zen-${ZEN_DEVTOOLS_KEYSET_ID}`; + const existingKeyset = document.getElementById(id); if (existingKeyset) { this._zenDevtoolsKeyset = existingKeyset; return existingKeyset; } - throw new Error('[zen CKS]: Devtools keyset not found!'); + this._zenDevtoolsKeyset = document.createXULElement('keyset'); + this._zenDevtoolsKeyset.id = id; + + const mainKeyset = document.getElementById(ZEN_DEVTOOLS_KEYSET_ID); + mainKeyset.before(this._zenDevtoolsKeyset); } return this._zenDevtoolsKeyset; }, @@ -1069,9 +1074,8 @@ var gZenKeyboardShortcutsManager = { keyset.appendChild(child); } - mainKeyset.after(keyset); - this._applyDevtoolsShortcuts(browser); + mainKeyset.after(keyset); } }, @@ -1091,11 +1095,16 @@ var gZenKeyboardShortcutsManager = { // We do not want to remove and create a new key in these cases, // because it will lose the event listeners. key.replaceWithChild(originalKey); + // Move the key to the main keyset if it's not there, this is because + // changing modifiers will not work if they are under the devtools keyset + // for some really weird reason. + if (originalKey.parentElement.id === ZEN_DEVTOOLS_KEYSET_ID) { + devtoolsKeyset.prepend(originalKey); + } } - const mainKeyset = browser.document.getElementById(ZEN_MAIN_KEYSET_ID); - mainKeyset.after(devtoolsKeyset); - mainKeyset.before(devtoolsKeyset); + const originalDevKeyset = browser.document.getElementById(ZEN_DEVTOOLS_KEYSET_ID); + originalDevKeyset.after(devtoolsKeyset); }, async resetAllShortcuts() {