inject: add window.loaded promise

This commit is contained in:
Oj 2023-01-05 18:41:45 +00:00
parent 785778d450
commit 44f6489a52

View File

@ -1,10 +1,12 @@
import IPCApi from '../lib/ipc.js'; import IPCApi from '../lib/ipc.js';
export default async (CDP, proc, injectionType = 'browser', { browserName } = { browserName: 'unknown' }) => { export default async (CDP, proc, injectionType = 'browser', { browserName } = { browserName: 'unknown' }) => {
let pageLoadCallback = () => {}, onWindowMessage = () => {}; let pageLoadCallback, pageLoadPromise = new Promise(res => pageLoadCallback = res);
let frameLoadCallback = () => {}, onWindowMessage = () => {};
CDP.onMessage(msg => { CDP.onMessage(msg => {
if (msg.method === 'Runtime.bindingCalled' && msg.params.name === '_gluonSend') onWindowMessage(JSON.parse(msg.params.payload)); if (msg.method === 'Runtime.bindingCalled' && msg.params.name === '_gluonSend') onWindowMessage(JSON.parse(msg.params.payload));
if (msg.method === 'Page.frameStoppedLoading') pageLoadCallback(msg.params); if (msg.method === 'Page.frameStoppedLoading') frameLoadCallback(msg.params);
if (msg.method === 'Page.loadEventFired') pageLoadCallback();
if (msg.method === 'Runtime.executionContextCreated') injectIPC(); // ensure IPC injection again if (msg.method === 'Runtime.executionContextCreated') injectIPC(); // ensure IPC injection again
}); });
@ -42,13 +44,17 @@ export default async (CDP, proc, injectionType = 'browser', { browserName } = {
}, { }, {
evalInWindow, evalInWindow,
evalOnNewDocument: source => CDP.sendMessage('Page.addScriptToEvaluateOnNewDocument', { source }, sessionId), evalOnNewDocument: source => CDP.sendMessage('Page.addScriptToEvaluateOnNewDocument', { source }, sessionId),
pageLoadPromise: new Promise(res => pageLoadCallback = res) pageLoadPromise: new Promise(res => frameLoadCallback = res)
}); });
onWindowMessage = ipcMessageCallback; onWindowMessage = ipcMessageCallback;
log('finished setup'); log('finished setup');
evalInWindow('document.readyState').then(readyState => {
if (readyState === 'complete' || readyState === 'ready') pageLoadCallback();
});
const generateVersionInfo = (name, version) => ({ const generateVersionInfo = (name, version) => ({
name, name,
version, version,
@ -58,6 +64,7 @@ export default async (CDP, proc, injectionType = 'browser', { browserName } = {
return { return {
window: { window: {
eval: evalInWindow, eval: evalInWindow,
loaded: pageLoadPromise
}, },
ipc: IPC, ipc: IPC,