diff --git a/rule-server/src/static/archives.json b/rule-server/src/static/archives.json index 6536640d5..e6d8ec6a8 100644 --- a/rule-server/src/static/archives.json +++ b/rule-server/src/static/archives.json @@ -4,11 +4,16 @@ "name": "Latest Deployment", "path": "/archives/latest" }, + { + "id": "12March2022", + "name": "12 March 2022 Deployment", + "path": "/archives/2022.03.12", + "latest": true + }, { "id": "03March2022", "name": "03 March 2022 Deployment", - "path": "/archives/2022.03.03", - "latest": true + "path": "/archives/2022.03.03" }, { "id": "01February2022", diff --git a/rule-server/src/static/archives/2022.03.12/doc/assets/NeedsReview16.svg b/rule-server/src/static/archives/2022.03.12/doc/assets/NeedsReview16.svg new file mode 100644 index 000000000..917834a38 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/assets/NeedsReview16.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/rule-server/src/static/archives/2022.03.12/doc/assets/Recommendation16.svg b/rule-server/src/static/archives/2022.03.12/doc/assets/Recommendation16.svg new file mode 100644 index 000000000..b57dc73d5 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/assets/Recommendation16.svg @@ -0,0 +1,15 @@ + + + + + + +i + diff --git a/rule-server/src/static/archives/2022.03.12/doc/assets/Violation16.svg b/rule-server/src/static/archives/2022.03.12/doc/assets/Violation16.svg new file mode 100644 index 000000000..5f8c9c710 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/assets/Violation16.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/rule-server/src/static/archives/2022.03.12/doc/common/help.css b/rule-server/src/static/archives/2022.03.12/doc/common/help.css new file mode 100644 index 000000000..d93818bf0 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/common/help.css @@ -0,0 +1,154 @@ +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +@import url('https://unpkg.com/carbon-components/css/carbon-components.min.css'); + +bx-list-item>code, p>code, td>code { + background-color: #e0e0e0; + border-radius: 4px; + bottom: 0.0625em; + color: #161616; + display: inline; + font-size: .75rem; + font-size: .875em; + font-weight: 400; + letter-spacing: .32px; + line-height: 1.33333; + padding: 0 0.5em; + position: relative; +} + +.toolHelp .toolMain p ~ p { + margin-top: .5rem; +} + +.toolHelp .toolHead h3 { + font-size: 20px; + line-height: 28px; + font-weight: 600; +} + +.toolHelp .toolHead .issueLevel { + font-weight: 600; +} + +/* body-long-02 */ +.toolHelp .toolHead p { + font-size: 16px; + line-height: 24px; + font-weight: 400; +} + +/* productive-heading-03 */ +.toolHelp .toolMain h3 { + font-size: 20px; + line-height: 28px; + font-weight: 400; +} + +/* body-long-02 */ +.toolHelp .toolMain p { + font-size: 16px; + line-height: 24px; + font-weight: 400; +} + +.toolHelp .toolSide .bx--list__item { + color: black; + font-size: 0.875rem; + line-height: 18px; +} + +/* productive-heading-03 */ +.toolHelp .toolSide h3 { + font-size: 20px; + line-height: 28px; + font-weight: 400; +} +.toolHelp .toolSide p { + font-size: 20px; + line-height: 28px; + font-weight: 400; +} + +html, body, .toolHelp .bx--row:nth-child(2) { + height: 100%; +} + +body { + font-family: 'IBM Plex Sans', sans-serif; +} + +.toolHelp { + padding: 0px; + margin: 0px; + max-width: 100%; + background-color: #be95ff; +} + +.toolHelp .bx--row { + margin: 0px; +} + +.toolHelp .toolHead { + margin-bottom: 1rem; + padding-top: 1rem; +} +.toolHelp .toolMain { + background-color: #f4f4f4; + padding-top: 1rem; + padding-bottom: 1rem; +} +.toolHelp .toolMain h2 { + margin-top: 32px; + margin-bottom: 0.5rem; +} +.toolHelp .toolMain h3 { + margin-top: 1.5rem; + margin-bottom: 0.5rem; +} +.toolHelp .toolMain p { + margin-top: 0px; +} + +.toolHelp .toolSide { + padding: 16px 16px 16px 32px; + background-color: #e8daff; + color: black; +} +.toolHelp .toolSide h2 { + margin-top: 32px; + margin-bottom: 0.5rem; +} +.toolHelp .toolSide h3 { + margin-top: 1.5rem; + margin-bottom: 0.5rem; +} +.toolHelp .toolSide p { + margin-top: 0px; +} +@media (min-width: 66rem) { + .toolHelp .toolMain p, bx-list-item { + max-width: 66.66%; + } +} +bx-code-snippet[type="multi"]::after { + height: 0px; +} + +#ruleInfo { + margin-top: 1rem; +} + +#ruleInfo p { + font-size: 14px; +} diff --git a/rule-server/src/static/archives/2022.03.12/doc/common/help.js b/rule-server/src/static/archives/2022.03.12/doc/common/help.js new file mode 100644 index 000000000..722af28b7 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/common/help.js @@ -0,0 +1,154 @@ +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ + +class HTMLBaseElement extends HTMLElement { + constructor(...args) { + const self = super(...args); + self.parsed = false; // guard to make it easy to do certain stuff only once + self.parentNodes = []; + return self; + } + + connectedCallback() { + // collect the parentNodes + let el = this; + while (el.parentNode) { + el = el.parentNode; + this.parentNodes.push(el); + } + // check if the parser has already passed the end tag of the component + // in which case this element, or one of its parents, should have a nextSibling + // if not (no whitespace at all between tags and no nextElementSiblings either) + // resort to DOMContentLoaded or load having triggered + if ([this, ...this.parentNodes].some((el) => el.nextSibling) || document.readyState !== "loading") { + this.childrenAvailableCallback(); + this.parsed = true; + } else { + this.mutationObserver = new MutationObserver(() => { + if ([this, ...this.parentNodes].some((el) => el.nextSibling) || document.readyState !== "loading") { + this.childrenAvailableCallback(); + this.parsed = true; + this.mutationObserver.disconnect(); + } + }); + + this.mutationObserver.observe(this, { + childList: true, + }); + } + } +} + +customElements.define( + "mark-down", + class extends HTMLBaseElement { + constructor() { + super(); + setTimeout(() => { + let converted = marked.parse(this.textContent); + this.innerHTML = converted + .replace(/<(\/?)ul>/g, "<$1bx-unordered-list>") + .replace(/<(\/?)li>/g, "<$1bx-list-item>") + .replace(/[ \r\n]*/g, "") + .replace(/<\/code>[ \r\n]*<\/pre>/g, ""); + }, 0) + } + // childrenAvailableCallback() { + // let converted = marked.parse(this.innerHTML); + // this.innerHTML = converted + // .replace(/<(\/?)ul>/g, "<$1bx-unordered-list>") + // .replace(/<(\/?)li>/g, "<$1bx-list-item>") + // .replace(/[ \r\n]*/g, "") + // .replace(/<\/code>[ \r\n]*<\/pre>/g, ""); + // } + } +); + +customElements.define( + "code-snippet", + class extends HTMLBaseElement { + childrenAvailableCallback() { + let oldCode = this.innerHTML; + this.innerHTML = ""; + // const shadowRoot = this.attachShadow({mode: 'open'}); + const shadowRoot = this; + let snip = document.createElement("bx-code-snippet"); + snip.setAttribute("type", "multi"); + snip.setAttribute("color-scheme", "light"); + snip.innerHTML = oldCode.replace(/ { + let groupMsg = typeof RULE_MESSAGES !== "undefined" && (RULE_MESSAGES["en-US"].group || RULE_MESSAGES["en-US"][0]) || ""; + groupMsg = groupMsg.replace(/&/g, "&").replace(//g, ">"); + document.querySelector("#groupLabel").innerHTML = groupMsg; + let ruleInfo; + if (window.location.search && window.location.search.length > 0) { + const searchParams = new URLSearchParams(window.location.search); + ruleInfo = JSON.parse(decodeURIComponent(searchParams.get("issue"))); + } else if (window.location.hash && window.location.hash.length > 0) { + ruleInfo = JSON.parse(decodeURIComponent(window.location.hash.substring(1))); + } + if (ruleInfo) { + if (ruleInfo.message) { + let ruleMessage = ruleInfo.message.replace(/\{(\d+)\}/g, (matchedStr, matchedNum, matchedIndex) => msgArgs[matchedNum]); + document.querySelector("#ruleMessage").innerHTML = ruleMessage.replace(/&/g, "&").replace(//g, ">") + } + setTimeout(() => { + if (ruleInfo.snippet) { + let snip = ruleInfo.snippet; + snip = snip.replace(/( [a-zA-Z-]+="[^"]*")/g, "\n $1"); + let snipElem = document.createElement("code-snippet"); + for (let line of snip.split("\n")) { + snipElem.appendChild(document.createTextNode(line+"\n")); + } + let locSnippet = document.querySelector("#locSnippet"); + locSnippet.innerHTML = `

Element location

`; + locSnippet.appendChild(snipElem); + } + }, 0); + if (ruleInfo.value) { + let value = ruleInfo.value; + const val = valueMap[value[0]][value[1]]; + let icon = ""; + if (val === "Violation") icon = ``; + if (val === "Needs review") icon = ``; + if (val === "Recommendation") icon = ``; + document.querySelector("#locLevel").innerHTML = `
${icon} ${val}
`; + } + if (RULE_ID) { + document.querySelector("#ruleInfo").innerHTML = `

Rule ID: ${RULE_ID}${ruleInfo.reasonId ? `
Reason ID: ${ruleInfo.reasonId}

` : ""}`; + } + } +}) + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Accesskey_NeedLabel.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Accesskey_NeedLabel.html new file mode 100644 index 000000000..8f5cce0f0 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Accesskey_NeedLabel.html @@ -0,0 +1,90 @@ + + + HAAC_Accesskey_NeedLabel - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_ActiveDescendantCheck.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_ActiveDescendantCheck.html new file mode 100644 index 000000000..ac923edaf --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_ActiveDescendantCheck.html @@ -0,0 +1,101 @@ + + + HAAC_ActiveDescendantCheck - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Application_Role_Text.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Application_Role_Text.html new file mode 100644 index 000000000..71a6190a3 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Application_Role_Text.html @@ -0,0 +1,91 @@ + + + HAAC_Application_Role_Text - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Aria_ErrorMessage.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Aria_ErrorMessage.html new file mode 100644 index 000000000..ccbba4b76 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Aria_ErrorMessage.html @@ -0,0 +1,104 @@ + + + HAAC_Aria_ErrorMessage - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Aria_ImgAlt.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Aria_ImgAlt.html new file mode 100644 index 000000000..64c512702 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Aria_ImgAlt.html @@ -0,0 +1,97 @@ + + + HAAC_Aria_ImgAlt - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Aria_Or_HTML5_Attr.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Aria_Or_HTML5_Attr.html new file mode 100644 index 000000000..0bc75c714 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Aria_Or_HTML5_Attr.html @@ -0,0 +1,99 @@ + + + HAAC_Aria_Or_HTML5_Attr - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Aria_SvgAlt.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Aria_SvgAlt.html new file mode 100644 index 000000000..7e8d36734 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Aria_SvgAlt.html @@ -0,0 +1,96 @@ + + + HAAC_Aria_SvgAlt - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Audio_Video_Trigger.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Audio_Video_Trigger.html new file mode 100644 index 000000000..a22115763 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Audio_Video_Trigger.html @@ -0,0 +1,100 @@ + + + HAAC_Audio_Video_Trigger - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_BackgroundImg_HasTextOrTitle.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_BackgroundImg_HasTextOrTitle.html new file mode 100644 index 000000000..41cbb2691 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_BackgroundImg_HasTextOrTitle.html @@ -0,0 +1,88 @@ + + + HAAC_BackgroundImg_HasTextOrTitle - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Canvas.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Canvas.html new file mode 100644 index 000000000..e933f04fb --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Canvas.html @@ -0,0 +1,111 @@ + + + HAAC_Canvas - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Figure_label.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Figure_label.html new file mode 100644 index 000000000..9c64a0e8c --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Figure_label.html @@ -0,0 +1,101 @@ + + + HAAC_Figure_label - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Img_UsemapAlt.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Img_UsemapAlt.html new file mode 100644 index 000000000..d2fcbce8e --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Img_UsemapAlt.html @@ -0,0 +1,99 @@ + + + HAAC_Img_UsemapAlt - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Input_Placeholder.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Input_Placeholder.html new file mode 100644 index 000000000..967e52d42 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Input_Placeholder.html @@ -0,0 +1,108 @@ + + + HAAC_Input_Placeholder - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_List_Group_ListItem.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_List_Group_ListItem.html new file mode 100644 index 000000000..93411a89b --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_List_Group_ListItem.html @@ -0,0 +1,109 @@ + + + HAAC_List_Group_ListItem - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Media_DocumentTrigger2.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Media_DocumentTrigger2.html new file mode 100644 index 000000000..25f928dcd --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Media_DocumentTrigger2.html @@ -0,0 +1,88 @@ + + + HAAC_Media_DocumentTrigger2 - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Video_HasNoTrack.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Video_HasNoTrack.html new file mode 100644 index 000000000..53977dfba --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/HAAC_Video_HasNoTrack.html @@ -0,0 +1,96 @@ + + + HAAC_Video_HasNoTrack - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/IBMA_Color_Contrast_WCAG2AA.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/IBMA_Color_Contrast_WCAG2AA.html new file mode 100644 index 000000000..eaae2550f --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/IBMA_Color_Contrast_WCAG2AA.html @@ -0,0 +1,90 @@ + + + IBMA_Color_Contrast_WCAG2AA - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html new file mode 100644 index 000000000..c24744433 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html @@ -0,0 +1,93 @@ + + + IBMA_Color_Contrast_WCAG2AA_PV - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/IBMA_Focus_MultiTab.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/IBMA_Focus_MultiTab.html new file mode 100644 index 000000000..213e28d7e --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/IBMA_Focus_MultiTab.html @@ -0,0 +1,88 @@ + + + IBMA_Focus_MultiTab - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/IBMA_Focus_Tabbable.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/IBMA_Focus_Tabbable.html new file mode 100644 index 000000000..dd1d66df6 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/IBMA_Focus_Tabbable.html @@ -0,0 +1,89 @@ + + + IBMA_Focus_Tabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Blink_CSSTrigger1.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Blink_CSSTrigger1.html new file mode 100644 index 000000000..1d6660cc0 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Blink_CSSTrigger1.html @@ -0,0 +1,92 @@ + + + RPT_Blink_CSSTrigger1 - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Block_ShouldBeHeading.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Block_ShouldBeHeading.html new file mode 100644 index 000000000..54c99a2fd --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Block_ShouldBeHeading.html @@ -0,0 +1,89 @@ + + + RPT_Block_ShouldBeHeading - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Blockquote_HasCite.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Blockquote_HasCite.html new file mode 100644 index 000000000..3b1fefaa2 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Blockquote_HasCite.html @@ -0,0 +1,88 @@ + + + RPT_Blockquote_HasCite - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Blockquote_WrapsTextQuote.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Blockquote_WrapsTextQuote.html new file mode 100644 index 000000000..0c3bf5164 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Blockquote_WrapsTextQuote.html @@ -0,0 +1,102 @@ + + + RPT_Blockquote_WrapsTextQuote - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Elem_EventMouseAndKey.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Elem_EventMouseAndKey.html new file mode 100644 index 000000000..852cb8453 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Elem_EventMouseAndKey.html @@ -0,0 +1,98 @@ + + + RPT_Elem_EventMouseAndKey - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Elem_UniqueId.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Elem_UniqueId.html new file mode 100644 index 000000000..aaa34fb58 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Elem_UniqueId.html @@ -0,0 +1,98 @@ + + + RPT_Elem_UniqueId - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Embed_AutoStart.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Embed_AutoStart.html new file mode 100644 index 000000000..91796a755 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Embed_AutoStart.html @@ -0,0 +1,88 @@ + + + RPT_Embed_AutoStart - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Embed_HasAlt.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Embed_HasAlt.html new file mode 100644 index 000000000..cbf845d71 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Embed_HasAlt.html @@ -0,0 +1,94 @@ + + + RPT_Embed_HasAlt - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Font_ColorInForm.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Font_ColorInForm.html new file mode 100644 index 000000000..606b70167 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Font_ColorInForm.html @@ -0,0 +1,89 @@ + + + RPT_Font_ColorInForm - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Form_ChangeEmpty.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Form_ChangeEmpty.html new file mode 100644 index 000000000..83a8ce51a --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Form_ChangeEmpty.html @@ -0,0 +1,91 @@ + + + RPT_Form_ChangeEmpty - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Header_HasContent.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Header_HasContent.html new file mode 100644 index 000000000..695a99978 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Header_HasContent.html @@ -0,0 +1,87 @@ + + + RPT_Header_HasContent - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Headers_FewWords.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Headers_FewWords.html new file mode 100644 index 000000000..8adc66dc6 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Headers_FewWords.html @@ -0,0 +1,90 @@ + + + RPT_Headers_FewWords - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Html_SkipNav.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Html_SkipNav.html new file mode 100644 index 000000000..222743f2e --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Html_SkipNav.html @@ -0,0 +1,90 @@ + + + RPT_Html_SkipNav - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Img_AltCommonMisuse.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Img_AltCommonMisuse.html new file mode 100644 index 000000000..61a6edf40 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Img_AltCommonMisuse.html @@ -0,0 +1,90 @@ + + + RPT_Img_AltCommonMisuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Img_LongDescription2.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Img_LongDescription2.html new file mode 100644 index 000000000..f219106e4 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Img_LongDescription2.html @@ -0,0 +1,96 @@ + + + RPT_Img_LongDescription2 - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Img_UsemapValid.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Img_UsemapValid.html new file mode 100644 index 000000000..c5389d309 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Img_UsemapValid.html @@ -0,0 +1,85 @@ + + + RPT_Img_UsemapValid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Label_UniqueFor.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Label_UniqueFor.html new file mode 100644 index 000000000..a1bf5e29a --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Label_UniqueFor.html @@ -0,0 +1,88 @@ + + + RPT_Label_UniqueFor - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_List_Misuse.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_List_Misuse.html new file mode 100644 index 000000000..5db1e9292 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_List_Misuse.html @@ -0,0 +1,88 @@ + + + RPT_List_Misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_List_UseMarkup.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_List_UseMarkup.html new file mode 100644 index 000000000..89f38a2d4 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_List_UseMarkup.html @@ -0,0 +1,89 @@ + + + RPT_List_UseMarkup - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Marquee_Trigger.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Marquee_Trigger.html new file mode 100644 index 000000000..b49eceeb5 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Marquee_Trigger.html @@ -0,0 +1,89 @@ + + + RPT_Marquee_Trigger - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Media_AltBrief.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Media_AltBrief.html new file mode 100644 index 000000000..deb34845a --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Media_AltBrief.html @@ -0,0 +1,100 @@ + + + RPT_Media_AltBrief - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Media_AudioTrigger.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Media_AudioTrigger.html new file mode 100644 index 000000000..f15cf61b6 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Media_AudioTrigger.html @@ -0,0 +1,94 @@ + + + RPT_Media_AudioTrigger - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Media_AudioVideoAltFilename.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Media_AudioVideoAltFilename.html new file mode 100644 index 000000000..3646d5f32 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Media_AudioVideoAltFilename.html @@ -0,0 +1,88 @@ + + + RPT_Media_AudioVideoAltFilename - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Media_VideoObjectTrigger.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Media_VideoObjectTrigger.html new file mode 100644 index 000000000..624d63ff9 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Media_VideoObjectTrigger.html @@ -0,0 +1,90 @@ + + + RPT_Media_VideoObjectTrigger - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Media_VideoReferenceTrigger.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Media_VideoReferenceTrigger.html new file mode 100644 index 000000000..2562ebd28 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Media_VideoReferenceTrigger.html @@ -0,0 +1,86 @@ + + + RPT_Media_VideoReferenceTrigger - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Meta_Refresh.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Meta_Refresh.html new file mode 100644 index 000000000..803e01305 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Meta_Refresh.html @@ -0,0 +1,93 @@ + + + RPT_Meta_Refresh - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Pre_ASCIIArt.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Pre_ASCIIArt.html new file mode 100644 index 000000000..7b758d5e1 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Pre_ASCIIArt.html @@ -0,0 +1,88 @@ + + + RPT_Pre_ASCIIArt - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Script_OnclickHTML1.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Script_OnclickHTML1.html new file mode 100644 index 000000000..89dc66393 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Script_OnclickHTML1.html @@ -0,0 +1,89 @@ + + + RPT_Script_OnclickHTML1 - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Script_OnclickHTML2.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Script_OnclickHTML2.html new file mode 100644 index 000000000..ddf32ae61 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Script_OnclickHTML2.html @@ -0,0 +1,88 @@ + + + RPT_Script_OnclickHTML2 - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Style_BackgroundImage.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Style_BackgroundImage.html new file mode 100644 index 000000000..80e8dbc61 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Style_BackgroundImage.html @@ -0,0 +1,90 @@ + + + RPT_Style_BackgroundImage - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Style_ColorSemantics1.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Style_ColorSemantics1.html new file mode 100644 index 000000000..6b8516cf3 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Style_ColorSemantics1.html @@ -0,0 +1,88 @@ + + + RPT_Style_ColorSemantics1 - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Style_HinderFocus1.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Style_HinderFocus1.html new file mode 100644 index 000000000..73e1d9a4f --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Style_HinderFocus1.html @@ -0,0 +1,93 @@ + + + RPT_Style_HinderFocus1 - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Style_Trigger2.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Style_Trigger2.html new file mode 100644 index 000000000..e52d64636 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Style_Trigger2.html @@ -0,0 +1,93 @@ + + + RPT_Style_Trigger2 - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Table_DataHeadingsAria.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Table_DataHeadingsAria.html new file mode 100644 index 000000000..d7a29348b --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Table_DataHeadingsAria.html @@ -0,0 +1,92 @@ + + + RPT_Table_DataHeadingsAria - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Table_LayoutTrigger.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Table_LayoutTrigger.html new file mode 100644 index 000000000..421460430 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Table_LayoutTrigger.html @@ -0,0 +1,89 @@ + + + RPT_Table_LayoutTrigger - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Text_SensoryReference.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Text_SensoryReference.html new file mode 100644 index 000000000..ff34f0e50 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Text_SensoryReference.html @@ -0,0 +1,90 @@ + + + RPT_Text_SensoryReference - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Title_Valid.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Title_Valid.html new file mode 100644 index 000000000..58559c57a --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/RPT_Title_Valid.html @@ -0,0 +1,97 @@ + + + RPT_Title_Valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ApplicationLandmarkLabel.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ApplicationLandmarkLabel.html new file mode 100644 index 000000000..3648d6358 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ApplicationLandmarkLabel.html @@ -0,0 +1,97 @@ + + + Rpt_Aria_ApplicationLandmarkLabel - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html new file mode 100644 index 000000000..eb23b3c85 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html @@ -0,0 +1,91 @@ + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ComplementaryLandmarkLabel_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ComplementaryLandmarkLabel_Implicit.html new file mode 100644 index 000000000..7130b3838 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ComplementaryLandmarkLabel_Implicit.html @@ -0,0 +1,96 @@ + + + Rpt_Aria_ComplementaryLandmarkLabel_Implicit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ComplementaryRequiredLabel_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ComplementaryRequiredLabel_Implicit.html new file mode 100644 index 000000000..b98c08d6b --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ComplementaryRequiredLabel_Implicit.html @@ -0,0 +1,97 @@ + + + Rpt_Aria_ComplementaryRequiredLabel_Implicit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ContentinfoWithNoMain_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ContentinfoWithNoMain_Implicit.html new file mode 100644 index 000000000..456a811c6 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ContentinfoWithNoMain_Implicit.html @@ -0,0 +1,100 @@ + + + Rpt_Aria_ContentinfoWithNoMain_Implicit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_EmptyPropertyValue.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_EmptyPropertyValue.html new file mode 100644 index 000000000..8ee7222ea --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_EmptyPropertyValue.html @@ -0,0 +1,92 @@ + + + Rpt_Aria_EmptyPropertyValue - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics.html new file mode 100644 index 000000000..57aaa2cc0 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics.html @@ -0,0 +1,89 @@ + + + Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html new file mode 100644 index 000000000..383ed7f91 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html @@ -0,0 +1,103 @@ + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_InvalidTabindexForActivedescendant.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_InvalidTabindexForActivedescendant.html new file mode 100644 index 000000000..c593fed76 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_InvalidTabindexForActivedescendant.html @@ -0,0 +1,98 @@ + + + Rpt_Aria_InvalidTabindexForActivedescendant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MissingFocusableChild.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MissingFocusableChild.html new file mode 100644 index 000000000..b820a0996 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MissingFocusableChild.html @@ -0,0 +1,95 @@ + + + Rpt_Aria_MissingFocusableChild - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MissingKeyboardHandler.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MissingKeyboardHandler.html new file mode 100644 index 000000000..2088ba0f9 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MissingKeyboardHandler.html @@ -0,0 +1,101 @@ + + + Rpt_Aria_MissingKeyboardHandler - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleApplicationLandmarks.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleApplicationLandmarks.html new file mode 100644 index 000000000..589fca03a --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleApplicationLandmarks.html @@ -0,0 +1,101 @@ + + + Rpt_Aria_MultipleApplicationLandmarks - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleArticleRoles_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleArticleRoles_Implicit.html new file mode 100644 index 000000000..046ffe506 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleArticleRoles_Implicit.html @@ -0,0 +1,101 @@ + + + Rpt_Aria_MultipleArticleRoles_Implicit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleBannerLandmarks_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleBannerLandmarks_Implicit.html new file mode 100644 index 000000000..120384981 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleBannerLandmarks_Implicit.html @@ -0,0 +1,101 @@ + + + Rpt_Aria_MultipleBannerLandmarks_Implicit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleComplementaryLandmarks_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleComplementaryLandmarks_Implicit.html new file mode 100644 index 000000000..9e3a16dcf --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleComplementaryLandmarks_Implicit.html @@ -0,0 +1,101 @@ + + + Rpt_Aria_MultipleComplementaryLandmarks_Implicit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit.html new file mode 100644 index 000000000..01cd5667f --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit.html @@ -0,0 +1,96 @@ + + + Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleContentinfoLandmarks_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleContentinfoLandmarks_Implicit.html new file mode 100644 index 000000000..c014e8fe8 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleContentinfoLandmarks_Implicit.html @@ -0,0 +1,99 @@ + + + Rpt_Aria_MultipleContentinfoLandmarks_Implicit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleDocumentRoles.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleDocumentRoles.html new file mode 100644 index 000000000..6cbc9504c --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleDocumentRoles.html @@ -0,0 +1,88 @@ + + + Rpt_Aria_MultipleDocumentRoles - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleFormLandmarks_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleFormLandmarks_Implicit.html new file mode 100644 index 000000000..7c7c09c75 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleFormLandmarks_Implicit.html @@ -0,0 +1,109 @@ + + + Rpt_Aria_MultipleFormLandmarks_Implicit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleMainsRequireLabel_Implicit_2.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleMainsRequireLabel_Implicit_2.html new file mode 100644 index 000000000..639f025af --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleMainsRequireLabel_Implicit_2.html @@ -0,0 +1,105 @@ + + + Rpt_Aria_MultipleMainsRequireLabel_Implicit_2 - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleMainsVisibleLabel_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleMainsVisibleLabel_Implicit.html new file mode 100644 index 000000000..fed3975b6 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleMainsVisibleLabel_Implicit.html @@ -0,0 +1,100 @@ + + + Rpt_Aria_MultipleMainsVisibleLabel_Implicit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleNavigationLandmarks_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleNavigationLandmarks_Implicit.html new file mode 100644 index 000000000..923f04f56 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleNavigationLandmarks_Implicit.html @@ -0,0 +1,103 @@ + + + Rpt_Aria_MultipleNavigationLandmarks_Implicit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleRegionsUniqueLabel_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleRegionsUniqueLabel_Implicit.html new file mode 100644 index 000000000..af12c210a --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleRegionsUniqueLabel_Implicit.html @@ -0,0 +1,100 @@ + + + Rpt_Aria_MultipleRegionsUniqueLabel_Implicit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleSearchLandmarks.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleSearchLandmarks.html new file mode 100644 index 000000000..4b315fae9 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleSearchLandmarks.html @@ -0,0 +1,98 @@ + + + Rpt_Aria_MultipleSearchLandmarks - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleToolbarUniqueLabel.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleToolbarUniqueLabel.html new file mode 100644 index 000000000..9d5d02098 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_MultipleToolbarUniqueLabel.html @@ -0,0 +1,100 @@ + + + Rpt_Aria_MultipleToolbarUniqueLabel - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_OneBannerInSiblingSet_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_OneBannerInSiblingSet_Implicit.html new file mode 100644 index 000000000..fd3aef2f8 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_OneBannerInSiblingSet_Implicit.html @@ -0,0 +1,96 @@ + + + Rpt_Aria_OneBannerInSiblingSet_Implicit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_OrphanedContent_Native_Host_Sematics.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_OrphanedContent_Native_Host_Sematics.html new file mode 100644 index 000000000..36b64ebe1 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_OrphanedContent_Native_Host_Sematics.html @@ -0,0 +1,90 @@ + + + Rpt_Aria_OrphanedContent_Native_Host_Sematics - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_RegionLabel_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_RegionLabel_Implicit.html new file mode 100644 index 000000000..f09ee2eb4 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_RegionLabel_Implicit.html @@ -0,0 +1,96 @@ + + + Rpt_Aria_RegionLabel_Implicit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_RequiredChildren_Native_Host_Sematics.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_RequiredChildren_Native_Host_Sematics.html new file mode 100644 index 000000000..cf025d000 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_RequiredChildren_Native_Host_Sematics.html @@ -0,0 +1,108 @@ + + + Rpt_Aria_RequiredChildren_Native_Host_Sematics - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_RequiredParent_Native_Host_Sematics.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_RequiredParent_Native_Host_Sematics.html new file mode 100644 index 000000000..1f39674f7 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_RequiredParent_Native_Host_Sematics.html @@ -0,0 +1,94 @@ + + + Rpt_Aria_RequiredParent_Native_Host_Sematics - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_RequiredProperties.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_RequiredProperties.html new file mode 100644 index 000000000..262996d96 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_RequiredProperties.html @@ -0,0 +1,102 @@ + + + Rpt_Aria_RequiredProperties - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ValidIdRef.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ValidIdRef.html new file mode 100644 index 000000000..b8ba81d2a --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ValidIdRef.html @@ -0,0 +1,97 @@ + + + Rpt_Aria_ValidIdRef - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ValidProperty.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ValidProperty.html new file mode 100644 index 000000000..7f61d3bbf --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ValidProperty.html @@ -0,0 +1,97 @@ + + + Rpt_Aria_ValidProperty - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ValidPropertyValue.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ValidPropertyValue.html new file mode 100644 index 000000000..06a6c85ac --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ValidPropertyValue.html @@ -0,0 +1,93 @@ + + + Rpt_Aria_ValidPropertyValue - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ValidRole.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ValidRole.html new file mode 100644 index 000000000..a96a221b3 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_ValidRole.html @@ -0,0 +1,101 @@ + + + Rpt_Aria_ValidRole - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_WidgetLabels_Implicit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_WidgetLabels_Implicit.html new file mode 100644 index 000000000..91923839a --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Rpt_Aria_WidgetLabels_Implicit.html @@ -0,0 +1,98 @@ + + + Rpt_Aria_WidgetLabels_Implicit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Caption_HasContent.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Caption_HasContent.html new file mode 100644 index 000000000..c46433bcd --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Caption_HasContent.html @@ -0,0 +1,99 @@ + + + Valerie_Caption_HasContent - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Caption_InTable.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Caption_InTable.html new file mode 100644 index 000000000..c8fe31385 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Caption_InTable.html @@ -0,0 +1,94 @@ + + + Valerie_Caption_InTable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Elem_DirValid.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Elem_DirValid.html new file mode 100644 index 000000000..10942cabf --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Elem_DirValid.html @@ -0,0 +1,87 @@ + + + Valerie_Elem_DirValid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Frame_SrcHtml.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Frame_SrcHtml.html new file mode 100644 index 000000000..a70dcd19a --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Frame_SrcHtml.html @@ -0,0 +1,90 @@ + + + Valerie_Frame_SrcHtml - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Label_HasContent.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Label_HasContent.html new file mode 100644 index 000000000..0d3d2f358 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Label_HasContent.html @@ -0,0 +1,88 @@ + + + Valerie_Label_HasContent - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Noembed_HasContent.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Noembed_HasContent.html new file mode 100644 index 000000000..8024bc88e --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Noembed_HasContent.html @@ -0,0 +1,98 @@ + + + Valerie_Noembed_HasContent - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Table_DataCellRelationships.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Table_DataCellRelationships.html new file mode 100644 index 000000000..2b1875a99 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/Valerie_Table_DataCellRelationships.html @@ -0,0 +1,90 @@ + + + Valerie_Table_DataCellRelationships - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_A_HasText.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_A_HasText.html new file mode 100644 index 000000000..27cb06720 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_A_HasText.html @@ -0,0 +1,105 @@ + + + WCAG20_A_HasText - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_A_TargetAndText.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_A_TargetAndText.html new file mode 100644 index 000000000..5e630ee65 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_A_TargetAndText.html @@ -0,0 +1,89 @@ + + + WCAG20_A_TargetAndText - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Applet_HasAlt.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Applet_HasAlt.html new file mode 100644 index 000000000..9337d3c23 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Applet_HasAlt.html @@ -0,0 +1,101 @@ + + + WCAG20_Applet_HasAlt - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Area_HasAlt.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Area_HasAlt.html new file mode 100644 index 000000000..49567b894 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Area_HasAlt.html @@ -0,0 +1,100 @@ + + + WCAG20_Area_HasAlt - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Blink_AlwaysTrigger.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Blink_AlwaysTrigger.html new file mode 100644 index 000000000..d1cbaf295 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Blink_AlwaysTrigger.html @@ -0,0 +1,91 @@ + + + WCAG20_Blink_AlwaysTrigger - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics.html new file mode 100644 index 000000000..1838ff312 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics.html @@ -0,0 +1,95 @@ + + + WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Body_FirstASkips_Native_Host_Sematics.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Body_FirstASkips_Native_Host_Sematics.html new file mode 100644 index 000000000..708c2b2e4 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Body_FirstASkips_Native_Host_Sematics.html @@ -0,0 +1,100 @@ + + + WCAG20_Body_FirstASkips_Native_Host_Sematics - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Doc_HasTitle.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Doc_HasTitle.html new file mode 100644 index 000000000..fd7eb4903 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Doc_HasTitle.html @@ -0,0 +1,99 @@ + + + WCAG20_Doc_HasTitle - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Elem_Lang_Valid.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Elem_Lang_Valid.html new file mode 100644 index 000000000..71c78f3a1 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Elem_Lang_Valid.html @@ -0,0 +1,100 @@ + + + WCAG20_Elem_Lang_Valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Elem_UniqueAccessKey.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Elem_UniqueAccessKey.html new file mode 100644 index 000000000..2f9d1c83a --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Elem_UniqueAccessKey.html @@ -0,0 +1,94 @@ + + + WCAG20_Elem_UniqueAccessKey - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Embed_HasNoEmbed.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Embed_HasNoEmbed.html new file mode 100644 index 000000000..f26aaf01d --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Embed_HasNoEmbed.html @@ -0,0 +1,101 @@ + + + WCAG20_Embed_HasNoEmbed - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Fieldset_HasLegend.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Fieldset_HasLegend.html new file mode 100644 index 000000000..07d33e203 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Fieldset_HasLegend.html @@ -0,0 +1,98 @@ + + + WCAG20_Fieldset_HasLegend - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Form_HasSubmit.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Form_HasSubmit.html new file mode 100644 index 000000000..faea56e10 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Form_HasSubmit.html @@ -0,0 +1,90 @@ + + + WCAG20_Form_HasSubmit - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Form_TargetAndText.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Form_TargetAndText.html new file mode 100644 index 000000000..2ab292021 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Form_TargetAndText.html @@ -0,0 +1,90 @@ + + + WCAG20_Form_TargetAndText - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Frame_HasTitle.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Frame_HasTitle.html new file mode 100644 index 000000000..2f0980712 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Frame_HasTitle.html @@ -0,0 +1,96 @@ + + + WCAG20_Frame_HasTitle - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Html_HasLang.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Html_HasLang.html new file mode 100644 index 000000000..7566da5ce --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Html_HasLang.html @@ -0,0 +1,89 @@ + + + WCAG20_Html_HasLang - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Img_HasAlt.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Img_HasAlt.html new file mode 100644 index 000000000..63a9a46e0 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Img_HasAlt.html @@ -0,0 +1,90 @@ + + + WCAG20_Img_HasAlt - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Img_LinkTextNotRedundant.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Img_LinkTextNotRedundant.html new file mode 100644 index 000000000..f9a431011 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Img_LinkTextNotRedundant.html @@ -0,0 +1,92 @@ + + + WCAG20_Img_LinkTextNotRedundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Img_PresentationImgHasNonNullAlt.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Img_PresentationImgHasNonNullAlt.html new file mode 100644 index 000000000..8b171bea3 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Img_PresentationImgHasNonNullAlt.html @@ -0,0 +1,91 @@ + + + WCAG20_Img_PresentationImgHasNonNullAlt - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Img_TitleEmptyWhenAltNull.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Img_TitleEmptyWhenAltNull.html new file mode 100644 index 000000000..564019333 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Img_TitleEmptyWhenAltNull.html @@ -0,0 +1,92 @@ + + + WCAG20_Img_TitleEmptyWhenAltNull - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_ExplicitLabel.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_ExplicitLabel.html new file mode 100644 index 000000000..fec84f391 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_ExplicitLabel.html @@ -0,0 +1,92 @@ + + + WCAG20_Input_ExplicitLabel - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_ExplicitLabelImage.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_ExplicitLabelImage.html new file mode 100644 index 000000000..194123fcb --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_ExplicitLabelImage.html @@ -0,0 +1,83 @@ + + + WCAG20_Input_ExplicitLabelImage - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_HasOnchange.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_HasOnchange.html new file mode 100644 index 000000000..fe8546583 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_HasOnchange.html @@ -0,0 +1,91 @@ + + + WCAG20_Input_HasOnchange - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_InFieldSet.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_InFieldSet.html new file mode 100644 index 000000000..daebc8b31 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_InFieldSet.html @@ -0,0 +1,102 @@ + + + WCAG20_Input_InFieldSet - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_LabelAfter.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_LabelAfter.html new file mode 100644 index 000000000..831694851 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_LabelAfter.html @@ -0,0 +1,95 @@ + + + WCAG20_Input_LabelAfter - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_LabelBefore.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_LabelBefore.html new file mode 100644 index 000000000..f062e03bb --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_LabelBefore.html @@ -0,0 +1,93 @@ + + + WCAG20_Input_LabelBefore - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_RadioChkInFieldSet.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_RadioChkInFieldSet.html new file mode 100644 index 000000000..97b46a090 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_RadioChkInFieldSet.html @@ -0,0 +1,89 @@ + + + WCAG20_Input_RadioChkInFieldSet - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_VisibleLabel.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_VisibleLabel.html new file mode 100644 index 000000000..ca83557f5 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Input_VisibleLabel.html @@ -0,0 +1,97 @@ + + + WCAG20_Input_VisibleLabel - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Label_RefValid.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Label_RefValid.html new file mode 100644 index 000000000..af567d84f --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Label_RefValid.html @@ -0,0 +1,94 @@ + + + WCAG20_Label_RefValid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Meta_RedirectZero.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Meta_RedirectZero.html new file mode 100644 index 000000000..ced16bf4c --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Meta_RedirectZero.html @@ -0,0 +1,92 @@ + + + WCAG20_Meta_RedirectZero - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Object_HasText.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Object_HasText.html new file mode 100644 index 000000000..78c0a821a --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Object_HasText.html @@ -0,0 +1,97 @@ + + + WCAG20_Object_HasText - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Script_FocusBlurs.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Script_FocusBlurs.html new file mode 100644 index 000000000..344248756 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Script_FocusBlurs.html @@ -0,0 +1,91 @@ + + + WCAG20_Script_FocusBlurs - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Select_HasOptGroup.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Select_HasOptGroup.html new file mode 100644 index 000000000..67028b005 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Select_HasOptGroup.html @@ -0,0 +1,87 @@ + + + WCAG20_Select_HasOptGroup - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Select_NoChangeAction.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Select_NoChangeAction.html new file mode 100644 index 000000000..16e30190c --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Select_NoChangeAction.html @@ -0,0 +1,91 @@ + + + WCAG20_Select_NoChangeAction - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Style_BeforeAfter.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Style_BeforeAfter.html new file mode 100644 index 000000000..15608e1ca --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Style_BeforeAfter.html @@ -0,0 +1,92 @@ + + + WCAG20_Style_BeforeAfter - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Table_CapSummRedundant.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Table_CapSummRedundant.html new file mode 100644 index 000000000..fe53042e0 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Table_CapSummRedundant.html @@ -0,0 +1,100 @@ + + + WCAG20_Table_CapSummRedundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Table_Scope_Valid.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Table_Scope_Valid.html new file mode 100644 index 000000000..4bbfa3726 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Table_Scope_Valid.html @@ -0,0 +1,92 @@ + + + WCAG20_Table_Scope_Valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Table_Structure.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Table_Structure.html new file mode 100644 index 000000000..49f68764f --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Table_Structure.html @@ -0,0 +1,89 @@ + + + WCAG20_Table_Structure - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Text_Emoticons.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Text_Emoticons.html new file mode 100644 index 000000000..5c9c2618a --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Text_Emoticons.html @@ -0,0 +1,88 @@ + + + WCAG20_Text_Emoticons - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Text_LetterSpacing.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Text_LetterSpacing.html new file mode 100644 index 000000000..72af2da0b --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG20_Text_LetterSpacing.html @@ -0,0 +1,89 @@ + + + WCAG20_Text_LetterSpacing - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG21_Input_Autocomplete.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG21_Input_Autocomplete.html new file mode 100644 index 000000000..650e361be --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG21_Input_Autocomplete.html @@ -0,0 +1,117 @@ + + + WCAG21_Input_Autocomplete - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG21_Label_Accessible.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG21_Label_Accessible.html new file mode 100644 index 000000000..81bf31b0d --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG21_Label_Accessible.html @@ -0,0 +1,94 @@ + + + WCAG21_Label_Accessible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG21_Style_Viewport.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG21_Style_Viewport.html new file mode 100644 index 000000000..59c783bf6 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/WCAG21_Style_Viewport.html @@ -0,0 +1,87 @@ + + + WCAG21_Style_Viewport - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/aria_hidden_focus_misuse.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/aria_hidden_focus_misuse.html new file mode 100644 index 000000000..a151beb0c --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/aria_hidden_focus_misuse.html @@ -0,0 +1,112 @@ + + + aria_hidden_focus_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/aria_semantics_attribute.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/aria_semantics_attribute.html new file mode 100644 index 000000000..d9ba7ca3b --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/aria_semantics_attribute.html @@ -0,0 +1,89 @@ + + + aria_semantics_attribute - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/aria_semantics_role.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/aria_semantics_role.html new file mode 100644 index 000000000..15e32556c --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/aria_semantics_role.html @@ -0,0 +1,89 @@ + + + aria_semantics_role - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_active_descendant.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_active_descendant.html new file mode 100644 index 000000000..756d1d605 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_active_descendant.html @@ -0,0 +1,106 @@ + + + combobox_active_descendant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_autocomplete.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_autocomplete.html new file mode 100644 index 000000000..aed0a561f --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_autocomplete.html @@ -0,0 +1,121 @@ + + + combobox_autocomplete - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_focusable_elements.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_focusable_elements.html new file mode 100644 index 000000000..856c617af --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_focusable_elements.html @@ -0,0 +1,90 @@ + + + combobox_focusable_elements - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_haspopup.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_haspopup.html new file mode 100644 index 000000000..54283f2c6 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_haspopup.html @@ -0,0 +1,105 @@ + + + combobox_haspopup - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_popup_reference.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_popup_reference.html new file mode 100644 index 000000000..b5ffe4537 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_popup_reference.html @@ -0,0 +1,111 @@ + + + combobox_popup_reference - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_version.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_version.html new file mode 100644 index 000000000..cbd4f52b7 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/combobox_version.html @@ -0,0 +1,91 @@ + + + combobox_version - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/element_attribute_deprecated.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/element_attribute_deprecated.html new file mode 100644 index 000000000..452c68f84 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/element_attribute_deprecated.html @@ -0,0 +1,87 @@ + + + element_attribute_deprecated - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/group_withInputs_hasName.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/group_withInputs_hasName.html new file mode 100644 index 000000000..c2b45cf8e --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/group_withInputs_hasName.html @@ -0,0 +1,105 @@ + + + group_withInputs_hasName - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/input_haspopup_invalid.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/input_haspopup_invalid.html new file mode 100644 index 000000000..c29d42713 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/input_haspopup_invalid.html @@ -0,0 +1,102 @@ + + + input_haspopup_invalid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/landmark_name_unique.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/landmark_name_unique.html new file mode 100644 index 000000000..ed042d360 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/landmark_name_unique.html @@ -0,0 +1,108 @@ + + + landmark_name_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/meta_viewport_zoom.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/meta_viewport_zoom.html new file mode 100644 index 000000000..68b4bd955 --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/meta_viewport_zoom.html @@ -0,0 +1,100 @@ + + + meta_viewport_zoom - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/style_hover_persistent.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/style_hover_persistent.html new file mode 100644 index 000000000..955f1a57e --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/style_hover_persistent.html @@ -0,0 +1,113 @@ + + + style_hover_persistent - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/table_aria_descendants.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/table_aria_descendants.html new file mode 100644 index 000000000..6f372483e --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/table_aria_descendants.html @@ -0,0 +1,108 @@ + + + table_aria_descendants - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/doc/en-US/table_headers_ref_valid.html b/rule-server/src/static/archives/2022.03.12/doc/en-US/table_headers_ref_valid.html new file mode 100644 index 000000000..f136681de --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/doc/en-US/table_headers_ref_valid.html @@ -0,0 +1,87 @@ + + + table_headers_ref_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2022.03.12/js/ace-debug.js b/rule-server/src/static/archives/2022.03.12/js/ace-debug.js new file mode 100644 index 000000000..a1729cc0d --- /dev/null +++ b/rule-server/src/static/archives/2022.03.12/js/ace-debug.js @@ -0,0 +1,25703 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ace; +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/v2/api/IEngine.ts": +/*!*******************************!*\ + !*** ./src/v2/api/IEngine.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = exports.eRulePolicy = exports.eRuleConfidence = void 0; +var eRuleConfidence; +(function (eRuleConfidence) { + eRuleConfidence["PASS"] = "PASS"; + eRuleConfidence["FAIL"] = "FAIL"; + eRuleConfidence["POTENTIAL"] = "POTENTIAL"; + eRuleConfidence["MANUAL"] = "MANUAL"; +})(eRuleConfidence = exports.eRuleConfidence || (exports.eRuleConfidence = {})); +var eRulePolicy; +(function (eRulePolicy) { + eRulePolicy["VIOLATION"] = "VIOLATION"; + eRulePolicy["RECOMMENDATION"] = "RECOMMENDATION"; + eRulePolicy["INFORMATION"] = "INFORMATION"; +})(eRulePolicy = exports.eRulePolicy || (exports.eRulePolicy = {})); +var eToolkitLevel; +(function (eToolkitLevel) { + eToolkitLevel["LEVEL_ONE"] = "1"; + eToolkitLevel["LEVEL_TWO"] = "2"; + eToolkitLevel["LEVEL_THREE"] = "3"; + eToolkitLevel["LEVEL_FOUR"] = "4"; +})(eToolkitLevel = exports.eToolkitLevel || (exports.eToolkitLevel = {})); +var eRuleCategory; +(function (eRuleCategory) { + eRuleCategory["ACCESSIBILITY"] = "Accessibility"; + eRuleCategory["DESIGN"] = "Design"; + eRuleCategory["OTHER"] = "Other"; +})(eRuleCategory = exports.eRuleCategory || (exports.eRuleCategory = {})); +var eRulesetType; +(function (eRulesetType) { + eRulesetType["DEFAULT"] = "default"; + eRulesetType["EXTENSION"] = "extension"; +})(eRulesetType = exports.eRulesetType || (exports.eRulesetType = {})); +function RulePass(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePass = RulePass; +function RuleRender(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: 0, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleRender = RuleRender; +function RuleFail(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.FAIL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleFail = RuleFail; +function RulePotential(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.POTENTIAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePotential = RulePotential; +function RuleManual(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.MANUAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleManual = RuleManual; + + +/***/ }), + +/***/ "./src/v2/aria/ARIADefinitions.ts": +/*!****************************************!*\ + !*** ./src/v2/aria/ARIADefinitions.ts ***! + \****************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIADefinitions = void 0; +var ARIADefinitions = /** @class */ (function () { + function ARIADefinitions() { + } + ARIADefinitions.nameFromContent = function (role) { + return (role in ARIADefinitions.designPatterns) + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents"); + }; + /* + * array of WAI-ARIA global states and properties + * @see https://www.w3.org/TR/wai-aria-1.2/#global_states + */ + ARIADefinitions.globalProperties = ["aria-atomic", "aria-busy", "aria-controls", "aria-current", "aria-describedby", + "aria-details", "aria-dropeffect", "aria-flowto", "aria-grabbed", "aria-hidden", "aria-keyshortcuts", + "aria-label", "aria-labelledby", "aria-live", "aria-owns", "aria-relevant", "aria-roledescription"]; + /* + * XSD data types for all WAI-ARIA properties + * along with valid values when the data type is NMTOKEN + * WAI-ARIA properties data types explaned: + * type: Used to identify the type of values allowed for the WAI-ARIA property + * values: Used to identify specific values of an WAI-ARIA property when type is nmtoken + * hiddenIDRefSupported: Used to identify if the WAI-ARIA property supports referencing hidden ID + * true: refers to WAI-ARIA property supports hidden ID references + * false: refers to WAI-ARIA property does not support hidden ID references + * Default value will be set to false, if not specified. + */ + ARIADefinitions.propertyDataTypes = { + "aria-activedescendant": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-atomic": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-autocomplete": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["inline", "list", "both", "none", "undefined"] //add undefined to handle value empty + }, + "aria-busy": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-checked": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-colcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-controls": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-current": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["page", "step", "location", "date", "time", "true", "false", "undefined"] //add undefined for empty value + }, + "aria-describedby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-details": { + type: "http://www.w3.org/2001/XMLSchema#idrefs" + }, + "aria-disabled": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-dropeffect": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["copy", "move", "link", "execute", "popup", "none"] + }, + "aria-errormessage": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-expanded": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-flowto": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: false + }, + "aria-grabbed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-haspopup": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "menu", "listbox", "tree", "grid", "dialog"] + }, + "aria-hidden": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-invalid": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "spelling", "grammar", "undefined"] //add undefined for empty value + }, + "aria-keyshortcuts": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-label": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-labelledby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-level": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-live": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["off", "polite", "assertive"] + }, + "aria-modal": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiline": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiselectable": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-orientation": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["horizontal", "vertical", "undefined"] + }, + "aria-owns": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-placeholder": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-posinset": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-pressed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-readonly": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-relevant": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["additions", "removals", "text", "all"] + }, + "aria-required": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-roledescription": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-rowcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-selected": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-setsize": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-sort": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["ascending", "descending", "other", "none"] + }, + "aria-valuemax": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuemin": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuenow": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuetext": { + type: "http://www.w3.org/2001/XMLSchema#string" + } + }; + /* + * design patterns for concrete WAI-ARIA roles + * legitimate keys for each role include: + * + * - container: appropriate container(s) for that role + * - props: states and properties that may be associated with this role (in addition to the global states and properties listed above) + * - reqProps: required states or properties for this role + * - reqChildren: required children for this role + * - htmlEquiv: HTML equivalent for this role + * - roleType: one of widget, structure, landmark, liveRegion, window (as seen in https://www.w3.org/TR/wai-aria-1.2/#roles_categorization) + * - nameRequired: determines whether an accessible name is required for a widget (see ARIA spec.) + * - nameFrom: determines how an accessible name is supplied (author or content - see ARIA spec.) + * - deprecated: if present, indicates that the role is deprecated, and provides a list of alternative role(s) + */ + ARIADefinitions.designPatterns = { + "alert": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"] + }, + "alertdialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: true, + nameFrom: ["author"] + }, + "application": { + container: null, + props: ["aria-activedescendant", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "article": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"] + }, + "banner": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"] + }, + "blockquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"] + }, + "button": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup", "aria-pressed"], + reqProps: null, + reqChildren: null, + htmlEquiv: "button | input[@type='button']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "caption": { + container: ["figure", "grid", "table", "treegrid"], + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"] + }, + "cell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-rowindex", "aria-rowspan"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "structure", + nameFrom: ["author", "contents"] + }, + "checkbox": { + container: null, + props: ["aria-disabled", "aria-errormessage", "aria-expanded", "aria-invalid", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='checkbox']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "code": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"] + }, + "columnheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='col']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "combobox": { + container: null, + props: ["aria-controls", "aria-activedescendant", "aria-autocomplete", "aria-disabled", "aria-errormessage", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required"], + reqProps: ["aria-expanded"], + reqChildren: [], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "complementary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"] + }, + "contentinfo": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"] + }, + "definition": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"] + }, + "deletion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"] + }, + "dialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: true, + nameFrom: ["author"] + }, + "directory": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecated: ["list"] // TODO + }, + "doc-abstract": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-acknowledgments": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-afterword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-appendix": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-backlink": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-biblioentry": { + container: ["directory", "list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-bibliography": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-biblioref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-chapter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-colophon": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-conclusion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-cover": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: true + }, + "doc-credit": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-credits": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-dedication": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-endnote": { + container: ["directory", "list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameFrom: ["author"] + }, + "doc-endnotes": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-epigraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-epilogue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-errata": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-example": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-footnote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-foreword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-glossary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-glossref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-index": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"] + }, + "doc-introduction": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-noteref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-notice": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"] + }, + "doc-pagebreak": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: true + }, + "doc-pagelist": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"] + }, + "doc-part": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-preface": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-prologue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-pullquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"] + }, + "doc-qna": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-subtitle": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"] + }, + "doc-tip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"] + }, + "doc-toc": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"] + }, + "document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "emphasis": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"] + }, + "feed": { + container: null, + props: null, + reqProps: null, + reqChildren: ["article"], + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"] + }, + "figure": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"] + }, + "form": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "form", + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "generic": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"] + }, + "graphics-document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"] + }, + "graphics-object": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: false, + nameFrom: ["contents", "author"] + }, + "graphics-symbol": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "grid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-disabled", "aria-multiselectable", "aria-readonly", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: "table", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "gridcell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "widget", + nameFrom: ["author", "contents"] + }, + "group": { + container: null, + props: ["aria-activedescendant", "aria-disabled"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"] + }, + "heading": { + container: null, + props: null, + reqProps: ["aria-level"], + reqChildren: null, + htmlEquiv: "h1 | h2 | h3 | h4 | h5 | h6", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "img": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "insertion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"] + }, + "link": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "list": { + container: null, + props: null, + reqProps: null, + reqChildren: ["listitem"], + htmlEquiv: "ol | ul", + roleType: "structure", + nameFrom: ["author"] + }, + "listbox": { + container: null, + props: ["aria-activedescendant", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-invalid", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["group", "option"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "listitem": { + container: ["directory", "list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameFrom: ["author"] + }, + "log": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"] + }, + "main": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"] + }, + "marquee": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: true, + nameFrom: ["author"] + }, + "math": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: false + }, + "menu": { + container: null, + props: ["aria-activedescendant", "aria-disabled", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"] + }, + "menubar": { + container: null, + props: ["aria-activedescendant", "aria-disabled", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"] + }, + "menuitem": { + container: ["group", "menu", "menubar"], + props: ["aria-disabled", "aria-expanded", "aria-haspopup", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "menuitemcheckbox": { + container: ["group", "menu", "menubar"], + props: ["aria-disabled", "aria-expanded", "aria-haspopup", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "menuitemradio": { + container: ["group", "menu", "menubar"], + props: ["aria-disabled", "aria-expanded", "aria-haspopup", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "meter": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "navigation": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"] + }, + "none": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + }, + "note": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"] + }, + "option": { + container: ["group", "listbox"], + props: ["aria-selected", "aria-checked", "aria-disabled", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "option", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "paragraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"] + }, + "presentation": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + }, + "progressbar": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "radio": { + container: null, + props: ["aria-disabled", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='radio']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "radiogroup": { + container: null, + props: ["aria-activedescendant", "aria-disabled", "aria-errormessage", "aria-invalid", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["radio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "region": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "row": { + container: ["grid", "rowgroup", "table", "treegrid"], + props: ["aria-activedescendant", "aria-colindex", "aria-disabled", "aria-expanded", "aria-level", "aria-posinset", "aria-rowindex", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: ["cell", "columnheader", "gridcell", "rowheader"], + htmlEquiv: "tr", + roleType: "structure", + nameFrom: ["author", "contents"] + }, + "rowgroup": { + container: ["grid", "table", "treegrid"], + props: [], + reqProps: null, + reqChildren: ["row"], + htmlEquiv: "tbody | tfoot | thead", + roleType: "structure", + nameFrom: ["author"] + }, + "rowheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='row']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "scrollbar": { + container: null, + props: ["aria-disabled", "aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-controls", "aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true + }, + "search": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"] + }, + "searchbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-disabled", "aria-errormessage", "aria-haspopup", "aria-invalid", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='search']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "separator": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: true + }, + "slider": { + container: null, + props: ["aria-disabled", "aria-errormessage", "aria-haspopup", "aria-invalid", "aria-orientation", "aria-readonly", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "spinbutton": { + container: null, + props: ["aria-activedescendant", "aria-disabled", "aria-errormessage", "aria-invalid", "aria-readonly", "aria-required", "aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "status": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"] + }, + "strong": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"] + }, + "subscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"] + }, + "superscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"] + }, + "switch": { + container: null, + props: ["aria-disabled", "aria-errormessage", "aria-expanded", "aria-invalid", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "tab": { + container: ["tablist"], + props: ["aria-disabled", "aria-expanded", "aria-haspopup", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "table": { + container: null, + props: ["aria-colcount", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: "table", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "tablist": { + container: null, + props: ["aria-activedescendant", "aria-disabled", "aria-multiselectable", "aria-orientation"], + reqProps: null, + reqChildren: ["tab"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"] + }, + "tabpanel": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "term": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "dfn", + roleType: "structure", + nameFrom: ["author"] + }, + "textbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-disabled", "aria-errormessage", "aria-haspopup", "aria-invalid", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='text']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "time": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"] + }, + "timer": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"] + }, + "toolbar": { + container: null, + props: ["aria-activedescendant", "aria-disabled", "aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"] + }, + "tooltip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"] + }, + "tree": { + container: null, + props: ["aria-activedescendant", "aria-disabled", "aria-errormessage", "aria-invalid", "aria-multiselectable", "aria-orientation", "aria-required"], + reqProps: null, + reqChildren: ["group", "treeitem"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "treegrid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-disabled", "aria-errormessage", "aria-invalid", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "treeitem": { + container: ["group", "tree"], + props: ["aria-checked", "aria-disabled", "aria-expanded", "aria-haspopup", "aria-level", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + }; // end designPatterns + // copied from https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements + // https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary + ARIADefinitions.elementsAllowedDisabled = ["button", "input", "select", "textarea", "optgroup", "option", "fieldset"]; // also form-associated custom element + ARIADefinitions.elementsAllowedRequired = ["input", "select", "textarea"]; // required is not supported on input@type="range", "color", "hidden" or any button types + ARIADefinitions.elementsAllowedReadOnly = ["input", "textarea"]; // readonly is not supported on input@type="checkbox", "radio", "range", "color", "file", hidden" or any button types + /* https://www.w3.org/TR/html-aria/#docconformance + * documentConformanceRequirement contains properties of the tags related to role without any additional attribute value + * documentConformanceRequirementSpecialTags contains those tags that require special considerations + */ + ARIADefinitions.documentConformanceRequirement = { + "abbr": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "address": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "article": { + implicitRole: ["article"], + validRoles: ["application", "document", "feed", "main", "none", "presentation", "region"], + globalAriaAttributesValid: true + }, + "aside": { + implicitRole: ["complementary"], + validRoles: ["doc-dedication", "doc-example", "doc-footnote", "doc-pullquote", "doc-tip", "feed", "none", "note", "presentation", "region", "search"], + globalAriaAttributesValid: true + }, + "audio": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "b": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "base": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "bdi": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "bdo": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "blockquote": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "body": { + implicitRole: ["document"], + validRoles: null, + globalAriaAttributesValid: true + }, + "br": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: true + }, + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab"], + globalAriaAttributesValid: true + }, + "canvas": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "caption": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "cite": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "code": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "col": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "colgroup": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "data": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "datalist": { + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "dd": { + implicitRole: ["definition"], + validRoles: null, + globalAriaAttributesValid: true + }, + "del": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "details": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "dfn": { + implicitRole: ["term"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "dialog": { + implicitRole: ["dialog"], + validRoles: ["alertdialog"], + globalAriaAttributesValid: true + }, + "div": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "dl": { + implicitRole: null, + validRoles: ["group", "list", "none", "presentation"], + globalAriaAttributesValid: true + }, + "dt": { + implicitRole: ["term"], + validRoles: ["listitem"], + globalAriaAttributesValid: true + }, + "em": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "embed": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "fieldset": { + implicitRole: ["group"], + validRoles: ["none", "presentation", "radiogroup"], + globalAriaAttributesValid: true + }, + "figcaption": { + implicitRole: null, + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "head": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "h1": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h2": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h3": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h4": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h5": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h6": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "hgroup": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "hr": { + implicitRole: ["separator"], + validRoles: ["doc-pagebreak", "none", "presentation"], + globalAriaAttributesValid: true + }, + "html": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "i": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "iframe": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "ins": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "kbd": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "label": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "legend": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "li": { + implicitRole: ["listitem"], + validRoles: ["doc-biblioentry", "doc-endnote", "menuitem", "menuitemcheckbox", "menuitemradio", "none", "option", "presentation", "radio", "separator", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "link": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "main": { + implicitRole: ["main"], + validRoles: null, + globalAriaAttributesValid: true + }, + "map": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "mark": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "math": { + implicitRole: ["math"], + validRoles: null, + globalAriaAttributesValid: true + }, + "menu": { + implicitRole: ["list"], + validRoles: ["directory", "group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "meta": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "meter": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "nav": { + implicitRole: ["navigation"], + validRoles: ["doc-index", "doc-pagelist", "doc-toc", "menu", "menubar", "tablist"], + globalAriaAttributesValid: true + }, + "noscript": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "object": { + implicitRole: null, + validRoles: ["application", "document", "img"], + globalAriaAttributesValid: true + }, + "ol": { + implicitRole: ["list"], + validRoles: ["directory", "group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "optgroup": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "option": { + implicitRole: ["option"], + validRoles: null, + globalAriaAttributesValid: true + }, + "output": { + implicitRole: ["status"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "p": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "param": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "picture": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "pre": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "progress": { + implicitRole: ["progressbar"], + validRoles: null, + globalAriaAttributesValid: true + }, + "q": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rp": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rt": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "ruby": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "s": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "samp": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "script": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "slot": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "small": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "source": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "span": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "strong": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "style": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "sub": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "summary": { + implicitRole: ["button"], + validRoles: null, + globalAriaAttributesValid: true + }, + "sup": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "svg": { + implicitRole: ["graphics-document"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "table": { + implicitRole: ["table"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "tbody": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "template": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "textarea": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "tfoot": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "thead": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "time": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "title": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "track": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "u": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "ul": { + implicitRole: ["list"], + validRoles: ["directory", "group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "var": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "video": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "wbr": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }; // end documentConformanceRequirement + ARIADefinitions.documentConformanceRequirementSpecialTags = { + "a": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: ["button", "checkbox", "doc-backlink", "doc-biblioref", "doc-glossref", "doc-noteref", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "without-href": { + implicitRole: null, + //roleCondition: " when href attribute is not present", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "area": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "without-href": { + implicitRole: null, + //roleCondition: " when href attribute is not present", + validRoles: null, + globalAriaAttributesValid: true + } + }, + // TODO + // "autonomous custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise no corresponding role."], + // validRoles: ["If role defined by ElementInternals", "any role", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "figure": { + "child-figcaption": { + implicitRole: ["figure"], + validRoles: null, + globalAriaAttributesValid: true + }, + "no-child-figcaption": { + implicitRole: ["figure"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "footer": { + "des-section-article": { + implicitRole: null, + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "not-des-section-article": { + implicitRole: ["contentinfo"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + "form": { + "with-name": { + implicitRole: ["form"], + //roleCondition: " when accessible name is present", + validRoles: ["none", "presentation", "search"], + globalAriaAttributesValid: true + }, + "without-name": { + implicitRole: null, + //roleCondition: " when accessible name is not present", + validRoles: ["none", "presentation", "search"], + globalAriaAttributesValid: true + } + }, + // TODO + // "form-associated custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise no corresponding role."], + // validRoles: ["If role defined by ElementInternals", "form-related roles: button", "checkbox", "combobox", "group", "listbox", "progressbar", "radio", "radiogroup", "searchbox", "slider", "spinbutton", "switch", "textbox", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "header": { + "des-section-article": { + implicitRole: null, + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "not-des-section-article": { + implicitRole: ["banner"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + "img": { + "img-with-alt-text": { + implicitRole: ["img"], + //roleCondition: " when alt attribute has text (is not empty)", + validRoles: ["button", "checkbox", "doc-cover", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "progressbar", "scrollbar", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "img-with-empty-alt": { + implicitRole: ["presentation"], + //roleCondition: " when alt attribute is empty", + validRoles: null, + globalAriaAttributesValid: false // TODO aria-hidden="true" is allowed + }, + "img-without-alt": { + implicitRole: ["img"], + //roleCondition: " when alt attribute, aria-label, or aria-labelledby are not present", + validRoles: null, + globalAriaAttributesValid: false // TODO aria-hidden="true" is allowed + } + }, + "input": { + "button": { + implicitRole: ["button"], + validRoles: ["link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab"], + globalAriaAttributesValid: true + }, + "checkbox-with-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is present", + validRoles: ["button"], + globalAriaAttributesValid: true + }, + "checkbox-without-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is not present", + validRoles: ["menuitemcheckbox", "option", "switch"], + globalAriaAttributesValid: true + }, + "color": { + implicitRole: null, + //roleCondition: " with type=color", + validRoles: null, + globalAriaAttributesValid: true + }, + "date": { + implicitRole: null, + //roleCondition: " with type=date", + validRoles: null, + globalAriaAttributesValid: true + }, + "datetime-local": { + implicitRole: null, + //roleCondition: " with type=datetime", + validRoles: null, + globalAriaAttributesValid: true + }, + "email-no-list": { + implicitRole: ["textbox"], + //roleCondition: " with type=email and no list attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "email-with-list": { + implicitRole: ["combobox"], + //roleCondition: " with type=email and a list attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "file": { + implicitRole: null, + //roleCondition: " with type=file", + validRoles: null, + globalAriaAttributesValid: true + }, + "hidden": { + implicitRole: null, + //roleCondition: " with type=hidden", + validRoles: null, + globalAriaAttributesValid: false + }, + "image": { + implicitRole: ["button"], + //roleCondition: " with type=image", + validRoles: ["link", "menuitem", "menuitemcheckbox", "menuitemradio", "radio", "switch"], + globalAriaAttributesValid: true + }, + "month": { + implicitRole: null, + //roleCondition: " with type=month", + validRoles: null, + globalAriaAttributesValid: true + }, + "number": { + implicitRole: ["spinbutton"], + //roleCondition: " with type=number", + validRoles: null, + globalAriaAttributesValid: true + }, + "password": { + implicitRole: null, + //roleCondition: " with type=password", + validRoles: null, + globalAriaAttributesValid: true + }, + "radio": { + implicitRole: ["radio"], + //roleCondition: " with type=radio", + validRoles: ["menuitemradio"], + globalAriaAttributesValid: true + }, + "range": { + implicitRole: ["slider"], + //roleCondition: " with type=radio", + validRoles: null, + globalAriaAttributesValid: true + }, + "reset": { + implicitRole: ["button"], + //roleCondition: " with type=reset", + validRoles: null, + globalAriaAttributesValid: true + }, + "search-no-list": { + implicitRole: ["searchbox"], + //roleCondition: " with type=search and no list attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "search-with-list": { + implicitRole: ["combobox"], + //roleCondition: " with type=search and a list attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "submit": { + implicitRole: ["button"], + //roleCondition: " with type=submit", + validRoles: null, + globalAriaAttributesValid: true + }, + "tel-no-list": { + implicitRole: ["textbox"], + //roleCondition: " with type=tel and no list attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "tel-with-list": { + implicitRole: ["combobox"], + //roleCondition: " with type=tel and a list attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "text-no-list": { + implicitRole: ["textbox"], + //roleCondition: " with type=text and no list attribute is present", + validRoles: ["combobox", "searchbox", "spinbutton"], + globalAriaAttributesValid: true + }, + "text-with-list": { + implicitRole: ["combobox"], + //roleCondition: " with type=text and a list attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "time": { + implicitRole: null, + //roleCondition: " with type=time", + validRoles: null, + globalAriaAttributesValid: true + }, + "url-no-list": { + implicitRole: ["textbox"], + //roleCondition: " with type=url and no list attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "url-with-list": { + implicitRole: ["combobox"], + //roleCondition: " with type=url and a list attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "week": { + implicitRole: null, + //roleCondition: " with type=week", + validRoles: null, + globalAriaAttributesValid: true + }, + "default": { + implicitRole: null, + //roleCondition: "", + validRoles: null, + globalAriaAttributesValid: true + } + }, + "section": { + "with-name": { + implicitRole: ["region"], + //roleCondition: " when accessible name is present", + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + }, + "without-name": { + implicitRole: null, + //roleCondition: " when accessible name is not present", + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + } + }, + "select": { + "no-multiple-attr-size-gt1": { + //roleCondition: " with a multiple attribute or a size attribute having value greater than 1" + implicitRole: ["combobox"], + validRoles: ["menu"], + globalAriaAttributesValid: true + }, + "multiple-attr-size-gt1": { + //roleCondition: " with no multiple attribute and no size attribute having value greater than 1" + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: true + } + }, + "td": { + "des-table": { + implicitRole: ["cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "th": { + "des-table": { + implicitRole: ["columnheader", "rowheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["columnheader", "rowheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tr": { + "des-table": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: ["row"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "default": { + implicitRole: null, + //roleCondition: "", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }; // end of documentConformanceRequirementSpecialTags + ARIADefinitions.containers = []; + return ARIADefinitions; +}()); +exports.ARIADefinitions = ARIADefinitions; +; +var containerArray = []; +for (var roleDesign in ARIADefinitions.designPatterns) { + var containers = ARIADefinitions.designPatterns[roleDesign].container; + if (containers !== null) { + for (var _i = 0, containers_1 = containers; _i < containers_1.length; _i++) { + var container = containers_1[_i]; + if (containerArray.indexOf(container) == -1) { + containerArray.push(container); + } + } + } +} +ARIADefinitions.containers = containerArray; + + +/***/ }), + +/***/ "./src/v2/aria/ARIAMapper.ts": +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAMapper.ts ***! + \***********************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAMapper = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ./ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var legacy_1 = __webpack_require__(/*! ../checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts"); +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAMapper = /** @class */ (function (_super) { + __extends(ARIAMapper, _super); + function ARIAMapper() { + var _this = _super !== null && _super.apply(this, arguments) || this; + //dom-defined relationship overridden by aria-owns: elemId : parentRolePath + _this.ariaHierarchy = null; + return _this; + } + ARIAMapper.prototype.childrenHaveRole = function (node, role) { + // if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = node as Element; + // if (elem.getAttribute("aria-hidden") === "true") { + // return false; + // } + // } + return !(role in ARIADefinitions_1.ARIADefinitions.designPatterns && ARIADefinitions_1.ARIADefinitions.designPatterns[role].presentationalChildren); + }; + ARIAMapper.prototype.getRole = function (node) { + var role = ARIAMapper.nodeToRole(node); + return role; + }; + ARIAMapper.prototype.getNamespace = function () { + return "aria"; + }; + ARIAMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem_1 = node; + for (var idx = 0; idx < elem_1.attributes.length; ++idx) { + var attrInfo = elem_1.attributes[idx]; + var name_1 = attrInfo.name.toLowerCase(); + if (name_1.startsWith("aria-")) { + retVal[name_1.substring(5)] = attrInfo.nodeValue; + } + } + var applyAttrRole = function (nodeName) { + if (!(nodeName in ARIAMapper.elemAttrValueCalculators)) + return; + for (var attr in ARIAMapper.elemAttrValueCalculators[nodeName]) { + if (!(attr in retVal)) { + var value = ARIAMapper.elemAttrValueCalculators[nodeName][attr]; + if (typeof value != "undefined" && value !== null) { + if (typeof value !== typeof "") { + value = value(elem_1); + } + retVal[attr] = value; + } + } + } + }; + applyAttrRole("global"); + applyAttrRole(node.nodeName.toLowerCase()); + } + else if (node.nodeType === 3 /* Node.TEXT_NODE */) { + for (var attr in ARIAMapper.textAttrValueCalculators) { + var val = ARIAMapper.textAttrValueCalculators[attr](node); + if (typeof val != "undefined" && val !== null) { + retVal[attr] = val; + } + } + } + return retVal; + }; + ARIAMapper.prototype.reset = function (node) { + var _this = this; + if (this.ariaHierarchy === null) { + var parent_1 = DOMUtil_1.DOMUtil.parentNode(node); + if (parent_1 && parent_1.nodeType === 9 /* Node.DOCUMENT_NODE */) { + var top_1 = parent_1.documentElement; + var list = top_1.querySelectorAll('[aria-owns]'); + if (list !== null) { + this.ariaHierarchy = []; + list.forEach(function (elem) { + var hierarchies = _this.openScope(elem); + var hierarchyRole = JSON.parse(JSON.stringify(_this.hierarchyRole)); + var hierarchyChildrenHaveRole = JSON.parse(JSON.stringify(_this.hierarchyChildrenHaveRole)); + var hierarchyPath = JSON.parse(JSON.stringify(_this.hierarchyPath)); + var hierarchyResults = DOMUtil_1.DOMUtil.objectCopyWithNodeRefs(_this.hierarchyResults); + var attrValue = elem.getAttribute("aria-owns"); + var ids = attrValue.trim().split(" "); + ids.forEach(function (id) { + _this.ariaHierarchy.push({ + id: id.trim(), + hierarchyRole: hierarchyRole, + hierarchyChildrenHaveRole: hierarchyChildrenHaveRole, + hierarchyPath: hierarchyPath, + hierarchyResults: hierarchyResults, + node: null, + shadowRoot: DOMUtil_1.DOMUtil.shadowRootNode(elem) + }); + }); + //clear the hierarchies + _this.hierarchyRole = []; + _this.hierarchyResults = []; + _this.hierarchyChildrenHaveRole = []; + _this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + }); + } + } + } + ARIAMapper.nameComputationId = 0; + _super.prototype.reset.call(this, node); + }; + ARIAMapper.prototype.pushHierarchy = function (node) { + if (this.switchParentHierarchies(node)) { + //cache the original hierarchies + this.hierarchyCache = { + hierarchyRole: JSON.parse(JSON.stringify(this.hierarchyRole)), + hierarchyChildrenHaveRole: JSON.parse(JSON.stringify(this.hierarchyChildrenHaveRole)), + hierarchyPath: JSON.parse(JSON.stringify(this.hierarchyPath)), + hierarchyResults: DOMUtil_1.DOMUtil.objectCopyWithNodeRefs(this.hierarchyResults) + }; + //rewrite parent hierarchy to the element with aria-owns + var value_1 = node.getAttribute("id"); + var hierarchyItem = this.ariaHierarchy.find(function (aria) { return aria.id === value_1; }); + this.hierarchyRole = hierarchyItem.hierarchyRole; + this.hierarchyChildrenHaveRole = hierarchyItem.hierarchyChildrenHaveRole; + this.hierarchyPath = hierarchyItem.hierarchyPath; + this.hierarchyResults = hierarchyItem.hierarchyResults; + //set the current node + hierarchyItem.node = node; + } + _super.prototype.pushHierarchy.call(this, node); + }; + ARIAMapper.prototype.closeScope = function (node) { + var results = _super.prototype.closeScope.call(this, node); + if (node.nodeType === Node.ELEMENT_NODE && this.ariaHierarchy != null && this.ariaHierarchy.length > 0) { + var value_2 = node.getAttribute("id"); + var hierarchyItem = this.ariaHierarchy.find(function (aria) { return aria.id === value_2; }); + if (hierarchyItem) { + if (DOMUtil_1.DOMUtil.sameNode(node, hierarchyItem.node)) { + //rewrite competed, restore original hierarchies + this.hierarchyRole = this.hierarchyCache.hierarchyRole; + this.hierarchyChildrenHaveRole = this.hierarchyCache.hierarchyChildrenHaveRole; + this.hierarchyPath = this.hierarchyCache.hierarchyPath; + this.hierarchyResults = this.hierarchyCache.hierarchyResults; + //set rewrite parent node to null + hierarchyItem.node = null; + } + } + } + return results; + }; + //rewrite aria role path for aria-owns + ARIAMapper.prototype.switchParentHierarchies = function (node) { + if (this.ariaHierarchy === null || this.ariaHierarchy.length === 0 || node.nodeType !== node.ELEMENT_NODE) + return false; + var value = node.getAttribute("id"); + if (value === null) + return false; + var ariaMap = this.ariaHierarchy.find(function (aria) { return aria.id === value; }); + if (!ariaMap) + return false; + //aria-owns doesn't cross doms + var shadowRoot = DOMUtil_1.DOMUtil.shadowRootNode(node); + if ((shadowRoot && !ariaMap.shadowRoot) + || (!shadowRoot && ariaMap.shadowRoot) + || (shadowRoot && ariaMap.shadowRoot && !DOMUtil_1.DOMUtil.sameNode(shadowRoot, ariaMap.shadowRoot))) + return false; + return true; + }; + ARIAMapper.computeName = function (cur) { + ++ARIAMapper.nameComputationId; + return ARIAMapper.computeNameHelp(ARIAMapper.nameComputationId, cur, false, false); + }; + ARIAMapper.computeNameHelp = function (walkId, cur, labelledbyTraverse, walkTraverse) { + // 2g. None of the other content applies to text nodes, so just do this first + if (cur.nodeType === 3 /* Node.TEXT_NODE */) + return cur.nodeValue; + if (cur.nodeType === 11) + return ""; + if (cur.nodeType !== 1 /* Node.ELEMENT_NODE */) { + if (walkTraverse || labelledbyTraverse) + return ""; + throw new Error("Can only compute name on Element and Text" + cur.nodeType); + } + var elem = cur; + // We've been here before - prevent recursion + if (legacy_1.RPTUtil.getCache(elem, "data-namewalk", null) === "" + walkId) + return ""; + legacy_1.RPTUtil.setCache(elem, "data-namewalk", "" + walkId); + // See https://www.w3.org/TR/html-aam-1.0/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-url-and-textarea-element + // 2a. Only show hidden content if it's referenced by a labelledby + if (!labelledbyTraverse && !DOMUtil_1.DOMUtil.isNodeVisible(cur)) { + return ""; + } + // 2b. collect valid id references + if (!labelledbyTraverse && elem.hasAttribute("aria-labelledby")) { + var labelledby = elem.getAttribute("aria-labelledby").split(" "); + var validElems = []; + for (var _i = 0, labelledby_1 = labelledby; _i < labelledby_1.length; _i++) { + var ref = labelledby_1[_i]; + var refElem = fragment_1.FragmentUtil.getById(cur, ref); + if (refElem) { + validElems.push(refElem); + } + } + if (validElems.length > 0) { + var accumulated = ""; + for (var _a = 0, validElems_1 = validElems; _a < validElems_1.length; _a++) { + var elem_2 = validElems_1[_a]; + accumulated += " " + this.computeNameHelp(walkId, elem_2, true, false); + } + return accumulated.trim(); + } + } + // Since nodeToRole calls back here for form and section, we need special casing here to handle those two cases + if (["section", "form"].includes(cur.nodeName.toLowerCase())) { + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse) { + return elem.getAttribute("aria-label").trim(); + } + } + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + return ""; + } + // 2c. If label or walk, and this is a control, skip to the value, otherwise provide the label + var role = ARIAMapper.nodeToRole(cur); + var isEmbeddedControl = [ + "textbox", "button", "combobox", "listbox", + "progressbar", "scrollbar", "slider", "spinbutton" + ].includes(role); + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse || !isEmbeddedControl) { + return elem.getAttribute("aria-label").trim(); + } + } + // 2d. + if (role !== "presentation" && role !== "none") { + if ((cur.nodeName.toLowerCase() === "img" || cur.nodeName.toLowerCase() === "area") && elem.hasAttribute("alt")) { + return DOMUtil_1.DOMUtil.cleanWhitespace(elem.getAttribute("alt")).trim(); + } + if (cur.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").length > 0) { + var label = elem.ownerDocument.querySelector("label[for='" + elem.getAttribute("id") + "']"); + if (label) { + if (label.hasAttribute("aria-label") || label.hasAttribute("aria-labelledby")) { + return this.computeNameHelp(walkId, label, false, false); + } + else { + return label.textContent; + } + } + } + if (cur.nodeName.toLowerCase() === "fieldset") { + if (cur.querySelector("legend")) { + var legend = cur.querySelector("legend"); + return legend.innerText; + } + else { + return this.computeNameHelp(walkId, cur, false, false); + } + } + } + // 2e. + if ((walkTraverse || labelledbyTraverse) && isEmbeddedControl) { + // If the embedded control has role textbox, return its value. + if (role === "textbox") { + if (elem.nodeName.toLowerCase() === "input") { + if (elem.hasAttribute("value")) + return elem.getAttribute("value"); + } + else { + walkTraverse = false; + } + } + // If the embedded control has role button, return the text alternative of the button. + if (role === "button") { + if (elem.nodeName.toLowerCase() === "input") { + var type = elem.getAttribute("type").toLowerCase(); + if (["button", "submit", "reset"].includes(type)) { + if (elem.hasAttribute("value")) + return elem.getAttribute("value"); + if (type === "submit") + return "Submit"; + if (type === "reset") + return "Reset"; + } + } + else { + walkTraverse = false; + } + } + // TODO: If the embedded control has role combobox or listbox, return the text alternative of the chosen option. + if (role === "combobox") { + if (elem.hasAttribute("aria-activedescendant")) { + var selected = fragment_1.FragmentUtil.getById(elem, "aria-activedescendant"); + if (selected) { + return ARIAMapper.computeNameHelp(walkId, selected, false, false); + } + } + } + // If the embedded control has role range (e.g., a spinbutton or slider): + if (["progressbar", "scrollbar", "slider", "spinbutton"].includes(role)) { + // If the aria-valuetext property is present, return its value, + if (elem.hasAttribute("aria-valuetext")) + return elem.getAttribute("aria-valuetext"); + // Otherwise, if the aria-valuenow property is present, return its value, + if (elem.hasAttribute("aria-valuenow")) + return elem.getAttribute("aria-valuenow"); + // TODO: Otherwise, use the value as specified by a host language attribute. + } + } + // 2f. 2h. + if (walkTraverse || ARIADefinitions_1.ARIADefinitions.nameFromContent(role) || labelledbyTraverse) { + // 2fi. Set the accumulated text to the empty string. + var accumulated = ""; + // 2fii. Check for CSS generated textual content associated with the current node and + // include it in the accumulated text. The CSS :before and :after pseudo elements [CSS2] + // can provide textual content for elements that have a content model. + // For :before pseudo elements, User agents MUST prepend CSS textual content, without + // a space, to the textual content of the current node. + // For :after pseudo elements, User agents MUST append CSS textual content, without a + // space, to the textual content of the current node. + var before = null; + before = elem.ownerDocument.defaultView.getComputedStyle(elem, "before").content; + if (before && before !== "none") { + before = before.replace(/^"/, "").replace(/"$/, ""); + accumulated += before; + } + // 2fiii. For each child node of the current node: + // Set the current node to the child node. + // Compute the text alternative of the current node beginning with step 2. Set the result + // to that text alternative. + // Append the result to the accumulated text. + var walkChild = elem.firstChild; + while (walkChild) { + accumulated += " " + ARIAMapper.computeNameHelp(walkId, walkChild, labelledbyTraverse, true); + walkChild = walkChild.nextSibling; + } + var after = null; + try { + after = elem.ownerDocument.defaultView.getComputedStyle(elem, "after").content; + } + catch (e) { } + if (after && after !== "none") { + after = after.replace(/^"/, "").replace(/"$/, ""); + accumulated += after; + } + // 2fiv. Return the accumulated text. + accumulated = accumulated.replace(/\s+/g, " ").trim(); + if (accumulated.trim().length > 0) { + return accumulated; + } + } + // 2i. Otherwise, if the current node has a Tooltip attribute, return its value. + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + if (elem.tagName.toLowerCase() === "svg") { + var title = elem.querySelector("title"); + if (title) { + return title.textContent || title.innerText; + } + } + return ""; + }; + /* if (role in ARIADefinitions.designPatterns + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) + { + name = elem.textContent; + } + if (elem.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").trim().length > 0) { + name = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id").trim()+"']").textContent; + } + if (elem.hasAttribute("aria-label")) { + name = elem.getAttribute("aria-label"); + } + if (elem.hasAttribute("aria-labelledby")) { + name = ""; + const ids = elem.getAttribute("aria-labelledby").split(" "); + for (const id of ids) { + name += FragmentUtil.getById(elem, id).textContent + " "; + } + name = name.trim(); + } + return name; + }*/ + ARIAMapper.nodeToRole = function (node) { + if (node.nodeType === 3 /* Node.TEXT_NODE */) { + return "text"; + } + else if (node.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + var elem = node; + if (!elem || elem.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + if (elem.hasAttribute("role") && elem.getAttribute("role").trim().length > 0) { + var roleStr = elem.getAttribute("role").trim(); + var roles = roleStr.split(" "); + for (var _i = 0, roles_1 = roles; _i < roles_1.length; _i++) { + var role = roles_1[_i]; + if (role === "presentation" || role === "none") { + // If element is focusable, then presentation roles are to be ignored + if (!legacy_1.RPTUtil.isFocusable(elem)) { + return null; + } + } + else if (role in ARIADefinitions_1.ARIADefinitions.designPatterns) { + return role; + } + } + } + return this.elemToImplicitRole(elem); + }; + ARIAMapper.elemToImplicitRole = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + if (!(nodeName in ARIAMapper.elemToRoleMap)) { + return null; + } + var role = ARIAMapper.elemToRoleMap[nodeName]; + if (typeof role === "string") { + return role; + } + else if (typeof role === "function") { + return role(elem); + } + else { + return null; + } + }; + ARIAMapper.hasParentRole = function (element, role) { + var parent = DOMUtil_1.DOMUtil.parentNode(element); + // If link is in a menu, it's a menuitem + while (parent) { + if (ARIAMapper.nodeToRole(parent) === role) + return true; + parent = DOMUtil_1.DOMUtil.parentNode(parent); + } + return false; + }; + ARIAMapper.inputToRole = function (element) { + if (!element) { + return null; + } + var eType = "text"; + if (element.hasAttribute("type") && element.getAttribute("type").toLowerCase().trim().length > 0) { + eType = element.getAttribute("type").toLowerCase().trim(); + } + if (!(eType in ARIAMapper.inputToRoleMap)) { + return null; + } + var role = ARIAMapper.inputToRoleMap[eType]; + if (typeof role === "string") { + return role; + } + else if (typeof role === "function") { + return role(element); + } + else { + return null; + } + }; + //////////////////////////////////////////////////////////////////////////// + // Helper functions + //// + // https://www.w3.org/TR/html-aam-1.0/#mapping-html-to-accessibility-apis + ARIAMapper.elemAttrValueCalculators = { + "global": { + "name": ARIAMapper.computeName + }, + "datalist": { + // set to "true" if the datalist's selection model allows multiple option elements to be + // selected at a time, and "false" otherwise + "multiselectable": function (elem) { + var id = elem.getAttribute("id"); + if (id && id.length > 0) { + var input = elem.ownerDocument.querySelector("input[list='" + id + "']"); + return "" + (elem.getAttribute("multiple") + && (elem.getAttribute("multiple") == "true" || elem.getAttribute("multiple") == "")); + } + return null; + } + }, + "h1": { + "level": "1" + }, + "h2": { + "level": "2" + }, + "h3": { + "level": "3" + }, + "h4": { + "level": "4" + }, + "h5": { + "level": "5" + }, + "h6": { + "level": "6" + }, + "input": { + // - type="checkbox" state set to "mixed" if the element's indeterminate IDL attribute + // is true, or "true" if the element's checkedness is true, or "false" otherwise + // - type="radio" state set to "true" if the element's checkedness is true, or "false" + // otherwise. + "checked": function (elem) { + if (elem.getAttribute("type") === "checkbox" || elem.getAttribute("type") === "radio") { + return "" + elem.checked; + } + return null; + } + // - type="radio" and not in menu reflecting number of type=radio input elements + // within the radio button group + , + "setsize": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); } + // - type="radio" and not in menu value reflecting the elements position + // within the radio button group." + , + "posinset": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); } + // input (type attribute in the Text, Search, Telephone, URL, or E-mail states with a + // suggestions source element) combobox role, with the aria-owns property set to the same + // value as the list attribute + , + "owns": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); } + }, + "keygen": { + "multiselectable": "false" + }, + "li": { + // Number of li elements within the ol, ul, menu + "setsize": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = parent.querySelectorAll("li"); + var otherlis = parent.querySelectorAll("ol li, ul li, menu li"); + return "" + (lis.length - otherlis.length); + } + // Position of li element within the ol, ul, menu + , + "posinset": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = parent.querySelectorAll("li"); + var num = 0; + for (var idx = 0; idx < lis.length; ++idx) { + var li = lis[idx]; + if (DOMUtil_1.DOMUtil.sameNode(parent, DOMUtil_1.DOMUtil.getAncestor(li, ["ol", "ul", "menu"]))) { + return "" + num; + } + ++num; + } + return null; + } + }, + "menuitem": { + // type = checkbox or radio, set to "true" if the checked attribute + // is present, and "false" otherwise + "checked": function (elem) { return "" + !!(elem.getAttribute("checked") + && (elem.getAttribute("checked") == "true" || elem.getAttribute("checked") == "")); } + }, + "option": { + // set to "true" if the element's selectedness is true, or "false" otherwise. + "selected": function (elem) { return "" + !!(elem.getAttribute("selected") + && (elem.getAttribute("selected") == "true" || elem.getAttribute("selected") == "")); } + }, + "progress": { + "valuemax": function (elem) { return elem.getAttribute("max") || "1"; }, + "valuemin": function (elem) { return "0"; }, + "valuenow": function (elem) { return elem.getAttribute("value"); } + } + }; + ARIAMapper.textAttrValueCalculators = { + "name": function (node) { return node.nodeValue; } + }; + ARIAMapper.nameComputationId = 0; + ARIAMapper.inputToRoleMap = (function () { + var hasList = function (element) { + if (element.hasAttribute("list")) { + var id = element.getAttribute("list"); + var idRef = fragment_1.FragmentUtil.getById(element, id); + if (idRef && idRef.nodeName.toLowerCase() === "datalist") { + return true; + } + } + return false; + }; + var textSuggestions = function (element) { + return hasList(element) ? "combobox" : "textbox"; + }; + return { + "button": "button", + "image": "button", + "checkbox": "checkbox", + "radio": "radio", + "email": textSuggestions, + "search": function (element) { + return hasList(element) ? "combobox" : "searchbox"; + }, + "tel": textSuggestions, + "text": textSuggestions, + "url": textSuggestions, + "number": "spinbutton", + "range": "slider", + "reset": "button", + "submit": "button" + }; + })(); + ARIAMapper.elemToRoleMap = (function () { + var sectioningRoots = { + "blockquote": true, + "body": true, + "details": true, + "dialog": true, + "fieldset": true, + "figure": true, + "td": true + }; + var sectioningContent = { + "article": true, + "aside": true, + "nav": true, + "section": true, + "main": true + }; + var sectioningRole = { + "article": true, + "complementary": true, + "navigation": true, + "region": true, + "main": true + }; + var inputToRole = function (element) { + return ARIAMapper.inputToRole(element); + }; + return { + "a": function (element) { + // If it doesn't represent a hyperlink, no corresponding role + if (!element.hasAttribute("href")) + return null; + return "link"; + }, + "area": function (element) { + // If it doesn't represent a hyperlink, no corresponding role + if (!element.hasAttribute("href")) + return null; + return "link"; + }, + "article": "article", + "aside": "complementary", + "button": "button", + "datalist": "listbox", + "dd": "definition", + "details": "group", + "dfn": "term", + "dialog": "dialog", + "dt": "term", + "fieldset": "group", + "figure": "figure", + "footer": function (element) { + var parent = DOMUtil_1.DOMUtil.parentNode(element); + // If nearest sectioningRoot or sectioningContent is body + while (parent && parent.nodeType === 1) { + var role = (parent.nodeType === 1 && parent.getAttribute("role")) || ""; + var nodeName = parent.nodeName.toLowerCase(); + if (sectioningRoots[nodeName] || sectioningContent[nodeName] || sectioningRole[role]) { + return (nodeName === "body") ? "contentinfo" : null; + } + parent = DOMUtil_1.DOMUtil.parentNode(parent); + } + return null; + }, + "form": function (element) { + var name = ARIAMapper.computeName(element); + return (name && name.trim().length > 0) ? "form" : null; + }, + // TODO "form-associated custom element" + "h1": "heading", + "h2": "heading", + "h3": "heading", + "h4": "heading", + "h5": "heading", + "h6": "heading", + "header": function (element) { + var parent = DOMUtil_1.DOMUtil.parentNode(element); + // If nearest sectioningRoot or sectioningContent is body + while (parent && parent.nodeType === 1) { + var nodeName = parent.nodeName.toLowerCase(); + var role = (parent.nodeType === 1 && parent.getAttribute("role")) || ""; + if (sectioningRoots[nodeName] || sectioningContent[nodeName] || sectioningRole[role]) { + return (nodeName === "body") ? "banner" : null; + } + parent = DOMUtil_1.DOMUtil.parentNode(parent); + } + return null; + }, + "hr": "separator", + "html": "document", + "img": function (element) { + if (element.hasAttribute("alt") && element.getAttribute("alt").length === 0) { + return "presentation"; + } + else { + return "img"; + } + }, + "input": inputToRole, + "keygen": "listbox", + "li": "listitem", + "main": "main", + "math": "math", + "menu": "list", + "nav": "navigation", + "ol": "list", + "optgroup": "group", + "option": "option", + "output": "status", + "progress": "progressbar", + "section": function (element) { + var name = ARIAMapper.computeName(element); + return (name && name.trim().length > 0) ? "region" : null; + }, + "select": function (element) { + if (element.hasAttribute("multiple") || (legacy_1.RPTUtil.attributeNonEmpty(element, "size") && parseInt(element.getAttribute("size")) > 1)) { + return "listbox"; + } + else { + return "combobox"; + } + }, + "summary": "button", + "svg": "graphics-document", + "table": "table", + "tbody": "rowgroup", + "textarea": "textbox", + "td": function (element) { + var parent = DOMUtil_1.DOMUtil.parentNode(element); + while (parent) { + var role = ARIAMapper.nodeToRole(parent); + if (role === "table") + return "cell"; + if (role === "grid" || role === "treegrid") + return "gridcell"; + parent = DOMUtil_1.DOMUtil.parentNode(parent); + } + return null; + }, + "th": function (element) { + /** https://www.w3.org/TR/html5/tabular-data.html#header-and-data-cell-semantics + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a column header if any of the following conditions are true: + * * The cell's scope attribute is in the column state, or + * * The cell's scope attribute is in the auto state, and there are no data cells in any of + * the cells covering slots with y-coordinates y .. y+height-1. + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a row header if any of the following conditions are true: + * * The cell's scope attribute is in the row state, or + * * The cell's scope attribute is in the auto state, the cell is not a column header, and there are + * no data cells in any of the cells covering slots with x-coordinates x .. x+width-1. + */ + // Note: auto is default scope + var parent = DOMUtil_1.DOMUtil.parentNode(element); + while (parent) { + var role = ARIAMapper.nodeToRole(parent); + if (role !== "table" && role !== "grid" && role !== "treegrid") { + parent = DOMUtil_1.DOMUtil.parentNode(parent); + continue; + } + // Easiest answer is if scope is specified + if (element.hasAttribute("scope")) { + var scope = element.getAttribute("scope").toLowerCase(); + if (scope === "row" || scope === 'rowgroup') + return "rowheader"; + if (scope === "col" || scope === 'colgroup') + return "columnheader"; + } + // scope is auto, default (without a scope) or invalid value. + // if all the sibling elements are th, then return "columnheader" + var siblings = function (element) { return __spreadArray([], element.parentElement.children, true).filter(function (node) { return node.nodeType === 1 && node.tagName != "TH"; }); }; + if (siblings === null || siblings.length === 0) + return "columnheader"; + else + return "rowheader"; + /** + * dead code here + if (role === "table") return "cell"; + if (role === "grid" || role === "treegrid") return "gridcell"; + */ + } + return null; + }, + "tfoot": "rowgroup", + "thead": "rowgroup", + "tr": "row", + "ul": "list" + }; + })(); + return ARIAMapper; +}(CommonMapper_1.CommonMapper)); +exports.ARIAMapper = ARIAMapper; + + +/***/ }), + +/***/ "./src/v2/checker/accessibility/util/ancestor.ts": +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/ancestor.ts ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AncestorUtil = void 0; +var AncestorUtil = /** @class */ (function () { + function AncestorUtil() { + } + AncestorUtil.isPresentationFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 + && elem.nodeName.toLowerCase() === "iframe" + && (elem.getAttribute("role") === "presentation" || elem.getAttribute("aria-hidden") === "true")) { + return true; + } + } + } + return false; + }; + AncestorUtil.isFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 && elem.nodeName.toLowerCase() === "iframe") { + return true; + } + } + } + return false; + }; + return AncestorUtil; +}()); +exports.AncestorUtil = AncestorUtil; + + +/***/ }), + +/***/ "./src/v2/checker/accessibility/util/fragment.ts": +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/fragment.ts ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FragmentUtil = void 0; +var FragmentUtil = /** @class */ (function () { + function FragmentUtil() { + } + FragmentUtil.getOwnerFragment = function (node) { + var n = node; + while (n.parentNode && (n = n.parentNode)) { + if (n.nodeType === 11) { + return n; + } + } + return node.ownerDocument; + }; + FragmentUtil.getById = function (node, id) { + return this.getOwnerFragment(node).getElementById(id); + }; + FragmentUtil.getAncestor = function (hierarchies, elemName) { + var matches = hierarchies["dom"].filter(function (info) { return info.role === elemName; }); + return matches.length > 0 && matches[0].node || null; + }; + FragmentUtil.getAncestorWithRole = function (hierarchies, role) { + var matches = hierarchies["aria"].filter(function (info) { return info.role === role; }); + return matches.length > 0 && matches[0].node || null; + }; + return FragmentUtil; +}()); +exports.FragmentUtil = FragmentUtil; + + +/***/ }), + +/***/ "./src/v2/checker/accessibility/util/lang.ts": +/*!***************************************************!*\ + !*** ./src/v2/checker/accessibility/util/lang.ts ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2021- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LangUtil = void 0; +// From https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry +var validPrimaryLangs = [ + ["aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az", "aaa", "aab", "aac", "aad", "aae", "aaf", "aag", "aah", "aai", "aak", "aal", "aam", "aan", "aao", "aap", "aaq", "aas", "aat", "aau", "aav", "aaw", "aax", "aaz", "aba", "abb", "abc", "abd", "abe", "abf", "abg", "abh", "abi", "abj", "abl", "abm", "abn", "abo", "abp", "abq", "abr", "abs", "abt", "abu", "abv", "abw", "abx", "aby", "abz", "aca", "acb", "acd", "ace", "acf", "ach", "aci", "ack", "acl", "acm", "acn", "acp", "acq", "acr", "acs", "act", "acu", "acv", "acw", "acx", "acy", "acz", "ada", "adb", "add", "ade", "adf", "adg", "adh", "adi", "adj", "adl", "adn", "ado", "adp", "adq", "adr", "ads", "adt", "adu", "adw", "adx", "ady", "adz", "aea", "aeb", "aec", "aed", "aee", "aek", "ael", "aem", "aen", "aeq", "aer", "aes", "aeu", "aew", "aey", "aez", "afa", "afb", "afd", "afe", "afg", "afh", "afi", "afk", "afn", "afo", "afp", "afs", "aft", "afu", "afz", "aga", "agb", "agc", "agd", "age", "agf", "agg", "agh", "agi", "agj", "agk", "agl", "agm", "agn", "ago", "agp", "agq", "agr", "ags", "agt", "agu", "agv", "agw", "agx", "agy", "agz", "aha", "ahb", "ahg", "ahh", "ahi", "ahk", "ahl", "ahm", "ahn", "aho", "ahp", "ahr", "ahs", "aht", "aia", "aib", "aic", "aid", "aie", "aif", "aig", "aih", "aii", "aij", "aik", "ail", "aim", "ain", "aio", "aip", "aiq", "air", "ais", "ait", "aiw", "aix", "aiy", "aja", "ajg", "aji", "ajn", "ajp", "ajt", "aju", "ajw", "ajz", "akb", "akc", "akd", "ake", "akf", "akg", "akh", "aki", "akj", "akk", "akl", "akm", "ako", "akp", "akq", "akr", "aks", "akt", "aku", "akv", "akw", "akx", "aky", "akz", "ala", "alc", "ald", "ale", "alf", "alg", "alh", "ali", "alj", "alk", "all", "alm", "aln", "alo", "alp", "alq", "alr", "als", "alt", "alu", "alv", "alw", "alx", "aly", "alz", "ama", "amb", "amc", "ame", "amf", "amg", "ami", "amj", "amk", "aml", "amm", "amn", "amo", "amp", "amq", "amr", "ams", "amt", "amu", "amv", "amw", "amx", "amy", "amz", "ana", "anb", "anc", "and", "ane", "anf", "ang", "anh", "ani", "anj", "ank", "anl", "anm", "ann", "ano", "anp", "anq", "anr", "ans", "ant", "anu", "anv", "anw", "anx", "any", "anz", "aoa", "aob", "aoc", "aod", "aoe", "aof", "aog", "aoh", "aoi", "aoj", "aok", "aol", "aom", "aon", "aor", "aos", "aot", "aou", "aox", "aoz", "apa", "apb", "apc", "apd", "ape", "apf", "apg", "aph", "api", "apj", "apk", "apl", "apm", "apn", "apo", "app", "apq", "apr", "aps", "apt", "apu", "apv", "apw", "apx", "apy", "apz", "aqa", "aqc", "aqd", "aqg", "aqk", "aql", "aqm", "aqn", "aqp", "aqr", "aqt", "aqz", "arb", "arc", "ard", "are", "arh", "ari", "arj", "ark", "arl", "arn", "aro", "arp", "arq", "arr", "ars", "art", "aru", "arv", "arw", "arx", "ary", "arz", "asa", "asb", "asc", "asd", "ase", "asf", "asg", "ash", "asi", "asj", "ask", "asl", "asn", "aso", "asp", "asq", "asr", "ass", "ast", "asu", "asv", "asw", "asx", "asy", "asz", "ata", "atb", "atc", "atd", "ate", "atg", "ath", "ati", "atj", "atk", "atl", "atm", "atn", "ato", "atp", "atq", "atr", "ats", "att", "atu", "atv", "atw", "atx", "aty", "atz", "aua", "aub", "auc", "aud", "aue", "auf", "aug", "auh", "aui", "auj", "auk", "aul", "aum", "aun", "auo", "aup", "auq", "aur", "aus", "aut", "auu", "auw", "aux", "auy", "auz", "avb", "avd", "avi", "avk", "avl", "avm", "avn", "avo", "avs", "avt", "avu", "avv", "awa", "awb", "awc", "awd", "awe", "awg", "awh", "awi", "awk", "awm", "awn", "awo", "awr", "aws", "awt", "awu", "awv", "aww", "awx", "awy", "axb", "axe", "axg", "axk", "axl", "axm", "axx", "aya", "ayb", "ayc", "ayd", "aye", "ayg", "ayh", "ayi", "ayk", "ayl", "ayn", "ayo", "ayp", "ayq", "ayr", "ays", "ayt", "ayu", "ayx", "ayy", "ayz", "aza", "azb", "azc", "azd", "azg", "azj", "azm", "azn", "azo", "azt", "azz"], + ["ba", "be", "bg", "bh", "bi", "bm", "bn", "bo", "br", "bs", "baa", "bab", "bac", "bad", "bae", "baf", "bag", "bah", "bai", "baj", "bal", "ban", "bao", "bap", "bar", "bas", "bat", "bau", "bav", "baw", "bax", "bay", "baz", "bba", "bbb", "bbc", "bbd", "bbe", "bbf", "bbg", "bbh", "bbi", "bbj", "bbk", "bbl", "bbm", "bbn", "bbo", "bbp", "bbq", "bbr", "bbs", "bbt", "bbu", "bbv", "bbw", "bbx", "bby", "bbz", "bca", "bcb", "bcc", "bcd", "bce", "bcf", "bcg", "bch", "bci", "bcj", "bck", "bcl", "bcm", "bcn", "bco", "bcp", "bcq", "bcr", "bcs", "bct", "bcu", "bcv", "bcw", "bcy", "bcz", "bda", "bdb", "bdc", "bdd", "bde", "bdf", "bdg", "bdh", "bdi", "bdj", "bdk", "bdl", "bdm", "bdn", "bdo", "bdp", "bdq", "bdr", "bds", "bdt", "bdu", "bdv", "bdw", "bdx", "bdy", "bdz", "bea", "beb", "bec", "bed", "bee", "bef", "beg", "beh", "bei", "bej", "bek", "bem", "beo", "bep", "beq", "ber", "bes", "bet", "beu", "bev", "bew", "bex", "bey", "bez", "bfa", "bfb", "bfc", "bfd", "bfe", "bff", "bfg", "bfh", "bfi", "bfj", "bfk", "bfl", "bfm", "bfn", "bfo", "bfp", "bfq", "bfr", "bfs", "bft", "bfu", "bfw", "bfx", "bfy", "bfz", "bga", "bgb", "bgc", "bgd", "bge", "bgf", "bgg", "bgi", "bgj", "bgk", "bgl", "bgm", "bgn", "bgo", "bgp", "bgq", "bgr", "bgs", "bgt", "bgu", "bgv", "bgw", "bgx", "bgy", "bgz", "bha", "bhb", "bhc", "bhd", "bhe", "bhf", "bhg", "bhh", "bhi", "bhj", "bhk", "bhl", "bhm", "bhn", "bho", "bhp", "bhq", "bhr", "bhs", "bht", "bhu", "bhv", "bhw", "bhx", "bhy", "bhz", "bia", "bib", "bic", "bid", "bie", "bif", "big", "bij", "bik", "bil", "bim", "bin", "bio", "bip", "biq", "bir", "bit", "biu", "biv", "biw", "bix", "biy", "biz", "bja", "bjb", "bjc", "bjd", "bje", "bjf", "bjg", "bjh", "bji", "bjj", "bjk", "bjl", "bjm", "bjn", "bjo", "bjp", "bjq", "bjr", "bjs", "bjt", "bju", "bjv", "bjw", "bjx", "bjy", "bjz", "bka", "bkb", "bkc", "bkd", "bkf", "bkg", "bkh", "bki", "bkj", "bkk", "bkl", "bkm", "bkn", "bko", "bkp", "bkq", "bkr", "bks", "bkt", "bku", "bkv", "bkw", "bkx", "bky", "bkz", "bla", "blb", "blc", "bld", "ble", "blf", "blg", "blh", "bli", "blj", "blk", "bll", "blm", "bln", "blo", "blp", "blq", "blr", "bls", "blt", "blv", "blw", "blx", "bly", "blz", "bma", "bmb", "bmc", "bmd", "bme", "bmf", "bmg", "bmh", "bmi", "bmj", "bmk", "bml", "bmm", "bmn", "bmo", "bmp", "bmq", "bmr", "bms", "bmt", "bmu", "bmv", "bmw", "bmx", "bmy", "bmz", "bna", "bnb", "bnc", "bnd", "bne", "bnf", "bng", "bni", "bnj", "bnk", "bnl", "bnm", "bnn", "bno", "bnp", "bnq", "bnr", "bns", "bnt", "bnu", "bnv", "bnw", "bnx", "bny", "bnz", "boa", "bob", "boe", "bof", "bog", "boh", "boi", "boj", "bok", "bol", "bom", "bon", "boo", "bop", "boq", "bor", "bot", "bou", "bov", "bow", "box", "boy", "boz", "bpa", "bpb", "bpd", "bpe", "bpg", "bph", "bpi", "bpj", "bpk", "bpl", "bpm", "bpn", "bpo", "bpp", "bpq", "bpr", "bps", "bpt", "bpu", "bpv", "bpw", "bpx", "bpy", "bpz", "bqa", "bqb", "bqc", "bqd", "bqf", "bqg", "bqh", "bqi", "bqj", "bqk", "bql", "bqm", "bqn", "bqo", "bqp", "bqq", "bqr", "bqs", "bqt", "bqu", "bqv", "bqw", "bqx", "bqy", "bqz", "bra", "brb", "brc", "brd", "brf", "brg", "brh", "bri", "brj", "brk", "brl", "brm", "brn", "bro", "brp", "brq", "brr", "brs", "brt", "bru", "brv", "brw", "brx", "bry", "brz", "bsa", "bsb", "bsc", "bse", "bsf", "bsg", "bsh", "bsi", "bsj", "bsk", "bsl", "bsm", "bsn", "bso", "bsp", "bsq", "bsr", "bss", "bst", "bsu", "bsv", "bsw", "bsx", "bsy", "bta", "btb", "btc", "btd", "bte", "btf", "btg", "bth", "bti", "btj", "btk", "btl", "btm", "btn", "bto", "btp", "btq", "btr", "bts", "btt", "btu", "btv", "btw", "btx", "bty", "btz", "bua", "bub", "buc", "bud", "bue", "buf", "bug", "buh", "bui", "buj", "buk", "bum", "bun", "buo", "bup", "buq", "bus", "but", "buu", "buv", "buw", "bux", "buy", "buz", "bva", "bvb", "bvc", "bvd", "bve", "bvf", "bvg", "bvh", "bvi", "bvj", "bvk", "bvl", "bvm", "bvn", "bvo", "bvp", "bvq", "bvr", "bvt", "bvu", "bvv", "bvw", "bvx", "bvy", "bvz", "bwa", "bwb", "bwc", "bwd", "bwe", "bwf", "bwg", "bwh", "bwi", "bwj", "bwk", "bwl", "bwm", "bwn", "bwo", "bwp", "bwq", "bwr", "bws", "bwt", "bwu", "bww", "bwx", "bwy", "bwz", "bxa", "bxb", "bxc", "bxd", "bxe", "bxf", "bxg", "bxh", "bxi", "bxj", "bxk", "bxl", "bxm", "bxn", "bxo", "bxp", "bxq", "bxr", "bxs", "bxu", "bxv", "bxw", "bxx", "bxz", "bya", "byb", "byc", "byd", "bye", "byf", "byg", "byh", "byi", "byj", "byk", "byl", "bym", "byn", "byo", "byp", "byq", "byr", "bys", "byt", "byv", "byw", "byx", "byy", "byz", "bza", "bzb", "bzc", "bzd", "bze", "bzf", "bzg", "bzh", "bzi", "bzj", "bzk", "bzl", "bzm", "bzn", "bzo", "bzp", "bzq", "bzr", "bzs", "bzt", "bzu", "bzv", "bzw", "bzx", "bzy", "bzz"], + ["ca", "ce", "ch", "co", "cr", "cs", "cu", "cv", "cy", "caa", "cab", "cac", "cad", "cae", "caf", "cag", "cah", "cai", "caj", "cak", "cal", "cam", "can", "cao", "cap", "caq", "car", "cas", "cau", "cav", "caw", "cax", "cay", "caz", "cba", "cbb", "cbc", "cbd", "cbe", "cbg", "cbh", "cbi", "cbj", "cbk", "cbl", "cbn", "cbo", "cbq", "cbr", "cbs", "cbt", "cbu", "cbv", "cbw", "cby", "cca", "ccc", "ccd", "cce", "ccg", "cch", "ccj", "ccl", "ccm", "ccn", "cco", "ccp", "ccq", "ccr", "ccs", "cda", "cdc", "cdd", "cde", "cdf", "cdg", "cdh", "cdi", "cdj", "cdm", "cdn", "cdo", "cdr", "cds", "cdy", "cdz", "cea", "ceb", "ceg", "cek", "cel", "cen", "cet", "cey", "cfa", "cfd", "cfg", "cfm", "cga", "cgc", "cgg", "cgk", "chb", "chc", "chd", "chf", "chg", "chh", "chj", "chk", "chl", "chm", "chn", "cho", "chp", "chq", "chr", "cht", "chw", "chx", "chy", "chz", "cia", "cib", "cic", "cid", "cie", "cih", "cik", "cim", "cin", "cip", "cir", "ciw", "ciy", "cja", "cje", "cjh", "cji", "cjk", "cjm", "cjn", "cjo", "cjp", "cjr", "cjs", "cjv", "cjy", "cka", "ckb", "ckh", "ckl", "ckm", "ckn", "cko", "ckq", "ckr", "cks", "ckt", "cku", "ckv", "ckx", "cky", "ckz", "cla", "clc", "cld", "cle", "clh", "cli", "clj", "clk", "cll", "clm", "clo", "clt", "clu", "clw", "cly", "cma", "cmc", "cme", "cmg", "cmi", "cmk", "cml", "cmm", "cmn", "cmo", "cmr", "cms", "cmt", "cna", "cnb", "cnc", "cng", "cnh", "cni", "cnk", "cnl", "cno", "cnp", "cnr", "cns", "cnt", "cnu", "cnw", "cnx", "coa", "cob", "coc", "cod", "coe", "cof", "cog", "coh", "coj", "cok", "col", "com", "con", "coo", "cop", "coq", "cot", "cou", "cov", "cow", "cox", "coy", "coz", "cpa", "cpb", "cpc", "cpe", "cpf", "cpg", "cpi", "cpn", "cpo", "cpp", "cps", "cpu", "cpx", "cpy", "cqd", "cqu", "cra", "crb", "crc", "crd", "crf", "crg", "crh", "cri", "crj", "crk", "crl", "crm", "crn", "cro", "crp", "crq", "crr", "crs", "crt", "crv", "crw", "crx", "cry", "crz", "csa", "csb", "csc", "csd", "cse", "csf", "csg", "csh", "csi", "csj", "csk", "csl", "csm", "csn", "cso", "csp", "csq", "csr", "css", "cst", "csu", "csv", "csw", "csx", "csy", "csz", "cta", "ctc", "ctd", "cte", "ctg", "cth", "ctl", "ctm", "ctn", "cto", "ctp", "cts", "ctt", "ctu", "cty", "ctz", "cua", "cub", "cuc", "cug", "cuh", "cui", "cuj", "cuk", "cul", "cum", "cuo", "cup", "cuq", "cur", "cus", "cut", "cuu", "cuv", "cuw", "cux", "cuy", "cvg", "cvn", "cwa", "cwb", "cwd", "cwe", "cwg", "cwt", "cya", "cyb", "cyo", "czh", "czk", "czn", "czo", "czt"], + ["da", "de", "dv", "dz", "daa", "dac", "dad", "dae", "daf", "dag", "dah", "dai", "daj", "dak", "dal", "dam", "dao", "dap", "daq", "dar", "das", "dau", "dav", "daw", "dax", "day", "daz", "dba", "dbb", "dbd", "dbe", "dbf", "dbg", "dbi", "dbj", "dbl", "dbm", "dbn", "dbo", "dbp", "dbq", "dbr", "dbt", "dbu", "dbv", "dbw", "dby", "dcc", "dcr", "dda", "ddd", "dde", "ddg", "ddi", "ddj", "ddn", "ddo", "ddr", "dds", "ddw", "dec", "ded", "dee", "def", "deg", "deh", "dei", "dek", "del", "dem", "den", "dep", "deq", "der", "des", "dev", "dez", "dga", "dgb", "dgc", "dgd", "dge", "dgg", "dgh", "dgi", "dgk", "dgl", "dgn", "dgo", "dgr", "dgs", "dgt", "dgu", "dgw", "dgx", "dgz", "dha", "dhd", "dhg", "dhi", "dhl", "dhm", "dhn", "dho", "dhr", "dhs", "dhu", "dhv", "dhw", "dhx", "dia", "dib", "dic", "did", "dif", "dig", "dih", "dii", "dij", "dik", "dil", "dim", "din", "dio", "dip", "diq", "dir", "dis", "dit", "diu", "diw", "dix", "diy", "diz", "dja", "djb", "djc", "djd", "dje", "djf", "dji", "djj", "djk", "djl", "djm", "djn", "djo", "djr", "dju", "djw", "dka", "dkg", "dkk", "dkl", "dkr", "dks", "dkx", "dlg", "dlk", "dlm", "dln", "dma", "dmb", "dmc", "dmd", "dme", "dmf", "dmg", "dmk", "dml", "dmm", "dmn", "dmo", "dmr", "dms", "dmu", "dmv", "dmw", "dmx", "dmy", "dna", "dnd", "dne", "dng", "dni", "dnj", "dnk", "dnn", "dno", "dnr", "dnt", "dnu", "dnv", "dnw", "dny", "doa", "dob", "doc", "doe", "dof", "doh", "doi", "dok", "dol", "don", "doo", "dop", "doq", "dor", "dos", "dot", "dov", "dow", "dox", "doy", "doz", "dpp", "dra", "drb", "drc", "drd", "dre", "drg", "drh", "dri", "drl", "drn", "dro", "drq", "drr", "drs", "drt", "dru", "drw", "dry", "dsb", "dse", "dsh", "dsi", "dsl", "dsn", "dso", "dsq", "dta", "dtb", "dtd", "dth", "dti", "dtk", "dtm", "dtn", "dto", "dtp", "dtr", "dts", "dtt", "dtu", "dty", "dua", "dub", "duc", "dud", "due", "duf", "dug", "duh", "dui", "duj", "duk", "dul", "dum", "dun", "duo", "dup", "duq", "dur", "dus", "duu", "duv", "duw", "dux", "duy", "duz", "dva", "dwa", "dwk", "dwl", "dwr", "dws", "dwu", "dww", "dwy", "dwz", "dya", "dyb", "dyd", "dyg", "dyi", "dym", "dyn", "dyo", "dyu", "dyy", "dza", "dzd", "dze", "dzg", "dzl", "dzn"], + ["ee", "el", "en", "eo", "es", "et", "eu", "eaa", "ebc", "ebg", "ebk", "ebo", "ebr", "ebu", "ecr", "ecs", "ecy", "eee", "efa", "efe", "efi", "ega", "egl", "ego", "egx", "egy", "ehs", "ehu", "eip", "eit", "eiv", "eja", "eka", "ekc", "eke", "ekg", "eki", "ekk", "ekl", "ekm", "eko", "ekp", "ekr", "eky", "ele", "elh", "eli", "elk", "elm", "elo", "elp", "elu", "elx", "ema", "emb", "eme", "emg", "emi", "emk", "emm", "emn", "emo", "emp", "emq", "ems", "emu", "emw", "emx", "emy", "emz", "ena", "enb", "enc", "end", "enf", "enh", "enl", "enm", "enn", "eno", "enq", "enr", "enu", "env", "enw", "enx", "eot", "epi", "era", "erg", "erh", "eri", "erk", "ero", "err", "ers", "ert", "erw", "ese", "esg", "esh", "esi", "esk", "esl", "esm", "esn", "eso", "esq", "ess", "esu", "esx", "esy", "etb", "etc", "eth", "etn", "eto", "etr", "ets", "ett", "etu", "etx", "etz", "euq", "eve", "evh", "evn", "ewo", "ext", "eya", "eyo", "eza", "eze"], + ["fa", "ff", "fi", "fj", "fo", "fr", "fy", "faa", "fab", "fad", "faf", "fag", "fah", "fai", "faj", "fak", "fal", "fam", "fan", "fap", "far", "fat", "fau", "fax", "fay", "faz", "fbl", "fcs", "fer", "ffi", "ffm", "fgr", "fia", "fie", "fif", "fil", "fip", "fir", "fit", "fiu", "fiw", "fkk", "fkv", "fla", "flh", "fli", "fll", "fln", "flr", "fly", "fmp", "fmu", "fnb", "fng", "fni", "fod", "foi", "fom", "fon", "for", "fos", "fox", "fpe", "fqs", "frc", "frd", "frk", "frm", "fro", "frp", "frq", "frr", "frs", "frt", "fse", "fsl", "fss", "fub", "fuc", "fud", "fue", "fuf", "fuh", "fui", "fuj", "fum", "fun", "fuq", "fur", "fut", "fuu", "fuv", "fuy", "fvr", "fwa", "fwe"], + ["ga", "gd", "gl", "gn", "gu", "gv", "gaa", "gab", "gac", "gad", "gae", "gaf", "gag", "gah", "gai", "gaj", "gak", "gal", "gam", "gan", "gao", "gap", "gaq", "gar", "gas", "gat", "gau", "gav", "gaw", "gax", "gay", "gaz", "gba", "gbb", "gbc", "gbd", "gbe", "gbf", "gbg", "gbh", "gbi", "gbj", "gbk", "gbl", "gbm", "gbn", "gbo", "gbp", "gbq", "gbr", "gbs", "gbu", "gbv", "gbw", "gbx", "gby", "gbz", "gcc", "gcd", "gce", "gcf", "gcl", "gcn", "gcr", "gct", "gda", "gdb", "gdc", "gdd", "gde", "gdf", "gdg", "gdh", "gdi", "gdj", "gdk", "gdl", "gdm", "gdn", "gdo", "gdq", "gdr", "gds", "gdt", "gdu", "gdx", "gea", "geb", "gec", "ged", "gef", "geg", "geh", "gei", "gej", "gek", "gel", "gem", "geq", "ges", "gev", "gew", "gex", "gey", "gez", "gfk", "gft", "gfx", "gga", "ggb", "ggd", "gge", "ggg", "ggk", "ggl", "ggn", "ggo", "ggr", "ggt", "ggu", "ggw", "gha", "ghc", "ghe", "ghh", "ghk", "ghl", "ghn", "gho", "ghr", "ghs", "ght", "gia", "gib", "gic", "gid", "gie", "gig", "gih", "gii", "gil", "gim", "gin", "gio", "gip", "giq", "gir", "gis", "git", "giu", "giw", "gix", "giy", "giz", "gji", "gjk", "gjm", "gjn", "gjr", "gju", "gka", "gkd", "gke", "gkn", "gko", "gkp", "gku", "glb", "glc", "gld", "glh", "gli", "glj", "glk", "gll", "glo", "glr", "glu", "glw", "gly", "gma", "gmb", "gmd", "gme", "gmg", "gmh", "gml", "gmm", "gmn", "gmq", "gmr", "gmu", "gmv", "gmw", "gmx", "gmy", "gmz", "gna", "gnb", "gnc", "gnd", "gne", "gng", "gnh", "gni", "gnj", "gnk", "gnl", "gnm", "gnn", "gno", "gnq", "gnr", "gnt", "gnu", "gnw", "gnz", "goa", "gob", "goc", "god", "goe", "gof", "gog", "goh", "goi", "goj", "gok", "gol", "gom", "gon", "goo", "gop", "goq", "gor", "gos", "got", "gou", "gow", "gox", "goy", "goz", "gpa", "gpe", "gpn", "gqa", "gqi", "gqn", "gqr", "gqu", "gra", "grb", "grc", "grd", "grg", "grh", "gri", "grj", "grk", "grm", "gro", "grq", "grr", "grs", "grt", "gru", "grv", "grw", "grx", "gry", "grz", "gse", "gsg", "gsl", "gsm", "gsn", "gso", "gsp", "gss", "gsw", "gta", "gti", "gtu", "gua", "gub", "guc", "gud", "gue", "guf", "gug", "guh", "gui", "guk", "gul", "gum", "gun", "guo", "gup", "guq", "gur", "gus", "gut", "guu", "guv", "guw", "gux", "guz", "gva", "gvc", "gve", "gvf", "gvj", "gvl", "gvm", "gvn", "gvo", "gvp", "gvr", "gvs", "gvy", "gwa", "gwb", "gwc", "gwd", "gwe", "gwf", "gwg", "gwi", "gwj", "gwm", "gwn", "gwr", "gwt", "gwu", "gww", "gwx", "gxx", "gya", "gyb", "gyd", "gye", "gyf", "gyg", "gyi", "gyl", "gym", "gyn", "gyo", "gyr", "gyy", "gyz", "gza", "gzi", "gzn"], + ["ha", "he", "hi", "ho", "hr", "ht", "hu", "hy", "hz", "haa", "hab", "hac", "had", "hae", "haf", "hag", "hah", "hai", "haj", "hak", "hal", "ham", "han", "hao", "hap", "haq", "har", "has", "hav", "haw", "hax", "hay", "haz", "hba", "hbb", "hbn", "hbo", "hbu", "hca", "hch", "hdn", "hds", "hdy", "hea", "hed", "heg", "heh", "hei", "hem", "hgm", "hgw", "hhi", "hhr", "hhy", "hia", "hib", "hid", "hif", "hig", "hih", "hii", "hij", "hik", "hil", "him", "hio", "hir", "hit", "hiw", "hix", "hji", "hka", "hke", "hkh", "hkk", "hkn", "hks", "hla", "hlb", "hld", "hle", "hlt", "hlu", "hma", "hmb", "hmc", "hmd", "hme", "hmf", "hmg", "hmh", "hmi", "hmj", "hmk", "hml", "hmm", "hmn", "hmp", "hmq", "hmr", "hms", "hmt", "hmu", "hmv", "hmw", "hmx", "hmy", "hmz", "hna", "hnd", "hne", "hng", "hnh", "hni", "hnj", "hnn", "hno", "hns", "hnu", "hoa", "hob", "hoc", "hod", "hoe", "hoh", "hoi", "hoj", "hok", "hol", "hom", "hoo", "hop", "hor", "hos", "hot", "hov", "how", "hoy", "hoz", "hpo", "hps", "hra", "hrc", "hre", "hrk", "hrm", "hro", "hrp", "hrr", "hrt", "hru", "hrw", "hrx", "hrz", "hsb", "hsh", "hsl", "hsn", "hss", "hti", "hto", "hts", "htu", "htx", "hub", "huc", "hud", "hue", "huf", "hug", "huh", "hui", "huj", "huk", "hul", "hum", "huo", "hup", "huq", "hur", "hus", "hut", "huu", "huv", "huw", "hux", "huy", "huz", "hvc", "hve", "hvk", "hvn", "hvv", "hwa", "hwc", "hwo", "hya", "hyw", "hyx"], + ["ia", "id", "ie", "ig", "ii", "ik", "in", "io", "is", "it", "iu", "iw", "iai", "ian", "iap", "iar", "iba", "ibb", "ibd", "ibe", "ibg", "ibh", "ibi", "ibl", "ibm", "ibn", "ibr", "ibu", "iby", "ica", "ich", "icl", "icr", "ida", "idb", "idc", "idd", "ide", "idi", "idr", "ids", "idt", "idu", "ifa", "ifb", "ife", "iff", "ifk", "ifm", "ifu", "ify", "igb", "ige", "igg", "igl", "igm", "ign", "igo", "igs", "igw", "ihb", "ihi", "ihp", "ihw", "iin", "iir", "ijc", "ije", "ijj", "ijn", "ijo", "ijs", "ike", "iki", "ikk", "ikl", "iko", "ikp", "ikr", "iks", "ikt", "ikv", "ikw", "ikx", "ikz", "ila", "ilb", "ilg", "ili", "ilk", "ill", "ilm", "ilo", "ilp", "ils", "ilu", "ilv", "ilw", "ima", "ime", "imi", "iml", "imn", "imo", "imr", "ims", "imy", "inb", "inc", "ine", "ing", "inh", "inj", "inl", "inm", "inn", "ino", "inp", "ins", "int", "inz", "ior", "iou", "iow", "ipi", "ipo", "iqu", "iqw", "ira", "ire", "irh", "iri", "irk", "irn", "iro", "irr", "iru", "irx", "iry", "isa", "isc", "isd", "ise", "isg", "ish", "isi", "isk", "ism", "isn", "iso", "isr", "ist", "isu", "itb", "itc", "itd", "ite", "iti", "itk", "itl", "itm", "ito", "itr", "its", "itt", "itv", "itw", "itx", "ity", "itz", "ium", "ivb", "ivv", "iwk", "iwm", "iwo", "iws", "ixc", "ixl", "iya", "iyo", "iyx", "izh", "izi", "izr", "izz"], + ["ja", "ji", "jv", "jw", "jaa", "jab", "jac", "jad", "jae", "jaf", "jah", "jaj", "jak", "jal", "jam", "jan", "jao", "jaq", "jar", "jas", "jat", "jau", "jax", "jay", "jaz", "jbe", "jbi", "jbj", "jbk", "jbm", "jbn", "jbo", "jbr", "jbt", "jbu", "jbw", "jcs", "jct", "jda", "jdg", "jdt", "jeb", "jee", "jeg", "jeh", "jei", "jek", "jel", "jen", "jer", "jet", "jeu", "jgb", "jge", "jgk", "jgo", "jhi", "jhs", "jia", "jib", "jic", "jid", "jie", "jig", "jih", "jii", "jil", "jim", "jio", "jiq", "jit", "jiu", "jiv", "jiy", "jje", "jjr", "jka", "jkm", "jko", "jkp", "jkr", "jks", "jku", "jle", "jls", "jma", "jmb", "jmc", "jmd", "jmi", "jml", "jmn", "jmr", "jms", "jmw", "jmx", "jna", "jnd", "jng", "jni", "jnj", "jnl", "jns", "job", "jod", "jog", "jor", "jos", "jow", "jpa", "jpr", "jpx", "jqr", "jra", "jrb", "jrr", "jrt", "jru", "jsl", "jua", "jub", "juc", "jud", "juh", "jui", "juk", "jul", "jum", "jun", "juo", "jup", "jur", "jus", "jut", "juu", "juw", "juy", "jvd", "jvn", "jwi", "jya", "jye", "jyy"], + ["ka", "kg", "ki", "kj", "kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "kaa", "kab", "kac", "kad", "kae", "kaf", "kag", "kah", "kai", "kaj", "kak", "kam", "kao", "kap", "kaq", "kar", "kav", "kaw", "kax", "kay", "kba", "kbb", "kbc", "kbd", "kbe", "kbf", "kbg", "kbh", "kbi", "kbj", "kbk", "kbl", "kbm", "kbn", "kbo", "kbp", "kbq", "kbr", "kbs", "kbt", "kbu", "kbv", "kbw", "kbx", "kby", "kbz", "kca", "kcb", "kcc", "kcd", "kce", "kcf", "kcg", "kch", "kci", "kcj", "kck", "kcl", "kcm", "kcn", "kco", "kcp", "kcq", "kcr", "kcs", "kct", "kcu", "kcv", "kcw", "kcx", "kcy", "kcz", "kda", "kdc", "kdd", "kde", "kdf", "kdg", "kdh", "kdi", "kdj", "kdk", "kdl", "kdm", "kdn", "kdo", "kdp", "kdq", "kdr", "kdt", "kdu", "kdv", "kdw", "kdx", "kdy", "kdz", "kea", "keb", "kec", "ked", "kee", "kef", "keg", "keh", "kei", "kej", "kek", "kel", "kem", "ken", "keo", "kep", "keq", "ker", "kes", "ket", "keu", "kev", "kew", "kex", "key", "kez", "kfa", "kfb", "kfc", "kfd", "kfe", "kff", "kfg", "kfh", "kfi", "kfj", "kfk", "kfl", "kfm", "kfn", "kfo", "kfp", "kfq", "kfr", "kfs", "kft", "kfu", "kfv", "kfw", "kfx", "kfy", "kfz", "kga", "kgb", "kgc", "kgd", "kge", "kgf", "kgg", "kgh", "kgi", "kgj", "kgk", "kgl", "kgm", "kgn", "kgo", "kgp", "kgq", "kgr", "kgs", "kgt", "kgu", "kgv", "kgw", "kgx", "kgy", "kha", "lyg", "khb", "khc", "khd", "khe", "khf", "khg", "khh", "khi", "khj", "khk", "khl", "khn", "kho", "khp", "khq", "khr", "khs", "kht", "khu", "khv", "khw", "khx", "khy", "khz", "kia", "kib", "kic", "kid", "kie", "kif", "kig", "kih", "kii", "kij", "kil", "kim", "kio", "kip", "kiq", "kis", "kit", "kiu", "kiv", "kiw", "kix", "kiy", "kiz", "kja", "kjb", "kjc", "kjd", "kje", "kjf", "kjg", "kjh", "kji", "kjj", "kjk", "kjl", "kjm", "kjn", "kjo", "kjp", "kjq", "kjr", "kjs", "kjt", "kju", "kjv", "kjx", "kjy", "kjz", "kka", "kkb", "kkc", "kkd", "kke", "kkf", "kkg", "kkh", "kki", "kkj", "kkk", "kkl", "kkm", "kkn", "kko", "kkp", "kkq", "kkr", "kks", "kkt", "kku", "kkv", "kkw", "kkx", "kky", "kkz", "kla", "klb", "klc", "kld", "kle", "klf", "klg", "klh", "kli", "klj", "klk", "kll", "klm", "kln", "klo", "klp", "klq", "klr", "kls", "klt", "klu", "klv", "klw", "klx", "kly", "klz", "kma", "kmb", "kmc", "kmd", "kme", "kmf", "kmg", "kmh", "kmi", "kmj", "kmk", "kml", "kmm", "kmn", "kmo", "kmp", "kmq", "kmr", "kms", "kmt", "kmu", "kmv", "kmw", "kmx", "kmy", "kmz", "kna", "knb", "knc", "knd", "kne", "knf", "kng", "kni", "knj", "knk", "knl", "knm", "knn", "kno", "knp", "knq", "knr", "kns", "knt", "knu", "knv", "knw", "knx", "kny", "knz", "koa", "koc", "kod", "koe", "kof", "kog", "koh", "koi", "koj", "kok", "kol", "koo", "kop", "koq", "kos", "kot", "kou", "kov", "kow", "kox", "koy", "koz", "kpa", "kpb", "kpc", "kpd", "kpe", "kpf", "kpg", "kph", "kpi", "kpj", "kpk", "kpl", "kpm", "kpn", "kpo", "kpp", "kpq", "kpr", "kps", "kpt", "kpu", "kpv", "kpw", "kpx", "kpy", "kpz", "kqa", "kqb", "kqc", "kqd", "kqe", "kqf", "kqg", "kqh", "kqi", "kqj", "kqk", "kql", "kqm", "kqn", "kqo", "kqp", "kqq", "kqr", "kqs", "kqt", "kqu", "kqv", "kqw", "kqx", "kqy", "kqz", "kra", "krb", "krc", "krd", "kre", "krf", "krh", "kri", "krj", "krk", "krl", "krm", "krn", "kro", "krp", "krr", "krs", "krt", "kru", "krv", "krw", "krx", "kry", "krz", "ksa", "ksb", "ksc", "ksd", "kse", "ksf", "ksg", "ksh", "ksi", "ksj", "ksk", "ksl", "ksm", "ksn", "kso", "ksp", "ksq", "ksr", "kss", "kst", "ksu", "ksv", "ksw", "ksx", "ksy", "ksz", "kta", "ktb", "ktc", "ktd", "kte", "ktf", "ktg", "kth", "kti", "ktj", "ktk", "ktl", "ktm", "ktn", "kto", "ktp", "ktq", "ktr", "kts", "ktt", "ktu", "ktv", "ktw", "ktx", "kty", "ktz", "kub", "kuc", "kud", "kue", "kuf", "kug", "kuh", "kui", "kuj", "kuk", "kul", "kum", "kun", "kuo", "kup", "kuq", "kus", "kut", "kuu", "kuv", "kuw", "kux", "kuy", "kuz", "kva", "kvb", "kvc", "kvd", "kve", "kvf", "kvg", "kvh", "kvi", "kvj", "kvk", "kvl", "kvm", "kvn", "kvo", "kvp", "kvq", "kvr", "kvs", "kvt", "kvu", "kvv", "kvw", "kvx", "kvy", "kvz", "kwa", "kwb", "kwc", "kwd", "kwe", "kwf", "kwg", "kwh", "kwi", "kwj", "kwk", "kwl", "kwm", "kwn", "kwo", "kwp", "kwq", "kwr", "kws", "kwt", "kwu", "kwv", "kww", "kwx", "kwy", "kwz", "kxa", "kxb", "kxc", "kxd", "kxe", "kxf", "kxh", "kxi", "kxj", "kxk", "kxl", "kxm", "kxn", "kxo", "kxp", "kxq", "kxr", "kxs", "kxt", "kxu", "kxv", "kxw", "kxx", "kxy", "kxz", "kya", "kyb", "kyc", "kyd", "kye", "kyf", "kyg", "kyh", "kyi", "kyj", "kyk", "kyl", "kym", "kyn", "kyo", "kyp", "kyq", "kyr", "kys", "kyt", "kyu", "kyv", "kyw", "kyx", "kyy", "kyz", "kza", "kzb", "kzc", "kzd", "kze", "kzf", "kzg", "kzh", "kzi", "kzj", "kzk", "kzl", "kzm", "kzn", "kzo", "kzp", "kzq", "kzr", "kzs", "kzt", "kzu", "kzv", "kzw", "kzx", "kzy", "kzz"], + ["la", "lb", "lg", "li", "ln", "lo", "lt", "lu", "lv", "laa", "lab", "lac", "lad", "lae", "laf", "lag", "lah", "lai", "laj", "lak", "lal", "lam", "lan", "lap", "laq", "lar", "las", "lau", "law", "lax", "lay", "laz", "lba", "lbb", "lbc", "lbe", "lbf", "lbg", "lbi", "lbj", "lbk", "lbl", "lbm", "lbn", "lbo", "lbq", "lbr", "lbs", "lbt", "lbu", "lbv", "lbw", "lbx", "lby", "lbz", "lcc", "lcd", "lce", "lcf", "lch", "lcl", "lcm", "lcp", "lcq", "lcs", "lda", "ldb", "ldd", "ldg", "ldh", "ldi", "ldj", "ldk", "ldl", "ldm", "ldn", "ldo", "ldp", "ldq", "lea", "leb", "lec", "led", "lee", "lef", "leg", "leh", "lei", "lej", "lek", "lel", "lem", "len", "leo", "lep", "leq", "ler", "les", "let", "leu", "lev", "lew", "lex", "ley", "lez", "lfa", "lfn", "lga", "lgb", "lgg", "lgh", "lgi", "lgk", "lgl", "lgm", "lgn", "lgq", "lgr", "lgt", "lgu", "lgz", "lha", "lhh", "lhi", "lhl", "lhm", "lhn", "lhp", "lhs", "lht", "lhu", "lia", "lib", "lic", "lid", "lie", "lif", "lig", "lih", "lii", "lij", "lik", "lil", "lio", "lip", "liq", "lir", "lis", "liu", "liv", "liw", "lix", "liy", "liz", "lja", "lje", "lji", "ljl", "ljp", "ljw", "ljx", "lka", "lkb", "lkc", "lkd", "lke", "lkh", "lki", "lkj", "lkl", "lkm", "lkn", "lko", "lkr", "lks", "lkt", "lku", "lky", "lla", "llb", "llc", "lld", "lle", "llf", "llg", "llh", "lli", "llj", "llk", "lll", "llm", "lln", "llo", "llp", "llq", "lls", "llu", "llx", "lma", "lmb", "lmc", "lmd", "lme", "lmf", "lmg", "lmh", "lmi", "lmj", "lmk", "lml", "lmm", "lmn", "lmo", "lmp", "lmq", "lmr", "lmu", "lmv", "lmw", "lmx", "lmy", "lmz", "lna", "lnb", "lnd", "lng", "lnh", "lni", "lnj", "lnl", "lnm", "lnn", "lno", "lns", "lnu", "lnw", "lnz", "loa", "lob", "loc", "loe", "lof", "log", "loh", "loi", "loj", "lok", "lol", "lom", "lon", "loo", "lop", "loq", "lor", "los", "lot", "lou", "lov", "low", "lox", "loy", "loz", "lpa", "lpe", "lpn", "lpo", "lpx", "lra", "lrc", "lre", "lrg", "lri", "lrk", "lrl", "lrm", "lrn", "lro", "lrr", "lrt", "lrv", "lrz", "lsa", "lsb", "lsd", "lse", "lsg", "lsh", "lsi", "lsl", "lsm", "lsn", "lso", "lsp", "lsr", "lss", "lst", "lsv", "lsy", "ltc", "ltg", "lth", "lti", "ltn", "lto", "lts", "ltu", "lua", "luc", "lud", "lue", "luf", "lui", "luj", "luk", "lul", "lum", "lun", "luo", "lup", "luq", "lur", "lus", "lut", "luu", "luv", "luw", "luy", "luz", "lva", "lvi", "lvk", "lvs", "lvu", "lwa", "lwe", "lwg", "lwh", "lwl", "lwm", "lwo", "lws", "lwt", "lwu", "lww", "lxm", "lya", "lyg", "lyn", "lzh", "lzl", "lzn", "lzz"], + ["mg", "mh", "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", "maa", "mab", "mad", "mae", "maf", "mag", "mai", "maj", "mak", "mam", "man", "map", "maq", "mas", "mat", "mau", "mav", "maw", "max", "maz", "mba", "mbb", "mbc", "mbd", "mbe", "mbf", "mbh", "mbi", "mbj", "mbk", "mbl", "mbm", "mbn", "mbo", "mbp", "mbq", "mbr", "mbs", "mbt", "mbu", "mbv", "mbw", "mbx", "mby", "mbz", "mca", "mcb", "mcc", "mcd", "mce", "mcf", "mcg", "mch", "mci", "mcj", "mck", "mcl", "mcm", "mcn", "mco", "mcp", "mcq", "mcr", "mcs", "mct", "mcu", "mcv", "mcw", "mcx", "mcy", "mcz", "mda", "mdb", "mdc", "mdd", "mde", "mdf", "mdg", "mdh", "mdi", "mdj", "mdk", "mdl", "mdm", "mdn", "mdp", "mdq", "mdr", "mds", "mdt", "mdu", "mdv", "mdw", "mdx", "mdy", "mdz", "mea", "meb", "mec", "med", "mee", "mef", "meg", "meh", "mei", "mej", "mek", "mel", "mem", "men", "meo", "mep", "meq", "mer", "mes", "met", "meu", "mev", "mew", "mey", "mez", "mfa", "mfb", "mfc", "mfd", "mfe", "mff", "mfg", "mfh", "mfi", "mfj", "mfk", "mfl", "mfm", "mfn", "mfo", "mfp", "mfq", "mfr", "mfs", "mft", "mfu", "mfv", "mfw", "mfx", "mfy", "mfz", "mga", "mgb", "mgc", "mgd", "mge", "mgf", "mgg", "mgh", "mgi", "mgj", "mgk", "mgl", "mgm", "mgn", "mgo", "mgp", "mgq", "mgr", "mgs", "mgt", "mgu", "mgv", "mgw", "mgx", "mgy", "mgz", "mha", "mhb", "mhc", "mhd", "mhe", "mhf", "mhg", "mhh", "mhi", "mhj", "mhk", "mhl", "mhm", "mhn", "mho", "mhp", "mhq", "mhr", "mhs", "mht", "mhu", "mhw", "mhx", "mhy", "mhz", "mia", "mib", "mic", "mid", "mie", "mif", "mig", "mih", "mii", "mij", "mik", "mil", "mim", "min", "mio", "mip", "miq", "mir", "mis", "mit", "miu", "miw", "mix", "miy", "miz", "mja", "mjb", "mjc", "mjd", "mje", "mjg", "mjh", "mji", "mjj", "mjk", "mjl", "mjm", "mjn", "mjo", "mjp", "mjq", "mjr", "mjs", "mjt", "mju", "mjv", "mjw", "mjx", "mjy", "mjz", "mka", "mkb", "mkc", "mke", "mkf", "mkg", "mkh", "mki", "mkj", "mkk", "mkl", "mkm", "mkn", "mko", "mkp", "mkq", "mkr", "mks", "mkt", "mku", "mkv", "mkw", "mkx", "mky", "mkz", "mla", "mlb", "mlc", "mld", "mle", "mlf", "mlh", "mli", "mlj", "mlk", "mll", "mlm", "mln", "mlo", "mlp", "mlq", "mlr", "mls", "mlu", "mlv", "mlw", "mlx", "mlz", "mma", "mmb", "mmc", "mmd", "mme", "mmf", "mmg", "mmh", "mmi", "mmj", "mmk", "mml", "mmm", "mmn", "mmo", "mmp", "mmq", "mmr", "mmt", "mmu", "mmv", "mmw", "mmx", "mmy", "mmz", "mna", "mnb", "mnc", "mnd", "mne", "mnf", "mng", "mnh", "mni", "mnj", "mnk", "mnl", "mnm", "mnn", "mno", "mnp", "mnq", "mnr", "mns", "mnt", "mnu", "mnv", "mnw", "mnx", "mny", "mnz", "moa", "moc", "mod", "moe", "mof", "mog", "moh", "moi", "moj", "mok", "mom", "moo", "mop", "moq", "mor", "mos", "mot", "mou", "mov", "mow", "mox", "moy", "moz", "mpa", "mpb", "mpc", "mpd", "mpe", "mpg", "mph", "mpi", "mpj", "mpk", "mpl", "mpm", "mpn", "mpo", "mpp", "mpq", "mpr", "mps", "mpt", "mpu", "mpv", "mpw", "mpx", "mpy", "mpz", "mqa", "mqb", "mqc", "mqe", "mqf", "mqg", "mqh", "mqi", "mqj", "mqk", "mql", "mqm", "mqn", "mqo", "mqp", "mqq", "mqr", "mqs", "mqt", "mqu", "mqv", "mqw", "mqx", "mqy", "mqz", "mra", "mrb", "mrc", "mrd", "mre", "mrf", "mrg", "mrh", "mrj", "mrk", "mrl", "mrm", "mrn", "mro", "mrp", "mrq", "mrr", "mrs", "mrt", "mru", "mrv", "mrw", "mrx", "mry", "mrz", "msb", "msc", "msd", "mse", "msf", "msg", "msh", "msi", "msj", "msk", "msl", "msm", "msn", "mso", "msp", "msq", "msr", "mss", "mst", "msu", "msv", "msw", "msx", "msy", "msz", "mta", "mtb", "mtc", "mtd", "mte", "mtf", "mtg", "mth", "mti", "mtj", "mtk", "mtl", "mtm", "mtn", "mto", "mtp", "mtq", "mtr", "mts", "mtt", "mtu", "mtv", "mtw", "mtx", "mty", "mua", "mub", "muc", "mud", "mue", "mug", "muh", "mui", "muj", "muk", "mul", "mum", "mun", "muo", "mup", "muq", "mur", "mus", "mut", "muu", "muv", "mux", "muy", "muz", "mva", "mvb", "mvd", "mve", "mvf", "mvg", "mvh", "mvi", "mvk", "mvl", "mvm", "mvn", "mvo", "mvp", "mvq", "mvr", "mvs", "mvt", "mvu", "mvv", "mvw", "mvx", "mvy", "mvz", "mwa", "mwb", "mwc", "mwd", "mwe", "mwf", "mwg", "mwh", "mwi", "mwj", "mwk", "mwl", "mwm", "mwn", "mwo", "mwp", "mwq", "mwr", "mws", "mwt", "mwu", "mwv", "mww", "mwx", "mwy", "mwz", "mxa", "mxb", "mxc", "mxd", "mxe", "mxf", "mxg", "mxh", "mxi", "mxj", "mxk", "mxl", "mxm", "mxn", "mxo", "mxp", "mxq", "mxr", "mxs", "mxt", "mxu", "mxv", "mxw", "mxx", "mxy", "mxz", "myb", "myc", "myd", "mye", "myf", "myg", "myh", "myi", "myj", "myk", "myl", "mym", "myn", "myo", "myp", "myq", "myr", "mys", "myt", "myu", "myv", "myw", "myx", "myy", "myz", "mza", "mzb", "mzc", "mzd", "mze", "mzg", "mzh", "mzi", "mzj", "mzk", "mzl", "mzm", "mzn", "mzo", "mzp", "mzq", "mzr", "mzs", "mzt", "mzu", "mzv", "mzw", "mzx", "mzy", "mzz"], + ["na", "nb", "nd", "ne", "ng", "nl", "nn", "no", "nr", "nv", "ny", "naa", "nab", "nac", "nad", "nae", "naf", "nag", "nah", "nai", "naj", "nak", "nal", "nam", "nan", "nao", "nap", "naq", "nar", "nas", "nat", "naw", "nax", "nay", "naz", "nba", "nbb", "nbc", "nbd", "nbe", "nbf", "nbg", "nbh", "nbi", "nbj", "nbk", "nbm", "nbn", "nbo", "nbp", "nbq", "nbr", "nbs", "nbt", "nbu", "nbv", "nbw", "nbx", "nby", "nca", "ncb", "ncc", "ncd", "nce", "ncf", "ncg", "nch", "nci", "ncj", "nck", "ncl", "ncm", "ncn", "nco", "ncp", "ncq", "ncr", "ncs", "nct", "ncu", "ncx", "ncz", "nda", "ndb", "ndc", "ndd", "ndf", "ndg", "ndh", "ndi", "ndj", "ndk", "ndl", "ndm", "ndn", "ndp", "ndq", "ndr", "nds", "ndt", "ndu", "ndv", "ndw", "ndx", "ndy", "ndz", "nea", "neb", "nec", "ned", "nee", "nef", "neg", "neh", "nei", "nej", "nek", "nem", "nen", "neo", "neq", "ner", "nes", "net", "neu", "nev", "new", "nex", "ney", "nez", "nfa", "nfd", "nfl", "nfr", "nfu", "nga", "ngb", "ngc", "ngd", "nge", "ngf", "ngg", "ngh", "ngi", "ngj", "ngk", "ngl", "ngm", "ngn", "ngo", "ngp", "ngq", "ngr", "ngs", "ngt", "ngu", "ngv", "ngw", "ngx", "ngy", "ngz", "nha", "nhb", "nhc", "nhd", "nhe", "nhf", "nhg", "nhh", "nhi", "nhk", "nhm", "nhn", "nho", "nhp", "nhq", "nhr", "nht", "nhu", "nhv", "nhw", "nhx", "nhy", "nhz", "nia", "nib", "nic", "nid", "nie", "nif", "nig", "nih", "nii", "nij", "nik", "nil", "nim", "nin", "nio", "niq", "nir", "nis", "nit", "niu", "niv", "niw", "nix", "niy", "niz", "nja", "njb", "njd", "njh", "nji", "njj", "njl", "njm", "njn", "njo", "njr", "njs", "njt", "nju", "njx", "njy", "njz", "nka", "nkb", "nkc", "nkd", "nke", "nkf", "nkg", "nkh", "nki", "nkj", "nkk", "nkm", "nkn", "nko", "nkp", "nkq", "nkr", "nks", "nkt", "nku", "nkv", "nkw", "nkx", "nkz", "nla", "nlc", "nle", "nlg", "nli", "nlj", "nlk", "nll", "nlm", "nln", "nlo", "nlq", "nlr", "nlu", "nlv", "nlw", "nlx", "nly", "nlz", "nma", "nmb", "nmc", "nmd", "nme", "nmf", "nmg", "nmh", "nmi", "nmj", "nmk", "nml", "nmm", "nmn", "nmo", "nmp", "nmq", "nmr", "nms", "nmt", "nmu", "nmv", "nmw", "nmx", "nmy", "nmz", "nna", "nnb", "nnc", "nnd", "nne", "nnf", "nng", "nnh", "nni", "nnj", "nnk", "nnl", "nnm", "nnn", "nnp", "nnq", "nnr", "nns", "nnt", "nnu", "nnv", "nnw", "nnx", "nny", "nnz", "noa", "noc", "nod", "noe", "nof", "nog", "noh", "noi", "noj", "nok", "nol", "nom", "non", "noo", "nop", "noq", "nos", "not", "nou", "nov", "now", "noy", "noz", "npa", "npb", "npg", "nph", "npi", "npl", "npn", "npo", "nps", "npu", "npx", "npy", "nqg", "nqk", "nql", "nqm", "nqn", "nqo", "nqq", "nqt", "nqy", "nra", "nrb", "nrc", "nre", "nrf", "nrg", "nri", "nrk", "nrl", "nrm", "nrn", "nrp", "nrr", "nrt", "nru", "nrx", "nrz", "nsa", "nsb", "nsc", "nsd", "nse", "nsf", "nsg", "nsh", "nsi", "nsk", "nsl", "nsm", "nsn", "nso", "nsp", "nsq", "nsr", "nss", "nst", "nsu", "nsv", "nsw", "nsx", "nsy", "nsz", "ntd", "nte", "ntg", "nti", "ntj", "ntk", "ntm", "nto", "ntp", "ntr", "nts", "ntu", "ntw", "ntx", "nty", "ntz", "nua", "nub", "nuc", "nud", "nue", "nuf", "nug", "nuh", "nui", "nuj", "nuk", "nul", "num", "nun", "nuo", "nup", "nuq", "nur", "nus", "nut", "nuu", "nuv", "nuw", "nux", "nuy", "nuz", "nvh", "nvm", "nvo", "nwa", "nwb", "nwc", "nwe", "nwg", "nwi", "nwm", "nwo", "nwr", "nwx", "nwy", "nxa", "nxd", "nxe", "nxg", "nxi", "nxk", "nxl", "nxm", "nxn", "nxo", "nxq", "nxr", "nxu", "nxx", "nyb", "nyc", "nyd", "nye", "nyf", "nyg", "nyh", "nyi", "nyj", "nyk", "nyl", "nym", "nyn", "nyo", "nyp", "nyq", "nyr", "nys", "nyt", "nyu", "nyv", "nyw", "nyx", "nyy", "nza", "nzb", "nzd", "nzi", "nzk", "nzm", "nzs", "nzu", "nzy", "nzz"], + ["oc", "oj", "om", "or", "os", "oaa", "oac", "oar", "oav", "obi", "obk", "obl", "obm", "obo", "obr", "obt", "obu", "oca", "och", "ocm", "oco", "ocu", "oda", "odk", "odt", "odu", "ofo", "ofs", "ofu", "ogb", "ogc", "oge", "ogg", "ogo", "ogu", "oht", "ohu", "oia", "oin", "ojb", "ojc", "ojg", "ojp", "ojs", "ojv", "ojw", "oka", "okb", "okc", "okd", "oke", "okg", "okh", "oki", "okj", "okk", "okl", "okm", "okn", "oko", "okr", "oks", "oku", "okv", "okx", "okz", "ola", "old", "ole", "olk", "olm", "olo", "olr", "olt", "olu", "oma", "omb", "omc", "ome", "omg", "omi", "omk", "oml", "omn", "omo", "omp", "omq", "omr", "omt", "omu", "omv", "omw", "omx", "omy", "ona", "onb", "one", "ong", "oni", "onj", "onk", "onn", "ono", "onp", "onr", "ons", "ont", "onu", "onw", "onx", "ood", "oog", "oon", "oor", "oos", "opa", "opk", "opm", "opo", "opt", "opy", "ora", "orc", "ore", "org", "orh", "orn", "oro", "orr", "ors", "ort", "oru", "orv", "orw", "orx", "ory", "orz", "osa", "osc", "osi", "osn", "oso", "osp", "ost", "osu", "osx", "ota", "otb", "otd", "ote", "oti", "otk", "otl", "otm", "otn", "oto", "otq", "otr", "ots", "ott", "otu", "otw", "otx", "oty", "otz", "oua", "oub", "oue", "oui", "oum", "oun", "ovd", "owi", "owl", "oyb", "oyd", "oym", "oyy", "ozm"], + ["pa", "pi", "pl", "ps", "pt", "paa", "pab", "pac", "pad", "pae", "paf", "pag", "pah", "pai", "pak", "pal", "pam", "pao", "pap", "paq", "par", "pas", "pat", "pau", "pav", "paw", "pax", "pay", "paz", "pbb", "pbc", "pbe", "pbf", "pbg", "pbh", "pbi", "pbl", "pbm", "pbn", "pbo", "pbp", "pbr", "pbs", "pbt", "pbu", "pbv", "pby", "pbz", "pca", "pcb", "pcc", "pcd", "pce", "pcf", "pcg", "pch", "pci", "pcj", "pck", "pcl", "pcm", "pcn", "pcp", "pcr", "pcw", "pda", "pdc", "pdi", "pdn", "pdo", "pdt", "pdu", "pea", "peb", "ped", "pee", "pef", "peg", "peh", "pei", "pej", "pek", "pel", "pem", "peo", "pep", "peq", "pes", "pev", "pex", "pey", "pez", "pfa", "pfe", "pfl", "pga", "pgd", "pgg", "pgi", "pgk", "pgl", "pgn", "pgs", "pgu", "pgy", "pgz", "pha", "phd", "phg", "phh", "phi", "phk", "phl", "phm", "phn", "pho", "phq", "phr", "pht", "phu", "phv", "phw", "pia", "pib", "pic", "pid", "pie", "pif", "pig", "pih", "pii", "pij", "pil", "pim", "pin", "pio", "pip", "pir", "pis", "pit", "piu", "piv", "piw", "pix", "piy", "piz", "pjt", "pka", "pkb", "pkc", "pkg", "pkh", "pkn", "pko", "pkp", "pkr", "pks", "pkt", "pku", "pla", "plb", "plc", "pld", "ple", "plf", "plg", "plh", "plj", "plk", "pll", "pln", "plo", "plp", "plq", "plr", "pls", "plt", "plu", "plv", "plw", "ply", "plz", "pma", "pmb", "pmc", "pmd", "pme", "pmf", "pmh", "pmi", "pmj", "pmk", "pml", "pmm", "pmn", "pmo", "pmq", "pmr", "pms", "pmt", "pmu", "pmw", "pmx", "pmy", "pmz", "pna", "pnb", "pnc", "pnd", "pne", "png", "pnh", "pni", "pnj", "pnk", "pnl", "pnm", "pnn", "pno", "pnp", "pnq", "pnr", "pns", "pnt", "pnu", "pnv", "pnw", "pnx", "pny", "pnz", "poc", "pod", "poe", "pof", "pog", "poh", "poi", "pok", "pom", "pon", "poo", "pop", "poq", "pos", "pot", "pov", "pow", "pox", "poy", "poz", "ppa", "ppe", "ppi", "ppk", "ppl", "ppm", "ppn", "ppo", "ppp", "ppq", "ppr", "pps", "ppt", "ppu", "pqa", "pqe", "pqm", "pqw", "pra", "prb", "prc", "prd", "pre", "prf", "prg", "prh", "pri", "prk", "prl", "prm", "prn", "pro", "prp", "prq", "prr", "prs", "prt", "pru", "prw", "prx", "pry", "prz", "psa", "psc", "psd", "pse", "psg", "psh", "psi", "psl", "psm", "psn", "pso", "psp", "psq", "psr", "pss", "pst", "psu", "psw", "psy", "pta", "pth", "pti", "ptn", "pto", "ptp", "ptq", "ptr", "ptt", "ptu", "ptv", "ptw", "pty", "pua", "pub", "puc", "pud", "pue", "puf", "pug", "pui", "puj", "puk", "pum", "puo", "pup", "puq", "pur", "put", "puu", "puw", "pux", "puy", "puz", "pwa", "pwb", "pwg", "pwi", "pwm", "pwn", "pwo", "pwr", "pww", "pxm", "pye", "pym", "pyn", "pys", "pyu", "pyx", "pyy", "pzn"], + ["qu", "qua", "qub", "quc", "qud", "quf", "qug", "quh", "qui", "quk", "qul", "qum", "qun", "qup", "quq", "qur", "qus", "quv", "quw", "qux", "quy", "quz", "qva", "qvc", "qve", "qvh", "qvi", "qvj", "qvl", "qvm", "qvn", "qvo", "qvp", "qvs", "qvw", "qvy", "qvz", "qwa", "qwc", "qwe", "qwh", "qwm", "qws", "qwt", "qxa", "qxc", "qxh", "qxl", "qxn", "qxo", "qxp", "qxq", "qxr", "qxs", "qxt", "qxu", "qxw", "qya", "qyp"], + ["rm", "rn", "ro", "ru", "rw", "raa", "rab", "rac", "rad", "raf", "rag", "rah", "rai", "raj", "rak", "ral", "ram", "ran", "rao", "rap", "raq", "rar", "ras", "rat", "rau", "rav", "raw", "rax", "ray", "raz", "rbb", "rbk", "rbl", "rbp", "rcf", "rdb", "rea", "reb", "ree", "reg", "rei", "rej", "rel", "rem", "ren", "rer", "res", "ret", "rey", "rga", "rge", "rgk", "rgn", "rgr", "rgs", "rgu", "rhg", "rhp", "ria", "rie", "rif", "ril", "rim", "rin", "rir", "rit", "riu", "rjg", "rji", "rjs", "rka", "rkb", "rkh", "rki", "rkm", "rkt", "rkw", "rma", "rmb", "rmc", "rmd", "rme", "rmf", "rmg", "rmh", "rmi", "rmk", "rml", "rmm", "rmn", "rmo", "rmp", "rmq", "rmr", "rms", "rmt", "rmu", "rmv", "rmw", "rmx", "rmy", "rmz", "rna", "rnd", "rng", "rnl", "rnn", "rnp", "rnr", "rnw", "roa", "rob", "roc", "rod", "roe", "rof", "rog", "rol", "rom", "roo", "rop", "ror", "rou", "row", "rpn", "rpt", "rri", "rro", "rrt", "rsb", "rsi", "rsl", "rsm", "rtc", "rth", "rtm", "rts", "rtw", "rub", "ruc", "rue", "ruf", "rug", "ruh", "rui", "ruk", "ruo", "rup", "ruq", "rut", "ruu", "ruy", "ruz", "rwa", "rwk", "rwl", "rwm", "rwo", "rwr", "rxd", "rxw", "ryn", "rys", "ryu", "rzh"], + ["sa", "sc", "sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr", "ss", "st", "su", "sv", "sw", "saa", "sab", "sac", "sad", "sae", "saf", "sah", "sai", "saj", "sak", "sal", "sam", "sao", "sap", "saq", "sar", "sas", "sat", "sau", "sav", "saw", "sax", "say", "saz", "sba", "sbb", "sbc", "sbd", "sbe", "sbf", "sbg", "sbh", "sbi", "sbj", "sbk", "sbl", "sbm", "sbn", "sbo", "sbp", "sbq", "sbr", "sbs", "sbt", "sbu", "sbv", "sbw", "sbx", "sby", "sbz", "sca", "scb", "sce", "scf", "scg", "sch", "sci", "sck", "scl", "scn", "sco", "scp", "scq", "scs", "sct", "scu", "scv", "scw", "scx", "sda", "sdb", "sdc", "sde", "sdf", "sdg", "sdh", "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "sds", "sdt", "sdu", "sdv", "sdx", "sdz", "sea", "seb", "sec", "sed", "see", "sef", "seg", "seh", "sei", "sej", "sek", "sel", "sem", "sen", "seo", "sep", "seq", "ser", "ses", "set", "seu", "sev", "sew", "sey", "sez", "sfb", "sfe", "sfm", "sfs", "sfw", "sga", "sgb", "sgc", "sgd", "sge", "sgg", "sgh", "sgi", "sgj", "sgk", "sgl", "sgm", "sgn", "sgo", "sgp", "sgr", "sgs", "sgt", "sgu", "sgw", "sgx", "sgy", "sgz", "sha", "shb", "shc", "shd", "she", "shg", "shh", "shi", "shj", "shk", "shl", "shm", "shn", "sho", "shp", "shq", "shr", "shs", "sht", "shu", "shv", "shw", "shx", "shy", "shz", "sia", "sib", "sid", "sie", "sif", "sig", "sih", "sii", "sij", "sik", "sil", "sim", "sio", "sip", "siq", "sir", "sis", "sit", "siu", "siv", "siw", "six", "siy", "siz", "sja", "sjb", "sjd", "sje", "sjg", "sjk", "sjl", "sjm", "sjn", "sjo", "sjp", "sjr", "sjs", "sjt", "sju", "sjw", "ska", "skb", "skc", "skd", "ske", "skf", "skg", "skh", "ski", "skj", "skk", "skm", "skn", "sko", "skp", "skq", "skr", "sks", "skt", "sku", "skv", "skw", "skx", "sky", "skz", "sla", "slc", "sld", "sle", "slf", "slg", "slh", "sli", "slj", "sll", "slm", "sln", "slp", "slq", "slr", "sls", "slt", "slu", "slw", "slx", "sly", "slz", "sma", "smb", "smc", "smd", "smf", "smg", "smh", "smi", "smj", "smk", "sml", "smm", "smn", "smp", "smq", "smr", "sms", "smt", "smu", "smv", "smw", "smx", "smy", "smz", "snb", "snc", "sne", "snf", "sng", "snh", "sni", "snj", "snk", "snl", "snm", "snn", "sno", "snp", "snq", "snr", "sns", "snu", "snv", "snw", "snx", "sny", "snz", "soa", "sob", "soc", "sod", "soe", "sog", "soh", "soi", "soj", "sok", "sol", "son", "soo", "sop", "soq", "sor", "sos", "sou", "sov", "sow", "sox", "soy", "soz", "spb", "spc", "spd", "spe", "spg", "spi", "spk", "spl", "spm", "spn", "spo", "spp", "spq", "spr", "sps", "spt", "spu", "spv", "spx", "spy", "sqa", "sqh", "sqj", "sqk", "sqm", "sqn", "sqo", "sqq", "sqr", "sqs", "sqt", "squ", "sqx", "sra", "srb", "src", "sre", "srf", "srg", "srh", "sri", "srk", "srl", "srm", "srn", "sro", "srq", "srr", "srs", "srt", "sru", "srv", "srw", "srx", "sry", "srz", "ssa", "ssb", "ssc", "ssd", "sse", "ssf", "ssg", "ssh", "ssi", "ssj", "ssk", "ssl", "ssm", "ssn", "sso", "ssp", "ssq", "ssr", "sss", "sst", "ssu", "ssv", "ssx", "ssy", "ssz", "sta", "stb", "std", "ste", "stf", "stg", "sth", "sti", "stj", "stk", "stl", "stm", "stn", "sto", "stp", "stq", "str", "sts", "stt", "stu", "stv", "stw", "sty", "sua", "sub", "suc", "sue", "sug", "sui", "suj", "suk", "sul", "sum", "suo", "suq", "sur", "sus", "sut", "suv", "suw", "sux", "suy", "suz", "sva", "svb", "svc", "sve", "svk", "svm", "svr", "svs", "svx", "swb", "swc", "swf", "swg", "swh", "swi", "swj", "swk", "swl", "swm", "swn", "swo", "swp", "swq", "swr", "sws", "swt", "swu", "swv", "sww", "swx", "swy", "sxb", "sxc", "sxe", "sxg", "sxk", "sxl", "sxm", "sxn", "sxo", "sxr", "sxs", "sxu", "sxw", "sya", "syb", "syc", "syd", "syi", "syk", "syl", "sym", "syn", "syo", "syr", "sys", "syw", "syx", "syy", "sza", "szb", "szc", "szd", "sze", "szg", "szl", "szn", "szp", "szs", "szv", "szw", "szy"], + ["ta", "te", "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "taa", "tab", "tac", "tad", "tae", "taf", "tag", "tai", "taj", "tak", "tal", "tan", "tao", "tap", "taq", "tar", "tas", "tau", "tav", "taw", "tax", "tay", "taz", "tba", "tbb", "tbc", "tbd", "tbe", "tbf", "tbg", "tbh", "tbi", "tbj", "tbk", "tbl", "tbm", "tbn", "tbo", "tbp", "tbq", "tbr", "tbs", "tbt", "tbu", "tbv", "tbw", "tbx", "tby", "tbz", "tca", "tcb", "tcc", "tcd", "tce", "tcf", "tcg", "tch", "tci", "tck", "tcl", "tcm", "tcn", "tco", "tcp", "tcq", "tcs", "tct", "tcu", "tcw", "tcx", "tcy", "tcz", "tda", "tdb", "tdc", "tdd", "tde", "tdf", "tdg", "tdh", "tdi", "tdj", "tdk", "tdl", "tdm", "tdn", "tdo", "tdq", "tdr", "tds", "tdt", "tdu", "tdv", "tdx", "tdy", "tea", "teb", "tec", "ted", "tee", "tef", "teg", "teh", "tei", "tek", "tem", "ten", "teo", "tep", "teq", "ter", "tes", "tet", "teu", "tev", "tew", "tex", "tey", "tez", "tfi", "tfn", "tfo", "tfr", "tft", "tga", "tgb", "tgc", "tgd", "tge", "tgf", "tgg", "tgh", "tgi", "tgj", "tgn", "tgo", "tgp", "tgq", "tgr", "tgs", "tgt", "tgu", "tgv", "tgw", "tgx", "tgy", "tgz", "thc", "thd", "the", "thf", "thh", "thi", "thk", "thl", "thm", "thn", "thp", "thq", "thr", "ths", "tht", "thu", "thv", "thw", "thx", "thy", "thz", "tia", "tic", "tid", "tie", "tif", "tig", "tih", "tii", "tij", "tik", "til", "tim", "tin", "tio", "tip", "tiq", "tis", "tit", "tiu", "tiv", "tiw", "tix", "tiy", "tiz", "tja", "tjg", "tji", "tjj", "tjl", "tjm", "tjn", "tjo", "tjp", "tjs", "tju", "tjw", "tka", "tkb", "tkd", "tke", "tkf", "tkg", "tkk", "tkl", "tkm", "tkn", "tkp", "tkq", "tkr", "tks", "tkt", "tku", "tkv", "tkw", "tkx", "tkz", "tla", "tlb", "tlc", "tld", "tlf", "tlg", "tlh", "tli", "tlj", "tlk", "tll", "tlm", "tln", "tlo", "tlp", "tlq", "tlr", "tls", "tlt", "tlu", "tlv", "tlw", "tlx", "tly", "tma", "tmb", "tmc", "tmd", "tme", "tmf", "tmg", "tmh", "tmi", "tmj", "tmk", "tml", "tmm", "tmn", "tmo", "tmp", "tmq", "tmr", "tms", "tmt", "tmu", "tmv", "tmw", "tmy", "tmz", "tna", "tnb", "tnc", "tnd", "tne", "tnf", "tng", "tnh", "tni", "tnk", "tnl", "tnm", "tnn", "tno", "tnp", "tnq", "tnr", "tns", "tnt", "tnu", "tnv", "tnw", "tnx", "tny", "tnz", "tob", "toc", "tod", "toe", "tof", "tog", "toh", "toi", "toj", "tol", "tom", "too", "top", "toq", "tor", "tos", "tou", "tov", "tow", "tox", "toy", "toz", "tpa", "tpc", "tpe", "tpf", "tpg", "tpi", "tpj", "tpk", "tpl", "tpm", "tpn", "tpo", "tpp", "tpq", "tpr", "tpt", "tpu", "tpv", "tpw", "tpx", "tpy", "tpz", "tqb", "tql", "tqm", "tqn", "tqo", "tqp", "tqq", "tqr", "tqt", "tqu", "tqw", "tra", "trb", "trc", "trd", "tre", "trf", "trg", "trh", "tri", "trj", "trk", "trl", "trm", "trn", "tro", "trp", "trq", "trr", "trs", "trt", "tru", "trv", "trw", "trx", "try", "trz", "tsa", "tsb", "tsc", "tsd", "tse", "tsf", "tsg", "tsh", "tsi", "tsj", "tsk", "tsl", "tsm", "tsp", "tsq", "tsr", "tss", "tst", "tsu", "tsv", "tsw", "tsx", "tsy", "tsz", "tta", "ttb", "ttc", "ttd", "tte", "ttf", "ttg", "tth", "tti", "ttj", "ttk", "ttl", "ttm", "ttn", "tto", "ttp", "ttq", "ttr", "tts", "ttt", "ttu", "ttv", "ttw", "tty", "ttz", "tua", "tub", "tuc", "tud", "tue", "tuf", "tug", "tuh", "tui", "tuj", "tul", "tum", "tun", "tuo", "tup", "tuq", "tus", "tut", "tuu", "tuv", "tuw", "tux", "tuy", "tuz", "tva", "tvd", "tve", "tvk", "tvl", "tvm", "tvn", "tvo", "tvs", "tvt", "tvu", "tvw", "tvx", "tvy", "twa", "twb", "twc", "twd", "twe", "twf", "twg", "twh", "twl", "twm", "twn", "two", "twp", "twq", "twr", "twt", "twu", "tww", "twx", "twy", "txa", "txb", "txc", "txe", "txg", "txh", "txi", "txj", "txm", "txn", "txo", "txq", "txr", "txs", "txt", "txu", "txx", "txy", "tya", "tye", "tyh", "tyi", "tyj", "tyl", "tyn", "typ", "tyr", "tys", "tyt", "tyu", "tyv", "tyx", "tyy", "tyz", "tza", "tzh", "tzj", "tzl", "tzm", "tzn", "tzo", "tzx"], + ["ug", "uk", "ur", "uz", "uam", "uan", "uar", "uba", "ubi", "ubl", "ubr", "ubu", "uby", "uda", "ude", "udg", "udi", "udj", "udl", "udm", "udu", "ues", "ufi", "uga", "ugb", "uge", "ugn", "ugo", "ugy", "uha", "uhn", "uis", "uiv", "uji", "uka", "ukg", "ukh", "uki", "ukk", "ukl", "ukp", "ukq", "uks", "uku", "ukv", "ukw", "uky", "ula", "ulb", "ulc", "ule", "ulf", "uli", "ulk", "ull", "ulm", "uln", "ulu", "ulw", "uma", "umb", "umc", "umd", "umg", "umi", "umm", "umn", "umo", "ump", "umr", "ums", "umu", "una", "und", "une", "ung", "uni", "unk", "unm", "unn", "unp", "unr", "unu", "unx", "unz", "uok", "upi", "upv", "ura", "urb", "urc", "ure", "urf", "urg", "urh", "uri", "urj", "urk", "url", "urm", "urn", "uro", "urp", "urr", "urt", "uru", "urv", "urw", "urx", "ury", "urz", "usa", "ush", "usi", "usk", "usp", "uss", "usu", "uta", "ute", "uth", "utp", "utr", "utu", "uum", "uun", "uur", "uuu", "uve", "uvh", "uvl", "uwa", "uya", "uzn", "uzs"], + ["ve", "vi", "vo", "vaa", "vae", "vaf", "vag", "vah", "vai", "vaj", "val", "vam", "van", "vao", "vap", "var", "vas", "vau", "vav", "vay", "vbb", "vbk", "vec", "ved", "vel", "vem", "veo", "vep", "ver", "vgr", "vgt", "vic", "vid", "vif", "vig", "vil", "vin", "vis", "vit", "viv", "vka", "vki", "vkj", "vkk", "vkl", "vkm", "vkn", "vko", "vkp", "vkt", "vku", "vkz", "vlp", "vls", "vma", "vmb", "vmc", "vmd", "vme", "vmf", "vmg", "vmh", "vmi", "vmj", "vmk", "vml", "vmm", "vmp", "vmq", "vmr", "vms", "vmu", "vmv", "vmw", "vmx", "vmy", "vmz", "vnk", "vnm", "vnp", "vor", "vot", "vra", "vro", "vrs", "vrt", "vsi", "vsl", "vsv", "vto", "vum", "vun", "vut", "vwa"], + ["wa", "wo", "waa", "wab", "wac", "wad", "wae", "waf", "wag", "wah", "wai", "waj", "wak", "wal", "wam", "wan", "wao", "wap", "waq", "war", "was", "wat", "wau", "wav", "waw", "wax", "way", "waz", "wba", "wbb", "wbe", "wbf", "wbh", "wbi", "wbj", "wbk", "wbl", "wbm", "wbp", "wbq", "wbr", "wbs", "wbt", "wbv", "wbw", "wca", "wci", "wdd", "wdg", "wdj", "wdk", "wdu", "wdy", "wea", "wec", "wed", "weg", "weh", "wei", "wem", "wen", "weo", "wep", "wer", "wes", "wet", "weu", "wew", "wfg", "wga", "wgb", "wgg", "wgi", "wgo", "wgu", "wgw", "wgy", "wha", "whg", "whk", "whu", "wib", "wic", "wie", "wif", "wig", "wih", "wii", "wij", "wik", "wil", "wim", "win", "wir", "wit", "wiu", "wiv", "wiw", "wiy", "wja", "wji", "wka", "wkb", "wkd", "wkl", "wkr", "wku", "wkw", "wky", "wla", "wlc", "wle", "wlg", "wlh", "wli", "wlk", "wll", "wlm", "wlo", "wlr", "wls", "wlu", "wlv", "wlw", "wlx", "wly", "wma", "wmb", "wmc", "wmd", "wme", "wmg", "wmh", "wmi", "wmm", "wmn", "wmo", "wms", "wmt", "wmw", "wmx", "wnb", "wnc", "wnd", "wne", "wng", "wni", "wnk", "wnm", "wnn", "wno", "wnp", "wnu", "wnw", "wny", "woa", "wob", "woc", "wod", "woe", "wof", "wog", "woi", "wok", "wom", "won", "woo", "wor", "wos", "wow", "woy", "wpc", "wra", "wrb", "wrd", "wrg", "wrh", "wri", "wrk", "wrl", "wrm", "wrn", "wro", "wrp", "wrr", "wrs", "wru", "wrv", "wrw", "wrx", "wry", "wrz", "wsa", "wsg", "wsi", "wsk", "wsr", "wss", "wsu", "wsv", "wtf", "wth", "wti", "wtk", "wtm", "wtw", "wua", "wub", "wud", "wuh", "wul", "wum", "wun", "wur", "wut", "wuu", "wuv", "wux", "wuy", "wwa", "wwb", "wwo", "wwr", "www", "wxa", "wxw", "wya", "wyb", "wyi", "wym", "wyr", "wyy"], + ["xh", "xaa", "xab", "xac", "xad", "xae", "xag", "xai", "xaj", "xak", "xal", "xam", "xan", "xao", "xap", "xaq", "xar", "xas", "xat", "xau", "xav", "xaw", "xay", "xba", "xbb", "xbc", "xbd", "xbe", "xbg", "xbi", "xbj", "xbm", "xbn", "xbo", "xbp", "xbr", "xbw", "xbx", "xby", "xcb", "xcc", "xce", "xcg", "xch", "xcl", "xcm", "xcn", "xco", "xcr", "xct", "xcu", "xcv", "xcw", "xcy", "xda", "xdc", "xdk", "xdm", "xdo", "xdy", "xeb", "xed", "xeg", "xel", "xem", "xep", "xer", "xes", "xet", "xeu", "xfa", "xga", "xgb", "xgd", "xgf", "xgg", "xgi", "xgl", "xgm", "xgn", "xgr", "xgu", "xgw", "xha", "xhc", "xhd", "xhe", "xhr", "xht", "xhu", "xhv", "xia", "xib", "xii", "xil", "xin", "xip", "xir", "xis", "xiv", "xiy", "xjb", "xjt", "xka", "xkb", "xkc", "xkd", "xke", "xkf", "xkg", "xkh", "xki", "xkj", "xkk", "xkl", "xkn", "xko", "xkp", "xkq", "xkr", "xks", "xkt", "xku", "xkv", "xkw", "xkx", "xky", "xkz", "xla", "xlb", "xlc", "xld", "xle", "xlg", "xli", "xln", "xlo", "xlp", "xls", "xlu", "xly", "xma", "xmb", "xmc", "xmd", "xme", "xmf", "xmg", "xmh", "xmj", "xmk", "xml", "xmm", "xmn", "xmo", "xmp", "xmq", "xmr", "xms", "xmt", "xmu", "xmv", "xmw", "xmx", "xmy", "xmz", "xna", "xnb", "xnd", "xng", "xnh", "xni", "xnj", "xnk", "xnm", "xnn", "xno", "xnq", "xnr", "xns", "xnt", "xnu", "xny", "xnz", "xoc", "xod", "xog", "xoi", "xok", "xom", "xon", "xoo", "xop", "xor", "xow", "xpa", "xpb", "xpc", "xpd", "xpe", "xpf", "xpg", "xph", "xpi", "xpj", "xpk", "xpl", "xpm", "xpn", "xpo", "xpp", "xpq", "xpr", "xps", "xpt", "xpu", "xpv", "xpw", "xpx", "xpy", "xpz", "xqa", "xqt", "xra", "xrb", "xrd", "xre", "xrg", "xri", "xrm", "xrn", "xrq", "xrr", "xrt", "xru", "xrw", "xsa", "xsb", "xsc", "xsd", "xse", "xsh", "xsi", "xsj", "xsl", "xsm", "xsn", "xso", "xsp", "xsq", "xsr", "xss", "xsu", "xsv", "xsy", "xta", "xtb", "xtc", "xtd", "xte", "xtg", "xth", "xti", "xtj", "xtl", "xtm", "xtn", "xto", "xtp", "xtq", "xtr", "xts", "xtt", "xtu", "xtv", "xtw", "xty", "xtz", "xua", "xub", "xud", "xug", "xuj", "xul", "xum", "xun", "xuo", "xup", "xur", "xut", "xuu", "xve", "xvi", "xvn", "xvo", "xvs", "xwa", "xwc", "xwd", "xwe", "xwg", "xwj", "xwk", "xwl", "xwo", "xwr", "xwt", "xww", "xxb", "xxk", "xxm", "xxr", "xxt", "xya", "xyb", "xyj", "xyk", "xyl", "xyt", "xyy", "xzh", "xzm", "xzp"], + ["yi", "yo", "yaa", "yab", "yac", "yad", "yae", "yaf", "yag", "yah", "yai", "yaj", "yak", "yal", "yam", "yan", "yao", "yap", "yaq", "yar", "yas", "yat", "yau", "yav", "yaw", "yax", "yay", "yaz", "yba", "ybb", "ybd", "ybe", "ybh", "ybi", "ybj", "ybk", "ybl", "ybm", "ybn", "ybo", "ybx", "yby", "ych", "ycl", "ycn", "ycp", "yda", "ydd", "yde", "ydg", "ydk", "yds", "yea", "yec", "yee", "yei", "yej", "yel", "yen", "yer", "yes", "yet", "yeu", "yev", "yey", "yga", "ygi", "ygl", "ygm", "ygp", "ygr", "ygs", "ygu", "ygw", "yha", "yhd", "yhl", "yhs", "yia", "yif", "yig", "yih", "yii", "yij", "yik", "yil", "yim", "yin", "yip", "yiq", "yir", "yis", "yit", "yiu", "yiv", "yix", "yiy", "yiz", "yka", "ykg", "yki", "ykk", "ykl", "ykm", "ykn", "yko", "ykr", "ykt", "yku", "yky", "yla", "ylb", "yle", "ylg", "yli", "yll", "ylm", "yln", "ylo", "ylr", "ylu", "yly", "yma", "ymb", "ymc", "ymd", "yme", "ymg", "ymh", "ymi", "ymk", "yml", "ymm", "ymn", "ymo", "ymp", "ymq", "ymr", "yms", "ymt", "ymx", "ymz", "yna", "ynd", "yne", "yng", "ynh", "ynk", "ynl", "ynn", "yno", "ynq", "yns", "ynu", "yob", "yog", "yoi", "yok", "yol", "yom", "yon", "yos", "yot", "yox", "yoy", "ypa", "ypb", "ypg", "yph", "ypk", "ypm", "ypn", "ypo", "ypp", "ypz", "yra", "yrb", "yre", "yri", "yrk", "yrl", "yrm", "yrn", "yro", "yrs", "yrw", "yry", "ysc", "ysd", "ysg", "ysl", "ysm", "ysn", "yso", "ysp", "ysr", "yss", "ysy", "yta", "ytl", "ytp", "ytw", "yty", "yua", "yub", "yuc", "yud", "yue", "yuf", "yug", "yui", "yuj", "yuk", "yul", "yum", "yun", "yup", "yuq", "yur", "yut", "yuu", "yuw", "yux", "yuy", "yuz", "yva", "yvt", "ywa", "ywg", "ywl", "ywn", "ywq", "ywr", "ywt", "ywu", "yww", "yxa", "yxg", "yxl", "yxm", "yxu", "yxy", "yyr", "yyu", "yyz", "yzg", "yzk"], + ["za", "zh", "zu", "zaa", "zab", "zac", "zad", "zae", "zaf", "zag", "zah", "zai", "zaj", "zak", "zal", "zam", "zao", "zap", "zaq", "zar", "zas", "zat", "zau", "zav", "zaw", "zax", "zay", "zaz", "zba", "zbc", "zbe", "zbl", "zbt", "zbu", "zbw", "zca", "zch", "zdj", "zea", "zeg", "zeh", "zen", "zga", "zgb", "zgh", "zgm", "zgn", "zgr", "zhb", "zhd", "zhi", "zhn", "zhw", "zhx", "zia", "zib", "zik", "zil", "zim", "zin", "zir", "ziw", "ziz", "zka", "zkb", "zkd", "zkg", "zkh", "zkk", "zkn", "zko", "zkp", "zkr", "zkt", "zku", "zkv", "zkz", "zla", "zle", "zlj", "zlm", "zln", "zlq", "zls", "zlw", "zma", "zmb", "zmc", "zmd", "zme", "zmf", "zmg", "zmh", "zmi", "zmj", "zmk", "zml", "zmm", "zmn", "zmo", "zmp", "zmq", "zmr", "zms", "zmt", "zmu", "zmv", "zmw", "zmx", "zmy", "zmz", "zna", "znd", "zne", "zng", "znk", "zns", "zoc", "zoh", "zom", "zoo", "zoq", "zor", "zos", "zpa", "zpb", "zpc", "zpd", "zpe", "zpf", "zpg", "zph", "zpi", "zpj", "zpk", "zpl", "zpm", "zpn", "zpo", "zpp", "zpq", "zpr", "zps", "zpt", "zpu", "zpv", "zpw", "zpx", "zpy", "zpz", "zqe", "zra", "zrg", "zrn", "zro", "zrp", "zrs", "zsa", "zsk", "zsl", "zsm", "zsr", "zsu", "zte", "ztg", "ztl", "ztm", "ztn", "ztp", "ztq", "zts", "ztt", "ztu", "ztx", "zty", "zua", "zuh", "zum", "zun", "zuy", "zwa", "zxx", "zyb", "zyg", "zyj", "zyn", "zyp", "zza", "zzj"] +]; +var LangUtil = /** @class */ (function () { + function LangUtil() { + } + /* Determine if given string is a valid BCP 47 string */ + LangUtil.isBcp47 = function (langStr) { + return /^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(langStr); + }; + LangUtil.validPrimaryLang = function (langStr) { + var primary = langStr.toLowerCase(); + if (primary.includes("-")) { + primary = primary.split("-")[0]; + } + if (!primary.match(/[a-z]{2,3}/)) + return false; + // qaa..qtz + if (primary.length === 3 + && primary.charAt(0) === "q" + && primary.charCodeAt(1) >= 97 && primary.charCodeAt(1) <= 116 + && primary.charCodeAt(2) >= 97 && primary.charCodeAt(2) <= 122) { + } + return validPrimaryLangs[primary.charCodeAt(0) - 97].includes(primary); + }; + LangUtil.matchPrimaryLang = function (lang1, lang2) { + var primary1 = lang1; + if (primary1.includes("-")) { + primary1 = primary1.split("-")[0]; + } + var primary2 = lang2; + if (primary2.includes("-")) { + primary2 = primary2.split("-")[0]; + } + return primary1 === primary2; + }; + return LangUtil; +}()); +exports.LangUtil = LangUtil; + + +/***/ }), + +/***/ "./src/v2/checker/accessibility/util/legacy.ts": +/*!*****************************************************!*\ + !*** ./src/v2/checker/accessibility/util/legacy.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.NodeWalker = exports.ColorObj = exports.RPTUtilStyle = exports.RPTUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../../aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../../aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var fragment_1 = __webpack_require__(/*! ./fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var RPTUtil = /** @class */ (function () { + function RPTUtil() { + } + RPTUtil.isDefinedAriaAttributeAtIndex = function (ele, index) { + var attrName = ele.attributes[index].name; + return RPTUtil.isDefinedAriaAttribute(ele, attrName); + }; + /** + * This method handles implicit aria definitions, for example, an input with checked is equivalent to aria-checked="true" + */ + RPTUtil.getAriaAttribute = function (ele, attributeName) { + // If the attribute is defined, it takes precedence + var retVal = ele.getAttribute(attributeName); + if (ele.hasAttribute(attributeName) && retVal.trim() === "") { //"" is treated as false, so we need return it before the below check + return retVal; + } + // Then determine implicit values from other attributes + if (!retVal) { + var tag = ele.nodeName.toLowerCase(); + if (attributeName in RPTUtil.ariaAttributeImplicitMappings) { + if (tag in RPTUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = RPTUtil.ariaAttributeImplicitMappings[attributeName][tag]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + else if ("*" in RPTUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = RPTUtil.ariaAttributeImplicitMappings[attributeName]["*"]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + } + // Check role-based defaults + if (!retVal) { + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ele); + if (role in RPTUtil.ariaAttributeRoleDefaults && attributeName in RPTUtil.ariaAttributeRoleDefaults[role]) { + retVal = RPTUtil.ariaAttributeRoleDefaults[role][attributeName]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + // Still not defined? Check global defaults + if (!retVal && attributeName in RPTUtil.ariaAttributeGlobalDefaults) { + retVal = RPTUtil.ariaAttributeGlobalDefaults[attributeName]; + } + return retVal; + }; + RPTUtil.wordCount = function (str) { + str = str.trim(); + if (str.length === 0) + return 0; + return str.split(/\s+/g).length; + }; + /** + * Note that this only detects if the element itself is in the tab order. + * However, this element may delegate focus to another element via aria-activedescendant + * Also, focus varies by browser... sticking to things that are focusable on chrome and firefox + */ + RPTUtil.isTabbable = function (element) { + // Using https://allyjs.io/data-tables/focusable.html + // Handle the explicit cases first + if (!RPTUtil.isNodeVisible(element)) + return false; + if (element.hasAttribute("tabindex")) { + return parseInt(element.getAttribute("tabindex")) >= 0; + } + // Explicit cases handled - now the implicit + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in RPTUtil.tabTagMap) { + var retVal = RPTUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + return false; + } + }; + RPTUtil.tabIndexLEZero = function (elem) { + if (RPTUtil.hasAttribute(elem, "tabindex")) { + if (elem.getAttribute("tabindex").match(/^-?\d+$/)) { + var tabindexValue = parseInt(elem.getAttribute("tabindex")); + return tabindexValue === 0 || tabindexValue === -1; + } + } + return false; + }; + //TODO: function does not handle equivalents for roles: row, link, header, button + // But it may not have to. Bug reports have been about radio buttons and checkboxes. + RPTUtil.isHtmlEquiv = function (node, htmlEquiv) { + var retVal = false; + if (node) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = node.getAttribute("type").toLowerCase(); + if (type) { + if (htmlEquiv.indexOf("checkbox") != -1) { + retVal = type === "checkbox"; + } + else if (htmlEquiv.indexOf("radio") != -1) { + retVal = type === "radio"; + } + } + } + } + return retVal; + }; + RPTUtil.isDefinedAriaAttribute = function (ele, attrName) { + var isDefinedAriaAttribute = false; + if (attrName.substring(0, 5) === 'aria-') { + // User agents SHOULD treat state and property attributes with a value of "" the same as they treat an absent attribute. + isDefinedAriaAttribute = ele.hasAttribute && ele.hasAttribute(attrName) && ele.getAttribute(attrName).length > 0; + } + return isDefinedAriaAttribute; + }; + RPTUtil.normalizeSpacing = function (s) { + return s.trim().replace(/\s+/g, ' '); + }; + ; + RPTUtil.nonExistantIDs = function (node, targetids) { + var returnnotfoundids = ''; + if (RPTUtil.normalizeSpacing(targetids).length < 1) + return returnnotfoundids; + var targetArray = targetids.split(" "); + var doc = node.ownerDocument; + for (var i = 0; i < targetArray.length; i++) { + var xp = "//*[@id='" + targetArray[i] + "']"; + var xpathResult = doc.evaluate(xp, node, doc.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + if (!r) + returnnotfoundids += targetArray[i] + ', '; + } + if (RPTUtil.normalizeSpacing(returnnotfoundids).length >= 2) + returnnotfoundids = returnnotfoundids.substring(0, returnnotfoundids.length - 2); + else + returnnotfoundids = ''; + return returnnotfoundids; + }; + RPTUtil.getDocElementsByTag = function (elem, tagName) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + tagName = tagName.toLowerCase(); + var cache = RPTUtil.getCache(doc, "RPT_DOCELEMSBYTAG", {}); + if (!(tagName in cache)) { + cache[tagName] = doc.querySelectorAll(tagName); + RPTUtil.setCache(doc, "RPT_DOCELEMSBYTAG", cache); + } + return cache[tagName]; + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * Note: This is a wrapper function to: RPTUtil.getChildByTagHidden + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf RPTUtil + */ + RPTUtil.getChildByTag = function (parentElem, tagName) { + return RPTUtil.getChildByTagHidden(parentElem, tagName, false, false); + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf RPTUtil + */ + RPTUtil.getChildByTagHidden = function (parentElem, tagName, ignoreHidden, considerHiddenSetting) { + // Variable Decleration + var retVal = []; + var child = parentElem.firstChild; + // Loop over all the child elements of the parent to build a list of all the elements that + // match the tagName provided + while (child != null) { + // Only include the children into the return array if they match with tagname. + if (child.nodeName.toLowerCase() === tagName) { + // In the case that ignorehidden was set to true, then perform a isNodeVisible check + // and in the case the node is not visilble we more to theses then move to the next node. + // Perform a couple of checks to determine if hidden elements should be ignored or not. + // 1. When ignoreHidden is set to true upfront, then perform a isNodeVisible + // 2. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2.1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if ((ignoreHidden || (considerHiddenSetting && !RPTUtil.shouldCheckHiddenContent(child))) && !RPTUtil.isNodeVisible(child)) { + // Move on to the next element + child = child.nextSibling; + continue; + } + // Push the element + retVal.push(child); + } + // Move to the next sibling element + child = child.nextSibling; + } + return retVal; + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function by defauly will not consider Check Hidden Setting at all. + * This function by defauly will not consider implicit roles. + * Note: This is a wrapper function to: RPTUtil.getElementsByRoleHidden + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf RPTUtil + */ + RPTUtil.getElementsByRole = function (doc, roles) { + return RPTUtil.getElementsByRoleHidden(doc, roles, false, false); + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function aslo finds elements with implicit roles. + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf RPTUtil + */ + RPTUtil.getElementsByRoleHidden = function (doc, roles, considerHiddenSetting, considerImplicitRoles) { + // In the case that the role to element assoication is already made, and available in the global hasAttribute + // we can just use that one instead of building a new one. + var roleToElems = null; + if (considerImplicitRoles) { + roleToElems = RPTUtil.getCache(doc, "RPTUtil_GETELEMENTSBY_ROLE_IMPLICIT", null); + } + else { + roleToElems = RPTUtil.getCache(doc, "RPTUtil_GETELEMENTSBY_ROLE", null); + } + // Build the new role to element, this is where we loop through all the elements and extract all the + // elements bsaed on roles. + if (roleToElems === null) { + // Re-initialize the roleToElems hash + roleToElems = {}; + // Get the body of the doc + var root = doc.body; + // Keep looping until we are at the very parent node of the entire page, so that we can loop through + // all the nodes. + while (DOMUtil_1.DOMUtil.parentNode(root) !== null) { + // Get the parentNode + root = DOMUtil_1.DOMUtil.parentNode(root); + } + // Build a nodewalter based of the root node, this node walter will be use loop over all the nodes + // and build the roles to Element coralation + var nw = new NodeWalker(root); + // Loop over the entire doc/list of nodes to build the role to element map + // Note: This will build an roleToElems hash which is in the following format. + // roleToElems = { + // document: [{div},{abbr},{var}], + // main: [{div}], + // navigation: [{div}] + // } + while (nw.nextNode()) { + // Only check the elements which have the role attribute assiciated to them + if (!nw.bEndTag) { + var wRoles = []; + //check if the node has role attributes + if (nw.elem() && nw.elem().hasAttribute("role")) { + // Extract all the roles that are assigned to this element, can have multiple roles on one + // element split by space, so we need to extract all of them into an array. + wRoles = nw.elem().getAttribute("role").split(" "); + } + if (wRoles.length === 0 && considerImplicitRoles) { + var tagProperty = RPTUtil.getElementAriaProperty(nw.node); + //check if there are any implicit roles for this element. + if (tagProperty && tagProperty.implicitRole) { + wRoles = tagProperty.implicitRole; + } + } + if (wRoles.length === 0) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && RPTUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Loop through all the roles and assigned this node to all thes roles + for (var i = 0; i < wRoles.length; ++i) { + // In the case that the role key is not already in the roleToElems hash, construct the + // add the key and assign empty array. + if (!(wRoles[i] in roleToElems)) { + roleToElems[wRoles[i]] = []; + } + // Add the node to the array for the role + roleToElems[wRoles[i]].push(nw.node); + } + } + } + // Set the roleToElems hash map as a global variable + if (considerImplicitRoles) { + RPTUtil.setCache(doc, "RPTUtil_GETELEMENTSBY_ROLE_IMPLICIT", roleToElems); + } + else { + RPTUtil.setCache(doc, "RPTUtil_GETELEMENTSBY_ROLE", roleToElems); + } + } + // Initilize the return value + var retVal = []; + // Handle the cases where the provided role is a string and not an array, + // for this case we take the string and put it into an array + if (typeof (roles) === "string") { + var role = roles; + roles = []; + roles.push(role); + } + // Loop through the roles that were provided and find the list of elements for this roles + // and add them to the return value. + if (roles.length) { + // loop over all the roles + for (var i = 0; i < roles.length; ++i) { + // Extract the role from the array + var nextRole = roles[i]; + // Fetch the list of all the elements for this role + var copyRoles = roleToElems[nextRole]; + // If there are elements to copy to another array, then perform the copy + if (copyRoles) { + // Loop over all the elements which are to be copied + for (var j = 0; j < copyRoles.length; ++j) { + // Add this element to the return val + retVal.push(copyRoles[j]); + } + } + } + } + return retVal; + }; + /** + * This function is responsible for retrieving element's roles. + * This function aslo finds implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} roles - list of attribute roles and implicit roles. + * + * @memberOf RPTUtil + */ + RPTUtil.getRoles = function (ele, considerImplicitRoles) { + var roles = []; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + var attrRoles = RPTUtil.normalizeSpacing(ele.getAttribute("role").trim()).split(" "); + for (var i = 0; i < attrRoles.length; ++i) { + roles.push(attrRoles[i]); + } + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (considerImplicitRoles) { + var implicitRole = RPTUtil.getImplicitRole(ele); + if (implicitRole.length > 0) { + //add implicit roles to the attributes roles. + RPTUtil.concatUniqueArrayItemList(implicitRole, roles); + } + } + return roles; + }; + /** + * Returns the implicit role of the elemement + * @parm {HTMLElement} ele - element for which to find role. + * + * @return the implicit role or [] if doesn't exist + * + * @memberOf RPTUtil + */ + RPTUtil.getImplicitRole = function (ele) { + var tagProperty = RPTUtil.getElementAriaProperty(ele); + //check if there are any implicit roles for this element. + if (tagProperty) { + if (tagProperty.implicitRole) { + return tagProperty.implicitRole; + } + } + return []; + }; + /** + * Returns the required properties of the role + * @parm {string} role - the role + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} properties - list of properties that are required by the role + * + * @memberOf RPTUtil + */ + RPTUtil.getRoleRequiredProperties = function (role, ele) { + if (role === null) { + return null; + } + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + var requiredAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqProps; + // handle special case of separator + if (role.toLowerCase() === "separator" && RPTUtil.isFocusable(ele)) { + RPTUtil.concatUniqueArrayItemList(["aria-valuenow"], requiredAttributes || []); + } + return requiredAttributes; + } + else { + return null; + } + }; + /** + * Test if the ele node is focusable + */ + RPTUtil.isFocusable = function (ele) { + if (ele === "undefined" || ele === null) { + return false; + } + return RPTUtil.isTabbable(ele); + }; + /** + * This function is responsible for finding if a element has given role. + * This function aslo finds if element has given roles as implicit role. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - true or false based on if th element has the specified role. + * + * @memberOf RPTUtil + * + * Consider to use hasRoleInSemantics() instead. + */ + RPTUtil.hasRole = function (ele, role, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] === role; + } + } + } + //if none of the the attribute roles matched with given role + //check if implicit roles matches. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + var tagProperty = RPTUtil.getElementAriaProperty(ele); + var wRoles = []; + //check if there are any implicit roles for this element. + if (tagProperty && tagProperty.implicitRole !== null) { + //add implicit roles to the attributes roles. + RPTUtil.concatUniqueArrayItemList(tagProperty.implicitRole, wRoles); + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] === role; + } + } + } + } + return retVal; + }; + /** + * Checks if the element has the role, including the implied role if role is not explicitly specified. + * + * This function is replacing the hasRole function + * + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * + * @return {List} retVal - true or false based on if the element has the specified role. + * + * @memberOf RPTUtil + */ + RPTUtil.hasRoleInSemantics = function (ele, role) { + var retVal = false; + var roleSpecified = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] === role; + } + } + } + if (roleSpecified) { + return retVal; + } + //check if implicit roles matches. + //Note: element can have multiple implicit roles + var tagProperty = RPTUtil.getElementAriaProperty(ele); + //check if there are any implicit roles for this element. + if (tagProperty && tagProperty.implicitRole !== null) { + var impRoles = tagProperty.implicitRole; + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] === role; + } + } + } + return retVal; + }; + /** + * This function is responsible for finding if a element has given role. + * This function also checks if element has given roles as implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {bool} retVal - true or false based on if the element has the specified role. + * + * @memberOf RPTUtil + */ + RPTUtil.hasAnyRole = function (ele, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + retVal = true; + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + var tagProperty = RPTUtil.getElementAriaProperty(ele); + //check if there are any implicit roles for this element. + if (tagProperty && tagProperty.implicitRole !== null && + tagProperty.implicitRole.length > 0) { + retVal = true; + } + } + return retVal; + }; + RPTUtil.isDataTable = function (tableNode) { + return !(RPTUtil.hasRole(tableNode, "none") || RPTUtil.hasRole(tableNode, "presentation")); + }; + /* + * A complex data table is a data table with any of the following characteristics: + * + * a thead element that contains two or more tr elements + * a table with more than one thead element + * a table with two or more tr elements that contain only th elements + * a th or td element with a rowspan or colspan attribute + * a tr element that contains at least one td element and two or more th elements + * a table with headers not located in the first row or first column + * a td element with a headers attribute value that contains more than two IDREFs + */ + RPTUtil.isComplexDataTable = function (table) { + if ("RPTUtil_isComplexDataTable" in table) { + return !!table.RPTUtil_isComplexDataTable; + } + var isComplexTable = false; + if (table && RPTUtil.isDataTable(table)) { + var thNodes = null, tdNodes = null; + var trNodes = table.getElementsByTagName("tr"); + var trNodeCount = trNodes.length; + var tdNodeCount = 0, thNodeCount = 0, trNodesHavingOnlyThNodes = 0; + for (var i = 0; !isComplexTable && i < trNodeCount; ++i) { + thNodes = trNodes[i].getElementsByTagName("th"); + tdNodes = trNodes[i].getElementsByTagName("td"); + thNodeCount = thNodes.length; + tdNodeCount = tdNodes.length; + if (tdNodeCount !== 0) { + // a tr element that contains at least one td element and two or more th elements; + isComplexTable = thNodeCount > 1; + // a th element with a rowspan or colspan attribute + for (var j = 0; !isComplexTable && j < thNodeCount; ++j) { + isComplexTable = ((thNodes[j].hasAttribute("rowspan") || + thNodes[j].hasAttribute("colspan")) && + RPTUtil.getAncestor(thNodes[j], "table") === table); + } + // a td element with a rowspan or colspan attribute + // a td element with a headers attribute value that contains more than two IDREFs + for (var k = 0; !isComplexTable && k < tdNodeCount; ++k) { + isComplexTable = ((tdNodes[k].hasAttribute("rowspan") || + tdNodes[k].hasAttribute("colspan") || + (tdNodes[k].hasAttribute("headers") && RPTUtil.normalizeSpacing(tdNodes[k].getAttribute("headers")).split(" ").length > 2)) && + RPTUtil.getAncestor(tdNodes[k], "table") === table); + } + } + else { + // two or more tr elements that contain only th elements + if (thNodeCount > 0) { + ++trNodesHavingOnlyThNodes; + } + isComplexTable = trNodesHavingOnlyThNodes === 2; + } + } + if (!isComplexTable) { + var theadNodes = table.getElementsByTagName("thead"); + var theadNodesLength = theadNodes.length; + if (theadNodesLength > 0) { + // table has more than one thead element + isComplexTable = theadNodesLength > 1; + // a thead element that contains two or more tr elements + if (!isComplexTable) { + isComplexTable = theadNodes[0].getElementsByTagName("tr").length > 1; + } + } + } + if (!isComplexTable && trNodeCount !== 0) { + // a table with headers not located in the first row or first column + isComplexTable = thNodeCount > 0 && !RPTUtil.isTableHeaderInFirstRowOrColumn(table); + } + } + table.RPTUtil_isComplexDataTable = isComplexTable; + return isComplexTable; + }; + // Return true if a table's header is in the first row or column + RPTUtil.isTableHeaderInFirstRowOrColumn = function (ruleContext) { + var passed = false; + var rows = ruleContext.rows; + // Check if the first row is all TH's + if (rows != null && rows.length > 0) { + var firstRow = rows[0]; + passed = firstRow.cells.length > 0 && RPTUtil.getChildByTagHidden(firstRow, "td", false, true).length === 0; + // If the first row isn't a header row, try the first column + if (!passed) { + // Assume that the first column has all TH's unless we find a TD in the first column. + passed = true; + for (var i = 0; passed && i < rows.length; ++i) { + // If no cells in this row, that's okay too. + passed = !rows[i].cells || + rows[i].cells.length === 0 || + rows[i].cells[0].nodeName.toLowerCase() != "td"; + } + } + if (!passed) { + // Special case - both first row and first column are headers, but they did not use + // a th for the upper-left cell + passed = true; + for (var i = 1; passed && i < firstRow.cells.length; ++i) { + passed = firstRow.cells[i].nodeName.toLowerCase() != "td"; + } + for (var i = 1; passed && i < rows.length; ++i) { + // If no cells in this row, that's okay too. + passed = !rows[i].cells || + rows[i].cells.length === 0 || + rows[i].cells[0].nodeName.toLowerCase() != "td"; + } + } + } + return passed; + }; + RPTUtil.isNodeInGrid = function (node) { + return RPTUtil.getAncestorWithRole(node, "grid") != null; + }; + RPTUtil.isLayoutTable = function (tableNode) { + return RPTUtil.hasRole(tableNode, "presentation") || RPTUtil.hasRole(tableNode, "none"); + }; + RPTUtil.getFileExt = function (url) { + var m = url.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/); + if (m != null && m.length >= 2) { + return "." + m[1]; + } + return ""; + }; + RPTUtil.getFileAnchor = function (url) { + var m = url.match(/#(([^;?\.]|^$)+)([;?]|$)/); + if (m != null && m.length >= 2) { + return m[1]; + } + return ""; + }; + RPTUtil.checkObjEmbed = function (node, extTest, mimeTest) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName != "object" && nodeName != "embed" && + nodeName != "a" && nodeName != "area") + return false; + var retVal = false; + // Check mime type + if (!retVal && node.hasAttribute("type")) { + var mime = node.getAttribute("type").toLowerCase(); + retVal = mimeTest(mime); + } + if (!retVal && node.hasAttribute("codetype")) { + var mime = node.getAttribute("codetype"); + retVal = mimeTest(mime); + } + // Check the filename + if (!retVal) { + var filename = ""; + if (nodeName === "embed") { + filename = node.getAttribute("src"); + } + else if (nodeName === "a" || nodeName === "area") { + filename = node.getAttribute("href"); + } + else if (node.hasAttribute("data")) { + filename = node.getAttribute("data"); + } + if (filename === null) + filename = ""; + var ext = RPTUtil.getFileExt(filename); + retVal = extTest(ext); + } + // Check for filenames in the params + if (!retVal && nodeName === "object") { + // In the case that Check Hidden Option is set then comply with that setting + var params = RPTUtil.getChildByTagHidden(node, "param", false, true); + for (var i = 0; !retVal && params != null && i < params.length; ++i) { + retVal = params[i].hasAttribute("value") && + extTest(RPTUtil.getFileExt(params[i].getAttribute("value"))); + } + } + return retVal; + }; + RPTUtil.isAudioObjEmbedLink = function (node) { + return RPTUtil.checkObjEmbed(node, RPTUtil.isAudioExt, function (mime) { + return mime.startsWith("audio"); + }); + }; + RPTUtil.isAudioExt = function (ext) { + var audio_extensions = [".aif", ".aifc", ".aiff", ".air", ".asf", ".au", ".cda", + ".dsm", ".dss", ".dwd", ".iff", ".kar", ".m1a", ".med", + ".mp2", ".mp3", ".mpa", ".pcm", ".ra", ".ram", ".rm", + ".sam", ".sf", ".sf2", ".smp", ".snd", ".svx", ".ul", + ".voc", ".wav", ".wma", ".wve" + ]; + return RPTUtil.valInArray(ext.toLowerCase(), audio_extensions); + }; + RPTUtil.isVideoObjEmbedLink = function (node) { + return RPTUtil.checkObjEmbed(node, RPTUtil.isVideoExt, function (mime) { + return mime.startsWith("video") || + mime.startsWith("application/x-shockwave-flash"); + }); + }; + RPTUtil.isVideoExt = function (ext) { + var video_extensions = [".asf", ".avi", ".divx", ".dv", ".m1v", ".m2p", ".m2v", ".moov", + ".mov", ".mp4", ".mpeg", ".mpg", ".mpv", ".ogm", ".omf", ".qt", + ".rm", ".rv", ".smi", ".smil", ".swf", ".vob", ".wmv", ".rmvb", + ".mvb" + ]; + return RPTUtil.valInArray(ext.toLowerCase(), video_extensions); + }; + RPTUtil.isImageObjEmbedLink = function (node) { + return RPTUtil.checkObjEmbed(node, RPTUtil.isImgExt, function (mime) { + return mime.startsWith("image"); + }); + }; + RPTUtil.isImgExt = function (ext) { + var image_extensions = [".bmp", ".gif", ".jpg", ".jpeg", ".pcx", ".png"]; + return RPTUtil.valInArray(ext.toLowerCase(), image_extensions); + }; + RPTUtil.isHtmlExt = function (ext) { + var html_extensions = [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml" + ]; + return RPTUtil.valInArray(ext.toLowerCase(), html_extensions); + }; + RPTUtil.isPresentationalElement = function (node) { + // Elements extracted from https://developer.mozilla.org/en/docs/Web/HTML/Element#Inline_text_semantics, + // http://dev.w3.org/html5/html-author/#text-level-semantics and https://wiki.whatwg.org/wiki/Presentational_elements_and_attributes + var presentationalElements = ["abbr", "b", "bdi", "bdo", "br", "cite", "code", "data", "dfn", + "em", "i", "kbd", "mark", "q", "rp", "rt", "rtc", "ruby", "s", + "samp", "small", "span", "strong", "sub", "sup", "time", "u", + "var", "wbr", "a", "progress", "meter", "basefont", "big", "center", + "strike", "tt", "font", "blink", "h1", "h2", "h3", "h4", "h5", "h6", + "hr", "blockquote", "p" + ]; + return RPTUtil.valInArray(node.nodeName.toLowerCase(), presentationalElements); + }; + RPTUtil.hasTriggered = function (doc, id) { + return RPTUtil.getCache(doc, id, false); + }; + RPTUtil.triggerOnce = function (doc, id, passed) { + if (passed) + return true; + var triggered = RPTUtil.getCache(doc, id, false); + RPTUtil.setCache(doc, id, true); + return triggered; + }; + /* determine if the given value exists in the given array */ + RPTUtil.valInArray = function (value, arr) { + for (var idx in arr) { + if (arr[idx] === value) + return true; + } + return false; + }; + /** + * return the ancestor of the given element + * @param tagNames string, array, or dictionary containing the tags to search for + */ + RPTUtil.getAncestor = function (element, tagNames) { + var walkNode = element; + while (walkNode !== null) { + var thisTag = walkNode.nodeName.toLowerCase(); + if (typeof (tagNames) === "string") { + if (thisTag === tagNames.toLowerCase()) { + break; + } + } + else if (tagNames.length) { + for (var idx in tagNames) { + // Packages.java.lang.System.err.println(thisTag + ":" + tagNames[idx] + ":" + (tagNames[idx] === thisTag)); + if (tagNames[idx] === thisTag) + return walkNode; + } + } + else if (thisTag in tagNames) { + break; + } + walkNode = DOMUtil_1.DOMUtil.parentNode(walkNode); + } + return walkNode; + }; + // return true if element1 and element2 are siblings + RPTUtil.isSibling = function (element1, element2) { + if (element1 && element2) { + var node = null; + if (DOMUtil_1.DOMUtil.parentNode(element1) && DOMUtil_1.DOMUtil.parentNode(element1).firstChild) { + node = DOMUtil_1.DOMUtil.parentNode(element1).firstChild; + } + while (node) { + if (node === element2) + return true; + node = node.nextSibling; + } + } + return false; + }; + /** + * return the ancestor of the given element and role. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf RPTUtil + */ + RPTUtil.getAncestorWithRole = function (element, roleName, considerImplicitRoles) { + var walkNode = DOMUtil_1.DOMUtil.parentNode(element); + while (walkNode !== null) { + if (considerImplicitRoles) { + if (RPTUtil.hasRoleInSemantics(walkNode, roleName)) { + break; + } + } + else { + if (RPTUtil.hasRole(walkNode, roleName, false)) { + break; + } + } + walkNode = DOMUtil_1.DOMUtil.parentNode(walkNode); + } + return walkNode; + }; + RPTUtil.getAncestorWithAttribute = function (element, attrName, attrValue) { + var walkNode = DOMUtil_1.DOMUtil.parentNode(element); + while (walkNode !== null) { + if (walkNode.nodeType === Node.ELEMENT_NODE && walkNode.getAttribute(attrName) === attrValue) + return walkNode; + walkNode = DOMUtil_1.DOMUtil.parentNode(walkNode); + } + return null; + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function by default will not consider Check Hidden Setting at all. + * + * Note: This is a wrapper function to: RPTUtil.getSiblingWithRoleHidden + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf RPTUtil + */ + RPTUtil.getSiblingWithRole = function (element, role) { + return RPTUtil.getSiblingWithRoleHidden(element, role, false); + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function also considers implicit roles for the elements. + * + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicit - true or false based on if Implicit roles should be considered. + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf RPTUtil + */ + RPTUtil.getSiblingWithRoleHidden = function (element, role, considerHiddenSetting, considerImplicitRole) { + // Variable Declaration + var walkNode = null; + var hasRole = false; + // Only perform the check if element and role are both provided + if (element && role) { + // Fetch the next sibling element + walkNode = element.nextSibling; + // Keep looping over the next siblings to find element which matches + // the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && RPTUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.nextSibling; + continue; + } + // Check if this node has the role that we need to check exists + if (considerImplicitRole) { + hasRole = RPTUtil.hasRoleInSemantics(walkNode, role); + } + else { + hasRole = RPTUtil.hasRole(walkNode, role, false); + } + // Move on to the next node + walkNode = walkNode.nextSibling; + } + // If we still have not found a node that matches the role, start a reverse look up + if (!walkNode) { + // Fetch the previous Sibling of this element + walkNode = element.previousSibling; + // Keep looping over all the previous siblings to search for an element which + // matches the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && RPTUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.previousSibling; + continue; + } + // Check if this node has the role that we need to check exists + hasRole = RPTUtil.hasRole(walkNode, role, considerImplicitRole); + // Move on to the next node + walkNode = walkNode.previousSibling; + } + } + } + return walkNode; + }; + RPTUtil.isDescendant = function (parent, child) { + var node = DOMUtil_1.DOMUtil.parentNode(child); + while (node != null) { + if (node === parent) { + return true; + } + node = DOMUtil_1.DOMUtil.parentNode(node); + } + return false; + }; + //check if the first form control child is disabled + RPTUtil.isDisabledByFirstChildFormElement = function (element) { + var formElements = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (element.firstChild != null) { + var nw = new NodeWalker(element); + while (nw.nextNode()) { + if (formElements.includes(nw.node.nodeName.toLowerCase())) { + if (RPTUtil.isNodeDisabled(nw.node)) + return true; + return false; + } + } + } + return false; + }; + RPTUtil.isDisabledByReferringElement = function (element) { + var id = element.getAttribute("id"); + var doc = element.ownerDocument; + var root = doc.body; + while (DOMUtil_1.DOMUtil.parentNode(root) !== null) { + // Get the parentNode + root = DOMUtil_1.DOMUtil.parentNode(root); + } + var nw = new NodeWalker(root); + while (nw.nextNode()) { + // check the element whose 'aria-describedby' equals to the id + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var AriaDescribedbyIDArray = (nw.elem().getAttribute("aria-describedby") || "").split(" "); + if (AriaDescribedbyIDArray.includes(id) && RPTUtil.isNodeDisabled(nw.node)) { + return true; + } + } + } + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: RPTUtil.getDescendantWithRoleHidden + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendants elements + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf RPTUtil + */ + RPTUtil.getDescendantWithRole = function (element, roleName) { + return RPTUtil.getDescendantWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendants elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf RPTUtil + */ + RPTUtil.getDescendantWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendant = null; + var nw = new NodeWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && RPTUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (considerImplicitRoles ? RPTUtil.hasRoleInSemantics(nw.node, roleName) : RPTUtil.hasRole(nw.node, roleName, false)) { + descendant = nw.node; + break; + } + } + return descendant; + }; + /** + * This function is responsible for getting All descendant elements with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendants elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf RPTUtil + */ + RPTUtil.getAllDescendantsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendants = []; + var nw = new NodeWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + if (nw.bEndTag) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && RPTUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (RPTUtil.hasRole(nw.node, roleName, considerImplicitRoles)) { + descendants.push(nw.node); + } + } + return descendants; + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: RPTUtil.getAriaOwnsWithRoleHidden + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf RPTUtil + */ + RPTUtil.getAriaOwnsWithRole = function (element, roleName) { + return RPTUtil.getAriaOwnsWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. This function aslo finds elements with implicit roles. + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf RPTUtil + */ + RPTUtil.getAriaOwnsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var referencedElement = null; + var referencedElemHasRole = false; + // In the case aria-owns is not on the element just break out of this function with null + if (RPTUtil.attributeNonEmpty(element, "aria-owns")) { + // Get the reference ID + var referenceID = element.getAttribute("aria-owns"); + // Get the element for the reference ID + referencedElement = fragment_1.FragmentUtil.getById(element, referenceID); + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if (considerHiddenSetting && referencedElement != null && RPTUtil.shouldNodeBeSkippedHidden(referencedElement)) { + referencedElemHasRole = null; + } + else { + referencedElemHasRole = RPTUtil.hasRole(referencedElement, roleName, considerImplicitRoles); + } + } + return referencedElemHasRole ? referencedElement : null; + }; + /** get element containing label for the given element + * @deprecated Deprecated because the function name is misleading. Use getLabelForElement(element) instead + */ + RPTUtil.getInputLabel = function (element) { + return RPTUtil.getLabelForElement(element); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * Note: This is a wrapper function to: RPTUtil.getLabelForElementHidden + * + * @parm {element} element - The element for which to get the label element for. + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf RPTUtil + */ + RPTUtil.getLabelForElement = function (element) { + return RPTUtil.getLabelForElementHidden(element, false); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * This function will return null if the containing lable element is hidden, when the ignoreHidden option + * is set to true. + * + * @parm {element} element - The element for which to get the label element for. + * @parm {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf RPTUtil + */ + RPTUtil.getLabelForElementHidden = function (element, ignoreHidden) { + // Check if the global RPTUtil_LABELS hash is available, as this will contain the label nodes based on + // for attribute. + //if (!RPTUtil.getCache(element.ownerDocument,"RPTUtil_LABELS", null)) { + var root = element.getRootNode(); + if (!RPTUtil.getCache((root.nodeType === 11) ? root : root, "RPTUtil_LABELS", null)) { + // Variable Decleration + var idToLabel = {}; + // Get all the label elements in the entire doc + var labelNodes = RPTUtil.getDocElementsByTag(element, "label"); + // Loop over all the label nodes, in the case the label node has a for attribute, + // extract that attribute and add this node to the hash if it is visible. + for (var i = 0; i < labelNodes.length; ++i) { + if (labelNodes[i].hasAttribute("for")) { + // If ignore hidden is specified and the node is not visible we do not add it to the + // labelNodes hash. + if (ignoreHidden && !RPTUtil.isNodeVisible(labelNodes[i])) { + continue; + } + idToLabel[labelNodes[i].getAttribute("for")] = labelNodes[i]; + } + } + // Add the built hash to the ownerDocument (document), to be used later to fast retrival + //RPTUtil.setCache(element.ownerDocument, "RPTUtil_LABELS", idToLabel); + RPTUtil.setCache((root.nodeType === 11) ? root : root, "RPTUtil_LABELS", idToLabel); + } + // If this element has an id attribute, get the corosponding label element + if (element.hasAttribute("id")) { + // Fetch the id attribute + var ctrlId = element.getAttribute("id"); + // Return the corosponding label element. + // Note: in the case that the the id is not found in the hash that means, it does not exists or is hidden + if (ctrlId.trim().length > 0) { + //return RPTUtil.getCache(element.getRootNode().ownerDocument,"RPTUtil_LABELS",{})[ctrlId]; + return RPTUtil.getCache((root.nodeType === 11) ? root : root, "RPTUtil_LABELS", {})[ctrlId]; + } + } + return null; + }; + /* Return specified element attribute if present else return null */ + RPTUtil.getElementAttribute = function (element, attr) { + return (element && element.hasAttribute && element.hasAttribute(attr)) ? element.getAttribute(attr) : null; + }; + // Return true if the element has an ARIA label + RPTUtil.hasAriaLabel = function (element) { + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + return RPTUtil.attributeNonEmpty(element, "aria-label") || RPTUtil.attributeNonEmpty(element, "aria-labelledby"); + }; + // Return true if element has valid implicit label + RPTUtil.hasImplicitLabel = function (element) { + var parentNode = RPTUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && RPTUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = RPTUtil.removeAllFormElementsFromLabel(parentClone); + return RPTUtil.hasInnerContentHidden(parentClone); + } + else { + return false; + } + }; + RPTUtil.isFirstFormElement = function (parentNode, element) { + var formElementsRequiringLabel = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (parentNode.firstChild != null) { + var nw = new NodeWalker(parentNode); + while (nw.nextNode()) { + if (formElementsRequiringLabel.indexOf(nw.node.nodeName.toLowerCase()) !== -1) { + return nw.node === element; + } + } + } + return false; + }; + RPTUtil.removeAllFormElementsFromLabel = function (element) { + var formElements = ["input", "textarea", "select", "button", "datalist", "optgroup", "option", "keygen", "output", "progress", "meter"]; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; i++) { + if (formElements.indexOf(childNodes[i].nodeName.toLowerCase()) > -1) { + element.removeChild(childNodes[i]); + } + } + return element; + }; + // Given an array of elements, return true if the elements have unique ARIA labels + RPTUtil.hasUniqueAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + if (isGlobal) { + uniqueAriaLabels = RPTUtil.getCache(doc, "RPTUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = RPTUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelID = elements[i].getAttribute("aria-labelledby"); + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + var label = labelNode ? RPTUtil.getInnerText(labelNode) : ""; + var normalizedLabel = RPTUtil.normalizeSpacing(label).toLowerCase(); + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + } + else { + // Has no label at all + hasDuplicateLabels = true; + } + } + } + if (isGlobal) { + RPTUtil.setCache(doc, "RPTUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return !hasDuplicateLabels; + }; + RPTUtil.getAriaLabel = function (ele) { + if (ele.hasAttribute) { + if (ele.hasAttribute("aria-labelledby")) { + var labelIDs = ele.getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_1 = labelIDs.length; j < length_1; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + var label = labelNode ? RPTUtil.getInnerText(labelNode) : ""; + normalizedLabel += RPTUtil.normalizeSpacing(label).toLowerCase(); + } + return normalizedLabel.trim(); + } + else if (ele.hasAttribute("aria-label")) { + return RPTUtil.normalizeSpacing(ele.getAttribute("aria-label")).toLowerCase().trim(); + } + } + if (ele.nodeName.toLowerCase() === "input") { + //const label = RPTUtil.getLabelForElement(ele); + var label = RPTUtil.getLabelForElementHidden(ele, true); + if (!label) + return ""; + return (RPTUtil.getAriaLabel(label) || label.innerText || "").trim(); + } + return ""; + }; + RPTUtil.findAriaLabelDupes = function (elements) { + var dupeMap = {}; + elements.forEach(function (ele) { + dupeMap[RPTUtil.getAriaLabel(ele)] = (dupeMap[RPTUtil.getAriaLabel(ele)] || 0) + 1; + }); + return dupeMap; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + RPTUtil.hasUniqueAriaLabels = function (elements) { + return RPTUtil.hasUniqueAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + RPTUtil.hasDuplicateAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + var duplicateLabelNameArray = new Array(); + if (isGlobal) { + uniqueAriaLabels = RPTUtil.getCache(doc, "RPTUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = RPTUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + if (!(ariaLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[ariaLabel] = new Array(); + } + duplicateLabelNameArray[ariaLabel].push(elements[i].nodeName.toLowerCase()); + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelIDs = elements[i].getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_2 = labelIDs.length; j < length_2; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + var label = labelNode ? RPTUtil.getInnerText(labelNode) : ""; + normalizedLabel += RPTUtil.normalizeSpacing(label).toLowerCase(); + } + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + if (!(normalizedLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[normalizedLabel] = new Array(); + } + duplicateLabelNameArray[normalizedLabel].push(elements[i].nodeName.toLowerCase()); + } + } + } + if (isGlobal) { + RPTUtil.setCache(doc, "RPTUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return duplicateLabelNameArray; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + RPTUtil.hasDuplicateAriaLabels = function (elements) { + return RPTUtil.hasDuplicateAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique aria-labelledby attributes + RPTUtil.hasUniqueAriaLabelledby = function (elements) { + var hasDuplicateLabels = false; + var labelRefs = {}; + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute && elements[i].hasAttribute("aria-labelledby")) { + var labelRef = RPTUtil.normalizeSpacing(elements[i].getAttribute("aria-labelledby")); + hasDuplicateLabels = labelRef in labelRefs; + labelRefs[labelRef] = true; + } + else { + hasDuplicateLabels = true; + } + } + return !hasDuplicateLabels; + }; + /* Determine the node depth of the given element */ + RPTUtil.nodeDepth = function (element) { + var depth = 0; + var walkNode = element; + while (walkNode !== null) { + walkNode = DOMUtil_1.DOMUtil.parentNode(walkNode); + depth = depth + 1; + } + return depth; + }; + /* compare node order of the 2 given nodes */ + /* returns + * 0 if the nodes are equal + * 1 if node b is before node a + * -1 if node a is before node b + * 2 if node a is nested in node b + * -2 if node b is nested in node a + * null if either node is null or their parent nodes are not equal + */ + RPTUtil.compareNodeOrder = function (nodeA, nodeB) { + if (nodeA === nodeB) + return 0; + var aDepth = RPTUtil.nodeDepth(nodeA); + var bDepth = RPTUtil.nodeDepth(nodeB); + if (bDepth > aDepth) { + for (var i = 0; i < bDepth - aDepth; ++i) + nodeB = DOMUtil_1.DOMUtil.parentNode(nodeB); + if (nodeA === nodeB) // Node B nested in Node A + return -2; + } + else if (aDepth > bDepth) { + for (var i = 0; i < aDepth - bDepth; ++i) + nodeA = DOMUtil_1.DOMUtil.parentNode(nodeA); + if (nodeA === nodeB) // Node A nested in Node B + return 2; + } + while (nodeA != null && nodeB != null && DOMUtil_1.DOMUtil.parentNode(nodeA) != DOMUtil_1.DOMUtil.parentNode(nodeB)) { + nodeA = DOMUtil_1.DOMUtil.parentNode(nodeA); + nodeB = DOMUtil_1.DOMUtil.parentNode(nodeB); + } + if (nodeA === null || nodeB === null || DOMUtil_1.DOMUtil.parentNode(nodeA) != DOMUtil_1.DOMUtil.parentNode(nodeB)) + return null; + while (nodeB != null && nodeB != nodeA) + nodeB = nodeB.previousSibling; + if (nodeB === null) // nodeB before nodeA + return 1; + else + return -1; + }; + /** + * Determine if the given attribute of the given element is not empty + * @memberOf RPTUtil + */ + RPTUtil.attributeNonEmpty = function (element, attrStr) { + return element.hasAttribute(attrStr) && element.getAttribute(attrStr).trim().length > 0; + }; + /* Return a pointer to the given global variable + * with its initial value as given */ + RPTUtil.getCache = function (cacheSpot, keyName, initValue) { + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined) { + cacheObj.aceCache[keyName] = initValue; + } + return cacheObj.aceCache[keyName]; + }; + RPTUtil.setCache = function (cacheSpot, globalName, value) { + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + cacheObj.aceCache[globalName] = value; + return value; + }; + /* Return a pointer to the given frame, null if not found */ + RPTUtil.getFrameByName = function (ruleContext, frameName) { + var window = ruleContext.ownerDocument.defaultView; + var frameList = [window]; + var idx = 0; + while (idx < frameList.length) { + try { + if (frameList[idx].name === frameName) + return frameList[idx]; + for (var i = 0; i < frameList[idx].frames.length; ++i) { + try { + // Ensure it's a real frame and avoid recursion + if (frameList[idx].frames[i] && !frameList.includes(frameList[idx].frames[i])) { + frameList.push(frameList[idx].frames[i]); + } + } + catch (e) { } + } + } + catch (e) { } + ++idx; + } + return null; + }; + RPTUtil.defaultNSResolver = function (prefix) { + var uri; + switch (prefix) { + case 'html': + uri = 'http://www.w3.org/1999/xhtml'; + case 'x2': + uri = 'http://www.w3.org/TR/xhtml2'; + case 'x': + uri = 'http://www.w3.org/1999/xhtml'; + case 'xhtml': + uri = 'http://www.w3.org/1999/xhtml'; + default: + uri = null; + } + return uri; + }; + //checking if only the inner text is empty or not + RPTUtil.isInnerTextOnlyEmpty = function (element) { + // Get the innerText of the element + var text = element.innerText; + if (text === undefined && element.textContent !== undefined) { + // In headless mode, innerText is sometimes 'undefined' + // so we try textContent as a workaround + text = element.textContent; + } + var retVal = !(text !== null && text.trim().length > 0); + if (element.nodeType === 1 && element.nodeName.toLowerCase() === "slot") { + for (var _i = 0, _a = element.assignedNodes(); _i < _a.length; _i++) { + var slotElem = _a[_i]; + retVal = retVal && RPTUtil.isInnerTextEmpty(slotElem); + } + } + // Trim the inner text and verify that it is not empty. + return retVal; + }; + /* Return the inner text of the given element */ + RPTUtil.getInnerText = function (element) { + var retVal = element.innerText; + if (retVal === undefined || retVal.trim() === "") + retVal = element.textContent; + return retVal; + }; + /** + * This function is responsible for checking if elements inner text is empty or not. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf RPTUtil + */ + RPTUtil.isInnerTextEmpty = function (element) { + // Get the innerText of the element + var text = RPTUtil.getInnerText(element); + // Trim the inner text and verify that it is not empty. + return !(text != null && text.trim().length > 0); + }; + RPTUtil.hasInnerContent = function (element) { + var text = RPTUtil.getInnerText(element); + var hasContent = (text != null && text.trim().length > 0); + if (element.firstChild != null) { + var nw = new NodeWalker(element); + while (!hasContent && nw.nextNode()) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + RPTUtil.attributeNonEmpty(nw.node, "alt")); + } + } + return hasContent; + }; + /** + * This function is responsible for determine if an element has inner content. + * This function also considers cases where inner text is hidden, which now will + * be classified as does not have hidden content. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf RPTUtil + */ + RPTUtil.hasInnerContentHidden = function (element) { + return RPTUtil.hasInnerContentHiddenHyperLink(element, false); + }; + RPTUtil.svgHasName = function (element) { + return RPTUtil.attributeNonEmpty(element, "aria-label") + || RPTUtil.attributeNonEmpty(element, "aria-labelledby") + || !!element.querySelector(":scope > title"); + }; + RPTUtil.hasInnerContentHiddenHyperLink = function (element, hyperlink_flag) { + if (!element) + return false; + // Variable Decleration + var childElement = element.firstElementChild; + var hasContent = false; + // In the case that the childElement is not null then we need to check each of the elements + // to make sure that the elements are not all hidden. + if (childElement != null) { + // Get the nodewalter of the element node, so that we can loop over it and verify + // that the elements under the element are not completly hidden. + var nw = new NodeWalker(element); + // Loop over all the nodes until there are no more nodes or we have determine that there is content under + // this parent element. + while (!hasContent && nw.nextNode() && nw.node != element) { + // Get the next node + var node = nw.node; + // In the case an img element is present with alt then we can mark this as pass + // otherwise keep checking all the other elements. Make sure that this image element is not hidden. + hasContent = (node.nodeName.toLowerCase() === "img" + && (RPTUtil.attributeNonEmpty(node, "alt") || RPTUtil.attributeNonEmpty(node, "title")) + && RPTUtil.isNodeVisible(node)) || (node.nodeName.toLowerCase() === "svg" + && RPTUtil.svgHasName(node)); + // Now we check if this node is of type element, visible + if (!hasContent && node.nodeType === 1 && RPTUtil.isNodeVisible(node)) { + // Check if the innerText of the element is empty or not + hasContent = !RPTUtil.isInnerTextOnlyEmpty(node); + if (!hasContent && hyperlink_flag === true) { + hasContent = RPTUtil.attributeNonEmpty(node, "aria-label") || RPTUtil.attributeNonEmpty(node, "aria-labelledby"); + var doc = node.ownerDocument; + if (doc) { + var win = doc.defaultView; + if (win) { + var cStyle = win.getComputedStyle(node); + if (!hasContent && cStyle != null) { + // console.log(cStyle.backgroundImage); + // console.log(cStyle.content) + hasContent = ((cStyle.backgroundImage && cStyle.backgroundImage.indexOf) || cStyle.content) && RPTUtil.attributeNonEmpty(node, "alt"); + } + } + } + } + } + // Check for cases where there is text node after an element under the parent + // In the case we detect nodetype as text node and the patent of the text node is + // the same element we are checking has Inner content for then get the inner content of this + // text node. + if (node.nodeType === 3 && DOMUtil_1.DOMUtil.parentElement(node) === element) { + // Check if the innerText of the element is empty or not + hasContent = !RPTUtil.isInnerTextEmpty(node); + } + } + } + // In the case there are no child elements then we can simply perform the check for only innertext + // the img with alt case will be covered in the above if, as img is considers as an element. + else { + // Check if the innerText of the element is empty or not + hasContent = !RPTUtil.isInnerTextEmpty(element); + } + return hasContent; + }; + RPTUtil.hasInnerContentOrAlt = function (element) { + var text = RPTUtil.getInnerText(element); + var hasContent = (text != null && text.trim().length > 0) || RPTUtil.attributeNonEmpty(element, "alt"); + if (element.firstChild != null) { + var nw = new NodeWalker(element); + while (!hasContent && nw.nextNode() && nw.node != element) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + RPTUtil.attributeNonEmpty(nw.node, "alt")); + if (!hasContent + && (RPTUtil.hasRole(nw.node, "button", true) || RPTUtil.hasRole(nw.node, "textbox")) + && (RPTUtil.hasAriaLabel(nw.node) || RPTUtil.attributeNonEmpty(nw.node, "title") || RPTUtil.getLabelForElementHidden(nw.elem(), true))) { + hasContent = true; + } + } + } + return hasContent; + }; + RPTUtil.concatUniqueArrayItem = function (item, arr) { + arr.indexOf(item) === -1 && item !== null ? arr.push(item) : false; + return arr; + }; + RPTUtil.concatUniqueArrayItemList = function (itemList, arr) { + for (var i = 0; itemList !== null && i < itemList.length; i++) { + arr = RPTUtil.concatUniqueArrayItem(itemList[i], arr); + } + return arr; + }; + RPTUtil.getElementAriaProperty = function (ruleContext) { + var tagName = null; + var name = null; + if (ruleContext.tagName) { + tagName = ruleContext.tagName.toLowerCase(); + } + else if (ruleContext.nodeName) { + tagName = ruleContext.nodeName.toLowerCase(); + } + // check if the tagProperty exists in the documentConformanceRequirement hash. + var tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirement[tagName]; + // The tag needs to check some special attributes + if (tagProperty === null || tagProperty === undefined) { + var specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags[tagName]; + switch (tagName) { // special cases + case "a": + RPTUtil.attributeNonEmpty(ruleContext, "href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "area": + RPTUtil.attributeNonEmpty(ruleContext, "href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "figure": { + var fcs = RPTUtil.getChildByTag(ruleContext, "figcaption"); + fcs !== null && fcs.length > 0 ? tagProperty = specialTagProperties["child-figcaption"] : tagProperty = specialTagProperties["no-child-figcaption"]; + break; + } + case "footer": { + var ancestor_1 = RPTUtil.getAncestorWithRole(ruleContext, "article", true); + if (ancestor_1 === null) + ancestor_1 = RPTUtil.getAncestorWithRole(ruleContext, "complementary", true); + if (ancestor_1 === null) + ancestor_1 = RPTUtil.getAncestorWithRole(ruleContext, "main", true); + if (ancestor_1 === null) + ancestor_1 = RPTUtil.getAncestorWithRole(ruleContext, "navigation", true); + if (ancestor_1 === null) + ancestor_1 = RPTUtil.getAncestorWithRole(ruleContext, "region", true); + ancestor_1 !== null ? tagProperty = specialTagProperties["des-section-article"] : tagProperty = specialTagProperties["not-des-section-article"]; + break; + } + case "form": + name = ARIAMapper_1.ARIAMapper.computeName(ruleContext); + if (name && name.trim().length > 0) { + tagProperty = specialTagProperties["with-name"]; + } + else { + tagProperty = specialTagProperties["without-name"]; + } + break; + case "header": + var ancestor = RPTUtil.getAncestorWithRole(ruleContext, "article", true); + if (ancestor === null) + ancestor = RPTUtil.getAncestorWithRole(ruleContext, "complementary", true); + if (ancestor === null) + ancestor = RPTUtil.getAncestorWithRole(ruleContext, "main", true); + if (ancestor === null) + ancestor = RPTUtil.getAncestorWithRole(ruleContext, "navigation", true); + if (ancestor === null) + ancestor = RPTUtil.getAncestorWithRole(ruleContext, "region", true); + ancestor !== null ? tagProperty = specialTagProperties["des-section-article"] : tagProperty = specialTagProperties["not-des-section-article"]; + break; + case "img": + if (ruleContext.hasAttribute("alt")) { + ruleContext.getAttribute("alt").trim() === "" ? tagProperty = specialTagProperties["img-with-empty-alt"] : tagProperty = specialTagProperties["img-with-alt-text"]; + } + else { + RPTUtil.hasAriaLabel(ruleContext) ? tagProperty = specialTagProperties["img-with-alt-text"] : tagProperty = specialTagProperties["img-without-alt"]; + } + break; + case "input": + if (RPTUtil.attributeNonEmpty(ruleContext, "type")) { + var type = ruleContext.getAttribute("type").trim().toLowerCase(); + tagProperty = specialTagProperties[type]; + if (tagProperty === null || tagProperty === undefined) { + switch (type) { + case "checkbox": + RPTUtil.attributeNonEmpty(ruleContext, "aria-pressed") ? tagProperty = specialTagProperties["checkbox-with-aria-pressed"] : tagProperty = specialTagProperties["checkbox-without-aria-pressed"]; + break; + case "email": + RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["email-with-list"] : tagProperty = specialTagProperties["email-no-list"]; + break; + case "search": + RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["search-with-list"] : tagProperty = specialTagProperties["search-no-list"]; + break; + case "tel": + RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["tel-with-list"] : tagProperty = specialTagProperties["tel-no-list"]; + break; + case "text": + RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + break; + case "url": + RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["url-with-list"] : tagProperty = specialTagProperties["url-no-list"]; + break; + default: + // default type is the same as type=text + RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + break; + } + } + } + else { + // default type is the same as type=text + RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + } + break; + case "section": + name = ARIAMapper_1.ARIAMapper.computeName(ruleContext); + if (name && name.trim().length > 0) { + tagProperty = specialTagProperties["with-name"]; + } + else { + tagProperty = specialTagProperties["without-name"]; + } + break; + case "select": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["select"]; + if (ruleContext.hasAttribute("multiple") || + RPTUtil.attributeNonEmpty(ruleContext, "size") && ruleContext.getAttribute("size") > 1) + tagProperty = specialTagProperties["multiple-attr-size-gt1"]; + else + tagProperty = specialTagProperties["no-multiple-attr-size-gt1"]; + break; + case "td": + case "th": + case "tr": + if (RPTUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + tagProperty = specialTagProperties["des-table"]; + } + else { + RPTUtil.getAncestorWithRole(ruleContext, "grid", true) || RPTUtil.getAncestorWithRole(ruleContext, "treegrid", true) ? tagProperty = specialTagProperties["des-grid"] : tagProperty = specialTagProperties["des-other"]; + } + break; + default: + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["default"]; + } //switch + } + return tagProperty || null; + }; + RPTUtil.getAllowedAriaRoles = function (ruleContext, properties) { + var allowedRoles = []; + var tagProperty = null; + if (properties !== null && properties !== undefined) { + tagProperty = properties; + } + else { + tagProperty = RPTUtil.getElementAriaProperty(ruleContext); + } + if (tagProperty !== null && tagProperty !== undefined) { + if (tagProperty.implicitRole !== null) { + RPTUtil.concatUniqueArrayItemList(tagProperty.implicitRole, allowedRoles); + } + if (tagProperty.validRoles !== null) { + RPTUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + } + return allowedRoles; + }; + RPTUtil.getAllowedAriaAttributes = function (ruleContext, permittedRoles, properties) { + var tagName = ruleContext.tagName.toLowerCase(); + var allowedAttributes = []; + /*These needs to be handled first since its applicable to all elements*/ + if (ruleContext.hasAttribute("disabled") && ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(tagName) === -1) { + /*Element with a disabled attribute https://www.w3.org/TR/html5/disabled-elements.html + Use the disabled attribute on any element that is allowed the disabled attribute in HTML5. aria-disabled="true" + Only use the aria-disabled attribute for elements that are not allowed to have a disabled attribute in HTML5 */ + allowedAttributes = RPTUtil.concatUniqueArrayItem("aria-disabled", allowedAttributes); + } + if (ruleContext.hasAttribute("required") && ARIADefinitions_1.ARIADefinitions.elementsAllowedRequired.indexOf(tagName) > -1) { + /*Element with a required attribute // http://www.the-art-of-web.com/html/html5-form-validation/ + * aria-required="true" Use the aria-required attribute on any element that is allowed the required attribute in HTML5. + * MAY also be used for elements that have an attached ARIA role which allows the aria-required attribute.*/ + allowedAttributes = RPTUtil.concatUniqueArrayItem("aria-required", allowedAttributes); + } + if (ruleContext.hasAttribute("readonly") && ARIADefinitions_1.ARIADefinitions.elementsAllowedReadOnly.indexOf(tagName) === -1) { + /*Element with a readonly attribute* aria-readonly="true" * Use the readonly attribute on any element that is allowed the readonly attribute in HTML5. + Only use the aria-readonly attribute for elements that are not allowed to have a readonly attribute in HTML5 */ + allowedAttributes = RPTUtil.concatUniqueArrayItem("aria-readonly", allowedAttributes); + } + if (ruleContext.hasAttribute("hidden")) { + /*Element with a hidden attribute Use the aria-hidden attribute on any HTML element. + Note: If an element has a hidden attribute, an aria-hidden attribute is not required.*/ + allowedAttributes = RPTUtil.concatUniqueArrayItem("aria-hidden", allowedAttributes); + } + var tagProperty = null; + if (properties != null && properties !== undefined) + tagProperty = properties; + else + tagProperty = RPTUtil.getElementAriaProperty(ruleContext); + var skipImplicitRoleCheck = false; + if (tagName === "form" || tagName === "section") { + // special case: form has an implicit role only if it has an accessible name + skipImplicitRoleCheck = !ruleContext.hasAttribute("aria-label") && + !ruleContext.hasAttribute("aria-labelledby") && + !ruleContext.hasAttribute("title"); + } + if (tagProperty !== null && tagProperty !== undefined) { + // add the implicit role allowed attributes to the allowed role list if there is no specified role + if (tagProperty.implicitRole !== null && + (permittedRoles === null || permittedRoles === undefined || permittedRoles.length === 0) && + !skipImplicitRoleCheck) { + for (var i = 0; i < tagProperty.implicitRole.length; i++) { + var roleProperty = ARIADefinitions_1.ARIADefinitions.designPatterns[tagProperty.implicitRole[i]]; + if (roleProperty !== null && roleProperty !== undefined) { + var properties_1 = roleProperty.props; + RPTUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + properties_1 = RPTUtil.getRoleRequiredProperties(tagProperty.implicitRole[i], ruleContext); + RPTUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + // special case of separator + if (tagProperty.implicitRole[i] === "separator" && RPTUtil.isFocusable(ruleContext)) { + RPTUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + } + // Adding the global properties to the valid attribute list + if (tagProperty.globalAriaAttributesValid) { + var properties_2 = ARIADefinitions_1.ARIADefinitions.globalProperties; // global properties + RPTUtil.concatUniqueArrayItemList(properties_2, allowedAttributes); + } + else { + // special case: with alt="" allows only aria-hidden + if (tagName === "img" && + ruleContext.hasAttribute("alt") && + ruleContext.getAttribute("alt").trim() === "") { + RPTUtil.concatUniqueArrayItemList(["aria-hidden"], allowedAttributes); + } + } + } + // adding the specified role properties to the allowed attribute list + for (var i = 0; permittedRoles !== null && i < permittedRoles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[permittedRoles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + var properties_3 = roleProperties.props; // allowed properties + RPTUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + properties_3 = RPTUtil.getRoleRequiredProperties(permittedRoles[i], ruleContext); // required properties + RPTUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + // special case for separator + if (permittedRoles[i] === "separator" && RPTUtil.isFocusable(ruleContext)) { + RPTUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + // ignore aria-level, aria-setsize or aria-posinset if "row" is not in treegrid + if (permittedRoles.includes("row") && RPTUtil.getAncestorWithRole(ruleContext, "treegrid", true) == null) { + var index = -1; + if ((index = allowedAttributes.indexOf("aria-level")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-setsize")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-posinset")) > -1) + allowedAttributes.splice(index, 1); + } + return allowedAttributes; + }; + RPTUtil.CSS = function (element) { + var styleText = ""; + if (element === null) + return []; + if (element.IBM_CSS_THB) + return element.IBM_CSS_THB; + var nodeName = element.nodeName.toLowerCase(); + if (nodeName === "style") { + styleText = RPTUtil.getInnerText(element); + } + else if (element.hasAttribute("style")) { + styleText = element.getAttribute("style"); + } + else + return []; + if (styleText === null || styleText.trim().length === 0) + return []; + //remove comment blocks + var re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g; + var subst = ' '; + styleText = styleText.replace(re, subst); + // Find all "key : val;" pairs with various whitespace inbetween + var rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g; + // Find all "selector { csskeyvals } with various whitespace inbetween + var rSelectors = /\s*([^{]*){([^}]*)}/g; + if (styleText.indexOf("{") === -1) { + var keyVals = {}; + var m = void 0; + while ((m = rKeyVals.exec(styleText)) != null) { + keyVals[m[1]] = m[2].trim().toLowerCase(); + } + var retVal = [{ + selector: null, + values: keyVals + }]; + element.IBM_CSS_THB = retVal; + return retVal; + } + else { + var retVal = []; + var m = void 0; + var m2 = void 0; + while ((m = rSelectors.exec(styleText)) != null) { + var keyVals = {}; + var selKey = m[1]; + var selVal = m[2]; + while ((m2 = rKeyVals.exec(selVal)) != null) { + keyVals[m2[1]] = m2[2].trim().toLowerCase(); + } + retVal.push({ + selector: selKey, + values: keyVals + }); + } + element.IBM_CSS_THB = retVal; + return retVal; + } + }; + /** + * This function is responsible for checking if the node that is provied is + * visible or not. Following is how the check is performed: + * 1. Check if the current node is hidden with the following options: + * CSS --> dislay: none + * CSS --> visibility: hidden + * attribute --> hidden + * 2. Check if the any of the current nodes parents are hidden with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are hidden then this + * function will return false (node is not visible). + * + * @parm {element} node The node which should be checked if it is visible or not. + * @return {bool} false if the node is NOT visible, true otherwise + * + * @memberOf RPTUtil + */ + RPTUtil.isNodeVisible = function (node) { + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + RPTUtil.setCache(node, "PT_NODE_HIDDEN", RPTUtil.getCache(node, "PT_NODE_HIDDEN", false)); + // Check the nodeType if this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // visibility is directly related to the parent node. + if (node.nodeType === 3) { + node = DOMUtil_1.DOMUtil.parentNode(node); + } + // We should only allow nodeType element, and TextNode all other nodesTypes + // we can return the visibility as visible. + // Following nodes will be returned as visable by default, since we can not + // actually change their visibility. + // Node.PROCESSING_INSTRUCTION_NODE --> 7 + // Node.COMMENT_NODE --> 8 + // 9 /* Node.DOCUMENT_NODE */ --> 9 + // Node.DOCUMENT_TYPE_NODE --> 10 + // Node.DOCUMENT_FRAGMENT_NODE --> 11 + if (node.nodeType !== 1) { + return true; + } + // Make sure that the ownerDocument is present before moving forward + // in detecting if the node is visible or not. In the case that ownerDocument + // does not exist then we simply return node is visible by default. + if (!node.ownerDocument) { + return true; + } + // Variable Declaration + var compStyle; + var nodeName = node.nodeName.toLowerCase(); + // In the case this node is a script, link or style node, right away return node is visible + // because scripts, links and style nodes can not be hidden by HTML attribute or CSS or are hidden by default. But we want to scan + // the elements everytime as they render content still which is still visible to users. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + if (RPTUtil.hiddenByDefaultElements != null && RPTUtil.hiddenByDefaultElements != undefined && RPTUtil.hiddenByDefaultElements.indexOf(nodeName) > -1) { + return true; + } + // Check if this node is visible, we check couple of CSS properties and hidden attribute. + // area, param and audio elements we do not check if they are hidden as it does not apply to them. + // Check the unhideableElements array which is part of the rules, to check if this element is allowed to be hidden or not + // in the case that the element is part of the unhideableElements array then we do not run the hidden check on this element, + // and go stright to the parent node. + // Array check elements like: + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // In the case that unhideableElements array is not defined then we just scan all elements and do no filtering at all. + if (RPTUtil.unhideableElements === null || RPTUtil.unhideableElements === undefined || RPTUtil.unhideableElements.indexOf(nodeName) === -1) { + // Check if defaultView exists for this node, if it does then use this to run the getComputedStyle + // function to get the CSS style for the node. + if (node.ownerDocument.defaultView) { + // Run the getComputedStyle on this node to fetch the CSS compuation of the node + compStyle = node.ownerDocument.defaultView.getComputedStyle(node, null); + } + // In the case that defaultView does not exists return true to identify that this + // node is visible, because were not able to detect if it was not. + else { + return true; + } + // Get the hidden element property and hidden attribute + var hiddenAttribute = node.getAttribute("hidden"); + var hiddenPropertyCustom = RPTUtil.getCache(node, "PT_NODE_HIDDEN", undefined); + // To get the hidden property we need to perform a special check as in some cases the hidden property will not be + // a boolean, for theses cases we set it to false as we are not able to determine the true hidden condition. + // The reason for this is because form elements are able to perform an override, so when we have id="hidden" for an element + // which is under the form element then, node.hidden gives the element/list of elements which have id="hidden". Refer to + // mozilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1267356 + var hiddenProperty = typeof node.hidden === "boolean" ? node.hidden : false; + // If compStyle object is empty, node does't have hidden property, node does't have hidden attribute and does't have custom PT + // hidden property then we can just return true (node visible) at this point. + if (!compStyle && + !hiddenProperty && // this covers false, null, or undefined + (hiddenAttribute === null || hiddenAttribute === undefined) && + !hiddenPropertyCustom // This covers false, null or undefined + ) { + return true; + } + // In the case that the compStyle is defined we check the following: + // CSS style display set to none + // CSS style visibility set to hidden + // Note: For this property since it is inherited, need to skip the check on parents as + // the parent can have hidden but the child can be visible. So we only check this property + // on child elements/elements that are passed to this function the first time. + // node hidden property set (node.hidden) + // node attribute hidden set (to any value) + // node custom hidden property ser (node.PT_NODE_HIDDEN) + // If any of the above conditions are true then we return false as this element is not visible + if ((compStyle !== null && ((compStyle.getPropertyValue('display') === 'none' || + (!RPTUtil.getCache(node, "Visibility_Check_Parent", null) && compStyle.getPropertyValue('visibility') === 'hidden'))) || + (compStyle.getPropertyValue('display') !== 'block' && (hiddenProperty || hiddenAttribute != null || hiddenPropertyCustom)))) { + // Set a custom expandos property on the the node to identify that it is hidden, so that we can uses + // use this in the rules to determine if the node is hidden or not, if we need to. + // Use expandos property instead of a hash map which stores the elements, adding/checking expandos + // properties is a lot faster performance whise. For Hash map we need to store based on xpath, and to calculate + // xpath it is more performance impact. + RPTUtil.setCache(node, "PT_NODE_HIDDEN", true); + return false; + } + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMUtil_1.DOMUtil.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is visible or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // When we have a parent element going through the isNodeVisible function we have to mark it as such + // so that in the function we can skip checking visibility: hidden for parent elements since visibility: hidden + // is inherited, which allows a child to have a different setting then the child. This property only needs to be checked + // once for the first element that is passed down and that is all. Ignore it for all the parents that we iterate over. + RPTUtil.setCache(parentElement, "Visibility_Check_Parent", true); + // Check upwards recursively, and save the results in an variable + var nodeVisible = RPTUtil.isNodeVisible(parentElement); + // If the node is found to not be visible then add the custom PT_NODE_HIDDEN to true. + // so that we can use this in the rules. + if (!nodeVisible) { + RPTUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // Check upwards recursively + return nodeVisible; + } + // Return true (node is visible) + return true; + }; + /** + * return true if the node or its ancester is natively hidden or aria-hidden = 'true' + * @param node + */ + RPTUtil.isNodeHiddenFromAT = function (node) { + if (!RPTUtil.isNodeVisible(node) || node.getAttribute("aria-hidden") === 'true') + return true; + var ancestor = RPTUtil.getAncestorWithAttribute(node, "aria-hidden", "true"); + if (ancestor) + return true; + return false; + }; + RPTUtil.getControlOfLabel = function (node) { + // Handle the easy case of label -> for + var labelAncestor = RPTUtil.getAncestor(node, "label"); + if (labelAncestor) { + if (labelAncestor.hasAttribute("for")) { + return fragment_1.FragmentUtil.getById(node, labelAncestor.getAttribute("for")); + } + } + // Create a dictionary containing ids of parent nodes + var idDict = {}; + var parentWalk = node; + while (parentWalk) { + if (parentWalk.nodeType === 1 /* Node.ELEMENT_NODE */) { + var ancestor = parentWalk; + if (ancestor.hasAttribute("id")) { + idDict[ancestor.getAttribute("id")] = true; + } + } + parentWalk = DOMUtil_1.DOMUtil.parentNode(parentWalk); + } + // Iterate through controls that use aria-labelledby and see if any of them reference one of my ancestor ids + var inputsUsingLabelledBy = node.ownerDocument.querySelectorAll("*[aria-labelledby]"); + for (var idx = 0; idx < inputsUsingLabelledBy.length; ++idx) { + var inputUsingLabelledBy = inputsUsingLabelledBy[idx]; + var ariaLabelledBy = inputUsingLabelledBy.getAttribute("aria-labelledby"); + var sp = ariaLabelledBy.split(" "); + for (var _i = 0, sp_1 = sp; _i < sp_1.length; _i++) { + var id = sp_1[_i]; + if (id in idDict) { + return inputUsingLabelledBy; + } + } + } + // Find the cases where we're within an aria labelledby + return null; + }; + /** + * This function is responsible for checking if the node that is provied is + * disabled or not. Following is how the check is performed: + * 1. Check if the current node is disabled with the following options: + * attribute --> disabled + * Also needs to be "button", "input", "select", "textarea", "optgroup", "option", + * "menuitem", "fieldset" nodes (in array elementsAllowedDisabled) + * attribute --> aria-disabled="true" + * 2. Check if any of the current nodes parents are disabled with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are disabled then this + * function will return true (node is disabled). + * + * @parm {HTMLElement} node - The node which should be checked if it is disabled or not. + * @return {bool} true if the node is disabled, false otherwise + * + * @memberOf RPTUtil + */ + RPTUtil.isNodeDisabled = function (node) { + // Set PT_NODE_DISABLED to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is disabled. We have to set it to false so that we know + // the node has already been checked. Only set it to false if the setting is undefined or null + // as if it is defined we do not wnat to reset it. As if it is true then we should make use of it + // to speed up the check. + var PT_NODE_DISABLED = RPTUtil.getCache(node, "PT_NODE_DISABLED", false); + // Check the nodeType of this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // disabled is directly related to the parent node. + if (node.nodeType === 3) { + node = DOMUtil_1.DOMUtil.parentNode(node); + } + // Variable Declaration + var nodeName = node.nodeName.toLowerCase(); + // Get the disabled element property, disabled and aria-disabled attribute and check that it is true + var disabledAttribute = node.hasAttribute("disabled"); + var disabledPropertyCustom = PT_NODE_DISABLED; + var ariaDisabledAttribute = node.hasAttribute('aria-disabled') && node.getAttribute("aria-disabled") === 'true'; + // If this node has disabled attribute and the node allows disabled attribute, then return true. + // Disabled attribute is only allowed on "button", "input", "select", "textarea", "optgroup", "option", "menuitem", "fieldset" + // In the case aria-disabled is set to true, then also return true + if (disabledPropertyCustom || (disabledAttribute && ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(nodeName) > -1) || ariaDisabledAttribute) { + PT_NODE_DISABLED = true; + RPTUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // disabled attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMUtil_1.DOMUtil.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is disabled or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // Check upwards recursively, and save the results in an variable + var nodeDisabled = RPTUtil.isNodeDisabled(parentElement); + // If the node is found to be disabled then add the custom PT_NODE_DISABLED to true. + // so that we can use this next time, to quickly determine if node is disabled or not. + // This is extra percaution, the isNodeDisabled function already sets this. + if (nodeDisabled) { + PT_NODE_DISABLED = true; + } + // Check upwards recursively + RPTUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return nodeDisabled; + } + // Return false (node is not disabled) + return false; + }; + /** + * This function is responsible for determine if hidden content should be checked + * in rules. + * + * @parm {element} node - A node so that the document can be accessed to check for the + * option. Can be document element or a simple node element. + * @return {bool} true if hidden content should be checked, false otherwise + * + * @memberOf RPTUtil + */ + RPTUtil.shouldCheckHiddenContent = function (node) { + return false; + }; + /** + * This function is responsible for determining if node should be skipped from checking or not, based + * on the Check Hidden Content settings and if the node is visible or not. + * + * @parm {element} node - Node to check if it is visible or not based on the Check Hidden Content + * setting. + * + * @return {bool} true if node should be skipped, false otherwise + * + * @memberOf RPTUtil + */ + RPTUtil.shouldNodeBeSkippedHidden = function (node) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we + // return true to identify that the node should not be scanned/added to any hash/array. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (!RPTUtil.shouldCheckHiddenContent(node) && !RPTUtil.isNodeVisible(node)) { + return true; + } + return false; + }; + RPTUtil.isfocusableByDefault = function (node) { + var focusableElements = ['input', 'select', 'button', 'textarea', 'option', 'area']; + if (node.nodeName.toLowerCase() === "a" && RPTUtil.hasAttribute(node, 'href')) + return true; + if (node.nodeName.toLowerCase() === "area" && RPTUtil.hasAttribute(node, 'href')) + return true; + if (focusableElements.indexOf(node.nodeName.toLowerCase()) != -1) + return true; + return false; + }; + /** + * This function check if a non-tabable node has valid tabable content. + * If it is tabable (the tabindex is not speicified or is not -1), returns false; + * If it is non-tabable, but a child is tabable and does not have element content, returns false; + * Otherwise, returns true. + */ + RPTUtil.nonTabableChildCheck = function (element) { + if (!element.hasAttribute("tabindex") || + (parseInt(element.getAttribute("tabindex")) != -1)) { + return false; + } + var nw = new NodeWalker(element); + while (nw.nextNode()) { + var child = nw.elem(); + if (child === null) { // Text node. usually is a cartridge return. + continue; + } + if (child.hasAttribute("tabindex") && + (parseInt(child.getAttribute("tabindex")) != -1) && + !RPTUtil.hasInnerContent(child)) { + return false; + } + } + return true; + }; + // Rewrite the color object to account for alpha + RPTUtil.Color = function (cssStyleColor) { + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor === "transparent") + return new ColorObj(255, 255, 255, 0); + if (cssStyleColor in RPTUtil.CSSColorLookup) + cssStyleColor = RPTUtil.CSSColorLookup[cssStyleColor]; + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3]); + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3], m[4]); + } + } + else if (cssStyleColor.charAt(0) != "#") { + return null; + } + else { + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + var thisRed = parseInt(cssStyleColor.substring(1, 3), 16); + var thisGreen = parseInt(cssStyleColor.substring(3, 5), 16); + var thisBlue = parseInt(cssStyleColor.substring(5, 7), 16); + return new ColorObj(thisRed, thisGreen, thisBlue); + } + // return null; // Unreachable + }; + ; + RPTUtil.ColorCombo = function (ruleContext) { + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + var ancestors = []; + var walkNode = ruleContext; + while (walkNode) { + if (walkNode.nodeType === 1) + ancestors.push(walkNode); + walkNode = DOMUtil_1.DOMUtil.parentElement(walkNode); + } + var retVal = { + "hasGradient": false, + "hasBGImage": false, + "fg": null, + "bg": null + }; + var compStyleColor = win.getComputedStyle(ruleContext).color; + if (!compStyleColor) + compStyleColor = "black"; + var fg = RPTUtil.Color(compStyleColor); + var reColor = /transparent|rgba?\([^)]+\)/gi; + var guessGradColor = function (gradList, bgColor, fgColor) { + try { + // If there's only one color, return that + if (typeof gradList.length === "undefined") + return gradList; + var overallWorst = null; + var overallWorstRatio = null; + for (var iGrad = 1; iGrad < gradList.length; ++iGrad) { + var worstColor = gradList[iGrad - 1]; + var worstRatio = fgColor.contrastRatio(gradList[iGrad - 1]); + var step = .1; + var idx = 0; + while (step > .0001) { + while (idx + step <= 1 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx + step; + } + while (idx - step >= 0 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx - step; + } + step = step / 10; + } + if (overallWorstRatio === null || overallWorstRatio > worstRatio) { + overallWorstRatio = worstRatio; + overallWorst = worstColor; + } + } + return overallWorst; + } + catch (e) { + console.log(e); + } + return bgColor; + }; + var priorStackBG = RPTUtil.Color("white"); + var thisStackOpacity = null; + var thisStackAlpha = null; + var thisStackBG = null; + // Ancestors processed from the topmost parent toward the child + while (ancestors.length > 0) { + var procNext = ancestors.pop(); + // cStyle is the computed style of this layer + var cStyle = win.getComputedStyle(procNext); + if (cStyle === null) + continue; + // thisBgColor is the color of this layer or null if the layer is transparent + var thisBgColor = null; + if (cStyle.backgroundColor && cStyle.backgroundColor != "transparent" && cStyle.backgroundColor != "rgba(0, 0, 0, 0)") { + thisBgColor = RPTUtil.Color(cStyle.backgroundColor); + } + // If there is a gradient involved, set thisBgColor to the worst color combination available against the foreground + if (cStyle.backgroundImage && cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + var gradColors = cStyle.backgroundImage.match(reColor); + if (gradColors) { + var gradColorComp = []; + for (var i = 0; i < gradColors.length; ++i) { + if (!gradColors[i].length) { + gradColors.splice(i--, 1); + } + else { + gradColorComp.push(RPTUtil.Color(gradColors[i])); + } + } + thisBgColor = guessGradColor(gradColorComp, thisStackBG || priorStackBG, fg); + } + } + // Handle non-solid opacity + if (thisStackOpacity === null || (cStyle.opacity && cStyle.opacity.length > 0 && parseFloat(cStyle.opacity) < 1)) { + // New stack, reset + if (thisStackBG != null) { + // Overlay + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + thisStackOpacity = 1.0; + thisStackAlpha = null; + thisStackBG = null; + if (cStyle.opacity && cStyle.opacity.length > 0) { + thisStackOpacity = parseFloat(cStyle.opacity); + } + if (thisBgColor != null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0) { + retVal.hasBGImage = false; + retVal.hasGradient = false; + } + } + } + // Handle solid color backgrounds and gradient color backgrounds + else if (thisBgColor != null) { + // If this stack already has a background color, blend it + if (thisStackBG === null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + } + else { + thisStackBG = thisBgColor.getOverlayColor(thisStackBG); + } + // #526: If thisBgColor had an alpha value, it may not expose through thisStackBG in the above code + // We can't wipe out the gradient info if this layer was transparent + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0 && (thisStackBG.alpha || 1.0) === 1.0 && (thisBgColor.alpha || 1.0) === 0) {} + } + if (cStyle.backgroundImage && cStyle.backgroundImage != "none") { + if (cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + retVal.hasGradient = true; + } + else { + retVal.hasBGImage = true; + } + } + } + if (thisStackBG != null) { + fg = fg.getOverlayColor(thisStackBG); + delete fg.alpha; + } + fg.alpha = (fg.alpha || 1) * thisStackOpacity; + fg = fg.getOverlayColor(priorStackBG); + if (thisStackBG != null) { + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + retVal.fg = fg; + retVal.bg = priorStackBG; + return retVal; + }; + ; + RPTUtil.hasAttribute = function (element, attributeName) { + var hasAttribute = false; + if (element.hasAttribute) { + hasAttribute = element.hasAttribute(attributeName); + } + else if (element.attributes && element.attributes.getNamedItem) { + var attr = element.attributes.getNamedItem(attributeName); + hasAttribute = attr && attr.specified; + } + return hasAttribute; + }; + // This list contains a list of element tags which can not be hidden, when hidden is + // added to theses elements it does not do anything at all. + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // Note: All element tags that are added here should be added as lowercase, as we are using indexOf to do the check. + RPTUtil.unhideableElements = ['area', 'param', 'audio']; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + // on theses elements we need to make then visible by default so that the rules can trigger regardless of the + // Check Hidden Content option in the tools. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // head --> head elements have display: none by default, but it will still behave correct + // title --> title elements have display: none by default, but it will still display the title + // meta --> meta elements have display: none by default, but it will still perform the action that meta is suppose to + // base --> base elements have display: none by default, but it will still perform the action that meta is suppose to + // noscript --> noscript elements have display: none by default, but it will still perform the action that meta is suppose to + // template --> template elements have display: none by default, because they are just a mechanism for holding client-side content + // that is not to be rendered when a page is loaded. https://developer.mozilla.org/en/docs/Web/HTML/Element/template + // datalist --> datalist elements have display: none by default, + RPTUtil.hiddenByDefaultElements = ['script', 'link', 'style', 'head', 'title', 'meta', 'base', 'noscript', 'template', 'datalist']; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + RPTUtil.navLinkKeywords = ['start', 'next', 'prev', 'previous', 'contents', 'index']; + // This list contains a list of rule ids for the rules that have to check for hidden content regardless of the Check Hidden + // Content Setting. This means that when the engine is actually determine which elements to mass to the rules, it will always + // pass theses rules no matter what the Check Hidden Content Setting is. + RPTUtil.rulesThatHaveToCheckHidden = ['RPT_Elem_UniqueId']; + // https://www.w3.org/TR/wai-aria-1.1/#introstates + RPTUtil.ariaAttributeRoleDefaults = { + "alert": { + "aria-live": "assertive", + "aria-atomic": "true" + }, + "combobox": { + "aria-haspopup": "listbox" + }, + "listbox": { + "aria-orientation": "vertical" + }, + "log": { + "aria-live": "polite" + }, + "menu": { + "aria-orientation": "vertical" + }, + "menubar": { + "aria-orientation": "horizontal" + }, + "meter": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "option": { + "aria-selected": "false" + }, + "progressbar": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "scrollbar": { + "aria-orientation": "vertical", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "separator": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "slider": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "spinbutton": { + // Not sure how to encode min/max (or now in 1.2 - "has no value") + //"aria-valuenow": "0" TODO: at risk: maybe delete after ARIA 1.2 reaches proposed rec + // Probably just delete spinbutton from this list completely and let user agents handle "defaults" + }, + "status": { + "aria-live": "polite", + "aria-atomic": "true" + }, + "tab": { + "aria-selected": "false" + }, + "tablist": { + "aria-orientation": "horizontal" + }, + "toolbar": { + "aria-orientation": "horizontal" + }, + "tree": { + "aria-orientation": "vertical" + } + }; + // https://www.w3.org/TR/wai-aria-1.1/#aria-atomic + RPTUtil.ariaAttributeGlobalDefaults = { + "aria-atomic": "false", + "aria-autocomplete": "none", + "aria-busy": "false", + "aria-checked": undefined, + "aria-current": "false", + "aria-disabled": "false", + "aria-dropeffect": "none", + "aria-expanded": undefined, + "aria-grabbed": undefined, + "aria-haspopup": "false", + "aria-hidden": undefined, + "aria-invalid": "false", + "aria-live": "off", + "aria-modal": "false", + "aria-multiline": "false", + "aria-multiselectable": "false", + "aria-orientation": undefined, + "aria-pressed": undefined, + "aria-readonly": "false", + //"aria-relevant": "additions text", TODO: are multiple values supported? + "aria-required": "false", + "aria-selected": undefined, + "aria-sort": "none" + }; + // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings + RPTUtil.ariaAttributeImplicitMappings = { + "aria-autocomplete": { + "form": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "input": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "select": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "textarea": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + } + }, + "aria-checked": { + "input": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "menuitem": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "*": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + }, + }, + "aria-disabled": { + "button": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "fieldset": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "input": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "optgroup": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "option": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "select": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "textarea": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + } + }, + "aria-expanded": { + "details": function (e) { + return e.getAttribute("open"); + }, + "dialog": function (e) { + return e.getAttribute("open"); + } + }, + "aria-multiselectable": { + "select": function (e) { + if (e.hasAttribute("multiple")) + return "true"; + return; + } + }, + "aria-placeholder": { + "input": function (e) { + return e.getAttribute("placeholder"); + }, + "textarea": function (e) { + return e.getAttribute("placeholder"); + } + }, + "aria-required": { + "input": function (e) { + return e.getAttribute("required"); + }, + "select": function (e) { + return e.getAttribute("required"); + }, + "textarea": function (e) { + return e.getAttribute("required"); + } + } + }; + RPTUtil.tabTagMap = { + "button": function (element) { + return !element.hasAttribute("disabled"); + }, + "iframe": true, + "input": function (element) { + return element.getAttribute("type") !== "hidden" && !element.hasAttribute("disabled"); + }, + "select": function (element) { + return !element.hasAttribute("disabled"); + }, + "textarea": true, + "div": function (element) { + return element.hasAttribute("contenteditable"); + }, + "a": function (element) { + // xlink:href?? see svg + return element.hasAttribute("href"); + }, + "area": function (element) { + return element.hasAttribute("href"); + }, + "audio": function (element) { + return element.hasAttribute("controls"); + }, + "video": function (element) { + return element.hasAttribute("controls"); + }, + "summary": true + }; + RPTUtil.CSSColorLookup = { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", + "buttontext": "rgba(0, 0, 0, 0.847)", + "buttonface": "#ffffff", + "graytext": "rgba(0, 0, 0, 0.247)" + }; + return RPTUtil; +}()); +exports.RPTUtil = RPTUtil; +var RPTUtilStyle = /** @class */ (function () { + function RPTUtilStyle() { + } + RPTUtilStyle.getWeightNumber = function (styleVal) { + var map = { + "light": 100, + "bold": 700 + }; + var retVal = parseInt(styleVal); + if (retVal) + return retVal; + if (styleVal in map) + return map[styleVal]; + return 400; + }; + RPTUtilStyle.getFontInPixels = function (styleVal) { + var map = { + "xx-small": 16, + "x-small": 10, + "small": 13, + "medium": 16, + "large": 18, + "x-large": 24, + "xx-large": 32 + }; + var value = parseFloat(styleVal); + if (!value) { + return map[styleVal]; + } + var units = styleVal.substring(("" + value).length); + if (units === "" || units === "px") + return value; + if (units === "em") + return value * 16; + if (units === "%") + return value / 100 * 16; + if (units === "pt") + return value * 4 / 3; + return Math.round(value); + }; + return RPTUtilStyle; +}()); +exports.RPTUtilStyle = RPTUtilStyle; +var ColorObj = /** @class */ (function () { + function ColorObj(red, green, blue, alpha) { + function fixComponent(comp) { + if (typeof (comp) != typeof ("")) + return comp; + var compStr = comp; + compStr = compStr.trim(); + if (compStr[compStr.length - 1] != "%") + return parseInt(compStr); + return Math.round(parseFloat(compStr.substring(0, compStr.length - 1)) * 2.55); + } + this.red = fixComponent(red); + this.green = fixComponent(green); + this.blue = fixComponent(blue); + if (typeof (alpha) != "undefined") { + this.alpha = (typeof (alpha) === typeof ("")) ? parseFloat(alpha) : alpha; + } + } + ColorObj.prototype.toHexHelp = function (value) { + var retVal = Math.round(value).toString(16); + if (retVal.length === 1) + return "0" + retVal; + return retVal; + }; + ; + ColorObj.prototype.toHex = function () { + return "#" + this.toHexHelp(this.red) + this.toHexHelp(this.green) + this.toHexHelp(this.blue); + }; + ; + ColorObj.prototype.contrastRatio = function (bgColor) { + var fgColor = this; + if (typeof (this.alpha) != "undefined") + fgColor = this.getOverlayColor(bgColor); + var lum1 = fgColor.relativeLuminance(); + if (!bgColor.relativeLuminance) { + var s = ""; + for (var key in bgColor) { + s += key + "\n"; + } + alert(bgColor); + alert(s); + } + var lum2 = bgColor.relativeLuminance(); + var ratio = (lum1 > lum2) ? (lum1 + .05) / (lum2 + .05) : (lum2 + .05) / (lum1 + .05); + return ratio; + }; + ; + ColorObj.prototype.relativeLuminance = function () { + var R = this.red / 255.0; + var G = this.green / 255.0; + var B = this.blue / 255.0; + R = R <= .04045 ? R / 12.92 : Math.pow((R + .055) / 1.055, 2.4); + G = G <= .04045 ? G / 12.92 : Math.pow((G + .055) / 1.055, 2.4); + B = B <= .04045 ? B / 12.92 : Math.pow((B + .055) / 1.055, 2.4); + return 0.2126 * R + 0.7152 * G + 0.0722 * B; + }; + ; + ColorObj.prototype.mix = function (color2, percThis) { + if (typeof (this.alpha) === "undefined" && typeof (color2.alpha) === "undefined") { + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue); + } + else { + var alphaThis = this.alpha ? this.alpha : 1; + var alphaOther = color2.alpha ? color2.alpha : 1; + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue, percThis * alphaThis + (1 - percThis) * alphaOther); + } + }; + ; + ColorObj.prototype.getOverlayColor = function (bgColor) { + if (typeof (this.alpha) === "undefined" || this.alpha >= 1) { + // No mixing required - it's opaque + return this; + } + if (this.alpha < 0) { + // Haac.Error.logError("Invalid alpha value"); + return null; + } + if (typeof (bgColor.alpha) != "undefined" && bgColor.alpha < 1) { + // Haac.Error.logError("Cannot mix with a background alpha"); + return null; + } + var retVal = this.mix(bgColor, this.alpha); + delete retVal.alpha; + return retVal; + }; + ColorObj.fromCSSColor = function (cssStyleColor) { + var thisRed = -1; + var thisGreen = -1; + var thisBlue = -1; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else { + if (cssStyleColor.charAt(0) != "#") { + if (cssStyleColor in RPTUtil.CSSColorLookup) + cssStyleColor = RPTUtil.CSSColorLookup[cssStyleColor]; + else + return null; + } + var fromHex = function (val) { + var lookup = { + "a": 10, + "b": 11, + "c": 12, + "d": 13, + "e": 14, + "f": 15 + }; + var retVal = 0; + for (var i = 0; i < val.length; ++i) { + retVal = retVal * 16 + + parseInt(val.charAt(i) in lookup ? lookup[val.charAt(i)] : val.charAt(i)); + } + return retVal; + }; + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + thisRed = fromHex(cssStyleColor.substring(1, 3)); + thisGreen = fromHex(cssStyleColor.substring(3, 5)); + thisBlue = fromHex(cssStyleColor.substring(5, 7)); + } + return new ColorObj(thisRed, thisGreen, thisBlue); + }; + return ColorObj; +}()); +exports.ColorObj = ColorObj; +/* Return a node walker for the given element. + * bEnd is optional and defaults to false + * but if true, indicates the node is the end node*/ +var NodeWalker = /** @class */ (function () { + function NodeWalker(node, bEnd) { + this.node = node; + this.bEndTag = (bEnd === undefined ? false : bEnd === true); + } + NodeWalker.prototype.elem = function () { + return this.node.nodeType === 1 && this.node || null; + }; + NodeWalker.prototype.nextNode = function () { + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + var slotOwner = this.node; + this.node = slotElement.assignedNodes()[0]; + this.node.slotOwner = slotOwner; + } + else if (this.node.firstChild) { + this.node = this.node.firstChild; + } + else { + this.bEndTag = true; + return this.nextNode(); + } + } + else { + if (this.node.nextSibling) { + this.node = this.node.nextSibling; + this.bEndTag = false; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (this.node.slotOwner) { + if (this.node.nodeType !== 1 || !this.node.hasAttribute("slot")) { + // If this wasn't a named slot, look for the next unnamed node to put in the slot + var n = this.node.nextSibling; + while (n && this.node.nodeType === 1 && this.node.hasAttribute("slot")) { + n = this.node.nextSibling; + } + if (n) { + // We found another unnamed slot + var slotOwner = this.node.slotOwner; + this.node = n; + this.node.slotOwner = slotOwner; + this.bEndTag = false; + } + else { + this.node = this.node.slotOwner; + this.bEndTag = true; + } + } + else { + this.node = this.node.slotOwner; + this.bEndTag = true; + } + } + else if (this.node.parentNode) { + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + return false; + } + } + return true; + }; + NodeWalker.prototype.prevNode = function () { + if (this.bEndTag && this.node.lastChild) { + this.node = this.node.lastChild; + this.bEndTag = true; + } + else if (this.node.previousSibling) { + this.node = this.node.previousSibling; + this.bEndTag = true; + } + else if (this.node.parentNode) { + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + if (this.bEndTag && (this.node.firstChild === null || typeof (this.node.firstChild) === 'undefined')) + this.bEndTag = false; + return true; + }; + return NodeWalker; +}()); +exports.NodeWalker = NodeWalker; + + +/***/ }), + +/***/ "./src/v2/common/CommonMapper.ts": +/*!***************************************!*\ + !*** ./src/v2/common/CommonMapper.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonMapper = void 0; +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var CommonMapper = /** @class */ (function () { + function CommonMapper() { + this.hierarchyRole = null; + this.hierarchyChildrenHaveRole = null; + this.hierarchyPath = null; + this.hierarchyResults = null; + } + CommonMapper.prototype.getBounds = function (node) { + return null; + }; + CommonMapper.prototype.reset = function (node) { + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyChildrenHaveRole = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + var ancestors = []; + var parent = DOMUtil_1.DOMUtil.parentNode(node); + while (parent && parent.nodeType != 9 /* Node.DOCUMENT_NODE */) { + ancestors.push(parent); + parent = DOMUtil_1.DOMUtil.parentNode(parent); + } + ancestors = ancestors.reverse(); + for (var _i = 0, ancestors_1 = ancestors; _i < ancestors_1.length; _i++) { + var ancestor = ancestors_1[_i]; + var siblings = []; + var sibling = ancestor.previousSibling; + while (sibling) { + siblings.push(sibling); + sibling = sibling.previousSibling; + } + siblings = siblings.reverse(); + for (var _a = 0, siblings_1 = siblings; _a < siblings_1.length; _a++) { + var sibling_1 = siblings_1[_a]; + this.pushHierarchy(sibling_1); + this.popHierarchy(); + } + this.pushHierarchy(ancestor); + } + }; + CommonMapper.prototype.pushHierarchy = function (node) { + var role; + var presentationalContainer = this.hierarchyChildrenHaveRole.length > 0 && !this.hierarchyChildrenHaveRole[this.hierarchyChildrenHaveRole.length - 1]; + if (presentationalContainer) { + role = "none"; + this.hierarchyChildrenHaveRole.push(false); + } + else { + role = this.getRole(node) || "none"; + this.hierarchyChildrenHaveRole.push(this.childrenHaveRole(node, role)); + } + this.hierarchyRole.push(role); + if (role !== "none") { + var parentPathInfo = this.hierarchyPath[this.hierarchyPath.length - 1]; + parentPathInfo.roleCount[role] = (parentPathInfo.roleCount[role] || 0) + 1; + this.hierarchyPath.push({ + "rolePath": parentPathInfo.rolePath + "/" + role + "[" + parentPathInfo.roleCount[role] + "]", + "roleCount": {} + }); + } + var attr = {}; + if (node.nodeType === 1) { + attr = this.getAttributes(node); + } + this.hierarchyResults.push({ + node: node, + namespace: this.getNamespace(), + role: role, + attributes: attr, + rolePath: this.hierarchyPath[this.hierarchyPath.length - 1].rolePath, + bounds: this.getBounds(node) + }); + }; + CommonMapper.prototype.popHierarchy = function () { + var role = this.hierarchyRole.pop(); + this.hierarchyChildrenHaveRole.pop(); + if (role !== "none") { + this.hierarchyPath.pop(); + } + this.hierarchyResults.pop(); + }; + CommonMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + return this.hierarchyResults; + }; + CommonMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + this.popHierarchy(); + return retVal; + }; + return CommonMapper; +}()); +exports.CommonMapper = CommonMapper; + + +/***/ }), + +/***/ "./src/v2/common/Context.ts": +/*!**********************************!*\ + !*** ./src/v2/common/Context.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Context = exports.PartInfo = exports.AttrInfo = void 0; +// Context that will cause this rule to execute. +// Context syntax: +// Triggers: +// aria:role - Triggers on element with ARIA role role +// aria:role[attribute] - Triggers on elements with the equivalent logical +// aria- attribute (e.g., button[disabled] will trigger on +//