idle: add close handler (also move API creation into inject)

This commit is contained in:
CanadaHonk 2023-01-05 20:32:27 +00:00
parent a6fdc53d36
commit 0724473b01
3 changed files with 31 additions and 15 deletions

View File

@ -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();

View File

@ -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;
};

View File

@ -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;
};