mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
fix(ct): recreate context on option change (#14243)
This commit is contained in:
parent
f0b077ea82
commit
4d9ef46f64
@ -14,35 +14,43 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import type { Fixtures, Locator, Page, PlaywrightTestArgs, PlaywrightTestOptions, PlaywrightWorkerArgs } from './types';
|
import type { Fixtures, Locator, Page, BrowserContextOptions, PlaywrightTestArgs, PlaywrightTestOptions, PlaywrightWorkerArgs } from './types';
|
||||||
|
|
||||||
let boundCallbacksForMount: Function[] = [];
|
let boundCallbacksForMount: Function[] = [];
|
||||||
|
|
||||||
export const fixtures: Fixtures<PlaywrightTestArgs & PlaywrightTestOptions & { mount: (component: any, options: any) => Promise<Locator> }, PlaywrightWorkerArgs & { _workerPage: Page }> = {
|
export const fixtures: Fixtures<PlaywrightTestArgs & PlaywrightTestOptions & { mount: (component: any, options: any) => Promise<Locator> }, PlaywrightWorkerArgs & { _ctPage: { page: Page | undefined, hash: string } }> = {
|
||||||
_workerPage: [async ({ browser }, use) => {
|
_ctPage: [{ page: undefined, hash: '' }, { scope: 'worker' }],
|
||||||
const page = await (browser as any)._wrapApiCall(async () => {
|
|
||||||
const page = await browser.newPage();
|
|
||||||
await page.addInitScript('navigator.serviceWorker.register = () => {}');
|
|
||||||
await page.exposeFunction('__pw_dispatch', (ordinal: number, args: any[]) => {
|
|
||||||
boundCallbacksForMount[ordinal](...args);
|
|
||||||
});
|
|
||||||
return page;
|
|
||||||
});
|
|
||||||
await use(page);
|
|
||||||
}, { scope: 'worker' }],
|
|
||||||
|
|
||||||
context: async ({ page }, use) => {
|
context: async ({ page }, use) => {
|
||||||
await use(page.context());
|
await use(page.context());
|
||||||
},
|
},
|
||||||
|
|
||||||
page: async ({ _workerPage, viewport }, use) => {
|
page: async ({ _ctPage, browser, viewport, playwright }, use) => {
|
||||||
const page = _workerPage;
|
const defaultContextOptions = (playwright.chromium as any)._defaultContextOptions as BrowserContextOptions;
|
||||||
await page.goto('about:blank');
|
const hash = contextHash(defaultContextOptions);
|
||||||
await (page as any)._resetForReuse();
|
|
||||||
await (page.context() as any)._resetForReuse();
|
if (!_ctPage.page || _ctPage.hash !== hash) {
|
||||||
await page.setViewportSize(viewport || { width: 1280, height: 800 });
|
if (_ctPage.page)
|
||||||
|
await _ctPage.page.close();
|
||||||
|
_ctPage.page = await (browser as any)._wrapApiCall(async () => {
|
||||||
|
const page = await browser.newPage();
|
||||||
|
await page.addInitScript('navigator.serviceWorker.register = () => {}');
|
||||||
|
await page.exposeFunction('__pw_dispatch', (ordinal: number, args: any[]) => {
|
||||||
|
boundCallbacksForMount[ordinal](...args);
|
||||||
|
});
|
||||||
|
return page;
|
||||||
|
});
|
||||||
|
_ctPage.hash = hash;
|
||||||
|
} else {
|
||||||
|
await (_ctPage.page as any)._resetForReuse();
|
||||||
|
await (_ctPage.page.context() as any)._resetForReuse();
|
||||||
|
await _ctPage.page.goto('about:blank');
|
||||||
|
await _ctPage.page.setViewportSize(viewport || { width: 1280, height: 800 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const page = _ctPage.page!;
|
||||||
await page.goto(process.env.PLAYWRIGHT_VITE_COMPONENTS_BASE_URL!);
|
await page.goto(process.env.PLAYWRIGHT_VITE_COMPONENTS_BASE_URL!);
|
||||||
await use(_workerPage);
|
await use(page);
|
||||||
},
|
},
|
||||||
|
|
||||||
mount: async ({ page }, use) => {
|
mount: async ({ page }, use) => {
|
||||||
@ -100,3 +108,28 @@ function wrapFunctions(object: any, page: Page, callbacks: Function[]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function contextHash(context: BrowserContextOptions): string {
|
||||||
|
const hash = {
|
||||||
|
acceptDownloads: context.acceptDownloads,
|
||||||
|
bypassCSP: context.bypassCSP,
|
||||||
|
colorScheme: context.colorScheme,
|
||||||
|
extraHTTPHeaders: context.extraHTTPHeaders,
|
||||||
|
forcedColors: context.forcedColors,
|
||||||
|
geolocation: context.geolocation,
|
||||||
|
hasTouch: context.hasTouch,
|
||||||
|
httpCredentials: context.httpCredentials,
|
||||||
|
ignoreHTTPSErrors: context.ignoreHTTPSErrors,
|
||||||
|
isMobile: context.isMobile,
|
||||||
|
javaScriptEnabled: context.javaScriptEnabled,
|
||||||
|
locale: context.locale,
|
||||||
|
offline: context.offline,
|
||||||
|
permissions: context.permissions,
|
||||||
|
proxy: context.proxy,
|
||||||
|
storageState: context.storageState,
|
||||||
|
timezoneId: context.timezoneId,
|
||||||
|
userAgent: context.userAgent,
|
||||||
|
deviceScaleFactor: context.deviceScaleFactor,
|
||||||
|
};
|
||||||
|
return JSON.stringify(hash);
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user