1
0
mirror of https://github.com/webrecorder/pywb.git synced 2025-03-16 08:28:52 +01:00
pywb/wombat/test/helpers/testHelper.js
John Berlin 6437dab1f4 server side rewriting: (#475)
- fixed edge case in jsonP rewriting where no callback name is supplied only ? but body has normal jsonP callback (url = https://geolocation.onetrust.com/cookieconsentpub/v1/geo/countries/EU?callback=?)
  - made the `!self.__WB_pmw` server side inject match the client side one done via wombat
  - added regex's for eval override to JSWombatProxyRules

wombat:
  - added eval override in order to ensure AD network JS does not lockup the browser (cnn.com)
  - added returning a proxied value for window.parent from the window proxy object in order to ensure AD network JS does not lock up browser (cnn.com, boston.com, et. al.)
  - ensured that the read only storageArea property of 'StorageEvents' fired by the custom storage class is present (spec)
  - ensured that userland cannot create new instances of Storage and that localStorage instanceof Storage works with our override (spec)
  - ensured that assignments to SomeElement.[innerHTML|outerHTML], iframe.srcdoc, or style.textContent are more correctly handled in particular doing script.[innerHTML|outerHTML] = <JS>
  - ensured that the test used in the isArgumentsObj function does not throw errors IFF the pages JS has made it so when toString is called (linkedin.com)
  - ensured that Web Worker construction when using the optional options object, the options get supplied to the create worker (spec)
  - ensured that the expected TypeError exception thrown from DomConstructors of overridden interfaces are thrown when their pre-conditions are not met (spec)
  - ensured that wombat worker rewriting skipes data urls which should not be rewritten
  - ensured the bound function returned by the window function is the same on subsequent retrievals fixes #474

  tests:
   - added direct testing of wombat's parts
2019-06-20 19:06:41 -07:00

147 lines
2.8 KiB
JavaScript

const initChrome = require('./initChrome');
const initServer = require('./initServer');
const { Browser } = require('chrome-remote-interface-extra');
class TestHelper {
/**
* @param {*} t
* @param {boolean} [direct = false]
* @return {Promise<TestHelper>}
*/
static async init(t, direct = false) {
const browser = await initChrome();
const server = await initServer();
const th = new TestHelper({
server,
browser,
t,
direct
});
await th.setup();
return th;
}
/**
* @param {TestHelperInit} init
*/
constructor({ server, browser, t, direct }) {
/**
* @type {fastify.FastifyInstance}
*/
this._server = server;
/**
* @type {Browser}
*/
this._browser = browser;
/** @type {*} */
this._t = t;
/** @type {Page} */
this._testPage = null;
/** @type {Frame} */
this._sandbox = null;
/** @type {boolean} */
this._direct = direct;
}
/**
* @return {fastify.FastifyInstance}
*/
server() {
return this._server;
}
/**
* @return {Page}
*/
testPage() {
return this._testPage;
}
/**
* @return {Frame}
*/
sandbox() {
return this._sandbox;
}
async initWombat() {
await this._testPage.evaluate(() => {
window.overwatch.initSandbox();
});
}
async maybeInitWombat() {
await this._testPage.evaluate(() => {
window.overwatch.maybeInitSandbox();
});
}
async setup() {
this._testPage = await this._browser.newPage();
await this.cleanup();
}
async cleanup() {
const testPageURL = this._direct
? this._server.testPageDirect
: this._server.testPage;
await this._testPage.goto(testPageURL, {
waitUntil: 'networkidle2'
});
this._sandbox = this._testPage.frames()[1];
}
async fullRefresh() {
await this.cleanup();
await this.initWombat();
}
async ensureSandbox() {
const url = `https://tests.${this._direct ? 'direct.' : ''}wombat.io/`;
if (!this._sandbox.url().endsWith(url)) {
await this.fullRefresh();
} else {
await this.maybeInitWombat();
}
}
async stop() {
if (this._testPage) {
try {
await this._testPage.close();
} catch (e) {
console.log(`Exception closing test page ${e}`);
}
}
try {
if (this._browser) {
await this._browser.close();
}
} catch (e) {
console.log(`Exception closing browser ${e}`);
}
try {
if (this._server) {
await this._server.stop();
}
} catch (e) {
console.log(`Exception stopping server ${e}`);
}
}
}
module.exports = TestHelper;
/**
* @typedef {Object} TestHelperInit
* @property {fastify.FastifyInstance} server
* @property {*} t
* @property {Browser} browser
* @property {boolean} direct
*/