Repository navigation
Fork patch: Settle CSS transitions on jump seeks - #7
valeriangalliat wants to merge 1 commit into
Conversation
56d8fbc to
1f1a377
Compare
|
🤖 AI agent: sync/2026-10-24 (tags moved the same day): rebased onto upstream First pass on this date, onto The range-diff below is against 1: 56d8fbcc5 ! 1: 4c51242c1 fix(engine): settle CSS transitions spawned by jump seeks
@@ packages/engine/src/services/frameCapture-jumpSeek.test.ts (new)
## packages/engine/src/services/frameCapture.ts ##
@@ packages/engine/src/services/frameCapture.ts: export interface CaptureSession {
- beginFrameIntervalMs: number;
beginFrameHasDamageCount: number;
beginFrameNoDamageCount: number;
+ beginFrameSeekPresented?: boolean;
+ lastSeekTime?: number;
/** Optional producer config — when set, overrides module-level env var constants. */
config?: Partial<EngineConfig>;
@@ packages/engine/src/services/frameCapture.ts: async function seekPageTimeline(
+ try {
+ settleDocument(win.document);
+ } catch {}
-+ for (let i = 0; i < win.frames.length; i++) {
++ for (let i = 0; i < (win.frames?.length ?? 0); i++) {
+ const child = win.frames[i];
+ if (child && child !== win) settleWindow(child);
+ }
@@ packages/engine/src/services/frameCapture.ts: async function seekPageTimeline(
session: CaptureSession,
frameIndex: number,
@@ packages/engine/src/services/frameCapture.ts: async function prepareFrameForCapture(
- );
const seekStart = Date.now();
+ session.captureStep = "seeking the timeline";
- const hasPendingComposite = await seekPageTimeline(page, quantizedTime, seekOptions);
+ const { hasPendingComposite } = await seekPageWithJumpSettle(
+ session,
@@ packages/engine/src/services/frameCapture.ts: async function prepareFrameForCapt
+ seekOptions,
+ );
+ session.captureStep = "decoding CSS background images";
await decodeDynamicCssBackgroundImages(page);
-
@@ packages/engine/src/services/frameCapture.ts: export async function verifyStaticFramesSafe(
const seekToFrame = async (frameIdx: number): Promise<void> => {
stats.seeks++;
@@ packages/engine/src/services/frameCapture.ts: export async function verifyStatic
+ }
+ }
+ } catch {}
-+ for (let i = 0; i < win.frames.length; i++) {
++ for (let i = 0; i < (win.frames?.length ?? 0); i++) {
+ const child = win.frames[i];
+ if (child && child !== win) settleWindow(child);
+ } |
Edit accuracy: accurate 271 (base branch 271), smooth 156 of thoseThe gate passes. Quarantined, measured but not gated (0) Unstable (1)
|
1f1a377 to
4c51242
Compare
Keep-local: finish() jump-spawned CSS transitions so chunk workers don't replay class-swap fades. On-seam swaps snap. Do not upstream.
4c51242 to
b809149
Compare
|
🤖 AI agent: sync/2026-11-10: rebased onto upstream |
🤖 AI agent: Arcade fork patch. Do not merge.
This draft shows
patch/jump-seek-css-settleagainstmain, the upstream mirror, so the patch has one page for its diff, its revisions and its reason. Arcade's/hyperframes-updaterebases the branch ontomainand cherry-picks it ontoarcade; this PR is not part of that flow. When a rebuild changes the patch, itsgit range-diffagainst the previoussync/<date>/jump-seek-css-settletag is posted as a comment.Why
A chunk worker starts with a jump seek. Class swaps on that seek spawn CSS transitions, and the worker then replays those fades in its first frames. The patch calls
finish()on transitions spawned by a jump seek; swaps that land on the seam snap. Static-frame verification folds the settle into its single seek call, because upstream tests (staticDedupVerifyDensity) countpage.evaluatecalls.Upstream
Kept local. Carried before as ArcadeHQ/hyperframes#33.
Drop when
Not recorded yet.
Arcade
ARC-14274 · ARC-14435