Files
apes-sidebar/tests/desktop-env.spec.ts
Atlas Zeng 50a888845f feat(sidebar): 桌面兼容三方案——自动检测(WCO 标准几何)/壳预设/自定义 CSS (#284)
* feat(sidebar): 桌面兼容三方案——自动检测(WCO 标准几何)/壳预设/自定义 CSS

核心只保留 Web 标准机制,壳专属适配全部下沉到用户空间(KISS):
- prefs 新增 titleBarScheme(默认 auto)/titleBarPresetId/customCss,旧 titleBarCompat
  布尔自动迁移(true→custom 保留 stripPx,false/缺失→auto)
- wco.ts:navigator.windowControlsOverlay 反应式几何(geometrychange 实时更新;
  visible=false 的幽灵 API 视为缺失),实现 #257
- titlebar-strip.ts 唯一 strip 取值链:WCO → dsh-desktop-titlebar-inset 契约参数
  → 预设 stripFor → 手动 px → 0;desktop-env.ts 移除 win32 32px 硬编码
- shell-presets.ts 数据驱动预设(准入:issue/PR 提及 + 100+ star;v1 仅
  anywhere-labs DSH Desktop:darwin 20px / win32 无 WCO 时 32px),opt-in 手动
- 预设/自定义 CSS 注入(data-dsh-preset-css / data-dsh-custom-css 标签),
  chrome 补稳定寻址面 data-dsh-toggle-cluster / data-dsh-panel
- 交互 chrome 统一 -webkit-app-region: no-drag(吸收 #111/#153)
- layout.css 底栏推挤复合锚点([data-pane] 与 :has(> [data-slot]) 双保险,
  rc.8 实测前者失效、后者命中,吸收 #226 思路)
- 设置 UI:位置兼容模式齿轮弹窗改三方案(自动检测/壳兼容方案/自定义方案)
- 测试:wco/titlebar-strip/shell-presets 单测 + prefs 迁移 + e2e 5 场景
  (保守 auto/WCO 反应式/预设/自定义 CSS/复合锚点),挂载门禁 12/12 全绿

核心 grep 无壳专属类名;为某壳做的兼容在另一壳会再坏——预设与自定义 CSS
是唯一出路(AGENTS.md §8 契约已更新)。

* refine(sidebar): 位置兼容模式改主行下拉四选项——自动检测/DSH官方Web/壳预设/自定义

按用户反馈定稿 UI:
- 主行下拉:自动检测(默认)/ DSH官方Web(显式零适配,连 WCO 也强制 0)/
  各壳预设(命中环境带「已检测」后缀,仅提示)/ 自定义方案(保留齿轮弹窗:
  下移距离 + 自定义 CSS)
- 旧文档迁移:titleBarCompat=true 或 titleBarStripPx 非默认值(此前已有配置)
  → 默认落到 custom 方案保留用户数值;干净文档 → auto
- prefs 新增 'web' 方案;strip 取值链最优先处理 web→0
- 测试:prefs 迁移(stripPx 48→custom / 40→auto)、web 强制 0、下拉渲染断言
- 单测 693 通过,挂载 e2e 12/12 全绿

* refine(sidebar): 方案下拉复用 SelectMenu 组件,不用原生 <select>

- 抽出可复用 SelectMenu(primitives Menu:锚点按钮 + 下拉选项卡,支持
  icon/desc/多选),SelectRow 改为其薄壳
- 位置兼容模式方案下拉改用 SelectMenu;选项带描述(自动检测/DSH官方Web/
  各壳预设(命中带「已检测」后缀)/自定义方案)
- 移除原生 select 样式;单测 693 通过,挂载 e2e 12/12 全绿
2026-08-21 01:28:17 +08:00

90 lines
3.6 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Desktop-shell detection tests: URL stamps (dsh-desktop-mode/platform)
* from the official Electron shell, the preload marker
* (__DSH_DESKTOP_FILE_PATH__), and the `dsh-desktop-titlebar-inset`
* contract parameter. Geometry ADAPTATION is deliberately NOT here — the
* strip resolution chain lives in titlebar-strip.ts (standard WCO first,
* see wco.spec.ts), keeping this module a pure environment reporter.
*/
import { beforeEach, describe, expect, it } from 'vitest'
import './browser-globals.ts'
import { parseDesktopEnv, resetDesktopEnvForTests } from '../src/client/desktop-env.ts'
function setSearch(search: string): void {
;(window.location as { search: string }).search = search
}
beforeEach(() => {
resetDesktopEnvForTests()
delete (window as unknown as Record<string, unknown>).__DSH_DESKTOP_FILE_PATH__
setSearch('/')
})
describe('parseDesktopEnv', () => {
it('reports a plain browser page as non-desktop with no inset', () => {
expect(parseDesktopEnv()).toEqual({ desktop: false, mode: null, platform: null, titlebarInset: 0 })
})
it('parses win32 advanced stamps (no overlay guess — geometry comes from WCO/preset)', () => {
setSearch('?dsh-desktop-mode=advanced&dsh-desktop-platform=win32')
const env = parseDesktopEnv()
expect(env.desktop).toBe(true)
expect(env.mode).toBe('advanced')
expect(env.platform).toBe('win32')
expect(env.titlebarInset).toBe(0)
})
it('parses darwin advanced stamps', () => {
setSearch('?dsh-desktop-mode=advanced&dsh-desktop-platform=darwin')
const env = parseDesktopEnv()
expect(env.desktop).toBe(true)
expect(env.platform).toBe('darwin')
expect(env.titlebarInset).toBe(0)
})
it('parses compatibility mode as desktop with the native frame (no adaptation)', () => {
setSearch('?dsh-desktop-mode=compatibility&dsh-desktop-platform=win32')
const env = parseDesktopEnv()
expect(env.desktop).toBe(true)
expect(env.mode).toBe('compatibility')
expect(env.titlebarInset).toBe(0)
})
it('detects the desktop preload marker even without URL stamps', () => {
;(window as unknown as Record<string, unknown>).__DSH_DESKTOP_FILE_PATH__ = { getPathForFile: () => '' }
const env = parseDesktopEnv()
expect(env.desktop).toBe(true)
expect(env.mode).toBeNull()
expect(env.titlebarInset).toBe(0)
})
it('ignores unknown mode values (exotic shells keep plain-browser semantics)', () => {
setSearch('?dsh-desktop-mode=weird&dsh-desktop-platform=win32')
expect(parseDesktopEnv().mode).toBeNull()
expect(parseDesktopEnv().desktop).toBe(false)
})
it('reads the documented titlebar-inset contract parameter (clamped 0–120)', () => {
setSearch('?dsh-desktop-mode=advanced&dsh-desktop-platform=win32&dsh-desktop-titlebar-inset=36')
expect(parseDesktopEnv().titlebarInset).toBe(36)
setSearch('?dsh-desktop-mode=advanced&dsh-desktop-titlebar-inset=200')
resetDesktopEnvForTests()
expect(parseDesktopEnv().titlebarInset).toBe(120)
setSearch('?dsh-desktop-mode=advanced&dsh-desktop-titlebar-inset=-5')
resetDesktopEnvForTests()
expect(parseDesktopEnv().titlebarInset).toBe(0)
setSearch('?dsh-desktop-mode=advanced&dsh-desktop-titlebar-inset=abc')
resetDesktopEnvForTests()
expect(parseDesktopEnv().titlebarInset).toBe(0)
})
it('memoizes across calls until the test hook resets', () => {
setSearch('?dsh-desktop-mode=advanced&dsh-desktop-platform=win32')
const first = parseDesktopEnv()
setSearch('/')
expect(parseDesktopEnv()).toBe(first)
resetDesktopEnvForTests()
expect(parseDesktopEnv().desktop).toBe(false)
})
})