title-text.js 884 B

123456789101112131415161718192021222324252627282930313233
  1. import matches from '../matches/matches';
  2. import getRole from '../aria/get-role';
  3. import AbstractVirtualNode from '../../core/base/virtual-node/abstract-virtual-node';
  4. import { getNodeFromTree } from '../../core/utils';
  5. const alwaysTitleElements = ['iframe'];
  6. /**
  7. * Get title text
  8. * @param {HTMLElement|VirtualNode}node the node to verify
  9. * @return {String}
  10. */
  11. function titleText(node) {
  12. const vNode =
  13. node instanceof AbstractVirtualNode ? node : getNodeFromTree(node);
  14. if (vNode.props.nodeType !== 1 || !node.hasAttr('title')) {
  15. return '';
  16. }
  17. // Some elements return the title even with role=presentation
  18. // This does appear in any spec, but its remarkably consistent
  19. if (
  20. !matches(vNode, alwaysTitleElements) &&
  21. ['none', 'presentation'].includes(getRole(vNode))
  22. ) {
  23. return '';
  24. }
  25. return vNode.attr('title');
  26. }
  27. export default titleText;