perf(movimento): vitrine e 3D mais leves, WebGL por software lembrado na sessão e suporte ao WebKit

This commit is contained in:
Evandro Fonseca Junior committed 2026-10-14 22:54:27 -03:00
1 parent 9fd1570426
commit 8903f3c57e
28 files changed
+854 -406

No files matched your search

@@ -215,6 +215,7 @@ afterEach(() => {
jest.useRealTimers();
jest.restoreAllMocks();
window.matchMedia = originalMatchMedia;
Reflect.deleteProperty(navigator, "userAgent");
Object.defineProperty(navigator, "connection", {
configurable: true,
value: undefined,
@@ -535,22 +536,61 @@ describe("ProjectReel: vídeos", () => {
expect(videos()[0].currentTime).toBeGreaterThan(0);
});
it("path: first frame decoded -> primed once (play then pause) even if loadeddata fires twice", async () => {
it("path: Chrome (anything but WebKit) -> the video never plays: playing downloads the whole file, scrubbing only asks for what is seen", async () => {
renderReel();
const video = videos()[0];
fireEvent(video, new Event("loadeddata"));
fireEvent(video, new Event("loadeddata"));
await act(async () => {
await Promise.resolve();
});
expect(HTMLMediaElement.prototype.play).toHaveBeenCalledTimes(1);
expect(HTMLMediaElement.prototype.pause).toHaveBeenCalledTimes(1);
expect(video.dataset.primed).toBe("true");
expect(HTMLMediaElement.prototype.play).not.toHaveBeenCalled();
expect(HTMLMediaElement.prototype.pause).not.toHaveBeenCalled();
expect(video.dataset.primed).toBeUndefined();
});
it.each([
[
"iPhone (Safari)",
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1",
],
[
"iPhone (Chrome, also WebKit)",
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/126.0 Mobile/15E148 Safari/604.1",
],
[
"Safari on the Mac",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15",
],
])(
"path: %s (WebKit) -> primed once (play then pause) even if loadeddata fires twice",
async (_name, userAgent) => {
Object.defineProperty(navigator, "userAgent", {
configurable: true,
value: userAgent,
});
renderReel();
const video = videos()[0];
fireEvent(video, new Event("loadeddata"));
fireEvent(video, new Event("loadeddata"));
await act(async () => {
await Promise.resolve();
});
expect(HTMLMediaElement.prototype.play).toHaveBeenCalledTimes(1);
expect(HTMLMediaElement.prototype.pause).toHaveBeenCalledTimes(1);
expect(video.dataset.primed).toBe("true");
},
);
it("path: priming is refused by the browser -> swallowed, no pause", async () => {
Object.defineProperty(navigator, "userAgent", {
configurable: true,
value:
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1",
});
jest
.mocked(HTMLMediaElement.prototype.play)
.mockRejectedValue(new DOMException("blocked", "NotAllowedError"));
@@ -621,9 +661,9 @@ describe("ProjectReel: estado das camadas, traços de capítulo e legenda", () =
scrollTo(0);
expect(states(".ds-reel-ticks li")).toEqual(["now", "todo", "todo"]);
expect(states(".ds-reel-ticks li")).toEqual(["now", "todo"]);
expect(caption().querySelector(".ds-reel-chapter-count")).toHaveTextContent(
"01/03",
"01/02",
);
});