🐛 fix(windows): 修复在线更新挂起与 WebView2 启动闪退

- 隐藏并释放 Windows 更新脚本进程,避免在线更新打开 cmd 并挂起
- 为更新脚本等待宿主进程退出增加超时保护
- 收窄自动 WebView2 zoom reset 触发条件并补充异常兜底
- 补充 Windows 更新启动与窗口缩放回归测试
Refs #468
This commit is contained in:
Syngnat
2026-05-16 22:13:24 +08:00
parent 6c36bd0a08
commit 0cde96844d
11 changed files with 119 additions and 7 deletions

View File

@@ -72,7 +72,7 @@ import {
splitConflictsByContext,
type ConflictInfo,
} from './utils/shortcuts';
import { resolveTitleBarToggleIconKey, resolveWindowsScaleCheckDelayMs, shouldApplyWindowsScaleFix, shouldToggleMaximisedWindowForScaleFix, type WindowScaleFixReason, type WindowsScaleCheckTrigger } from './utils/windowStateUi';
import { resolveTitleBarToggleIconKey, resolveWindowsScaleCheckDelayMs, shouldApplyWindowsScaleFix, shouldResetWebViewZoomForScaleFix, shouldToggleMaximisedWindowForScaleFix, type WindowScaleFixReason, type WindowsScaleCheckTrigger } from './utils/windowStateUi';
import { resolveVisibleStartupWindowBounds } from './utils/windowRestoreBounds';
import {
SIDEBAR_UTILITY_ITEM_KEYS,
@@ -676,7 +676,7 @@ function App() {
// 让 WebView2 重算 D2D/DirectWrite 字体度量。完全不动窗口、零动画。
// backend 失败wails 升级破坏反射 / 非 Windows时回退到 dispatch resize 兜底;
// 用户仍可按 Ctrl+Shift+0 手动 toggle 修复。
if (hasViewportScaleDrift) {
if (shouldResetWebViewZoomForScaleFix(reason, hasViewportScaleDrift)) {
try {
const res = await (window as any).go?.app?.App?.ResetWebViewZoom?.();
if (!res?.success) {

View File

@@ -4,6 +4,7 @@ import {
resolveTitleBarToggleIconKey,
resolveWindowsScaleCheckDelayMs,
shouldApplyWindowsScaleFix,
shouldResetWebViewZoomForScaleFix,
shouldToggleMaximisedWindowForScaleFix,
} from './windowStateUi';
@@ -26,6 +27,13 @@ describe('windowStateUi', () => {
expect(shouldToggleMaximisedWindowForScaleFix('restore', true)).toBe(false);
});
it('only calls the backend WebView2 zoom reset after a real restore drift', () => {
expect(shouldResetWebViewZoomForScaleFix('restore', true)).toBe(true);
expect(shouldResetWebViewZoomForScaleFix('restore', false)).toBe(false);
expect(shouldResetWebViewZoomForScaleFix('activation', true)).toBe(false);
expect(shouldResetWebViewZoomForScaleFix('ratio-change', true)).toBe(false);
});
it('debounces resize-triggered Windows scale checks until window transitions settle', () => {
expect(resolveWindowsScaleCheckDelayMs('resize')).toBeGreaterThan(0);
expect(resolveWindowsScaleCheckDelayMs('focus')).toBe(0);

View File

@@ -20,6 +20,11 @@ export const shouldToggleMaximisedWindowForScaleFix = (
hasViewportScaleDrift: boolean,
): boolean => reason === 'ratio-change' && hasViewportScaleDrift;
export const shouldResetWebViewZoomForScaleFix = (
reason: WindowScaleFixReason,
hasViewportScaleDrift: boolean,
): boolean => reason === 'restore' && hasViewportScaleDrift;
export const resolveWindowsScaleCheckDelayMs = (trigger: WindowsScaleCheckTrigger): number =>
trigger === 'resize' ? 240 : 0;