@afixt/test-utils 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/CLAUDE.md +1 -1
  3. package/README.md +40 -1
  4. package/docs/arrayUtils.js.html +8 -13
  5. package/docs/colorConversions.js.html +238 -0
  6. package/docs/constants.js.html +671 -0
  7. package/docs/cssUtils.js.html +80 -0
  8. package/docs/data/search.json +1 -1
  9. package/docs/domUtils.js.html +252 -32
  10. package/docs/formUtils.js.html +161 -0
  11. package/docs/getAccessibleName.js.html +215 -120
  12. package/docs/getAccessibleText.js.html +103 -48
  13. package/docs/getAriaAttributesByElement.js.html +4 -4
  14. package/docs/getCSSGeneratedContent.js.html +50 -41
  15. package/docs/getComputedRole.js.html +8 -3
  16. package/docs/getFocusableElements.js.html +25 -21
  17. package/docs/getGeneratedContent.js.html +24 -13
  18. package/docs/getImageText.js.html +31 -9
  19. package/docs/getStyleObject.js.html +7 -3
  20. package/docs/global.html +1 -1
  21. package/docs/hasAccessibleName.js.html +2 -10
  22. package/docs/hasAttribute.js.html +7 -3
  23. package/docs/hasCSSGeneratedContent.js.html +18 -14
  24. package/docs/hasHiddenParent.js.html +4 -4
  25. package/docs/hasParent.js.html +7 -3
  26. package/docs/hasValidAriaAttributes.js.html +7 -3
  27. package/docs/index.html +1 -1
  28. package/docs/index.js.html +98 -32
  29. package/docs/isA11yVisible.js.html +98 -0
  30. package/docs/isAriaAttributesValid.js.html +10 -64
  31. package/docs/isComplexTable.js.html +13 -6
  32. package/docs/isDataTable.js.html +11 -6
  33. package/docs/isFocusable.js.html +36 -12
  34. package/docs/isHidden.js.html +47 -11
  35. package/docs/isOffScreen.js.html +7 -3
  36. package/docs/isValidUrl.js.html +7 -3
  37. package/docs/listEventListeners.js.html +203 -0
  38. package/docs/module-QueryCache.html +3 -0
  39. package/docs/module-afixt-test-utils.html +1 -1
  40. package/docs/module-colorConversions.html +3 -0
  41. package/docs/module-constants.html +3 -0
  42. package/docs/module-cssUtils.html +3 -0
  43. package/docs/module-formUtils.html +3 -0
  44. package/docs/module-suggestContrast.html +3 -0
  45. package/docs/module-tableUtils.html +3 -0
  46. package/docs/queryCache.js.html +360 -0
  47. package/docs/scripts/core.js +726 -726
  48. package/docs/scripts/core.min.js +22 -22
  49. package/docs/scripts/resize.js +90 -90
  50. package/docs/scripts/search.js +265 -265
  51. package/docs/scripts/third-party/Apache-License-2.0.txt +202 -202
  52. package/docs/scripts/third-party/fuse.js +8 -8
  53. package/docs/scripts/third-party/hljs-line-num-original.js +369 -369
  54. package/docs/scripts/third-party/hljs-original.js +5171 -5171
  55. package/docs/scripts/third-party/popper.js +5 -5
  56. package/docs/scripts/third-party/tippy.js +1 -1
  57. package/docs/scripts/third-party/tocbot.js +671 -671
  58. package/docs/styles/clean-jsdoc-theme-base.css +1159 -1159
  59. package/docs/styles/clean-jsdoc-theme-dark.css +412 -412
  60. package/docs/styles/clean-jsdoc-theme-light.css +482 -482
  61. package/docs/styles/clean-jsdoc-theme-scrollbar.css +29 -29
  62. package/docs/suggestContrast.js.html +389 -0
  63. package/docs/tableUtils.js.html +151 -0
  64. package/docs/testContrast.js.html +201 -24
  65. package/docs/testLang.js.html +533 -451
  66. package/docs/testOrder.js.html +9 -4
  67. package/package.json +1 -1
  68. package/src/colorConversions.js +235 -0
  69. package/src/index.js +6 -0
  70. package/src/stringUtils.js +35 -0
  71. package/src/suggestContrast.js +386 -0
  72. package/test/colorConversions.test.js +223 -0
  73. package/test/stringUtils.test.js +60 -0
  74. package/test/suggestContrast.test.js +394 -0
@@ -1,7 +1,13 @@
1
1
  <!DOCTYPE html><html lang="en" style="font-size:16px"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Source: getAccessibleName.js</title><!--[if lt IE 9]>
2
2
  <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
