Skip to content

SafeFrame Viewport Correction — Attempt History

Tracking what has been tried to fix fullscreen creatives inside publisher safe frame chains, what worked, and what didn't.

The Problem

Fullscreen creatives served through publisher safe frames (e.g. Schibsted/Xandr via CM360) don't scale to the device screen. They render at the safe frame's fixed dimensions (e.g. 1920x1080) on a 375px-wide phone. This is because CSS 100vw/100vh inside nested iframes resolves to the safe frame size, not the actual device — a known cross-origin iframe limitation.

See fullscreen-creative-iframe-scaling.md for the full technical analysis.

Current State (April 2026)

Fullscreen banners rely on CSS percentage-based dimensions (100% × 100%) and standard responsive scaling. No JavaScript viewport correction is in place. This works for most serving environments but may still break in specific DSP/safe frame chains where the iframe is given fixed pixel dimensions.

Known risk: Schibsted/Xandr + CM360 chains where the safe frame registers creatives at 1920x1080 — untested since the revert.

Attempt Timeline

Attempt 1: $sf.ext.geom() viewport correction in Banner.ts

Commits: 6f76dc1e, 96b7de21, 5f326aeaApproach: A script block in Banner.ts srcdoc that:

  1. Guard: Only ran for fullscreen banners (bannerWidth === '100%' && bannerHeight === '100%')
  2. Detection: window.innerWidth > screen.width — true only when the iframe viewport exceeds the device screen
  3. Correction: Set #creative-{id} to screen.width × screen.height instead of 100vw × 100vh
  4. Resize: Listened for resize events for orientation changes
  5. Fallback: If it didn't trigger, existing CSS 100vw × 100vh remained

Result: Reverted in ad407f44 (April 2026). The hardcoded pixel values from $sf.ext.geom().win locked the iframe to its initial size and killed responsiveness — blank ads on mobile, broken scaling on desktop. Broke live ads on Amedia (Adnami midscroll/parallax).

Lesson: Replacing CSS responsive units with hardcoded pixel dimensions is fragile. The correction must not break creatives in non-safe-frame environments.

Attempt 2 (not implemented): visualViewport inside srcdoc

Mentioned in the revert commit (ad407f44) as a potential alternative. The idea is to use window.visualViewport API inside the srcdoc to detect actual viewport dimensions without relying on the SafeFrame API. Not yet explored.

Still Valid Approaches

The fullscreen-creative-iframe-scaling.md doc contains several proposed fixes that haven't been tried:

  • CSS transform: scale() — Scale down the creative when mismatch detected, similar to the existing teadsSafariHackStyles pattern
  • HTML block diagnostic script — Can be injected per-creative for testing without a product deployment
  • Enabling SafeFrame for fullscreen banners — Caveat: $sf may not be available in nested CM360 iframes

Testing Constraints

This can only be tested in live ad environments. The safe frame iframe nesting (publisher → ad server → safe frame → our iframe → srcdoc) cannot be reproduced in preview or DevTools device emulation.

Internal documentation