Add multi browser tests + wabac.js update (#420)

Fidelity: Fix CSP issue with iframes in Firefox (via wabac.js 2.23.0)
Loading: Avoid unnecessary reloads of multiWACZ JSON, prune expired
multiWACZ collections

Testing improvements:
- add playwright multi browser tests with firefox and webkit
- add test of iframe replay with iframetest.wacz

deps: update to wabac.js 2.23.0
bump to 2.3.9
This commit is contained in:
Ilya Kreymer
2025-05-14 21:26:01 -07:00
committed by GitHub
parent 62c30e7838
commit 69983af3a8
11 changed files with 139 additions and 27 deletions
+1 -1
View File
@@ -27,7 +27,7 @@ jobs:
run: yarn build run: yarn build
- name: Playwright Install Browsers - name: Playwright Install Browsers
run: yarn playwright install run: yarn playwright install --with-deps
- uses: actions/setup-python@v4 - uses: actions/setup-python@v4
with: with:
+5
View File
@@ -2,6 +2,11 @@
## CHANGES ## CHANGES
v2.3.9
- Loading: Avoid unnecessary reloads of multiWACZ JSON, prune expired (via wabac.js 2.23.0)
- Fidelity: Fix CSP issue with iframes in Firefox (via wabac.js 2.23.0)
- Testing: Add testing for CSP handling and embeds in Firefox and Webkit
v2.3.8 v2.3.8
- Library: disable GDrive integration in library (for AWP use) - Library: disable GDrive integration in library (for AWP use)
Binary file not shown.
+5 -5
View File
@@ -1,7 +1,7 @@
{ {
"name": "replaywebpage", "name": "replaywebpage",
"productName": "ReplayWeb.page", "productName": "ReplayWeb.page",
"version": "2.3.8", "version": "2.3.9",
"description": "Serverless Web Archive Replay", "description": "Serverless Web Archive Replay",
"repository": "https://github.com/webrecorder/replayweb.page", "repository": "https://github.com/webrecorder/replayweb.page",
"homepage": "https://replayweb.page/", "homepage": "https://replayweb.page/",
@@ -22,7 +22,7 @@
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "^5.15.4", "@fortawesome/fontawesome-free": "^5.15.4",
"@shoelace-style/shoelace": "~2.15.1", "@shoelace-style/shoelace": "~2.15.1",
"@webrecorder/wabac": "^2.22.17", "@webrecorder/wabac": "^2.23.0",
"bulma": "^0.9.3", "bulma": "^0.9.3",
"electron-log": "^4.4.1", "electron-log": "^4.4.1",
"electron-updater": "^6.3.9", "electron-updater": "^6.3.9",
@@ -44,7 +44,7 @@
"tsconfig-paths-webpack-plugin": "^4.1.0" "tsconfig-paths-webpack-plugin": "^4.1.0"
}, },
"devDependencies": { "devDependencies": {
"@playwright/test": "^1.38.1", "@playwright/test": "^1.52.0",
"@types/flexsearch": "^0.7.3", "@types/flexsearch": "^0.7.3",
"@types/lodash": "^4.17.5", "@types/lodash": "^4.17.5",
"@typescript-eslint/eslint-plugin": "^6.12.0", "@typescript-eslint/eslint-plugin": "^6.12.0",
@@ -62,7 +62,7 @@
"husky": "^8.0.0", "husky": "^8.0.0",
"lint-staged": "^14.0.0", "lint-staged": "^14.0.0",
"mini-css-extract-plugin": "^2.3.0", "mini-css-extract-plugin": "^2.3.0",
"playwright": "^1.38.1", "playwright": "^1.52.0",
"prettier": "^3.0.1", "prettier": "^3.0.1",
"raw-loader": "^4.0.2", "raw-loader": "^4.0.2",
"sass-embedded": "^1.70.0", "sass-embedded": "^1.70.0",
@@ -97,7 +97,7 @@
"start-dev": "webpack serve --mode development", "start-dev": "webpack serve --mode development",
"start-docs": "yarn run build-dev && cd mkdocs && ./copy-site.sh && mkdocs serve", "start-docs": "yarn run build-dev && cd mkdocs && ./copy-site.sh && mkdocs serve",
"start-electron": "NODE_ENV=development electron ./dist/electron.js $1", "start-electron": "NODE_ENV=development electron ./dist/electron.js $1",
"test-start-embed": "cd tests/embed; http-server -p 8020", "test-start-embed": "cp tests/embed/iframe-test.html mkdocs/_genhtml/; cd tests/embed; http-server -p 8020",
"test-start-sandbox": "cd tests/embed/sandbox; http-server -p 8030", "test-start-sandbox": "cd tests/embed/sandbox; http-server -p 8030",
"update-ruffle": "./ruffle/download-latest-ruffle.sh", "update-ruffle": "./ruffle/download-latest-ruffle.sh",
"pack": "CSC_IDENTITY_AUTO_DISCOVERY=false electron-builder --publish never", "pack": "CSC_IDENTITY_AUTO_DISCOVERY=false electron-builder --publish never",
+16 -1
View File
@@ -1,7 +1,22 @@
/* eslint-env node */ /* eslint-env node */
import { defineConfig } from "@playwright/test"; import { defineConfig, devices } from "@playwright/test";
export default defineConfig({ export default defineConfig({
reporter: process.env.CI ? "github" : "list", reporter: process.env.CI ? "github" : "list",
expect: { timeout: 30_000 },
projects: [
{
name: "chrome",
use: { ...devices['Desktop Chrome'], channel: "chrome" },
},
{
name: 'firefox',
use: { ...devices['Desktop Firefox'] },
},
{
name: 'webkit',
use: { ...devices['Desktop Safari'] },
},
],
webServer: [ webServer: [
{ {
command: "yarn run start-docs-prod", command: "yarn run start-docs-prod",
+19
View File
@@ -0,0 +1,19 @@
<!doctype html>
<html>
<head>
<script src="http://localhost:9990/ui.js"></script>
<style>
body {
background-color: lightgrey;
height: 600px;
}
</style>
</head>
<body>
<replay-web-page
noWebWorker
src="http://localhost:9990/docs/examples/iframetest.wacz"
url="page:0"
></replay-web-page>
</body>
</html>
+19
View File
@@ -0,0 +1,19 @@
<!doctype html>
<html>
<head>
<script src="./ui.js"></script>
<style>
body {
background-color: lightgrey;
height: 600px;
}
</style>
</head>
<body>
<replay-web-page
replaybase="./"
src="./docs/examples/iframetest.wacz"
url="page:0"
></replay-web-page>
</body>
</html>
+1
View File
@@ -14,6 +14,7 @@
</head> </head>
<body> <body>
<replay-web-page <replay-web-page
noWebWorker
embed="replay" embed="replay"
src="http://localhost:9990/docs/examples/tweet-example.wacz" src="http://localhost:9990/docs/examples/tweet-example.wacz"
url="page:0" url="page:0"
+1
View File
@@ -11,6 +11,7 @@
</head> </head>
<body> <body>
<replay-web-page <replay-web-page
noWebWorker
embed="replay-with-info" embed="replay-with-info"
src="http://localhost:9990/docs/examples/tweet-example.wacz" src="http://localhost:9990/docs/examples/tweet-example.wacz"
url="page:0" url="page:0"
+53 -1
View File
@@ -42,6 +42,42 @@ test("cross-domain embed is loading", async ({ page }) => {
await expect(res).toContainText("Want to help"); await expect(res).toContainText("Want to help");
}); });
test("same-domain iframe embed is loading", async ({ page }) => {
await page.goto("http://localhost:9990/iframe-test.html");
const res = page
.locator("replay-web-page")
.frameLocator("iframe")
.locator("replay-app-main wr-item wr-coll-replay")
.frameLocator("iframe")
.locator("body");
await expect(res).toContainText("Outside iframe");
const inside = res.frameLocator("iframe").locator("body");
await expect(inside).toContainText("Inside iframe");
});
test("cross-domain iframe embed is loading", async ({ page }) => {
await page.goto("http://localhost:8020/iframe-test-cross.html");
const res = page
.locator("replay-web-page")
.frameLocator("iframe")
.locator("replay-app-main wr-item wr-coll-replay")
.frameLocator("iframe")
.locator("body");
await expect(res).toContainText("Outside iframe");
const inside = res.frameLocator("iframe").locator("body");
await expect(inside).toContainText("Inside iframe");
});
test("sandbox + cross-domain embed is loading", async ({ page }) => { test("sandbox + cross-domain embed is loading", async ({ page }) => {
await page.goto("http://localhost:8030/"); await page.goto("http://localhost:8030/");
@@ -73,7 +109,7 @@ test("require subdomain iframe", async ({ page }) => {
); );
}); });
test("csp blocking in place", async ({ page }) => { test("csp blocking in place", async ({ page }, workerInfo) => {
await page.goto("http://localhost:9990/embed.html"); await page.goto("http://localhost:9990/embed.html");
const frame = page const frame = page
@@ -114,6 +150,8 @@ test("csp blocking in place", async ({ page }) => {
// (5-6) blocked by csp policy, even though local // (5-6) blocked by csp policy, even though local
block += await blocked(iframe.contentWindow, "http://localhost:9990/sw.js"); block += await blocked(iframe.contentWindow, "http://localhost:9990/sw.js");
// not blocked in FF
block += await blocked( block += await blocked(
iframe.contentWindow, iframe.contentWindow,
"http://localhost:9990/static/wombat.js", "http://localhost:9990/static/wombat.js",
@@ -122,5 +160,19 @@ test("csp blocking in place", async ({ page }) => {
return block; return block;
}); });
const name = workerInfo.project.name;
switch (name) {
case "chrome":
expect(didNotFetch).toBe(6); expect(didNotFetch).toBe(6);
break;
case "firefox":
expect(didNotFetch).toBe(5);
break;
case "webkit":
expect(didNotFetch).toBe(4);
break;
}
}); });
+18 -18
View File
@@ -417,12 +417,12 @@
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
"@playwright/test@^1.38.1": "@playwright/test@^1.52.0":
version "1.38.1" version "1.52.0"
resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.38.1.tgz#8ef4263e355cd1d8ad7905d471d268e8acb82ed6" resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.52.0.tgz#267ec595b43a8f4fa5e444ea503689629e91a5b8"
integrity sha512-NqRp8XMwj3AK+zKLbZShl0r/9wKgzqI/527bkptKXomtuo+dOjU9NdMASQ8DNC9z9zLOMbG53T4eihYr3XR+BQ== integrity sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==
dependencies: dependencies:
playwright "1.38.1" playwright "1.52.0"
"@shoelace-style/animations@^1.1.0": "@shoelace-style/animations@^1.1.0":
version "1.1.0" version "1.1.0"
@@ -1028,10 +1028,10 @@
resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e"
integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==
"@webrecorder/wabac@^2.22.17": "@webrecorder/wabac@^2.23.0":
version "2.22.17" version "2.23.0"
resolved "https://registry.yarnpkg.com/@webrecorder/wabac/-/wabac-2.22.17.tgz#af1992ea78fcd6d82f3ce2a5502504d9763c08d8" resolved "https://registry.yarnpkg.com/@webrecorder/wabac/-/wabac-2.23.0.tgz#cad96945365b424c577afa9325df5e6cf6449669"
integrity sha512-IW7GKwE2Eh5xCj9E7OUHqmmMxdWa5GyyaVRijOFrBksgMfRAyiZxrSUlpUtALtwbyEQ1r2a5wjKyCCJE3xWubw== integrity sha512-kqbs2C/D1moLeinQZ1ilMcgmvXk1B18Yu7S3AEAiOYM+pL62p0DBIfVyS3SUgU2X7nCeJmn90Sq+Pytb3NQ0gg==
dependencies: dependencies:
"@peculiar/asn1-ecc" "^2.3.4" "@peculiar/asn1-ecc" "^2.3.4"
"@peculiar/asn1-schema" "^2.3.3" "@peculiar/asn1-schema" "^2.3.3"
@@ -4467,17 +4467,17 @@ pkg-dir@^4.2.0:
dependencies: dependencies:
find-up "^4.0.0" find-up "^4.0.0"
playwright-core@1.38.1: playwright-core@1.52.0:
version "1.38.1" version "1.52.0"
resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.38.1.tgz#75a3c470aa9576b7d7c4e274de3d79977448ba08" resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.52.0.tgz#238f1f0c3edd4ebba0434ce3f4401900319a3dca"
integrity sha512-tQqNFUKa3OfMf4b2jQ7aGLB8o9bS3bOY0yMEtldtC2+spf8QXG9zvXLTXUeRsoNuxEYMgLYR+NXfAa1rjKRcrg== integrity sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==
playwright@1.38.1, playwright@^1.38.1: playwright@1.52.0, playwright@^1.52.0:
version "1.38.1" version "1.52.0"
resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.38.1.tgz#82ecd9bc4f4f64dbeee8a11c31793748e2528130" resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.52.0.tgz#26cb9a63346651e1c54c8805acfd85683173d4bd"
integrity sha512-oRMSJmZrOu1FP5iu3UrCx8JEFRIMxLDM0c/3o4bpzU5Tz97BypefWf7TuTNPWeCe279TPal5RtPPZ+9lW/Qkow== integrity sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==
dependencies: dependencies:
playwright-core "1.38.1" playwright-core "1.52.0"
optionalDependencies: optionalDependencies:
fsevents "2.3.2" fsevents "2.3.2"