src/component/selection/getVisibleSelectionRect.js (17 lines of code) (raw):

/** * 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 * @flow * @emails oncall+draft_js */ 'use strict'; import type {FakeClientRect} from 'getRangeBoundingClientRect'; const getRangeBoundingClientRect = require('getRangeBoundingClientRect'); /** * Return the bounding ClientRect for the visible DOM selection, if any. * In cases where there are no selected ranges or the bounding rect is * temporarily invalid, return null. * * When using from an iframe, you should pass the iframe window object */ function getVisibleSelectionRect(global: any): ?FakeClientRect { const selection = global.getSelection(); if (!selection.rangeCount) { return null; } const range = selection.getRangeAt(0); const boundingRect = getRangeBoundingClientRect(range); const {top, right, bottom, left} = boundingRect; // When a re-render leads to a node being removed, the DOM selection will // temporarily be placed on an ancestor node, which leads to an invalid // bounding rect. Discard this state. if (top === 0 && right === 0 && bottom === 0 && left === 0) { return null; } return boundingRect; } module.exports = getVisibleSelectionRect;