import {stdin as input, stdout as output} from 'node:process';
import * as readline from 'node:readline/promises';
import puppeteer from 'puppeteer';
import WebSocket from 'ws';
// Running this test needs a local build with https://crrev.com/c/5532619.
(async () => {
// Launch the browser and open a new blank page
const browser = await puppeteer.launch({
executablePath: 'out/default/chrome'
headless: false,
slowMo: 100,
// Expected to run via WebSocket.
pipe: false,
});
const ws = new WebSocket(browser.wsEndpoint(), {perMessageDeflate: false});
await new Promise(resolve => ws.once('open', resolve));
const queue = [];
var id = 1;
const send = obj => () => {
console.log(' >>>> Sending: ' + JSON.stringify(obj));
ws.send(JSON.stringify({id: id, ...obj}));
};
const show_apps =
() => async () => {
console.log('**** Now I will show the chrome://apps');
const page = await browser.newPage();
await page.goto('chrome://apps');
run();
}
const run = () => {
if (queue.length > 0) {
queue.shift()();
}
};
const waitfor_enter = (msg) => async () => {
const rl = readline.createInterface({input, output});
await rl.question('**** ' + msg, ans => {
rl.close();
});
run();
};
ws.addEventListener('message', e => {
console.log(' <<<< Result: ' + e.data);
const res = JSON.parse(e.data);
if (res.result && res.result.targetId) {
queue.unshift(send({
method: 'Target.attachToTarget',
params: {targetId: res.result.targetId}
}));
}
if (res.id == id) {
id++;
run();
}
});
queue.push(send({
method: 'PWA.launch',
params: {
manifestId: 'https://developer.chrome.com/',
}
}));
queue.push(show_apps());
queue.push(waitfor_enter(
'The first launch should fail since the app has not been installed yet. Press enter to move forward.'));
queue.push(send({
method: 'PWA.install',
params: {
manifestId: 'https://developer.chrome.com/',
installUrlOrBundleUrl: 'https://developer.chrome.com/'
}
}));
queue.push(send({
method: 'PWA.launch',
params: {
manifestId: 'https://developer.chrome.com/',
}
}));
queue.push(waitfor_enter(
'The second launch should succeed - press enter to move forward'));
queue.push(send({
method: 'PWA.getOsAppState',
params: {
manifestId: 'https://developer.chrome.com/',
}
}));
// Does not work - it needs a WebSocket connecting to the page.
queue.push(send({
method: 'Page.getAppManifest',
params: {
manifestId: 'https://developer.chrome.com/',
}
}));
queue.push(show_apps());
queue.push(waitfor_enter('Press enter to uninstall the web app.'));
queue.push(send({
method: 'PWA.uninstall',
params: {
manifestId: 'https://developer.chrome.com/',
}
}));
queue.push(
waitfor_enter('Press enter to close the browser window and stop.'));
queue.push(() => {
if (queue.length > 0) {
throw new Error('The queue should be empty now.')
}
browser.close();
process.exit();
});
run();
})();