containsNode.js.flow 970 B

123456789101112131415161718192021222324252627282930313233343536
  1. /**
  2. * Copyright (c) 2013-present, Facebook, Inc.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. *
  7. * @providesModule containsNode
  8. * @flow
  9. */
  10. const isTextNode = require('./isTextNode');
  11. /*eslint-disable no-bitwise */
  12. /**
  13. * Checks if a given DOM node contains or is another DOM node.
  14. */
  15. function containsNode(outerNode: ?Node, innerNode: ?Node): boolean {
  16. if (!outerNode || !innerNode) {
  17. return false;
  18. } else if (outerNode === innerNode) {
  19. return true;
  20. } else if (isTextNode(outerNode)) {
  21. return false;
  22. } else if (isTextNode(innerNode)) {
  23. return containsNode(outerNode, innerNode.parentNode);
  24. } else if ('contains' in outerNode) {
  25. return outerNode.contains(innerNode);
  26. } else if (outerNode.compareDocumentPosition) {
  27. return !!(outerNode.compareDocumentPosition(innerNode) & 16);
  28. } else {
  29. return false;
  30. }
  31. }
  32. module.exports = containsNode;