This commit is contained in:
2026-10-17 20:57:16 +07:00
parent 40456eebf1
commit 1d4028b183
13 changed files with 849 additions and 48 deletions
+37 -2
View File
@@ -1,5 +1,5 @@
const assert = require('node:assert/strict')
const { app, BrowserWindow, screen, nativeImage } = require('electron')
const { app, BrowserWindow, screen, nativeImage, powerSaveBlocker } = require('electron')
const { join, resolve } = require('node:path')
const { mkdtempSync, readFileSync, writeFileSync } = require('node:fs')
const root = resolve(__dirname, '..')
@@ -11,8 +11,26 @@ let targetDisplay
let isSyntheticDisplay = false
const boundsBeforeFullscreen = new Map()
const fullscreenEntered = new Set()
const powerBlocks = { active: new Set(), starts: 0, stops: 0 }
const startBlocker = powerSaveBlocker.start.bind(powerSaveBlocker)
const stopBlocker = powerSaveBlocker.stop.bind(powerSaveBlocker)
powerSaveBlocker.start = (type) => {
assert.equal(type, 'prevent-display-sleep')
const id = startBlocker(type)
powerBlocks.active.add(id)
powerBlocks.starts++
return id
}
powerSaveBlocker.stop = (id) => {
assert.ok(powerBlocks.active.delete(id), 'blocker released exactly once')
powerBlocks.stops++
return stopBlocker(id)
}
const captures = []
app.on('browser-window-created', (_event, window) => {
window.webContents.on('render-process-gone', (_event, details) =>
console.log('SMOKE_RENDERER_GONE', window.id, details.reason),
)
const capturePage = window.webContents.capturePage.bind(window.webContents)
window.webContents.capturePage = (...args) => {
captures.push({ id: window.id, time: performance.now() })
@@ -28,6 +46,13 @@ app.on('browser-window-created', (_event, window) => {
const setFullScreen = window.setFullScreen.bind(window)
window.setFullScreen = (flag) => {
if (flag) boundsBeforeFullscreen.set(window.id, requestedBounds)
// WM не знает синтетический монитор: native fullscreen проверяем только на реальном.
if (isSyntheticDisplay) {
queueMicrotask(() => {
if (!window.isDestroyed()) window.emit(flag ? 'enter-full-screen' : 'leave-full-screen')
})
return
}
return setFullScreen(flag)
}
})
@@ -562,6 +587,16 @@ app.whenReady().then(async () => {
displayId: targetDisplay.id,
root,
})
await require('./venue-smoke.cjs')({
control,
evaluate,
state,
command,
poll,
targetDisplay,
offlinePackage,
powerBlocks,
})
console.log(
'SCREEN_SMOKE_PASS',
JSON.stringify({
@@ -587,7 +622,7 @@ app.whenReady().then(async () => {
'SMOKE_DIAGNOSTIC',
window.webContents.getURL(),
await window.webContents.executeJavaScript(
"(async () => ({ state: await window.screenBridge.state(), media: Array.from(document.querySelectorAll('audio,video')).map(m => ({channel:m.dataset.channel,src:m.src,paused:m.paused,ready:m.readyState,time:m.currentTime,duration:m.duration,error:m.error?.message})) }))()",
"(async () => ({ state: await window.screenBridge.state(), host: await window.screenBridge.host().catch(() => null), media: Array.from(document.querySelectorAll('audio,video')).map(m => ({channel:m.dataset.channel,src:m.src,paused:m.paused,ready:m.readyState,time:m.currentTime,duration:m.duration,error:m.error?.message})) }))()",
),
)
} catch {}