Cleanup and refactoring (#2239)

* Remove unused ignoreSelectors

* Remove unused isMouseButtonPressed

* Update getWritingMode to use the immediate element if possible

* Move static functions to DocumentUtil

* Fix documentation
This commit is contained in:
toasted-nutbread 2022-09-27 20:17:59 -04:00 committed by GitHub
parent be7855bad2
commit f76c7d74d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 45 additions and 49 deletions

View File

@ -328,16 +328,6 @@ class DocumentUtil {
return false;
}
static isMouseButtonPressed(mouseEvent, button) {
const mouseEventButton = mouseEvent.button;
switch (button) {
case 'primary': return mouseEventButton === 0;
case 'secondary': return mouseEventButton === 2;
case 'auxiliary': return mouseEventButton === 1;
default: return false;
}
}
/**
* Gets an array of the active modifier keys.
* @param {KeyboardEvent|MouseEvent|TouchEvent} event The event to check.
@ -563,6 +553,26 @@ class DocumentUtil {
}
}
/**
* Converts a value from an element to a number.
* @param {string} value A string representation of a number.
* @param {object} constraints An object which might contain `min`, `max`, and `step` fields which are used to constrain the value.
* @returns {number} The parsed and constrained number.
*/
static convertElementValueToNumber(value, constraints) {
value = parseFloat(value);
if (!Number.isFinite(value)) { value = 0; }
let {min, max, step} = constraints;
min = this._convertToNumberOrNull(min);
max = this._convertToNumberOrNull(max);
step = this._convertToNumberOrNull(step);
if (typeof min === 'number') { value = Math.max(value, min); }
if (typeof max === 'number') { value = Math.min(value, max); }
if (typeof step === 'number' && step !== 0) { value = Math.round(value / step) * step; }
return value;
}
// Private
static _getActiveButtons(event, array) {
@ -905,6 +915,16 @@ class DocumentUtil {
static _isElementUserSelectAll(element) {
return getComputedStyle(element).userSelect === 'all';
}
static _convertToNumberOrNull(value) {
if (typeof value !== 'number') {
if (typeof value !== 'string' || value.length === 0) {
return null;
}
value = parseFloat(value);
}
return !Number.isNaN(value) ? value : null;
}
}
// eslint-disable-next-line no-underscore-dangle
DocumentUtil._transparentColorPattern = /rgba\s*\([^)]*,\s*0(?:\.0+)?\s*\)/;

View File

@ -16,14 +16,14 @@
*/
/* global
* DocumentUtil
* SelectorObserver
* TaskAccumulator
*/
class DOMDataBinder {
constructor({selector, ignoreSelectors=[], createElementMetadata, compareElementMetadata, getValues, setValues, onError=null}) {
constructor({selector, createElementMetadata, compareElementMetadata, getValues, setValues, onError=null}) {
this._selector = selector;
this._ignoreSelectors = ignoreSelectors;
this._createElementMetadata = createElementMetadata;
this._compareElementMetadata = compareElementMetadata;
this._getValues = getValues;
@ -33,7 +33,7 @@ class DOMDataBinder {
this._assignTasks = new TaskAccumulator(this._onBulkAssign.bind(this));
this._selectorObserver = new SelectorObserver({
selector,
ignoreSelector: (ignoreSelectors.length > 0 ? ignoreSelectors.join(',') : null),
ignoreSelector: null,
onAdded: this._createObserver.bind(this),
onRemoved: this._removeObserver.bind(this),
onChildrenUpdated: this._onObserverChildrenUpdated.bind(this),
@ -186,7 +186,7 @@ class DOMDataBinder {
case 'text':
return `${element.value}`;
case 'number':
return DOMDataBinder.convertToNumber(element.value, element);
return DocumentUtil.convertElementValueToNumber(element.value, element);
case 'textarea':
case 'select':
return element.value;
@ -210,30 +210,4 @@ class DOMDataBinder {
return null;
}
}
// Utilities
static convertToNumber(value, constraints) {
value = parseFloat(value);
if (!Number.isFinite(value)) { value = 0; }
let {min, max, step} = constraints;
min = DOMDataBinder.convertToNumberOrNull(min);
max = DOMDataBinder.convertToNumberOrNull(max);
step = DOMDataBinder.convertToNumberOrNull(step);
if (typeof min === 'number') { value = Math.max(value, min); }
if (typeof max === 'number') { value = Math.min(value, max); }
if (typeof step === 'number' && step !== 0) { value = Math.round(value / step) * step; }
return value;
}
static convertToNumberOrNull(value) {
if (typeof value !== 'number') {
if (typeof value !== 'string' || value.length === 0) {
return null;
}
value = parseFloat(value);
}
return !Number.isNaN(value) ? value : null;
}
}

View File

@ -124,7 +124,7 @@ class TextSourceRange {
* @param {boolean} fromEnd Whether to move the offset from the current end position (if `true`) or the start position (if `false`).
* @param {boolean} layoutAwareScan Whether or not HTML layout information should be used to generate
* the string content when scanning.
* @returns {number} The actual number of characters (not codepoints) that were read.
* @returns {number} The actual number of codepoints that were read.
*/
setEndOffset(length, fromEnd, layoutAwareScan) {
let node;
@ -147,7 +147,7 @@ class TextSourceRange {
* @param {number} length The maximum number of codepoints to move by.
* @param {boolean} layoutAwareScan Whether or not HTML layout information should be used to generate
* the string content when scanning.
* @returns {number} The actual number of characters (not codepoints) that were read.
* @returns {number} The actual number of codepoints that were read.
*/
setStartOffset(length, layoutAwareScan) {
const state = new DOMTextScanner(this._range.startContainer, this._range.startOffset, !layoutAwareScan, layoutAwareScan).seek(-length);
@ -172,8 +172,9 @@ class TextSourceRange {
* @returns {string} The rects.
*/
getWritingMode() {
const node = this._isImposterDisconnected() ? this._imposterSourceElement : this._range.startContainer;
return DocumentUtil.getElementWritingMode(node !== null ? node.parentElement : null);
let node = this._isImposterDisconnected() ? this._imposterSourceElement : this._range.startContainer;
if (node !== null && node.nodeType !== Node.ELEMENT_NODE) { node = node.parentElement; }
return DocumentUtil.getElementWritingMode(node);
}
/**

View File

@ -17,6 +17,7 @@
/* globals
* DOMDataBinder
* DocumentUtil
*/
class GenericSettingController {
@ -218,7 +219,7 @@ class GenericSettingController {
_toNumber(value, data) {
let {constraints} = data;
if (!isObject(constraints)) { constraints = {}; }
return DOMDataBinder.convertToNumber(value, constraints);
return DocumentUtil.convertElementValueToNumber(value, constraints);
}
_toBoolean(value) {

View File

@ -16,7 +16,7 @@
*/
/* global
* DOMDataBinder
* DocumentUtil
* KeyboardMouseInputField
* ObjectPropertyAccessor
*/
@ -322,7 +322,7 @@ class KeyboardShortcutHotkeyEntry {
let value = this._getArgumentInputValue(node);
switch (template) {
case 'hotkey-argument-move-offset':
value = `${DOMDataBinder.convertToNumber(value, node)}`;
value = `${DocumentUtil.convertElementValueToNumber(value, node)}`;
break;
}
this._setArgument(value);

View File

@ -16,7 +16,7 @@
*/
/* global
* DOMDataBinder
* DocumentUtil
*/
class NestedPopupsController {
@ -52,7 +52,7 @@ class NestedPopupsController {
_onNestedPopupsCountChange(e) {
const node = e.currentTarget;
const value = Math.max(1, DOMDataBinder.convertToNumber(node.value, node));
const value = Math.max(1, DocumentUtil.convertElementValueToNumber(node.value, node));
this._setPopupNestingMaxDepth(value);
}