206 lines
7.8 KiB
JavaScript
206 lines
7.8 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.createBrowserShim = exports.createPageShim = exports.getBrowserCDPSession = exports.getPageCDPSession = exports.addPuppeteerCompat = exports.isPuppeteerCompat = exports.isPlaywrightBrowser = exports.isPlaywrightFrame = exports.isPlaywrightPage = void 0;
|
|
const debug_1 = __importDefault(require("debug"));
|
|
const debug = (0, debug_1.default)('playwright-extra:puppeteer-compat');
|
|
const isPlaywrightPage = (obj) => {
|
|
return 'unroute' in obj;
|
|
};
|
|
exports.isPlaywrightPage = isPlaywrightPage;
|
|
const isPlaywrightFrame = (obj) => {
|
|
return ['parentFrame', 'frameLocator'].every(x => x in obj);
|
|
};
|
|
exports.isPlaywrightFrame = isPlaywrightFrame;
|
|
const isPlaywrightBrowser = (obj) => {
|
|
return 'newContext' in obj;
|
|
};
|
|
exports.isPlaywrightBrowser = isPlaywrightBrowser;
|
|
const isPuppeteerCompat = (obj) => {
|
|
return !!obj && typeof obj === 'object' && !!obj.isCompatShim;
|
|
};
|
|
exports.isPuppeteerCompat = isPuppeteerCompat;
|
|
const cache = {
|
|
objectToShim: new Map(),
|
|
cdpSession: {
|
|
page: new Map(),
|
|
browser: new Map()
|
|
}
|
|
};
|
|
/** Augment a Playwright object with compatibility with certain Puppeteer methods */
|
|
function addPuppeteerCompat(object) {
|
|
if (!object || typeof object !== 'object') {
|
|
return object;
|
|
}
|
|
if (cache.objectToShim.has(object)) {
|
|
return cache.objectToShim.get(object);
|
|
}
|
|
if ((0, exports.isPuppeteerCompat)(object)) {
|
|
return object;
|
|
}
|
|
debug('addPuppeteerCompat', cache.objectToShim.size);
|
|
if ((0, exports.isPlaywrightPage)(object) || (0, exports.isPlaywrightFrame)(object)) {
|
|
const shim = createPageShim(object);
|
|
cache.objectToShim.set(object, shim);
|
|
return shim;
|
|
}
|
|
if ((0, exports.isPlaywrightBrowser)(object)) {
|
|
const shim = createBrowserShim(object);
|
|
cache.objectToShim.set(object, shim);
|
|
return shim;
|
|
}
|
|
debug('Received unknown object:', Reflect.ownKeys(object));
|
|
return object;
|
|
}
|
|
exports.addPuppeteerCompat = addPuppeteerCompat;
|
|
// Only chromium browsers support CDP
|
|
const dummyCDPClient = {
|
|
send: async (...args) => {
|
|
debug('dummy CDP client called', 'send', args);
|
|
},
|
|
on: (...args) => {
|
|
debug('dummy CDP client called', 'on', args);
|
|
}
|
|
};
|
|
async function getPageCDPSession(page) {
|
|
let session = cache.cdpSession.page.get(page);
|
|
if (session) {
|
|
debug('getPageCDPSession: use existing');
|
|
return session;
|
|
}
|
|
debug('getPageCDPSession: use new');
|
|
const context = (0, exports.isPlaywrightFrame)(page)
|
|
? page.page().context()
|
|
: page.context();
|
|
try {
|
|
session = await context.newCDPSession(page);
|
|
cache.cdpSession.page.set(page, session);
|
|
return session;
|
|
}
|
|
catch (err) {
|
|
debug('getPageCDPSession: error while creating session:', err.message);
|
|
debug('getPageCDPSession: Unable create CDP session (most likely a different browser than chromium) - returning a dummy');
|
|
}
|
|
return dummyCDPClient;
|
|
}
|
|
exports.getPageCDPSession = getPageCDPSession;
|
|
async function getBrowserCDPSession(browser) {
|
|
let session = cache.cdpSession.browser.get(browser);
|
|
if (session) {
|
|
debug('getBrowserCDPSession: use existing');
|
|
return session;
|
|
}
|
|
debug('getBrowserCDPSession: use new');
|
|
try {
|
|
session = await browser.newBrowserCDPSession();
|
|
cache.cdpSession.browser.set(browser, session);
|
|
return session;
|
|
}
|
|
catch (err) {
|
|
debug('getBrowserCDPSession: error while creating session:', err.message);
|
|
debug('getBrowserCDPSession: Unable create CDP session (most likely a different browser than chromium) - returning a dummy');
|
|
}
|
|
return dummyCDPClient;
|
|
}
|
|
exports.getBrowserCDPSession = getBrowserCDPSession;
|
|
function createPageShim(page) {
|
|
const objId = Math.random().toString(36).substring(2, 7);
|
|
const shim = new Proxy(page, {
|
|
get(target, prop) {
|
|
if (prop === 'isCompatShim' || prop === 'isPlaywright') {
|
|
return true;
|
|
}
|
|
debug('page - get', objId, prop);
|
|
if (prop === '_client') {
|
|
return () => ({
|
|
send: async (method, params) => {
|
|
const session = await getPageCDPSession(page);
|
|
return await session.send(method, params);
|
|
},
|
|
on: (event, listener) => {
|
|
getPageCDPSession(page).then(session => {
|
|
session.on(event, listener);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
if (prop === 'setBypassCSP') {
|
|
return async (enabled) => {
|
|
const session = await getPageCDPSession(page);
|
|
return await session.send('Page.setBypassCSP', {
|
|
enabled
|
|
});
|
|
};
|
|
}
|
|
if (prop === 'setUserAgent') {
|
|
return async (userAgent, userAgentMetadata) => {
|
|
const session = await getPageCDPSession(page);
|
|
return await session.send('Emulation.setUserAgentOverride', {
|
|
userAgent,
|
|
userAgentMetadata
|
|
});
|
|
};
|
|
}
|
|
if (prop === 'browser') {
|
|
if ((0, exports.isPlaywrightPage)(page)) {
|
|
return () => {
|
|
let browser = page.context().browser();
|
|
if (!browser) {
|
|
debug('page.browser() - not available, most likely due to launchPersistentContext');
|
|
// Use a page shim as quick drop-in (so browser.userAgent() still works)
|
|
browser = page;
|
|
}
|
|
return addPuppeteerCompat(browser);
|
|
};
|
|
}
|
|
}
|
|
if (prop === 'evaluateOnNewDocument') {
|
|
if ((0, exports.isPlaywrightPage)(page)) {
|
|
return async function (pageFunction, ...args) {
|
|
return await page.addInitScript(pageFunction, args[0]);
|
|
};
|
|
}
|
|
}
|
|
// Only relevant when page is being used a pseudo stand-in for the browser object (launchPersistentContext)
|
|
if (prop === 'userAgent') {
|
|
return async (enabled) => {
|
|
const session = await getPageCDPSession(page);
|
|
const data = await session.send('Browser.getVersion');
|
|
return data.userAgent;
|
|
};
|
|
}
|
|
return Reflect.get(target, prop);
|
|
}
|
|
});
|
|
return shim;
|
|
}
|
|
exports.createPageShim = createPageShim;
|
|
function createBrowserShim(browser) {
|
|
const objId = Math.random().toString(36).substring(2, 7);
|
|
const shim = new Proxy(browser, {
|
|
get(target, prop) {
|
|
if (prop === 'isCompatShim' || prop === 'isPlaywright') {
|
|
return true;
|
|
}
|
|
debug('browser - get', objId, prop);
|
|
if (prop === 'pages') {
|
|
return () => browser
|
|
.contexts()
|
|
.flatMap(c => c.pages().map(page => addPuppeteerCompat(page)));
|
|
}
|
|
if (prop === 'userAgent') {
|
|
return async () => {
|
|
const session = await getBrowserCDPSession(browser);
|
|
const data = await session.send('Browser.getVersion');
|
|
return data.userAgent;
|
|
};
|
|
}
|
|
return Reflect.get(target, prop);
|
|
}
|
|
});
|
|
return shim;
|
|
}
|
|
exports.createBrowserShim = createBrowserShim;
|
|
//# sourceMappingURL=index.js.map
|