3
- <![endif]--><script src="scripts/third-party/hljs.js" defer="defer"></script><script src="scripts/third-party/hljs-line-num.js" defer="defer"></script><script src="scripts/third-party/popper.js" defer="defer"></script><script src="scripts/third-party/tippy.js" defer="defer"></script><script src="scripts/third-party/tocbot.min.js"></script><script>var baseURL="/",locationPathname="";baseURL=(locationPathname=document.location.pathname).substr(0,locationPathname.lastIndexOf("/")+1)</script><link rel="stylesheet" href="styles/clean-jsdoc-theme.min.css"><svg aria-hidden="true" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="display:none"><defs><symbol id="copy-icon" viewbox="0 0 488.3 488.3"><g><path d="M314.25,85.4h-227c-21.3,0-38.6,17.3-38.6,38.6v325.7c0,21.3,17.3,38.6,38.6,38.6h227c21.3,0,38.6-17.3,38.6-38.6V124 C352.75,102.7,335.45,85.4,314.25,85.4z M325.75,449.6c0,6.4-5.2,11.6-11.6,11.6h-227c-6.4,0-11.6-5.2-11.6-11.6V124 c0-6.4,5.2-11.6,11.6-11.6h227c6.4,0,11.6,5.2,11.6,11.6V449.6z"/><path d="M401.05,0h-227c-21.3,0-38.6,17.3-38.6,38.6c0,7.5,6,13.5,13.5,13.5s13.5-6,13.5-13.5c0-6.4,5.2-11.6,11.6-11.6h227 c6.4,0,11.6,5.2,11.6,11.6v325.7c0,6.4-5.2,11.6-11.6,11.6c-7.5,0-13.5,6-13.5,13.5s6,13.5,13.5,13.5c21.3,0,38.6-17.3,38.6-38.6 V38.6C439.65,17.3,422.35,0,401.05,0z"/></g></symbol><symbol id="search-icon" viewBox="0 0 512 512"><g><g><path d="M225.474,0C101.151,0,0,101.151,0,225.474c0,124.33,101.151,225.474,225.474,225.474 c124.33,0,225.474-101.144,225.474-225.474C450.948,101.151,349.804,0,225.474,0z M225.474,409.323 c-101.373,0-183.848-82.475-183.848-183.848S124.101,41.626,225.474,41.626s183.848,82.475,183.848,183.848 S326.847,409.323,225.474,409.323z"/></g></g><g><g><path d="M505.902,476.472L386.574,357.144c-8.131-8.131-21.299-8.131-29.43,0c-8.131,8.124-8.131,21.306,0,29.43l119.328,119.328 c4.065,4.065,9.387,6.098,14.715,6.098c5.321,0,10.649-2.033,14.715-6.098C514.033,497.778,514.033,484.596,505.902,476.472z"/></g></g></symbol><symbol id="font-size-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11.246 15H4.754l-2 5H.6L7 4h2l6.4 16h-2.154l-2-5zm-.8-2L8 6.885 5.554 13h4.892zM21 12.535V12h2v8h-2v-.535a4 4 0 1 1 0-6.93zM19 18a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"/></symbol><symbol id="add-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></symbol><symbol id="minus-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M5 11h14v2H5z"/></symbol><symbol id="dark-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M10 7a7 7 0 0 0 12 4.9v.1c0 5.523-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2h.1A6.979 6.979 0 0 0 10 7zm-6 5a8 8 0 0 0 15.062 3.762A9 9 0 0 1 8.238 4.938 7.999 7.999 0 0 0 4 12z"/></symbol><symbol id="light-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-2a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM11 1h2v3h-2V1zm0 19h2v3h-2v-3zM3.515 4.929l1.414-1.414L7.05 5.636 5.636 7.05 3.515 4.93zM16.95 18.364l1.414-1.414 2.121 2.121-1.414 1.414-2.121-2.121zm2.121-14.85l1.414 1.415-2.121 2.121-1.414-1.414 2.121-2.121zM5.636 16.95l1.414 1.414-2.121 2.121-1.414-1.414 2.121-2.121zM23 11v2h-3v-2h3zM4 11v2H1v-2h3z"/></symbol><symbol id="reset-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M18.537 19.567A9.961 9.961 0 0 1 12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10c0 2.136-.67 4.116-1.81 5.74L17 12h3a8 8 0 1 0-2.46 5.772l.997 1.795z"/></symbol><symbol id="down-icon" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.7803 6.21967C13.0732 6.51256 13.0732 6.98744 12.7803 7.28033L8.53033 11.5303C8.23744 11.8232 7.76256 11.8232 7.46967 11.5303L3.21967 7.28033C2.92678 6.98744 2.92678 6.51256 3.21967 6.21967C3.51256 5.92678 3.98744 5.92678 4.28033 6.21967L8 9.93934L11.7197 6.21967C12.0126 5.92678 12.4874 5.92678 12.7803 6.21967Z"></path></symbol><symbol id="codepen-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M16.5 13.202L13 15.535v3.596L19.197 15 16.5 13.202zM14.697 12L12 10.202 9.303 12 12 13.798 14.697 12zM20 10.869L18.303 12 20 13.131V10.87zM19.197 9L13 4.869v3.596l3.5 2.333L19.197 9zM7.5 10.798L11 8.465V4.869L4.803 9 7.5 10.798zM4.803 15L11 19.131v-3.596l-3.5-2.333L4.803 15zM4 13.131L5.697 12 4 10.869v2.262zM2 9a1 1 0 0 1 .445-.832l9-6a1 1 0 0 1 1.11 0l9 6A1 1 0 0 1 22 9v6a1 1 0 0 1-.445.832l-9 6a1 1 0 0 1-1.11 0l-9-6A1 1 0 0 1 2 15V9z"/></symbol><symbol id="close-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636z"/></symbol><symbol id="menu-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 4h18v2H3V4zm0 7h18v2H3v-2zm0 7h18v2H3v-2z"/></symbol></defs></svg></head><body data-theme="dark"><div class="sidebar-container"><div class="sidebar" id="sidebar"><div class="sidebar-items-container"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-afixt-test-utils.html">afixt-test-utils</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#arrayCount">arrayCount</a></div><div class="sidebar-section-children"><a href="global.html#arrayRemoveByValue">arrayRemoveByValue</a></div><div class="sidebar-section-children"><a href="global.html#arrayUnique">arrayUnique</a></div><div class="sidebar-section-children"><a href="global.html#cellColorDiffs">cellColorDiffs</a></div><div class="sidebar-section-children"><a href="global.html#cellCount">cellCount</a></div><div class="sidebar-section-children"><a href="global.html#checkInconsistent">checkInconsistent</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsInHeader">checkMultiRowsInHeader</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsWithColspan">checkMultiRowsWithColspan</a></div><div class="sidebar-section-children"><a href="global.html#cleanBlank">cleanBlank</a></div><div class="sidebar-section-children"><a href="global.html#colCount">colCount</a></div><div class="sidebar-section-children"><a href="global.html#countBordersPct">countBordersPct</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleName">getAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleText">getAccessibleText</a></div><div class="sidebar-section-children"><a href="global.html#getAriaAttributes">getAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#getCSSGeneratedContent">getCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getColorContrast">getColorContrast</a></div><div class="sidebar-section-children"><a href="global.html#getComputedBackgroundColor">getComputedBackgroundColor</a></div><div class="sidebar-section-children"><a href="global.html#getComputedRole">getComputedRole</a></div><div class="sidebar-section-children"><a href="global.html#getFocusableElements">getFocusableElements</a></div><div class="sidebar-section-children"><a href="global.html#getGeneratedContent">getGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getImageText">getImageText</a></div><div class="sidebar-section-children"><a href="global.html#getStyleObject">getStyleObject</a></div><div class="sidebar-section-children"><a href="global.html#getTwoLetterCode">getTwoLetterCode</a></div><div class="sidebar-section-children"><a href="global.html#hasAccessibleName">hasAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#hasAttribute">hasAttribute</a></div><div class="sidebar-section-children"><a href="global.html#hasCSSGeneratedContent">hasCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#hasHiddenParent">hasHiddenParent</a></div><div class="sidebar-section-children"><a href="global.html#hasParent">hasParent</a></div><div class="sidebar-section-children"><a href="global.html#hasValidAriaAttributes">hasValidAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#hasValidAriaRole">hasValidAriaRole</a></div><div class="sidebar-section-children"><a href="global.html#isAriaAttributeValid">isAriaAttributeValid</a></div><div class="sidebar-section-children"><a href="global.html#isComplexTable">isComplexTable</a></div><div class="sidebar-section-children"><a href="global.html#isDataTable">isDataTable</a></div><div class="sidebar-section-children"><a href="global.html#isFocusable">isFocusable</a></div><div class="sidebar-section-children"><a href="global.html#isHidden">isHidden</a></div><div class="sidebar-section-children"><a href="global.html#isNotVisible">isNotVisible</a></div><div class="sidebar-section-children"><a href="global.html#isOffScreen">isOffScreen</a></div><div class="sidebar-section-children"><a href="global.html#isValidUrl">isValidUrl</a></div><div class="sidebar-section-children"><a href="global.html#isVisible">isVisible</a></div><div class="sidebar-section-children"><a href="global.html#langCodes">langCodes</a></div><div class="sidebar-section-children"><a href="global.html#luminance">luminance</a></div><div class="sidebar-section-children"><a href="global.html#matchesSelector">matchesSelector</a></div><div class="sidebar-section-children"><a href="global.html#parseRGB">parseRGB</a></div><div class="sidebar-section-children"><a href="global.html#rowCount">rowCount</a></div><div class="sidebar-section-children"><a href="global.html#rtls">rtls</a></div><div class="sidebar-section-children"><a href="global.html#sortByVisualOrder">sortByVisualOrder</a></div><div class="sidebar-section-children"><a href="global.html#strlen">strlen</a></div><div class="sidebar-section-children"><a href="global.html#testContrast">testContrast</a></div><div class="sidebar-section-children"><a href="global.html#testLang">testLang</a></div><div class="sidebar-section-children"><a href="global.html#testOrder">testOrder</a></div><div class="sidebar-section-children"><a href="global.html#validAriaAttributes">validAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#validLangCodes">validLangCodes</a></div></div></div></div></div><div class="navbar-container" id="VuAckcnZhf"><nav class="navbar"><div class="navbar-left-items"></div><div class="navbar-right-items"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#light-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div><nav></nav></nav></div><div class="toc-container"><div class="toc-content"><span class="bold">On this page</span><div id="eed4d2a0bfd64539bb9df78095dec881"></div></div></div><div class="body-wrapper"><div class="main-content"><div class="main-wrapper"><section id="source-page" class="source-page"><header><h1 id="title" class="has-anchor">getAccessibleName.js</h1></header><article><pre class="prettyprint source lang-js"><code>import { isEmpty } from "./stringUtils.js";
4
- import { getAccessibleText } from "./getAccessibleText.js";
3
+ <![endif]--><script src="scripts/third-party/hljs.js" defer="defer"></script><script src="scripts/third-party/hljs-line-num.js" defer="defer"></script><script src="scripts/third-party/popper.js" defer="defer"></script><script src="scripts/third-party/tippy.js" defer="defer"></script><script src="scripts/third-party/tocbot.min.js"></script><script>var baseURL="/",locationPathname="";baseURL=(locationPathname=document.location.pathname).substr(0,locationPathname.lastIndexOf("/")+1)</script><link rel="stylesheet" href="styles/clean-jsdoc-theme.min.css"><svg aria-hidden="true" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="display:none"><defs><symbol id="copy-icon" viewbox="0 0 488.3 488.3"><g><path d="M314.25,85.4h-227c-21.3,0-38.6,17.3-38.6,38.6v325.7c0,21.3,17.3,38.6,38.6,38.6h227c21.3,0,38.6-17.3,38.6-38.6V124 C352.75,102.7,335.45,85.4,314.25,85.4z M325.75,449.6c0,6.4-5.2,11.6-11.6,11.6h-227c-6.4,0-11.6-5.2-11.6-11.6V124 c0-6.4,5.2-11.6,11.6-11.6h227c6.4,0,11.6,5.2,11.6,11.6V449.6z"/><path d="M401.05,0h-227c-21.3,0-38.6,17.3-38.6,38.6c0,7.5,6,13.5,13.5,13.5s13.5-6,13.5-13.5c0-6.4,5.2-11.6,11.6-11.6h227 c6.4,0,11.6,5.2,11.6,11.6v325.7c0,6.4-5.2,11.6-11.6,11.6c-7.5,0-13.5,6-13.5,13.5s6,13.5,13.5,13.5c21.3,0,38.6-17.3,38.6-38.6 V38.6C439.65,17.3,422.35,0,401.05,0z"/></g></symbol><symbol id="search-icon" viewBox="0 0 512 512"><g><g><path d="M225.474,0C101.151,0,0,101.151,0,225.474c0,124.33,101.151,225.474,225.474,225.474 c124.33,0,225.474-101.144,225.474-225.474C450.948,101.151,349.804,0,225.474,0z M225.474,409.323 c-101.373,0-183.848-82.475-183.848-183.848S124.101,41.626,225.474,41.626s183.848,82.475,183.848,183.848 S326.847,409.323,225.474,409.323z"/></g></g><g><g><path d="M505.902,476.472L386.574,357.144c-8.131-8.131-21.299-8.131-29.43,0c-8.131,8.124-8.131,21.306,0,29.43l119.328,119.328 c4.065,4.065,9.387,6.098,14.715,6.098c5.321,0,10.649-2.033,14.715-6.098C514.033,497.778,514.033,484.596,505.902,476.472z"/></g></g></symbol><symbol id="font-size-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11.246 15H4.754l-2 5H.6L7 4h2l6.4 16h-2.154l-2-5zm-.8-2L8 6.885 5.554 13h4.892zM21 12.535V12h2v8h-2v-.535a4 4 0 1 1 0-6.93zM19 18a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"/></symbol><symbol id="add-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></symbol><symbol id="minus-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M5 11h14v2H5z"/></symbol><symbol id="dark-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M10 7a7 7 0 0 0 12 4.9v.1c0 5.523-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2h.1A6.979 6.979 0 0 0 10 7zm-6 5a8 8 0 0 0 15.062 3.762A9 9 0 0 1 8.238 4.938 7.999 7.999 0 0 0 4 12z"/></symbol><symbol id="light-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-2a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM11 1h2v3h-2V1zm0 19h2v3h-2v-3zM3.515 4.929l1.414-1.414L7.05 5.636 5.636 7.05 3.515 4.93zM16.95 18.364l1.414-1.414 2.121 2.121-1.414 1.414-2.121-2.121zm2.121-14.85l1.414 1.415-2.121 2.121-1.414-1.414 2.121-2.121zM5.636 16.95l1.414 1.414-2.121 2.121-1.414-1.414 2.121-2.121zM23 11v2h-3v-2h3zM4 11v2H1v-2h3z"/></symbol><symbol id="reset-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M18.537 19.567A9.961 9.961 0 0 1 12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10c0 2.136-.67 4.116-1.81 5.74L17 12h3a8 8 0 1 0-2.46 5.772l.997 1.795z"/></symbol><symbol id="down-icon" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.7803 6.21967C13.0732 6.51256 13.0732 6.98744 12.7803 7.28033L8.53033 11.5303C8.23744 11.8232 7.76256 11.8232 7.46967 11.5303L3.21967 7.28033C2.92678 6.98744 2.92678 6.51256 3.21967 6.21967C3.51256 5.92678 3.98744 5.92678 4.28033 6.21967L8 9.93934L11.7197 6.21967C12.0126 5.92678 12.4874 5.92678 12.7803 6.21967Z"></path></symbol><symbol id="codepen-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M16.5 13.202L13 15.535v3.596L19.197 15 16.5 13.202zM14.697 12L12 10.202 9.303 12 12 13.798 14.697 12zM20 10.869L18.303 12 20 13.131V10.87zM19.197 9L13 4.869v3.596l3.5 2.333L19.197 9zM7.5 10.798L11 8.465V4.869L4.803 9 7.5 10.798zM4.803 15L11 19.131v-3.596l-3.5-2.333L4.803 15zM4 13.131L5.697 12 4 10.869v2.262zM2 9a1 1 0 0 1 .445-.832l9-6a1 1 0 0 1 1.11 0l9 6A1 1 0 0 1 22 9v6a1 1 0 0 1-.445.832l-9 6a1 1 0 0 1-1.11 0l-9-6A1 1 0 0 1 2 15V9z"/></symbol><symbol id="close-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636z"/></symbol><symbol id="menu-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 4h18v2H3V4zm0 7h18v2H3v-2zm0 7h18v2H3v-2z"/></symbol></defs></svg></head><body data-theme="dark"><div class="sidebar-container"><div class="sidebar" id="sidebar"><div class="sidebar-items-container"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-QueryCache.html">QueryCache</a></div><div class="sidebar-section-children"><a href="module-afixt-test-utils.html">afixt-test-utils</a></div><div class="sidebar-section-children"><a href="module-colorConversions.html">colorConversions</a></div><div class="sidebar-section-children"><a href="module-constants.html">constants</a></div><div class="sidebar-section-children"><a href="module-cssUtils.html">cssUtils</a></div><div class="sidebar-section-children"><a href="module-formUtils.html">formUtils</a></div><div class="sidebar-section-children"><a href="module-suggestContrast.html">suggestContrast</a></div><div class="sidebar-section-children"><a href="module-tableUtils.html">tableUtils</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#RTL_LANGUAGES">RTL_LANGUAGES</a></div><div class="sidebar-section-children"><a href="global.html#_internal">_internal</a></div><div class="sidebar-section-children"><a href="global.html#arrayCount">arrayCount</a></div><div class="sidebar-section-children"><a href="global.html#arrayRemoveByValue">arrayRemoveByValue</a></div><div class="sidebar-section-children"><a href="global.html#arrayUnique">arrayUnique</a></div><div class="sidebar-section-children"><a href="global.html#cellColorDiffs">cellColorDiffs</a></div><div class="sidebar-section-children"><a href="global.html#cellCount">cellCount</a></div><div class="sidebar-section-children"><a href="global.html#checkInconsistent">checkInconsistent</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsInHeader">checkMultiRowsInHeader</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsWithColspan">checkMultiRowsWithColspan</a></div><div class="sidebar-section-children"><a href="global.html#cleanBlank">cleanBlank</a></div><div class="sidebar-section-children"><a href="global.html#colCount">colCount</a></div><div class="sidebar-section-children"><a href="global.html#collectSubtreeText">collectSubtreeText</a></div><div class="sidebar-section-children"><a href="global.html#countBordersPct">countBordersPct</a></div><div class="sidebar-section-children"><a href="global.html#extractMeaningfulContent">extractMeaningfulContent</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleName">getAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleText">getAccessibleText</a></div><div class="sidebar-section-children"><a href="global.html#getAriaAttributesByElement">getAriaAttributesByElement</a></div><div class="sidebar-section-children"><a href="global.html#getAttributeHandlers">getAttributeHandlers</a></div><div class="sidebar-section-children"><a href="global.html#getCSSGeneratedContent">getCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getColorContrast">getColorContrast</a></div><div class="sidebar-section-children"><a href="global.html#getComputedBackgroundColor">getComputedBackgroundColor</a></div><div class="sidebar-section-children"><a href="global.html#getComputedRole">getComputedRole</a></div><div class="sidebar-section-children"><a href="global.html#getContrastRatio">getContrastRatio</a></div><div class="sidebar-section-children"><a href="global.html#getEffectiveDir">getEffectiveDir</a></div><div class="sidebar-section-children"><a href="global.html#getEventListeners">getEventListeners</a></div><div class="sidebar-section-children"><a href="global.html#getFocusableElements">getFocusableElements</a></div><div class="sidebar-section-children"><a href="global.html#getGeneratedContent">getGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getImageText">getImageText</a></div><div class="sidebar-section-children"><a href="global.html#getPropertyHandlers">getPropertyHandlers</a></div><div class="sidebar-section-children"><a href="global.html#getRelativeLuminance">getRelativeLuminance</a></div><div class="sidebar-section-children"><a href="global.html#getStyleObject">getStyleObject</a></div><div class="sidebar-section-children"><a href="global.html#getTwoLetterCode">getTwoLetterCode</a></div><div class="sidebar-section-children"><a href="global.html#hasAccessibleName">hasAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#hasAttribute">hasAttribute</a></div><div class="sidebar-section-children"><a href="global.html#hasBackgroundImage">hasBackgroundImage</a></div><div class="sidebar-section-children"><a href="global.html#hasCSSGeneratedContent">hasCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#hasHiddenParent">hasHiddenParent</a></div><div class="sidebar-section-children"><a href="global.html#hasParent">hasParent</a></div><div class="sidebar-section-children"><a href="global.html#hasValidAriaAttributes">hasValidAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#isA11yVisible">isA11yVisible</a></div><div class="sidebar-section-children"><a href="global.html#isAriaAttributeValid">isAriaAttributeValid</a></div><div class="sidebar-section-children"><a href="global.html#isComplexTable">isComplexTable</a></div><div class="sidebar-section-children"><a href="global.html#isDataTable">isDataTable</a></div><div class="sidebar-section-children"><a href="global.html#isFocusable">isFocusable</a></div><div class="sidebar-section-children"><a href="global.html#isHidden">isHidden</a></div><div class="sidebar-section-children"><a href="global.html#isNotVisible">isNotVisible</a></div><div class="sidebar-section-children"><a href="global.html#isOffScreen">isOffScreen</a></div><div class="sidebar-section-children"><a href="global.html#isRTLLanguage">isRTLLanguage</a></div><div class="sidebar-section-children"><a href="global.html#isValidLanguageCode">isValidLanguageCode</a></div><div class="sidebar-section-children"><a href="global.html#isValidUrl">isValidUrl</a></div><div class="sidebar-section-children"><a href="global.html#langCodes">langCodes</a></div><div class="sidebar-section-children"><a href="global.html#listEventListeners">listEventListeners</a></div><div class="sidebar-section-children"><a href="global.html#luminance">luminance</a></div><div class="sidebar-section-children"><a href="global.html#matchesSelector">matchesSelector</a></div><div class="sidebar-section-children"><a href="global.html#parseColor">parseColor</a></div><div class="sidebar-section-children"><a href="global.html#parseRGB">parseRGB</a></div><div class="sidebar-section-children"><a href="global.html#rowCount">rowCount</a></div><div class="sidebar-section-children"><a href="global.html#rtls">rtls</a></div><div class="sidebar-section-children"><a href="global.html#sortByVisualOrder">sortByVisualOrder</a></div><div class="sidebar-section-children"><a href="global.html#strlen">strlen</a></div><div class="sidebar-section-children"><a href="global.html#testContrast">testContrast</a></div><div class="sidebar-section-children"><a href="global.html#testLang">testLang</a></div><div class="sidebar-section-children"><a href="global.html#testOrder">testOrder</a></div><div class="sidebar-section-children"><a href="global.html#validLangCodes">validLangCodes</a></div></div></div></div></div><div class="navbar-container" id="VuAckcnZhf"><nav class="navbar"><div class="navbar-left-items"></div><div class="navbar-right-items"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#light-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div><nav></nav></nav></div><div class="toc-container"><div class="toc-content"><span class="bold">On this page</span><div id="eed4d2a0bfd64539bb9df78095dec881"></div></div></div><div class="body-wrapper"><div class="main-content"><div class="main-wrapper"><section id="source-page" class="source-page"><header><h1 id="title" class="has-anchor">getAccessibleName.js</h1></header><article><pre class="prettyprint source lang-js"><code>const { isEmpty } = require('./stringUtils.js');
4
+ const { getAccessibleText } = require('./getAccessibleText.js');
5
+ const {
6
+ TEXT_ROLES,
7
+ NON_VISIBLE_SELECTORS,
8
+ LANDMARK_ROLES,
9
+ LANDMARK_ELEMENT_MAP,
10
+ } = require('./constants.js');
5
11
 
