Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -647,4 +647,30 @@ describe("OpenGenUIActivityRenderer", () => {
});
expect(parsed.success).toBe(true);
});

it("replays unchanged activity scripts into a recreated final sandbox", async () => {
const jsFunctions = "function greet() { return 'hi'; }";
const jsExpressions = ["greet();"];
const base = { htmlComplete: true, generating: false, jsFunctions, jsExpressions };
const { rerender } = renderRenderer({ ...base, html: ["<body>first</body>"] });
await flushImport(); await resolveSandboxReady();
resetMockPromise();
rerender(rendererElement({ ...base, html: ["<body>replacement</body>"] }));
await flushImport(); await resolveSandboxReady();
expect(mockCreate).toHaveBeenCalledTimes(2);
expect(mockRun.mock.calls.filter((call) => call[0] === jsFunctions)).toHaveLength(2);
expect(mockRun.mock.calls.filter((call) => call[0] === "greet();")).toHaveLength(2);
});

it("replays unchanged activity scripts after CSS changes replace the frame", async () => {
const base = { html: ["<body>same</body>"], htmlComplete: true, generating: false, cssComplete: true, jsFunctions: "function init() {}", jsExpressions: ["init();"] };
const { rerender } = renderRenderer({ ...base, css: "p{color:red}" });
await flushImport(); await resolveSandboxReady();
resetMockPromise();
rerender(rendererElement({ ...base, css: "p{color:blue}" }));
await flushImport(); await resolveSandboxReady();
expect(mockCreate).toHaveBeenCalledTimes(2);
expect(mockRun.mock.calls.filter((call) => call[0] === "init();")).toHaveLength(2);
});

});
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ const OpenGenUIActivityRendererInner = React.memo(
} else {
pendingQueueRef.current.push(content.jsFunctions);
}
}, [content.jsFunctions]);
}, [content.jsFunctions, fullHtml, css, localApi]);

// Effect 3 — jsExpressions execution (arrival order, sequential await)
useEffect(() => {
Expand All @@ -358,7 +358,7 @@ const OpenGenUIActivityRendererInner = React.memo(
} else {
pendingQueueRef.current.push(...newExprs);
}
}, [content.jsExpressions?.length]); // eslint-disable-line react-hooks/exhaustive-deps
}, [content.jsExpressions?.length, fullHtml, css, localApi]); // eslint-disable-line react-hooks/exhaustive-deps

// Effect 4 — destroy any remaining sandbox on unmount
useEffect(() => {
Expand Down