/** * 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 EditorState = require("./EditorState"); var containsNode = require("fbjs/lib/containsNode"); var getActiveElement = require("fbjs/lib/getActiveElement"); function editOnBlur(editor, e) { // In a contentEditable element, when you select a range and then click // another active element, this does trigger a `blur` event but will not // remove the DOM selection from the contenteditable. // This is consistent across all browsers, but we prefer that the editor // behave like a textarea, where a `blur` event clears the DOM selection. // We therefore force the issue to be certain, checking whether the active // element is `body` to force it when blurring occurs within the window (as // opposed to clicking to another tab or window). var ownerDocument = e.currentTarget.ownerDocument; if ( // This ESLint rule conflicts with `sketchy-null-bool` flow check // eslint-disable-next-line no-extra-boolean-cast !Boolean(editor.props.preserveSelectionOnBlur) && getActiveElement(ownerDocument) === ownerDocument.body) { var _selection = ownerDocument.defaultView.getSelection(); var editorNode = editor.editor; if (_selection.rangeCount === 1 && containsNode(editorNode, _selection.anchorNode) && containsNode(editorNode, _selection.focusNode)) { _selection.removeAllRanges(); } } var editorState = editor._latestEditorState; var currentSelection = editorState.getSelection(); if (!currentSelection.getHasFocus()) { return; } var selection = currentSelection.set('hasFocus', false); editor.props.onBlur && editor.props.onBlur(e); editor.update(EditorState.acceptSelection(editorState, selection)); } module.exports = editOnBlur;