axe-core 4.10.2-canary.ec7c6c8 → 4.10.2-canary.f2b535a

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/README.md CHANGED
@@ -14,7 +14,7 @@ Axe is an accessibility testing engine for websites and other HTML-based user in
14
14
 
15
15
  ## The Accessibility Rules
16
16
 
17
- Axe-core has different types of rules, for WCAG 2.0, 2.1, 2.2 on level A, AA and AAA as well as a number of best practices that help you identify common accessibility practices like ensuring every page has an `h1` heading, and to help you avoid "gotchas" in ARIA like where an ARIA attribute you used will get ignored. The complete list of rules, grouped WCAG level and best practice, can found in [doc/rule-descriptions.md](./doc/rule-descriptions.md).
17
+ Axe-core has different types of rules, for WCAG 2.0, 2.1, 2.2 on level A, AA and AAA as well as a number of best practices that help you identify common accessibility practices like ensuring every page has an `h1` heading, and to help you avoid "gotchas" in ARIA like where an ARIA attribute you used will get ignored. The complete list of rules, grouped WCAG level and best practice, can be found in [doc/rule-descriptions.md](./doc/rule-descriptions.md).
18
18
 
19
19
  With axe-core, you can find **on average 57% of WCAG issues automatically**. Additionally, axe-core will return elements as "incomplete" where axe-core could not be certain, and manual review is needed.
20
20
 
@@ -65,7 +65,7 @@ Axe was built to reflect how web development actually works. It works with all m
65
65
  - It's actively supported by [Deque Systems](https://www.deque.com), a major accessibility vendor.
66
66
  - It integrates with your existing functional/acceptance automated tests.
67
67
  - It automatically determines which rules to run based on the evaluation context.
68
- - Axe supports in-memory fixtures, static fixtures, integration tests and iframes of infinite depth.
68
+ - Axe supports in-memory fixtures, static fixtures, integration tests, and iframes of infinite depth.
69
69
  - Axe is highly configurable.
70
70
 
71
71
  ## Supported Browsers
