收紧桌面壳事件注册失败处理

桌面壳新窗口策略增加可测试决策函数

桌面壳 WebView 事件注册失败改为启动阻断或日志记录

桌面壳配置门禁禁止事件注册静默吞错

宿主壳协议和共享决策记录补充事件注册失败规则
This commit is contained in:
2026-06-20 05:27:02 +08:00
parent 6c0d929e91
commit 73ea93ccc8
6 changed files with 122 additions and 14 deletions
@@ -2213,6 +2213,7 @@ const requiredRustHostSnippets = [
'should_replay_desktop_webview_state_on_page_load',
'PageLoadEvent::Finished',
'replay_desktop_webview_state',
'log_desktop_webview_state_replay_result',
'window.is_focused()',
'window.is_visible()',
'window.is_minimized()',
@@ -2242,6 +2243,8 @@ const requiredRustHostSnippets = [
'desktop_external_navigation_url',
'open_normalized_desktop_external_url',
'open_desktop_external_navigation',
'desktop_new_window_external_url',
'desktop_new_window_response',
'.on_navigation(move |url|',
'.on_new_window(move |url, _features|',
'.on_page_load(|window, payload|',
@@ -2673,6 +2676,11 @@ for (const appSetupSnippet of [
'crate::host_bridge::host_bridge_request',
'desktop_main_window_config(app)?',
'WebviewWindowBuilder::from_config',
'desktop_new_window_external_url(&url)',
'desktop_new_window_response',
'register_desktop_network_events(&window)?',
'register_desktop_navigation_events(&window)?',
'log_desktop_webview_state_replay_result(',
]) {
if (!app.includes(appSetupSnippet)) {
throw new Error(`desktop shell app.rs missing setup snippet ${appSetupSnippet}`);
@@ -2683,6 +2691,9 @@ for (const blockedAppSetupSnippet of [
'app.config().app.windows.get(0)',
'app.config().app.windows[0]',
'if let Some(config) = window_config',
'let _ = register_desktop_network_events(&window)',
'let _ = register_desktop_navigation_events(&window)',
'let _ = emit_current_desktop_lifecycle_event(&window)',
]) {
if (app.includes(blockedAppSetupSnippet)) {
throw new Error(
@@ -2691,6 +2702,18 @@ for (const blockedAppSetupSnippet of [
}
}
for (const blockedLifecycleSnippet of [
'let _ = register_desktop_network_events(window)',
'let _ = register_desktop_navigation_events(window)',
'let _ = emit_current_desktop_lifecycle_event(window)',
]) {
if (rustHostSource.includes(blockedLifecycleSnippet)) {
throw new Error(
`desktop shell WebView state replay failures must be logged or propagated, not ${blockedLifecycleSnippet}`,
);
}
}
for (const snippet of requiredRustHostSnippets) {
if (!rustHostSource.includes(snippet)) {
throw new Error(`desktop shell Rust host bridge missing ${snippet}`);