From 31363e601c43b0652324ac78bfcc9459a0105818 Mon Sep 17 00:00:00 2001 From: Lotus CI Date: Thu, 22 Oct 2026 21:21:47 -0400 Subject: [PATCH 1/2] ci(windows-smoke): tray, badge, taskbar, thumbbar and media-control commands (#4, #7) Call each with what cinny sends (badge, unread, call state, thumbbar, SMTC, taskbar progress, jump list, update-ready, flash), then reset; every call must succeed and the app must still respond. Refs #4, #7, #19 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5 --- scripts/windows-smoke.mjs | 54 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/scripts/windows-smoke.mjs b/scripts/windows-smoke.mjs index c071157..2b66987 100644 --- a/scripts/windows-smoke.mjs +++ b/scripts/windows-smoke.mjs @@ -312,6 +312,60 @@ try { record('global hotkeys reach the page', /not found/i.test(msg) ? 'n/a' : 'fail', msg); } +// 10. Tray / badge / taskbar / thumbbar / media-controls commands (#4, #7): +// the state they set is only visible to a person on a desktop, but each must +// accept what cinny sends and leave the app working. Then reset everything. +const calls = [ + ['set_badge_count', { count: 3 }], + ['set_tray_unread', { unread: true }], + ['set_call_active', { active: true }], + ['set_tray_call_state', { active: true, muted: true, deafened: false }], + ['set_thumbbar', { active: true, muted: true, deafened: false }], + ['set_thumbbar', { active: true, muted: false, deafened: true }], + ['set_smtc_call_state', { active: true, muted: true }], + ['set_taskbar_progress', { status: 'normal', progress: 40 }], + ['set_taskbar_progress', { status: 'indeterminate', progress: null }], + ['set_jump_list', { items: [{ title: 'Smoke room', uri: 'matrix:r/lotus-smoke:example.org' }] }], + ['set_tray_update_ready', { version: '9.9.9' }], + ['flash_window', {}], + ['get_tray_dnd', {}], + ['has_tray_host', {}], + // reset + ['set_badge_count', { count: 0 }], + ['set_tray_unread', { unread: false }], + ['set_tray_call_state', { active: false, muted: false, deafened: false }], + ['set_thumbbar', { active: false, muted: false, deafened: false }], + ['set_smtc_call_state', { active: false, muted: false }], + ['set_call_active', { active: false }], + ['set_taskbar_progress', { status: 'none', progress: null }], + ['set_jump_list', { items: [] }], + ['set_tray_update_ready', { version: null }], +]; +const failures = []; +for (const [cmd, args] of calls) { + // eslint-disable-next-line no-await-in-loop + const err = await page + .evaluate( + async ([c, a]) => { + try { + await window.__TAURI_INTERNALS__.invoke(c, a); + return null; + } catch (e) { + return String(e).slice(0, 120); + } + }, + [cmd, args], + ) + .catch((e) => `page gone: ${String(e).slice(0, 80)}`); + if (err) failures.push(`${cmd}(${JSON.stringify(args)}): ${err}`); +} +const alive = await page.evaluate(() => document.title !== undefined).catch(() => false); +record( + 'tray, badge, taskbar, thumbbar and media-control commands', + failures.length === 0 && alive ? 'pass' : 'fail', + failures.length ? failures.join(' | ') : `${calls.length} calls ok, app still responsive: ${alive}`, +); + await page.screenshot({ path: `${OUT}/02-end.png` }).catch(() => undefined); writeFileSync(`${OUT}/results.json`, JSON.stringify(results, null, 2)); From fbb24dfce7db98aef583c19df27e7ea46102f379 Mon Sep 17 00:00:00 2001 From: Lotus CI Date: Thu, 22 Oct 2026 21:56:26 -0400 Subject: [PATCH 2/2] ci(windows-smoke): shell-only commands are n/a without a desktop Without Explorer the tray icon, taskbar overlay badge and thumbnail toolbar can't exist (E_FAIL / E_NOTIMPL). On a runner without an interactive desktop only those calls may fail, and the app must still respond. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5 --- scripts/windows-smoke.mjs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/scripts/windows-smoke.mjs b/scripts/windows-smoke.mjs index 2b66987..c4aa55c 100644 --- a/scripts/windows-smoke.mjs +++ b/scripts/windows-smoke.mjs @@ -360,10 +360,19 @@ for (const [cmd, args] of calls) { if (err) failures.push(`${cmd}(${JSON.stringify(args)}): ${err}`); } const alive = await page.evaluate(() => document.title !== undefined).catch(() => false); +// Without a desktop there is no Explorer shell: the tray icon, the taskbar +// overlay badge and the thumbnail toolbar can't exist, and Windows answers +// E_FAIL / E_NOTIMPL. cinny ignores those errors; the app must just survive. +const SHELL_ONLY = /^(set_badge_count|set_tray_unread|set_tray_call_state|set_tray_update_ready|set_thumbbar)\(/; +const real = interactive ? failures : failures.filter((f) => !SHELL_ONLY.test(f)); record( 'tray, badge, taskbar, thumbbar and media-control commands', - failures.length === 0 && alive ? 'pass' : 'fail', - failures.length ? failures.join(' | ') : `${calls.length} calls ok, app still responsive: ${alive}`, + real.length === 0 && alive ? 'pass' : 'fail', + real.length + ? real.join(' | ') + : `${calls.length - failures.length}/${calls.length} calls ok${ + failures.length ? `, ${failures.length} shell-only calls n/a without a desktop` : '' + }; app still responsive: ${alive}`, ); await page.screenshot({ path: `${OUT}/02-end.png` }).catch(() => undefined);