summaryrefslogtreecommitdiffstats
path: root/toolkit/components/antitracking/bouncetrackingprotection/test/browser/file_bounce.html
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/antitracking/bouncetrackingprotection/test/browser/file_bounce.html')
-rw-r--r--toolkit/components/antitracking/bouncetrackingprotection/test/browser/file_bounce.html187
1 files changed, 139 insertions, 48 deletions
diff --git a/toolkit/components/antitracking/bouncetrackingprotection/test/browser/file_bounce.html b/toolkit/components/antitracking/bouncetrackingprotection/test/browser/file_bounce.html
index 2756555fa5..d7aa117481 100644
--- a/toolkit/components/antitracking/bouncetrackingprotection/test/browser/file_bounce.html
+++ b/toolkit/components/antitracking/bouncetrackingprotection/test/browser/file_bounce.html
@@ -1,59 +1,150 @@
<!DOCTYPE html>
<html>
- <head>
- <meta charset="utf-8" />
- <meta http-equiv="X-UA-Compatible" content="IE=edge" />
- <title>Bounce!</title>
- <meta name="viewport" content="width=device-width, initial-scale=1" />
- </head>
- <body>
- <p>Nothing to see here...</p>
- <script>
- // Wrap the entire block so we can run async code.
- (async () => {
- let url = new URL(location.href);
-
- let redirectDelay = url.searchParams.get("redirectDelay");
- if(redirectDelay != null) {
- redirectDelay = Number.parseInt(redirectDelay);
- } else {
- redirectDelay = 50;
- }
+<head>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+ <title>Bounce!</title>
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
+</head>
+
+<body>
+ <p id="test-config"></p>
+ <script>
+ const SET_STATE_HANDLERS = {
+ "cookie-client": setCookie,
+ "localStorage": setLocalStorage,
+ "indexedDB": setIndexedDB,
+ };
+
+ function setCookie(id) {
+ let cookie = document.cookie;
+ if (cookie) {
+ console.info("Received cookie", cookie);
+ } else {
+ let newCookie = `id=${id}`;
+ console.info("Setting new cookie", newCookie);
+ document.cookie = newCookie;
+ }
+ }
+
+ function setLocalStorage(id) {
+ let entry = localStorage.getItem("id");
+ if (entry) {
+ console.info("Found localStorage entry. id", entry);
+ } else {
+ console.info("Setting new localStorage entry. id", id);
+ localStorage.setItem(id, id);
+ }
+ }
+
+ function setIndexedDB() {
+ return new Promise((resolve, reject) => {
+ let request = window.indexedDB.open("bounce", 1);
+ request.onsuccess = () => {
+ console.info("Opened indexedDB");
+ resolve()
+ };
+ request.onerror = (event) => {
+ console.error("Error opening indexedDB", event);
+ reject();
+ };
+ request.onupgradeneeded = (event) => {
+ console.info("Initializing indexedDB");
+ let db = event.target.result;
+ db.createObjectStore("bounce");
+ };
+ });
+ }
+
+ function setIndexedDBInWorker(nested = false) {
+ let worker = new Worker("file_web_worker.js");
+ let msg = nested ? "setIndexedDBNested" : "setIndexedDB";
+ worker.postMessage(msg);
+ return new Promise((resolve, reject) => {
+ worker.onmessage = () => {
+ console.info("IndexedDB set in worker");
+ resolve();
+ };
+ worker.onerror = (event) => {
+ console.error("Error setting indexedDB in worker", event);
+ reject();
+ };
+ });
+ }
+
+ /**
+ * Set a state in a child frame.
+ */
+ function setStateInFrame() {
+ // Embed self
+ let iframe = document.createElement("iframe");
+
+ let src = new URL(location.href);
+ // Remove search params we don't need for the iframe.
+ src.searchParams.delete("target");
+ src.searchParams.delete("redirectDelay");
+ src.searchParams.delete("setStateSameSiteFrame");
+ iframe.src = src.href;
+
+ let frameReadyPromise = new Promise((resolve) => {
+ iframe.addEventListener("load", () => {
+ iframe.contentWindow.readyPromise.then(resolve);
+ });
+ });
+ document.body.appendChild(iframe);
+
+ return frameReadyPromise;
+ }
+
+ // Wrap the entire block so we can run async code. Store the result in a
+ // promise so that parent windows can wait for us to be ready.
+ window.readyPromise = (async () => {
+ let url = new URL(location.href);
+ // Display the test config in the body.
+ document.getElementById("test-config").innerText = JSON.stringify(Object.fromEntries(url.searchParams), null, 2);
+
+ if (url.searchParams.get("setStateSameSiteFrame") === "true") {
+ // Set state in a child frame.
+ await setStateInFrame(url);
+ } else if(url.searchParams.get("setStateInWebWorker") === "true") {
+ // Set state in a worker.
+ await setIndexedDBInWorker();
+ } else if(url.searchParams.get("setStateInNestedWebWorker") === "true") {
+ // Set state in a nested worker.
+ await setIndexedDBInWorker(true);
+ } else {
+ // Set a state in this window.
let setState = url.searchParams.get("setState");
if (setState) {
let id = Math.random().toString();
- if (setState == "cookie-client") {
- let cookie = document.cookie;
-
- if (cookie) {
- console.info("Received cookie", cookie);
- } else {
- let newCookie = `id=${id}`;
- console.info("Setting new cookie", newCookie);
- document.cookie = newCookie;
- }
- } else if (setState == "localStorage") {
- let entry = localStorage.getItem("id");
-
- if (entry) {
- console.info("Found localStorage entry. id", entry);
- } else {
- console.info("Setting new localStorage entry. id", id);
- localStorage.setItem(id, id);
- }
+ let handler = SET_STATE_HANDLERS[setState];
+ if (!handler) {
+ throw new Error("Unknown state handler: " + setState);
}
+ await handler(id);
}
+ }
+
+ // Redirect to the target URL after a delay.
+ // If no target is specified, do nothing.
+ let redirectDelay = url.searchParams.get("redirectDelay");
+ if (redirectDelay != null) {
+ redirectDelay = Number.parseInt(redirectDelay);
+ } else {
+ redirectDelay = 50;
+ }
+
+ let target = url.searchParams.get("target");
+ if (target) {
+ console.info("Redirecting to", target);
+ setTimeout(() => {
+ location.href = target;
+ }, redirectDelay);
+ }
+ })();
+ </script>
+</body>
- let target = url.searchParams.get("target");
- if (target) {
- console.info("redirecting to", target);
- setTimeout(() => {
- location.href = target;
- }, redirectDelay);
- }
- })();
- </script>
- </body>
</html>