mirror of
https://github.com/NanmiCoder/cc-haha
synced 2026-07-16 13:03:31 +08:00
Electron was showing the main BrowserWindow before renderer load completed, so macOS could paint a blank window surface behind the menu bar. Persisted y=0 window state could also restore the titlebar under the menu-bar work area on external displays. Delay the initial show until the renderer entry is loaded, clamp restored macOS bounds into the display workArea, skip the macOS status-bar tray, and unhide the app before focusing restored windows. Constraint: macOS external displays expose menu-bar and status-item chrome differently from Windows and Linux. Rejected: Remove the native application menu | it would break expected macOS menu behavior without fixing the pre-load window surface. Confidence: high Scope-risk: narrow Directive: Do not reintroduce pre-load main-window show without validating macOS external-display menu-bar rendering. Tested: cd desktop && bun test electron/services/windows.test.ts electron/services/tray.test.ts electron/services/singleInstance.test.ts electron/services/menu.test.ts Tested: bun run check:desktop Tested: bun run check:native Tested: git diff --check Not-tested: Live dual-external-monitor screenshot smoke.
59 lines
1.9 KiB
TypeScript
59 lines
1.9 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest'
|
|
import { acquireSingleInstanceLock } from './singleInstance'
|
|
|
|
describe('Electron single-instance service', () => {
|
|
it('allows validation runs to bypass the single-instance lock explicitly', () => {
|
|
const app = {
|
|
requestSingleInstanceLock: vi.fn(() => false),
|
|
quit: vi.fn(),
|
|
on: vi.fn(),
|
|
}
|
|
|
|
expect(acquireSingleInstanceLock(app as never, () => null, {
|
|
CC_HAHA_ELECTRON_DISABLE_SINGLE_INSTANCE_LOCK: '1',
|
|
})).toBe(true)
|
|
expect(app.requestSingleInstanceLock).not.toHaveBeenCalled()
|
|
expect(app.quit).not.toHaveBeenCalled()
|
|
expect(app.on).not.toHaveBeenCalled()
|
|
})
|
|
|
|
it('quits duplicate launches when the lock cannot be acquired', () => {
|
|
const app = {
|
|
requestSingleInstanceLock: vi.fn(() => false),
|
|
quit: vi.fn(),
|
|
on: vi.fn(),
|
|
}
|
|
|
|
expect(acquireSingleInstanceLock(app as never, () => null)).toBe(false)
|
|
expect(app.quit).toHaveBeenCalledTimes(1)
|
|
expect(app.on).not.toHaveBeenCalled()
|
|
})
|
|
|
|
it('registers a second-instance focus handler after acquiring the lock', () => {
|
|
let secondInstanceHandler: (() => void) | undefined
|
|
const window = {
|
|
isVisible: () => false,
|
|
isMinimized: () => false,
|
|
show: vi.fn(),
|
|
restore: vi.fn(),
|
|
focus: vi.fn(),
|
|
}
|
|
const app = {
|
|
requestSingleInstanceLock: vi.fn(() => true),
|
|
quit: vi.fn(),
|
|
show: vi.fn(),
|
|
on: vi.fn((_event: string, handler: () => void) => {
|
|
secondInstanceHandler = handler
|
|
}),
|
|
}
|
|
|
|
expect(acquireSingleInstanceLock(app as never, () => window as never)).toBe(true)
|
|
expect(app.on).toHaveBeenCalledWith('second-instance', expect.any(Function))
|
|
|
|
secondInstanceHandler?.()
|
|
expect(app.show).toHaveBeenCalledTimes(1)
|
|
expect(window.show).toHaveBeenCalledTimes(1)
|
|
expect(window.focus).toHaveBeenCalledTimes(1)
|
|
})
|
|
})
|