package/axe.js CHANGED
@@ -1,5 +1,5 @@
1
- /*! axe v4.10.2-canary.ec7c6c8
2
- * Copyright (c) 2015 - 2024 Deque Systems, Inc.
1
+ /*! axe v4.10.2-canary.f2b535a
2
+ * Copyright (c) 2015 - 2025 Deque Systems, Inc.
3
3
  *
4
4
  * Your use of this Source Code Form is subject to the terms of the Mozilla Public
5
5
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -22,7 +22,7 @@
22
22
  }, _typeof(o);
23
23
  }
24
24
  var axe = axe || {};
25
- axe.version = '4.10.2-canary.ec7c6c8';
25
+ axe.version = '4.10.2-canary.f2b535a';
26
26
  if (typeof define === 'function' && define.amd) {
27
27
  define('axe-core', [], function() {
28
28
  return axe;
@@ -6943,6 +6943,9 @@
6943
6943
  parseStylesheet: function parseStylesheet() {
6944
6944
  return parse_stylesheet_default;
6945
6945
  },
6946
+ parseTabindex: function parseTabindex() {
6947
+ return parse_tabindex_default;
6948
+ },
6946
6949
  performanceTimer: function performanceTimer() {
6947
6950
  return performance_timer_default;
6948
6951
  },
@@ -10299,9 +10302,8 @@
10299
10302
  var nodeAndDescendents = query_selector_all_default(virtualNode, '*');
10300
10303
  var tabbableElements = nodeAndDescendents.filter(function(vNode) {
10301
10304
  var isFocusable2 = vNode.isFocusable;
10302
- var tabIndex = vNode.actualNode.getAttribute('tabindex');
10303
- tabIndex = tabIndex && !isNaN(parseInt(tabIndex, 10)) ? parseInt(tabIndex) : null;
10304
- return tabIndex ? isFocusable2 && tabIndex >= 0 : isFocusable2;
10305
+ var tabIndex = parse_tabindex_default(vNode.actualNode.getAttribute('tabindex'));
10306
+ return tabIndex !== null ? isFocusable2 && tabIndex >= 0 : isFocusable2;
10305
10307
  });
10306
10308
  return tabbableElements;
10307
10309
  }
@@ -10344,18 +10346,15 @@
10344
10346
  } else if (is_natively_focusable_default(vNode)) {
10345
10347
  return true;
10346
10348
  }
10347
- var tabindex = vNode.attr('tabindex');
10348
- if (tabindex && !isNaN(parseInt(tabindex, 10))) {
10349
- return true;
10350
- }
10351
- return false;
10349
+ var tabindex = parse_tabindex_default(vNode.attr('tabindex'));
10350
+ return tabindex !== null;
10352
10351
  }
10353
10352
  function _isInTabOrder(el) {
10354
10353
  var _nodeLookup6 = _nodeLookup(el), vNode = _nodeLookup6.vNode;
10355
10354
  if (vNode.props.nodeType !== 1) {
10356
10355
  return false;
10357
10356
  }
10358
- var tabindex = parseInt(vNode.attr('tabindex', 10));
10357
+ var tabindex = parse_tabindex_default(vNode.attr('tabindex'));
10359
10358
  if (tabindex <= -1) {
10360
10359
  return false;
10361
10360
  }
@@ -11835,7 +11834,7 @@
11835
11834
  }, {
11836
11835
  hasAccessibleName: true
11837
11836
  } ],
11838
- allowedRoles: [ 'button', 'checkbox', 'link', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'meter', 'option', 'progressbar', 'radio', 'scrollbar', 'separator', 'slider', 'switch', 'tab', 'treeitem', 'doc-cover' ]
11837
+ allowedRoles: [ 'button', 'checkbox', 'link', 'math', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'meter', 'option', 'progressbar', 'radio', 'scrollbar', 'separator', 'slider', 'switch', 'tab', 'treeitem', 'doc-cover' ]
11839
11838
  },
11840
11839
  usemap: {
11841
11840
  matches: '[usemap]',
@@ -13893,7 +13892,7 @@
13893
13892
  });
13894
13893
  }
13895
13894
  function insertedIntoFocusOrder(el) {
13896
- var tabIndex = parseInt(el.getAttribute('tabindex'), 10);
13895
+ var tabIndex = parse_tabindex_default(el.getAttribute('tabindex'));
13897
13896
  return tabIndex > -1 && _isFocusable(el) && !is_natively_focusable_default(el);
13898
13897
  }
13899
13898
  var inserted_into_focus_order_default = insertedIntoFocusOrder;
@@ -18616,12 +18615,8 @@
18616
18615
  };
18617
18616
  }
18618
18617
  function frameFocusable(frame) {
18619
- var tabIndex = frame.getAttribute('tabindex');
18620
- if (!tabIndex) {
18621
- return true;
18622
- }
18623
- var _int = parseInt(tabIndex, 10);
18624
- return isNaN(_int) || _int >= 0;
18618
+ var tabIndex = parse_tabindex_default(frame.getAttribute('tabindex'));
18619
+ return tabIndex === null || tabIndex >= 0;
18625
18620
  }
18626
18621
  function getBoundingSize(domNode) {
18627
18622
  var width = parseInt(domNode.getAttribute('width'), 10);
@@ -19196,6 +19191,17 @@
19196
19191
  });
19197
19192
  }
19198
19193
  var parse_crossorigin_stylesheet_default = parseCrossOriginStylesheet;
19194
+ function parseTabindex(value) {
19195
+ if (typeof value !== 'string') {
19196
+ return null;
19197
+ }
19198
+ var match = value.trim().match(/^([-+]?\d+)/);
19199
+ if (match) {
19200
+ return Number(match[1]);
19201
+ }
19202
+ return null;
19203
+ }
19204
+ var parse_tabindex_default = parseTabindex;
19199
19205
  var performanceTimer = function() {
19200
19206
  function now() {
19201
19207
  if (window.performance && window.performance) {
@@ -25434,8 +25440,8 @@
25434
25440
  }
25435
25441
  var alt_space_value_evaluate_default = altSpaceValueEvaluate;
25436
25442
  function tabindexEvaluate(node, options, virtualNode) {
25437
- var tabIndex = parseInt(virtualNode.attr('tabindex'), 10);
25438
- return isNaN(tabIndex) ? true : tabIndex <= 0;
25443
+ var tabIndex = parse_tabindex_default(virtualNode.attr('tabindex'));
25444
+ return tabIndex === null || tabIndex <= 0;
25439
25445
  }
25440
25446
  var tabindex_evaluate_default = tabindexEvaluate;
25441
25447
  function noFocusableContentEvaluate(node, options, virtualNode) {
@@ -25479,8 +25485,8 @@
25479
25485
  return retVal;
25480
25486
  }
25481
25487
  function usesUnreliableHidingStrategy(vNode) {
25482
- var tabIndex = parseInt(vNode.attr('tabindex'), 10);
25483
- return !isNaN(tabIndex) && tabIndex < 0;
25488
+ var tabIndex = parse_tabindex_default(vNode.attr('tabindex'));
25489
+ return tabIndex !== null && tabIndex < 0;
25484
25490
  }
25485
25491
  function landmarkIsTopLevelEvaluate(node) {
25486
25492
  var landmarks = get_aria_roles_by_type_default('landmark');
@@ -25552,9 +25558,7 @@
25552
25558
  }
25553
25559
  var focusable_not_tabbable_evaluate_default = focusableNotTabbableEvaluate;
25554
25560
  function focusableNoNameEvaluate(node, options, virtualNode) {
25555
- var tabIndex = virtualNode.attr('tabindex');
25556
- var inFocusOrder = _isFocusable(virtualNode) && tabIndex > -1;
25557
- if (!inFocusOrder) {
25561
+ if (!_isInTabOrder(virtualNode)) {
25558
25562
  return false;
25559
25563
  }
25560
25564
  try {
@@ -27019,8 +27023,8 @@
27019
27023
  }
27020
27024
  var no_role_matches_default = noRoleMatches;
27021
27025
  function noNegativeTabindexMatches(node, virtualNode) {
27022
- var tabindex = parseInt(virtualNode.attr('tabindex'), 10);
27023
- return isNaN(tabindex) || tabindex >= 0;
27026
+ var tabindex = parse_tabindex_default(virtualNode.attr('tabindex'));
27027
+ return tabindex === null || tabindex >= 0;
27024
27028
  }
27025
27029
  var no_negative_tabindex_matches_default = noNegativeTabindexMatches;
27026
27030
  function noNamingMethodMatches(node, virtualNode) {
@@ -27350,14 +27354,14 @@
27350
27354
  return false;
27351
27355
  }
27352
27356
  var role = virtualNode.attr('role');
27353
- var tabIndex = virtualNode.attr('tabindex');
27354
- if (tabIndex === '-1' && role) {
27357
+ var tabIndex = parse_tabindex_default(virtualNode.attr('tabindex'));
27358
+ if (tabIndex < 0 && role) {
27355
27359
  var roleDef = standards_default.ariaRoles[role];
27356
27360
  if (roleDef === void 0 || roleDef.type !== 'widget') {
27357
27361
  return false;
27358
27362
  }
27359
27363
  }
27360
- if (tabIndex === '-1' && virtualNode.actualNode && !_isVisibleOnScreen(virtualNode) && !_isVisibleToScreenReaders(virtualNode)) {
27364
+ if (tabIndex < 0 && virtualNode.actualNode && !_isVisibleOnScreen(virtualNode) && !_isVisibleToScreenReaders(virtualNode)) {
27361
27365
  return false;
27362
27366
  }
27363
27367
  return true;
@@ -30274,7 +30278,7 @@
30274
30278
  impact: 'critical',
30275
30279
  messages: {
30276
30280
  pass: 'The multimedia element has a captions track',
30277
- incomplete: 'Check that captions is available for the element'
30281
+ incomplete: 'Check that captions are available for the element'
30278
30282
  }
30279
30283
  },
30280
30284
  'frame-tested': {