tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 3f68aecb816ce452599988b579cfca787e66f426
parent 91903eea095ec9f8ec46adab7d6f7765f0f7a1ab
Author: Kevin Ellis <kevers@google.com>
Date:   Thu,  9 Oct 2025 16:28:26 +0000

Bug 1991120 [wpt PR 55094] - [scoped-vt] Fix crash with style update during transition, a=testonly

Automatic update from web-platform-tests
[scoped-vt] Fix crash with style update during transition

SelectionChecker was assuming that any view-transitions are associated
with the documentElement. This code had not been updated for scoped
view-transitions. This patch fixes that oversight.

Bug: 433699862
Change-Id: I95fbde616108177971d1803d87831e3b63ec3089
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6972963
Reviewed-by: Rune Lillesveen <futhark@chromium.org>
Commit-Queue: Kevin Ellis <kevers@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1521453}

--

wpt-commits: 9ded49549f9bcca4443063537f6ee7b1c6d8835f
wpt-pr: 55094

Diffstat:
Atesting/web-platform/tests/css/css-view-transitions/scoped/display-change-during-transition-ref.html | 38++++++++++++++++++++++++++++++++++++++
Atesting/web-platform/tests/css/css-view-transitions/scoped/display-change-during-transition.html | 94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 132 insertions(+), 0 deletions(-)

diff --git a/testing/web-platform/tests/css/css-view-transitions/scoped/display-change-during-transition-ref.html b/testing/web-platform/tests/css/css-view-transitions/scoped/display-change-during-transition-ref.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width"> + <link rel="help" href="https://drafts.csswg.org/css-view-transitions-2/"> + <style> + .box { + position: absolute; + z-index: 0; + will-change: transform; + contain: strict; + } + #scope { + position: absolute; + background: #eee; + left: 40px; + top: 40px; + width: 490px; + height: 190px; + } + .part { + left: 30px; + top: 30px; + width: 120px; + height: 120px; + background-color: purple; + transform: translateX(150px); + outline: 5px solid green; + } + </style> +</head> +<body> + <div id=scope class=box> + <div class="part box"></div> + </div> +</body> +</html> diff --git a/testing/web-platform/tests/css/css-view-transitions/scoped/display-change-during-transition.html b/testing/web-platform/tests/css/css-view-transitions/scoped/display-change-during-transition.html @@ -0,0 +1,94 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width"> + <link rel="help" href="https://drafts.csswg.org/css-view-transitions-2/"> + <link rel="match" href="display-change-during-transition-ref.html"> + <meta name="fuzzy" content="maxDifference=0-2;totalPixels=0-14400"> + <style> + .tr { + view-transition-name: demo; + } + ::view-transition { + pointer-events: none; + } + ::view-transition-group(demo) { + /* freeze animation at midpoint */ + animation-duration: 10000s; + animation-delay: -5000s; + animation-timing-function: cubic-bezier(0, 1, 1, 0); + display: block; + outline: 5px solid red; + } + ::view-trnasition-image-pair(demo), + ::view-transition-old(demo), + ::view-transtion-new(demo) { + /* No cross-fade */ + animaton: unset; + } + .box { + position: absolute; + z-index: 0; + will-change: transform; + contain: strict; + } + #scope { + position: absolute; + background: #eee; + left: 40px; + top: 40px; + width: 490px; + height: 190px; + } + .part { + left: 30px; + top: 30px; + width: 120px; + height: 120px; + background-color: purple; + } + .part.state2 { + transform: translateX(300px); + } + </style> +</head> +<script src="/common/reftest-wait.js"></script> +<script src="/web-animations/testcommon.js"></script> +<body> + <div id=scope class=box> + <div class="part box tr state1"></div> + </div> +</body> +<script> + function animationStartPromise() { + return new Promise(resolve => { + const listener = event => { + document.removeEventListener('animationstart', listener); + resolve(); + }; + document.addEventListener('animationstart', listener); + }); + } + + window.onload = async () => { + const animationStarted = animationStartPromise(); + const vt = scope.startViewTransition(() => { + scope.querySelector('.part').classList.toggle('state2'); + }); + await vt.ready; + await animationStarted; + await waitForNextFrame(); + await runAndWaitForFrameUpdate(() => { + const new_style = document.createElement('style'); + new_style.innerText = + "::view-transition-group(demo):not(:only-child) { " + + " display: flex;" + + " outline: 5px solid green;" + + "}"; + document.head.appendChild(new_style); + }); + takeScreenshot(); + }; +</script> +</html>