JavaScript Rendering
Fixtures that distinguish crawlers that render JavaScript from crawlers that only parse the initial HTML response, covering injected content, delays, metadata mutation, interaction-gated content, shadow DOM, and service workers.
Every fixture in this group serves a raw marker in the initial HTML bytes
and builds a rendered marker at runtime, appending it as the text of an
element carrying the data-sb-rendered attribute. The rendered marker string
never exists in the raw bytes — scripts assemble it from fragments — so the
two crawl modes can always be told apart.
Families:
- Content injection:
document.write,innerHTML,textContent, and fetch-loaded content backed by a JSON helper endpoint. - Delays: rendered content appears after
setTimeoutof exactly 500ms, 2000ms, or 5000ms; the 5000ms variant exceeds common render timeouts and is risky-manifest only. - SPA hydration: a raw app-shell placeholder replaced by hydrated content.
- Metadata mutation: title change, meta description insertion, canonical insertion, and JSON-LD Article injection — all after JavaScript execution.
- Proof pages: raw bodies that carry only the raw marker, with all body
text or all links created at runtime; plus a JavaScript-injected
noindexwhose token never appears in the raw bytes. - Interaction events: click-gated content behind a
#sb-actionbutton, bounded infinite scroll capped at three batches, and an IntersectionObserver sentinel below the fold. - Shadow DOM: an open shadow root whose text is the rendered marker, and a closed shadow root whose inner text is never externally inspectable.
- Service worker: a scoped install/activate/fetch passthrough worker that requires a secure context and reports an unavailable text when registration fails.
Interaction-gated, long-delay, closed-shadow, noindex-injecting, and service-worker fixtures are risky-manifest, direct-entry only; the rest are safe for broad crawling within the fixture domain.
Fixtures in this category
- Content via document.write —
js-document-write(safe) - Content via innerHTML —
js-inner-html(safe) - Content via textContent —
js-text-content(safe) - Content loaded over fetch —
js-fetch-content(safe) - Content delayed by 500ms —
js-delay-500(safe) - Content delayed by 2000ms —
js-delay-2000(safe) - SPA shell hydration —
js-spa-hydration(safe) - Title changed by JavaScript —
js-title-set(safe) - Meta description inserted by JavaScript —
js-description-set(safe) - Canonical inserted by JavaScript —
js-canonical-inserted(safe) - JSON-LD injected by JavaScript —
js-jsonld-injected(safe) - All body text rendered by JavaScript —
js-all-body-text(safe) - All links rendered by JavaScript —
js-all-links(safe) - Content revealed by IntersectionObserver —
js-intersection-observer(safe) - Content inside an open shadow root —
js-shadow-open(safe)