Fix overlay toggle regression TASK-7

This commit is contained in:
2026-02-21 23:47:34 -08:00
parent 44c7b05f96
commit 26c031aea8
8 changed files with 152 additions and 6 deletions

View File

@@ -0,0 +1,11 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import fs from 'node:fs';
import path from 'node:path';
test('overlay window config explicitly disables renderer sandbox for preload compatibility', () => {
const sourcePath = path.join(process.cwd(), 'src/core/services/overlay-window.ts');
const source = fs.readFileSync(sourcePath, 'utf8');
assert.match(source, /webPreferences:\s*\{[\s\S]*sandbox:\s*false[\s\S]*\}/m);
});

View File

@@ -75,6 +75,7 @@ export function createOverlayWindow(
preload: path.join(__dirname, '..', '..', 'preload.js'),
contextIsolation: true,
nodeIntegration: false,
sandbox: false,
webSecurity: true,
additionalArguments: [`--overlay-layer=${kind}`],
},

View File

@@ -2,6 +2,7 @@ import test from 'node:test';
import assert from 'node:assert/strict';
import { createRendererRecoveryController } from './error-recovery.js';
import { resolvePlatformInfo } from './utils/platform.js';
test('handleError logs context and recovers overlay state', () => {
const payloads: unknown[] = [];
@@ -120,3 +121,37 @@ test('nested recovery errors are ignored while current recovery is active', () =
assert.equal(payloads.length, 1);
assert.equal(restored, 1);
});
test('resolvePlatformInfo prefers query layer over preload layer', () => {
const previousWindow = (globalThis as { window?: unknown }).window;
const previousNavigator = (globalThis as { navigator?: unknown }).navigator;
Object.defineProperty(globalThis, 'window', {
configurable: true,
value: {
electronAPI: {
getOverlayLayer: () => 'invisible',
},
location: { search: '?layer=visible' },
},
});
Object.defineProperty(globalThis, 'navigator', {
configurable: true,
value: {
platform: 'MacIntel',
userAgent: 'Mozilla/5.0 (Macintosh)',
},
});
try {
const info = resolvePlatformInfo();
assert.equal(info.overlayLayer, 'visible');
assert.equal(info.isInvisibleLayer, false);
} finally {
Object.defineProperty(globalThis, 'window', { configurable: true, value: previousWindow });
Object.defineProperty(globalThis, 'navigator', {
configurable: true,
value: previousNavigator,
});
}
});

View File

@@ -13,15 +13,15 @@ export type PlatformInfo = {
export function resolvePlatformInfo(): PlatformInfo {
const overlayLayerFromPreload = window.electronAPI.getOverlayLayer();
const overlayLayerFromQuery =
new URLSearchParams(window.location.search).get('layer') === 'invisible'
? 'invisible'
: 'visible';
const queryLayer = new URLSearchParams(window.location.search).get('layer');
const overlayLayerFromQuery: OverlayLayer | null =
queryLayer === 'visible' || queryLayer === 'invisible' ? queryLayer : null;
const overlayLayer: OverlayLayer =
overlayLayerFromPreload === 'visible' || overlayLayerFromPreload === 'invisible'
overlayLayerFromQuery ??
(overlayLayerFromPreload === 'visible' || overlayLayerFromPreload === 'invisible'
? overlayLayerFromPreload
: overlayLayerFromQuery;
: 'visible');
const isInvisibleLayer = overlayLayer === 'invisible';
const isLinuxPlatform = navigator.platform.toLowerCase().includes('linux');