- Performance enhancements (#263)
- Escape special characters to be used in a query selector string (PR #267)
- Fix exception thrown by RoleTooltipRequiresDescribedBy.js (#269)
linkWithUnclearPurpose
should only look at links, not<a>
withouthref
. (#245)
- A tabpanel should be related to a tab via aria-controls or aria-labelledby (
src/audits/UncontrolledTabpanel.js
) - A data table must identify row and column headers (
src/audits/TableHasAppropriateHeaders.js
) - A tooltip element should have an aria-describedby referring to it (
src/audits/RoleTooltipRequiresDescribedBy.js
).
- Pull DOM-related functionality out into
DOMUtils.js
- Fix
findTextAlternatives
not always correctly ignoring hidden elements (#217). findTextAlternatives
now honorsalt
attribute of input type image- Revert #150 which was causing the extension not to work.
- AX_HTML_02 (duplicate IDs) now only audits elements that are referenced by an IDREF (#141);
- Fix #171 by being smarter about finding the composed parent node.
- Tweak in canScrollTo to handle the (common) case where the container is
document.body
(#243).
- A label element may not have labelable descendants other than its labeled control (
src/audits/MultipleLabelableElementsPerLabel.js
)
- Implement support for specifying audit configuration options through an object when initializing audits (#165).
- Implement support for AMD loaders.
- Fix
badAriaAttributeValue
not correctly handling decimal values (#182). - Work around null pointer exception caused by closure compiler issue (#183).
- Add a special case to handle color
"transparent"
to fix (#180). - Fix
matchSelector
not working properly in browser environments without vendor prefixes (#189). - Fix false positives on elements with no role for Unsupported ARIA Attribute rule (#178 and #199).
- Fix ARIA
tablist
and ARIAtab
scope (#204) - Fix link with clear purpose with text alternative (#156);
- Handle edge cases in number parser, e.g. "+1", ".1", "01"
- HTML button containing img with alt attribute now passes controlsWithoutLabel (#202)
- Disabled elements should be ignored by low contrast audit (#205)
- Fix input of type "text" did not find correct implied role (#225)
- Hidden links are no longer relevant for meaningful link text rule.
- Pull color code into separate file.
- Improve color suggestion algorithm.
- Descend into iframes when collecting matching elements.
- Check for null
textAlternatives
inFocusableElementNotVisibleAndNotAriaHidden
'srelevantElementMatcher
method.
- Rework findTextAlternatives not to return non-exposed text alternatives.
- Add Bower config (#157)
- Check for any text alternatives when assessing unlabeled images (#154).
- This element does not support ARIA roles, states and properties (
src/audits/AriaOnReservedElement.js
) - aria-owns should not be used if ownership is implicit in the DOM (
src/audits/AriaOwnsDescendant.js
) - Elements with ARIA roles must be in the correct scope (
src/audits/AriaRoleNotScoped.js
) - An element's ID must be unique in the DOM (
src/audits/DuplicateId.js
) - The web page should have the content's human language indicated in the markup (
src/audits/HumanLangMissing.js
) - An element's ID must not be present in more that one aria-owns attribute at any time (
src/audits/MultipleAriaOwners.js
) - ARIA attributes which refer to other elements by ID should refer to elements which exist in the DOM (
src/audits/NonExistentAriaRelatedElement.js
- previouslysrc/audits/NonExistentAriaLabeledBy.js
) - Elements with ARIA roles must ensure required owned elements are present (
src/audits/RequiredOwnedAriaRoleMissing.js
) - Avoid positive integer values for tabIndex (
src/audits/TabIndexGreaterThanZero.js
) - This element has an unsupported ARIA attribute (
src/audits/UnsupportedAriaAttribute.js
)
- Add configurable blacklist phrases and stop words to LinkWithUnclearPurpose (#99)
- Detect and warn if we reuse the same code for more than one rule. (#133)
- Force focus before testing visibility on focusable elements. (#65)
- Use getDistributedNodes to get nodes distributed into shadowRoots (#128)
- Add section to Audit Rules page for HumanLangMissing and link to it from rule (#119)
- Reference "applied role" in axs.utils.getRoles enhancement (#130)
- Add warning that AX_FOCUS_02 is not available from axs.Audit.run() (#85)
- Incorrect use of nth-of-type against className in utils.getQuerySelectorText (#87)
- AX_TEXT_01 Accessibility Audit test should probably ignore role=presentation elements (#97)
- Fix path to audit rules in phantomjs runner (#108)
- Label audit should fail if form fields lack a label, even with placeholder text (#81)
- False positives for controls without labels with role=presentation (#23)
- Fix "valid" flag on return value of axs.utils.getRoles (#131)
Note: this version number is somewhat arbitrary - just bringing it vaguely in line with the extension since that's where the library originated - but will use semver for version bumps going forward from here.
- overlapping elements detection code made more sophisticated
- axs.properties.getFocusProperties() returns more information about visibility
- new axs.properties.hasDirectTextDescendant() method with more sophisticated detection of text content
- FocusableElementNotVisibleAndNotAriaHidden audit passes on elements which are brought onscreen on focus
- UnfocusableElementsWithOnclick checks for element.disabled
- Fix infinite loop when getting descendant text content of a label containing an input
- Detect elements which are out of scroll area of any parent element, not just the document scroll area
- findTextAlternatives doesn't throw TypeError if used on a HTMLSelectElement
- axs.AuditRule.run() has a new signature: it now takes an options object. Please see method documentation for details.
- Audit Rule severity can be overridden (per Audit Rule) in AuditConfig.
- axs.utils.isLowContrast() now rounds to the nearest 0.1 before checking (so
#777
is now a passing value) - MainRoleOnInappropriateElement was always failing due to accessible name calculation taking the main role into account and not descending into content (now just gets descendant content directly)
- UnfocusableElementsWithOnClick had a dangling if-statement causing very noisy false positives