diff options
Diffstat (limited to 'ext/js/dom')
-rw-r--r-- | ext/js/dom/document-util.js | 40 | ||||
-rw-r--r-- | ext/js/dom/dom-data-binder.js | 34 | ||||
-rw-r--r-- | ext/js/dom/text-source-range.js | 9 |
3 files changed, 39 insertions, 44 deletions
diff --git a/ext/js/dom/document-util.js b/ext/js/dom/document-util.js index ed0a98e7..3934c1e2 100644 --- a/ext/js/dom/document-util.js +++ b/ext/js/dom/document-util.js @@ -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*\)/; diff --git a/ext/js/dom/dom-data-binder.js b/ext/js/dom/dom-data-binder.js index 185dc439..5835cf8c 100644 --- a/ext/js/dom/dom-data-binder.js +++ b/ext/js/dom/dom-data-binder.js @@ -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; - } } diff --git a/ext/js/dom/text-source-range.js b/ext/js/dom/text-source-range.js index a0225748..bbc22599 100644 --- a/ext/js/dom/text-source-range.js +++ b/ext/js/dom/text-source-range.js @@ -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); } /** |