diff options
Diffstat (limited to 'ext/js/dom/document-util.js')
| -rw-r--r-- | ext/js/dom/document-util.js | 59 | 
1 files changed, 56 insertions, 3 deletions
| diff --git a/ext/js/dom/document-util.js b/ext/js/dom/document-util.js index 76f551c7..73525ff5 100644 --- a/ext/js/dom/document-util.js +++ b/ext/js/dom/document-util.js @@ -66,7 +66,7 @@ class DocumentUtil {                  case 'IMG':                  case 'BUTTON':                  case 'SELECT': -                    return new TextSourceElement(element); +                    return TextSourceElement.create(element);                  case 'INPUT':                      if (element.type === 'text') {                          imposterSourceElement = element; @@ -85,8 +85,9 @@ class DocumentUtil {              if (imposter !== null) {                  this._setImposterStyle(imposterContainer.style, 'z-index', '-2147483646');                  this._setImposterStyle(imposter.style, 'pointer-events', 'none'); +                return TextSourceRange.createFromImposter(range, imposterContainer, imposterSourceElement);              } -            return new TextSourceRange(range, '', imposterContainer, imposterSourceElement); +            return TextSourceRange.create(range);          } else {              if (imposterContainer !== null) {                  imposterContainer.parentNode.removeChild(imposterContainer); @@ -131,7 +132,7 @@ class DocumentUtil {          // Scan text          source = source.clone();          const startLength = source.setStartOffset(extent, layoutAwareScan); -        const endLength = source.setEndOffset(extent * 2 - startLength, layoutAwareScan, true); +        const endLength = source.setEndOffset(extent * 2 - startLength, true, layoutAwareScan);          const text = source.text();          const textLength = text.length;          const textEndAnchor = textLength - endLength; @@ -418,6 +419,58 @@ class DocumentUtil {          }      } +    /** +     * Offsets an array of DOMRects by a given amount. +     * @param {DOMRect[]} rects The DOMRects to offset. +     * @param {number} x The horizontal offset amount. +     * @param {number} y The vertical offset amount. +     * @returns {DOMRect} The DOMRects with the offset applied. +     */ +    static offsetDOMRects(rects, x, y) { +        const results = []; +        for (const rect of rects) { +            results.push(new DOMRect(rect.left + x, rect.top + y, rect.width, rect.height)); +        } +        return results; +    } + +    /** +     * Gets the parent writing mode of an element. +     * See: https://developer.mozilla.org/en-US/docs/Web/CSS/writing-mode. +     * @param {Element} element The HTML element to check. +     * @returns {string} The writing mode. +     */ +    static getElementWritingMode(element) { +        if (element !== null) { +            const {writingMode} = getComputedStyle(element); +            if (typeof writingMode === 'string') { +                return this.normalizeWritingMode(writingMode); +            } +        } +        return 'horizontal-tb'; +    } + +    /** +     * Normalizes a CSS writing mode value by converting non-standard and deprecated values +     * into their corresponding standard vaules. +     * @param {string} writingMode The writing mode to normalize. +     * @returns {string} The normalized writing mode. +     */ +    static normalizeWritingMode(writingMode) { +        switch (writingMode) { +            case 'lr': +            case 'lr-tb': +            case 'rl': +                return 'horizontal-tb'; +            case 'tb': +                return 'vertical-lr'; +            case 'tb-rl': +                return 'vertical-rl'; +            default: +                return writingMode; +        } +    } +      // Private      static _getActiveButtons(event, array) { |