Non-adjustable time limit
meta-refresh
- WCAG success criterion
- 2.2.1 (level A)
- Outcome class
- Manual. A tool cannot decide this check. The audit only points a person at it; it is never counted as automatically verified.
- Area
- Accessibility, Navigation & Operation
- Default severity
- high
- axe-core rule
meta-refresh
Why we flag this
Users need more time to enter data and may lose data through timeouts.
Missing refresh or timeout handling in the script/markup.
What the rule checks
Scope. Every page (a fixed page-wide UNTESTED note).
Expectation. Emits one page-wide UNTESTED note on every page, never a pass and never a violation. Strictly, 2.2.1 applies only where content sets a time limit, so a page without scripts or forms would be out of scope; the note is unconditional today, which is why no not-applicable case exists.
Why a person has to decide. Script-driven time limits (setTimeout/setInterval, session expiry) and whether users can turn them off, adjust or extend them are not visible in the DOM. The id is historical: it names the 2.2.1 page note for script time limits, while the actual meta refresh detection is timing/meta-refresh.
Source. WCAG 2.2 SC 2.2.1 Timing Adjustable
Detection: page; needs dom.
Failing example
The check flags this for review. Corpus case visual_meta_refresh_redirect. The page may contain further findings for other rules.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Upper-case attribute value, leading space and a target URL; 71999 s is
one second short of the 20-hour exception. -->
<meta id="slow-redirect" HTTP-EQUIV="REFRESH" content=" 71999; url=/news">
<title>Ticker page with a refresh and a redirect</title>
<script>
// Inserted by a script: the browser still honours it.
var refresh = document.createElement('meta');
refresh.id = 'late-refresh';
refresh.httpEquiv = 'refresh';
refresh.content = '900';
document.head.appendChild(refresh);
</script>
</head>
<body>
<header>
<a href="#main" style="display: inline-block; min-width: 44px; min-height: 44px; line-height: 44px; padding: 0 8px">Skip to main content</a>
<p>Live ticker</p>
<nav aria-label="Main"><a href="#main" aria-current="page" style="display: inline-block; min-width: 44px; min-height: 44px; line-height: 44px; padding: 0 8px">Overview</a></nav>
</header>
<main id="main">
<h1>Match day live ticker</h1>
<p>Kick-off is at three in the afternoon.</p>
</main>
<footer><p>Footer text</p></footer>
</body>
</html>This page is generated from the rule catalogue and the rule contracts; see therule overview for how the outcome classes are derived.