label-virtual.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import idrefs from '../dom/idrefs';
  2. import visibleVirtual from '../text/visible-virtual';
  3. import sanitize from '../text/sanitize';
  4. import { getNodeFromTree } from '../../core/utils';
  5. /**
  6. * Gets the accessible ARIA label text of a given element
  7. * @see http://www.w3.org/WAI/PF/aria/roles#namecalculation
  8. * @method labelVirtual
  9. * @memberof axe.commons.aria
  10. * @instance
  11. * @param {VirtualNode} virtualNode The virtualNode to test
  12. * @return {Mixed} String of visible text, or `null` if no label is found
  13. */
  14. function labelVirtual(virtualNode) {
  15. let ref, candidate;
  16. if (virtualNode.attr('aria-labelledby')) {
  17. // aria-labelledby
  18. ref = idrefs(virtualNode.actualNode, 'aria-labelledby');
  19. candidate = ref
  20. .map(thing => {
  21. const vNode = getNodeFromTree(thing);
  22. return vNode ? visibleVirtual(vNode, true) : '';
  23. })
  24. .join(' ')
  25. .trim();
  26. if (candidate) {
  27. return candidate;
  28. }
  29. }
  30. // aria-label
  31. candidate = virtualNode.attr('aria-label');
  32. if (candidate) {
  33. candidate = sanitize(candidate);
  34. if (candidate) {
  35. return candidate;
  36. }
  37. }
  38. return null;
  39. }
  40. export default labelVirtual;