mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-07-02 13:17:48 +00:00
## Summary The scene widget's serializeValue uploaded a fresh temp image on every queue, so the `image / mask / normal` filenames in the prompt JSON were new each run. The backend cache key (which hashes those input strings) never matched, forcing Load3D and every downstream node to re-execute even when the user changed nothing. Track a session-scoped dirty flag and last-output cache in module-level WeakMaps keyed by LGraphNode. serializeValue returns the cached output when nothing has changed; user actions that mutate the visible scene (scene/model/camera/light config, animation, recording, gizmo, camera orbit) mark dirty through useLoad3d watchers and event handlers. The model_file / width / height widget callbacks invalidate via a new optional onSceneInvalidated hook plumbed through Load3DConfiguration, so the captured screenshot stays consistent with the inputs the backend sees. ## Screenshots (if applicable) Before https://github.com/user-attachments/assets/5ee5f79f-dd38-401e-babe-4d6ea156e56d After https://github.com/user-attachments/assets/5e00beb4-937c-4c66-abb2-e455f5301de6
64 lines
1.7 KiB
TypeScript
64 lines
1.7 KiB
TypeScript
import { expect } from '@playwright/test'
|
|
|
|
import { ExecutionHelper } from '@e2e/fixtures/helpers/ExecutionHelper'
|
|
import { load3dTest as test } from '@e2e/fixtures/helpers/Load3DFixtures'
|
|
|
|
type Load3dImageInput = {
|
|
image: string
|
|
mask: string
|
|
normal: string
|
|
recording: string
|
|
}
|
|
|
|
type PromptBody = {
|
|
prompt?: Record<
|
|
string,
|
|
{ class_type?: string; inputs?: Record<string, unknown> }
|
|
>
|
|
}
|
|
|
|
function getLoad3dImageInput(body: unknown, nodeId: string): Load3dImageInput {
|
|
const prompt = (body as PromptBody).prompt ?? {}
|
|
const node = prompt[nodeId]
|
|
expect(node?.class_type, `node ${nodeId} should be Load3D`).toBe('Load3D')
|
|
const input = node!.inputs!.image as Load3dImageInput
|
|
expect(typeof input.image).toBe('string')
|
|
expect(typeof input.recording).toBe('string')
|
|
return input
|
|
}
|
|
|
|
test.describe('Load3D serialize cache', () => {
|
|
test('starting a recording forces the next queue to re-capture (FE-905)', async ({
|
|
comfyPage,
|
|
load3d
|
|
}) => {
|
|
const exec = new ExecutionHelper(comfyPage)
|
|
|
|
let firstBody: unknown
|
|
await exec.run({
|
|
onPromptRequest: (body) => {
|
|
firstBody = body
|
|
}
|
|
})
|
|
const firstInput = getLoad3dImageInput(firstBody, '1')
|
|
expect(firstInput.recording).toBe('')
|
|
|
|
await load3d.recordingButton.click()
|
|
await expect(load3d.stopRecordingButton).toBeVisible()
|
|
|
|
let secondBody: unknown
|
|
await exec.run({
|
|
onPromptRequest: (body) => {
|
|
secondBody = body
|
|
}
|
|
})
|
|
const secondInput = getLoad3dImageInput(secondBody, '1')
|
|
|
|
expect(
|
|
secondInput.image,
|
|
'after starting a recording, the next queue must re-capture ' +
|
|
'(image filename must change) so the recording is not dropped'
|
|
).not.toBe(firstInput.image)
|
|
})
|
|
})
|