|
- /**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- *
- * @format
- *
- * @emails oncall+draft_js
- */
- 'use strict';
-
- var UserAgent = require("fbjs/lib/UserAgent");
-
- var invariant = require("fbjs/lib/invariant");
-
- var isChrome = UserAgent.isBrowser('Chrome'); // In Chrome, the client rects will include the entire bounds of all nodes that
- // begin (have a start tag) within the selection, even if the selection does
- // not overlap the entire node. To resolve this, we split the range at each
- // start tag and join the client rects together.
- // https://code.google.com/p/chromium/issues/detail?id=324437
-
- /* eslint-disable consistent-return */
-
- function getRangeClientRectsChrome(range) {
- var tempRange = range.cloneRange();
- var clientRects = [];
-
- for (var ancestor = range.endContainer; ancestor != null; ancestor = ancestor.parentNode) {
- // If we've climbed up to the common ancestor, we can now use the
- // original start point and stop climbing the tree.
- var atCommonAncestor = ancestor === range.commonAncestorContainer;
-
- if (atCommonAncestor) {
- tempRange.setStart(range.startContainer, range.startOffset);
- } else {
- tempRange.setStart(tempRange.endContainer, 0);
- }
-
- var rects = Array.from(tempRange.getClientRects());
- clientRects.push(rects);
-
- if (atCommonAncestor) {
- var _ref;
-
- clientRects.reverse();
- return (_ref = []).concat.apply(_ref, clientRects);
- }
-
- tempRange.setEndBefore(ancestor);
- }
-
- !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'Found an unexpected detached subtree when getting range client rects.') : invariant(false) : void 0;
- }
- /* eslint-enable consistent-return */
-
- /**
- * Like range.getClientRects() but normalizes for browser bugs.
- */
-
-
- var getRangeClientRects = isChrome ? getRangeClientRectsChrome : function (range) {
- return Array.from(range.getClientRects());
- };
- module.exports = getRangeClientRects;
|