aboutsummaryrefslogtreecommitdiff
path: root/ext/js/dom/text-source-range.js
diff options
context:
space:
mode:
Diffstat (limited to 'ext/js/dom/text-source-range.js')
-rw-r--r--ext/js/dom/text-source-range.js33
1 files changed, 25 insertions, 8 deletions
diff --git a/ext/js/dom/text-source-range.js b/ext/js/dom/text-source-range.js
index d5e70052..5c3d4184 100644
--- a/ext/js/dom/text-source-range.js
+++ b/ext/js/dom/text-source-range.js
@@ -36,26 +36,33 @@ export class TextSourceRange {
* @param {?Element} imposterElement The temporary imposter element.
* @param {?Element} imposterSourceElement The source element which the imposter is imitating.
* Must not be `null` if imposterElement is specified.
- * @param {?Rect[]} cachedRects A set of cached `DOMRect`s representing the rects of the text source,
+ * @param {?DOMRect[]} cachedRects A set of cached `DOMRect`s representing the rects of the text source,
* which can be used after the imposter element is removed from the page.
* Must not be `null` if imposterElement is specified.
- * @param {?Rect} cachedSourceRect A cached `DOMRect` representing the rect of the `imposterSourceElement`,
+ * @param {?DOMRect} cachedSourceRect A cached `DOMRect` representing the rect of the `imposterSourceElement`,
* which can be used after the imposter element is removed from the page.
* Must not be `null` if imposterElement is specified.
*/
constructor(range, rangeStartOffset, content, imposterElement, imposterSourceElement, cachedRects, cachedSourceRect) {
+ /** @type {Range} */
this._range = range;
+ /** @type {number} */
this._rangeStartOffset = rangeStartOffset;
+ /** @type {string} */
this._content = content;
+ /** @type {?Element} */
this._imposterElement = imposterElement;
+ /** @type {?Element} */
this._imposterSourceElement = imposterSourceElement;
+ /** @type {?DOMRect[]} */
this._cachedRects = cachedRects;
+ /** @type {?DOMRect} */
this._cachedSourceRect = cachedSourceRect;
}
/**
* Gets the type name of this instance.
- * @type {string}
+ * @type {'range'}
*/
get type() {
return 'range';
@@ -71,7 +78,7 @@ export class TextSourceRange {
/**
* The starting offset for the range.
- * @type {Range}
+ * @type {number}
*/
get rangeStartOffset() {
return this._rangeStartOffset;
@@ -169,12 +176,12 @@ export class TextSourceRange {
/**
* Gets writing mode that is used for this element.
* See: https://developer.mozilla.org/en-US/docs/Web/CSS/writing-mode.
- * @returns {string} The rects.
+ * @returns {import('document-util').NormalizedWritingMode} The writing mode.
*/
getWritingMode() {
let node = this._isImposterDisconnected() ? this._imposterSourceElement : this._range.startContainer;
if (node !== null && node.nodeType !== Node.ELEMENT_NODE) { node = node.parentElement; }
- return DocumentUtil.getElementWritingMode(node);
+ return DocumentUtil.getElementWritingMode(/** @type {?Element} */ (node));
}
/**
@@ -183,6 +190,7 @@ export class TextSourceRange {
select() {
if (this._imposterElement !== null) { return; }
const selection = window.getSelection();
+ if (selection === null) { return; }
selection.removeAllRanges();
selection.addRange(this._range);
}
@@ -193,6 +201,7 @@ export class TextSourceRange {
deselect() {
if (this._imposterElement !== null) { return; }
const selection = window.getSelection();
+ if (selection === null) { return; }
selection.removeAllRanges();
}
@@ -220,7 +229,7 @@ export class TextSourceRange {
try {
return this._range.compareBoundaryPoints(Range.START_TO_START, other.range) === 0;
} catch (e) {
- if (e.name === 'WrongDocumentError') {
+ if (e instanceof Error && e.name === 'WrongDocumentError') {
// This can happen with shadow DOMs if the ranges are in different documents.
return false;
}
@@ -269,9 +278,17 @@ export class TextSourceRange {
/**
* Gets the cached rects for a disconnected imposter element.
- * @returns {Rect[]} The rects for the element.
+ * @returns {DOMRect[]} The rects for the element.
+ * @throws {Error}
*/
_getCachedRects() {
+ if (
+ this._cachedRects === null ||
+ this._cachedSourceRect === null ||
+ this._imposterSourceElement === null
+ ) {
+ throw new Error('Cached rects not valid for this instance');
+ }
const sourceRect = DocumentUtil.convertRectZoomCoordinates(this._imposterSourceElement.getBoundingClientRect(), this._imposterSourceElement);
return DocumentUtil.offsetDOMRects(
this._cachedRects,