auditmysitev2.0.2

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.

visual_meta_refresh_redirect.htmlHTML
<!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.