fix(terminal): preserve animation-frame first fit
This commit is contained in:
@@ -22,3 +22,12 @@ Implemented terminal fit scheduling for the first animation frame, `document.fon
|
|||||||
|
|
||||||
- No implementation concerns found.
|
- No implementation concerns found.
|
||||||
- The component-suite worktree dependency-resolution issue remains external to this task.
|
- The component-suite worktree dependency-resolution issue remains external to this task.
|
||||||
|
|
||||||
|
## Reviewer follow-up: preserve the animation-frame first fit
|
||||||
|
|
||||||
|
- RED: `cd apps/next && bun run test:unit -- terminal-fit` exited 1 with 1 failed / 2 passed. The new `waits for the first animation frame before font-triggered fits` regression expected zero calls before rAF, but `fit` had already been called 2 times after flushing the resolved font promises.
|
||||||
|
- GREEN: after gating both font-triggered refits on the initial rAF fit promise, `cd apps/next && bun run test:unit -- terminal-fit` exited 0 with 1 file / 3 tests passed.
|
||||||
|
- Final focused verification: `cd apps/next && bun run test:unit -- terminal-fit` exited 0 with 1 file / 3 tests passed.
|
||||||
|
- Final full unit verification: `cd apps/next && bun run test:unit` exited 0 with 4 files / 11 tests passed.
|
||||||
|
- Final type verification: `cd apps/next && bun run typecheck` exited 0.
|
||||||
|
- Final formatting verification: `cd apps/next && bun run format` exited 0; all matched files use Prettier formatting.
|
||||||
|
|||||||
@@ -12,10 +12,17 @@ export const scheduleTerminalFits = (deps: {
|
|||||||
deps.sendResize();
|
deps.sendResize();
|
||||||
};
|
};
|
||||||
|
|
||||||
deps.raf(refit);
|
const initialFit = new Promise<void>((resolve) => {
|
||||||
void deps.fontsReady.then(refit).catch(() => undefined);
|
deps.raf(() => {
|
||||||
void deps
|
refit();
|
||||||
.loadNerdFont()
|
resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
void Promise.all([deps.fontsReady, initialFit])
|
||||||
|
.then(refit)
|
||||||
|
.catch(() => undefined);
|
||||||
|
void Promise.all([deps.loadNerdFont(), initialFit])
|
||||||
.then(refit)
|
.then(refit)
|
||||||
.catch(() => undefined);
|
.catch(() => undefined);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -7,6 +7,33 @@ const flush = async () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
describe('scheduleTerminalFits', () => {
|
describe('scheduleTerminalFits', () => {
|
||||||
|
test('waits for the first animation frame before font-triggered fits', async () => {
|
||||||
|
const fit = vi.fn();
|
||||||
|
const sendResize = vi.fn();
|
||||||
|
let rafCb: (() => void) | undefined;
|
||||||
|
|
||||||
|
scheduleTerminalFits({
|
||||||
|
fit,
|
||||||
|
sendResize,
|
||||||
|
fontsReady: Promise.resolve(),
|
||||||
|
loadNerdFont: () => Promise.resolve(),
|
||||||
|
raf: (cb) => {
|
||||||
|
rafCb = cb;
|
||||||
|
},
|
||||||
|
isAborted: () => false,
|
||||||
|
});
|
||||||
|
await flush();
|
||||||
|
|
||||||
|
expect(fit).not.toHaveBeenCalled();
|
||||||
|
expect(sendResize).not.toHaveBeenCalled();
|
||||||
|
|
||||||
|
rafCb?.();
|
||||||
|
await flush();
|
||||||
|
|
||||||
|
expect(fit).toHaveBeenCalledTimes(3);
|
||||||
|
expect(sendResize).toHaveBeenCalledTimes(3);
|
||||||
|
});
|
||||||
|
|
||||||
test('fits in rAF and again after fonts.ready and nerd-font load', async () => {
|
test('fits in rAF and again after fonts.ready and nerd-font load', async () => {
|
||||||
const fit = vi.fn();
|
const fit = vi.fn();
|
||||||
const sendResize = vi.fn();
|
const sendResize = vi.fn();
|
||||||
|
|||||||
Reference in New Issue
Block a user