2020-08-25 06:26:06 +03:00
|
|
|
/**
|
|
|
|
* Copyright 2017 Google Inc. All rights reserved.
|
|
|
|
* Modifications copyright (c) Microsoft Corporation.
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2021-04-29 21:11:32 +03:00
|
|
|
import { playwrightTest as it, expect } from './config/browserTest';
|
2021-04-06 01:51:45 +03:00
|
|
|
import { verifyViewport } from './config/utils';
|
2020-08-25 06:26:06 +03:00
|
|
|
import fs from 'fs';
|
|
|
|
|
2021-12-30 05:51:28 +03:00
|
|
|
it('context.cookies() should work #smoke', async ({ server, launchPersistent, browserName, browserMajorVersion }) => {
|
2021-09-27 19:58:08 +03:00
|
|
|
const { page } = await launchPersistent();
|
2020-08-25 06:26:06 +03:00
|
|
|
await page.goto(server.EMPTY_PAGE);
|
|
|
|
const documentCookie = await page.evaluate(() => {
|
|
|
|
document.cookie = 'username=John Doe';
|
|
|
|
return document.cookie;
|
|
|
|
});
|
|
|
|
expect(documentCookie).toBe('username=John Doe');
|
2021-12-16 04:33:09 +03:00
|
|
|
const defaultSameSiteCookieValue = browserName === 'chromium' || (browserName === 'firefox' && browserMajorVersion >= 96) ? 'Lax' : 'None';
|
2020-08-25 06:26:06 +03:00
|
|
|
expect(await page.context().cookies()).toEqual([{
|
|
|
|
name: 'username',
|
|
|
|
value: 'John Doe',
|
|
|
|
domain: 'localhost',
|
|
|
|
path: '/',
|
|
|
|
expires: -1,
|
|
|
|
httpOnly: false,
|
|
|
|
secure: false,
|
2021-12-16 04:33:09 +03:00
|
|
|
sameSite: defaultSameSiteCookieValue,
|
2020-08-25 06:26:06 +03:00
|
|
|
}]);
|
|
|
|
});
|
|
|
|
|
2021-09-27 19:58:08 +03:00
|
|
|
it('context.addCookies() should work', async ({ server, launchPersistent, browserName, isWindows }) => {
|
|
|
|
const { page } = await launchPersistent();
|
2020-08-25 06:26:06 +03:00
|
|
|
await page.goto(server.EMPTY_PAGE);
|
|
|
|
await page.context().addCookies([{
|
|
|
|
url: server.EMPTY_PAGE,
|
|
|
|
name: 'username',
|
2021-08-09 23:57:17 +03:00
|
|
|
value: 'John Doe',
|
|
|
|
sameSite: 'Lax',
|
2020-08-25 06:26:06 +03:00
|
|
|
}]);
|
|
|
|
expect(await page.evaluate(() => document.cookie)).toBe('username=John Doe');
|
|
|
|
expect(await page.context().cookies()).toEqual([{
|
|
|
|
name: 'username',
|
|
|
|
value: 'John Doe',
|
|
|
|
domain: 'localhost',
|
|
|
|
path: '/',
|
|
|
|
expires: -1,
|
|
|
|
httpOnly: false,
|
|
|
|
secure: false,
|
2021-08-11 20:27:41 +03:00
|
|
|
sameSite: (browserName === 'webkit' && isWindows) ? 'None' : 'Lax',
|
2020-08-25 06:26:06 +03:00
|
|
|
}]);
|
|
|
|
});
|
|
|
|
|
2021-09-27 19:58:08 +03:00
|
|
|
it('context.clearCookies() should work', async ({ server, launchPersistent }) => {
|
|
|
|
const { page } = await launchPersistent();
|
2020-08-25 06:26:06 +03:00
|
|
|
await page.goto(server.EMPTY_PAGE);
|
|
|
|
await page.context().addCookies([{
|
|
|
|
url: server.EMPTY_PAGE,
|
|
|
|
name: 'cookie1',
|
|
|
|
value: '1'
|
|
|
|
}, {
|
|
|
|
url: server.EMPTY_PAGE,
|
|
|
|
name: 'cookie2',
|
|
|
|
value: '2'
|
|
|
|
}]);
|
|
|
|
expect(await page.evaluate('document.cookie')).toBe('cookie1=1; cookie2=2');
|
|
|
|
await page.context().clearCookies();
|
|
|
|
await page.reload();
|
|
|
|
expect(await page.context().cookies([])).toEqual([]);
|
|
|
|
expect(await page.evaluate('document.cookie')).toBe('');
|
|
|
|
});
|
|
|
|
|
2021-12-16 04:33:09 +03:00
|
|
|
it('should(not) block third party cookies', async ({ server, launchPersistent, browserName, browserMajorVersion }) => {
|
2021-09-27 19:58:08 +03:00
|
|
|
const { page, context } = await launchPersistent();
|
2020-08-25 06:26:06 +03:00
|
|
|
await page.goto(server.EMPTY_PAGE);
|
|
|
|
await page.evaluate(src => {
|
|
|
|
let fulfill;
|
|
|
|
const promise = new Promise(x => fulfill = x);
|
|
|
|
const iframe = document.createElement('iframe');
|
|
|
|
document.body.appendChild(iframe);
|
|
|
|
iframe.onload = fulfill;
|
|
|
|
iframe.src = src;
|
|
|
|
return promise;
|
|
|
|
}, server.CROSS_PROCESS_PREFIX + '/grid.html');
|
|
|
|
const documentCookie = await page.frames()[1].evaluate(() => {
|
|
|
|
document.cookie = 'username=John Doe';
|
|
|
|
return document.cookie;
|
|
|
|
});
|
|
|
|
await page.waitForTimeout(2000);
|
2021-12-16 04:33:09 +03:00
|
|
|
const allowsThirdParty = browserName === 'firefox' && browserMajorVersion <= 95;
|
2020-08-25 06:26:06 +03:00
|
|
|
expect(documentCookie).toBe(allowsThirdParty ? 'username=John Doe' : '');
|
|
|
|
const cookies = await context.cookies(server.CROSS_PROCESS_PREFIX + '/grid.html');
|
|
|
|
if (allowsThirdParty) {
|
|
|
|
expect(cookies).toEqual([
|
|
|
|
{
|
2020-08-28 14:20:29 +03:00
|
|
|
'domain': '127.0.0.1',
|
|
|
|
'expires': -1,
|
|
|
|
'httpOnly': false,
|
|
|
|
'name': 'username',
|
|
|
|
'path': '/',
|
|
|
|
'sameSite': 'None',
|
|
|
|
'secure': false,
|
|
|
|
'value': 'John Doe'
|
2020-08-25 06:26:06 +03:00
|
|
|
}
|
|
|
|
]);
|
|
|
|
} else {
|
|
|
|
expect(cookies).toEqual([]);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2021-09-27 19:58:08 +03:00
|
|
|
it('should support viewport option', async ({ launchPersistent }) => {
|
|
|
|
const { page, context } = await launchPersistent({ viewport: { width: 456, height: 789 } });
|
2020-09-19 01:52:14 +03:00
|
|
|
await verifyViewport(page, 456, 789);
|
2020-08-25 06:26:06 +03:00
|
|
|
const page2 = await context.newPage();
|
2020-09-19 01:52:14 +03:00
|
|
|
await verifyViewport(page2, 456, 789);
|
2020-08-25 06:26:06 +03:00
|
|
|
});
|
|
|
|
|
2021-09-27 19:58:08 +03:00
|
|
|
it('should support deviceScaleFactor option', async ({ launchPersistent }) => {
|
|
|
|
const { page } = await launchPersistent({ deviceScaleFactor: 3 });
|
2020-08-25 06:26:06 +03:00
|
|
|
expect(await page.evaluate('window.devicePixelRatio')).toBe(3);
|
|
|
|
});
|
|
|
|
|
2021-09-27 19:58:08 +03:00
|
|
|
it('should support userAgent option', async ({ server, launchPersistent }) => {
|
|
|
|
const { page } = await launchPersistent({ userAgent: 'foobar' });
|
2020-08-25 06:26:06 +03:00
|
|
|
expect(await page.evaluate(() => navigator.userAgent)).toBe('foobar');
|
|
|
|
const [request] = await Promise.all([
|
|
|
|
server.waitForRequest('/empty.html'),
|
|
|
|
page.goto(server.EMPTY_PAGE),
|
|
|
|
]);
|
|
|
|
expect(request.headers['user-agent']).toBe('foobar');
|
|
|
|
});
|
|
|
|
|
2021-09-27 19:58:08 +03:00
|
|
|
it('should support bypassCSP option', async ({ server, launchPersistent }) => {
|
|
|
|
const { page } = await launchPersistent({ bypassCSP: true });
|
2020-08-25 06:26:06 +03:00
|
|
|
await page.goto(server.PREFIX + '/csp.html');
|
2021-09-27 19:58:08 +03:00
|
|
|
await page.addScriptTag({ content: 'window["__injected"] = 42;' });
|
2020-08-25 06:26:06 +03:00
|
|
|
expect(await page.evaluate('__injected')).toBe(42);
|
|
|
|
});
|
|
|
|
|
2021-09-27 19:58:08 +03:00
|
|
|
it('should support javascriptEnabled option', async ({ launchPersistent, browserName }) => {
|
|
|
|
const { page } = await launchPersistent({ javaScriptEnabled: false });
|
2020-08-25 06:26:06 +03:00
|
|
|
await page.goto('data:text/html, <script>var something = "forbidden"</script>');
|
|
|
|
let error = null;
|
|
|
|
await page.evaluate('something').catch(e => error = e);
|
2021-05-13 20:22:23 +03:00
|
|
|
if (browserName === 'webkit')
|
2020-08-25 06:26:06 +03:00
|
|
|
expect(error.message).toContain('Can\'t find variable: something');
|
|
|
|
else
|
|
|
|
expect(error.message).toContain('something is not defined');
|
|
|
|
});
|
|
|
|
|
2021-09-27 19:58:08 +03:00
|
|
|
it('should support httpCredentials option', async ({ server, launchPersistent }) => {
|
|
|
|
const { page } = await launchPersistent({ httpCredentials: { username: 'user', password: 'pass' } });
|
2020-08-25 06:26:06 +03:00
|
|
|
server.setAuth('/playground.html', 'user', 'pass');
|
|
|
|
const response = await page.goto(server.PREFIX + '/playground.html');
|
|
|
|
expect(response.status()).toBe(200);
|
|
|
|
});
|
|
|
|
|
2021-09-27 19:58:08 +03:00
|
|
|
it('should support offline option', async ({ server, launchPersistent }) => {
|
|
|
|
const { page } = await launchPersistent({ offline: true });
|
2020-08-25 06:26:06 +03:00
|
|
|
const error = await page.goto(server.EMPTY_PAGE).catch(e => e);
|
|
|
|
expect(error).toBeTruthy();
|
|
|
|
});
|
|
|
|
|
2021-10-14 20:41:03 +03:00
|
|
|
it('should support acceptDownloads option', async ({ server, launchPersistent, mode }) => {
|
|
|
|
it.skip(mode === 'service', 'download.path() is not avaialble in remote mode');
|
|
|
|
|
2021-12-06 20:25:24 +03:00
|
|
|
const { page } = await launchPersistent();
|
2020-08-25 06:26:06 +03:00
|
|
|
server.setRoute('/download', (req, res) => {
|
|
|
|
res.setHeader('Content-Type', 'application/octet-stream');
|
|
|
|
res.setHeader('Content-Disposition', 'attachment');
|
|
|
|
res.end(`Hello world`);
|
|
|
|
});
|
|
|
|
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
|
|
|
|
const [ download ] = await Promise.all([
|
|
|
|
page.waitForEvent('download'),
|
|
|
|
page.click('a')
|
|
|
|
]);
|
|
|
|
const path = await download.path();
|
|
|
|
expect(fs.existsSync(path)).toBeTruthy();
|
|
|
|
expect(fs.readFileSync(path).toString()).toBe('Hello world');
|
|
|
|
});
|