6
12
  /**
7
13
  * Gets the accessible name of an element according to the accessible name calculation algorithm
@@ -9,13 +15,18 @@ import { getAccessibleText } from "./getAccessibleText.js";
9
15
  * @returns {string|boolean} The accessible name or false if none exists
10
16
  */
11
17
  function getAccessibleName(element) {
12
- if (!element) return false;
18
+ if (!element || !(element instanceof Element)) {
19
+ return false;
20
+ }
21
+
22
+ if (!element.isConnected) {
23
+ return false;
24
+ }
13
25
 
14
26
  // These are elements which are totally not able to be labeled at all.
15
27
  // Even if the title attribute is valid per HTML for these elements,
16
28
  // the title won't be used in any meaningful way by Accessibility APIs
17
- const unlabellable =
18
- "head *, hr, param, caption, colgroup, col, tbody, tfoot, thead, tr";
29
+ const unlabellable = 'head *, hr, param, caption, colgroup, col, tbody, tfoot, thead, tr';
19
30
 
20
31
  // STEP 0 - verify item is visible and can be labelled
21
32
  // if it isn't visible or can't be labelled then just bail
@@ -23,13 +34,15 @@ function getAccessibleName(element) {
23
34
  return false;
24
35
  }
25
36
 
26
- let id, ids, label;
37
+ let id;
38
+ let ids;
39
+ let label;
27
40
 
28
41
  // STEP 1 - always check for aria-labelledby first
29
42
  // STEP 1.1 - if aria-labelledby exists, check that the referenced element exists
30
43
  // STEP 1.1.1 - return the text from the referenced item
31
- if (element.hasAttribute("aria-labelledby")) {
32
- ids = element.getAttribute("aria-labelledby").trim().split(" ");
44
+ if (element.hasAttribute('aria-labelledby')) {
45
+ ids = element.getAttribute('aria-labelledby').trim().split(' ');
33
46
 
34
47
  const text = [];
35
48
  for (const id of ids) {
@@ -40,13 +53,13 @@ function getAccessibleName(element) {
40
53
  text.push(getAccessibleText(labelElement));
41
54
  }
42
55
 
43
- return text.join(" ");
56
+ return text.join(' ');
44
57
  }
45
58
 
46
59
  // STEP 2 - (next) always check for aria-label second
47
60
  // STEP 2.1 - if aria-label exists, return the text in it
48
- if (element.hasAttribute("aria-label")) {
49
- const ariaLabel = element.getAttribute("aria-label");
61
+ if (element.hasAttribute('aria-label')) {
62
+ const ariaLabel = element.getAttribute('aria-label');
50
63
  if (ariaLabel) {
51
64
  return ariaLabel;
52
65
  }
@@ -57,29 +70,29 @@ function getAccessibleName(element) {
57
70
  // Most ARIA controls/ widgets rely on labelling per steps 1 &amp; 2 above.
58
71
  // If a label isn't found in Step 1 &amp; 2, we can (for some roles) use DOM subtree content to find the label.
59
72
  // We check all of those here.
60
- if (element.hasAttribute("role")) {
61
- const roleValue = element.getAttribute("role");
62
- const textRoles = [
63
- "button", "checkbox", "columnheader", "gridcell", "heading", "link",
64
- "listitem", "menuitem", "menuitemcheckbox", "menuitemradio", "option",
65
- "radio", "row", "rowgroup", "rowheader", "tab", "tooltip", "treeitem"
66
- ];
67
-
68
- if (textRoles.includes(roleValue)) {
69
- // quick sanity check to make sure the object can hold text in the first place and that it actually has text in it
70
- if (!isEmpty(element.textContent)) {
71
- return getAccessibleText(element);
73
+ if (element.hasAttribute('role')) {
74
+ const roleValue = element.getAttribute('role');
75
+
76
+ if (TEXT_ROLES.includes(roleValue)) {
77
+ // Use getAccessibleText which handles both text nodes and
78
+ // image alt text in the subtree (not just textContent)
79
+ const text = getAccessibleText(element);
80
+ if (!isEmpty(text)) {
81
+ return text;
72
82
  }
73
83
  }
74
84
  }
75
85
 
76
86
  // STEP 4: is the tag one of:
77
- // input without any type, input type="text", input type="email", input type="password", input type="search", input type="tel", input type="url" and textarea element
87
+ // input without any type, input type="text", input type="email",
88
+ // input type="password", input type="search", input type="tel",
89
+ // input type="url" and textarea element
78
90
  // STEP 4.1 use the associated label
79
91
  // STEP 4.3 Otherwise use the title attribute
80
92
  // STEP 4.4 - return false. If none of the above yield a usable text string there is no accessible name
81
93
  if (
82
- matchesSelector(element,
94
+ matchesSelector(
95
+ element,
83
96
  'input:not([type]), input[type="text"], input[type="email"], input[type="password"], input[type="search"], input[type="tel"], input[type="url"], textarea'
84
97
  )
85
98
  ) {
@@ -87,7 +100,8 @@ function getAccessibleName(element) {
87
100
  if (element.id &amp;&amp; document.querySelector('label[for="' + element.id + '"]')) {
88
101
  id = element.id;
89
102
  // Use only the *first* label that matches this ID.
90
- // Sometimes JS libraries screw this up by hiding one of the labels or misnaming one
103
+ // Sometimes JS libraries screw this up by hiding one of the
104
+ // labels or misnaming one
91
105
  label = document.querySelector('label[for="' + id + '"]');
92
106
  if (label) {
93
107
  return getAccessibleText(label);
@@ -95,14 +109,14 @@ function getAccessibleName(element) {
95
109
  }
96
110
 
97
111
  // if the element's parent is a label, use the text in that
98
- else if (element.closest("label")) {
99
- return getAccessibleText(element.closest("label"));
112
+ else if (element.closest('label')) {
113
+ return getAccessibleText(element.closest('label'));
100
114
  }
101
115
 
102
116
  // title attribute is last resort
103
- else if (element.hasAttribute("title")) {
104
- if (strlen(element.getAttribute("title")) > 0) {
105
- return element.getAttribute("title");
117
+ else if (element.hasAttribute('title')) {
118
+ if (strlen(element.getAttribute('title')) > 0) {
119
+ return element.getAttribute('title');
106
120
  } else {
107
121
  return false;
108
122
  }
@@ -122,17 +136,15 @@ function getAccessibleName(element) {
122
136
  // STEP 5.4 For input type=button: return title attribute
123
137
  // STEP 5.5 - return false. If none of the above yield a usable text string there is no accessible name
124
138
  if (
125
- matchesSelector(element,
126
- 'input[type="button"], input[type="submit"], input[type="reset"]'
127
- )
139
+ matchesSelector(element, 'input[type="button"], input[type="submit"], input[type="reset"]')
128
140
  ) {
129
- if (element.hasAttribute("value")) {
130
- if (element.getAttribute("value")) {
131
- return element.getAttribute("value");
141
+ if (element.hasAttribute('value')) {
142
+ if (element.getAttribute('value')) {
143
+ return element.getAttribute('value');
132
144
  }
133
145
  } else if (matchesSelector(element, 'input[type="button"]')) {
134
- if (element.hasAttribute("title")) {
135
- return element.getAttribute("title");
146
+ if (element.hasAttribute('title')) {
147
+ return element.getAttribute('title');
136
148
  }
137
149
  return false;
138
150
  }
@@ -142,16 +154,16 @@ function getAccessibleName(element) {
142
154
  // but we make a safe guess here anyway because getting the real name involves inspecting the Shadow DOM
143
155
  // which we cannot do
144
156
  else if (matchesSelector(element, 'input[type="submit"]')) {
145
- if (element.hasAttribute("title")) {
146
- return element.getAttribute("title");
157
+ if (element.hasAttribute('title')) {
158
+ return element.getAttribute('title');
147
159
  } else {
148
- return "Submit";
160
+ return 'Submit';
149
161
  }
150
162
  } else if (matchesSelector(element, 'input[type="reset"]')) {
151
- if (element.hasAttribute("title")) {
152
- return element.getAttribute("title");
163
+ if (element.hasAttribute('title')) {
164
+ return element.getAttribute('title');
153
165
  } else {
154
- return "Reset";
166
+ return 'Reset';
155
167
  }
156
168
  }
157
169
  }
@@ -163,12 +175,12 @@ function getAccessibleName(element) {
163
175
  // STEP 6.4: Otherwise use title attribute
164
176
  // STEP 6.5: return false. If none of the above yield a usable text string there is no accessible name
165
177
  if (matchesSelector(element, 'input[type="image"]')) {
166
- if (element.hasAttribute("alt")) {
167
- return element.getAttribute("alt");
168
- } else if (element.hasAttribute("value")) {
169
- return element.getAttribute("value");
170
- } else if (element.hasAttribute("title")) {
171
- return element.getAttribute("title");
178
+ if (element.hasAttribute('alt')) {
179
+ return element.getAttribute('alt');
180
+ } else if (element.hasAttribute('value')) {
181
+ return element.getAttribute('value');
182
+ } else if (element.hasAttribute('title')) {
183
+ return element.getAttribute('title');
172
184
  } else {
173
185
  return false;
174
186
  }
@@ -178,11 +190,11 @@ function getAccessibleName(element) {
178
190
  // STEP 7.1: use the button element subtree
179
191
  // STEP 7.2: use title attribute
180
192
  // STEP 7.3: return false. If none of the above yield a usable text string there is no accessible name
181
- if (element.tagName.toLowerCase() === "button") {
193
+ if (element.tagName.toLowerCase() === 'button') {
182
194
  if (strlen(getAccessibleText(element)) > 0) {
183
195
  return getAccessibleText(element);
184
- } else if (element.hasAttribute("title")) {
185
- return element.getAttribute("title");
196
+ } else if (element.hasAttribute('title')) {
197
+ return element.getAttribute('title');
186
198
  } else {
187
199
  return false;
188
200
  }
@@ -191,9 +203,11 @@ function getAccessibleName(element) {
191
203
  // STEP 8: Other form elements
192
204
  // STEP 8.1: use label element
193
205
  // STEP 8.2: use title attribute
194
- // STEP 8.3: return false. If none of the above yield a usable text string there is no accessible name
206
+ // STEP 8.3: return false. If none of the above yield a usable text
207
+ // string there is no accessible name
195
208
  if (
196
- matchesSelector(element,
209
+ matchesSelector(
210
+ element,
197
211
  'select, input[type="checkbox"], input[type="color"], input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="email"], input[type="file"], input[type="month"], input[type="number"], input[type="radio"], input[type="range"], input[type="time"], input[type="week"]'
198
212
  )
199
213
  ) {
@@ -209,13 +223,13 @@ function getAccessibleName(element) {
209
223
  }
210
224
 
211
225
  // if the element's parent is a label, use the text in that
212
- else if (element.closest("label")) {
213
- return getAccessibleText(element.closest("label"));
226
+ else if (element.closest('label')) {
227
+ return getAccessibleText(element.closest('label'));
214
228
  }
215
229
 
216
230
  // title attribute is last resort
217
- else if (element.hasAttribute("title")) {
218
- return element.getAttribute("title");
231
+ else if (element.hasAttribute('title')) {
232
+ return element.getAttribute('title');
219
233
  }
220
234
 
221
235
  //if we got this far, there is no accessible name
@@ -234,20 +248,20 @@ function getAccessibleName(element) {
234
248
  // And these return values are especially not accurate for
235
249
  // non-english users, but we make a safe guess here anyway because
236
250
  // like Submit buttons, getting the real value involves inspecting Shadow DOM
237
- if (element.tagName.toLowerCase() === "details") {
238
- const summary = element.querySelector("summary");
251
+ if (element.tagName.toLowerCase() === 'details') {
252
+ const summary = element.querySelector('summary');
239
253
  if (summary) {
240
254
  if (strlen(getAccessibleText(summary)) > 0) {
241
255
  return getAccessibleText(summary);
242
256
  }
243
- } else if (element.hasAttribute("title")) {
244
- if (strlen(element.getAttribute("title")) > 0) {
245
- return element.getAttribute("title");
257
+ } else if (element.hasAttribute('title')) {
258
+ if (strlen(element.getAttribute('title')) > 0) {
259
+ return element.getAttribute('title');
246
260
  } else {
247
- return "Details";
261
+ return 'Details';
248
262
  }
249
263
  } else {
250
- return "Details";
264
+ return 'Details';
251
265
  }
252
266
  }
253
267
 
@@ -256,14 +270,14 @@ function getAccessibleName(element) {
256
270
  // STEP 10.2: title attribute
257
271
  // STEP 10.3: return false. If none of the above yield a usable text
258
272
  // string there is no accessible name
259
- if (element.tagName.toLowerCase() === "figure") {
260
- const figcaption = element.querySelector("figcaption");
273
+ if (element.tagName.toLowerCase() === 'figure') {
274
+ const figcaption = element.querySelector('figcaption');
261
275
  if (figcaption) {
262
276
  if (strlen(getAccessibleText(figcaption)) > 0) {
263
277
  return getAccessibleText(figcaption);
264
278
  }
265
- } else if (element.hasAttribute("title")) {
266
- return element.getAttribute("title");
279
+ } else if (element.hasAttribute('title')) {
280
+ return element.getAttribute('title');
267
281
  } else {
268
282
  return false;
269
283
  }
@@ -274,11 +288,11 @@ function getAccessibleName(element) {
274
288
  // STEP 11.2: use title attribute
275
289
  // STEP 11.3: return false. If none of the above yield a usable
276
290
  // text string there is no accessible name
277
- if (element.tagName.toLowerCase() === "img") {
278
- if (element.hasAttribute("alt")) {
279
- return element.getAttribute("alt");
280
- } else if (element.hasAttribute("title")) {
281
- return element.getAttribute("title");
291
+ if (element.tagName.toLowerCase() === 'img') {
292
+ if (element.hasAttribute('alt')) {
293
+ return element.getAttribute('alt');
294
+ } else if (element.hasAttribute('title')) {
295
+ return element.getAttribute('title');
282
296
  } else {
283
297
  return false;
284
298
  }
@@ -289,11 +303,11 @@ function getAccessibleName(element) {
289
303
  // STEP 11-1.2: use title attribute
290
304
  // STEP 11-1.3: return false. If none of the above yield a usable
291
305
  // text string there is no accessible name
292
- if (matchesSelector(element, "area[href]")) {
293
- if (element.hasAttribute("alt")) {
294
- return element.getAttribute("alt");
295
- } else if (element.hasAttribute("title")) {
296
- return element.getAttribute("title");
306
+ if (matchesSelector(element, 'area[href]')) {
307
+ if (element.hasAttribute('alt')) {
308
+ return element.getAttribute('alt');
309
+ } else if (element.hasAttribute('title')) {
310
+ return element.getAttribute('title');
297
311
  } else {
298
312
  return false;
299
313
  }
@@ -303,30 +317,91 @@ function getAccessibleName(element) {
303
317
  // STEP 11-2.1: use alt attribute
304
318
  // STEP 11-2.3: return false. If none of the above yield a usable
305
319
  // text string there is no accessible name
306
- if (element.tagName.toLowerCase() === "applet") {
307
- if (element.hasAttribute("alt")) {
308
- return element.getAttribute("alt");
320
+ if (element.tagName.toLowerCase() === 'applet') {
321
+ if (element.hasAttribute('alt')) {
322
+ return element.getAttribute('alt');
309
323
  } else {
310
324
  return false;
311
325
  }
312
326
  }
313
327
 
328
+ // STEP 11-3: object element
329
+ // Per ACT Rule 8fc3b6, object elements rendering non-text content
330
+ // can receive accessible name from aria-labelledby, aria-label (handled above),
331
+ // title attribute, or fallback content (handled at end via getAccessibleText)
332
+ // STEP 11-3.1: use title attribute
333
+ // STEP 11-3.2: fallback content is handled at the end via getAccessibleText
334
+ if (element.tagName.toLowerCase() === 'object') {
335
+ if (element.hasAttribute('title')) {
336
+ const titleValue = element.getAttribute('title');
337
+ if (strlen(titleValue) > 0) {
338
+ return titleValue;
339
+ }
340
+ }
341
+ // Fallback content will be handled by getAccessibleText at the end
342
+ // So we don't return false here - let it fall through
343
+ }
344
+
345
+ // STEP 11-4: meter element (native or role="meter")
346
+ // Per Axe aria-meter-name rule, meter elements need accessible name from
347
+ // aria-labelledby, aria-label (handled above), title, or associated label
348
+ // Text content inside meter is NOT a valid accessible name (it's fallback content)
349
+ // STEP 11-4.1: use title attribute
350
+ // STEP 11-4.2: for native meter, use associated label
351
+ // STEP 11-4.3: return false (don't use text content)
352
+ if (element.tagName.toLowerCase() === 'meter' || element.getAttribute('role') === 'meter') {
353
+ if (element.hasAttribute('title')) {
354
+ const titleValue = element.getAttribute('title');
355
+ if (strlen(titleValue) > 0) {
356
+ return titleValue;
357
+ }
358
+ }
359
+
360
+ // For native meter elements, check for associated label
361
+ if (element.tagName.toLowerCase() === 'meter') {
362
+ // Check for label with for attribute
363
+ if (element.id) {
364
+ const label = document.querySelector('label[for="' + element.id + '"]');
365
+ if (label &amp;&amp; strlen(getAccessibleText(label)) > 0) {
366
+ return getAccessibleText(label);
367
+ }
368
+ }
369
+
370
+ // Check for wrapping label
371
+ const parentLabel = element.closest('label');
372
+ if (parentLabel) {
373
+ // Get label text excluding the meter's own content
374
+ const clone = parentLabel.cloneNode(true);
375
+ const meterInClone = clone.querySelector('meter');
376
+ if (meterInClone) {
377
+ meterInClone.remove();
378
+ }
379
+ if (strlen(clone.textContent) > 0) {
380
+ return clone.textContent.trim();
381
+ }
382
+ }
383
+ }
384
+
385
+ // Meter text content is not an accessible name, return false
386
+ return false;
387
+ }
388
+
314
389
  // STEP 12: table element
315
390
  // STEP 12.1: caption element
316
391
  // STEP 12.2: use the title attribute
317
392
  // STEP 12.3: use the summary attribute
318
393
  // STEP 12.4: return false. If none of the above yield a usable
319
394
  // text string there is no accessible name
320
- if (element.tagName.toLowerCase() === "table") {
321
- const caption = element.querySelector("caption");
395
+ if (element.tagName.toLowerCase() === 'table') {
396
+ const caption = element.querySelector('caption');
322
397
  if (caption) {
323
398
  if (strlen(getAccessibleText(caption)) > 0) {
324
399
  return getAccessibleText(caption);
325
400
  }
326
- } else if (element.hasAttribute("title")) {
327
- return element.getAttribute("title");
328
- } else if (element.hasAttribute("summary")) {
329
- return element.getAttribute("summary");
401
+ } else if (element.hasAttribute('title')) {
402
+ return element.getAttribute('title');
403
+ } else if (element.hasAttribute('summary')) {
404
+ return element.getAttribute('summary');
330
405
  }
331
406
  return false;
332
407
  }
@@ -336,11 +411,11 @@ function getAccessibleName(element) {
336
411
  // STEP 13.2: the title attribute
337
412
  // STEP 13.3: return false. If none of the above yield a usable
338
413
  // text string there is no accessible name
339
- if (matchesSelector(element, "a[href]")) {
414
+ if (matchesSelector(element, 'a[href]')) {
340
415
  if (strlen(getAccessibleText(element)) > 0) {
341
416
  return getAccessibleText(element);
342
- } else if (element.hasAttribute("title")) {
343
- return element.getAttribute("title");
417
+ } else if (element.hasAttribute('title')) {
418
+ return element.getAttribute('title');
344
419
  } else {
345
420
  return false;
346
421
  }
@@ -354,19 +429,41 @@ function getAccessibleName(element) {
354
429
  // STEP 14.2: return false. If none of the above yield a usable
355
430
  // text string there is no accessible name
356
431
  if (
357
- matchesSelector(element,
358
- "em, strong, small, s, cite, q, dfn, abbr, time, code, var, samp, kbd, sub, sup, i, b, u, mark, ruby, rt, rp, bdi, bdo, br, wbr"
432
+ matchesSelector(
433
+ element,
434
+ 'em, strong, small, s, cite, q, dfn, abbr, time, code, var, samp, kbd, sub, sup, i, b, u, mark, ruby, rt, rp, bdi, bdo, br, wbr'
359
435
  )
360
436
  ) {
361
437
  if (strlen(element.textContent) > 0) {
362
438
  return element.textContent;
363
- } else if (element.hasAttribute("title")) {
364
- return element.getAttribute("title");
439
+ } else if (element.hasAttribute('title')) {
440
+ return element.getAttribute('title');
365
441
  } else {
366
442
  return false;
367
443
  }
368
444
  }
369
445
 
446
+ // STEP 15: Landmark elements that require explicit accessible names
447
+ // Landmark roles do NOT support "Name From: contents" per WAI-ARIA spec.
448
+ // They only support "Name From: author" (aria-labelledby, aria-label, title).
449
+ // Since steps 1 &amp; 2 already checked aria-labelledby and aria-label,
450
+ // we only need to check title here, then return false.
451
+ const tagName = element.tagName.toLowerCase();
452
+ const role = element.getAttribute('role');
453
+ const isLandmark = LANDMARK_ROLES.includes(role) || tagName in LANDMARK_ELEMENT_MAP;
454
+
455
+ if (isLandmark) {
456
+ // Title attribute is valid for landmark elements
457
+ if (element.hasAttribute('title')) {
458
+ const titleValue = element.getAttribute('title');
459
+ if (strlen(titleValue) > 0) {
460
+ return titleValue;
461
+ }
462
+ }
463
+ // Landmark elements do not get accessible name from text content
464
+ return false;
465
+ }
466
+
370
467
  // Absolute last ditch for the whole plugin:
371
468
  // use the accessible text from the element itself.
372
469
  if (strlen(getAccessibleText(element)) > 0) {
@@ -386,27 +483,31 @@ function getAccessibleName(element) {
386
483
  */
387
484
  function isNotVisible(element) {
388
485
  // Importing isVisible would be better, but for this standalone function we'll check it this way
389
- if (!element) return true;
486
+ if (!element) {
487
+ return true;
488
+ }
390
489
 
391
- // These elements are inherently not visible
392
- const nonVisibleSelectors = [
393
- 'base', 'head', 'meta', 'title', 'link', 'style', 'script', 'br', 'nobr', 'col', 'embed',
394
- 'input[type="hidden"]', 'keygen', 'source', 'track', 'wbr', 'datalist', 'area', 'param', 'noframes', 'ruby > rp'
395
- ];
490
+ // Note: 'area' is filtered out because area elements DO have accessible names
491
+ // via the alt attribute and should participate in accessible name calculation
492
+ const nonVisibleSelectorsWithoutArea = NON_VISIBLE_SELECTORS.filter(s => s !== 'area');
396
493
 
397
- if (nonVisibleSelectors.some(selector => matchesSelector(element, selector))) {
494
+ if (nonVisibleSelectorsWithoutArea.some(selector => matchesSelector(element, selector))) {
398
495
  return true; // Not visible in accessibility tree
399
496
  }
400
497
 
401
498
  // Check if display is none
402
499
  const isElemDisplayed = el => window.getComputedStyle(el).display === 'none';
403
500
 
404
- if (isElemDisplayed(element)) return true;
501
+ if (isElemDisplayed(element)) {
502
+ return true;
503
+ }
405
504
 
406
505
  // Check parent elements
407
506
  let parent = element.parentElement;
408
507
  while (parent) {
409
- if (isElemDisplayed(parent)) return true;
508
+ if (isElemDisplayed(parent)) {
509
+ return true;
510
+ }
410
511
  parent = parent.parentElement;
411
512
  }
412
513
 
@@ -420,12 +521,13 @@ function isNotVisible(element) {
420
521
  * @returns {boolean} True if element matches the selector
421
522
  */
422
523
  function matchesSelector(element, selector) {
423
- if (!element) return false;
524
+ if (!element) {
525
+ return false;
526
+ }
424
527
 
425
528
  // Use the right matches function depending on browser support
426
- const matchesMethod = element.matches ||
427
- element.mozMatchesSelector ||
428
- element.msMatchesSelector;
529
+ const matchesMethod =
530
+ element.matches || element.mozMatchesSelector || element.msMatchesSelector;
429
531
 
430
532
  // Handle multiple selectors (comma-separated)
431
533
  if (selector.includes(',')) {
@@ -441,16 +543,9 @@ function matchesSelector(element, selector) {
441
543
  * @returns {number} The string length or 0
442
544
  */
443
545
  function strlen(str) {
444
- return typeof str === "string" &amp;&amp; !isEmpty(str.trim()) ? str.trim().length : 0;
546
+ return typeof str === 'string' &amp;&amp; !isEmpty(str.trim()) ? str.trim().length : 0;
445
547
  }
446
548
 
447
- // Export as default for ES modules
448
- export default getAccessibleName;
449
-
450
549
  // Export the function for CommonJS module usage
451
- if (typeof module !== 'undefined' &amp;&amp; module.exports) {
452
- module.exports = getAccessibleName;
453
- } else if (typeof window !== 'undefined') {
454
- // Add to window object for browser usage
455
- window.getAccessibleName = getAccessibleName;
456
- }</code></pre></article></section></div></div></div><div class="search-container" id="PkfLWpAbet" style="display:none"><div class="wrapper" id="iCxFxjkHbP"><button class="icon-button search-close-button" id="VjLlGakifb" aria-label="close search"><svg><use xlink:href="#close-icon"></use></svg></button><div class="search-box-c"><svg><use xlink:href="#search-icon"></use></svg> <input type="text" id="vpcKVYIppa" class="search-input" placeholder="Search..." autofocus></div><div class="search-result-c" id="fWwVHRuDuN"><span class="search-result-c-text">Type anything to view search result</span></div></div></div><div class="mobile-menu-icon-container"><button class="icon-button" id="mobile-menu" data-isopen="false" aria-label="menu"><svg><use xlink:href="#menu-icon"></use></svg></button></div><div id="mobile-sidebar" class="mobile-sidebar-container"><div class="mobile-sidebar-wrapper"><div class="mobile-nav-links"></div><div class="mobile-sidebar-items-c"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-afixt-test-utils.html">afixt-test-utils</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#arrayCount">arrayCount</a></div><div class="sidebar-section-children"><a href="global.html#arrayRemoveByValue">arrayRemoveByValue</a></div><div class="sidebar-section-children"><a href="global.html#arrayUnique">arrayUnique</a></div><div class="sidebar-section-children"><a href="global.html#cellColorDiffs">cellColorDiffs</a></div><div class="sidebar-section-children"><a href="global.html#cellCount">cellCount</a></div><div class="sidebar-section-children"><a href="global.html#checkInconsistent">checkInconsistent</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsInHeader">checkMultiRowsInHeader</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsWithColspan">checkMultiRowsWithColspan</a></div><div class="sidebar-section-children"><a href="global.html#cleanBlank">cleanBlank</a></div><div class="sidebar-section-children"><a href="global.html#colCount">colCount</a></div><div class="sidebar-section-children"><a href="global.html#countBordersPct">countBordersPct</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleName">getAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleText">getAccessibleText</a></div><div class="sidebar-section-children"><a href="global.html#getAriaAttributes">getAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#getCSSGeneratedContent">getCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getColorContrast">getColorContrast</a></div><div class="sidebar-section-children"><a href="global.html#getComputedBackgroundColor">getComputedBackgroundColor</a></div><div class="sidebar-section-children"><a href="global.html#getComputedRole">getComputedRole</a></div><div class="sidebar-section-children"><a href="global.html#getFocusableElements">getFocusableElements</a></div><div class="sidebar-section-children"><a href="global.html#getGeneratedContent">getGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getImageText">getImageText</a></div><div class="sidebar-section-children"><a href="global.html#getStyleObject">getStyleObject</a></div><div class="sidebar-section-children"><a href="global.html#getTwoLetterCode">getTwoLetterCode</a></div><div class="sidebar-section-children"><a href="global.html#hasAccessibleName">hasAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#hasAttribute">hasAttribute</a></div><div class="sidebar-section-children"><a href="global.html#hasCSSGeneratedContent">hasCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#hasHiddenParent">hasHiddenParent</a></div><div class="sidebar-section-children"><a href="global.html#hasParent">hasParent</a></div><div class="sidebar-section-children"><a href="global.html#hasValidAriaAttributes">hasValidAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#hasValidAriaRole">hasValidAriaRole</a></div><div class="sidebar-section-children"><a href="global.html#isAriaAttributeValid">isAriaAttributeValid</a></div><div class="sidebar-section-children"><a href="global.html#isComplexTable">isComplexTable</a></div><div class="sidebar-section-children"><a href="global.html#isDataTable">isDataTable</a></div><div class="sidebar-section-children"><a href="global.html#isFocusable">isFocusable</a></div><div class="sidebar-section-children"><a href="global.html#isHidden">isHidden</a></div><div class="sidebar-section-children"><a href="global.html#isNotVisible">isNotVisible</a></div><div class="sidebar-section-children"><a href="global.html#isOffScreen">isOffScreen</a></div><div class="sidebar-section-children"><a href="global.html#isValidUrl">isValidUrl</a></div><div class="sidebar-section-children"><a href="global.html#isVisible">isVisible</a></div><div class="sidebar-section-children"><a href="global.html#langCodes">langCodes</a></div><div class="sidebar-section-children"><a href="global.html#luminance">luminance</a></div><div class="sidebar-section-children"><a href="global.html#matchesSelector">matchesSelector</a></div><div class="sidebar-section-children"><a href="global.html#parseRGB">parseRGB</a></div><div class="sidebar-section-children"><a href="global.html#rowCount">rowCount</a></div><div class="sidebar-section-children"><a href="global.html#rtls">rtls</a></div><div class="sidebar-section-children"><a href="global.html#sortByVisualOrder">sortByVisualOrder</a></div><div class="sidebar-section-children"><a href="global.html#strlen">strlen</a></div><div class="sidebar-section-children"><a href="global.html#testContrast">testContrast</a></div><div class="sidebar-section-children"><a href="global.html#testLang">testLang</a></div><div class="sidebar-section-children"><a href="global.html#testOrder">testOrder</a></div><div class="sidebar-section-children"><a href="global.html#validAriaAttributes">validAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#validLangCodes">validLangCodes</a></div></div></div><div class="mobile-navbar-actions"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#light-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div></div></div><script type="text/javascript" src="scripts/core.min.js"></script><script src="scripts/search.min.js" defer="defer"></script><script src="scripts/third-party/fuse.js" defer="defer"></script><script type="text/javascript">var tocbotInstance=tocbot.init({tocSelector:"#eed4d2a0bfd64539bb9df78095dec881",contentSelector:".main-content",headingSelector:"h1, h2, h3",hasInnerContainers:!0,scrollContainer:".main-content",headingsOffset:130,onClick:bringLinkToView})</script></body></html>
550
+ module.exports = getAccessibleName;
551
+ </code></pre></article></section></div></div></div><div class="search-container" id="PkfLWpAbet" style="display:none"><div class="wrapper" id="iCxFxjkHbP"><button class="icon-button search-close-button" id="VjLlGakifb" aria-label="close search"><svg><use xlink:href="#close-icon"></use></svg></button><div class="search-box-c"><svg><use xlink:href="#search-icon"></use></svg> <input type="text" id="vpcKVYIppa" class="search-input" placeholder="Search..." autofocus></div><div class="search-result-c" id="fWwVHRuDuN"><span class="search-result-c-text">Type anything to view search result</span></div></div></div><div class="mobile-menu-icon-container"><button class="icon-button" id="mobile-menu" data-isopen="false" aria-label="menu"><svg><use xlink:href="#menu-icon"></use></svg></button></div><div id="mobile-sidebar" class="mobile-sidebar-container"><div class="mobile-sidebar-wrapper"><div class="mobile-nav-links"></div><div class="mobile-sidebar-items-c"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-QueryCache.html">QueryCache</a></div><div class="sidebar-section-children"><a href="module-afixt-test-utils.html">afixt-test-utils</a></div><div class="sidebar-section-children"><a href="module-colorConversions.html">colorConversions</a></div><div class="sidebar-section-children"><a href="module-constants.html">constants</a></div><div class="sidebar-section-children"><a href="module-cssUtils.html">cssUtils</a></div><div class="sidebar-section-children"><a href="module-formUtils.html">formUtils</a></div><div class="sidebar-section-children"><a href="module-suggestContrast.html">suggestContrast</a></div><div class="sidebar-section-children"><a href="module-tableUtils.html">tableUtils</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#RTL_LANGUAGES">RTL_LANGUAGES</a></div><div class="sidebar-section-children"><a href="global.html#_internal">_internal</a></div><div class="sidebar-section-children"><a href="global.html#arrayCount">arrayCount</a></div><div class="sidebar-section-children"><a href="global.html#arrayRemoveByValue">arrayRemoveByValue</a></div><div class="sidebar-section-children"><a href="global.html#arrayUnique">arrayUnique</a></div><div class="sidebar-section-children"><a href="global.html#cellColorDiffs">cellColorDiffs</a></div><div class="sidebar-section-children"><a href="global.html#cellCount">cellCount</a></div><div class="sidebar-section-children"><a href="global.html#checkInconsistent">checkInconsistent</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsInHeader">checkMultiRowsInHeader</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsWithColspan">checkMultiRowsWithColspan</a></div><div class="sidebar-section-children"><a href="global.html#cleanBlank">cleanBlank</a></div><div class="sidebar-section-children"><a href="global.html#colCount">colCount</a></div><div class="sidebar-section-children"><a href="global.html#collectSubtreeText">collectSubtreeText</a></div><div class="sidebar-section-children"><a href="global.html#countBordersPct">countBordersPct</a></div><div class="sidebar-section-children"><a href="global.html#extractMeaningfulContent">extractMeaningfulContent</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleName">getAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleText">getAccessibleText</a></div><div class="sidebar-section-children"><a href="global.html#getAriaAttributesByElement">getAriaAttributesByElement</a></div><div class="sidebar-section-children"><a href="global.html#getAttributeHandlers">getAttributeHandlers</a></div><div class="sidebar-section-children"><a href="global.html#getCSSGeneratedContent">getCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getColorContrast">getColorContrast</a></div><div class="sidebar-section-children"><a href="global.html#getComputedBackgroundColor">getComputedBackgroundColor</a></div><div class="sidebar-section-children"><a href="global.html#getComputedRole">getComputedRole</a></div><div class="sidebar-section-children"><a href="global.html#getContrastRatio">getContrastRatio</a></div><div class="sidebar-section-children"><a href="global.html#getEffectiveDir">getEffectiveDir</a></div><div class="sidebar-section-children"><a href="global.html#getEventListeners">getEventListeners</a></div><div class="sidebar-section-children"><a href="global.html#getFocusableElements">getFocusableElements</a></div><div class="sidebar-section-children"><a href="global.html#getGeneratedContent">getGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getImageText">getImageText</a></div><div class="sidebar-section-children"><a href="global.html#getPropertyHandlers">getPropertyHandlers</a></div><div class="sidebar-section-children"><a href="global.html#getRelativeLuminance">getRelativeLuminance</a></div><div class="sidebar-section-children"><a href="global.html#getStyleObject">getStyleObject</a></div><div class="sidebar-section-children"><a href="global.html#getTwoLetterCode">getTwoLetterCode</a></div><div class="sidebar-section-children"><a href="global.html#hasAccessibleName">hasAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#hasAttribute">hasAttribute</a></div><div class="sidebar-section-children"><a href="global.html#hasBackgroundImage">hasBackgroundImage</a></div><div class="sidebar-section-children"><a href="global.html#hasCSSGeneratedContent">hasCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#hasHiddenParent">hasHiddenParent</a></div><div class="sidebar-section-children"><a href="global.html#hasParent">hasParent</a></div><div class="sidebar-section-children"><a href="global.html#hasValidAriaAttributes">hasValidAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#isA11yVisible">isA11yVisible</a></div><div class="sidebar-section-children"><a href="global.html#isAriaAttributeValid">isAriaAttributeValid</a></div><div class="sidebar-section-children"><a href="global.html#isComplexTable">isComplexTable</a></div><div class="sidebar-section-children"><a href="global.html#isDataTable">isDataTable</a></div><div class="sidebar-section-children"><a href="global.html#isFocusable">isFocusable</a></div><div class="sidebar-section-children"><a href="global.html#isHidden">isHidden</a></div><div class="sidebar-section-children"><a href="global.html#isNotVisible">isNotVisible</a></div><div class="sidebar-section-children"><a href="global.html#isOffScreen">isOffScreen</a></div><div class="sidebar-section-children"><a href="global.html#isRTLLanguage">isRTLLanguage</a></div><div class="sidebar-section-children"><a href="global.html#isValidLanguageCode">isValidLanguageCode</a></div><div class="sidebar-section-children"><a href="global.html#isValidUrl">isValidUrl</a></div><div class="sidebar-section-children"><a href="global.html#langCodes">langCodes</a></div><div class="sidebar-section-children"><a href="global.html#listEventListeners">listEventListeners</a></div><div class="sidebar-section-children"><a href="global.html#luminance">luminance</a></div><div class="sidebar-section-children"><a href="global.html#matchesSelector">matchesSelector</a></div><div class="sidebar-section-children"><a href="global.html#parseColor">parseColor</a></div><div class="sidebar-section-children"><a href="global.html#parseRGB">parseRGB</a></div><div class="sidebar-section-children"><a href="global.html#rowCount">rowCount</a></div><div class="sidebar-section-children"><a href="global.html#rtls">rtls</a></div><div class="sidebar-section-children"><a href="global.html#sortByVisualOrder">sortByVisualOrder</a></div><div class="sidebar-section-children"><a href="global.html#strlen">strlen</a></div><div class="sidebar-section-children"><a href="global.html#testContrast">testContrast</a></div><div class="sidebar-section-children"><a href="global.html#testLang">testLang</a></div><div class="sidebar-section-children"><a href="global.html#testOrder">testOrder</a></div><div class="sidebar-section-children"><a href="global.html#validLangCodes">validLangCodes</a></div></div></div><div class="mobile-navbar-actions"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#light-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div></div></div><script type="text/javascript" src="scripts/core.min.js"></script><script src="scripts/search.min.js" defer="defer"></script><script src="scripts/third-party/fuse.js" defer="defer"></script><script type="text/javascript">var tocbotInstance=tocbot.init({tocSelector:"#eed4d2a0bfd64539bb9df78095dec881",contentSelector:".main-content",headingSelector:"h1, h2, h3",hasInnerContainers:!0,scrollContainer:".main-content",headingsOffset:130,onClick:bringLinkToView})</script></body></html>