@afixt/test-utils 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +13 -0
- package/.eslintrc +78 -0
- package/.gitattributes +5 -0
- package/.nvmrc +1 -0
- package/CLAUDE.md +33 -0
- package/README.md +72 -0
- package/docs/arrayUtils.js.html +69 -0
- package/docs/data/search.json +1 -0
- package/docs/domUtils.js.html +182 -0
- package/docs/fonts/Inconsolata-Regular.ttf +0 -0
- package/docs/fonts/OpenSans-Regular.ttf +0 -0
- package/docs/fonts/WorkSans-Bold.ttf +0 -0
- package/docs/getAccessibleName.js.html +456 -0
- package/docs/getAccessibleText.js.html +65 -0
- package/docs/getAriaAttributesByElement.js.html +22 -0
- package/docs/getCSSGeneratedContent.js.html +62 -0
- package/docs/getComputedRole.js.html +172 -0
- package/docs/getFocusableElements.js.html +29 -0
- package/docs/getGeneratedContent.js.html +18 -0
- package/docs/getImageText.js.html +28 -0
- package/docs/getStyleObject.js.html +48 -0
- package/docs/global.html +3 -0
- package/docs/hasAccessibleName.js.html +30 -0
- package/docs/hasAttribute.js.html +18 -0
- package/docs/hasCSSGeneratedContent.js.html +23 -0
- package/docs/hasHiddenParent.js.html +32 -0
- package/docs/hasParent.js.html +57 -0
- package/docs/hasValidAriaAttributes.js.html +33 -0
- package/docs/hasValidAriaRole.js.html +32 -0
- package/docs/index.html +3 -0
- package/docs/index.js.html +66 -0
- package/docs/isAriaAttributesValid.js.html +76 -0
- package/docs/isComplexTable.js.html +112 -0
- package/docs/isDataTable.js.html +241 -0
- package/docs/isFocusable.js.html +37 -0
- package/docs/isHidden.js.html +20 -0
- package/docs/isOffScreen.js.html +19 -0
- package/docs/isValidUrl.js.html +16 -0
- package/docs/isVisible.js.html +65 -0
- package/docs/module-afixt-test-utils.html +3 -0
- package/docs/scripts/core.js +726 -0
- package/docs/scripts/core.min.js +23 -0
- package/docs/scripts/resize.js +90 -0
- package/docs/scripts/search.js +265 -0
- package/docs/scripts/search.min.js +6 -0
- package/docs/scripts/third-party/Apache-License-2.0.txt +202 -0
- package/docs/scripts/third-party/fuse.js +9 -0
- package/docs/scripts/third-party/hljs-line-num-original.js +369 -0
- package/docs/scripts/third-party/hljs-line-num.js +1 -0
- package/docs/scripts/third-party/hljs-original.js +5171 -0
- package/docs/scripts/third-party/hljs.js +1 -0
- package/docs/scripts/third-party/popper.js +5 -0
- package/docs/scripts/third-party/tippy.js +1 -0
- package/docs/scripts/third-party/tocbot.js +672 -0
- package/docs/scripts/third-party/tocbot.min.js +1 -0
- package/docs/styles/clean-jsdoc-theme-base.css +1159 -0
- package/docs/styles/clean-jsdoc-theme-dark.css +412 -0
- package/docs/styles/clean-jsdoc-theme-light.css +482 -0
- package/docs/styles/clean-jsdoc-theme-scrollbar.css +30 -0
- package/docs/styles/clean-jsdoc-theme-without-scrollbar.min.css +1 -0
- package/docs/styles/clean-jsdoc-theme.min.css +1 -0
- package/docs/testContrast.js.html +236 -0
- package/docs/testLang.js.html +578 -0
- package/docs/testOrder.js.html +93 -0
- package/jsdoc.json +67 -0
- package/package.json +32 -0
- package/src/arrayUtils.js +67 -0
- package/src/domUtils.js +179 -0
- package/src/getAccessibleName.js +454 -0
- package/src/getAccessibleText.js +63 -0
- package/src/getAriaAttributesByElement.js +19 -0
- package/src/getCSSGeneratedContent.js +60 -0
- package/src/getComputedRole.js +169 -0
- package/src/getFocusableElements.js +26 -0
- package/src/getGeneratedContent.js +15 -0
- package/src/getImageText.js +25 -0
- package/src/getStyleObject.js +45 -0
- package/src/hasAccessibleName.js +28 -0
- package/src/hasAttribute.js +15 -0
- package/src/hasCSSGeneratedContent.js +20 -0
- package/src/hasHiddenParent.js +29 -0
- package/src/hasParent.js +54 -0
- package/src/hasValidAriaAttributes.js +30 -0
- package/src/hasValidAriaRole.js +29 -0
- package/src/index.js +64 -0
- package/src/interactiveRoles.js +20 -0
- package/src/isAriaAttributesValid.js +74 -0
- package/src/isComplexTable.js +109 -0
- package/src/isDataTable.js +239 -0
- package/src/isFocusable.js +34 -0
- package/src/isHidden.js +17 -0
- package/src/isOffScreen.js +16 -0
- package/src/isValidUrl.js +13 -0
- package/src/isVisible.js +62 -0
- package/src/stringUtils.js +150 -0
- package/src/testContrast.js +233 -0
- package/src/testLang.js +575 -0
- package/src/testOrder.js +90 -0
- package/test/_template.test.js +21 -0
- package/test/arrayUtils.test.js +84 -0
- package/test/domUtils.test.js +147 -0
- package/test/generate-test-stubs.js +37 -0
- package/test/getAccessibleName.test.js +113 -0
- package/test/getAccessibleText.test.js +94 -0
- package/test/getAriaAttributesByElement.test.js +112 -0
- package/test/getCSSGeneratedContent.test.js +102 -0
- package/test/getComputedRole.test.js +180 -0
- package/test/getFocusableElements.test.js +134 -0
- package/test/getGeneratedContent.test.js +321 -0
- package/test/getImageText.test.js +21 -0
- package/test/getStyleObject.test.js +134 -0
- package/test/hasAccessibleName.test.js +59 -0
- package/test/hasAttribute.test.js +132 -0
- package/test/hasCSSGeneratedContent.test.js +143 -0
- package/test/hasHiddenParent.test.js +176 -0
- package/test/hasParent.test.js +266 -0
- package/test/hasValidAriaAttributes.test.js +79 -0
- package/test/hasValidAriaRole.test.js +98 -0
- package/test/isAriaAttributesValid.test.js +83 -0
- package/test/isComplexTable.test.js +363 -0
- package/test/isDataTable.test.js +948 -0
- package/test/isFocusable.test.js +182 -0
- package/test/isHidden.test.js +157 -0
- package/test/isOffScreen.test.js +249 -0
- package/test/isValidUrl.test.js +63 -0
- package/test/isVisible.test.js +104 -0
- package/test/setup.js +11 -0
- package/test/stringUtils.test.js +106 -0
- package/test/testContrast.test.js +77 -0
- package/test/testLang.test.js +21 -0
- package/test/testOrder.test.js +157 -0
- package/vitest.config.js +25 -0
package/.editorconfig
ADDED
package/.eslintrc
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"root": true,
|
|
3
|
+
"extends": "eslint:recommended",
|
|
4
|
+
"env": {
|
|
5
|
+
"es6": true,
|
|
6
|
+
"node": true,
|
|
7
|
+
"browser": true,
|
|
8
|
+
"commonjs": true,
|
|
9
|
+
"jquery": true
|
|
10
|
+
},
|
|
11
|
+
"globals": {
|
|
12
|
+
"log": true,
|
|
13
|
+
"c3": true
|
|
14
|
+
},
|
|
15
|
+
"rules": {
|
|
16
|
+
"brace-style": [
|
|
17
|
+
"warn",
|
|
18
|
+
"1tbs",
|
|
19
|
+
{
|
|
20
|
+
"allowSingleLine": true
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"camelcase": "off",
|
|
24
|
+
"curly": "error",
|
|
25
|
+
"eqeqeq": "error",
|
|
26
|
+
"new-cap": "error",
|
|
27
|
+
"no-bitwise": "error",
|
|
28
|
+
"no-caller": "error",
|
|
29
|
+
"no-eq-null": "error",
|
|
30
|
+
"no-unused-expressions": "error",
|
|
31
|
+
"no-use-before-define": [
|
|
32
|
+
"error",
|
|
33
|
+
{
|
|
34
|
+
"functions": false
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"no-var": "warn",
|
|
38
|
+
"one-var": [
|
|
39
|
+
"error",
|
|
40
|
+
"never"
|
|
41
|
+
],
|
|
42
|
+
"quotes": [
|
|
43
|
+
"error",
|
|
44
|
+
"single"
|
|
45
|
+
],
|
|
46
|
+
"require-jsdoc": "error",
|
|
47
|
+
"semi": [
|
|
48
|
+
"error",
|
|
49
|
+
"always"
|
|
50
|
+
],
|
|
51
|
+
"space-before-function-paren": [
|
|
52
|
+
"error",
|
|
53
|
+
{
|
|
54
|
+
"anonymous": "always",
|
|
55
|
+
"named": "never",
|
|
56
|
+
"asyncArrow": "always"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"strict": [
|
|
60
|
+
"error",
|
|
61
|
+
"global"
|
|
62
|
+
],
|
|
63
|
+
"valid-jsdoc": [
|
|
64
|
+
"error",
|
|
65
|
+
{
|
|
66
|
+
"prefer": {
|
|
67
|
+
"return": "returns"
|
|
68
|
+
},
|
|
69
|
+
"requireReturn": false,
|
|
70
|
+
"requireReturnDescription": false
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"wrap-iife": [
|
|
74
|
+
"error",
|
|
75
|
+
"any"
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
}
|
package/.gitattributes
ADDED
package/.nvmrc
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
lts/*
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# AFixt Test Utils - Guidelines for Claude
|
|
2
|
+
|
|
3
|
+
## Build & Test Commands
|
|
4
|
+
|
|
5
|
+
- Install dependencies: `npm install`
|
|
6
|
+
- Run all tests: `npm test` (Vitest)
|
|
7
|
+
- Run tests in watch mode: `npm run test:watch`
|
|
8
|
+
- Run tests with coverage: `npm run test:coverage`
|
|
9
|
+
- Run single test: `npm run test:single "test name pattern"`
|
|
10
|
+
- Generate test stubs: `npm run test:generate-stubs`
|
|
11
|
+
|
|
12
|
+
## Code Style Guidelines
|
|
13
|
+
|
|
14
|
+
- **Imports/Exports**: Use CommonJS (`module.exports`) or ES6 modules (`export function`) consistently within files
|
|
15
|
+
- **Documentation**: JSDoc comments for all functions with @param and @returns annotations
|
|
16
|
+
- **Naming**: camelCase for variables/functions, descriptive names reflecting purpose
|
|
17
|
+
- **Error Handling**: Check parameters validity early (e.g., `if (!element) return false;`)
|
|
18
|
+
- **Functions**: Single responsibility, pure when possible, clear parameter naming
|
|
19
|
+
- **Types**: Use JSDoc for type annotations, descriptive parameter types
|
|
20
|
+
- **Formatting**: 4-space indentation, semicolons, proper spacing around operators
|
|
21
|
+
- **Modules**: Group related functions in logical modules (e.g., domUtils)
|
|
22
|
+
- **No jQuery**: All code should be vanilla javascript. No jQuery should be used
|
|
23
|
+
- **No duplication**: In any case where a function already exists elsewhere, that function should be imported and used, rather than being duplicated
|
|
24
|
+
|
|
25
|
+
## Testing
|
|
26
|
+
|
|
27
|
+
- Test files should be placed in the `/test` directory with a `.test.js` extension
|
|
28
|
+
- Use Vitest for testing with JSDOM for DOM manipulation
|
|
29
|
+
- Follow the AAA pattern (Arrange, Act, Assert) in tests
|
|
30
|
+
- Ensure each utility function has good coverage
|
|
31
|
+
- Mock DOM elements appropriately for tests requiring DOM access
|
|
32
|
+
|
|
33
|
+
This codebase provides DOM and accessibility testing utilities
|
package/README.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# AFixt Test Utilities
|
|
2
|
+
|
|
3
|
+
A collection of JavaScript utility functions for accessibility testing.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @afixt/test-utils
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```javascript
|
|
14
|
+
import { isDataTable, hasAccessibleName, getAriaAttributesByElement } from '@afixt/test-utils';
|
|
15
|
+
|
|
16
|
+
// Check if a table is a data table
|
|
17
|
+
const table = document.querySelector('table');
|
|
18
|
+
const isData = isDataTable(table);
|
|
19
|
+
|
|
20
|
+
// Check if an element has an accessible name
|
|
21
|
+
const button = document.querySelector('button');
|
|
22
|
+
const hasName = hasAccessibleName(button);
|
|
23
|
+
|
|
24
|
+
// Get all ARIA attributes for an element
|
|
25
|
+
const element = document.querySelector('[role="tab"]');
|
|
26
|
+
const ariaAttributes = getAriaAttributesByElement(element);
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Available Utilities
|
|
30
|
+
|
|
31
|
+
This library provides utilities for:
|
|
32
|
+
|
|
33
|
+
- DOM traversal and manipulation
|
|
34
|
+
- Accessibility name and role computation
|
|
35
|
+
- ARIA attribute validation
|
|
36
|
+
- Table analysis
|
|
37
|
+
- Focus management
|
|
38
|
+
- Visibility detection
|
|
39
|
+
- Element positioning
|
|
40
|
+
- String manipulation
|
|
41
|
+
- Contrast testing
|
|
42
|
+
- Language detection
|
|
43
|
+
- And more
|
|
44
|
+
|
|
45
|
+
See the API documentation for a complete list of available functions.
|
|
46
|
+
|
|
47
|
+
## Development
|
|
48
|
+
|
|
49
|
+
### Building the Project
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm install
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Running Tests
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm test # Run all tests
|
|
59
|
+
npm run test:watch # Run tests in watch mode
|
|
60
|
+
npm run test:coverage # Run tests with coverage
|
|
61
|
+
npm run test:single # Run a single test
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Generating Documentation
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npm run docs # Generate documentation
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## License
|
|
71
|
+
|
|
72
|
+
UNLICENSED - Copyright AFixt
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<!DOCTYPE html><html lang="en" style="font-size:16px"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Source: arrayUtils.js</title><!--[if lt IE 9]>
|
|
2
|
+
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
3
|
+
<![endif]--><script src="scripts/third-party/hljs.js" defer="defer"></script><script src="scripts/third-party/hljs-line-num.js" defer="defer"></script><script src="scripts/third-party/popper.js" defer="defer"></script><script src="scripts/third-party/tippy.js" defer="defer"></script><script src="scripts/third-party/tocbot.min.js"></script><script>var baseURL="/",locationPathname="";baseURL=(locationPathname=document.location.pathname).substr(0,locationPathname.lastIndexOf("/")+1)</script><link rel="stylesheet" href="styles/clean-jsdoc-theme.min.css"><svg aria-hidden="true" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="display:none"><defs><symbol id="copy-icon" viewbox="0 0 488.3 488.3"><g><path d="M314.25,85.4h-227c-21.3,0-38.6,17.3-38.6,38.6v325.7c0,21.3,17.3,38.6,38.6,38.6h227c21.3,0,38.6-17.3,38.6-38.6V124 C352.75,102.7,335.45,85.4,314.25,85.4z M325.75,449.6c0,6.4-5.2,11.6-11.6,11.6h-227c-6.4,0-11.6-5.2-11.6-11.6V124 c0-6.4,5.2-11.6,11.6-11.6h227c6.4,0,11.6,5.2,11.6,11.6V449.6z"/><path d="M401.05,0h-227c-21.3,0-38.6,17.3-38.6,38.6c0,7.5,6,13.5,13.5,13.5s13.5-6,13.5-13.5c0-6.4,5.2-11.6,11.6-11.6h227 c6.4,0,11.6,5.2,11.6,11.6v325.7c0,6.4-5.2,11.6-11.6,11.6c-7.5,0-13.5,6-13.5,13.5s6,13.5,13.5,13.5c21.3,0,38.6-17.3,38.6-38.6 V38.6C439.65,17.3,422.35,0,401.05,0z"/></g></symbol><symbol id="search-icon" viewBox="0 0 512 512"><g><g><path d="M225.474,0C101.151,0,0,101.151,0,225.474c0,124.33,101.151,225.474,225.474,225.474 c124.33,0,225.474-101.144,225.474-225.474C450.948,101.151,349.804,0,225.474,0z M225.474,409.323 c-101.373,0-183.848-82.475-183.848-183.848S124.101,41.626,225.474,41.626s183.848,82.475,183.848,183.848 S326.847,409.323,225.474,409.323z"/></g></g><g><g><path d="M505.902,476.472L386.574,357.144c-8.131-8.131-21.299-8.131-29.43,0c-8.131,8.124-8.131,21.306,0,29.43l119.328,119.328 c4.065,4.065,9.387,6.098,14.715,6.098c5.321,0,10.649-2.033,14.715-6.098C514.033,497.778,514.033,484.596,505.902,476.472z"/></g></g></symbol><symbol id="font-size-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11.246 15H4.754l-2 5H.6L7 4h2l6.4 16h-2.154l-2-5zm-.8-2L8 6.885 5.554 13h4.892zM21 12.535V12h2v8h-2v-.535a4 4 0 1 1 0-6.93zM19 18a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"/></symbol><symbol id="add-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></symbol><symbol id="minus-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M5 11h14v2H5z"/></symbol><symbol id="dark-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M10 7a7 7 0 0 0 12 4.9v.1c0 5.523-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2h.1A6.979 6.979 0 0 0 10 7zm-6 5a8 8 0 0 0 15.062 3.762A9 9 0 0 1 8.238 4.938 7.999 7.999 0 0 0 4 12z"/></symbol><symbol id="light-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-2a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM11 1h2v3h-2V1zm0 19h2v3h-2v-3zM3.515 4.929l1.414-1.414L7.05 5.636 5.636 7.05 3.515 4.93zM16.95 18.364l1.414-1.414 2.121 2.121-1.414 1.414-2.121-2.121zm2.121-14.85l1.414 1.415-2.121 2.121-1.414-1.414 2.121-2.121zM5.636 16.95l1.414 1.414-2.121 2.121-1.414-1.414 2.121-2.121zM23 11v2h-3v-2h3zM4 11v2H1v-2h3z"/></symbol><symbol id="reset-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M18.537 19.567A9.961 9.961 0 0 1 12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10c0 2.136-.67 4.116-1.81 5.74L17 12h3a8 8 0 1 0-2.46 5.772l.997 1.795z"/></symbol><symbol id="down-icon" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.7803 6.21967C13.0732 6.51256 13.0732 6.98744 12.7803 7.28033L8.53033 11.5303C8.23744 11.8232 7.76256 11.8232 7.46967 11.5303L3.21967 7.28033C2.92678 6.98744 2.92678 6.51256 3.21967 6.21967C3.51256 5.92678 3.98744 5.92678 4.28033 6.21967L8 9.93934L11.7197 6.21967C12.0126 5.92678 12.4874 5.92678 12.7803 6.21967Z"></path></symbol><symbol id="codepen-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M16.5 13.202L13 15.535v3.596L19.197 15 16.5 13.202zM14.697 12L12 10.202 9.303 12 12 13.798 14.697 12zM20 10.869L18.303 12 20 13.131V10.87zM19.197 9L13 4.869v3.596l3.5 2.333L19.197 9zM7.5 10.798L11 8.465V4.869L4.803 9 7.5 10.798zM4.803 15L11 19.131v-3.596l-3.5-2.333L4.803 15zM4 13.131L5.697 12 4 10.869v2.262zM2 9a1 1 0 0 1 .445-.832l9-6a1 1 0 0 1 1.11 0l9 6A1 1 0 0 1 22 9v6a1 1 0 0 1-.445.832l-9 6a1 1 0 0 1-1.11 0l-9-6A1 1 0 0 1 2 15V9z"/></symbol><symbol id="close-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636z"/></symbol><symbol id="menu-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 4h18v2H3V4zm0 7h18v2H3v-2zm0 7h18v2H3v-2z"/></symbol></defs></svg></head><body data-theme="dark"><div class="sidebar-container"><div class="sidebar" id="sidebar"><div class="sidebar-items-container"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-afixt-test-utils.html">afixt-test-utils</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#arrayCount">arrayCount</a></div><div class="sidebar-section-children"><a href="global.html#arrayRemoveByValue">arrayRemoveByValue</a></div><div class="sidebar-section-children"><a href="global.html#arrayUnique">arrayUnique</a></div><div class="sidebar-section-children"><a href="global.html#cellColorDiffs">cellColorDiffs</a></div><div class="sidebar-section-children"><a href="global.html#cellCount">cellCount</a></div><div class="sidebar-section-children"><a href="global.html#checkInconsistent">checkInconsistent</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsInHeader">checkMultiRowsInHeader</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsWithColspan">checkMultiRowsWithColspan</a></div><div class="sidebar-section-children"><a href="global.html#cleanBlank">cleanBlank</a></div><div class="sidebar-section-children"><a href="global.html#colCount">colCount</a></div><div class="sidebar-section-children"><a href="global.html#countBordersPct">countBordersPct</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleName">getAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleText">getAccessibleText</a></div><div class="sidebar-section-children"><a href="global.html#getAriaAttributes">getAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#getCSSGeneratedContent">getCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getColorContrast">getColorContrast</a></div><div class="sidebar-section-children"><a href="global.html#getComputedBackgroundColor">getComputedBackgroundColor</a></div><div class="sidebar-section-children"><a href="global.html#getComputedRole">getComputedRole</a></div><div class="sidebar-section-children"><a href="global.html#getFocusableElements">getFocusableElements</a></div><div class="sidebar-section-children"><a href="global.html#getGeneratedContent">getGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getImageText">getImageText</a></div><div class="sidebar-section-children"><a href="global.html#getStyleObject">getStyleObject</a></div><div class="sidebar-section-children"><a href="global.html#getTwoLetterCode">getTwoLetterCode</a></div><div class="sidebar-section-children"><a href="global.html#hasAccessibleName">hasAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#hasAttribute">hasAttribute</a></div><div class="sidebar-section-children"><a href="global.html#hasCSSGeneratedContent">hasCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#hasHiddenParent">hasHiddenParent</a></div><div class="sidebar-section-children"><a href="global.html#hasParent">hasParent</a></div><div class="sidebar-section-children"><a href="global.html#hasValidAriaAttributes">hasValidAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#hasValidAriaRole">hasValidAriaRole</a></div><div class="sidebar-section-children"><a href="global.html#isAriaAttributeValid">isAriaAttributeValid</a></div><div class="sidebar-section-children"><a href="global.html#isComplexTable">isComplexTable</a></div><div class="sidebar-section-children"><a href="global.html#isDataTable">isDataTable</a></div><div class="sidebar-section-children"><a href="global.html#isFocusable">isFocusable</a></div><div class="sidebar-section-children"><a href="global.html#isHidden">isHidden</a></div><div class="sidebar-section-children"><a href="global.html#isNotVisible">isNotVisible</a></div><div class="sidebar-section-children"><a href="global.html#isOffScreen">isOffScreen</a></div><div class="sidebar-section-children"><a href="global.html#isValidUrl">isValidUrl</a></div><div class="sidebar-section-children"><a href="global.html#isVisible">isVisible</a></div><div class="sidebar-section-children"><a href="global.html#langCodes">langCodes</a></div><div class="sidebar-section-children"><a href="global.html#luminance">luminance</a></div><div class="sidebar-section-children"><a href="global.html#matchesSelector">matchesSelector</a></div><div class="sidebar-section-children"><a href="global.html#parseRGB">parseRGB</a></div><div class="sidebar-section-children"><a href="global.html#rowCount">rowCount</a></div><div class="sidebar-section-children"><a href="global.html#rtls">rtls</a></div><div class="sidebar-section-children"><a href="global.html#sortByVisualOrder">sortByVisualOrder</a></div><div class="sidebar-section-children"><a href="global.html#strlen">strlen</a></div><div class="sidebar-section-children"><a href="global.html#testContrast">testContrast</a></div><div class="sidebar-section-children"><a href="global.html#testLang">testLang</a></div><div class="sidebar-section-children"><a href="global.html#testOrder">testOrder</a></div><div class="sidebar-section-children"><a href="global.html#validAriaAttributes">validAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#validLangCodes">validLangCodes</a></div></div></div></div></div><div class="navbar-container" id="VuAckcnZhf"><nav class="navbar"><div class="navbar-left-items"></div><div class="navbar-right-items"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#light-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div><nav></nav></nav></div><div class="toc-container"><div class="toc-content"><span class="bold">On this page</span><div id="eed4d2a0bfd64539bb9df78095dec881"></div></div></div><div class="body-wrapper"><div class="main-content"><div class="main-wrapper"><section id="source-page" class="source-page"><header><h1 id="title" class="has-anchor">arrayUtils.js</h1></header><article><pre class="prettyprint source lang-js"><code>/**
|
|
4
|
+
* Utility functions for working with arrays and objects.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Reduce an array to only the unique items.
|
|
9
|
+
* @param {Array} array - Array of items
|
|
10
|
+
* @returns {Array} - Array with unique items
|
|
11
|
+
*/
|
|
12
|
+
function arrayUnique(array) {
|
|
13
|
+
return Array.from(new Set(array));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Remove specified items by value from an array.
|
|
18
|
+
* @param {Array} array - Array of items
|
|
19
|
+
* @param {String} value - Value to remove
|
|
20
|
+
* @returns {Array} - Array without the specified value
|
|
21
|
+
*/
|
|
22
|
+
function arrayRemoveByValue(array, value) {
|
|
23
|
+
return array.filter(item => String(item) !== String(value));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Get a count of each occurrence for items in an array.
|
|
28
|
+
* @param {Array} array - Array of items
|
|
29
|
+
* @returns {Object} - Object containing key/value pairs where key is array value and value is occurrence count
|
|
30
|
+
*/
|
|
31
|
+
function arrayCount(array) {
|
|
32
|
+
return array.reduce((acc, item) => {
|
|
33
|
+
acc[item] = (acc[item] || 0) + 1;
|
|
34
|
+
return acc;
|
|
35
|
+
}, {});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Remove items from an object that do not have a value.
|
|
40
|
+
* @param {Object} obj - Object to remove empty values from
|
|
41
|
+
* @returns {Object} - Cleaned object
|
|
42
|
+
*/
|
|
43
|
+
function cleanBlank(obj) {
|
|
44
|
+
return Object.fromEntries(
|
|
45
|
+
Object.entries(obj).filter(([_, value]) => value && value.length > 0)
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Create arrayUtils object with all functions
|
|
50
|
+
const arrayUtils = {
|
|
51
|
+
arrayUnique,
|
|
52
|
+
arrayRemoveByValue,
|
|
53
|
+
arrayCount,
|
|
54
|
+
cleanBlank
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// Export for ES modules
|
|
58
|
+
export { arrayUnique, arrayRemoveByValue, arrayCount, cleanBlank, arrayUtils };
|
|
59
|
+
|
|
60
|
+
// Export for CommonJS
|
|
61
|
+
if (typeof module !== 'undefined' && module.exports) {
|
|
62
|
+
module.exports = {
|
|
63
|
+
arrayUnique,
|
|
64
|
+
arrayRemoveByValue,
|
|
65
|
+
arrayCount,
|
|
66
|
+
cleanBlank,
|
|
67
|
+
arrayUtils
|
|
68
|
+
};
|
|
69
|
+
}</code></pre></article></section></div></div></div><div class="search-container" id="PkfLWpAbet" style="display:none"><div class="wrapper" id="iCxFxjkHbP"><button class="icon-button search-close-button" id="VjLlGakifb" aria-label="close search"><svg><use xlink:href="#close-icon"></use></svg></button><div class="search-box-c"><svg><use xlink:href="#search-icon"></use></svg> <input type="text" id="vpcKVYIppa" class="search-input" placeholder="Search..." autofocus></div><div class="search-result-c" id="fWwVHRuDuN"><span class="search-result-c-text">Type anything to view search result</span></div></div></div><div class="mobile-menu-icon-container"><button class="icon-button" id="mobile-menu" data-isopen="false" aria-label="menu"><svg><use xlink:href="#menu-icon"></use></svg></button></div><div id="mobile-sidebar" class="mobile-sidebar-container"><div class="mobile-sidebar-wrapper"><div class="mobile-nav-links"></div><div class="mobile-sidebar-items-c"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-afixt-test-utils.html">afixt-test-utils</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#arrayCount">arrayCount</a></div><div class="sidebar-section-children"><a href="global.html#arrayRemoveByValue">arrayRemoveByValue</a></div><div class="sidebar-section-children"><a href="global.html#arrayUnique">arrayUnique</a></div><div class="sidebar-section-children"><a href="global.html#cellColorDiffs">cellColorDiffs</a></div><div class="sidebar-section-children"><a href="global.html#cellCount">cellCount</a></div><div class="sidebar-section-children"><a href="global.html#checkInconsistent">checkInconsistent</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsInHeader">checkMultiRowsInHeader</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsWithColspan">checkMultiRowsWithColspan</a></div><div class="sidebar-section-children"><a href="global.html#cleanBlank">cleanBlank</a></div><div class="sidebar-section-children"><a href="global.html#colCount">colCount</a></div><div class="sidebar-section-children"><a href="global.html#countBordersPct">countBordersPct</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleName">getAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleText">getAccessibleText</a></div><div class="sidebar-section-children"><a href="global.html#getAriaAttributes">getAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#getCSSGeneratedContent">getCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getColorContrast">getColorContrast</a></div><div class="sidebar-section-children"><a href="global.html#getComputedBackgroundColor">getComputedBackgroundColor</a></div><div class="sidebar-section-children"><a href="global.html#getComputedRole">getComputedRole</a></div><div class="sidebar-section-children"><a href="global.html#getFocusableElements">getFocusableElements</a></div><div class="sidebar-section-children"><a href="global.html#getGeneratedContent">getGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getImageText">getImageText</a></div><div class="sidebar-section-children"><a href="global.html#getStyleObject">getStyleObject</a></div><div class="sidebar-section-children"><a href="global.html#getTwoLetterCode">getTwoLetterCode</a></div><div class="sidebar-section-children"><a href="global.html#hasAccessibleName">hasAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#hasAttribute">hasAttribute</a></div><div class="sidebar-section-children"><a href="global.html#hasCSSGeneratedContent">hasCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#hasHiddenParent">hasHiddenParent</a></div><div class="sidebar-section-children"><a href="global.html#hasParent">hasParent</a></div><div class="sidebar-section-children"><a href="global.html#hasValidAriaAttributes">hasValidAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#hasValidAriaRole">hasValidAriaRole</a></div><div class="sidebar-section-children"><a href="global.html#isAriaAttributeValid">isAriaAttributeValid</a></div><div class="sidebar-section-children"><a href="global.html#isComplexTable">isComplexTable</a></div><div class="sidebar-section-children"><a href="global.html#isDataTable">isDataTable</a></div><div class="sidebar-section-children"><a href="global.html#isFocusable">isFocusable</a></div><div class="sidebar-section-children"><a href="global.html#isHidden">isHidden</a></div><div class="sidebar-section-children"><a href="global.html#isNotVisible">isNotVisible</a></div><div class="sidebar-section-children"><a href="global.html#isOffScreen">isOffScreen</a></div><div class="sidebar-section-children"><a href="global.html#isValidUrl">isValidUrl</a></div><div class="sidebar-section-children"><a href="global.html#isVisible">isVisible</a></div><div class="sidebar-section-children"><a href="global.html#langCodes">langCodes</a></div><div class="sidebar-section-children"><a href="global.html#luminance">luminance</a></div><div class="sidebar-section-children"><a href="global.html#matchesSelector">matchesSelector</a></div><div class="sidebar-section-children"><a href="global.html#parseRGB">parseRGB</a></div><div class="sidebar-section-children"><a href="global.html#rowCount">rowCount</a></div><div class="sidebar-section-children"><a href="global.html#rtls">rtls</a></div><div class="sidebar-section-children"><a href="global.html#sortByVisualOrder">sortByVisualOrder</a></div><div class="sidebar-section-children"><a href="global.html#strlen">strlen</a></div><div class="sidebar-section-children"><a href="global.html#testContrast">testContrast</a></div><div class="sidebar-section-children"><a href="global.html#testLang">testLang</a></div><div class="sidebar-section-children"><a href="global.html#testOrder">testOrder</a></div><div class="sidebar-section-children"><a href="global.html#validAriaAttributes">validAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#validLangCodes">validLangCodes</a></div></div></div><div class="mobile-navbar-actions"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#light-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div></div></div><script type="text/javascript" src="scripts/core.min.js"></script><script src="scripts/search.min.js" defer="defer"></script><script src="scripts/third-party/fuse.js" defer="defer"></script><script type="text/javascript">var tocbotInstance=tocbot.init({tocSelector:"#eed4d2a0bfd64539bb9df78095dec881",contentSelector:".main-content",headingSelector:"h1, h2, h3",hasInnerContainers:!0,scrollContainer:".main-content",headingsOffset:130,onClick:bringLinkToView})</script></body></html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"list":[{"title":"arrayCount","link":"<a href=\"global.html#arrayCount\">arrayCount</a>","description":"<p>Get a count of each occurrence for items in an array.</p>"},{"title":"arrayRemoveByValue","link":"<a href=\"global.html#arrayRemoveByValue\">arrayRemoveByValue</a>","description":"<p>Remove specified items by value from an array.</p>"},{"title":"arrayUnique","link":"<a href=\"global.html#arrayUnique\">arrayUnique</a>","description":"<p>Reduce an array to only the unique items.</p>"},{"title":"cellColorDiffs","link":"<a href=\"global.html#cellColorDiffs\">cellColorDiffs</a>","description":"<p>Checks if the color differences in the table cells exceed the specified limits.</p>"},{"title":"cellCount","link":"<a href=\"global.html#cellCount\">cellCount</a>","description":"<p>Counts the number of cells (both <td> and <th>) in a given table element.</p>"},{"title":"checkInconsistent","link":"<a href=\"global.html#checkInconsistent\">checkInconsistent</a>","description":"<p>Checks if a table element has inconsistent row or column spans.</p>\n<p>This function normalizes the table by removing <code>colspan</code> and <code>rowspan</code> attributes,\nand then checks if the number of columns is consistent across all rows.</p>"},{"title":"checkMultiRowsInHeader","link":"<a href=\"global.html#checkMultiRowsInHeader\">checkMultiRowsInHeader</a>","description":"<p>Checks if the given table element has multiple rows in the header.</p>"},{"title":"checkMultiRowsWithColspan","link":"<a href=\"global.html#checkMultiRowsWithColspan\">checkMultiRowsWithColspan</a>","description":"<p>Checks if the given table element has multiple rows with at least\none cell that has a colspan attribute.</p>"},{"title":"cleanBlank","link":"<a href=\"global.html#cleanBlank\">cleanBlank</a>","description":"<p>Remove items from an object that do not have a value.</p>"},{"title":"colCount","link":"<a href=\"global.html#colCount\">colCount</a>","description":"<p>Calculates the average number of columns in a given HTML table.</p>"},{"title":"countBordersPct","link":"<a href=\"global.html#countBordersPct\">countBordersPct</a>","description":"<p>Calculates the percentage of table cells that have a border.</p>"},{"title":"domUtils.attrBegins","link":"<a href=\"domUtils.html#.attrBegins\">attrBegins</a>","description":"<p>Filters a list of elements to include only those whose attributes begin with a specified prefix.</p>"},{"title":"domUtils.containsNoCase","link":"<a href=\"domUtils.html#.containsNoCase\">containsNoCase</a>","description":"<p>Checks if the text content of a given DOM element contains a specified string, case-insensitively.</p>"},{"title":"domUtils.getAttributes","link":"<a href=\"domUtils.html#.getAttributes\">getAttributes</a>","description":"<p>Retrieves all attributes of a given DOM element as an object.</p>"},{"title":"domUtils.getAttributesAsString","link":"<a href=\"domUtils.html#.getAttributesAsString\">getAttributesAsString</a>","description":"<p>Retrieves the attributes of a given DOM element as a JSON string.</p>"},{"title":"domUtils.getConstructor","link":"<a href=\"domUtils.html#.getConstructor\">getConstructor</a>","description":"<p>Gets the constructor name of a given DOM element.</p>"},{"title":"domUtils.getDocumentSize","link":"<a href=\"domUtils.html#.getDocumentSize\">getDocumentSize</a>","description":"<p>Calculates the size of the document's HTML content.</p>\n<p>This function retrieves the outer HTML of the document's root element,\nremoves all whitespace characters, and returns the length of the resulting string.</p>"},{"title":"domUtils.getElementsWithDuplicateIds","link":"<a href=\"domUtils.html#.getElementsWithDuplicateIds\">getElementsWithDuplicateIds</a>","description":"<p>Finds and returns an array of elements that have duplicate IDs in the document.</p>"},{"title":"domUtils.getOuterHTML","link":"<a href=\"domUtils.html#.getOuterHTML\">getOuterHTML</a>","description":"<p>Returns the outer HTML of the given element.</p>"},{"title":"domUtils.getXPath","link":"<a href=\"domUtils.html#.getXPath\">getXPath</a>","description":"<p>Generates an XPath string for a given DOM element.</p>"},{"title":"domUtils.hasAttr","link":"<a href=\"domUtils.html#.hasAttr\">hasAttr</a>","description":"<p>Checks if the specified element has the given attribute.</p>"},{"title":"domUtils.hasFocus","link":"<a href=\"domUtils.html#.hasFocus\">hasFocus</a>","description":"<p>Checks if the given element has focus.</p>"},{"title":"domUtils.isFullyVisible","link":"<a href=\"domUtils.html#.isFullyVisible\">isFullyVisible</a>","description":"<p>Checks if the given element is fully visible within the viewport.</p>"},{"title":"getAccessibleName","link":"<a href=\"global.html#getAccessibleName\">getAccessibleName</a>","description":"<p>Gets the accessible name of an element according to the accessible name calculation algorithm</p>"},{"title":"getAccessibleText","link":"<a href=\"global.html#getAccessibleText\">getAccessibleText</a>","description":"<p>Get all accessible text for an element, including aria-labels and content from children.</p>"},{"title":"getAriaAttributes","link":"<a href=\"global.html#getAriaAttributes\">getAriaAttributes</a>","description":"<p>Retrieves all ARIA attributes from a given DOM element.</p>"},{"title":"getCSSGeneratedContent","link":"<a href=\"global.html#getCSSGeneratedContent\">getCSSGeneratedContent</a>","description":"<p>Gets the CSS generated content for an element's ::before or ::after pseudo-elements.\nUnlike getGeneratedContent, this function focuses only on CSS-generated content\nand does not include the element's own text content.</p>"},{"title":"getColorContrast","link":"<a href=\"global.html#getColorContrast\">getColorContrast</a>","description":"<p>Calculate color contrast ratio between foreground and background</p>"},{"title":"getComputedBackgroundColor","link":"<a href=\"global.html#getComputedBackgroundColor\">getComputedBackgroundColor</a>","description":"<p>Get the computed background color for an element.</p>"},{"title":"getComputedRole","link":"<a href=\"global.html#getComputedRole\">getComputedRole</a>","description":"<p>Gets the computed role of an HTML element.</p>"},{"title":"getFocusableElements","link":"<a href=\"global.html#getFocusableElements\">getFocusableElements</a>"},{"title":"getGeneratedContent","link":"<a href=\"global.html#getGeneratedContent\">getGeneratedContent</a>","description":"<p>Get the generated content for an element (<code>::before</code>, <code>::after</code>, and inner content).</p>"},{"title":"getImageText","link":"<a href=\"global.html#getImageText\">getImageText</a>","description":"<p>Extracts text from an image using OCR.</p>"},{"title":"getStyleObject","link":"<a href=\"global.html#getStyleObject\">getStyleObject</a>","description":"<p>Retrieves the computed style properties of a given DOM element and returns them as an object.</p>"},{"title":"getTwoLetterCode","link":"<a href=\"global.html#getTwoLetterCode\">getTwoLetterCode</a>","description":"<p>Converts a three-letter language code to a two-letter language code.</p>"},{"title":"hasAccessibleName","link":"<a href=\"global.html#hasAccessibleName\">hasAccessibleName</a>","description":"<p>Determines if an element has an accessible name</p>"},{"title":"hasAttribute","link":"<a href=\"global.html#hasAttribute\">hasAttribute</a>","description":"<p>Checks if a given element has a specified attribute.</p>"},{"title":"hasCSSGeneratedContent","link":"<a href=\"global.html#hasCSSGeneratedContent\">hasCSSGeneratedContent</a>","description":"<p>Checks if an element has CSS generated content in its ::before or ::after pseudo-elements\nor text content.</p>"},{"title":"hasHiddenParent","link":"<a href=\"global.html#hasHiddenParent\">hasHiddenParent</a>","description":"<p>Checks if the given element has a hidden parent element.</p>"},{"title":"hasParent","link":"<a href=\"global.html#hasParent\">hasParent</a>","description":"<p>Checks if the given element has a parent that matches any of the selectors in the array.</p>"},{"title":"hasValidAriaAttributes","link":"<a href=\"global.html#hasValidAriaAttributes\">hasValidAriaAttributes</a>","description":"<p>Checks if an element has any valid ARIA attributes.</p>"},{"title":"hasValidAriaRole","link":"<a href=\"global.html#hasValidAriaRole\">hasValidAriaRole</a>","description":"<p>Checks if the given element has a valid ARIA role.</p>"},{"title":"isAriaAttributeValid","link":"<a href=\"global.html#isAriaAttributeValid\">isAriaAttributeValid</a>","description":"<p>Checks if a specific ARIA attribute is valid according to the WAI-ARIA specification.</p>"},{"title":"isComplexTable","link":"<a href=\"global.html#isComplexTable\">isComplexTable</a>","description":"<p>Determines if a given table element is complex.\nA table is considered complex if it has multiple rows in the header,\nrows with colspan attributes, or inconsistent structure.</p>"},{"title":"isDataTable","link":"<a href=\"global.html#isDataTable\">isDataTable</a>","description":"<p>Determines if a given table element is a data table based on various heuristics and options.</p>"},{"title":"isFocusable","link":"<a href=\"global.html#isFocusable\">isFocusable</a>","description":"<p>Determines if an element is focusable.</p>"},{"title":"isHidden","link":"<a href=\"global.html#isHidden\">isHidden</a>","description":"<p>Checks if a given DOM element is hidden.</p>\n<p>An element is considered hidden if its <code>display</code> style is set to "none"\nor if it has the <code>hidden</code> attribute.</p>"},{"title":"isNotVisible","link":"<a href=\"global.html#isNotVisible\">isNotVisible</a>","description":"<p>Helper function to check if element is NOT visible</p>"},{"title":"isOffScreen","link":"<a href=\"global.html#isOffScreen\">isOffScreen</a>","description":"<p>Checks if the selected element is off-screen.</p>"},{"title":"isValidUrl","link":"<a href=\"global.html#isValidUrl\">isValidUrl</a>","description":"<p>Validate if a string is a valid URL.</p>"},{"title":"isVisible","link":"<a href=\"global.html#isVisible\">isVisible</a>","description":"<p>Checks if the selected item is visible to assistive technologies.</p>"},{"title":"langCodes","link":"<a href=\"global.html#langCodes\">langCodes</a>","description":"<p>An array of language codes and their corresponding details.\nEach object in the array represents a language and contains the following properties:</p>"},{"title":"luminance","link":"<a href=\"global.html#luminance\">luminance</a>","description":"<p>Calculate the luminance of an RGB color.</p>"},{"title":"matchesSelector","link":"<a href=\"global.html#matchesSelector\">matchesSelector</a>","description":"<p>Helper function to check if an element matches a selector</p>"},{"title":"module:afixt-test-utils","link":"<a href=\"module-afixt-test-utils.html\">afixt-test-utils</a>","description":"<p>A collection of utility functions for accessibility testing</p>"},{"title":"parseRGB","link":"<a href=\"global.html#parseRGB\">parseRGB</a>","description":"<p>Parse an RGB or RGBA color string into its components</p>"},{"title":"rowCount","link":"<a href=\"global.html#rowCount\">rowCount</a>","description":"<p>Returns the number of rows in the given table element.</p>"},{"title":"rtls","link":"<a href=\"global.html#rtls\">rtls</a>","description":"<p>An array of language codes that are written from right to left.</p>"},{"title":"sortByVisualOrder","link":"<a href=\"global.html#sortByVisualOrder\">sortByVisualOrder</a>"},{"title":"strlen","link":"<a href=\"global.html#strlen\">strlen</a>","description":"<p>Get the length of a trimmed string, or return 0 if not a valid string</p>"},{"title":"testContrast","link":"<a href=\"global.html#testContrast\">testContrast</a>","description":"<p>Test if an element meets WCAG color contrast requirements</p>"},{"title":"testLang","link":"<a href=\"global.html#testLang\">testLang</a>","description":"<p>Tests the language of an HTML element against its content.</p>\n<p>This function checks the <code>lang</code> or <code>xml:lang</code> attribute of the given element\nand its ancestors to determine the language. It then uses the <code>franc</code> library\nto detect the language of the element's text content and compares it to the\nlanguage attribute.</p>"},{"title":"testOrder","link":"<a href=\"global.html#testOrder\">testOrder</a>"},{"title":"validAriaAttributes","link":"<a href=\"global.html#validAriaAttributes\">validAriaAttributes</a>","description":"<p>List of valid ARIA attributes based on WAI-ARIA specification.</p>"},{"title":"validLangCodes","link":"<a href=\"global.html#validLangCodes\">validLangCodes</a>","description":"<p>An array of valid language codes.</p>\n<p>This array contains ISO 639-1 language codes that are used to identify languages.</p>"}]}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
<!DOCTYPE html><html lang="en" style="font-size:16px"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Source: domUtils.js</title><!--[if lt IE 9]>
|
|
2
|
+
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
3
|
+
<![endif]--><script src="scripts/third-party/hljs.js" defer="defer"></script><script src="scripts/third-party/hljs-line-num.js" defer="defer"></script><script src="scripts/third-party/popper.js" defer="defer"></script><script src="scripts/third-party/tippy.js" defer="defer"></script><script src="scripts/third-party/tocbot.min.js"></script><script>var baseURL="/",locationPathname="";baseURL=(locationPathname=document.location.pathname).substr(0,locationPathname.lastIndexOf("/")+1)</script><link rel="stylesheet" href="styles/clean-jsdoc-theme.min.css"><svg aria-hidden="true" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="display:none"><defs><symbol id="copy-icon" viewbox="0 0 488.3 488.3"><g><path d="M314.25,85.4h-227c-21.3,0-38.6,17.3-38.6,38.6v325.7c0,21.3,17.3,38.6,38.6,38.6h227c21.3,0,38.6-17.3,38.6-38.6V124 C352.75,102.7,335.45,85.4,314.25,85.4z M325.75,449.6c0,6.4-5.2,11.6-11.6,11.6h-227c-6.4,0-11.6-5.2-11.6-11.6V124 c0-6.4,5.2-11.6,11.6-11.6h227c6.4,0,11.6,5.2,11.6,11.6V449.6z"/><path d="M401.05,0h-227c-21.3,0-38.6,17.3-38.6,38.6c0,7.5,6,13.5,13.5,13.5s13.5-6,13.5-13.5c0-6.4,5.2-11.6,11.6-11.6h227 c6.4,0,11.6,5.2,11.6,11.6v325.7c0,6.4-5.2,11.6-11.6,11.6c-7.5,0-13.5,6-13.5,13.5s6,13.5,13.5,13.5c21.3,0,38.6-17.3,38.6-38.6 V38.6C439.65,17.3,422.35,0,401.05,0z"/></g></symbol><symbol id="search-icon" viewBox="0 0 512 512"><g><g><path d="M225.474,0C101.151,0,0,101.151,0,225.474c0,124.33,101.151,225.474,225.474,225.474 c124.33,0,225.474-101.144,225.474-225.474C450.948,101.151,349.804,0,225.474,0z M225.474,409.323 c-101.373,0-183.848-82.475-183.848-183.848S124.101,41.626,225.474,41.626s183.848,82.475,183.848,183.848 S326.847,409.323,225.474,409.323z"/></g></g><g><g><path d="M505.902,476.472L386.574,357.144c-8.131-8.131-21.299-8.131-29.43,0c-8.131,8.124-8.131,21.306,0,29.43l119.328,119.328 c4.065,4.065,9.387,6.098,14.715,6.098c5.321,0,10.649-2.033,14.715-6.098C514.033,497.778,514.033,484.596,505.902,476.472z"/></g></g></symbol><symbol id="font-size-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11.246 15H4.754l-2 5H.6L7 4h2l6.4 16h-2.154l-2-5zm-.8-2L8 6.885 5.554 13h4.892zM21 12.535V12h2v8h-2v-.535a4 4 0 1 1 0-6.93zM19 18a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"/></symbol><symbol id="add-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></symbol><symbol id="minus-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M5 11h14v2H5z"/></symbol><symbol id="dark-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M10 7a7 7 0 0 0 12 4.9v.1c0 5.523-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2h.1A6.979 6.979 0 0 0 10 7zm-6 5a8 8 0 0 0 15.062 3.762A9 9 0 0 1 8.238 4.938 7.999 7.999 0 0 0 4 12z"/></symbol><symbol id="light-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-2a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM11 1h2v3h-2V1zm0 19h2v3h-2v-3zM3.515 4.929l1.414-1.414L7.05 5.636 5.636 7.05 3.515 4.93zM16.95 18.364l1.414-1.414 2.121 2.121-1.414 1.414-2.121-2.121zm2.121-14.85l1.414 1.415-2.121 2.121-1.414-1.414 2.121-2.121zM5.636 16.95l1.414 1.414-2.121 2.121-1.414-1.414 2.121-2.121zM23 11v2h-3v-2h3zM4 11v2H1v-2h3z"/></symbol><symbol id="reset-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M18.537 19.567A9.961 9.961 0 0 1 12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10c0 2.136-.67 4.116-1.81 5.74L17 12h3a8 8 0 1 0-2.46 5.772l.997 1.795z"/></symbol><symbol id="down-icon" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.7803 6.21967C13.0732 6.51256 13.0732 6.98744 12.7803 7.28033L8.53033 11.5303C8.23744 11.8232 7.76256 11.8232 7.46967 11.5303L3.21967 7.28033C2.92678 6.98744 2.92678 6.51256 3.21967 6.21967C3.51256 5.92678 3.98744 5.92678 4.28033 6.21967L8 9.93934L11.7197 6.21967C12.0126 5.92678 12.4874 5.92678 12.7803 6.21967Z"></path></symbol><symbol id="codepen-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M16.5 13.202L13 15.535v3.596L19.197 15 16.5 13.202zM14.697 12L12 10.202 9.303 12 12 13.798 14.697 12zM20 10.869L18.303 12 20 13.131V10.87zM19.197 9L13 4.869v3.596l3.5 2.333L19.197 9zM7.5 10.798L11 8.465V4.869L4.803 9 7.5 10.798zM4.803 15L11 19.131v-3.596l-3.5-2.333L4.803 15zM4 13.131L5.697 12 4 10.869v2.262zM2 9a1 1 0 0 1 .445-.832l9-6a1 1 0 0 1 1.11 0l9 6A1 1 0 0 1 22 9v6a1 1 0 0 1-.445.832l-9 6a1 1 0 0 1-1.11 0l-9-6A1 1 0 0 1 2 15V9z"/></symbol><symbol id="close-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636z"/></symbol><symbol id="menu-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 4h18v2H3V4zm0 7h18v2H3v-2zm0 7h18v2H3v-2z"/></symbol></defs></svg></head><body data-theme="dark"><div class="sidebar-container"><div class="sidebar" id="sidebar"><div class="sidebar-items-container"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-afixt-test-utils.html">afixt-test-utils</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#arrayCount">arrayCount</a></div><div class="sidebar-section-children"><a href="global.html#arrayRemoveByValue">arrayRemoveByValue</a></div><div class="sidebar-section-children"><a href="global.html#arrayUnique">arrayUnique</a></div><div class="sidebar-section-children"><a href="global.html#cellColorDiffs">cellColorDiffs</a></div><div class="sidebar-section-children"><a href="global.html#cellCount">cellCount</a></div><div class="sidebar-section-children"><a href="global.html#checkInconsistent">checkInconsistent</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsInHeader">checkMultiRowsInHeader</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsWithColspan">checkMultiRowsWithColspan</a></div><div class="sidebar-section-children"><a href="global.html#cleanBlank">cleanBlank</a></div><div class="sidebar-section-children"><a href="global.html#colCount">colCount</a></div><div class="sidebar-section-children"><a href="global.html#countBordersPct">countBordersPct</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleName">getAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleText">getAccessibleText</a></div><div class="sidebar-section-children"><a href="global.html#getAriaAttributes">getAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#getCSSGeneratedContent">getCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getColorContrast">getColorContrast</a></div><div class="sidebar-section-children"><a href="global.html#getComputedBackgroundColor">getComputedBackgroundColor</a></div><div class="sidebar-section-children"><a href="global.html#getComputedRole">getComputedRole</a></div><div class="sidebar-section-children"><a href="global.html#getFocusableElements">getFocusableElements</a></div><div class="sidebar-section-children"><a href="global.html#getGeneratedContent">getGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getImageText">getImageText</a></div><div class="sidebar-section-children"><a href="global.html#getStyleObject">getStyleObject</a></div><div class="sidebar-section-children"><a href="global.html#getTwoLetterCode">getTwoLetterCode</a></div><div class="sidebar-section-children"><a href="global.html#hasAccessibleName">hasAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#hasAttribute">hasAttribute</a></div><div class="sidebar-section-children"><a href="global.html#hasCSSGeneratedContent">hasCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#hasHiddenParent">hasHiddenParent</a></div><div class="sidebar-section-children"><a href="global.html#hasParent">hasParent</a></div><div class="sidebar-section-children"><a href="global.html#hasValidAriaAttributes">hasValidAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#hasValidAriaRole">hasValidAriaRole</a></div><div class="sidebar-section-children"><a href="global.html#isAriaAttributeValid">isAriaAttributeValid</a></div><div class="sidebar-section-children"><a href="global.html#isComplexTable">isComplexTable</a></div><div class="sidebar-section-children"><a href="global.html#isDataTable">isDataTable</a></div><div class="sidebar-section-children"><a href="global.html#isFocusable">isFocusable</a></div><div class="sidebar-section-children"><a href="global.html#isHidden">isHidden</a></div><div class="sidebar-section-children"><a href="global.html#isNotVisible">isNotVisible</a></div><div class="sidebar-section-children"><a href="global.html#isOffScreen">isOffScreen</a></div><div class="sidebar-section-children"><a href="global.html#isValidUrl">isValidUrl</a></div><div class="sidebar-section-children"><a href="global.html#isVisible">isVisible</a></div><div class="sidebar-section-children"><a href="global.html#langCodes">langCodes</a></div><div class="sidebar-section-children"><a href="global.html#luminance">luminance</a></div><div class="sidebar-section-children"><a href="global.html#matchesSelector">matchesSelector</a></div><div class="sidebar-section-children"><a href="global.html#parseRGB">parseRGB</a></div><div class="sidebar-section-children"><a href="global.html#rowCount">rowCount</a></div><div class="sidebar-section-children"><a href="global.html#rtls">rtls</a></div><div class="sidebar-section-children"><a href="global.html#sortByVisualOrder">sortByVisualOrder</a></div><div class="sidebar-section-children"><a href="global.html#strlen">strlen</a></div><div class="sidebar-section-children"><a href="global.html#testContrast">testContrast</a></div><div class="sidebar-section-children"><a href="global.html#testLang">testLang</a></div><div class="sidebar-section-children"><a href="global.html#testOrder">testOrder</a></div><div class="sidebar-section-children"><a href="global.html#validAriaAttributes">validAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#validLangCodes">validLangCodes</a></div></div></div></div></div><div class="navbar-container" id="VuAckcnZhf"><nav class="navbar"><div class="navbar-left-items"></div><div class="navbar-right-items"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#light-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div><nav></nav></nav></div><div class="toc-container"><div class="toc-content"><span class="bold">On this page</span><div id="eed4d2a0bfd64539bb9df78095dec881"></div></div></div><div class="body-wrapper"><div class="main-content"><div class="main-wrapper"><section id="source-page" class="source-page"><header><h1 id="title" class="has-anchor">domUtils.js</h1></header><article><pre class="prettyprint source lang-js"><code>const domUtils = {
|
|
4
|
+
/**
|
|
5
|
+
* Checks if the specified element has the given attribute.
|
|
6
|
+
*
|
|
7
|
+
* @param {HTMLElement} element - The DOM element to check.
|
|
8
|
+
* @param {string} name - The name of the attribute to look for.
|
|
9
|
+
* @returns {boolean} True if the element has the attribute, false otherwise.
|
|
10
|
+
*/
|
|
11
|
+
hasAttr(element, attrName) {
|
|
12
|
+
return element.hasAttribute(attrName);
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Filters a list of elements to include only those whose attributes begin with a specified prefix.
|
|
17
|
+
*
|
|
18
|
+
* @param {NodeList | Array} elements - The list of elements to filter.
|
|
19
|
+
* @param {string} prefix - The prefix to match against the attribute names.
|
|
20
|
+
* @returns {Array} - An array of elements that have at least one attribute starting with the specified prefix.
|
|
21
|
+
*/
|
|
22
|
+
attrBegins(elements, prefix) {
|
|
23
|
+
return Array.from(elements).filter((element) => {
|
|
24
|
+
return Array.from(element.attributes).some((attr) =>
|
|
25
|
+
attr.name.startsWith(prefix)
|
|
26
|
+
);
|
|
27
|
+
});
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Checks if the text content of a given DOM element contains a specified string, case-insensitively.
|
|
32
|
+
*
|
|
33
|
+
* @param {HTMLElement} element - The DOM element whose text content will be checked.
|
|
34
|
+
* @param {string} str - The string to search for within the element's text content.
|
|
35
|
+
* @returns {boolean} - Returns true if the element's text content contains the specified string, case-insensitively; otherwise, false.
|
|
36
|
+
*/
|
|
37
|
+
containsNoCase(element, str) {
|
|
38
|
+
return element.textContent.toLowerCase().includes(str.toLowerCase());
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Retrieves all attributes of a given DOM element as an object.
|
|
43
|
+
*
|
|
44
|
+
* @param {Element} element - The DOM element from which to get the attributes.
|
|
45
|
+
* @returns {Object} An object containing the element's attributes as key-value pairs.
|
|
46
|
+
*/
|
|
47
|
+
getAttributes(element) {
|
|
48
|
+
if (!element) return {};
|
|
49
|
+
return [...element.attributes].reduce((attrs, attr) => {
|
|
50
|
+
attrs[attr.name] = attr.value;
|
|
51
|
+
return attrs;
|
|
52
|
+
}, {});
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Retrieves the attributes of a given DOM element as a JSON string.
|
|
57
|
+
*
|
|
58
|
+
* @param {HTMLElement} element - The DOM element from which to retrieve attributes.
|
|
59
|
+
* @returns {string|boolean} A JSON string representing the attributes of the element, or false if no attributes are found.
|
|
60
|
+
*/
|
|
61
|
+
getAttributesAsString(element) {
|
|
62
|
+
const attrs = getAttributes(element);
|
|
63
|
+
return attrs ? JSON.stringify(attrs) : false;
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Gets the constructor name of a given DOM element.
|
|
68
|
+
*
|
|
69
|
+
* @param {HTMLElement} element - The DOM element to get the constructor name from.
|
|
70
|
+
* @returns {string} The name of the constructor of the element.
|
|
71
|
+
*/
|
|
72
|
+
getConstructor(element) {
|
|
73
|
+
return element.constructor.name;
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Calculates the size of the document's HTML content.
|
|
78
|
+
*
|
|
79
|
+
* This function retrieves the outer HTML of the document's root element,
|
|
80
|
+
* removes all whitespace characters, and returns the length of the resulting string.
|
|
81
|
+
*
|
|
82
|
+
* @returns {number} The length of the document's HTML content without whitespace.
|
|
83
|
+
*/
|
|
84
|
+
getDocumentSize() {
|
|
85
|
+
return document.documentElement.outerHTML.replace(/\s+/g, "").length;
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Finds and returns an array of elements that have duplicate IDs in the document.
|
|
90
|
+
*
|
|
91
|
+
* @returns {Element[]} An array of elements that have duplicate IDs.
|
|
92
|
+
*/
|
|
93
|
+
getElementsWithDuplicateIds() {
|
|
94
|
+
const nodes = document.querySelectorAll("[id]");
|
|
95
|
+
const ids = {};
|
|
96
|
+
const duplicates = [];
|
|
97
|
+
nodes.forEach((node) => {
|
|
98
|
+
const id = node.id.trim();
|
|
99
|
+
ids[id] = (ids[id] || 0) + 1;
|
|
100
|
+
if (ids[id] > 1 && !duplicates.includes(id)) {
|
|
101
|
+
duplicates.push(id);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
return duplicates.map((id) => document.querySelector(`#${id}`));
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Returns the outer HTML of the given element.
|
|
109
|
+
*
|
|
110
|
+
* @param {Element} element - The DOM element to get the outer HTML from.
|
|
111
|
+
* @returns {string} The outer HTML of the element.
|
|
112
|
+
*/
|
|
113
|
+
getOuterHTML(element) {
|
|
114
|
+
return element.outerHTML;
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Generates an XPath string for a given DOM element.
|
|
119
|
+
*
|
|
120
|
+
* @param {Element} element - The DOM element for which to generate the XPath.
|
|
121
|
+
* @returns {string} The XPath string representing the element's location in the DOM.
|
|
122
|
+
*/
|
|
123
|
+
getXPath(element) {
|
|
124
|
+
if (!element) return "";
|
|
125
|
+
let path = "";
|
|
126
|
+
while (element && element.nodeType === Node.ELEMENT_NODE) {
|
|
127
|
+
let index = 1;
|
|
128
|
+
let sibling = element.previousElementSibling;
|
|
129
|
+
while (sibling) {
|
|
130
|
+
if (sibling.nodeName === element.nodeName) index++;
|
|
131
|
+
sibling = sibling.previousElementSibling;
|
|
132
|
+
}
|
|
133
|
+
path = `/${element.nodeName.toLowerCase()}[${index}]` + path;
|
|
134
|
+
element = element.parentElement;
|
|
135
|
+
}
|
|
136
|
+
return path;
|
|
137
|
+
},
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Checks if the given element has focus.
|
|
141
|
+
*
|
|
142
|
+
* @param {HTMLElement} element - The DOM element to check for focus.
|
|
143
|
+
* @returns {boolean} True if the element has focus, otherwise false.
|
|
144
|
+
*/
|
|
145
|
+
hasFocus(element) {
|
|
146
|
+
return document.activeElement === element;
|
|
147
|
+
},
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Checks if the given element is fully visible within the viewport.
|
|
151
|
+
*
|
|
152
|
+
* @param {Element} element - The DOM element to check for visibility.
|
|
153
|
+
* @returns {boolean} True if the element is fully visible, false otherwise.
|
|
154
|
+
*/
|
|
155
|
+
isFullyVisible(element) {
|
|
156
|
+
const rect = element.getBoundingClientRect();
|
|
157
|
+
return (
|
|
158
|
+
rect.top >= 0 &&
|
|
159
|
+
rect.left >= 0 &&
|
|
160
|
+
rect.bottom <= window.innerHeight &&
|
|
161
|
+
rect.right <= window.innerWidth
|
|
162
|
+
);
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
module.exports = {
|
|
167
|
+
hasAttr: domUtils.hasAttr,
|
|
168
|
+
attrBegins: domUtils.attrBegins,
|
|
169
|
+
containsNoCase: domUtils.containsNoCase,
|
|
170
|
+
getAttributes: domUtils.getAttributes,
|
|
171
|
+
getAttributesAsString: domUtils.getAttributesAsString,
|
|
172
|
+
getConstructor: domUtils.getConstructor,
|
|
173
|
+
getDocumentSize: domUtils.getDocumentSize,
|
|
174
|
+
getElementsWithDuplicateIds: domUtils.getElementsWithDuplicateIds,
|
|
175
|
+
getOuterHTML: domUtils.getOuterHTML,
|
|
176
|
+
getXPath: domUtils.getXPath,
|
|
177
|
+
hasFocus: domUtils.hasFocus,
|
|
178
|
+
isFullyVisible: domUtils.isFullyVisible,
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
module.exports = domUtils;
|
|
182
|
+
</code></pre></article></section></div></div></div><div class="search-container" id="PkfLWpAbet" style="display:none"><div class="wrapper" id="iCxFxjkHbP"><button class="icon-button search-close-button" id="VjLlGakifb" aria-label="close search"><svg><use xlink:href="#close-icon"></use></svg></button><div class="search-box-c"><svg><use xlink:href="#search-icon"></use></svg> <input type="text" id="vpcKVYIppa" class="search-input" placeholder="Search..." autofocus></div><div class="search-result-c" id="fWwVHRuDuN"><span class="search-result-c-text">Type anything to view search result</span></div></div></div><div class="mobile-menu-icon-container"><button class="icon-button" id="mobile-menu" data-isopen="false" aria-label="menu"><svg><use xlink:href="#menu-icon"></use></svg></button></div><div id="mobile-sidebar" class="mobile-sidebar-container"><div class="mobile-sidebar-wrapper"><div class="mobile-nav-links"></div><div class="mobile-sidebar-items-c"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-afixt-test-utils.html">afixt-test-utils</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#arrayCount">arrayCount</a></div><div class="sidebar-section-children"><a href="global.html#arrayRemoveByValue">arrayRemoveByValue</a></div><div class="sidebar-section-children"><a href="global.html#arrayUnique">arrayUnique</a></div><div class="sidebar-section-children"><a href="global.html#cellColorDiffs">cellColorDiffs</a></div><div class="sidebar-section-children"><a href="global.html#cellCount">cellCount</a></div><div class="sidebar-section-children"><a href="global.html#checkInconsistent">checkInconsistent</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsInHeader">checkMultiRowsInHeader</a></div><div class="sidebar-section-children"><a href="global.html#checkMultiRowsWithColspan">checkMultiRowsWithColspan</a></div><div class="sidebar-section-children"><a href="global.html#cleanBlank">cleanBlank</a></div><div class="sidebar-section-children"><a href="global.html#colCount">colCount</a></div><div class="sidebar-section-children"><a href="global.html#countBordersPct">countBordersPct</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleName">getAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#getAccessibleText">getAccessibleText</a></div><div class="sidebar-section-children"><a href="global.html#getAriaAttributes">getAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#getCSSGeneratedContent">getCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getColorContrast">getColorContrast</a></div><div class="sidebar-section-children"><a href="global.html#getComputedBackgroundColor">getComputedBackgroundColor</a></div><div class="sidebar-section-children"><a href="global.html#getComputedRole">getComputedRole</a></div><div class="sidebar-section-children"><a href="global.html#getFocusableElements">getFocusableElements</a></div><div class="sidebar-section-children"><a href="global.html#getGeneratedContent">getGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#getImageText">getImageText</a></div><div class="sidebar-section-children"><a href="global.html#getStyleObject">getStyleObject</a></div><div class="sidebar-section-children"><a href="global.html#getTwoLetterCode">getTwoLetterCode</a></div><div class="sidebar-section-children"><a href="global.html#hasAccessibleName">hasAccessibleName</a></div><div class="sidebar-section-children"><a href="global.html#hasAttribute">hasAttribute</a></div><div class="sidebar-section-children"><a href="global.html#hasCSSGeneratedContent">hasCSSGeneratedContent</a></div><div class="sidebar-section-children"><a href="global.html#hasHiddenParent">hasHiddenParent</a></div><div class="sidebar-section-children"><a href="global.html#hasParent">hasParent</a></div><div class="sidebar-section-children"><a href="global.html#hasValidAriaAttributes">hasValidAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#hasValidAriaRole">hasValidAriaRole</a></div><div class="sidebar-section-children"><a href="global.html#isAriaAttributeValid">isAriaAttributeValid</a></div><div class="sidebar-section-children"><a href="global.html#isComplexTable">isComplexTable</a></div><div class="sidebar-section-children"><a href="global.html#isDataTable">isDataTable</a></div><div class="sidebar-section-children"><a href="global.html#isFocusable">isFocusable</a></div><div class="sidebar-section-children"><a href="global.html#isHidden">isHidden</a></div><div class="sidebar-section-children"><a href="global.html#isNotVisible">isNotVisible</a></div><div class="sidebar-section-children"><a href="global.html#isOffScreen">isOffScreen</a></div><div class="sidebar-section-children"><a href="global.html#isValidUrl">isValidUrl</a></div><div class="sidebar-section-children"><a href="global.html#isVisible">isVisible</a></div><div class="sidebar-section-children"><a href="global.html#langCodes">langCodes</a></div><div class="sidebar-section-children"><a href="global.html#luminance">luminance</a></div><div class="sidebar-section-children"><a href="global.html#matchesSelector">matchesSelector</a></div><div class="sidebar-section-children"><a href="global.html#parseRGB">parseRGB</a></div><div class="sidebar-section-children"><a href="global.html#rowCount">rowCount</a></div><div class="sidebar-section-children"><a href="global.html#rtls">rtls</a></div><div class="sidebar-section-children"><a href="global.html#sortByVisualOrder">sortByVisualOrder</a></div><div class="sidebar-section-children"><a href="global.html#strlen">strlen</a></div><div class="sidebar-section-children"><a href="global.html#testContrast">testContrast</a></div><div class="sidebar-section-children"><a href="global.html#testLang">testLang</a></div><div class="sidebar-section-children"><a href="global.html#testOrder">testOrder</a></div><div class="sidebar-section-children"><a href="global.html#validAriaAttributes">validAriaAttributes</a></div><div class="sidebar-section-children"><a href="global.html#validLangCodes">validLangCodes</a></div></div></div><div class="mobile-navbar-actions"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#light-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div></div></div><script type="text/javascript" src="scripts/core.min.js"></script><script src="scripts/search.min.js" defer="defer"></script><script src="scripts/third-party/fuse.js" defer="defer"></script><script type="text/javascript">var tocbotInstance=tocbot.init({tocSelector:"#eed4d2a0bfd64539bb9df78095dec881",contentSelector:".main-content",headingSelector:"h1, h2, h3",hasInnerContainers:!0,scrollContainer:".main-content",headingsOffset:130,onClick:bringLinkToView})</script></body></html>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|