mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-06-02 20:49:48 +08:00
🐛 fix(windows): 修复在线更新挂起与 WebView2 启动闪退
- 隐藏并释放 Windows 更新脚本进程,避免在线更新打开 cmd 并挂起 - 为更新脚本等待宿主进程退出增加超时保护 - 收窄自动 WebView2 zoom reset 触发条件并补充异常兜底 - 补充 Windows 更新启动与窗口缩放回归测试 Refs #468
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user