Popup dismissal hardening: shadow roots, overlay units, scroll-lock recovery
- Overlay detection resolves effective z-index through stacking ancestors, treats a zero-size max-z wrapper plus its full-viewport descendant as one removable unit, pierces open shadow roots, and relaxes the z floor when the page is scroll-locked; a lock persisting after dismissal reports blocking even with no detected overlay - clickDismiss runs in every frame (close buttons live in cross-origin popup iframes), matches decline/no-thanks/aria-label close affordances, and re-runs before every snapshot AND screenshot to catch late-mounting dialogs - rootUnclamp triggers from IR content extent (a scroll-lock collapses captured scrollHeight) and strips vendor-injected body position/overflow locks when firing - Pollution gate fails on the scroll-lock contradiction: scrollHeight pinned to one viewport while IR content spans multiple - Frame graft skips popup-creative vendor hosts; inline embedded signup forms remain graftable (regression-tested) 322 tests pass (24 new), typecheck clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
23505ee229
commit
0dd71a68d9
@@ -72,6 +72,23 @@ describe("planForFrameUrl", () => {
|
||||
assert.equal(planForFrameUrl("https://static-forms.klaviyo.com/forms/abc"), "graft");
|
||||
assert.equal(planForFrameUrl("http://127.0.0.1:4001/iframe-embed.html"), "graft");
|
||||
});
|
||||
|
||||
it("SKIPS full-viewport promo POPUP CREATIVE hosts (Attentive/Recart/Wunderkind overlays)", () => {
|
||||
// These vendor hosts serve a full-viewport interstitial creative — grafting pours the
|
||||
// popup's copy into the DOM/text channel and paints the modal over the real page.
|
||||
assert.equal(planForFrameUrl("https://creatives.attn.tv/creative/12345"), "skip");
|
||||
assert.equal(planForFrameUrl("https://creative.attn.tv/loader/x"), "skip");
|
||||
assert.equal(planForFrameUrl("https://app.recart.com/popup/abc"), "skip");
|
||||
assert.equal(planForFrameUrl("https://tag.wunderkind.co/creative"), "skip");
|
||||
assert.equal(planForFrameUrl("https://api.bounceexchange.com/creative"), "skip");
|
||||
});
|
||||
|
||||
it("STILL grafts INLINE embed hosts even for the same vendors (inline forms are a feature)", () => {
|
||||
// Caution guard: a deliberately-grafted inline signup form must never be caught by the
|
||||
// popup-creative skip list. Inline-form hosts differ from overlay-creative hosts.
|
||||
assert.equal(planForFrameUrl("https://static-forms.klaviyo.com/forms/abc"), "graft");
|
||||
assert.equal(planForFrameUrl("https://manage.kmail-lists.com/subscriptions/subscribe"), "graft");
|
||||
});
|
||||
});
|
||||
|
||||
describe("graftFrameIntoSnapshot", () => {
|
||||
|
||||
Reference in New Issue
Block a user