/** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule getVisibleSelectionRect * @format * @flow */ '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. */ 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;