From 9f0f782bbb30f5002b560e051ebb1eb0b64d7d94 Mon Sep 17 00:00:00 2001 From: Lotus CI Date: Tue, 29 Sep 2026 13:19:21 -0400 Subject: [PATCH] windows smoke: opt-in WebView2 DevTools port via LOTUS_WEBVIEW2_DEBUG_PORT (#19) WebView2's WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS is ignored because the app sets its browser arguments explicitly (seen on the runner: the WebView2 command line had only the app's arguments). The app now appends --remote-debugging-port only when LOTUS_WEBVIEW2_DEBUG_PORT holds a valid port (>= 1024); otherwise the arguments are exactly as before. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA --- .gitea/workflows/windows-smoke.yml | 4 ++- src-tauri/src/lib.rs | 44 ++++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/.gitea/workflows/windows-smoke.yml b/.gitea/workflows/windows-smoke.yml index 5c145ee..ccd0d5f 100644 --- a/.gitea/workflows/windows-smoke.yml +++ b/.gitea/workflows/windows-smoke.yml @@ -95,7 +95,9 @@ jobs: Copy-Item scripts\windows-smoke.mjs smoke-deps\windows-smoke.mjs # Same step as the test: a process started in an earlier step may be # cleaned up when that step ends. - $env:WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS = '--remote-debugging-port=9222 --use-fake-device-for-media-stream' + # The app sets its own WebView2 arguments, so WebView2's env var doesn't + # apply; the app opens the DevTools port itself when asked (#19). + $env:LOTUS_WEBVIEW2_DEBUG_PORT = '9222' $app = Join-Path $env:LOCALAPPDATA 'Lotus Chat\cinny.exe' Start-Process $app Start-Sleep -Seconds 15 diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 8cad3b2..87944b3 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1128,9 +1128,9 @@ pub fn run() { // Tauri's default WebView2 args (setting this overrides them) and // appends the Chromium background-throttling disables. Windows-only // in effect; harmless elsewhere. Does not block system sleep. - .additional_browser_args( - "--disable-features=msWebOOUI,msPdfOOUI --disable-background-timer-throttling --disable-renderer-backgrounding --disable-backgrounding-occluded-windows", - ) + .additional_browser_args(&webview2_browser_args( + std::env::var("LOTUS_WEBVIEW2_DEBUG_PORT").ok().as_deref(), + )) .on_page_load(move |window, payload| { if matches!(payload.event(), PageLoadEvent::Finished) { // Reveal only on the FIRST settle: later page loads (e.g. a @@ -1289,6 +1289,44 @@ pub fn run() { .expect("error while building tauri application"); } +/// WebView2 browser arguments. Setting them replaces Tauri's defaults, so +/// they're kept, plus the Chromium background-throttling disables (P5-42). +/// +/// cinny-desktop #19: `LOTUS_WEBVIEW2_DEBUG_PORT=` in the environment +/// opens WebView2's DevTools port on localhost so the Windows smoke test can +/// drive the installed app. WebView2's own `WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS` +/// doesn't apply because the app sets its arguments explicitly. Off unless the +/// variable holds a valid port; only whoever launches the app can set it. +pub(crate) fn webview2_browser_args(debug_port: Option<&str>) -> String { + let mut args = String::from( + "--disable-features=msWebOOUI,msPdfOOUI --disable-background-timer-throttling --disable-renderer-backgrounding --disable-backgrounding-occluded-windows", + ); + if let Some(port) = debug_port + .and_then(|p| p.trim().parse::().ok()) + .filter(|p| *p >= 1024) + { + eprintln!("webview: DevTools port {port} open (LOTUS_WEBVIEW2_DEBUG_PORT)"); + args.push_str(&format!(" --remote-debugging-port={port}")); + } + args +} + +#[cfg(test)] +mod webview2_args_tests { + use super::webview2_browser_args; + + #[test] + fn debug_port_only_when_asked_for_and_valid() { + let base = webview2_browser_args(None); + assert!(base.contains("--disable-renderer-backgrounding")); + assert!(!base.contains("remote-debugging")); + assert!(webview2_browser_args(Some("9222")).ends_with(" --remote-debugging-port=9222")); + for bad in ["", "abc", "80", "70000", "9222 --evil", "-1"] { + assert_eq!(webview2_browser_args(Some(bad)), base, "{bad}"); + } + } +} + #[cfg(test)] mod tray_tests { use super::*;