From 73dd578821d1373d4504778318e2e2f26b79a80e Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Sat, 26 Sep 2020 19:24:21 -0400 Subject: [PATCH] Add middle mouse prevention option (#868) * Add preventMiddleMouse option to TextScanner * Add preventMiddleMouse options * Add options * Apply preventMiddleMouse options --- ext/bg/data/options-schema.json | 28 ++++++++++++++++++++++++++++ ext/bg/js/options.js | 7 +++++++ ext/bg/settings.html | 10 ++++++++++ ext/fg/js/frontend.js | 13 ++++++++++++- ext/mixed/js/display.js | 3 ++- ext/mixed/js/text-scanner.js | 21 +++++++++++++++++---- test/test-options-util.js | 6 ++++++ 7 files changed, 82 insertions(+), 6 deletions(-) diff --git a/ext/bg/data/options-schema.json b/ext/bg/data/options-schema.json index 2e324984..80f8d782 100644 --- a/ext/bg/data/options-schema.json +++ b/ext/bg/data/options-schema.json @@ -320,6 +320,7 @@ "type": "object", "required": [ "inputs", + "preventMiddleMouse", "touchInputEnabled", "pointerEventsEnabled", "selectText", @@ -454,6 +455,33 @@ } } }, + "preventMiddleMouse": { + "type": "object", + "required": [ + "onWebPages", + "onPopupPages", + "onSearchPages", + "onSearchQuery" + ], + "properties": { + "onWebPages": { + "type": "boolean", + "default": false + }, + "onPopupPages": { + "type": "boolean", + "default": false + }, + "onSearchPages": { + "type": "boolean", + "default": false + }, + "onSearchQuery": { + "type": "boolean", + "default": false + } + } + }, "touchInputEnabled": { "type": "boolean", "default": true diff --git a/ext/bg/js/options.js b/ext/bg/js/options.js index f9571ec2..cf24645a 100644 --- a/ext/bg/js/options.js +++ b/ext/bg/js/options.js @@ -507,6 +507,7 @@ class OptionsUtil { // Added hideDelay. // Added inputs to profileOptions.scanning. // Added pointerEventsEnabled to profileOptions.scanning. + // Added preventMiddleMouse to profileOptions.scanning. for (const {conditionGroups} of options.profiles) { for (const {conditions} of conditionGroups) { for (const condition of conditions) { @@ -531,6 +532,12 @@ class OptionsUtil { profileOptions.general.usePopupWindow = false; profileOptions.scanning.hideDelay = 0; profileOptions.scanning.pointerEventsEnabled = false; + profileOptions.scanning.preventMiddleMouse = { + onWebPages: false, + onPopupPages: false, + onSearchPages: false, + onSearchQuery: false + }; const {modifier, middleMouse} = profileOptions.scanning; delete profileOptions.scanning.modifier; diff --git a/ext/bg/settings.html b/ext/bg/settings.html index 9c8621f7..8dea0245 100644 --- a/ext/bg/settings.html +++ b/ext/bg/settings.html @@ -414,6 +414,16 @@ +
+ Prevent middle mouse button actions on: +
+
+
+
+
+
+
+
diff --git a/ext/fg/js/frontend.js b/ext/fg/js/frontend.js index 13b0d80c..95c9eb1b 100644 --- a/ext/fg/js/frontend.js +++ b/ext/fg/js/frontend.js @@ -320,6 +320,7 @@ class Frontend { await this._updatePopup(); + const preventMiddleMouse = this._getPreventMiddleMouseValueForPageType(scanningOptions.preventMiddleMouse); this._textScanner.setOptions({ inputs: scanningOptions.inputs, deepContentScan: scanningOptions.deepDomScan, @@ -329,7 +330,8 @@ class Frontend { pointerEventsEnabled: scanningOptions.pointerEventsEnabled, scanLength: scanningOptions.length, sentenceExtent: options.anki.sentenceExt, - layoutAwareScan: scanningOptions.layoutAwareScan + layoutAwareScan: scanningOptions.layoutAwareScan, + preventMiddleMouse }); this._updateTextScannerEnabled(); @@ -616,4 +618,13 @@ class Frontend { await this._updatePendingOptions(); return await this.getOptionsContext(); } + + _getPreventMiddleMouseValueForPageType(preventMiddleMouseOptions) { + switch (this._pageType) { + case 'web': return preventMiddleMouseOptions.onWebPages; + case 'popup': return preventMiddleMouseOptions.onPopupPages; + case 'search': return preventMiddleMouseOptions.onSearchPages; + default: return false; + } + } } diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index e5f12a1a..c7ad8894 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -251,7 +251,8 @@ class Display extends EventDispatcher { pointerEventsEnabled: scanning.pointerEventsEnabled, scanLength: scanning.length, sentenceExtent: options.anki.sentenceExt, - layoutAwareScan: scanning.layoutAwareScan + layoutAwareScan: scanning.layoutAwareScan, + preventMiddleMouse: scanning.preventMiddleMouse.onSearchQuery } }); } diff --git a/ext/mixed/js/text-scanner.js b/ext/mixed/js/text-scanner.js index aacc683a..b8d4faf5 100644 --- a/ext/mixed/js/text-scanner.js +++ b/ext/mixed/js/text-scanner.js @@ -49,6 +49,7 @@ class TextScanner extends EventDispatcher { this._scanLength = 1; this._sentenceExtent = 1; this._layoutAwareScan = false; + this._preventMiddleMouse = false; this._inputs = []; this._enabled = false; @@ -113,7 +114,7 @@ class TextScanner extends EventDispatcher { } } - setOptions({inputs, deepContentScan, selectText, delay, touchInputEnabled, pointerEventsEnabled, scanLength, sentenceExtent, layoutAwareScan}) { + setOptions({inputs, deepContentScan, selectText, delay, touchInputEnabled, pointerEventsEnabled, scanLength, sentenceExtent, layoutAwareScan, preventMiddleMouse}) { if (Array.isArray(inputs)) { this._inputs = inputs.map(({ include, @@ -151,6 +152,9 @@ class TextScanner extends EventDispatcher { if (typeof layoutAwareScan === 'boolean') { this._layoutAwareScan = layoutAwareScan; } + if (typeof preventMiddleMouse === 'boolean') { + this._preventMiddleMouse = preventMiddleMouse; + } } getTextSourceContent(textSource, length, layoutAwareScan) { @@ -282,9 +286,18 @@ class TextScanner extends EventDispatcher { return false; } - if (e.button === 0) { // Primary - this._scanTimerClear(); - this.clearSelection(false); + switch (e.button) { + case 0: // Primary + this._scanTimerClear(); + this.clearSelection(false); + break; + case 1: // Middle + if (this._preventMiddleMouse) { + e.preventDefault(); + e.stopPropagation(); + return false; + } + break; } } diff --git a/test/test-options-util.js b/test/test-options-util.js index 3c6e8733..b1b6dab7 100644 --- a/test/test-options-util.js +++ b/test/test-options-util.js @@ -316,6 +316,12 @@ function createProfileOptionsUpdatedTestData1() { layoutAwareScan: false, hideDelay: 0, pointerEventsEnabled: false, + preventMiddleMouse: { + onWebPages: false, + onPopupPages: false, + onSearchPages: false, + onSearchQuery: false + }, inputs: [ { include: 'shift',