task(C4): use_pixi_renderer flag on by default with e2e proof

This commit is contained in:
Agent Zero
2026-08-27 12:58:36 +02:00
parent 738e4e8373
commit eb8d6231c5
4 changed files with 51 additions and 4 deletions
@@ -88,6 +88,24 @@ test('Phase-A: V2-Pfad end-to-end (Ribbon-Sektion, Toolwechsel, Zeichnen+Undo cr
await page.keyboard.press('Control+y');
await page.waitForTimeout(300);
// ── 4b) Task C4: PixiRenderer hat die Elemente im Cache ──
const pixiInfo = await page.evaluate(() => {
const debug = (window as unknown as { __v2Debug?: { info(): { cachedElements: number; ready: boolean } | null } }).__v2Debug;
return debug?.info() ?? null;
});
expect(pixiInfo).not.toBeNull();
expect(pixiInfo!.ready).toBe(true);
expect(pixiInfo!.cachedElements).toBeGreaterThanOrEqual(1);
// Nach Undo muss der Cache leer sein (Referenzdiff synchronisiert)
await page.keyboard.press('Control+z');
await page.waitForTimeout(300);
const pixiInfoAfterUndo = await page.evaluate(() => {
const debug = (window as unknown as { __v2Debug?: { info(): { cachedElements: number; ready: boolean } | null } }).__v2Debug;
return debug?.info() ?? null;
});
expect(pixiInfoAfterUndo!.cachedElements).toBe(0);
// Kein Seitenfehler durch den gesamten V2-Ablauf:
expect(pageErrors).toEqual([]);
// Konsolenfehler nur tolerieren, wenn sie nichts mit dem V2-Pfad zu tun haben:
+10 -4
View File
@@ -17,7 +17,7 @@ import { logger } from '../utils/logger';
import { CADDocument } from '../kernel/document/CADDocument';
import { YjsDocument } from '../crdt/YjsDocument';
import { setActiveDocument, getActiveDocument } from '../kernel/document/documentService';
import { V2_TOOLS_ENABLED } from '../kernel/featureFlags';
import { V2_TOOLS_ENABLED, USE_PIXI_RENDERER } from '../kernel/featureFlags';
import { PixiRenderer } from '../render/pixi/PixiRenderer';
import { pluginRegistry } from '../plugins';
@@ -71,18 +71,24 @@ const CanvasArea: React.FC<CanvasAreaProps> = ({
// App-Level-Zugriffspunkt für HistoryPanel/Tastenkürzel (Task A4.11):
setActiveDocument(v2Doc);
// ── Task C2: PixiJS-Renderer parallel schalten ──
// ── Task C2/C4: PixiJS-Renderer parallel schalten ──
// DEFENSIV: Ein Ausfall von Pixi (z.B. WebGL im Headless-Browser)
// darf NIEMALS den kompletten Editor-Mount brechen. Im Fehlerfall
// läuft weiter ohne Overlay.
let pixi: PixiRenderer | null = null;
const pixiCanvas = pixiCanvasRef.current;
if (pixiCanvas) {
if (pixiCanvas && USE_PIXI_RENDERER) {
try {
pixi = new PixiRenderer();
pixiRendererRef.current = pixi;
pixi.init(pixiCanvas);
pixi.waitForReady().catch((err) => {
pixi.waitForReady().then(() => {
// Task C4: Debug-Hook für Playwright-E2E-Assertions
(window as unknown as { __v2Debug: unknown }).__v2Debug = {
renderer: pixi,
info: () => pixiRendererRef.current?.getDebugInfo() ?? null,
};
}).catch((err) => {
logger.warn('Pixi init failed — V2-Overlay deaktiviert:', err);
pixi = null;
pixiRendererRef.current = null;
+8
View File
@@ -13,3 +13,11 @@
/** Ist der V2-Werkzeugpfad (Dispatcher/CADDocument) aktiv? Default: ja. */
export const V2_TOOLS_ENABLED: boolean =
import.meta.env.VITE_TOOL_DISPATCHER !== 'legacy';
/**
* Task C4: Pixi als Primär-Renderer für V2-Elemente (Overlay über Legacy).
* Default: ja (durch phase-a-verify E2E abgesichert).
* Opt-out: VITE_USE_PIXI=false.
*/
export const USE_PIXI_RENDERER: boolean =
import.meta.env.VITE_USE_PIXI !== 'false';
+15
View File
@@ -48,6 +48,9 @@ export class PixiRenderer implements RenderAdapter {
await this.ready;
}
/** Task C4: true sobald setupApp fertig ist (via readyResolve gesetzt). */
private initialized = false;
// ── Lifecycle ────────────────────────────────────────────
init(canvas: HTMLCanvasElement): void {
@@ -89,6 +92,7 @@ export class PixiRenderer implements RenderAdapter {
this.overlayLayer = overlay;
this.app.stage.addChild(overlay);
this.applyViewportTransform();
this.initialized = true; // Task C4: fuer getDebugInfo
});
}
@@ -252,6 +256,17 @@ export class PixiRenderer implements RenderAdapter {
return null;
}
/**
* Task C4: Debug-Info für Playwright-E2E-Assertions.
* Ermöglicht Testabfragen wie 'wie viele Elemente sind gerendert?'
*/
getDebugInfo(): { cachedElements: number; ready: boolean } {
return {
cachedElements: this.graphicsCache.size,
ready: this.initialized,
};
}
// ── Internes ─────────────────────────────────────────────
private applyViewportTransform(): void {