test(chromium): add more oopif tests (#1685)
This commit is contained in:
parent
bb0b6cd90a
commit
274c6c1450
9
.github/workflows/tests.yml
vendored
9
.github/workflows/tests.yml
vendored
|
|
@ -34,6 +34,7 @@ jobs:
|
||||||
DEBUG: "*"
|
DEBUG: "*"
|
||||||
# Ensure output folder exists just in case it was not created by the test run.
|
# Ensure output folder exists just in case it was not created by the test run.
|
||||||
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-chromium'), {recursive:true})"
|
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-chromium'), {recursive:true})"
|
||||||
|
if: failure()
|
||||||
- uses: actions/upload-artifact@v1
|
- uses: actions/upload-artifact@v1
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
|
|
@ -60,6 +61,7 @@ jobs:
|
||||||
DEBUG: "*"
|
DEBUG: "*"
|
||||||
# Ensure output folder exists just in case it was not created by the test run.
|
# Ensure output folder exists just in case it was not created by the test run.
|
||||||
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-chromium'), {recursive:true})"
|
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-chromium'), {recursive:true})"
|
||||||
|
if: failure()
|
||||||
- uses: actions/upload-artifact@v1
|
- uses: actions/upload-artifact@v1
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
|
|
@ -87,6 +89,7 @@ jobs:
|
||||||
DEBUG: "*"
|
DEBUG: "*"
|
||||||
# Ensure output folder exists just in case it was not created by the test run.
|
# Ensure output folder exists just in case it was not created by the test run.
|
||||||
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-chromium'), {recursive:true})"
|
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-chromium'), {recursive:true})"
|
||||||
|
if: failure()
|
||||||
- uses: actions/upload-artifact@v1
|
- uses: actions/upload-artifact@v1
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
|
|
@ -118,6 +121,7 @@ jobs:
|
||||||
DEBUG: "*,-pw:wrapped*"
|
DEBUG: "*,-pw:wrapped*"
|
||||||
# Ensure output folder exists just in case it was not created by the test run.
|
# Ensure output folder exists just in case it was not created by the test run.
|
||||||
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-webkit'), {recursive:true})"
|
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-webkit'), {recursive:true})"
|
||||||
|
if: failure()
|
||||||
- uses: actions/upload-artifact@v1
|
- uses: actions/upload-artifact@v1
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
|
|
@ -144,6 +148,7 @@ jobs:
|
||||||
DEBUG: "*,-pw:wrapped*"
|
DEBUG: "*,-pw:wrapped*"
|
||||||
# Ensure output folder exists just in case it was not created by the test run.
|
# Ensure output folder exists just in case it was not created by the test run.
|
||||||
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-webkit'), {recursive:true})"
|
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-webkit'), {recursive:true})"
|
||||||
|
if: failure()
|
||||||
- uses: actions/upload-artifact@v1
|
- uses: actions/upload-artifact@v1
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
|
|
@ -171,6 +176,7 @@ jobs:
|
||||||
DEBUG: "*,-pw:wrapped*"
|
DEBUG: "*,-pw:wrapped*"
|
||||||
# Ensure output folder exists just in case it was not created by the test run.
|
# Ensure output folder exists just in case it was not created by the test run.
|
||||||
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-webkit'), {recursive:true})"
|
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-webkit'), {recursive:true})"
|
||||||
|
if: failure()
|
||||||
- uses: actions/upload-artifact@v1
|
- uses: actions/upload-artifact@v1
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
|
|
@ -202,6 +208,7 @@ jobs:
|
||||||
DEBUG: "*"
|
DEBUG: "*"
|
||||||
# Ensure output folder exists just in case it was not created by the test run.
|
# Ensure output folder exists just in case it was not created by the test run.
|
||||||
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-firefox'), {recursive:true})"
|
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-firefox'), {recursive:true})"
|
||||||
|
if: failure()
|
||||||
- uses: actions/upload-artifact@v1
|
- uses: actions/upload-artifact@v1
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
|
|
@ -228,6 +235,7 @@ jobs:
|
||||||
DEBUG: "*"
|
DEBUG: "*"
|
||||||
# Ensure output folder exists just in case it was not created by the test run.
|
# Ensure output folder exists just in case it was not created by the test run.
|
||||||
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-firefox'), {recursive:true})"
|
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-firefox'), {recursive:true})"
|
||||||
|
if: failure()
|
||||||
- uses: actions/upload-artifact@v1
|
- uses: actions/upload-artifact@v1
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
|
|
@ -255,6 +263,7 @@ jobs:
|
||||||
DEBUG: "*"
|
DEBUG: "*"
|
||||||
# Ensure output folder exists just in case it was not created by the test run.
|
# Ensure output folder exists just in case it was not created by the test run.
|
||||||
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-firefox'), {recursive:true})"
|
- run: node -e "require('fs').mkdirSync(require('path').join('test', 'output-firefox'), {recursive:true})"
|
||||||
|
if: failure()
|
||||||
- uses: actions/upload-artifact@v1
|
- uses: actions/upload-artifact@v1
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,15 @@
|
||||||
|
<style>
|
||||||
|
body, html {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
iframe {
|
||||||
|
width: 300px;
|
||||||
|
height: 300px;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<script>
|
<script>
|
||||||
function goLocal() {
|
function goLocal() {
|
||||||
document.querySelector('iframe').src = location.href.replace('dynamic-oopif.html', 'grid.html');
|
document.querySelector('iframe').src = location.href.replace('dynamic-oopif.html', 'grid.html');
|
||||||
|
|
|
||||||
|
|
@ -44,17 +44,107 @@ describe('OOPIF', function() {
|
||||||
it('should handle remote -> local -> remote transitions', async function({browser, page, server, context}) {
|
it('should handle remote -> local -> remote transitions', async function({browser, page, server, context}) {
|
||||||
await page.goto(server.PREFIX + '/dynamic-oopif.html');
|
await page.goto(server.PREFIX + '/dynamic-oopif.html');
|
||||||
expect(page.frames().length).toBe(2);
|
expect(page.frames().length).toBe(2);
|
||||||
|
expect(await countOOPIFs(browser)).toBe(1);
|
||||||
expect(await page.frames()[1].evaluate(() => '' + location.href)).toBe(server.CROSS_PROCESS_PREFIX + '/grid.html');
|
expect(await page.frames()[1].evaluate(() => '' + location.href)).toBe(server.CROSS_PROCESS_PREFIX + '/grid.html');
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
page.frames()[1].waitForNavigation(),
|
page.frames()[1].waitForNavigation(),
|
||||||
page.evaluate(() => goLocal()),
|
page.evaluate(() => goLocal()),
|
||||||
]);
|
]);
|
||||||
expect(await page.frames()[1].evaluate(() => '' + location.href)).toBe(server.PREFIX + '/grid.html');
|
expect(await page.frames()[1].evaluate(() => '' + location.href)).toBe(server.PREFIX + '/grid.html');
|
||||||
|
expect(await countOOPIFs(browser)).toBe(0);
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
page.frames()[1].waitForNavigation(),
|
page.frames()[1].waitForNavigation(),
|
||||||
page.evaluate(() => goRemote()),
|
page.evaluate(() => goRemote()),
|
||||||
]);
|
]);
|
||||||
expect(await page.frames()[1].evaluate(() => '' + location.href)).toBe(server.CROSS_PROCESS_PREFIX + '/grid.html');
|
expect(await page.frames()[1].evaluate(() => '' + location.href)).toBe(server.CROSS_PROCESS_PREFIX + '/grid.html');
|
||||||
|
expect(await countOOPIFs(browser)).toBe(1);
|
||||||
|
});
|
||||||
|
it.fail(CHROMIUM)('should get the proper viewport', async({browser, page, server}) => {
|
||||||
|
expect(page.viewportSize()).toEqual({width: 1280, height: 720});
|
||||||
|
await page.goto(server.PREFIX + '/dynamic-oopif.html');
|
||||||
|
expect(page.frames().length).toBe(2);
|
||||||
|
expect(await countOOPIFs(browser)).toBe(1);
|
||||||
|
const oopif = page.frames()[1];
|
||||||
|
expect(await oopif.evaluate(() => screen.width)).toBe(1280);
|
||||||
|
expect(await oopif.evaluate(() => screen.height)).toBe(720);
|
||||||
|
expect(await oopif.evaluate(() => matchMedia('(device-width: 1280px)').matches)).toBe(true);
|
||||||
|
expect(await oopif.evaluate(() => matchMedia('(device-height: 720px)').matches)).toBe(true);
|
||||||
|
expect(await oopif.evaluate(() => 'ontouchstart' in window)).toBe(false);
|
||||||
|
await page.setViewportSize({width: 123, height: 456});
|
||||||
|
expect(await oopif.evaluate(() => screen.width)).toBe(123);
|
||||||
|
expect(await oopif.evaluate(() => screen.height)).toBe(456);
|
||||||
|
expect(await oopif.evaluate(() => matchMedia('(device-width: 123px)').matches)).toBe(true);
|
||||||
|
expect(await oopif.evaluate(() => matchMedia('(device-height: 456px)').matches)).toBe(true);
|
||||||
|
expect(await oopif.evaluate(() => 'ontouchstart' in window)).toBe(false);
|
||||||
|
});
|
||||||
|
it('should expose function', async({browser, page, server}) => {
|
||||||
|
await page.goto(server.PREFIX + '/dynamic-oopif.html');
|
||||||
|
expect(page.frames().length).toBe(2);
|
||||||
|
expect(await countOOPIFs(browser)).toBe(1);
|
||||||
|
const oopif = page.frames()[1];
|
||||||
|
await page.exposeFunction('mul', (a, b) => a * b);
|
||||||
|
const result = await oopif.evaluate(async function() {
|
||||||
|
return await mul(9, 4);
|
||||||
|
});
|
||||||
|
expect(result).toBe(36);
|
||||||
|
});
|
||||||
|
it('should emulate media', async({browser, page, server}) => {
|
||||||
|
await page.goto(server.PREFIX + '/dynamic-oopif.html');
|
||||||
|
expect(page.frames().length).toBe(2);
|
||||||
|
expect(await countOOPIFs(browser)).toBe(1);
|
||||||
|
const oopif = page.frames()[1];
|
||||||
|
expect(await oopif.evaluate(() => matchMedia('(prefers-color-scheme: dark)').matches)).toBe(false);
|
||||||
|
await page.emulateMedia({ colorScheme: 'dark' });
|
||||||
|
expect(await oopif.evaluate(() => matchMedia('(prefers-color-scheme: dark)').matches)).toBe(true);
|
||||||
|
});
|
||||||
|
it('should emulate offline', async({browser, page, context, server}) => {
|
||||||
|
await page.goto(server.PREFIX + '/dynamic-oopif.html');
|
||||||
|
expect(page.frames().length).toBe(2);
|
||||||
|
expect(await countOOPIFs(browser)).toBe(1);
|
||||||
|
const oopif = page.frames()[1];
|
||||||
|
expect(await oopif.evaluate(() => navigator.onLine)).toBe(true);
|
||||||
|
await context.setOffline(true);
|
||||||
|
expect(await oopif.evaluate(() => navigator.onLine)).toBe(false);
|
||||||
|
});
|
||||||
|
it('should support context options', async({browser, server}) => {
|
||||||
|
const iPhone = playwright.devices['iPhone 6']
|
||||||
|
const context = await browser.newContext({ ...iPhone, timezoneId: 'America/Jamaica', locale: 'fr-CH', userAgent: 'UA' });
|
||||||
|
const page = await context.newPage();
|
||||||
|
|
||||||
|
const [request] = await Promise.all([
|
||||||
|
server.waitForRequest('/grid.html'),
|
||||||
|
page.goto(server.PREFIX + '/dynamic-oopif.html'),
|
||||||
|
]);
|
||||||
|
expect(page.frames().length).toBe(2);
|
||||||
|
expect(await countOOPIFs(browser)).toBe(1);
|
||||||
|
const oopif = page.frames()[1];
|
||||||
|
|
||||||
|
expect(await oopif.evaluate(() => 'ontouchstart' in window)).toBe(true);
|
||||||
|
expect(await oopif.evaluate(() => new Date(1479579154987).toString())).toBe('Sat Nov 19 2016 13:12:34 GMT-0500 (heure normale de l’Est nord-américain)');
|
||||||
|
expect(await oopif.evaluate(() => navigator.language)).toBe('fr-CH');
|
||||||
|
expect(await oopif.evaluate(() => navigator.userAgent)).toBe('UA');
|
||||||
|
expect(request.headers['user-agent']).toBe('UA');
|
||||||
|
|
||||||
|
await context.close();
|
||||||
|
});
|
||||||
|
it('should respect route', async({browser, page, server}) => {
|
||||||
|
let intercepted = false;
|
||||||
|
await page.route('**/digits/0.png', route => {
|
||||||
|
intercepted = true;
|
||||||
|
route.continue();
|
||||||
|
});
|
||||||
|
await page.goto(server.PREFIX + '/dynamic-oopif.html');
|
||||||
|
expect(page.frames().length).toBe(2);
|
||||||
|
expect(await countOOPIFs(browser)).toBe(1);
|
||||||
|
expect(intercepted).toBe(true);
|
||||||
|
});
|
||||||
|
it.fail(CHROMIUM)('should take screenshot', async({browser, page, server}) => {
|
||||||
|
// Screenshot differs on the bots, needs debugging.
|
||||||
|
await page.setViewportSize({width: 500, height: 500});
|
||||||
|
await page.goto(server.PREFIX + '/dynamic-oopif.html');
|
||||||
|
expect(page.frames().length).toBe(2);
|
||||||
|
expect(await countOOPIFs(browser)).toBe(1);
|
||||||
|
expect(await page.screenshot()).toBeGolden('screenshot-iframe.png');
|
||||||
});
|
});
|
||||||
it('should load oopif iframes with subresources and request interception', async function({browser, page, server, context}) {
|
it('should load oopif iframes with subresources and request interception', async function({browser, page, server, context}) {
|
||||||
await page.route('**/*', route => route.continue());
|
await page.route('**/*', route => route.continue());
|
||||||
|
|
@ -62,14 +152,14 @@ describe('OOPIF', function() {
|
||||||
expect(await countOOPIFs(browser)).toBe(1);
|
expect(await countOOPIFs(browser)).toBe(1);
|
||||||
});
|
});
|
||||||
// @see https://github.com/microsoft/playwright/issues/1240
|
// @see https://github.com/microsoft/playwright/issues/1240
|
||||||
xit('should click a button when it overlays oopif', async function({browser, page, server, context}) {
|
it.fail(CHROMIUM)('should click a button when it overlays oopif', async function({browser, page, server, context}) {
|
||||||
await page.goto(server.PREFIX + '/button-overlay-oopif.html');
|
await page.goto(server.PREFIX + '/button-overlay-oopif.html');
|
||||||
expect(await countOOPIFs(browser)).toBe(1);
|
expect(await countOOPIFs(browser)).toBe(1);
|
||||||
await page.click('button');
|
await page.click('button');
|
||||||
expect(await page.evaluate(() => window.BUTTON_CLICKED)).toBe(true);
|
expect(await page.evaluate(() => window.BUTTON_CLICKED)).toBe(true);
|
||||||
});
|
});
|
||||||
it('should report google.com frame with headful', async({browserType, defaultBrowserOptions, server}) => {
|
it('should report google.com frame with headful', async({browserType, defaultBrowserOptions, server}) => {
|
||||||
// TODO: Support OOOPIF. @see https://github.com/GoogleChrome/puppeteer/issues/2548
|
// @see https://github.com/GoogleChrome/puppeteer/issues/2548
|
||||||
// https://google.com is isolated by default in Chromium embedder.
|
// https://google.com is isolated by default in Chromium embedder.
|
||||||
const browser = await browserType.launch({...defaultBrowserOptions, headless: false});
|
const browser = await browserType.launch({...defaultBrowserOptions, headless: false});
|
||||||
const page = await browser.newPage();
|
const page = await browser.newPage();
|
||||||
|
|
@ -84,6 +174,7 @@ describe('OOPIF', function() {
|
||||||
return new Promise(x => frame.onload = x);
|
return new Promise(x => frame.onload = x);
|
||||||
});
|
});
|
||||||
await page.waitForSelector('iframe[src="https://google.com/"]');
|
await page.waitForSelector('iframe[src="https://google.com/"]');
|
||||||
|
expect(await countOOPIFs(browser)).toBe(1);
|
||||||
const urls = page.frames().map(frame => frame.url());
|
const urls = page.frames().map(frame => frame.url());
|
||||||
expect(urls).toEqual([
|
expect(urls).toEqual([
|
||||||
server.EMPTY_PAGE,
|
server.EMPTY_PAGE,
|
||||||
|
|
|
||||||
BIN
test/golden-chromium/screenshot-iframe.png
Normal file
BIN
test/golden-chromium/screenshot-iframe.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
Loading…
Reference in a new issue