From 0724473b01f1175b12d41785f7b714cfe1211043 Mon Sep 17 00:00:00 2001 From: CanadaHonk Date: Thu, 5 Jan 2023 20:32:27 +0000 Subject: [PATCH] idle: add close handler (also move API creation into inject) --- src/api/idle.js | 13 ++++++++++--- src/index.js | 5 ----- src/launcher/inject.js | 28 +++++++++++++++++++++------- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/api/idle.js b/src/api/idle.js index 16c2401..c794e87 100644 --- a/src/api/idle.js +++ b/src/api/idle.js @@ -2,9 +2,9 @@ import { exec } from 'child_process'; const killProcesses = async pids => process.platform !== 'win32' ? Promise.resolve('') : new Promise(resolve => exec(`taskkill /F ${pids.map(x => `/PID ${x}`).join(' ')}`, (e, out) => resolve(out))); -export default async (CDP, { browserType }) => { - if (browserType !== 'chromium') { // current implementation is for chromium-based only - const warning = () => log(`Warning: Idle API is currently only for Chromium (running on ${browserType})`); +export default async (CDP, { browserEngine, closeHandlers }) => { + if (browserEngine !== 'chromium') { // current implementation is for chromium-based only + const warning = () => log(`Warning: Idle API is currently only for Chromium (running on ${browserEngine})`); return { hibernate: warning, @@ -129,6 +129,7 @@ export default async (CDP, { browserType }) => { log('stopped auto idle'); }; + let lastScreenshot, takingScreenshot = false; const screenshotInterval = setInterval(async () => { if (takingScreenshot) return; @@ -140,6 +141,12 @@ export default async (CDP, { browserType }) => { getScreenshot().then(x => lastScreenshot = x); + closeHandlers.push(() => { + clearInterval(screenshotInterval); + stopAuto(); + }); + + log(`idle API active (window id: ${windowId})`); if (autoEnabled) startAuto(); diff --git a/src/index.js b/src/index.js index b9edb4e..480ba9a 100644 --- a/src/index.js +++ b/src/index.js @@ -10,8 +10,6 @@ import { fileURLToPath } from 'url'; import Chromium from './browser/chromium.js'; import Firefox from './browser/firefox.js'; -import IdleAPI from './api/idle.js'; -import ControlsAPI from './api/controls.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); @@ -174,9 +172,6 @@ const startBrowser = async (url, { windowSize, forceBrowser }) => { windowSize }); - Window.idle = await IdleAPI(Window.cdp, { browserType }); - Window.controls = await ControlsAPI(Window.cdp); - return Window; }; diff --git a/src/launcher/inject.js b/src/launcher/inject.js index 7e435e2..10a0f70 100644 --- a/src/launcher/inject.js +++ b/src/launcher/inject.js @@ -1,5 +1,8 @@ import IPCApi from '../lib/ipc.js'; +import IdleApi from '../api/idle.js'; +import ControlsApi from '../api/controls.js'; + export default async (CDP, proc, injectionType = 'browser', { browserName } = { browserName: 'unknown' }) => { let pageLoadCallback, pageLoadPromise = new Promise(res => pageLoadCallback = res); let frameLoadCallback = () => {}, onWindowMessage = () => {}; @@ -51,17 +54,25 @@ export default async (CDP, proc, injectionType = 'browser', { browserName } = { log('finished setup'); - evalInWindow('document.readyState').then(readyState => { + evalInWindow('document.readyState').then(readyState => { // check if already loaded, if so trigger page load promise if (readyState === 'complete' || readyState === 'ready') pageLoadCallback(); }); + const generateVersionInfo = (name, version) => ({ name, version, major: parseInt(version.split('.')[0]) }); - return { + const versions = { + product: generateVersionInfo(browserName, browserInfo.product.split('/')[1]), + engine: generateVersionInfo(browserEngine, browserInfo.product.split('/')[1]), + jsEngine: generateVersionInfo(browserEngine === 'chromium' ? 'v8' : 'spidermonkey', browserInfo.jsVersion) + }; + + const closeHandlers = []; + const Window = { page: { eval: evalInWindow, loaded: pageLoadPromise @@ -74,14 +85,17 @@ export default async (CDP, proc, injectionType = 'browser', { browserName } = { }, close: () => { + for (const handler of closeHandlers) handler(); // extra api handlers which need to be closed + CDP.close(); proc.kill(); }, - versions: { - product: generateVersionInfo(browserName, browserInfo.product.split('/')[1]), - engine: generateVersionInfo(browserEngine, browserInfo.product.split('/')[1]), - jsEngine: generateVersionInfo(browserEngine === 'chromium' ? 'v8' : 'spidermonkey', browserInfo.jsVersion) - } + versions }; + + Window.idle = await IdleApi(Window.cdp, { browserEngine, closeHandlers }); + Window.controls = await ControlsApi(Window.cdp); + + return Window; }; \ No newline at end of file