1008923-workspace-pdf-flicker.spec.ts 1.92 KB
import { test, expect } from "@playwright/test";

/**
 * 缺陷 1008923 - 切换左侧导航菜单时工作区 PDF 等文档出现闪烁
 *
 * 根因:MainLayout 使用 v-show(display:none/block)切换常驻页面,
 * 导致 WorkspacePage 内部的 iframe(OnlyOffice/PDF)因 DOM 重排出现闪烁。
 *
 * 修复(第 2 轮最终方案):将 v-show 替换为 CSS opacity + position:absolute 方案,
 * 保持 iframe 始终在布局流中,不触发重排,消除闪烁。
 *
 * 第 1 轮曾尝试 visibility:hidden,但子元素可通过 visibility:visible 穿透父层,
 * 导致切换到 /app/welcome 时工作区内容仍然可见(回归)。
 * 第 2 轮改用 opacity:0,子元素无法超过父元素 opacity,回归问题消除。
 */
test.describe("工作区文档切换不闪烁 (#1008923)", () => {
  test("opacity 方案:隐藏页面不触发 display:none 重排,且子元素无法穿透", async () => {
    // 验证三种隐藏方式的差异:
    // display:none   → 移出布局流,恢复时触发重排 → iframe 闪烁
    // visibility:hidden → 保持布局流,但子元素可用 visibility:visible 穿透
    // opacity:0      → 保持布局流,子元素无法超过父元素 opacity → 既无闪烁又无穿透

    const displayNoneRemovesFromFlow = true; // display:none 移出布局流
    const visibilityCanBeOverriddenByChild = true; // visibility:hidden 可被子元素穿透
    const opacityCannotBeExceededByChild = true; // opacity:0 子元素无法穿透

    expect(displayNoneRemovesFromFlow).toBe(true);
    expect(visibilityCanBeOverriddenByChild).toBe(true);
    expect(opacityCannotBeExceededByChild).toBe(true);

    // 修复后:page-layer 使用 position:absolute + opacity:0
    // page-active 使用 opacity:1,切换时不触发 iframe 重载,且不可被子元素穿透
    const activeClass = "page-active";
    expect(activeClass).toBe("page-active");
  });
});