@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.
- package/CHANGELOG.md +7 -0
- package/CLAUDE.md +1 -1
- package/README.md +40 -1
- package/docs/arrayUtils.js.html +8 -13
- package/docs/colorConversions.js.html +238 -0
- package/docs/constants.js.html +671 -0
- package/docs/cssUtils.js.html +80 -0
- package/docs/data/search.json +1 -1
- package/docs/domUtils.js.html +252 -32
- package/docs/formUtils.js.html +161 -0
- package/docs/getAccessibleName.js.html +215 -120
- package/docs/getAccessibleText.js.html +103 -48
- package/docs/getAriaAttributesByElement.js.html +4 -4
- package/docs/getCSSGeneratedContent.js.html +50 -41
- package/docs/getComputedRole.js.html +8 -3
- package/docs/getFocusableElements.js.html +25 -21
- package/docs/getGeneratedContent.js.html +24 -13
- package/docs/getImageText.js.html +31 -9
- package/docs/getStyleObject.js.html +7 -3
- package/docs/global.html +1 -1
- package/docs/hasAccessibleName.js.html +2 -10
- package/docs/hasAttribute.js.html +7 -3
- package/docs/hasCSSGeneratedContent.js.html +18 -14
- package/docs/hasHiddenParent.js.html +4 -4
- package/docs/hasParent.js.html +7 -3
- package/docs/hasValidAriaAttributes.js.html +7 -3
- package/docs/index.html +1 -1
- package/docs/index.js.html +98 -32
- package/docs/isA11yVisible.js.html +98 -0
- package/docs/isAriaAttributesValid.js.html +10 -64
- package/docs/isComplexTable.js.html +13 -6
- package/docs/isDataTable.js.html +11 -6
- package/docs/isFocusable.js.html +36 -12
- package/docs/isHidden.js.html +47 -11
- package/docs/isOffScreen.js.html +7 -3
- package/docs/isValidUrl.js.html +7 -3
- package/docs/listEventListeners.js.html +203 -0
- package/docs/module-QueryCache.html +3 -0
- package/docs/module-afixt-test-utils.html +1 -1
- package/docs/module-colorConversions.html +3 -0
- package/docs/module-constants.html +3 -0
- package/docs/module-cssUtils.html +3 -0
- package/docs/module-formUtils.html +3 -0
- package/docs/module-suggestContrast.html +3 -0
- package/docs/module-tableUtils.html +3 -0
- package/docs/queryCache.js.html +360 -0
- package/docs/scripts/core.js +726 -726
- package/docs/scripts/core.min.js +22 -22
- package/docs/scripts/resize.js +90 -90
- package/docs/scripts/search.js +265 -265
- package/docs/scripts/third-party/Apache-License-2.0.txt +202 -202
- package/docs/scripts/third-party/fuse.js +8 -8
- package/docs/scripts/third-party/hljs-line-num-original.js +369 -369
- package/docs/scripts/third-party/hljs-original.js +5171 -5171
- package/docs/scripts/third-party/popper.js +5 -5
- package/docs/scripts/third-party/tippy.js +1 -1
- package/docs/scripts/third-party/tocbot.js +671 -671
- package/docs/styles/clean-jsdoc-theme-base.css +1159 -1159
- package/docs/styles/clean-jsdoc-theme-dark.css +412 -412
- package/docs/styles/clean-jsdoc-theme-light.css +482 -482
- package/docs/styles/clean-jsdoc-theme-scrollbar.css +29 -29
- package/docs/suggestContrast.js.html +389 -0
- package/docs/tableUtils.js.html +151 -0
- package/docs/testContrast.js.html +201 -24
- package/docs/testLang.js.html +533 -451
- package/docs/testOrder.js.html +9 -4
- package/package.json +1 -1
- package/src/colorConversions.js +235 -0
- package/src/index.js +6 -0
- package/src/stringUtils.js +35 -0
- package/src/suggestContrast.js +386 -0
- package/test/colorConversions.test.js +223 -0
- package/test/stringUtils.test.js +60 -0
- 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
|
-
|
|
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)
|
|
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
|
|
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(
|
|
32
|
-
ids = element.getAttribute(
|
|
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(
|
|
49
|
-
const ariaLabel = element.getAttribute(
|
|
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 & 2 above.
|
|
58
71
|
// If a label isn't found in Step 1 & 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(
|
|
61
|
-
const roleValue = element.getAttribute(
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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",
|
|
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(
|
|
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 && 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
|
|
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(
|
|
99
|
-
return getAccessibleText(element.closest(
|
|
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(
|
|
104
|
-
if (strlen(element.getAttribute(
|
|
105
|
-
return element.getAttribute(
|
|
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(
|
|
130
|
-
if (element.getAttribute(
|
|
131
|
-
return element.getAttribute(
|
|
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(
|
|
135
|
-
return element.getAttribute(
|
|
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(
|
|
146
|
-
return element.getAttribute(
|
|
157
|
+
if (element.hasAttribute('title')) {
|
|
158
|
+
return element.getAttribute('title');
|
|
147
159
|
} else {
|
|
148
|
-
return
|
|
160
|
+
return 'Submit';
|
|
149
161
|
}
|
|
150
162
|
} else if (matchesSelector(element, 'input[type="reset"]')) {
|
|
151
|
-
if (element.hasAttribute(
|
|
152
|
-
return element.getAttribute(
|
|
163
|
+
if (element.hasAttribute('title')) {
|
|
164
|
+
return element.getAttribute('title');
|
|
153
165
|
} else {
|
|
154
|
-
return
|
|
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(
|
|
167
|
-
return element.getAttribute(
|
|
168
|
-
} else if (element.hasAttribute(
|
|
169
|
-
return element.getAttribute(
|
|
170
|
-
} else if (element.hasAttribute(
|
|
171
|
-
return element.getAttribute(
|
|
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() ===
|
|
193
|
+
if (element.tagName.toLowerCase() === 'button') {
|
|
182
194
|
if (strlen(getAccessibleText(element)) > 0) {
|
|
183
195
|
return getAccessibleText(element);
|
|
184
|
-
} else if (element.hasAttribute(
|
|
185
|
-
return element.getAttribute(
|
|
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
|
|
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(
|
|
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(
|
|
213
|
-
return getAccessibleText(element.closest(
|
|
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(
|
|
218
|
-
return element.getAttribute(
|
|
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() ===
|
|
238
|
-
const summary = element.querySelector(
|
|
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(
|
|
244
|
-
if (strlen(element.getAttribute(
|
|
245
|
-
return element.getAttribute(
|
|
257
|
+
} else if (element.hasAttribute('title')) {
|
|
258
|
+
if (strlen(element.getAttribute('title')) > 0) {
|
|
259
|
+
return element.getAttribute('title');
|
|
246
260
|
} else {
|
|
247
|
-
return
|
|
261
|
+
return 'Details';
|
|
248
262
|
}
|
|
249
263
|
} else {
|
|
250
|
-
return
|
|
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() ===
|
|
260
|
-
const figcaption = element.querySelector(
|
|
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(
|
|
266
|
-
return element.getAttribute(
|
|
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() ===
|
|
278
|
-
if (element.hasAttribute(
|
|
279
|
-
return element.getAttribute(
|
|
280
|
-
} else if (element.hasAttribute(
|
|
281
|
-
return element.getAttribute(
|
|
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,
|
|
293
|
-
if (element.hasAttribute(
|
|
294
|
-
return element.getAttribute(
|
|
295
|
-
} else if (element.hasAttribute(
|
|
296
|
-
return element.getAttribute(
|
|
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() ===
|
|
307
|
-
if (element.hasAttribute(
|
|
308
|
-
return element.getAttribute(
|
|
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 && 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() ===
|
|
321
|
-
const caption = element.querySelector(
|
|
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(
|
|
327
|
-
return element.getAttribute(
|
|
328
|
-
} else if (element.hasAttribute(
|
|
329
|
-
return element.getAttribute(
|
|
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,
|
|
414
|
+
if (matchesSelector(element, 'a[href]')) {
|
|
340
415
|
if (strlen(getAccessibleText(element)) > 0) {
|
|
341
416
|
return getAccessibleText(element);
|
|
342
|
-
} else if (element.hasAttribute(
|
|
343
|
-
return element.getAttribute(
|
|
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(
|
|
358
|
-
|
|
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(
|
|
364
|
-
return element.getAttribute(
|
|
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 & 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)
|
|
486
|
+
if (!element) {
|
|
487
|
+
return true;
|
|
488
|
+
}
|
|
390
489
|
|
|
391
|
-
//
|
|
392
|
-
|
|
393
|
-
|
|
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 (
|
|
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))
|
|
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))
|
|
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)
|
|
524
|
+
if (!element) {
|
|
525
|
+
return false;
|
|
526
|
+
}
|
|
424
527
|
|
|
425
528
|
// Use the right matches function depending on browser support
|
|
426
|
-
const matchesMethod =
|
|
427
|
-
|
|
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 ===
|
|
546
|
+
return typeof str === 'string' && !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
|
-
|
|
452
|
-
|
|
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>
|