https://privacytests.org/ [8BlWzP790Y] PrivacyTests.org News About [s] [s] [s] No. 12 Open-source tests of web browser privacy. Updated 2022-01-07 Desktop browsers Desktop private modes iOS browsers Android browsers Nightly builds Nightly private modes = Passed privacy test = Failed privacy test -= No such feature Desktop Browsers [jqY] [xwG] [0Z] [] [nRL] [lVc] [Byk] [xdY] [BJX] [l] (click anywhere for more info) brave chrome edge firefox librewolf opera safari tor ungoogled vivaldi 1.34 97.0 97.0 95.0 95.0 82.0 15.1 11.0 96.0 5.0 State Partitioning testsA common vulnerability of web browsers is that they allow tracking companies to 'tag' your browser with some data ('state') that identifies you. When third-party trackers are embedded in websites, they can see this identifying data as you browse to different websites. Fortunately, it is possible for this category of leaks to be fixed by partitioning all data stored in the browser such that no data can be shared between websites. write: async () => { // Clear Alt-Svc caching first. let write: async () => { // Clear Alt-Svc caching first. let write: async () => { // Clear Alt-Svc caching first. let write: async () => { // Clear Alt-Svc caching first. let write: async () => { // Clear Alt-Svc caching first. let write: async () => { // Clear Alt-Svc caching first. let - write: async () => { // Clear Alt-Svc caching first. let write: async () => { // Clear Alt-Svc caching first. let write: async () => { // Clear Alt-Svc caching first. let responseText = ""; for (let i = 0; i < 10 && responseText !== responseText = ""; for (let i = 0; i < 10 && responseText !== responseText = ""; for (let i = 0; i < 10 && responseText !== responseText = ""; for (let i = 0; i < 10 && responseText !== responseText = ""; for (let i = 0; i < 10 && responseText !== responseText = ""; for (let i = 0; i < 10 && responseText !== responseText = ""; for (let i = 0; i < 10 && responseText !== - write: async () => { // Clear Alt-Svc caching first. let responseText = ""; for (let i = 0; i < 10 && responseText !== responseText = ""; for (let i = 0; i < 10 && responseText !== "h2"; ++i) { responseText = await fetchText("https:// "h2"; ++i) { responseText = await fetchText("https:// "h2"; ++i) { responseText = await fetchText("https:// "h2"; ++i) { responseText = await fetchText("https:// "h2"; ++i) { responseText = await fetchText("https:// "h2"; ++i) { responseText = await fetchText("https:// "h2"; ++i) { responseText = await fetchText("https:// responseText = ""; for (let i = 0; i < 10 && responseText !== "h2"; "h2"; ++i) { responseText = await fetchText("https:// "h2"; ++i) { responseText = await fetchText("https:// h3.arthuredelstein.net:4433/clear"); console.log("clear", h3.arthuredelstein.net:4433/clear"); console.log("clear", h3.arthuredelstein.net:4433/clear"); console.log("clear", h3.arthuredelstein.net:4433/clear"); console.log("clear", h3.arthuredelstein.net:4433/clear"); console.log("clear", h3.arthuredelstein.net:4433/clear"); console.log("clear", h3.arthuredelstein.net:4433/clear"); console.log("clear", ++i) { responseText = await fetchText("https:// h3.arthuredelstein.net:4433/clear"); console.log("clear", h3.arthuredelstein.net:4433/clear"); console.log("clear", Alt-SvcAlt-Svc allows the responseText, i); await sleepMs(10); } if (responseText !== "h2") responseText, i); await sleepMs(10); } if (responseText !== "h2") responseText, i); await sleepMs(10); } if (responseText !== "h2") responseText, i); await sleepMs(10); } if (responseText !== "h2") responseText, i); await sleepMs(10); } if (responseText !== "h2") responseText, i); await sleepMs(10); } if (responseText !== "h2") responseText, i); await sleepMs(10); } if (responseText !== "h2") h3.arthuredelstein.net:4433/clear"); console.log("clear", responseText, i); await sleepMs(10); } if (responseText !== "h2") responseText, i); await sleepMs(10); } if (responseText !== "h2") server to indicate to the web { // Clearing failed. throw new Error("Unsupported"); } // Store { // Clearing failed. throw new Error("Unsupported"); } // Store { // Clearing failed. throw new Error("Unsupported"); } // Store { // Clearing failed. throw new Error("Unsupported"); } // Store { // Clearing failed. throw new Error("Unsupported"); } // Store { // Clearing failed. throw new Error("Unsupported"); } // Store { // Clearing failed. throw new Error("Unsupported"); } // Store responseText, i); await sleepMs(10); } if (responseText !== "h2") { / { // Clearing failed. throw new Error("Unsupported"); } // Store { // Clearing failed. throw new Error("Unsupported"); } // Store browser that a resource should "h3" state in Alt-Svc cache for (let i = 0; i < 10 && "h3" state in Alt-Svc cache for (let i = 0; i < 10 && "h3" state in Alt-Svc cache for (let i = 0; i < 10 && "h3" state in Alt-Svc cache for (let i = 0; i < 10 && "h3" state in Alt-Svc cache for (let i = 0; i < 10 && "h3" state in Alt-Svc cache for (let i = 0; i < 10 && "h3" state in Alt-Svc cache for (let i = 0; i < 10 && / Clearing failed. throw new Error("Unsupported"); } // Store "h3" "h3" state in Alt-Svc cache for (let i = 0; i < 10 && "h3" state in Alt-Svc cache for (let i = 0; i < 10 && be loaded on a different responseText !== "h3"; ++i) { responseText = await fetchText responseText !== "h3"; ++i) { responseText = await fetchText responseText !== "h3"; ++i) { responseText = await fetchText responseText !== "h3"; ++i) { responseText = await fetchText responseText !== "h3"; ++i) { responseText = await fetchText responseText !== "h3"; ++i) { responseText = await fetchText responseText !== "h3"; ++i) { responseText = await fetchText state in Alt-Svc cache for (let i = 0; i < 10 && responseText !== responseText !== "h3"; ++i) { responseText = await fetchText responseText !== "h3"; ++i) { responseText = await fetchText server. Because this is a ("https://h3.arthuredelstein.net:4433/protocol"); console.log ("https://h3.arthuredelstein.net:4433/protocol"); console.log ("https://h3.arthuredelstein.net:4433/protocol"); console.log ("https://h3.arthuredelstein.net:4433/protocol"); console.log ("https://h3.arthuredelstein.net:4433/protocol"); console.log ("https://h3.arthuredelstein.net:4433/protocol"); console.log ("https://h3.arthuredelstein.net:4433/protocol"); console.log "h3"; ++i) { responseText = await fetchText("https:// ("https://h3.arthuredelstein.net:4433/protocol"); console.log ("https://h3.arthuredelstein.net:4433/protocol"); console.log persistent setting, it could be ("protocol", responseText, i); await sleepMs(10); } if ("protocol", responseText, i); await sleepMs(10); } if ("protocol", responseText, i); await sleepMs(10); } if ("protocol", responseText, i); await sleepMs(10); } if ("protocol", responseText, i); await sleepMs(10); } if ("protocol", responseText, i); await sleepMs(10); } if ("protocol", responseText, i); await sleepMs(10); } if h3.arthuredelstein.net:4433/protocol"); console.log("protocol", ("protocol", responseText, i); await sleepMs(10); } if ("protocol", responseText, i); await sleepMs(10); } if used to track users across (responseText !== "h3") { // Storage failed. throw new Error (responseText !== "h3") { // Storage failed. throw new Error (responseText !== "h3") { // Storage failed. throw new Error (responseText !== "h3") { // Storage failed. throw new Error (responseText !== "h3") { // Storage failed. throw new Error (responseText !== "h3") { // Storage failed. throw new Error (responseText !== "h3") { // Storage failed. throw new Error responseText, i); await sleepMs(10); } if (responseText !== "h3") { / (responseText !== "h3") { // Storage failed. throw new Error (responseText !== "h3") { // Storage failed. throw new Error websites if it is not correctly ("Unsupported"); } } read: () => fetchText("https:// ("Unsupported"); } } read: () => fetchText("https:// ("Unsupported"); } } read: () => fetchText("https:// ("Unsupported"); } } read: () => fetchText("https:// ("Unsupported"); } } read: () => fetchText("https:// ("Unsupported"); } } read: () => fetchText("https:// ("Unsupported"); } } read: () => fetchText("https:// / Storage failed. throw new Error("Unsupported"); } } read: () => ("Unsupported"); } } read: () => fetchText("https:// ("Unsupported"); } } read: () => fetchText("https:// partitioned. h3.arthuredelstein.net:4433/protocol") result, same first party: h3.arthuredelstein.net:4433/protocol") result, same first party: h3.arthuredelstein.net:4433/protocol") result, same first party: h3.arthuredelstein.net:4433/protocol") result, same first party: h3.arthuredelstein.net:4433/protocol") result, same first party: h3.arthuredelstein.net:4433/protocol") result, same first party: h3.arthuredelstein.net:4433/protocol") result, same first party: fetchText("https://h3.arthuredelstein.net:4433/protocol") result, h3.arthuredelstein.net:4433/protocol") result, same first party: h3.arthuredelstein.net:4433/protocol") result, same first party: h3, h3, h3, h3, h3 result, different first party: h2, h2, h2, h2, h3, h3, h3, h3, h3 result, different first party: h3, h3, h3, h3, h3, h3, h3 result, different first party: h3, h3, h3 unsupported: h3, h3, h3, h3, h3 result, different first party: h2, h2, h2, h2, h3, h3, h3, h3, h3 result, different first party: h2, h2, h2, h2, h3, h3, h3, h3, h3 result, different first party: h3, h3, h3, h3, h2, h2, h2, h2, h2 result, different first party: h2, h2, h2, h2, same first party: h2, h2, h2, h2, h2 result, different first party: h3, h3, h3, h3, h3 result, different first party: h3, h3, h3, h3, h3, h2, h3, h3, h3 result, different first party: h3, h3, h3, h3, h2 unsupported: false, false, false, false, false passed: true, h3 unsupported: false, false, false, false, false passed: false, false, false, false passed: false, false, false test failed: h2 unsupported: false, false, false, false, false passed: true, h2 unsupported: false, false, false, false, false passed: true, h3 unsupported: false, false, false, false, false passed: false, h2 unsupported: true, true, true, true, true passed: undefined h2, h2, h2, h2, h2 unsupported: true, true, true, true, true passed: h3 unsupported: false, false, false, false, false passed: false, h3 unsupported: false, false, false, false, false passed: false, true, true, true, true test failed: false, false, false, false, false, false, false, false test failed: false, false, false, false, false, false true, true, true, true test failed: false, false, false, false, true, true, true, true test failed: false, false, false, false, false, false, false, false test failed: false, false, false, test failed: false, false, false, false, false undefined test failed: false, false, false, false, false false, false, false, false test failed: false, false, false, true, false, false, false test failed: false, false, false, false false, false false false false, false false, false false, false write: (secret) => { try { let blobURL = URL.createObjectURL write: (secret) => { try { let blobURL = URL.createObjectURL write: (secret) => { try { let blobURL = URL.createObjectURL write: (secret) => { try { let blobURL = URL.createObjectURL write: (secret) => { try { let blobURL = URL.createObjectURL write: (secret) => { try { let blobURL = URL.createObjectURL write: (secret) => { try { let blobURL = URL.createObjectURL(new write: (secret) => { try { let blobURL = URL.createObjectURL write: (secret) => { try { let blobURL = URL.createObjectURL (new Blob([secret])); fetch(`${baseURI}/blob?mode=write&key=$ (new Blob([secret])); fetch(`${baseURI}/blob?mode=write&key=$ (new Blob([secret])); fetch(`${baseURI}/blob?mode=write&key=$ (new Blob([secret])); fetch(`${baseURI}/blob?mode=write&key=$ (new Blob([secret])); fetch(`${baseURI}/blob?mode=write&key=$ (new Blob([secret])); fetch(`${baseURI}/blob?mode=write&key=$ Blob([secret])); fetch(`${baseURI}/blob?mode=write&key=${secret}& (new Blob([secret])); fetch(`${baseURI}/blob?mode=write&key=$ (new Blob([secret])); fetch(`${baseURI}/blob?mode=write&key=$ {secret}&blobUrl=${encodeURIComponent(blobURL)}`); } catch (e) { {secret}&blobUrl=${encodeURIComponent(blobURL)}`); } catch (e) { write: (secret) => { try { let blobURL = URL.createObjectURL {secret}&blobUrl=${encodeURIComponent(blobURL)}`); } catch (e) { {secret}&blobUrl=${encodeURIComponent(blobURL)}`); } catch (e) { {secret}&blobUrl=${encodeURIComponent(blobURL)}`); } catch (e) { {secret}&blobUrl=${encodeURIComponent(blobURL)}`); } catch (e) { blobUrl=${encodeURIComponent(blobURL)}`); } catch (e) { throw new {secret}&blobUrl=${encodeURIComponent(blobURL)}`); } catch (e) { {secret}&blobUrl=${encodeURIComponent(blobURL)}`); } catch (e) { throw new Error("Unsupported"); } } read: async (secret) => { let throw new Error("Unsupported"); } } read: async (secret) => { let (new Blob([secret])); fetch(`${baseURI}/blob?mode=write&key=$ throw new Error("Unsupported"); } } read: async (secret) => { let throw new Error("Unsupported"); } } read: async (secret) => { let throw new Error("Unsupported"); } } read: async (secret) => { let throw new Error("Unsupported"); } } read: async (secret) => { let Error("Unsupported"); } } read: async (secret) => { let response = throw new Error("Unsupported"); } } read: async (secret) => { let throw new Error("Unsupported"); } } read: async (secret) => { let response = await fetch(`${baseURI}/blob?mode=read&key=${secret} response = await fetch(`${baseURI}/blob?mode=read&key=${secret} {secret}&blobUrl=${encodeURIComponent(blobURL)}`); } catch (e) { response = await fetch(`${baseURI}/blob?mode=read&key=${secret} response = await fetch(`${baseURI}/blob?mode=read&key=${secret} response = await fetch(`${baseURI}/blob?mode=read&key=${secret} response = await fetch(`${baseURI}/blob?mode=read&key=${secret} await fetch(`${baseURI}/blob?mode=read&key=${secret}`); let result = response = await fetch(`${baseURI}/blob?mode=read&key=${secret} response = await fetch(`${baseURI}/blob?mode=read&key=${secret} `); let result = await response.json(); let blobUrl = `); let result = await response.json(); let blobUrl = throw new Error("Unsupported"); } } read: async (secret) => { let `); let result = await response.json(); let blobUrl = `); let result = await response.json(); let blobUrl = `); let result = await response.json(); let blobUrl = `); let result = await response.json(); let blobUrl = await response.json(); let blobUrl = decodeURIComponent `); let result = await response.json(); let blobUrl = `); let result = await response.json(); let blobUrl = decodeURIComponent(result.blobUrl); let blobResponse = await decodeURIComponent(result.blobUrl); let blobResponse = await response = await fetch(`${baseURI}/blob?mode=read&key=${secret} decodeURIComponent(result.blobUrl); let blobResponse = await decodeURIComponent(result.blobUrl); let blobResponse = await decodeURIComponent(result.blobUrl); let blobResponse = await decodeURIComponent(result.blobUrl); let blobResponse = await (result.blobUrl); let blobResponse = await fetch(blobUrl); return decodeURIComponent(result.blobUrl); let blobResponse = await decodeURIComponent(result.blobUrl); let blobResponse = await fetch(blobUrl); return blobResponse.text(); } result, same first fetch(blobUrl); return blobResponse.text(); } result, same first `); let result = await response.json(); let blobUrl = fetch(blobUrl); return blobResponse.text(); } result, same first fetch(blobUrl); return blobResponse.text(); } result, same first fetch(blobUrl); return blobResponse.text(); } result, same first fetch(blobUrl); return blobResponse.text(); } result, same first blobResponse.text(); } result, same first party: fetch(blobUrl); return blobResponse.text(); } result, same first fetch(blobUrl); return blobResponse.text(); } result, same first blobA 'blob URL' is a local party: fb9ada0c-2dd5-445b-8766-6a96ede1d675, party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, decodeURIComponent(result.blobUrl); let blobResponse = await party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, party: ccf7b60c-0a34-4542-9d4a-dc6388ae2f2c, party: a631e40c-7719-47f9-9802-2d54a24d3d01, party: 109e075c-f3af-43a0-9f3e-031a5a3c3dc0, fda373cd-c540-4d8a-b1d2-06344b686d10, party: abf0475f-b7ff-41d5-9465-e439243ec199, party: b51acfca-da9f-4c94-8276-65083891df3f, reference to some raw data. 5755b44c-4043-49c5-9206-d69be4536a7b, 31409229-bd59-4c8e-a3b9-b3f1c1278a43, fetch(blobUrl); return blobResponse.text(); } result, same first 9d820b16-d670-40c0-ac68-50e242ed5b70, 435c28c6-4255-4bfe-a586-84fa6938e442, ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, 281040ec-68e0-4834-bce0-775462672325, 7af1be6c-dfff-4a41-b0e8-fdc94d5164a8, 3aefe95d-2acc-4dfb-9a93-8b362330a688, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, Trackers can use a blob URL to e1f98084-6527-424b-b09f-a5c0cda014fb, 08ee6f87-c109-44fc-8a01-1a1964a172b4, party: 921ea021-85bd-45d2-bffe-067d18811194, 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, ac90c185-5b06-43e2-a37f-c59529ed65a2, af3ecf84-528b-4dd2-a9f3-00652230e6a7, 93238fef-2cc4-48e2-beff-c65dd121e26f, e964f137-cacb-41e9-b414-cee17a19af1c, 65973ddf-fd4e-4666-b27f-d532e47a75d5, bbbf41aa-2879-425c-97de-177dfdd94789, share data between websites. 8eb1e74b-357b-4308-a912-1888453d9111, 16170eca-5e29-4992-831e-d526ddefdcc1, ecc64992-4894-4432-94ed-c2e1822cf985, a78bfa05-b279-4e1b-9a07-11354b649bd8, 7f1ad153-7218-42f6-8c33-76b666e5857e, fa675d16-3a4d-4470-84ae-e81f2daffbad, e106a814-bc1a-422c-8d7a-92533f552b60, 9a200a7b-cdb4-4525-b2a3-1fb3a4d43da2, 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, 20f1c1dc-74b4-4591-85ff-09418a0a1c40, 4f7a9ad6-187c-4caf-b184-d18908436921 result, different first d0cc9018-3bbe-4276-a7d4-68189dece8b5 result, different first bd96efb2-a858-4732-9376-9ea9890e4cbc result, different first fd7aa2af-8986-47a6-a043-c0a9bfdbd609 result, different first 378a0c14-2649-4b3a-93e4-94f5a06a3409 result, different first c3a50072-0d81-4da7-b5dc-642b7f6317b4 result, different first da3d7e80-1c90-4750-b247-c5517c117d59 result, different first f75ddab3-8f21-4547-a3ad-58db5cbc1900 result, different first party: 95783e57-aee7-4a73-a645-c6cc2d995cf7 result, different first d88860c2-282f-471a-82ed-861ef21d1e9b result, different first party: fb9ada0c-2dd5-445b-8766-6a96ede1d675, party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, party: 921ea021-85bd-45d2-bffe-067d18811194, party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, party: ccf7b60c-0a34-4542-9d4a-dc6388ae2f2c, party: a631e40c-7719-47f9-9802-2d54a24d3d01, party: 109e075c-f3af-43a0-9f3e-031a5a3c3dc0, Error: NetworkError when attempting to fetch resource., Error: party: abf0475f-b7ff-41d5-9465-e439243ec199, party: b51acfca-da9f-4c94-8276-65083891df3f, 5755b44c-4043-49c5-9206-d69be4536a7b, 31409229-bd59-4c8e-a3b9-b3f1c1278a43, ecc64992-4894-4432-94ed-c2e1822cf985, 9d820b16-d670-40c0-ac68-50e242ed5b70, 435c28c6-4255-4bfe-a586-84fa6938e442, ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, 281040ec-68e0-4834-bce0-775462672325, NetworkError when attempting to fetch resource., Error: NetworkError 3aefe95d-2acc-4dfb-9a93-8b362330a688, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, e1f98084-6527-424b-b09f-a5c0cda014fb, 08ee6f87-c109-44fc-8a01-1a1964a172b4, bd96efb2-a858-4732-9376-9ea9890e4cbc unsupported: false, false, 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, ac90c185-5b06-43e2-a37f-c59529ed65a2, af3ecf84-528b-4dd2-a9f3-00652230e6a7, 93238fef-2cc4-48e2-beff-c65dd121e26f, when attempting to fetch resource., Error: NetworkError when 65973ddf-fd4e-4666-b27f-d532e47a75d5, bbbf41aa-2879-425c-97de-177dfdd94789, 8eb1e74b-357b-4308-a912-1888453d9111, 16170eca-5e29-4992-831e-d526ddefdcc1, false passed: false, false, false test failed: false, false, a78bfa05-b279-4e1b-9a07-11354b649bd8, 7f1ad153-7218-42f6-8c33-76b666e5857e, fa675d16-3a4d-4470-84ae-e81f2daffbad, e106a814-bc1a-422c-8d7a-92533f552b60, attempting to fetch resource., Error: NetworkError when attempting to 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, 20f1c1dc-74b4-4591-85ff-09418a0a1c40, 4f7a9ad6-187c-4caf-b184-d18908436921 unsupported: false, false, d0cc9018-3bbe-4276-a7d4-68189dece8b5 unsupported: false, false, false fd7aa2af-8986-47a6-a043-c0a9bfdbd609 unsupported: false, false, 378a0c14-2649-4b3a-93e4-94f5a06a3409 unsupported: false, false, c3a50072-0d81-4da7-b5dc-642b7f6317b4 unsupported: false, false, da3d7e80-1c90-4750-b247-c5517c117d59 unsupported: false, false, fetch resource. unsupported: false, false, false, false, false 95783e57-aee7-4a73-a645-c6cc2d995cf7 unsupported: false, false, d88860c2-282f-471a-82ed-861ef21d1e9b unsupported: false, false, false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false passed: true, true, true, true, true test failed: false, false, false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false write: (secret) => { try { let bc = new BroadcastChannel write: (secret) => { try { let bc = new BroadcastChannel write: (secret) => { try { let bc = new BroadcastChannel write: (secret) => { try { let bc = new BroadcastChannel write: (secret) => { try { let bc = new BroadcastChannel write: (secret) => { try { let bc = new BroadcastChannel write: (secret) => { try { let bc = new BroadcastChannel ("secrets"); bc.onmessage = (event) => { if (event.data === ("secrets"); bc.onmessage = (event) => { if (event.data === ("secrets"); bc.onmessage = (event) => { if (event.data === ("secrets"); bc.onmessage = (event) => { if (event.data === ("secrets"); bc.onmessage = (event) => { if (event.data === - write: (secret) => { try { let bc = new BroadcastChannel write: (secret) => { try { let bc = new BroadcastChannel ("secrets"); bc.onmessage = (event) => { if (event.data === ("secrets"); bc.onmessage = (event) => { if (event.data === "request") { bc.postMessage(secret); } }; } catch (e) { throw new "request") { bc.postMessage(secret); } }; } catch (e) { throw new write: (secret) => { try { let bc = new BroadcastChannel "request") { bc.postMessage(secret); } }; } catch (e) { throw new "request") { bc.postMessage(secret); } }; } catch (e) { throw new "request") { bc.postMessage(secret); } }; } catch (e) { throw new ("secrets"); bc.onmessage = (event) => { if (event.data === ("secrets"); bc.onmessage = (event) => { if (event.data === "request") { bc.postMessage(secret); } }; } catch (e) { throw new "request") { bc.postMessage(secret); } }; } catch (e) { throw new Error("Unsupported"); } } read: () => new Promise((resolve, Error("Unsupported"); } } read: () => new Promise((resolve, ("secrets"); bc.onmessage = (event) => { if (event.data === Error("Unsupported"); } } read: () => new Promise((resolve, Error("Unsupported"); } } read: () => new Promise((resolve, Error("Unsupported"); } } read: () => new Promise((resolve, "request") { bc.postMessage(secret); } }; } catch (e) { throw new "request") { bc.postMessage(secret); } }; } catch (e) { throw new Error("Unsupported"); } } read: () => new Promise((resolve, Error("Unsupported"); } } read: () => new Promise((resolve, reject) => { let bc = new BroadcastChannel("secrets"); reject) => { let bc = new BroadcastChannel("secrets"); "request") { bc.postMessage(secret); } }; } catch (e) { throw new reject) => { let bc = new BroadcastChannel("secrets"); reject) => { let bc = new BroadcastChannel("secrets"); reject) => { let bc = new BroadcastChannel("secrets"); Error("Unsupported"); } } read: () => new Promise((resolve, Error("Unsupported"); } } read: () => new Promise((resolve, reject) reject) => { let bc = new BroadcastChannel("secrets"); reject) => { let bc = new BroadcastChannel("secrets"); bc.onmessage = (event) => { if (event.data !== "request") { bc.onmessage = (event) => { if (event.data !== "request") { Error("Unsupported"); } } read: () => new Promise((resolve, bc.onmessage = (event) => { if (event.data !== "request") { bc.onmessage = (event) => { if (event.data !== "request") { bc.onmessage = (event) => { if (event.data !== "request") { reject) => { let bc = new BroadcastChannel("secrets"); => { let bc = new BroadcastChannel("secrets"); bc.onmessage = (event) bc.onmessage = (event) => { if (event.data !== "request") { bc.onmessage = (event) => { if (event.data !== "request") { resolve(event.data); } }; bc.postMessage("request"); setTimeout resolve(event.data); } }; bc.postMessage("request"); setTimeout reject) => { let bc = new BroadcastChannel("secrets"); resolve(event.data); } }; bc.postMessage("request"); setTimeout resolve(event.data); } }; bc.postMessage("request"); setTimeout resolve(event.data); } }; bc.postMessage("request"); setTimeout bc.onmessage = (event) => { if (event.data !== "request") { => { if (event.data !== "request") { resolve(event.data); } }; resolve(event.data); } }; bc.postMessage("request"); setTimeout resolve(event.data); } }; bc.postMessage("request"); setTimeout BroadcastChannelA (() => reject({message: "no BroadcastChannel message"}), 3000); (() => reject({message: "no BroadcastChannel message"}), 3000); bc.onmessage = (event) => { if (event.data !== "request") { (() => reject({message: "no BroadcastChannel message"}), 3000); (() => reject({message: "no BroadcastChannel message"}), 3000); (() => reject({message: "no BroadcastChannel message"}), 3000); resolve(event.data); } }; bc.postMessage("request"); setTimeout bc.postMessage("request"); setTimeout(() => reject({message: "no (() => reject({message: "no BroadcastChannel message"}), 3000); (() => reject({message: "no BroadcastChannel message"}), 3000); BroadcastChannel is designed to }) result, same first party: }) result, same first party: resolve(event.data); } }; bc.postMessage("request"); setTimeout }) result, same first party: }) result, same first party: }) result, same first party: (() => reject({message: "no BroadcastChannel message"}), 3000); BroadcastChannel message"}), 3000); }) result, same first party: }) result, same first party: }) result, same first party: send messages between tabs. In fb9ada0c-2dd5-445b-8766-6a96ede1d675, 60d9cae6-595e-4a6b-952e-67d678e4f68b, (() => reject({message: "no BroadcastChannel message"}), 3000); 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, ccf7b60c-0a34-4542-9d4a-dc6388ae2f2c, a631e40c-7719-47f9-9802-2d54a24d3d01, }) result, same first party: Error: Can't find variable: fda373cd-c540-4d8a-b1d2-06344b686d10, abf0475f-b7ff-41d5-9465-e439243ec199, b51acfca-da9f-4c94-8276-65083891df3f, some browsers it can be used 5755b44c-4043-49c5-9206-d69be4536a7b, 31409229-bd59-4c8e-a3b9-b3f1c1278a43, }) result, same first party: 9d820b16-d670-40c0-ac68-50e242ed5b70, 435c28c6-4255-4bfe-a586-84fa6938e442, ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, BroadcastChannel, Error: Can't find variable: BroadcastChannel, 7af1be6c-dfff-4a41-b0e8-fdc94d5164a8, 3aefe95d-2acc-4dfb-9a93-8b362330a688, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, for cross-site communication e1f98084-6527-424b-b09f-a5c0cda014fb, 08ee6f87-c109-44fc-8a01-1a1964a172b4, 921ea021-85bd-45d2-bffe-067d18811194, 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, ac90c185-5b06-43e2-a37f-c59529ed65a2, af3ecf84-528b-4dd2-a9f3-00652230e6a7, Error: Can't find variable: BroadcastChannel, Error: Can't find e964f137-cacb-41e9-b414-cee17a19af1c, 65973ddf-fd4e-4666-b27f-d532e47a75d5, bbbf41aa-2879-425c-97de-177dfdd94789, and tracking. 8eb1e74b-357b-4308-a912-1888453d9111, 16170eca-5e29-4992-831e-d526ddefdcc1, ecc64992-4894-4432-94ed-c2e1822cf985, a78bfa05-b279-4e1b-9a07-11354b649bd8, 7f1ad153-7218-42f6-8c33-76b666e5857e, fa675d16-3a4d-4470-84ae-e81f2daffbad, variable: BroadcastChannel, Error: Can't find variable: 9a200a7b-cdb4-4525-b2a3-1fb3a4d43da2, 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, 20f1c1dc-74b4-4591-85ff-09418a0a1c40, 4f7a9ad6-187c-4caf-b184-d18908436921 result, different first d0cc9018-3bbe-4276-a7d4-68189dece8b5 result, different first bd96efb2-a858-4732-9376-9ea9890e4cbc result, different first fd7aa2af-8986-47a6-a043-c0a9bfdbd609 result, different first 378a0c14-2649-4b3a-93e4-94f5a06a3409 result, different first c3a50072-0d81-4da7-b5dc-642b7f6317b4 result, different first BroadcastChannel result, different first party: Error: Can't find f75ddab3-8f21-4547-a3ad-58db5cbc1900 result, different first party: 95783e57-aee7-4a73-a645-c6cc2d995cf7 result, different first d88860c2-282f-471a-82ed-861ef21d1e9b result, different first party: Error: no BroadcastChannel message, Error: no party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, party: 921ea021-85bd-45d2-bffe-067d18811194, party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, party: Error: no BroadcastChannel message, Error: no party: a631e40c-7719-47f9-9802-2d54a24d3d01, variable: BroadcastChannel, Error: Can't find variable: Error: The operation is insecure., Error: The operation is insecure., party: abf0475f-b7ff-41d5-9465-e439243ec199, party: b51acfca-da9f-4c94-8276-65083891df3f, BroadcastChannel message, Error: no BroadcastChannel message, 31409229-bd59-4c8e-a3b9-b3f1c1278a43, ecc64992-4894-4432-94ed-c2e1822cf985, 9d820b16-d670-40c0-ac68-50e242ed5b70, BroadcastChannel message, Error: no BroadcastChannel message, ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, BroadcastChannel, Error: Can't find variable: BroadcastChannel, Error: The operation is insecure., Error: The operation is insecure., 3aefe95d-2acc-4dfb-9a93-8b362330a688, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, Error: no BroadcastChannel message, Error: no BroadcastChannel 08ee6f87-c109-44fc-8a01-1a1964a172b4, bd96efb2-a858-4732-9376-9ea9890e4cbc unsupported: false, false, 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, Error: no BroadcastChannel message, Error: no BroadcastChannel af3ecf84-528b-4dd2-a9f3-00652230e6a7, Error: Can't find variable: BroadcastChannel, Error: Can't find Error: The operation is insecure. unsupported: false, false, false, 65973ddf-fd4e-4666-b27f-d532e47a75d5, bbbf41aa-2879-425c-97de-177dfdd94789, message unsupported: false, false, false, false, false passed: 16170eca-5e29-4992-831e-d526ddefdcc1, false passed: false, false, false test failed: false, false, a78bfa05-b279-4e1b-9a07-11354b649bd8, message unsupported: false, false, false, false, false passed: fa675d16-3a4d-4470-84ae-e81f2daffbad, variable: BroadcastChannel unsupported: true, true, true, true, false, false passed: true, true, true, true, true test failed: false, 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, 20f1c1dc-74b4-4591-85ff-09418a0a1c40, true, true, true, true, true test failed: false, false, false, d0cc9018-3bbe-4276-a7d4-68189dece8b5 unsupported: false, false, false fd7aa2af-8986-47a6-a043-c0a9bfdbd609 unsupported: false, false, true, true, true, true, true test failed: false, false, false, c3a50072-0d81-4da7-b5dc-642b7f6317b4 unsupported: false, false, true passed: undefined test failed: false, false, false, false, false, false, false, false 95783e57-aee7-4a73-a645-c6cc2d995cf7 unsupported: false, false, d88860c2-282f-471a-82ed-861ef21d1e9b unsupported: false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false false, false, false passed: false, false, false, false, false false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false write: async (key) => { try { let cache = await caches.open write: async (key) => { try { let cache = await caches.open write: async (key) => { try { let cache = await caches.open ("supercookies"); cache.addAll([`test.css?key=${key}`]); } catch write: async (key) => { try { let cache = await caches.open write: async (key) => { try { let cache = await caches.open write: async (key) => { try { let cache = await caches.open ("supercookies"); cache.addAll([`test.css?key=${key}`]); } catch ("supercookies"); cache.addAll([`test.css?key=${key}`]); } catch (e) { throw new Error("Unsupported"); } } read: async () => { let ("supercookies"); cache.addAll([`test.css?key=${key}`]); } catch ("supercookies"); cache.addAll([`test.css?key=${key}`]); } catch ("supercookies"); cache.addAll([`test.css?key=${key}`]); } catch (e) { throw new Error("Unsupported"); } } read: async () => { let (e) { throw new Error("Unsupported"); } } read: async () => { let cache = await caches.open("supercookies"); let cacheKeys = await (e) { throw new Error("Unsupported"); } } read: async () => { let (e) { throw new Error("Unsupported"); } } read: async () => { let (e) { throw new Error("Unsupported"); } } read: async () => { let cache = await caches.open("supercookies"); let cacheKeys = await - write: async (key) => { try { let cache = await caches.open cache = await caches.open("supercookies"); let cacheKeys = await cache.keys(); let url = cacheKeys[0].url; return (new URL cache = await caches.open("supercookies"); let cacheKeys = await cache = await caches.open("supercookies"); let cacheKeys = await cache = await caches.open("supercookies"); let cacheKeys = await write: async (key) => { try { let cache = await caches.open cache.keys(); let url = cacheKeys[0].url; return (new URL ("supercookies"); cache.addAll([`test.css?key=${key}`]); } catch (e) cache.keys(); let url = cacheKeys[0].url; return (new URL write: async (key) => { try { let cache = await caches.open (url)).searchParams.get("key"); } result, same first party: cache.keys(); let url = cacheKeys[0].url; return (new URL write: async (key) => { try { let cache = await caches.open cache.keys(); let url = cacheKeys[0].url; return (new URL cache.keys(); let url = cacheKeys[0].url; return (new URL ("supercookies"); cache.addAll([`test.css?key=${key}`]); } catch (url)).searchParams.get("key"); } result, same first party: { throw new Error("Unsupported"); } } read: async () => { let cache = (url)).searchParams.get("key"); } result, same first party: ("supercookies"); cache.addAll([`test.css?key=${key}`]); } catch CacheStorageThe Cache API is a 58069814-89fe-4628-9bba-ae01813fb084, (url)).searchParams.get("key"); } result, same first party: ("supercookies"); cache.addAll([`test.css?key=${key}`]); } catch (url)).searchParams.get("key"); } result, same first party: (url)).searchParams.get("key"); } result, same first party: (e) { throw new Error("Unsupported"); } } read: async () => { let 109e075c-f3af-43a0-9f3e-031a5a3c3dc0, await caches.open("supercookies"); let cacheKeys = await cache.keys abf0475f-b7ff-41d5-9465-e439243ec199, (e) { throw new Error("Unsupported"); } } read: async () => { let content storage mechanism 58069814-89fe-4628-9bba-ae01813fb084, c4e33abc-5116-480b-bfa7-3e3915dd7adb, (e) { throw new Error("Unsupported"); } } read: async () => { let 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, ccf7b60c-0a34-4542-9d4a-dc6388ae2f2c, cache = await caches.open("supercookies"); let cacheKeys = await 281040ec-68e0-4834-bce0-775462672325, (); let url = cacheKeys[0].url; return (new URL 3aefe95d-2acc-4dfb-9a93-8b362330a688, cache = await caches.open("supercookies"); let cacheKeys = await originally introduced to 58069814-89fe-4628-9bba-ae01813fb084, c4e33abc-5116-480b-bfa7-3e3915dd7adb, cache = await caches.open("supercookies"); let cacheKeys = await 9d820b16-d670-40c0-ac68-50e242ed5b70, 435c28c6-4255-4bfe-a586-84fa6938e442, cache.keys(); let url = cacheKeys[0].url; return (new URL 93238fef-2cc4-48e2-beff-c65dd121e26f, (url)).searchParams.get("key"); } result, same first party: Error: 65973ddf-fd4e-4666-b27f-d532e47a75d5, cache.keys(); let url = cacheKeys[0].url; return (new URL support ServiceWorkers. If the 58069814-89fe-4628-9bba-ae01813fb084, c4e33abc-5116-480b-bfa7-3e3915dd7adb, cache.keys(); let url = cacheKeys[0].url; return (new URL 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, ac90c185-5b06-43e2-a37f-c59529ed65a2, (url)).searchParams.get("key"); } result, same first party: e106a814-bc1a-422c-8d7a-92533f552b60, The operation is insecure., Error: The operation is insecure., Error: 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, (url)).searchParams.get("key"); } result, same first party: same Cache object is accessible 58069814-89fe-4628-9bba-ae01813fb084 result, different first c4e33abc-5116-480b-bfa7-3e3915dd7adb, (url)).searchParams.get("key"); } result, same first party: a78bfa05-b279-4e1b-9a07-11354b649bd8, 7f1ad153-7218-42f6-8c33-76b666e5857e, 8847123413332609, 8847123413332609, 8847123413332609, da3d7e80-1c90-4750-b247-c5517c117d59 result, different first The operation is insecure., Error: The operation is insecure., Error: 95783e57-aee7-4a73-a645-c6cc2d995cf7 result, different first 6254449813902438, 6254449813902438, 6254449813902438, to multiple websites, it can be party: Error: An attempt was made to break through the security c4e33abc-5116-480b-bfa7-3e3915dd7adb result, different first 6046401262584151, 6046401262584151, 6046401262584151 result, fd7aa2af-8986-47a6-a043-c0a9bfdbd609 result, different first 378a0c14-2649-4b3a-93e4-94f5a06a3409 result, different first 8847123413332609, 8847123413332609 result, different first party: party: Error: undefined is not an object (evaluating 'cacheKeys The operation is insecure. result, different first party: Error: The party: Error: An attempt was made to break through the security 6254449813902438, 6254449813902438 result, different first party: abused to track users. policy of the user agent., Error: An attempt was made to break party: c4e33abc-5116-480b-bfa7-3e3915dd7adb, different first party: 6046401262584151, 6046401262584151, party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, party: Error: The operation is insecure., Error: The operation is 8847123413332609, 8847123413332609, 8847123413332609, [0].url'), Error: undefined is not an object (evaluating operation is insecure., Error: The operation is insecure., Error: The policy of the user agent., Error: An attempt was made to break 6254449813902438, 6254449813902438, 6254449813902438, through the security policy of the user agent., Error: An attempt c4e33abc-5116-480b-bfa7-3e3915dd7adb, 6046401262584151 unsupported: false, false, false passed: false, 9d820b16-d670-40c0-ac68-50e242ed5b70, insecure., Error: The operation is insecure., Error: The 8847123413332609, 8847123413332609 unsupported: false, false, 'cacheKeys[0].url'), Error: undefined is not an object operation is insecure., Error: The operation is insecure., Error: The through the security policy of the user agent., Error: An attempt 6254449813902438, 6254449813902438 unsupported: false, false, was made to break through the security policy of the user agent., c4e33abc-5116-480b-bfa7-3e3915dd7adb, false, false test failed: false, false, false 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, operation is insecure., Error: The operation is insecure. false, false, false passed: false, false, false, false, false (evaluating 'cacheKeys[0].url'), Error: undefined is not an operation is insecure. unsupported: true, true, true, true, true was made to break through the security policy of the user agent., false, false, false passed: false, false, false, false, false Error: An attempt was made to break through the security policy c4e33abc-5116-480b-bfa7-3e3915dd7adb, a78bfa05-b279-4e1b-9a07-11354b649bd8, unsupported: false, false, false, false, false passed: true, test failed: false, false, false, false, false object (evaluating 'cacheKeys[0].url'), Error: undefined is not passed: undefined test failed: false, false, false, false, false Error: An attempt was made to break through the security policy test failed: false, false, false, false, false of the user agent., Error: An attempt was made to break through c4e33abc-5116-480b-bfa7-3e3915dd7adb unsupported: false, false, fd7aa2af-8986-47a6-a043-c0a9bfdbd609 unsupported: false, false, true, true, true, true test failed: false, false, false, false, an object (evaluating 'cacheKeys[0].url') unsupported: false, of the user agent., Error: An attempt was made to break through the security policy of the user agent. unsupported: false, false, false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false false, false, false, false passed: true, true, true, true, true the security policy of the user agent. unsupported: false, false, false, false, false passed: true, true, true, true, true test test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false false, false, false passed: true, true, true, true, true test failed: false, false, false, false, false failed: false, false, false, false, false write: (secret) => { let expiry = new Date(); write: (secret) => { let expiry = new Date(); write: (secret) => { let expiry = new Date(); write: (secret) => { let expiry = new Date(); cookieThe cookie, first expiry.setFullYear(expiry.getFullYear() + 1); document.cookie = expiry.setFullYear(expiry.getFullYear() + 1); document.cookie = expiry.setFullYear(expiry.getFullYear() + 1); document.cookie = expiry.setFullYear(expiry.getFullYear() + 1); document.cookie = introduced by Netscape in 1994, write: (secret) => { let expiry = new Date(); `secret=${secret}; SameSite=None; Secure`; } read: () => write: (secret) => { let expiry = new Date(); `secret=${secret}; SameSite=None; Secure`; } read: () => write: (secret) => { let expiry = new Date(); `secret=${secret}; SameSite=None; Secure`; } read: () => write: (secret) => { let expiry = new Date(); write: (secret) => { let expiry = new Date(); expiry.setFullYear write: (secret) => { let expiry = new Date(); `secret=${secret}; SameSite=None; Secure`; } read: () => is a small amount of data expiry.setFullYear(expiry.getFullYear() + 1); document.cookie = document.cookie ? document.cookie.match(/secret=(\S+)/)[1] : null expiry.setFullYear(expiry.getFullYear() + 1); document.cookie = document.cookie ? document.cookie.match(/secret=(\S+)/)[1] : null expiry.setFullYear(expiry.getFullYear() + 1); document.cookie = document.cookie ? document.cookie.match(/secret=(\S+)/)[1] : null expiry.setFullYear(expiry.getFullYear() + 1); document.cookie = (expiry.getFullYear() + 1); document.cookie = `secret=${secret}; expiry.setFullYear(expiry.getFullYear() + 1); document.cookie = document.cookie ? document.cookie.match(/secret=(\S+)/)[1] : null stored by your browser on a `secret=${secret}; SameSite=None; Secure`; } read: () => result, same first party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, `secret=${secret}; SameSite=None; Secure`; } read: () => result, same first party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, `secret=${secret}; SameSite=None; Secure`; } read: () => result, same first party: a631e40c-7719-47f9-9802-2d54a24d3d01, `secret=${secret}; SameSite=None; Secure`; } read: () => SameSite=None; Secure`; } read: () => document.cookie ? `secret=${secret}; SameSite=None; Secure`; } read: () => result, same first party: b51acfca-da9f-4c94-8276-65083891df3f, website's behalf. It has document.cookie ? document.cookie.match(/secret=(\S+)/)[1] : null 31409229-bd59-4c8e-a3b9-b3f1c1278a43, document.cookie ? document.cookie.match(/secret=(\S+)/)[1] : null 9d820b16-d670-40c0-ac68-50e242ed5b70, document.cookie ? document.cookie.match(/secret=(\S+)/)[1] : null ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, document.cookie ? document.cookie.match(/secret=(\S+)/)[1] : null document.cookie.match(/secret=(\S+)/)[1] : null result, same first document.cookie ? document.cookie.match(/secret=(\S+)/)[1] : null f69e52b8-8ceb-419c-84ab-4beb4fd5714f, legitimate uses, but it is also result, same first party: fb9ada0c-2dd5-445b-8766-6a96ede1d675, 08ee6f87-c109-44fc-8a01-1a1964a172b4, result, same first party: 921ea021-85bd-45d2-bffe-067d18811194, 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, result, same first party: ccf7b60c-0a34-4542-9d4a-dc6388ae2f2c, af3ecf84-528b-4dd2-a9f3-00652230e6a7, result, same first party: 109e075c-f3af-43a0-9f3e-031a5a3c3dc0, party: fda373cd-c540-4d8a-b1d2-06344b686d10, result, same first party: abf0475f-b7ff-41d5-9465-e439243ec199, bbbf41aa-2879-425c-97de-177dfdd94789, the classic cross-site tracking 5755b44c-4043-49c5-9206-d69be4536a7b, 16170eca-5e29-4992-831e-d526ddefdcc1, ecc64992-4894-4432-94ed-c2e1822cf985, a78bfa05-b279-4e1b-9a07-11354b649bd8, 435c28c6-4255-4bfe-a586-84fa6938e442, fa675d16-3a4d-4470-84ae-e81f2daffbad, 281040ec-68e0-4834-bce0-775462672325, 7af1be6c-dfff-4a41-b0e8-fdc94d5164a8, 3aefe95d-2acc-4dfb-9a93-8b362330a688, 20f1c1dc-74b4-4591-85ff-09418a0a1c40, mechanism, and today still the e1f98084-6527-424b-b09f-a5c0cda014fb, d0cc9018-3bbe-4276-a7d4-68189dece8b5 result, different first bd96efb2-a858-4732-9376-9ea9890e4cbc result, different first fd7aa2af-8986-47a6-a043-c0a9bfdbd609 result, different first ac90c185-5b06-43e2-a37f-c59529ed65a2, c3a50072-0d81-4da7-b5dc-642b7f6317b4 result, different first 93238fef-2cc4-48e2-beff-c65dd121e26f, e964f137-cacb-41e9-b414-cee17a19af1c, 65973ddf-fd4e-4666-b27f-d532e47a75d5, d88860c2-282f-471a-82ed-861ef21d1e9b result, different first most popular method of tracking 8eb1e74b-357b-4308-a912-1888453d9111, party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, party: 921ea021-85bd-45d2-bffe-067d18811194, party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, 7f1ad153-7218-42f6-8c33-76b666e5857e, party: a631e40c-7719-47f9-9802-2d54a24d3d01, e106a814-bc1a-422c-8d7a-92533f552b60, 9a200a7b-cdb4-4525-b2a3-1fb3a4d43da2, 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, party: b51acfca-da9f-4c94-8276-65083891df3f, users across websites. Browsers 4f7a9ad6-187c-4caf-b184-d18908436921 result, different first 31409229-bd59-4c8e-a3b9-b3f1c1278a43, ecc64992-4894-4432-94ed-c2e1822cf985, 9d820b16-d670-40c0-ac68-50e242ed5b70, 378a0c14-2649-4b3a-93e4-94f5a06a3409 result, different first ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, da3d7e80-1c90-4750-b247-c5517c117d59 result, different first f75ddab3-8f21-4547-a3ad-58db5cbc1900 result, different first party: , 95783e57-aee7-4a73-a645-c6cc2d995cf7 result, different first f69e52b8-8ceb-419c-84ab-4beb4fd5714f, can stop cookies from being party: , , , , unsupported: false, false, false, false, false 08ee6f87-c109-44fc-8a01-1a1964a172b4, bd96efb2-a858-4732-9376-9ea9890e4cbc unsupported: false, false, 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, party: , , , , unsupported: false, false, false, false, false af3ecf84-528b-4dd2-a9f3-00652230e6a7, party: , , , , unsupported: false, false, false, false, false , , , unsupported: false, false, false, false, false passed: true, party: , , , , unsupported: false, false, false, false, false bbbf41aa-2879-425c-97de-177dfdd94789, used for cross-site tracking by passed: true, true, true, true, true test failed: false, false, 16170eca-5e29-4992-831e-d526ddefdcc1, false passed: false, false, false test failed: false, false, a78bfa05-b279-4e1b-9a07-11354b649bd8, passed: true, true, true, true, true test failed: false, false, fa675d16-3a4d-4470-84ae-e81f2daffbad, passed: true, true, true, true, true test failed: false, false, true, true, true, true test failed: false, false, false, false, false passed: true, true, true, true, true test failed: false, false, 20f1c1dc-74b4-4591-85ff-09418a0a1c40, either blocking or partitioning false, false, false d0cc9018-3bbe-4276-a7d4-68189dece8b5 unsupported: false, false, false fd7aa2af-8986-47a6-a043-c0a9bfdbd609 unsupported: false, false, false, false, false c3a50072-0d81-4da7-b5dc-642b7f6317b4 unsupported: false, false, false, false, false false, false, false d88860c2-282f-471a-82ed-861ef21d1e9b unsupported: false, false, them. false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false write: async (key) => { const href = testURI("resource", "css", write: async (key) => { const href = testURI("resource", "css", write: async (key) => { const href = testURI("resource", "css", write: async (key) => { const href = testURI("resource", "css", write: async (key) => { const href = testURI("resource", "css", write: async (key) => { const href = testURI("resource", "css", write: async (key) => { const href = testURI("resource", "css", write: async (key) => { const href = testURI("resource", "css", key); const head = document.getElementsByTagName("head")[0]; key); const head = document.getElementsByTagName("head")[0]; write: async (key) => { const href = testURI("resource", "css", key); const head = document.getElementsByTagName("head")[0]; key); const head = document.getElementsByTagName("head")[0]; key); const head = document.getElementsByTagName("head")[0]; key); const head = document.getElementsByTagName("head")[0]; write: async (key) => { const href = testURI("resource", "css", key); const head = document.getElementsByTagName("head")[0]; key); const head = document.getElementsByTagName("head")[0]; head.innerHTML += ``; const testElement = document.querySelector head.innerHTML += ``; const testElement = document.querySelector key); const head = document.getElementsByTagName("head")[0]; head.innerHTML += ``; const testElement = document.querySelector head.innerHTML += ``; const testElement = document.querySelector head.innerHTML += ``; const testElement = document.querySelector head.innerHTML += ``; const testElement = document.querySelector key); const head = document.getElementsByTagName("head")[0]; head.innerHTML += ``; const testElement = document.querySelector head.innerHTML += ``; const testElement = document.querySelector ("#css"); let fontFamily; while (true) { await sleepMs(100); ("#css"); let fontFamily; while (true) { await sleepMs(100); head.innerHTML += ``; const testElement = document.querySelector ("#css"); let fontFamily; while (true) { await sleepMs(100); ("#css"); let fontFamily; while (true) { await sleepMs(100); ("#css"); let fontFamily; while (true) { await sleepMs(100); ("#css"); let fontFamily; while (true) { await sleepMs(100); head.innerHTML += ``; const testElement = document.querySelector("# ("#css"); let fontFamily; while (true) { await sleepMs(100); ("#css"); let fontFamily; while (true) { await sleepMs(100); fontFamily = getComputedStyle(testElement).fontFamily; if fontFamily = getComputedStyle(testElement).fontFamily; if ("#css"); let fontFamily; while (true) { await sleepMs(100); fontFamily = getComputedStyle(testElement).fontFamily; if fontFamily = getComputedStyle(testElement).fontFamily; if fontFamily = getComputedStyle(testElement).fontFamily; if fontFamily = getComputedStyle(testElement).fontFamily; if css"); let fontFamily; while (true) { await sleepMs(100); fontFamily fontFamily = getComputedStyle(testElement).fontFamily; if fontFamily = getComputedStyle(testElement).fontFamily; if (fontFamily.startsWith("fake")) { break; } } console.log (fontFamily.startsWith("fake")) { break; } } console.log fontFamily = getComputedStyle(testElement).fontFamily; if (fontFamily.startsWith("fake")) { break; } } console.log (fontFamily.startsWith("fake")) { break; } } console.log (fontFamily.startsWith("fake")) { break; } } console.log (fontFamily.startsWith("fake")) { break; } } console.log = getComputedStyle(testElement).fontFamily; if (fontFamily.startsWith (fontFamily.startsWith("fake")) { break; } } console.log (fontFamily.startsWith("fake")) { break; } } console.log (fontFamily); return key; } read: async (key) => { const href = (fontFamily); return key; } read: async (key) => { const href = (fontFamily.startsWith("fake")) { break; } } console.log (fontFamily); return key; } read: async (key) => { const href = (fontFamily); return key; } read: async (key) => { const href = (fontFamily); return key; } read: async (key) => { const href = (fontFamily); return key; } read: async (key) => { const href = ("fake")) { break; } } console.log(fontFamily); return key; } read: (fontFamily); return key; } read: async (key) => { const href = (fontFamily); return key; } read: async (key) => { const href = testURI("resource", "css", key); const head = testURI("resource", "css", key); const head = (fontFamily); return key; } read: async (key) => { const href = testURI("resource", "css", key); const head = testURI("resource", "css", key); const head = testURI("resource", "css", key); const head = testURI("resource", "css", key); const head = async (key) => { const href = testURI("resource", "css", key); const testURI("resource", "css", key); const head = testURI("resource", "css", key); const head = CSS cacheCSS stylesheets are document.getElementsByTagName("head")[0]; head.innerHTML += ``; document.getElementsByTagName("head")[0]; head.innerHTML += ``; testURI("resource", "css", key); const head = document.getElementsByTagName("head")[0]; head.innerHTML += ``; document.getElementsByTagName("head")[0]; head.innerHTML += ``; document.getElementsByTagName("head")[0]; head.innerHTML += ``; document.getElementsByTagName("head")[0]; head.innerHTML += ``; head = document.getElementsByTagName("head")[0]; head.innerHTML += ` document.getElementsByTagName("head")[0]; head.innerHTML += ``; document.getElementsByTagName("head")[0]; head.innerHTML += ``; cached, and if that cache is const testElement = document.querySelector("#css"); let const testElement = document.querySelector("#css"); let document.getElementsByTagName("head")[0]; head.innerHTML += ``; const testElement = document.querySelector("#css"); let const testElement = document.querySelector("#css"); let const testElement = document.querySelector("#css"); let const testElement = document.querySelector("#css"); let `; const testElement = document.querySelector("#css"); let const testElement = document.querySelector("#css"); let const testElement = document.querySelector("#css"); let shared between websites, it can fontFamily; while (true) { await sleepMs(100); fontFamily = fontFamily; while (true) { await sleepMs(100); fontFamily = const testElement = document.querySelector("#css"); let fontFamily; while (true) { await sleepMs(100); fontFamily = fontFamily; while (true) { await sleepMs(100); fontFamily = fontFamily; while (true) { await sleepMs(100); fontFamily = fontFamily; while (true) { await sleepMs(100); fontFamily = fontFamily; while (true) { await sleepMs(100); fontFamily = fontFamily; while (true) { await sleepMs(100); fontFamily = fontFamily; while (true) { await sleepMs(100); fontFamily = be used to track users across getComputedStyle(testElement).fontFamily; if getComputedStyle(testElement).fontFamily; if fontFamily; while (true) { await sleepMs(100); fontFamily = getComputedStyle(testElement).fontFamily; if getComputedStyle(testElement).fontFamily; if getComputedStyle(testElement).fontFamily; if getComputedStyle(testElement).fontFamily; if getComputedStyle(testElement).fontFamily; if (fontFamily.startsWith getComputedStyle(testElement).fontFamily; if getComputedStyle(testElement).fontFamily; if sites. (fontFamily.startsWith("fake")) { break; } } console.log (fontFamily.startsWith("fake")) { break; } } console.log getComputedStyle(testElement).fontFamily; if (fontFamily.startsWith("fake")) { break; } } console.log (fontFamily.startsWith("fake")) { break; } } console.log (fontFamily.startsWith("fake")) { break; } } console.log (fontFamily.startsWith("fake")) { break; } } console.log ("fake")) { break; } } console.log(fontFamily); return fontFamily; } (fontFamily.startsWith("fake")) { break; } } console.log (fontFamily.startsWith("fake")) { break; } } console.log (fontFamily); return fontFamily; } result, same first party: (fontFamily); return fontFamily; } result, same first party: (fontFamily.startsWith("fake")) { break; } } console.log (fontFamily); return fontFamily; } result, same first party: (fontFamily); return fontFamily; } result, same first party: (fontFamily); return fontFamily; } result, same first party: (fontFamily); return fontFamily; } result, same first party: result, same first party: fake_720274602128157, (fontFamily); return fontFamily; } result, same first party: (fontFamily); return fontFamily; } result, same first party: fake_25199685183898257, fake_9659676090688236, fake_40916041057066477, fake_9146464001753902, (fontFamily); return fontFamily; } result, same first party: fake_38482125600573047, fake_6716391540680469, fake_38241551073047764, fake_7124701036271877, fake_24022125764647617, fake_35705709473978486, fake_31233472271475127, fake_33052456550931786, fake_7936510454778813, fake_8714666289414357, fake_8489443452996857, fake_9890176187154178, fake_3152648626672183, fake_1849256621108335, fake_054632439424492585, fake_4906218128954365, fake_28495270902462755, fake_23705905610887812, fake_6485037754804568, fake_3577908190921544, fake_13094345982172517, fake_01723479213340129, fake_011344525820466522, fake_9084542038353103, fake_4186015949885922, fake_6310950211547375, fake_8096674317059782, fake_25573323063491626, fake_3595420259632094, fake_28040287942082864 result, different first party: fake_38898135154995206, fake_4381077156539175, fake_9679145333891781, fake_5455034113614996, fake_4930671920640921 result, different first party: fake_7661565791480043 result, different first party: fake_28890221447221665 result, different first party: fake_11353032764208582 result, different first party: fake_9124090551761113 result, different first party: fake_22503599001495456 result, different first party: fake_8309684844764547 result, different first party: fake_9899748894776843, fake_7253841313954676, fake_9086352918103744, fake_8741327769460825 result, different first party: fake_5863732080898818 result, different first party: fake_6620814773885926, fake_40777192991880384, fake_18499326225800772, fake_5440387359725811, fake_15112723572637177, fake_13094345982172517, fake_615013990257663, fake_45920163978435036, fake_506460633257775, fake_18703700390279066, fake_5805695042321894, fake_7384651542724308, fake_6089223011908522, fake_808269545874228, fake_03602410448361648, fake_5961295470380101 unsupported: false, fake_9890176187154178, fake_3152648626672183, fake_143738599196652, fake_3854051724848595, fake_3598566923834752, fake_16905668681397157, fake_23705905610887812, fake_42903482924718106, fake_6647216126297013 unsupported: false, false, false passed: fake_2250000661097249, fake_525152478389904, fake_04447058870290599, fake_7316604693554027, fake_1123093405713278, fake_23713342507764512, fake_7631875634666168, fake_32837787241897365, false, false, false, false passed: true, true, true, true, true test fake_38898135154995206, fake_4381077156539175, fake_6670470369498014, fake_10805520480485997, fake_1956147127790948 unsupported: false, false, false, false, fake_3751640896412429 unsupported: false, false, false, false, true, false, true test failed: false, false, false fake_02823870599357514 unsupported: false, false, false, false, fake_027437009370964827 unsupported: false, false, false, false, fake_273524425134833 unsupported: false, false, false, false, fake_5473135182673696 unsupported: false, false, false, false, failed: false, false, false, false, false fake_8741327769460825 unsupported: false, false, false, false, fake_1678988410496507 unsupported: false, false, false, false, false passed: true, true, true, true, true test failed: false, false passed: true, true, false, true, true test failed: false, false passed: true, true, true, true, true test failed: false, false passed: true, true, true, true, true test failed: false, false passed: true, true, true, true, true test failed: false, false passed: true, true, true, true, true test failed: false, false passed: false, false, false, false, false test failed: false passed: true, true, true, true, true test failed: false, false, false, false, false false, false, false, false false, false, false, false false, false, false, false false, false, false, false false, false, false, false false, false, false, false, false false, false, false, false write: (key) => key read: async (key) => { // Wait for the write: (key) => key read: async (key) => { // Wait for the write: (key) => key read: async (key) => { // Wait for the write: (key) => key read: async (key) => { // Wait for the write: (key) => key read: async (key) => { // Wait for the write: (key) => key read: async (key) => { // Wait for the write: (key) => key read: async (key) => { // Wait for the write: (key) => key read: async (key) => { // Wait for the favicon write: (key) => key read: async (key) => { // Wait for the write: (key) => key read: async (key) => { // Wait for the favicon cacheA favicon is an favicon to load (defined in supercookies.html) await sleepMs favicon to load (defined in supercookies.html) await sleepMs favicon to load (defined in supercookies.html) await sleepMs favicon to load (defined in supercookies.html) await sleepMs favicon to load (defined in supercookies.html) await sleepMs favicon to load (defined in supercookies.html) await sleepMs favicon to load (defined in supercookies.html) await sleepMs to load (defined in supercookies.html) await sleepMs(500); let favicon to load (defined in supercookies.html) await sleepMs favicon to load (defined in supercookies.html) await sleepMs icon that represents a website, (500); let response = await fetch( testURI("ctr", "favicon", (500); let response = await fetch( testURI("ctr", "favicon", (500); let response = await fetch( testURI("ctr", "favicon", (500); let response = await fetch( testURI("ctr", "favicon", (500); let response = await fetch( testURI("ctr", "favicon", (500); let response = await fetch( testURI("ctr", "favicon", (500); let response = await fetch( testURI("ctr", "favicon", response = await fetch( testURI("ctr", "favicon", key), {"cache": (500); let response = await fetch( testURI("ctr", "favicon", (500); let response = await fetch( testURI("ctr", "favicon", typically shown in browser tab key), {"cache": "reload"}); let count = (await response.text key), {"cache": "reload"}); let count = (await response.text key), {"cache": "reload"}); let count = (await response.text key), {"cache": "reload"}); let count = (await response.text key), {"cache": "reload"}); let count = (await response.text key), {"cache": "reload"}); let count = (await response.text key), {"cache": "reload"}); let count = (await response.text "reload"}); let count = (await response.text()).trim(); if (count === key), {"cache": "reload"}); let count = (await response.text key), {"cache": "reload"}); let count = (await response.text and bookmarks menu. If the ()).trim(); if (count === "0") { throw new Error("No requests ()).trim(); if (count === "0") { throw new Error("No requests ()).trim(); if (count === "0") { throw new Error("No requests ()).trim(); if (count === "0") { throw new Error("No requests ()).trim(); if (count === "0") { throw new Error("No requests ()).trim(); if (count === "0") { throw new Error("No requests ()).trim(); if (count === "0") { throw new Error("No requests "0") { throw new Error("No requests received"); } return count; } ()).trim(); if (count === "0") { throw new Error("No requests ()).trim(); if (count === "0") { throw new Error("No requests favicon cache is not received"); } return count; } result, same first party: 1, 1, 1, received"); } return count; } result, same first party: 1, 1, 1, received"); } return count; } result, same first party: 1, 1, 1 received"); } return count; } result, same first party: 2, 1, 2, received"); } return count; } result, same first party: 1, 1, 1, received"); } return count; } result, same first party: 1, 1, 1, received"); } return count; } result, same first party: 1, 1, 1, result, same first party: 1, 1, 1, 1, 1 result, different first received"); } return count; } result, same first party: 1, 1, 1, received"); } return count; } result, same first party: 2, 2, 2, partitioned, it can be used to 1, 1 result, different first party: 2, 2, 2, 2, 2 unsupported: 1, 1 result, different first party: 1, 1, 1, 1, 1 unsupported: result, different first party: 1, 1, 1 unsupported: false, false, 1, 1 result, different first party: 3, 2, 3, 2, 2 unsupported: 1, 1 result, different first party: 2, 2, 2, 2, 2 unsupported: 1, 1 result, different first party: 1, 1, 1, 1, 1 unsupported: 1, 1 result, different first party: 1, 1, 1, 1, 1 unsupported: party: 2, 2, 2, 2, 2 unsupported: false, false, false, false, false 1, 1 result, different first party: 1, 1, 1, 1, 1 unsupported: 2, 2 result, different first party: 2, 2, 2, 2, 2 unsupported: track users across websites. false, false, false, false, false passed: true, true, true, true, false, false, false, false, false passed: false, false, false, false passed: false, false, false test failed: false, false, false, false, false, false, false passed: true, true, true, true, false, false, false, false, false passed: true, true, true, true, false, false, false, false, false passed: false, false, false, false, false, false, false, false passed: false, false, false, passed: true, true, true, true, true test failed: false, false, false, false, false, false, false passed: false, false, false, false, false, false, false, false passed: false, false, false, true test failed: false, false, false, false, false false, false test failed: false, false, false, false, false false true test failed: false, false, false, false, false true test failed: false, false, false, false, false false, false test failed: false, false, false, false, false false, false test failed: false, false, false, false, false false, false, false false, false test failed: false, false, false, false, false false, false test failed: false, false, false, false, false write: async (key) => { let response = await fetch(testURI write: async (key) => { let response = await fetch(testURI write: async (key) => { let response = await fetch(testURI write: async (key) => { let response = await fetch(testURI write: async (key) => { let response = await fetch(testURI write: async (key) => { let response = await fetch(testURI write: async (key) => { let response = await fetch(testURI write: async (key) => { let response = await fetch(testURI write: async (key) => { let response = await fetch(testURI write: async (key) => { let response = await fetch(testURI ("resource", "fetch", key), {cache: "force-cache"}); return key; ("resource", "fetch", key), {cache: "force-cache"}); return key; ("resource", "fetch", key), {cache: "force-cache"}); return key; ("resource", "fetch", key), {cache: "force-cache"}); return key; ("resource", "fetch", key), {cache: "force-cache"}); return key; ("resource", "fetch", key), {cache: "force-cache"}); return key; ("resource", "fetch", key), {cache: "force-cache"}); return key; ("resource", "fetch", key), {cache: "force-cache"}); return key; } ("resource", "fetch", key), {cache: "force-cache"}); return key; ("resource", "fetch", key), {cache: "force-cache"}); return key; fetch cacheWhen a resource is } read: async (key) => { let response = await fetch(testURI } read: async (key) => { let response = await fetch(testURI } read: async (key) => { let response = await fetch(testURI } read: async (key) => { let response = await fetch(testURI } read: async (key) => { let response = await fetch(testURI } read: async (key) => { let response = await fetch(testURI } read: async (key) => { let response = await fetch(testURI read: async (key) => { let response = await fetch(testURI("resource", } read: async (key) => { let response = await fetch(testURI } read: async (key) => { let response = await fetch(testURI received via the Fetch API, it ("resource", "fetch", key), {cache: "force-cache"}); let ("resource", "fetch", key), {cache: "force-cache"}); let ("resource", "fetch", key), {cache: "force-cache"}); let ("resource", "fetch", key), {cache: "force-cache"}); let ("resource", "fetch", key), {cache: "force-cache"}); let ("resource", "fetch", key), {cache: "force-cache"}); let ("resource", "fetch", key), {cache: "force-cache"}); let "fetch", key), {cache: "force-cache"}); let countResponse = await ("resource", "fetch", key), {cache: "force-cache"}); let ("resource", "fetch", key), {cache: "force-cache"}); let is frequently cached. That countResponse = await fetch(testURI("ctr", "fetch", key), {cache: countResponse = await fetch(testURI("ctr", "fetch", key), {cache: countResponse = await fetch(testURI("ctr", "fetch", key), {cache: countResponse = await fetch(testURI("ctr", "fetch", key), {cache: countResponse = await fetch(testURI("ctr", "fetch", key), {cache: countResponse = await fetch(testURI("ctr", "fetch", key), {cache: countResponse = await fetch(testURI("ctr", "fetch", key), {cache: fetch(testURI("ctr", "fetch", key), {cache: "reload"}); return (await countResponse = await fetch(testURI("ctr", "fetch", key), {cache: countResponse = await fetch(testURI("ctr", "fetch", key), {cache: cache can potentially be abused "reload"}); return (await countResponse.text()).trim(); } result, "reload"}); return (await countResponse.text()).trim(); } result, "reload"}); return (await countResponse.text()).trim(); } result, "reload"}); return (await countResponse.text()).trim(); } result, "reload"}); return (await countResponse.text()).trim(); } result, "reload"}); return (await countResponse.text()).trim(); } result, "reload"}); return (await countResponse.text()).trim(); } result, countResponse.text()).trim(); } result, same first party: 1, 1, 1, 1, "reload"}); return (await countResponse.text()).trim(); } result, "reload"}); return (await countResponse.text()).trim(); } result, for cross-site tracking. same first party: 1, 1, 1, 1, 1 result, different first party: 2, same first party: 1, 1, 1, 1, 1 result, different first party: 2, same first party: 1, 1, 1 result, different first party: 2, 2, 2 same first party: 2, 1, 1, 1, 1 result, different first party: 3, same first party: 1, 1, 1, 1, 1 result, different first party: 2, same first party: 1, 1, 1, 1, 1 result, different first party: 2, same first party: 1, 1, 1, 1, 1 result, different first party: 2, 1 result, different first party: 2, 2, 2, 2, 2 unsupported: false, same first party: 1, 1, 1, 1, 1 result, different first party: 2, same first party: 1, 1, 1, 1, 1 result, different first party: 2, 2, 2, 2, 2 unsupported: false, false, false, false, false passed: 2, 2, 2, 2 unsupported: false, false, false, false, false passed: unsupported: false, false, false passed: true, true, true test 2, 2, 2, 2 unsupported: false, false, false, false, false passed: 2, 2, 2, 2 unsupported: false, false, false, false, false passed: 2, 2, 2, 2 unsupported: false, false, false, false, false passed: 2, 2, 2, 2 unsupported: false, false, false, false, false passed: false, false, false, false passed: true, true, true, true, true test 2, 2, 2, 2 unsupported: false, false, false, false, false passed: 2, 2, 2, 2 unsupported: false, false, false, false, false passed: true, true, true, true, true test failed: false, false, false, true, true, true, true, true test failed: false, false, false, failed: false, false, false true, true, true, true, true test failed: false, false, false, true, true, true, true, true test failed: false, false, false, true, true, true, true, true test failed: false, false, false, true, true, true, true, true test failed: false, false, false, failed: false, false, false, false, false true, true, true, true, true test failed: false, false, false, true, true, true, true, true test failed: false, false, false, false, false false, false false, false false, false false, false false, false false, false false, false write: async (key) => { let style = document.createElement write: async (key) => { let style = document.createElement write: async (key) => { let style = document.createElement write: async (key) => { let style = document.createElement write: async (key) => { let style = document.createElement write: async (key) => { let style = document.createElement write: async (key) => { let style = document.createElement write: async (key) => { let style = document.createElement write: async (key) => { let style = document.createElement write: async (key) => { let style = document.createElement ("style"); style.type='text/css'; let fontURI = testURI ("style"); style.type='text/css'; let fontURI = testURI ("style"); style.type='text/css'; let fontURI = testURI ("style"); style.type='text/css'; let fontURI = testURI ("style"); style.type='text/css'; let fontURI = testURI ("style"); style.type='text/css'; let fontURI = testURI ("style"); style.type='text/css'; let fontURI = testURI ("style"); style.type='text/css'; let fontURI = testURI("resource", ("style"); style.type='text/css'; let fontURI = testURI ("style"); style.type='text/css'; let fontURI = testURI ("resource", "font", key); style.innerHTML = `@font-face ("resource", "font", key); style.innerHTML = `@font-face ("resource", "font", key); style.innerHTML = `@font-face ("resource", "font", key); style.innerHTML = `@font-face ("resource", "font", key); style.innerHTML = `@font-face ("resource", "font", key); style.innerHTML = `@font-face ("resource", "font", key); style.innerHTML = `@font-face "font", key); style.innerHTML = `@font-face {font-family: "myFont"; ("resource", "font", key); style.innerHTML = `@font-face ("resource", "font", key); style.innerHTML = `@font-face {font-family: "myFont"; src: url("${fontURI}"); } body { {font-family: "myFont"; src: url("${fontURI}"); } body { {font-family: "myFont"; src: url("${fontURI}"); } body { {font-family: "myFont"; src: url("${fontURI}"); } body { {font-family: "myFont"; src: url("${fontURI}"); } body { {font-family: "myFont"; src: url("${fontURI}"); } body { {font-family: "myFont"; src: url("${fontURI}"); } body { src: url("${fontURI}"); } body { font-family: "myFont" }`; {font-family: "myFont"; src: url("${fontURI}"); } body { {font-family: "myFont"; src: url("${fontURI}"); } body { font-family: "myFont" }`; document.getElementsByTagName("head") font-family: "myFont" }`; document.getElementsByTagName("head") font-family: "myFont" }`; document.getElementsByTagName("head") font-family: "myFont" }`; document.getElementsByTagName("head") font-family: "myFont" }`; document.getElementsByTagName("head") font-family: "myFont" }`; document.getElementsByTagName("head") font-family: "myFont" }`; document.getElementsByTagName("head") document.getElementsByTagName("head")[0].appendChild(style); return font-family: "myFont" }`; document.getElementsByTagName("head") font-family: "myFont" }`; document.getElementsByTagName("head") [0].appendChild(style); return key; } read: async (key) => { let [0].appendChild(style); return key; } read: async (key) => { let [0].appendChild(style); return key; } read: async (key) => { let [0].appendChild(style); return key; } read: async (key) => { let [0].appendChild(style); return key; } read: async (key) => { let [0].appendChild(style); return key; } read: async (key) => { let [0].appendChild(style); return key; } read: async (key) => { let key; } read: async (key) => { let style = document.createElement [0].appendChild(style); return key; } read: async (key) => { let [0].appendChild(style); return key; } read: async (key) => { let font cacheWeb fonts are style = document.createElement("style"); style.type='text/css'; style = document.createElement("style"); style.type='text/css'; style = document.createElement("style"); style.type='text/css'; style = document.createElement("style"); style.type='text/css'; style = document.createElement("style"); style.type='text/css'; style = document.createElement("style"); style.type='text/css'; style = document.createElement("style"); style.type='text/css'; ("style"); style.type='text/css'; let fontURI = testURI("resource", style = document.createElement("style"); style.type='text/css'; style = document.createElement("style"); style.type='text/css'; sometimes stored in their own let fontURI = testURI("resource", "font", key); style.innerHTML = let fontURI = testURI("resource", "font", key); style.innerHTML = let fontURI = testURI("resource", "font", key); style.innerHTML = let fontURI = testURI("resource", "font", key); style.innerHTML = let fontURI = testURI("resource", "font", key); style.innerHTML = let fontURI = testURI("resource", "font", key); style.innerHTML = let fontURI = testURI("resource", "font", key); style.innerHTML = "font", key); style.innerHTML = `@font-face {font-family: "myFont"; let fontURI = testURI("resource", "font", key); style.innerHTML = let fontURI = testURI("resource", "font", key); style.innerHTML = cache, which is vulnerable to `@font-face {font-family: "myFont"; src: url("${fontURI}"); } `@font-face {font-family: "myFont"; src: url("${fontURI}"); } `@font-face {font-family: "myFont"; src: url("${fontURI}"); } `@font-face {font-family: "myFont"; src: url("${fontURI}"); } `@font-face {font-family: "myFont"; src: url("${fontURI}"); } `@font-face {font-family: "myFont"; src: url("${fontURI}"); } `@font-face {font-family: "myFont"; src: url("${fontURI}"); } src: url("${fontURI}"); } body { font-family: "myFont" }`; `@font-face {font-family: "myFont"; src: url("${fontURI}"); } `@font-face {font-family: "myFont"; src: url("${fontURI}"); } being abused for cross-site body { font-family: "myFont" }`; document.getElementsByTagName body { font-family: "myFont" }`; document.getElementsByTagName body { font-family: "myFont" }`; document.getElementsByTagName body { font-family: "myFont" }`; document.getElementsByTagName body { font-family: "myFont" }`; document.getElementsByTagName body { font-family: "myFont" }`; document.getElementsByTagName body { font-family: "myFont" }`; document.getElementsByTagName document.getElementsByTagName("head")[0].appendChild(style); await body { font-family: "myFont" }`; document.getElementsByTagName body { font-family: "myFont" }`; document.getElementsByTagName tracking. ("head")[0].appendChild(style); await sleepMs(500); let response ("head")[0].appendChild(style); await sleepMs(500); let response ("head")[0].appendChild(style); await sleepMs(500); let response ("head")[0].appendChild(style); await sleepMs(500); let response ("head")[0].appendChild(style); await sleepMs(500); let response ("head")[0].appendChild(style); await sleepMs(500); let response ("head")[0].appendChild(style); await sleepMs(500); let response sleepMs(500); let response = await fetch( testURI("ctr", "font", ("head")[0].appendChild(style); await sleepMs(500); let response ("head")[0].appendChild(style); await sleepMs(500); let response = await fetch( testURI("ctr", "font", key), {"cache": "reload"}); = await fetch( testURI("ctr", "font", key), {"cache": "reload"}); = await fetch( testURI("ctr", "font", key), {"cache": "reload"}); = await fetch( testURI("ctr", "font", key), {"cache": "reload"}); = await fetch( testURI("ctr", "font", key), {"cache": "reload"}); = await fetch( testURI("ctr", "font", key), {"cache": "reload"}); = await fetch( testURI("ctr", "font", key), {"cache": "reload"}); key), {"cache": "reload"}); return (await response.text()).trim(); } = await fetch( testURI("ctr", "font", key), {"cache": "reload"}); = await fetch( testURI("ctr", "font", key), {"cache": "reload"}); return (await response.text()).trim(); } result, same first return (await response.text()).trim(); } result, same first return (await response.text()).trim(); } result, same first return (await response.text()).trim(); } result, same first return (await response.text()).trim(); } result, same first return (await response.text()).trim(); } result, same first return (await response.text()).trim(); } result, same first result, same first party: 0, 1, 1, 1, 1 result, different first return (await response.text()).trim(); } result, same first return (await response.text()).trim(); } result, same first party: 1, 1, 1, 1, 1 result, different first party: 1, 1, 1, 1, 1 party: 1, 1, 1, 1, 1 result, different first party: 1, 1, 1, 1, 1 party: 1, 1, 1 result, different first party: 1, 1, 1 party: 1, 1, 1, 1, 1 result, different first party: 2, 2, 2, 2, 2 party: 1, 1, 1, 1, 1 result, different first party: 2, 2, 2, 2, 2 party: 1, 1, 1, 1, 1 result, different first party: 1, 1, 1, 1, 1 party: 1, 1, 1, 1, 1 result, different first party: 2, 2, 2, 2, 2 party: 0, 2, 2, 2, 2 unsupported: false, false, false, false, false party: 1, 1, 1, 1, 1 result, different first party: 1, 1, 1, 1, 1 party: 1, 1, 1, 1, 1 result, different first party: 1, 1, 1, 1, 1 unsupported: false, false, false, false, false passed: false, unsupported: false, false, false, false, false passed: false, unsupported: false, false, false passed: false, false, false test unsupported: false, false, false, false, false passed: true, unsupported: false, false, false, false, false passed: true, unsupported: false, false, false, false, false passed: false, unsupported: false, false, false, false, false passed: true, passed: false, true, true, true, true test failed: false, false, unsupported: false, false, false, false, false passed: false, unsupported: false, false, false, false, false passed: false, false, false, false, false test failed: false, false, false, false, false, false, false test failed: false, false, false, failed: false, false, false true, true, true, true test failed: false, false, false, false, true, true, true, true test failed: false, false, false, false, false, false, false, false test failed: false, false, false, true, true, true, true test failed: false, false, false, false, false, false, false false, false, false, false test failed: false, false, false, false, false, false, false test failed: false, false, false, false, false false, false false false false, false false false, false false, false write: async (secret) => { await fetch(`https:// write: async (secret) => { await fetch(`https:// write: async (secret) => { await fetch(`https:// write: async (secret) => { await fetch(`https:// write: async (secret) => { await fetch(`https:// h1.arthuredelstein.net:8901/?mode=write&secret=${secret}`, h1.arthuredelstein.net:8901/?mode=write&secret=${secret}`, h1.arthuredelstein.net:8901/?mode=write&secret=${secret}`, h1.arthuredelstein.net:8901/?mode=write&secret=${secret}`, h1.arthuredelstein.net:8901/?mode=write&secret=${secret}`, write: async (secret) => { await fetch(`https:// {cache: "no-store"}); } read: async () => { let response = await write: async (secret) => { await fetch(`https:// write: async (secret) => { await fetch(`https:// write: async (secret) => { await fetch(`https:// {cache: "no-store"}); } read: async () => { let response = await {cache: "no-store"}); } read: async () => { let response = await write: async (secret) => { await fetch(`https:// {cache: "no-store"}); } read: async () => { let response = await {cache: "no-store"}); } read: async () => { let response = await h1.arthuredelstein.net:8901/?mode=write&secret=${secret}`, fetch(`https://h1.arthuredelstein.net:8901/?mode=read`, {cache: h1.arthuredelstein.net:8901/?mode=write&secret=${secret}`, h1.arthuredelstein.net:8901/?mode=write&secret=${secret}`, h1.arthuredelstein.net:8901/?mode=write&secret=${secret}`, fetch(`https://h1.arthuredelstein.net:8901/?mode=read`, {cache: fetch(`https://h1.arthuredelstein.net:8901/?mode=read`, {cache: h1.arthuredelstein.net:8901/?mode=write&secret=${secret}`, {cache: fetch(`https://h1.arthuredelstein.net:8901/?mode=read`, {cache: fetch(`https://h1.arthuredelstein.net:8901/?mode=read`, {cache: {cache: "no-store"}); } read: async () => { let response = await "no-store"}); return await response.text(); } result, same first {cache: "no-store"}); } read: async () => { let response = await {cache: "no-store"}); } read: async () => { let response = await {cache: "no-store"}); } read: async () => { let response = await "no-store"}); return await response.text(); } result, same first "no-store"}); return await response.text(); } result, same first "no-store"}); } read: async () => { let response = await fetch "no-store"}); return await response.text(); } result, same first "no-store"}); return await response.text(); } result, same first H1 connectionHTTP/1.x are the fetch(`https://h1.arthuredelstein.net:8901/?mode=read`, {cache: party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, fetch(`https://h1.arthuredelstein.net:8901/?mode=read`, {cache: fetch(`https://h1.arthuredelstein.net:8901/?mode=read`, {cache: fetch(`https://h1.arthuredelstein.net:8901/?mode=read`, {cache: party: a631e40c-7719-47f9-9802-2d54a24d3d01, party: 109e075c-f3af-43a0-9f3e-031a5a3c3dc0, (`https://h1.arthuredelstein.net:8901/?mode=read`, {cache: party: abf0475f-b7ff-41d5-9465-e439243ec199, party: b51acfca-da9f-4c94-8276-65083891df3f, classic web connection "no-store"}); return await response.text(); } result, same first 31409229-bd59-4c8e-a3b9-b3f1c1278a43, "no-store"}); return await response.text(); } result, same first "no-store"}); return await response.text(); } result, same first "no-store"}); return await response.text(); } result, same first ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, 281040ec-68e0-4834-bce0-775462672325, "no-store"}); return await response.text(); } result, same first 3aefe95d-2acc-4dfb-9a93-8b362330a688, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, protocols. If these connections party: fb9ada0c-2dd5-445b-8766-6a96ede1d675, 08ee6f87-c109-44fc-8a01-1a1964a172b4, party: 921ea021-85bd-45d2-bffe-067d18811194, party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, party: ccf7b60c-0a34-4542-9d4a-dc6388ae2f2c, af3ecf84-528b-4dd2-a9f3-00652230e6a7, 93238fef-2cc4-48e2-beff-c65dd121e26f, party: fda373cd-c540-4d8a-b1d2-06344b686d10, 65973ddf-fd4e-4666-b27f-d532e47a75d5, bbbf41aa-2879-425c-97de-177dfdd94789, are re-used across websites, 5755b44c-4043-49c5-9206-d69be4536a7b, 16170eca-5e29-4992-831e-d526ddefdcc1, ecc64992-4894-4432-94ed-c2e1822cf985, 9d820b16-d670-40c0-ac68-50e242ed5b70, 435c28c6-4255-4bfe-a586-84fa6938e442, fa675d16-3a4d-4470-84ae-e81f2daffbad, e106a814-bc1a-422c-8d7a-92533f552b60, 7af1be6c-dfff-4a41-b0e8-fdc94d5164a8, 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, 20f1c1dc-74b4-4591-85ff-09418a0a1c40, they can be used to track e1f98084-6527-424b-b09f-a5c0cda014fb, d0cc9018-3bbe-4276-a7d4-68189dece8b5 result, different first bd96efb2-a858-4732-9376-9ea9890e4cbc result, different first 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, ac90c185-5b06-43e2-a37f-c59529ed65a2, c3a50072-0d81-4da7-b5dc-642b7f6317b4 result, different first da3d7e80-1c90-4750-b247-c5517c117d59 result, different first e964f137-cacb-41e9-b414-cee17a19af1c, 95783e57-aee7-4a73-a645-c6cc2d995cf7 result, different first d88860c2-282f-471a-82ed-861ef21d1e9b result, different first users. 8eb1e74b-357b-4308-a912-1888453d9111, party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, party: 921ea021-85bd-45d2-bffe-067d18811194, a78bfa05-b279-4e1b-9a07-11354b649bd8, 7f1ad153-7218-42f6-8c33-76b666e5857e, party: a631e40c-7719-47f9-9802-2d54a24d3d01, party: 109e075c-f3af-43a0-9f3e-031a5a3c3dc0, 9a200a7b-cdb4-4525-b2a3-1fb3a4d43da2, party: abf0475f-b7ff-41d5-9465-e439243ec199, party: b51acfca-da9f-4c94-8276-65083891df3f, 4f7a9ad6-187c-4caf-b184-d18908436921 result, different first 31409229-bd59-4c8e-a3b9-b3f1c1278a43, ecc64992-4894-4432-94ed-c2e1822cf985, fd7aa2af-8986-47a6-a043-c0a9bfdbd609 result, different first 378a0c14-2649-4b3a-93e4-94f5a06a3409 result, different first ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, 281040ec-68e0-4834-bce0-775462672325, f75ddab3-8f21-4547-a3ad-58db5cbc1900 result, different first party: , 3aefe95d-2acc-4dfb-9a93-8b362330a688, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, party: , , , , unsupported: false, false, false, false, false 08ee6f87-c109-44fc-8a01-1a1964a172b4, bd96efb2-a858-4732-9376-9ea9890e4cbc unsupported: false, false, party: , , , , unsupported: false, false, false, false, false party: , , , , unsupported: false, false, false, false, false af3ecf84-528b-4dd2-a9f3-00652230e6a7, 93238fef-2cc4-48e2-beff-c65dd121e26f, , , , unsupported: false, false, false, false, false passed: true, 65973ddf-fd4e-4666-b27f-d532e47a75d5, bbbf41aa-2879-425c-97de-177dfdd94789, passed: true, true, true, true, true test failed: false, false, 16170eca-5e29-4992-831e-d526ddefdcc1, false passed: false, false, false test failed: false, false, passed: true, true, true, true, true test failed: false, false, passed: true, true, true, true, true test failed: false, false, fa675d16-3a4d-4470-84ae-e81f2daffbad, e106a814-bc1a-422c-8d7a-92533f552b60, true, true, true, true test failed: false, false, false, false, false 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, 20f1c1dc-74b4-4591-85ff-09418a0a1c40, false, false, false d0cc9018-3bbe-4276-a7d4-68189dece8b5 unsupported: false, false, false false, false, false false, false, false c3a50072-0d81-4da7-b5dc-642b7f6317b4 unsupported: false, false, da3d7e80-1c90-4750-b247-c5517c117d59 unsupported: false, false, 95783e57-aee7-4a73-a645-c6cc2d995cf7 unsupported: false, false, d88860c2-282f-471a-82ed-861ef21d1e9b unsupported: false, false, false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false write: async (secret) => { await fetch(`https:// write: async (secret) => { await fetch(`https:// write: async (secret) => { await fetch(`https:// write: async (secret) => { await fetch(`https:// write: async (secret) => { await fetch(`https:// h2.arthuredelstein.net:8902/?mode=write&secret=${secret}`, h2.arthuredelstein.net:8902/?mode=write&secret=${secret}`, h2.arthuredelstein.net:8902/?mode=write&secret=${secret}`, h2.arthuredelstein.net:8902/?mode=write&secret=${secret}`, h2.arthuredelstein.net:8902/?mode=write&secret=${secret}`, write: async (secret) => { await fetch(`https:// {cache: "no-store"}); } read: async () => { let response = await write: async (secret) => { await fetch(`https:// write: async (secret) => { await fetch(`https:// write: async (secret) => { await fetch(`https:// {cache: "no-store"}); } read: async () => { let response = await {cache: "no-store"}); } read: async () => { let response = await write: async (secret) => { await fetch(`https:// {cache: "no-store"}); } read: async () => { let response = await {cache: "no-store"}); } read: async () => { let response = await h2.arthuredelstein.net:8902/?mode=write&secret=${secret}`, fetch(`https://h2.arthuredelstein.net:8902/?mode=read`, {cache: h2.arthuredelstein.net:8902/?mode=write&secret=${secret}`, h2.arthuredelstein.net:8902/?mode=write&secret=${secret}`, h2.arthuredelstein.net:8902/?mode=write&secret=${secret}`, fetch(`https://h2.arthuredelstein.net:8902/?mode=read`, {cache: fetch(`https://h2.arthuredelstein.net:8902/?mode=read`, {cache: h2.arthuredelstein.net:8902/?mode=write&secret=${secret}`, {cache: fetch(`https://h2.arthuredelstein.net:8902/?mode=read`, {cache: fetch(`https://h2.arthuredelstein.net:8902/?mode=read`, {cache: {cache: "no-store"}); } read: async () => { let response = await "no-store"}); return await response.text(); } result, same first {cache: "no-store"}); } read: async () => { let response = await {cache: "no-store"}); } read: async () => { let response = await {cache: "no-store"}); } read: async () => { let response = await "no-store"}); return await response.text(); } result, same first "no-store"}); return await response.text(); } result, same first "no-store"}); } read: async () => { let response = await fetch "no-store"}); return await response.text(); } result, same first "no-store"}); return await response.text(); } result, same first H2 connectionHTTP/2 is a web fetch(`https://h2.arthuredelstein.net:8902/?mode=read`, {cache: party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, fetch(`https://h2.arthuredelstein.net:8902/?mode=read`, {cache: fetch(`https://h2.arthuredelstein.net:8902/?mode=read`, {cache: fetch(`https://h2.arthuredelstein.net:8902/?mode=read`, {cache: party: a631e40c-7719-47f9-9802-2d54a24d3d01, party: 109e075c-f3af-43a0-9f3e-031a5a3c3dc0, (`https://h2.arthuredelstein.net:8902/?mode=read`, {cache: party: abf0475f-b7ff-41d5-9465-e439243ec199, party: b51acfca-da9f-4c94-8276-65083891df3f, connection protocol introduced "no-store"}); return await response.text(); } result, same first 31409229-bd59-4c8e-a3b9-b3f1c1278a43, "no-store"}); return await response.text(); } result, same first "no-store"}); return await response.text(); } result, same first "no-store"}); return await response.text(); } result, same first ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, 281040ec-68e0-4834-bce0-775462672325, "no-store"}); return await response.text(); } result, same first 3aefe95d-2acc-4dfb-9a93-8b362330a688, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, in 2015. Some browsers re-use party: fb9ada0c-2dd5-445b-8766-6a96ede1d675, 08ee6f87-c109-44fc-8a01-1a1964a172b4, party: 921ea021-85bd-45d2-bffe-067d18811194, party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, party: ccf7b60c-0a34-4542-9d4a-dc6388ae2f2c, af3ecf84-528b-4dd2-a9f3-00652230e6a7, 93238fef-2cc4-48e2-beff-c65dd121e26f, party: fda373cd-c540-4d8a-b1d2-06344b686d10, 65973ddf-fd4e-4666-b27f-d532e47a75d5, bbbf41aa-2879-425c-97de-177dfdd94789, HTTP/2 connections across 5755b44c-4043-49c5-9206-d69be4536a7b, 16170eca-5e29-4992-831e-d526ddefdcc1, ecc64992-4894-4432-94ed-c2e1822cf985, 9d820b16-d670-40c0-ac68-50e242ed5b70, 435c28c6-4255-4bfe-a586-84fa6938e442, fa675d16-3a4d-4470-84ae-e81f2daffbad, e106a814-bc1a-422c-8d7a-92533f552b60, 7af1be6c-dfff-4a41-b0e8-fdc94d5164a8, 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, 20f1c1dc-74b4-4591-85ff-09418a0a1c40, websites and can thus be used e1f98084-6527-424b-b09f-a5c0cda014fb, d0cc9018-3bbe-4276-a7d4-68189dece8b5 result, different first bd96efb2-a858-4732-9376-9ea9890e4cbc result, different first 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, ac90c185-5b06-43e2-a37f-c59529ed65a2, c3a50072-0d81-4da7-b5dc-642b7f6317b4 result, different first da3d7e80-1c90-4750-b247-c5517c117d59 result, different first e964f137-cacb-41e9-b414-cee17a19af1c, 95783e57-aee7-4a73-a645-c6cc2d995cf7 result, different first d88860c2-282f-471a-82ed-861ef21d1e9b result, different first to track users. 8eb1e74b-357b-4308-a912-1888453d9111, party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, party: 921ea021-85bd-45d2-bffe-067d18811194, a78bfa05-b279-4e1b-9a07-11354b649bd8, 7f1ad153-7218-42f6-8c33-76b666e5857e, party: a631e40c-7719-47f9-9802-2d54a24d3d01, party: 109e075c-f3af-43a0-9f3e-031a5a3c3dc0, 9a200a7b-cdb4-4525-b2a3-1fb3a4d43da2, party: abf0475f-b7ff-41d5-9465-e439243ec199, party: b51acfca-da9f-4c94-8276-65083891df3f, 4f7a9ad6-187c-4caf-b184-d18908436921 result, different first 31409229-bd59-4c8e-a3b9-b3f1c1278a43, ecc64992-4894-4432-94ed-c2e1822cf985, fd7aa2af-8986-47a6-a043-c0a9bfdbd609 result, different first 378a0c14-2649-4b3a-93e4-94f5a06a3409 result, different first ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, 281040ec-68e0-4834-bce0-775462672325, f75ddab3-8f21-4547-a3ad-58db5cbc1900 result, different first party: , 3aefe95d-2acc-4dfb-9a93-8b362330a688, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, party: , , , , unsupported: false, false, false, false, false 08ee6f87-c109-44fc-8a01-1a1964a172b4, bd96efb2-a858-4732-9376-9ea9890e4cbc unsupported: false, false, party: , , , , unsupported: false, false, false, false, false party: , , , , unsupported: false, false, false, false, false af3ecf84-528b-4dd2-a9f3-00652230e6a7, 93238fef-2cc4-48e2-beff-c65dd121e26f, , , , unsupported: false, false, false, false, false passed: true, 65973ddf-fd4e-4666-b27f-d532e47a75d5, bbbf41aa-2879-425c-97de-177dfdd94789, passed: true, true, true, true, true test failed: false, false, 16170eca-5e29-4992-831e-d526ddefdcc1, false passed: false, false, false test failed: false, false, passed: true, true, true, true, true test failed: false, false, passed: true, true, true, true, true test failed: false, false, fa675d16-3a4d-4470-84ae-e81f2daffbad, e106a814-bc1a-422c-8d7a-92533f552b60, true, true, true, true test failed: false, false, false, false, false 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, 20f1c1dc-74b4-4591-85ff-09418a0a1c40, false, false, false d0cc9018-3bbe-4276-a7d4-68189dece8b5 unsupported: false, false, false false, false, false false, false, false c3a50072-0d81-4da7-b5dc-642b7f6317b4 unsupported: false, false, da3d7e80-1c90-4750-b247-c5517c117d59 unsupported: false, false, 95783e57-aee7-4a73-a645-c6cc2d995cf7 unsupported: false, false, d88860c2-282f-471a-82ed-861ef21d1e9b unsupported: false, false, false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false write: async (secret) => { // Ensure that we can switch over to write: async (secret) => { // Ensure that we can switch over to write: async (secret) => { // Ensure that we can switch over to write: async (secret) => { // Ensure that we can switch over to write: async (secret) => { // Ensure that we can switch over to write: async (secret) => { // Ensure that we can switch over to h3 via alt-svc: for (let i = 0; i<3; ++i) { await fetch(`https:// h3 via alt-svc: for (let i = 0; i<3; ++i) { await fetch(`https:// h3 via alt-svc: for (let i = 0; i<3; ++i) { await fetch(`https:// h3 via alt-svc: for (let i = 0; i<3; ++i) { await fetch(`https:// h3 via alt-svc: for (let i = 0; i<3; ++i) { await fetch(`https:// h3 via alt-svc: for (let i = 0; i<3; ++i) { await fetch(`https:// h3.arthuredelstein.net:4433/connection_id`, {cache: "no-store"}); h3.arthuredelstein.net:4433/connection_id`, {cache: "no-store"}); write: async (secret) => { // Ensure that we can switch over to h3.arthuredelstein.net:4433/connection_id`, {cache: "no-store"}); write: async (secret) => { // Ensure that we can switch over to h3.arthuredelstein.net:4433/connection_id`, {cache: "no-store"}); h3.arthuredelstein.net:4433/connection_id`, {cache: "no-store"}); h3.arthuredelstein.net:4433/connection_id`, {cache: "no-store"}); await sleepMs(500); } // Are we now connecting over h3? let await sleepMs(500); } // Are we now connecting over h3? let h3 via alt-svc: for (let i = 0; i<3; ++i) { await fetch(`https:// await sleepMs(500); } // Are we now connecting over h3? let h3 via alt-svc: for (let i = 0; i<3; ++i) { await fetch(`https:// await sleepMs(500); } // Are we now connecting over h3? let await sleepMs(500); } // Are we now connecting over h3? let await sleepMs(500); } // Are we now connecting over h3? let response = await fetch(`https://h3.arthuredelstein.net:4433/ response = await fetch(`https://h3.arthuredelstein.net:4433/ h3.arthuredelstein.net:4433/connection_id`, {cache: "no-store"}); response = await fetch(`https://h3.arthuredelstein.net:4433/ h3.arthuredelstein.net:4433/connection_id`, {cache: "no-store"}); response = await fetch(`https://h3.arthuredelstein.net:4433/ - write: async (secret) => { // Ensure that we can switch over to response = await fetch(`https://h3.arthuredelstein.net:4433/ response = await fetch(`https://h3.arthuredelstein.net:4433/ connection_id`, {cache: "no-store"}); let text = await connection_id`, {cache: "no-store"}); let text = await await sleepMs(500); } // Are we now connecting over h3? let connection_id`, {cache: "no-store"}); let text = await await sleepMs(500); } // Are we now connecting over h3? let connection_id`, {cache: "no-store"}); let text = await h3 via alt-svc: for (let i = 0; i<3; ++i) { await fetch(`https:// - write: async (secret) => { // Ensure that we can switch over to h3 connection_id`, {cache: "no-store"}); let text = await connection_id`, {cache: "no-store"}); let text = await response.text(); // Empty response text indicates we are not response.text(); // Empty response text indicates we are not response = await fetch(`https://h3.arthuredelstein.net:4433/ response.text(); // Empty response text indicates we are not response = await fetch(`https://h3.arthuredelstein.net:4433/ response.text(); // Empty response text indicates we are not h3.arthuredelstein.net:4433/connection_id`, {cache: "no-store"}); via alt-svc: for (let i = 0; i<3; ++i) { await fetch(`https:// response.text(); // Empty response text indicates we are not response.text(); // Empty response text indicates we are not connecting over h3: if (text.trim() === "") { throw new Error connecting over h3: if (text.trim() === "") { throw new Error connection_id`, {cache: "no-store"}); let text = await connecting over h3: if (text.trim() === "") { throw new Error connection_id`, {cache: "no-store"}); let text = await connecting over h3: if (text.trim() === "") { throw new Error await sleepMs(500); } // Are we now connecting over h3? let h3.arthuredelstein.net:4433/connection_id`, {cache: "no-store"}); connecting over h3: if (text.trim() === "") { throw new Error connecting over h3: if (text.trim() === "") { throw new Error H3 connectionHTTP/3 is a new ("Unsupported"); } } read: async () => { let response = await ("Unsupported"); } } read: async () => { let response = await response.text(); // Empty response text indicates we are not ("Unsupported"); } } read: async () => { let response = await response.text(); // Empty response text indicates we are not ("Unsupported"); } } read: async () => { let response = await response = await fetch(`https://h3.arthuredelstein.net:4433/ await sleepMs(500); } // Are we now connecting over h3? let response ("Unsupported"); } } read: async () => { let response = await ("Unsupported"); } } read: async () => { let response = await standard HTTP connection fetch(`https://h3.arthuredelstein.net:4433/connection_id`); fetch(`https://h3.arthuredelstein.net:4433/connection_id`); connecting over h3: if (text.trim() === "") { throw new Error fetch(`https://h3.arthuredelstein.net:4433/connection_id`); connecting over h3: if (text.trim() === "") { throw new Error fetch(`https://h3.arthuredelstein.net:4433/connection_id`); connection_id`, {cache: "no-store"}); let text = await = await fetch(`https://h3.arthuredelstein.net:4433/connection_id`, fetch(`https://h3.arthuredelstein.net:4433/connection_id`); fetch(`https://h3.arthuredelstein.net:4433/connection_id`); protocol, still in draft but return await response.text(); } result, same first party: return await response.text(); } result, same first party: ("Unsupported"); } } read: async () => { let response = await return await response.text(); } result, same first party: ("Unsupported"); } } read: async () => { let response = await return await response.text(); } result, same first party: response.text(); // Empty response text indicates we are not {cache: "no-store"}); let text = await response.text(); // Empty return await response.text(); } result, same first party: return await response.text(); } result, same first party: widely supported by browsers. 0d92773de07d80a674c417507bf4b465, 467274f9c131019ad89494ce4a07bece, fetch(`https://h3.arthuredelstein.net:4433/connection_id`); 27f51fe1a7685f2941e4ab5de795dd63, fetch(`https://h3.arthuredelstein.net:4433/connection_id`); 9afef28d24467160c3c4184df11da154, connecting over h3: if (text.trim() === "") { throw new Error response text indicates we are not connecting over h3: if (text.trim 0c6edc10c7822d58e26bb3384e440b25, 08440ff10541bef6ce3f8e88efe87c37, If it is not partitioned, it 023da9ae1f17a5c5a1ce6508b5fcf706, 972925ee1824c84242d7eb95981d103c, return await response.text(); } result, same first party: ea0b08bd5074e3c5a37d826191efbbaa, return await response.text(); } result, same first party: d4b704d033436c4cb7b19a80e9204d52, ("Unsupported"); } } read: async () => { let response = await () === "") { throw new Error("Unsupported"); } } read: async () => { 271bad0124a2a11e1f0ee461767de9e3, 51db52a7318cf194771013cf20a24bf0, can be used to track users 19fe4c26a1e209f66f596d0ba537ec66, ac33f66b057725a3bf38fcfede9beeb7, 88c593a3da97619e898625e21881a6d9, b08adfafd90326b209e7917c543fc4f1, 5f44a292f4740f4aa9d68dcdf2e00b94, 67e0c6006d61ce1a45f7170a6c96b9c5, fetch(`https://h3.arthuredelstein.net:4433/connection_id`); let response = await fetch(`https://h3.arthuredelstein.net:4433/ 5e9cb26f9b06e58ba65036e5c67d461c, 62129c8230ebb04c9dd4df66dfcc71b2, across websites. e9ce4278ea43d051c070d9cc896d96ee, 13352e55899d1cdeb14e962571b4459f, 7d66f6f19be47fa1556990f08442c471, e2813d19e58a83139cde8b0f61b1bb8f, 0cc020fee281310f438dcb1632a0f0f5, 6479399ed6dd2c43e37f900cb8458335, return await response.text(); } result, same first party: , , , , connection_id`); return await response.text(); } result, same first 81c20251e92ab68d6d6831e247f4ca1c, 7cf13b262d500bd7a31c68ddbf5b79ad, bcde9a441a475a3cf079472dec8369eb result, different first party: d14159da34bca48b76c398989e4f7b87 result, different first party: 796d1fa1ac88462a9ff4201e7fa5c2fb result, different first party: c8b8477732744cd1b13363599b766302 result, different first party: 02a0c3d49aa302f4a91209cbbab645a1, 9d50a3b5e6fe6e0279875090f28b4825 result, different first party: result, different first party: , , , , unsupported: true, true, party: , , , , result, different first party: , , , , unsupported: 3f097ba33310d4fb7d1c391696ae7f2b result, different first party: d1ac669ffc6c33ff0fec89e343e621cb result, different first party: 4131fb19ffb279e0b66a3b7bf5fa8e4b, 467274f9c131019ad89494ce4a07bece, 88c593a3da97619e898625e21881a6d9, 738c1fda8cb54dbf47c9a4fb3ea50461, 5b114902734b6f4f2b6d234516ed3316, 9afef28d24467160c3c4184df11da154, true, true, true passed: undefined test failed: false, false, true, true, true, true, true passed: undefined test failed: false, 0c6edc10c7822d58e26bb3384e440b25, 08440ff10541bef6ce3f8e88efe87c37, 6c72e7b9283ef512d6249d89ae3c4166, 972925ee1824c84242d7eb95981d103c, 7d66f6f19be47fa1556990f08442c471, 6822d5a1392930f04325fe62de6dca06, ae30e7a03d1a34c22daa9ba7b446c77c result, different first party: , d4b704d033436c4cb7b19a80e9204d52, false, false, false false, false, false, false 271bad0124a2a11e1f0ee461767de9e3, 51db52a7318cf194771013cf20a24bf0, d040d58facfb62964e9ddbeca0ef4f15, , ac33f66b057725a3bf38fcfede9beeb7, 796d1fa1ac88462a9ff4201e7fa5c2fb unsupported: false, false, false 04c44fe6833e9bbcd8d91df2bc1e98d0, , , , unsupported: false, false, false, false, false passed: 67e0c6006d61ce1a45f7170a6c96b9c5, 5e9cb26f9b06e58ba65036e5c67d461c, 62129c8230ebb04c9dd4df66dfcc71b2, 59671ac71db1b10a265ea1e537f9992f unsupported: false, false, 13352e55899d1cdeb14e962571b4459f, passed: false, false, false test failed: false, false, false 98f862b0e6157b0f6f78e94ecb222f62, true, true, true, true, true test failed: false, false, false, 6479399ed6dd2c43e37f900cb8458335, 81c20251e92ab68d6d6831e247f4ca1c, 7cf13b262d500bd7a31c68ddbf5b79ad, false, false, false passed: true, true, true, true, true test d14159da34bca48b76c398989e4f7b87 unsupported: false, false, 0a160595c6e46cd8a497e02d59420c16 unsupported: false, false, false, false 9d50a3b5e6fe6e0279875090f28b4825 unsupported: false, false, 3f097ba33310d4fb7d1c391696ae7f2b unsupported: false, false, d1ac669ffc6c33ff0fec89e343e621cb unsupported: false, false, failed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: true, true, true, true, true test false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false test failed: false, false, false, false, false failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false HSTS cacheThe HTTP Strict-Transport-Security write: null read: null result, same first party: , , , , response header allows a write: set HSTS flag read: read HSTS flag result, same first write: set HSTS flag read: read HSTS flag result, same first write: set HSTS flag read: read HSTS flag result, same first result, different first party: HTTPS used by default; no HSTS write: set HSTS flag read: read HSTS flag result, same first write: set HSTS flag read: read HSTS flag result, same first write: set HSTS flag read: read HSTS flag result, same first party: write: set HSTS flag read: read HSTS flag result, same first write: set HSTS flag read: read HSTS flag result, same first website to signal that it party: not tested, not tested, not tested, not tested, not tested party: not tested, not tested, not tested, not tested, not tested write: set HSTS flag read: read HSTS flag result, same first party: not tested, not tested, not tested, not tested, not tested cache issue expected, HTTPS used by default; no HSTS cache issue party: not tested, not tested, not tested, not tested, not tested party: not tested, not tested, not tested, not tested, not tested not tested, not tested, not tested, not tested, not tested result, party: not tested, not tested, not tested, not tested, not tested party: not tested, not tested, not tested, not tested, not tested should only be accessed via result, different first party: Upgraded to https, Upgraded to result, different first party: Upgraded to https, Upgraded to party: not tested, not tested, not tested result, different first result, different first party: Used http, Used http, Used http, expected, HTTPS used by default; no HSTS cache issue expected, result, different first party: Upgraded to https, Upgraded to result, different first party: Used http, Used http, Used http, different first party: Used http, Used http, Used http, Used http, result, different first party: Upgraded to https, Upgraded to result, different first party: Upgraded to https, Upgraded to HTTPS. The browser remembers https, Upgraded to https, Upgraded to https, Upgraded to https https, Upgraded to https, Upgraded to https, Upgraded to https party: Upgraded to https, Upgraded to https, Upgraded to https Used http, Used http unsupported: false, false, false, false, HTTPS used by default; no HSTS cache issue expected, HTTPS used https, Upgraded to https, Upgraded to https, Upgraded to https Used http, Used http unsupported: false, false, false, false, Used http unsupported: false, false, false, false, false passed: https, Upgraded to https, Upgraded to https, Upgraded to https https, Upgraded to https, Upgraded to https, Upgraded to https this directive in a database, unsupported: false, false, false, false, false passed: false, unsupported: false, false, false, false, false passed: false, unsupported: false, false, false passed: false, false, false test false passed: true, true, true, true, true test failed: false, by default; no HSTS cache issue expected unsupported: , , , , unsupported: false, false, false, false, false passed: false, false passed: true, true, true, true, true test failed: false, true, true, true, true, true test failed: false, false, false, false, unsupported: false, false, false, false, false passed: false, unsupported: false, false, false, false, false passed: false, but if this database is not false, false, false, false test failed: false, false, false, false, false, false, false test failed: false, false, false, failed: false, false, false false, false, false, false passed: true, true, true, true, true test failed: false, false, false, false, false, false test failed: false, false, false, false, false, false, false false false, false, false, false test failed: false, false, false, false, false, false, false test failed: false, false, false, partitioned, then it can be false, false false, false false, false, false false, false false, false false, false used to track users across websites." write: (key) => new Promise((resolve, reject) => { let iframe = write: (key) => new Promise((resolve, reject) => { let iframe = write: (key) => new Promise((resolve, reject) => { let iframe = write: (key) => new Promise((resolve, reject) => { let iframe = write: (key) => new Promise((resolve, reject) => { let iframe = write: (key) => new Promise((resolve, reject) => { let iframe = write: (key) => new Promise((resolve, reject) => { let iframe = write: (key) => new Promise((resolve, reject) => { let iframe = write: (key) => new Promise((resolve, reject) => { let iframe = write: (key) => new Promise((resolve, reject) => { let iframe = document.createElement("iframe"); document.body.appendChild document.createElement("iframe"); document.body.appendChild document.createElement("iframe"); document.body.appendChild document.createElement("iframe"); document.body.appendChild document.createElement("iframe"); document.body.appendChild document.createElement("iframe"); document.body.appendChild document.createElement("iframe"); document.body.appendChild document.createElement("iframe"); document.body.appendChild(iframe); document.createElement("iframe"); document.body.appendChild document.createElement("iframe"); document.body.appendChild (iframe); iframe.addEventListener("load", () => resolve(key), (iframe); iframe.addEventListener("load", () => resolve(key), (iframe); iframe.addEventListener("load", () => resolve(key), (iframe); iframe.addEventListener("load", () => resolve(key), (iframe); iframe.addEventListener("load", () => resolve(key), (iframe); iframe.addEventListener("load", () => resolve(key), (iframe); iframe.addEventListener("load", () => resolve(key), iframe.addEventListener("load", () => resolve(key), {once: true}); (iframe); iframe.addEventListener("load", () => resolve(key), (iframe); iframe.addEventListener("load", () => resolve(key), {once: true}); iframe.src = testURI("resource", "page", key); }) {once: true}); iframe.src = testURI("resource", "page", key); }) {once: true}); iframe.src = testURI("resource", "page", key); }) {once: true}); iframe.src = testURI("resource", "page", key); }) {once: true}); iframe.src = testURI("resource", "page", key); }) {once: true}); iframe.src = testURI("resource", "page", key); }) {once: true}); iframe.src = testURI("resource", "page", key); }) iframe.src = testURI("resource", "page", key); }) read: async (key) {once: true}); iframe.src = testURI("resource", "page", key); }) {once: true}); iframe.src = testURI("resource", "page", key); }) iframe cacheAn iframe is an read: async (key) => { let iframe = document.createElement read: async (key) => { let iframe = document.createElement read: async (key) => { let iframe = document.createElement read: async (key) => { let iframe = document.createElement read: async (key) => { let iframe = document.createElement read: async (key) => { let iframe = document.createElement read: async (key) => { let iframe = document.createElement => { let iframe = document.createElement("iframe"); read: async (key) => { let iframe = document.createElement read: async (key) => { let iframe = document.createElement element in a web page than ("iframe"); document.body.appendChild(iframe); let ("iframe"); document.body.appendChild(iframe); let ("iframe"); document.body.appendChild(iframe); let ("iframe"); document.body.appendChild(iframe); let ("iframe"); document.body.appendChild(iframe); let ("iframe"); document.body.appendChild(iframe); let ("iframe"); document.body.appendChild(iframe); let document.body.appendChild(iframe); let iframeLoadPromise = new ("iframe"); document.body.appendChild(iframe); let ("iframe"); document.body.appendChild(iframe); let allows websites to embed a iframeLoadPromise = new Promise((resolve, reject) => { iframeLoadPromise = new Promise((resolve, reject) => { iframeLoadPromise = new Promise((resolve, reject) => { iframeLoadPromise = new Promise((resolve, reject) => { iframeLoadPromise = new Promise((resolve, reject) => { iframeLoadPromise = new Promise((resolve, reject) => { iframeLoadPromise = new Promise((resolve, reject) => { Promise((resolve, reject) => { iframe.addEventListener("load", iframeLoadPromise = new Promise((resolve, reject) => { iframeLoadPromise = new Promise((resolve, reject) => { second web page. Caching of iframe.addEventListener("load", resolve, {once: true}); }); let iframe.addEventListener("load", resolve, {once: true}); }); let iframe.addEventListener("load", resolve, {once: true}); }); let iframe.addEventListener("load", resolve, {once: true}); }); let iframe.addEventListener("load", resolve, {once: true}); }); let iframe.addEventListener("load", resolve, {once: true}); }); let iframe.addEventListener("load", resolve, {once: true}); }); let resolve, {once: true}); }); let address = testURI("resource", "page", iframe.addEventListener("load", resolve, {once: true}); }); let iframe.addEventListener("load", resolve, {once: true}); }); let this web page could be abused address = testURI("resource", "page", key); iframe.src = address; address = testURI("resource", "page", key); iframe.src = address; address = testURI("resource", "page", key); iframe.src = address; address = testURI("resource", "page", key); iframe.src = address; address = testURI("resource", "page", key); iframe.src = address; address = testURI("resource", "page", key); iframe.src = address; address = testURI("resource", "page", key); iframe.src = address; key); iframe.src = address; await iframeLoadPromise; let response = address = testURI("resource", "page", key); iframe.src = address; address = testURI("resource", "page", key); iframe.src = address; for cross-site tracking. await iframeLoadPromise; let response = await fetch( testURI await iframeLoadPromise; let response = await fetch( testURI await iframeLoadPromise; let response = await fetch( testURI await iframeLoadPromise; let response = await fetch( testURI await iframeLoadPromise; let response = await fetch( testURI await iframeLoadPromise; let response = await fetch( testURI await iframeLoadPromise; let response = await fetch( testURI await fetch( testURI("ctr", "page", key), {"cache": "reload"}); await iframeLoadPromise; let response = await fetch( testURI await iframeLoadPromise; let response = await fetch( testURI ("ctr", "page", key), {"cache": "reload"}); return (await ("ctr", "page", key), {"cache": "reload"}); return (await ("ctr", "page", key), {"cache": "reload"}); return (await ("ctr", "page", key), {"cache": "reload"}); return (await ("ctr", "page", key), {"cache": "reload"}); return (await ("ctr", "page", key), {"cache": "reload"}); return (await ("ctr", "page", key), {"cache": "reload"}); return (await return (await response.text()).trim(); } result, same first party: 1, ("ctr", "page", key), {"cache": "reload"}); return (await ("ctr", "page", key), {"cache": "reload"}); return (await response.text()).trim(); } result, same first party: 1, 1, 1, 1, response.text()).trim(); } result, same first party: 1, 1, 1, 1, response.text()).trim(); } result, same first party: 1, 1, 1 response.text()).trim(); } result, same first party: 1, 1, 1, 1, response.text()).trim(); } result, same first party: 1, 1, 1, 1, response.text()).trim(); } result, same first party: 1, 1, 1, 1, response.text()).trim(); } result, same first party: 1, 1, 1, 1, 1, 1, 1, 1 result, different first party: 2, 2, 2, 2, 2 unsupported: response.text()).trim(); } result, same first party: 1, 1, 1, 1, response.text()).trim(); } result, same first party: 1, 1, 1, 1, 1 result, different first party: 2, 2, 2, 2, 2 unsupported: 1 result, different first party: 2, 2, 2, 2, 2 unsupported: result, different first party: 2, 2, 2 unsupported: false, false, 1 result, different first party: 2, 2, 2, 2, 2 unsupported: 1 result, different first party: 2, 2, 2, 2, 2 unsupported: 1 result, different first party: 2, 2, 2, 2, 2 unsupported: 1 result, different first party: 2, 2, 2, 2, 2 unsupported: false, false, false, false, false passed: true, true, true, true, 1 result, different first party: 2, 2, 2, 2, 2 unsupported: 1 result, different first party: 2, 2, 2, 2, 2 unsupported: false, false, false, false, false passed: true, true, true, true, false, false, false, false, false passed: true, true, true, true, false passed: true, true, true test failed: false, false, false false, false, false, false, false passed: true, true, true, true, false, false, false, false, false passed: true, true, true, true, false, false, false, false, false passed: true, true, true, true, false, false, false, false, false passed: true, true, true, true, true test failed: false, false, false, false, false false, false, false, false, false passed: true, true, true, true, false, false, false, false, false passed: true, true, true, true, true test failed: false, false, false, false, false true test failed: false, false, false, false, false true test failed: false, false, false, false, false true test failed: false, false, false, false, false true test failed: false, false, false, false, false true test failed: false, false, false, false, false true test failed: false, false, false, false, false true test failed: false, false, false, false, false write: (key) => new Promise((resolve, reject) => { let img = write: (key) => new Promise((resolve, reject) => { let img = write: (key) => new Promise((resolve, reject) => { let img = write: (key) => new Promise((resolve, reject) => { let img = write: (key) => new Promise((resolve, reject) => { let img = write: (key) => new Promise((resolve, reject) => { let img = write: (key) => new Promise((resolve, reject) => { let img = write: (key) => new Promise((resolve, reject) => { let img = write: (key) => new Promise((resolve, reject) => { let img = write: (key) => new Promise((resolve, reject) => { let img = document.createElement("img"); document.body.appendChild(img); document.createElement("img"); document.body.appendChild(img); document.createElement("img"); document.body.appendChild(img); document.createElement("img"); document.body.appendChild(img); document.createElement("img"); document.body.appendChild(img); document.createElement("img"); document.body.appendChild(img); document.createElement("img"); document.body.appendChild(img); document.createElement("img"); document.body.appendChild(img); document.createElement("img"); document.body.appendChild(img); document.createElement("img"); document.body.appendChild(img); img.addEventListener("load", () => resolve(key), {once: true}); img.addEventListener("load", () => resolve(key), {once: true}); img.addEventListener("load", () => resolve(key), {once: true}); img.addEventListener("load", () => resolve(key), {once: true}); img.addEventListener("load", () => resolve(key), {once: true}); img.addEventListener("load", () => resolve(key), {once: true}); img.addEventListener("load", () => resolve(key), {once: true}); img.addEventListener("load", () => resolve(key), {once: true}); img.addEventListener("load", () => resolve(key), {once: true}); img.addEventListener("load", () => resolve(key), {once: true}); img.src = testURI("resource", "image", key); }) read: async (key) img.src = testURI("resource", "image", key); }) read: async (key) img.src = testURI("resource", "image", key); }) read: async (key) img.src = testURI("resource", "image", key); }) read: async (key) img.src = testURI("resource", "image", key); }) read: async (key) img.src = testURI("resource", "image", key); }) read: async (key) img.src = testURI("resource", "image", key); }) read: async (key) img.src = testURI("resource", "image", key); }) read: async (key) => img.src = testURI("resource", "image", key); }) read: async (key) img.src = testURI("resource", "image", key); }) read: async (key) image cacheCaching of images in => { let img = document.createElement("img"); => { let img = document.createElement("img"); => { let img = document.createElement("img"); => { let img = document.createElement("img"); => { let img = document.createElement("img"); => { let img = document.createElement("img"); => { let img = document.createElement("img"); { let img = document.createElement("img"); document.body.appendChild => { let img = document.createElement("img"); => { let img = document.createElement("img"); web browsers is a standard document.body.appendChild(img); let imgLoadPromise = new Promise document.body.appendChild(img); let imgLoadPromise = new Promise document.body.appendChild(img); let imgLoadPromise = new Promise document.body.appendChild(img); let imgLoadPromise = new Promise document.body.appendChild(img); let imgLoadPromise = new Promise document.body.appendChild(img); let imgLoadPromise = new Promise document.body.appendChild(img); let imgLoadPromise = new Promise (img); let imgLoadPromise = new Promise((resolve, reject) => { document.body.appendChild(img); let imgLoadPromise = new Promise document.body.appendChild(img); let imgLoadPromise = new Promise behavior. But if that cache ((resolve, reject) => { img.addEventListener("load", resolve, ((resolve, reject) => { img.addEventListener("load", resolve, ((resolve, reject) => { img.addEventListener("load", resolve, ((resolve, reject) => { img.addEventListener("load", resolve, ((resolve, reject) => { img.addEventListener("load", resolve, ((resolve, reject) => { img.addEventListener("load", resolve, ((resolve, reject) => { img.addEventListener("load", resolve, img.addEventListener("load", resolve, {once: true}); }); img.src = ((resolve, reject) => { img.addEventListener("load", resolve, ((resolve, reject) => { img.addEventListener("load", resolve, leaks between websites, it can {once: true}); }); img.src = testURI("resource", "image", key); {once: true}); }); img.src = testURI("resource", "image", key); {once: true}); }); img.src = testURI("resource", "image", key); {once: true}); }); img.src = testURI("resource", "image", key); {once: true}); }); img.src = testURI("resource", "image", key); {once: true}); }); img.src = testURI("resource", "image", key); {once: true}); }); img.src = testURI("resource", "image", key); testURI("resource", "image", key); await imgLoadPromise; let response {once: true}); }); img.src = testURI("resource", "image", key); {once: true}); }); img.src = testURI("resource", "image", key); be abused for cross-site await imgLoadPromise; let response = await fetch( testURI("ctr", await imgLoadPromise; let response = await fetch( testURI("ctr", await imgLoadPromise; let response = await fetch( testURI("ctr", await imgLoadPromise; let response = await fetch( testURI("ctr", await imgLoadPromise; let response = await fetch( testURI("ctr", await imgLoadPromise; let response = await fetch( testURI("ctr", await imgLoadPromise; let response = await fetch( testURI("ctr", = await fetch( testURI("ctr", "image", key), {"cache": "reload"}); await imgLoadPromise; let response = await fetch( testURI("ctr", await imgLoadPromise; let response = await fetch( testURI("ctr", tracking. "image", key), {"cache": "reload"}); return (await response.text "image", key), {"cache": "reload"}); return (await response.text "image", key), {"cache": "reload"}); return (await response.text "image", key), {"cache": "reload"}); return (await response.text "image", key), {"cache": "reload"}); return (await response.text "image", key), {"cache": "reload"}); return (await response.text "image", key), {"cache": "reload"}); return (await response.text return (await response.text()).trim(); } result, same first party: 1, "image", key), {"cache": "reload"}); return (await response.text "image", key), {"cache": "reload"}); return (await response.text ()).trim(); } result, same first party: 1, 1, 1, 1, 1 result, ()).trim(); } result, same first party: 1, 1, 1, 1, 1 result, ()).trim(); } result, same first party: 1, 1, 1 result, different ()).trim(); } result, same first party: 1, 1, 1, 1, 1 result, ()).trim(); } result, same first party: 1, 1, 1, 1, 1 result, ()).trim(); } result, same first party: 1, 1, 1, 1, 1 result, ()).trim(); } result, same first party: 1, 1, 1, 1, 1 result, 1, 1, 1, 1 result, different first party: 2, 2, 2, 2, 2 unsupported: ()).trim(); } result, same first party: 1, 1, 1, 1, 1 result, ()).trim(); } result, same first party: 1, 1, 1, 1, 1 result, different first party: 1, 1, 1, 1, 1 unsupported: false, false, different first party: 1, 1, 1, 1, 1 unsupported: false, false, first party: 1, 1, 1 unsupported: false, false, false passed: different first party: 2, 2, 2, 2, 2 unsupported: false, false, different first party: 2, 2, 2, 2, 2 unsupported: false, false, different first party: 1, 1, 1, 1, 1 unsupported: false, false, different first party: 2, 2, 2, 2, 2 unsupported: false, false, false, false, false, false, false passed: true, true, true, true, different first party: 1, 1, 1, 1, 1 unsupported: false, false, different first party: 1, 1, 1, 1, 1 unsupported: false, false, false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false test failed: false, false, false false, false, false passed: true, true, true, true, true test false, false, false passed: true, true, true, true, true test false, false, false passed: false, false, false, false, false false, false, false passed: true, true, true, true, true test true test failed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false failed: false, false, false, false, false failed: false, false, false, false, false test failed: false, false, false, false, false failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false write: async (secret) => { try { return await IdbKeyVal.set write: async (secret) => { try { return await IdbKeyVal.set write: async (secret) => { try { return await IdbKeyVal.set write: async (secret) => { try { return await IdbKeyVal.set - write: async (secret) => { try { return await IdbKeyVal.set write: async (secret) => { try { return await IdbKeyVal.set write: async (secret) => { try { return await IdbKeyVal.set ("secret", secret); } catch (e) { throw new Error("Unsupported"); ("secret", secret); } catch (e) { throw new Error("Unsupported"); ("secret", secret); } catch (e) { throw new Error("Unsupported"); ("secret", secret); } catch (e) { throw new Error("Unsupported"); ("secret", secret); } catch (e) { throw new Error("Unsupported"); } } ("secret", secret); } catch (e) { throw new Error("Unsupported"); ("secret", secret); } catch (e) { throw new Error("Unsupported"); } } read: () => IdbKeyVal.get("secret") result, same first party: } } read: () => IdbKeyVal.get("secret") result, same first party: write: async (secret) => { try { return await IdbKeyVal.set } } read: () => IdbKeyVal.get("secret") result, same first party: write: async (secret) => { try { return await IdbKeyVal.set } } read: () => IdbKeyVal.get("secret") result, same first party: write: async (secret) => { try { return await IdbKeyVal.set read: () => IdbKeyVal.get("secret") result, same first party: Error: } } read: () => IdbKeyVal.get("secret") result, same first party: } } read: () => IdbKeyVal.get("secret") result, same first party: fb9ada0c-2dd5-445b-8766-6a96ede1d675, 60d9cae6-595e-4a6b-952e-67d678e4f68b, ("secret", secret); } catch (e) { throw new Error("Unsupported"); 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, ("secret", secret); } catch (e) { throw new Error("Unsupported"); a631e40c-7719-47f9-9802-2d54a24d3d01, ("secret", secret); } catch (e) { throw new Error("Unsupported"); A mutation operation was attempted on a database that did not allow abf0475f-b7ff-41d5-9465-e439243ec199, b51acfca-da9f-4c94-8276-65083891df3f, indexedDBThe IndexedDB API 5755b44c-4043-49c5-9206-d69be4536a7b, 31409229-bd59-4c8e-a3b9-b3f1c1278a43, } } read: () => IdbKeyVal.get("secret") result, same first party: 9d820b16-d670-40c0-ac68-50e242ed5b70, } } read: () => IdbKeyVal.get("secret") result, same first party: ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, } } read: () => IdbKeyVal.get("secret") result, same first party: mutations., Error: A mutation operation was attempted on a database 3aefe95d-2acc-4dfb-9a93-8b362330a688, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, exposes a transactional e1f98084-6527-424b-b09f-a5c0cda014fb, 08ee6f87-c109-44fc-8a01-1a1964a172b4, 921ea021-85bd-45d2-bffe-067d18811194, 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, ccf7b60c-0a34-4542-9d4a-dc6388ae2f2c, af3ecf84-528b-4dd2-a9f3-00652230e6a7, 109e075c-f3af-43a0-9f3e-031a5a3c3dc0, that did not allow mutations., Error: A mutation operation was 65973ddf-fd4e-4666-b27f-d532e47a75d5, bbbf41aa-2879-425c-97de-177dfdd94789, database to web pages. That 8eb1e74b-357b-4308-a912-1888453d9111, 16170eca-5e29-4992-831e-d526ddefdcc1, ecc64992-4894-4432-94ed-c2e1822cf985, a78bfa05-b279-4e1b-9a07-11354b649bd8, 435c28c6-4255-4bfe-a586-84fa6938e442, fa675d16-3a4d-4470-84ae-e81f2daffbad, 281040ec-68e0-4834-bce0-775462672325, attempted on a database that did not allow mutations., Error: A 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, 20f1c1dc-74b4-4591-85ff-09418a0a1c40, database can be used to track 4f7a9ad6-187c-4caf-b184-d18908436921 result, different first d0cc9018-3bbe-4276-a7d4-68189dece8b5 result, different first bd96efb2-a858-4732-9376-9ea9890e4cbc result, different first fd7aa2af-8986-47a6-a043-c0a9bfdbd609 result, different first ac90c185-5b06-43e2-a37f-c59529ed65a2, c3a50072-0d81-4da7-b5dc-642b7f6317b4 result, different first 93238fef-2cc4-48e2-beff-c65dd121e26f, mutation operation was attempted on a database that did not allow 95783e57-aee7-4a73-a645-c6cc2d995cf7 result, different first d88860c2-282f-471a-82ed-861ef21d1e9b result, different first users across websites, unless party: Error: The user denied permission to access the database., party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, party: 921ea021-85bd-45d2-bffe-067d18811194, party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, 7f1ad153-7218-42f6-8c33-76b666e5857e, party: a631e40c-7719-47f9-9802-2d54a24d3d01, e106a814-bc1a-422c-8d7a-92533f552b60, mutations., Error: A mutation operation was attempted on a database party: Error: The user denied permission to access the database., party: b51acfca-da9f-4c94-8276-65083891df3f, it is partitioned. Error: The user denied permission to access the database., Error: 31409229-bd59-4c8e-a3b9-b3f1c1278a43, ecc64992-4894-4432-94ed-c2e1822cf985, 9d820b16-d670-40c0-ac68-50e242ed5b70, 378a0c14-2649-4b3a-93e4-94f5a06a3409 result, different first ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, da3d7e80-1c90-4750-b247-c5517c117d59 result, different first that did not allow mutations. result, different first party: Error: Error: The user denied permission to access the database., Error: f69e52b8-8ceb-419c-84ab-4beb4fd5714f, The user denied permission to access the database., Error: The 08ee6f87-c109-44fc-8a01-1a1964a172b4, bd96efb2-a858-4732-9376-9ea9890e4cbc unsupported: false, false, 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, party: undefined unsupported: false, false, false, false, false af3ecf84-528b-4dd2-a9f3-00652230e6a7, party: undefined unsupported: false, false, false, false, false The operation is insecure., Error: The operation is insecure., Error: The user denied permission to access the database., Error: The bbbf41aa-2879-425c-97de-177dfdd94789, user denied permission to access the database., Error: The user 16170eca-5e29-4992-831e-d526ddefdcc1, false passed: false, false, false test failed: false, false, a78bfa05-b279-4e1b-9a07-11354b649bd8, passed: true, true, true, true, true test failed: false, false, fa675d16-3a4d-4470-84ae-e81f2daffbad, passed: true, true, true, true, true test failed: false, false, The operation is insecure., Error: The operation is insecure., Error: user denied permission to access the database., Error: The user 20f1c1dc-74b4-4591-85ff-09418a0a1c40, denied permission to access the database. unsupported: false, d0cc9018-3bbe-4276-a7d4-68189dece8b5 unsupported: false, false, false fd7aa2af-8986-47a6-a043-c0a9bfdbd609 unsupported: false, false, false, false, false c3a50072-0d81-4da7-b5dc-642b7f6317b4 unsupported: false, false, false, false, false The operation is insecure. unsupported: true, true, true, true, true denied permission to access the database. unsupported: false, d88860c2-282f-471a-82ed-861ef21d1e9b unsupported: false, false, false, false, false, false passed: true, true, true, true, true false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false passed: undefined test failed: false, false, false, false, false false, false, false, false passed: true, true, true, true, true false, false, false passed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false write: (secret) => localStorage.setItem("secret", secret) read: () => localStorage.getItem("secret") result, same first party: write: (secret) => localStorage.setItem("secret", secret) read: write: (secret) => localStorage.setItem("secret", secret) read: write: (secret) => localStorage.setItem("secret", secret) read: abf0475f-b7ff-41d5-9465-e439243ec199, write: (secret) => localStorage.setItem("secret", secret) read: () => localStorage.getItem("secret") result, same first party: () => localStorage.getItem("secret") result, same first party: () => localStorage.getItem("secret") result, same first party: write: (secret) => localStorage.setItem("secret", secret) read: () 3aefe95d-2acc-4dfb-9a93-8b362330a688, () => localStorage.getItem("secret") result, same first party: write: (secret) => localStorage.setItem("secret", secret) read: 60d9cae6-595e-4a6b-952e-67d678e4f68b, write: (secret) => localStorage.setItem("secret", secret) read: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, write: (secret) => localStorage.setItem("secret", secret) read: a631e40c-7719-47f9-9802-2d54a24d3d01, write: (secret) => localStorage.setItem("secret", secret) read: => localStorage.getItem("secret") result, same first party: 65973ddf-fd4e-4666-b27f-d532e47a75d5, b51acfca-da9f-4c94-8276-65083891df3f, localStorageThe localStorage () => localStorage.getItem("secret") result, same first party: 31409229-bd59-4c8e-a3b9-b3f1c1278a43, () => localStorage.getItem("secret") result, same first party: 9d820b16-d670-40c0-ac68-50e242ed5b70, () => localStorage.getItem("secret") result, same first party: ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, () => localStorage.getItem("secret") result, same first party: fda373cd-c540-4d8a-b1d2-06344b686d10, 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, API gives websites access to a fb9ada0c-2dd5-445b-8766-6a96ede1d675, 08ee6f87-c109-44fc-8a01-1a1964a172b4, 921ea021-85bd-45d2-bffe-067d18811194, 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, ccf7b60c-0a34-4542-9d4a-dc6388ae2f2c, af3ecf84-528b-4dd2-a9f3-00652230e6a7, 109e075c-f3af-43a0-9f3e-031a5a3c3dc0, 7af1be6c-dfff-4a41-b0e8-fdc94d5164a8, 95783e57-aee7-4a73-a645-c6cc2d995cf7 result, different first bbbf41aa-2879-425c-97de-177dfdd94789, key-value database that will 5755b44c-4043-49c5-9206-d69be4536a7b, 16170eca-5e29-4992-831e-d526ddefdcc1, ecc64992-4894-4432-94ed-c2e1822cf985, a78bfa05-b279-4e1b-9a07-11354b649bd8, 435c28c6-4255-4bfe-a586-84fa6938e442, fa675d16-3a4d-4470-84ae-e81f2daffbad, 281040ec-68e0-4834-bce0-775462672325, e964f137-cacb-41e9-b414-cee17a19af1c, party: Error: Failed to read the 'localStorage' property from 20f1c1dc-74b4-4591-85ff-09418a0a1c40, remain available across visits. e1f98084-6527-424b-b09f-a5c0cda014fb, d0cc9018-3bbe-4276-a7d4-68189dece8b5 result, different first bd96efb2-a858-4732-9376-9ea9890e4cbc result, different first fd7aa2af-8986-47a6-a043-c0a9bfdbd609 result, different first ac90c185-5b06-43e2-a37f-c59529ed65a2, c3a50072-0d81-4da7-b5dc-642b7f6317b4 result, different first 93238fef-2cc4-48e2-beff-c65dd121e26f, 9a200a7b-cdb4-4525-b2a3-1fb3a4d43da2, 'Window': Access is denied for this document., Error: Failed to d88860c2-282f-471a-82ed-861ef21d1e9b result, different first If the localStorage API is not 8eb1e74b-357b-4308-a912-1888453d9111, party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, party: 921ea021-85bd-45d2-bffe-067d18811194, party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, 7f1ad153-7218-42f6-8c33-76b666e5857e, party: a631e40c-7719-47f9-9802-2d54a24d3d01, e106a814-bc1a-422c-8d7a-92533f552b60, f75ddab3-8f21-4547-a3ad-58db5cbc1900 result, different first party: read the 'localStorage' property from 'Window': Access is denied party: b51acfca-da9f-4c94-8276-65083891df3f, partitioned or blocked, it can 4f7a9ad6-187c-4caf-b184-d18908436921 result, different first 31409229-bd59-4c8e-a3b9-b3f1c1278a43, ecc64992-4894-4432-94ed-c2e1822cf985, 9d820b16-d670-40c0-ac68-50e242ed5b70, 378a0c14-2649-4b3a-93e4-94f5a06a3409 result, different first ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, da3d7e80-1c90-4750-b247-c5517c117d59 result, different first Error: The operation is insecure., Error: The operation is insecure., for this document., Error: Failed to read the 'localStorage' f69e52b8-8ceb-419c-84ab-4beb4fd5714f, also be used to track users party: , , , , unsupported: false, false, false, false, false 08ee6f87-c109-44fc-8a01-1a1964a172b4, bd96efb2-a858-4732-9376-9ea9890e4cbc unsupported: false, false, 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, party: , , , , unsupported: false, false, false, false, false af3ecf84-528b-4dd2-a9f3-00652230e6a7, party: , , , , unsupported: false, false, false, false, false Error: The operation is insecure., Error: The operation is insecure., property from 'Window': Access is denied for this document., bbbf41aa-2879-425c-97de-177dfdd94789, across websites. passed: true, true, true, true, true test failed: false, false, 16170eca-5e29-4992-831e-d526ddefdcc1, false passed: false, false, false test failed: false, false, a78bfa05-b279-4e1b-9a07-11354b649bd8, passed: true, true, true, true, true test failed: false, false, fa675d16-3a4d-4470-84ae-e81f2daffbad, passed: true, true, true, true, true test failed: false, false, Error: The operation is insecure. unsupported: false, false, false, Error: Failed to read the 'localStorage' property from 'Window': 20f1c1dc-74b4-4591-85ff-09418a0a1c40, false, false, false d0cc9018-3bbe-4276-a7d4-68189dece8b5 unsupported: false, false, false fd7aa2af-8986-47a6-a043-c0a9bfdbd609 unsupported: false, false, false, false, false c3a50072-0d81-4da7-b5dc-642b7f6317b4 unsupported: false, false, false, false, false false, false passed: true, true, true, true, true test failed: false, Access is denied for this document., Error: Failed to read the d88860c2-282f-471a-82ed-861ef21d1e9b unsupported: false, false, false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false, false 'localStorage' property from 'Window': Access is denied for this false, false, false passed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false document. unsupported: false, false, false, false, false passed: test failed: false, false, false, false, false true, true, true, true, true test failed: false, false, false, false, false write: async (key) => { if (navigator.locks) { write: async (key) => { if (navigator.locks) { navigator.locks.request(key, lock => new Promise((f,r) => {})); navigator.locks.request(key, lock => new Promise((f,r) => {})); let queryResult = await navigator.locks.query(); return write: async (key) => { if (navigator.locks) { write: async (key) => { if (navigator.locks) { let queryResult = await navigator.locks.query(); return write: async (key) => { if (navigator.locks) { queryResult.held[0].clientId; } else { throw new Error navigator.locks.request(key, lock => new Promise((f,r) => {})); navigator.locks.request(key, lock => new Promise((f,r) => {})); queryResult.held[0].clientId; } else { throw new Error navigator.locks.request(key, lock => new Promise((f,r) => {})); ("Unsupported"); } } read: async () => { if (navigator.locks) { let queryResult = await navigator.locks.query(); return write: async (key) => { if (navigator.locks) { let queryResult = await navigator.locks.query(); return ("Unsupported"); } } read: async () => { if (navigator.locks) { let queryResult = await navigator.locks.query(); return let queryResult = await navigator.locks.query(); return queryResult.held[0].clientId; } else { throw new Error navigator.locks.request(key, lock => new Promise((f,r) => {})); queryResult.held[0].clientId; } else { throw new Error let queryResult = await navigator.locks.query(); return queryResult.held[0].clientId; } else { throw new Error queryResult.held[0].name; } } result, same first party: ("Unsupported"); } } read: async () => { if (navigator.locks) { let queryResult = await navigator.locks.query(); return - write: async (key) => { if (navigator.locks) { - write: async (key) => { if (navigator.locks) { ("Unsupported"); } } read: async () => { if (navigator.locks) { - write: async (key) => { if (navigator.locks) { queryResult.held[0].name; } } result, same first party: ("Unsupported"); } } read: async () => { if (navigator.locks) { fb9ada0c-2dd5-445b-8766-6a96ede1d675, let queryResult = await navigator.locks.query(); return queryResult.held[0].clientId; } else { throw new Error navigator.locks.request(key, lock => new Promise((f,r) => {})); navigator.locks.request(key, lock => new Promise((f,r) => {})); let queryResult = await navigator.locks.query(); return navigator.locks.request(key, lock => new Promise((f,r) => {})); - write: async (key) => { if (navigator.locks) { abf0475f-b7ff-41d5-9465-e439243ec199, let queryResult = await navigator.locks.query(); return locksnavigator.locks (only 5755b44c-4043-49c5-9206-d69be4536a7b, queryResult.held[0].name; } } result, same first party: ("Unsupported"); } } read: async () => { if (navigator.locks) { let queryResult = await navigator.locks.query(); return let queryResult = await navigator.locks.query(); return queryResult.held[0].name; } } result, same first party: let queryResult = await navigator.locks.query(); return navigator.locks.request(key, lock => new Promise((f,r) => {})); let 3aefe95d-2acc-4dfb-9a93-8b362330a688, queryResult.held[0].name; } } result, same first party: supported in some browsers) e1f98084-6527-424b-b09f-a5c0cda014fb, 60d9cae6-595e-4a6b-952e-67d678e4f68b, let queryResult = await navigator.locks.query(); return queryResult.held[0].clientId; } else { throw new Error queryResult.held[0].clientId; } else { throw new Error a631e40c-7719-47f9-9802-2d54a24d3d01, queryResult.held[0].clientId; } else { throw new Error queryResult = await navigator.locks.query(); return queryResult.held 65973ddf-fd4e-4666-b27f-d532e47a75d5, b51acfca-da9f-4c94-8276-65083891df3f, allows scripts on multiple tabs 8eb1e74b-357b-4308-a912-1888453d9111, 31409229-bd59-4c8e-a3b9-b3f1c1278a43, queryResult.held[0].name; } } result, same first party: ("Unsupported"); } } read: async () => { if (navigator.locks) { ("Unsupported"); } } read: async () => { if (navigator.locks) { ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, ("Unsupported"); } } read: async () => { if (navigator.locks) { [0].clientId; } else { throw new Error("Unsupported"); } } read: 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, to coordinate. If this API is 4f7a9ad6-187c-4caf-b184-d18908436921 result, different first 08ee6f87-c109-44fc-8a01-1a1964a172b4, 921ea021-85bd-45d2-bffe-067d18811194, let queryResult = await navigator.locks.query(); return let queryResult = await navigator.locks.query(); return af3ecf84-528b-4dd2-a9f3-00652230e6a7, let queryResult = await navigator.locks.query(); return async () => { if (navigator.locks) { let queryResult = await 95783e57-aee7-4a73-a645-c6cc2d995cf7 result, different first bbbf41aa-2879-425c-97de-177dfdd94789, not partitioned, it can be used party: Error: Failed to execute 'query' on 'LockManager': Access 16170eca-5e29-4992-831e-d526ddefdcc1, ecc64992-4894-4432-94ed-c2e1822cf985, queryResult.held[0].name; } } result, same first party: undefined queryResult.held[0].name; } } result, same first party: undefined fa675d16-3a4d-4470-84ae-e81f2daffbad, queryResult.held[0].name; } } result, same first party: undefined navigator.locks.query(); return queryResult.held[0].name; } } result, party: Error: Failed to execute 'query' on 'LockManager': Access 20f1c1dc-74b4-4591-85ff-09418a0a1c40, for cross-site tracking. to the Locks API is denied in this context., Error: Failed to d0cc9018-3bbe-4276-a7d4-68189dece8b5 result, different first bd96efb2-a858-4732-9376-9ea9890e4cbc result, different first result, different first party: undefined unsupported: true, true, result, different first party: undefined unsupported: true, true, c3a50072-0d81-4da7-b5dc-642b7f6317b4 result, different first result, different first party: undefined unsupported: true, true, same first party: undefined result, different first party: undefined to the Locks API is denied in this context., Error: Failed to d88860c2-282f-471a-82ed-861ef21d1e9b result, different first execute 'query' on 'LockManager': Access to the Locks API is party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, party: 921ea021-85bd-45d2-bffe-067d18811194, true, true, true passed: undefined test failed: false, false, true, true, true passed: undefined test failed: false, false, party: a631e40c-7719-47f9-9802-2d54a24d3d01, true, true, true passed: undefined test failed: false, false, unsupported: true, true, true, true, true passed: undefined test execute 'query' on 'LockManager': Access to the Locks API is party: b51acfca-da9f-4c94-8276-65083891df3f, denied in this context., Error: Failed to execute 'query' on 31409229-bd59-4c8e-a3b9-b3f1c1278a43, ecc64992-4894-4432-94ed-c2e1822cf985, false, false, false false, false, false ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, false, false, false failed: false, false, false, false, false denied in this context., Error: Failed to execute 'query' on f69e52b8-8ceb-419c-84ab-4beb4fd5714f, 'LockManager': Access to the Locks API is denied in this 08ee6f87-c109-44fc-8a01-1a1964a172b4, bd96efb2-a858-4732-9376-9ea9890e4cbc unsupported: false, false, af3ecf84-528b-4dd2-a9f3-00652230e6a7, 'LockManager': Access to the Locks API is denied in this bbbf41aa-2879-425c-97de-177dfdd94789, context., Error: Failed to execute 'query' on 'LockManager': 16170eca-5e29-4992-831e-d526ddefdcc1, false passed: false, false, false test failed: false, false, fa675d16-3a4d-4470-84ae-e81f2daffbad, context., Error: Failed to execute 'query' on 'LockManager': 20f1c1dc-74b4-4591-85ff-09418a0a1c40, Access to the Locks API is denied in this context., Error: Failed d0cc9018-3bbe-4276-a7d4-68189dece8b5 unsupported: false, false, false c3a50072-0d81-4da7-b5dc-642b7f6317b4 unsupported: false, false, Access to the Locks API is denied in this context., Error: Failed d88860c2-282f-471a-82ed-861ef21d1e9b unsupported: false, false, to execute 'query' on 'LockManager': Access to the Locks API is false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false to execute 'query' on 'LockManager': Access to the Locks API is false, false, false passed: false, false, false, false, false denied in this context. unsupported: false, false, false, false, test failed: false, false, false, false, false test failed: false, false, false, false, false denied in this context. unsupported: false, false, false, false, test failed: false, false, false, false, false false passed: true, true, true, true, true test failed: false, false passed: true, true, true, true, true test failed: false, false, false, false, false false, false, false, false - write: async (key) => { let link = document.createElement - write: async (key) => { let link = document.createElement ("link"); link.rel = "prefetch"; link.href = testURI("resource", ("link"); link.rel = "prefetch"; link.href = testURI("resource", write: async (key) => { let link = document.createElement write: async (key) => { let link = document.createElement write: async (key) => { let link = document.createElement write: async (key) => { let link = document.createElement "prefetch", key); document.getElementsByTagName("head") write: async (key) => { let link = document.createElement "prefetch", key); document.getElementsByTagName("head") write: async (key) => { let link = document.createElement("link"); write: async (key) => { let link = document.createElement write: async (key) => { let link = document.createElement ("link"); link.rel = "prefetch"; link.href = testURI("resource", ("link"); link.rel = "prefetch"; link.href = testURI("resource", ("link"); link.rel = "prefetch"; link.href = testURI("resource", ("link"); link.rel = "prefetch"; link.href = testURI("resource", [0].appendChild(link); return key; } read: async (key) => { let ("link"); link.rel = "prefetch"; link.href = testURI("resource", [0].appendChild(link); return key; } read: async (key) => { let link.rel = "prefetch"; link.href = testURI("resource", "prefetch", ("link"); link.rel = "prefetch"; link.href = testURI("resource", ("link"); link.rel = "prefetch"; link.href = testURI("resource", "prefetch", key); document.getElementsByTagName("head") "prefetch", key); document.getElementsByTagName("head") "prefetch", key); document.getElementsByTagName("head") "prefetch", key); document.getElementsByTagName("head") link = document.createElement("link"); link.rel = "prefetch"; "prefetch", key); document.getElementsByTagName("head") link = document.createElement("link"); link.rel = "prefetch"; key); document.getElementsByTagName("head")[0].appendChild(link); "prefetch", key); document.getElementsByTagName("head") "prefetch", key); document.getElementsByTagName("head") [0].appendChild(link); return key; } read: async (key) => { let [0].appendChild(link); return key; } read: async (key) => { let [0].appendChild(link); return key; } read: async (key) => { let [0].appendChild(link); return key; } read: async (key) => { let link.href = testURI("resource", "prefetch", key); [0].appendChild(link); return key; } read: async (key) => { let link.href = testURI("resource", "prefetch", key); return key; } read: async (key) => { let link = [0].appendChild(link); return key; } read: async (key) => { let [0].appendChild(link); return key; } read: async (key) => { let prefetch cacheA suggests to link = document.createElement("link"); link.rel = "prefetch"; link = document.createElement("link"); link.rel = "prefetch"; link = document.createElement("link"); link.rel = "prefetch"; link = document.createElement("link"); link.rel = "prefetch"; document.getElementsByTagName("head")[0].appendChild(link); await link = document.createElement("link"); link.rel = "prefetch"; document.getElementsByTagName("head")[0].appendChild(link); await document.createElement("link"); link.rel = "prefetch"; link.href = link = document.createElement("link"); link.rel = "prefetch"; link = document.createElement("link"); link.rel = "prefetch"; browsers they should fetch a link.href = testURI("resource", "prefetch", key); link.href = testURI("resource", "prefetch", key); link.href = testURI("resource", "prefetch", key); link.href = testURI("resource", "prefetch", key); sleepMs(500); let response = await fetch( testURI("ctr", link.href = testURI("resource", "prefetch", key); sleepMs(500); let response = await fetch( testURI("ctr", testURI("resource", "prefetch", key); document.getElementsByTagName link.href = testURI("resource", "prefetch", key); link.href = testURI("resource", "prefetch", key); resource ahead of time and document.getElementsByTagName("head")[0].appendChild(link); await document.getElementsByTagName("head")[0].appendChild(link); await document.getElementsByTagName("head")[0].appendChild(link); await document.getElementsByTagName("head")[0].appendChild(link); await "prefetch", key), {"cache": "reload"}); let countString = (await document.getElementsByTagName("head")[0].appendChild(link); await "prefetch", key), {"cache": "reload"}); let countString = (await ("head")[0].appendChild(link); await sleepMs(500); let response = document.getElementsByTagName("head")[0].appendChild(link); await document.getElementsByTagName("head")[0].appendChild(link); await cache it. But if browsers don't sleepMs(500); let response = await fetch( testURI("ctr", sleepMs(500); let response = await fetch( testURI("ctr", sleepMs(500); let response = await fetch( testURI("ctr", sleepMs(500); let response = await fetch( testURI("ctr", response.text()).trim(); if (parseInt(countString) === 0) { throw sleepMs(500); let response = await fetch( testURI("ctr", response.text()).trim(); if (parseInt(countString) === 0) { throw await fetch( testURI("ctr", "prefetch", key), {"cache": "reload"}); sleepMs(500); let response = await fetch( testURI("ctr", sleepMs(500); let response = await fetch( testURI("ctr", partition this cache, it can be "prefetch", key), {"cache": "reload"}); let countString = (await "prefetch", key), {"cache": "reload"}); let countString = (await "prefetch", key), {"cache": "reload"}); let countString = (await "prefetch", key), {"cache": "reload"}); let countString = (await new Error("No requests received"); } return countString; } "prefetch", key), {"cache": "reload"}); let countString = (await new Error("No requests received"); } return countString; } let countString = (await response.text()).trim(); if (parseInt "prefetch", key), {"cache": "reload"}); let countString = (await "prefetch", key), {"cache": "reload"}); let countString = (await used to track users across response.text()).trim(); if (parseInt(countString) === 0) { throw response.text()).trim(); if (parseInt(countString) === 0) { throw response.text()).trim(); if (parseInt(countString) === 0) { throw response.text()).trim(); if (parseInt(countString) === 0) { throw result, same first party: Error: No requests received, Error: No response.text()).trim(); if (parseInt(countString) === 0) { throw result, same first party: Error: No requests received, Error: No (countString) === 0) { throw new Error("No requests received"); } response.text()).trim(); if (parseInt(countString) === 0) { throw response.text()).trim(); if (parseInt(countString) === 0) { throw websites. new Error("No requests received"); } return countString; } new Error("No requests received"); } return countString; } new Error("No requests received"); } return countString; } new Error("No requests received"); } return countString; } requests received, Error: No requests received, Error: No new Error("No requests received"); } return countString; } requests received, Error: No requests received, Error: No return countString; } result, same first party: 1, 1, 1, 1, 1 result, new Error("No requests received"); } return countString; } new Error("No requests received"); } return countString; } result, same first party: 1, 1, 1, 1, 1 result, different first result, same first party: 1, 1, 1, 1, 1 result, different first result, same first party: 1, 1, 1 result, different first party: result, same first party: 1, 1, 1, 1, 1 result, different first requests received, Error: No requests received result, different result, same first party: 1, 1, 1, 1, 1 result, different first requests received, Error: No requests received result, different different first party: 2, 2, 2, 2, 2 unsupported: false, false, result, same first party: 1, 1, 1, 1, 1 result, different first result, same first party: 1, 1, 1, 1, 1 result, different first party: 2, 2, 2, 2, 2 unsupported: false, false, false, false, party: 2, 2, 1, 2, 2 unsupported: false, false, false, false, 2, 1, 2 unsupported: false, false, false passed: true, false, party: 2, 2, 2, 2, 2 unsupported: false, false, false, false, first party: Error: No requests received, Error: No requests party: 2, 2, 2, 2, 2 unsupported: false, false, false, false, first party: Error: No requests received, Error: No requests false, false, false passed: true, true, true, true, true test failed: party: 1, 2, 2, 2, 2 unsupported: false, false, false, false, party: 2, 2, 2, 2, 2 unsupported: false, false, false, false, false passed: true, true, true, true, true test failed: false, false passed: true, true, false, true, true test failed: false, true test failed: false, false, false false passed: true, true, true, true, true test failed: false, received, Error: No requests received, Error: No requests false passed: true, true, true, true, true test failed: false, received, Error: No requests received, Error: No requests false, false, false, false, false false passed: false, true, true, true, true test failed: false, false passed: true, true, true, true, true test failed: false, false, false, false, false false, false, false, false false, false, false, false received, Error: No requests received unsupported: true, true, false, false, false, false received, Error: No requests received unsupported: true, true, false, false, false, false false, false, false, false true, true, true passed: undefined test failed: false, false, true, true, true passed: undefined test failed: false, false, false, false, false false, false, false write: async (key) => { if (!navigator.serviceWorker) { throw new Error("Unsupported"); } let registration = await write: async (key) => { if (!navigator.serviceWorker) { throw navigator.serviceWorker.register( 'serviceWorker.js'); new Error("Unsupported"); } let registration = await console.log(registration); await navigator.serviceWorker.ready; navigator.serviceWorker.register( 'serviceWorker.js'); console.log("service worker ready"); await sleepMs(100); await console.log(registration); await navigator.serviceWorker.ready; fetch(`serviceworker-write?secret=${key}`); } read: async () => { console.log("service worker ready"); await sleepMs(100); await write: async (key) => { if (!navigator.serviceWorker) { throw - write: async (key) => { if (!navigator.serviceWorker) { throw let registration = await navigator.serviceWorker.register( fetch(`serviceworker-write?secret=${key}`); } read: async () => { new Error("Unsupported"); } let registration = await new Error("Unsupported"); } let registration = await 'serviceWorker.js'); console.log(registration); await let registration = await navigator.serviceWorker.register( navigator.serviceWorker.register( 'serviceWorker.js'); navigator.serviceWorker.register( 'serviceWorker.js'); write: async (key) => { if (!navigator.serviceWorker) { throw - write: async (key) => { if (!navigator.serviceWorker) { throw new navigator.serviceWorker.ready; console.log("service worker 'serviceWorker.js'); console.log(registration); await console.log(registration); await navigator.serviceWorker.ready; console.log(registration); await navigator.serviceWorker.ready; new Error("Unsupported"); } let registration = await Error("Unsupported"); } let registration = await ready"); await sleepMs(100); let response = await fetch navigator.serviceWorker.ready; console.log("service worker console.log("service worker ready"); await sleepMs(100); await console.log("service worker ready"); await sleepMs(100); await navigator.serviceWorker.register( 'serviceWorker.js'); navigator.serviceWorker.register( 'serviceWorker.js'); console.log ("serviceworker-read"); return await response.text(); } result, ready"); await sleepMs(100); let response = await fetch write: async (key) => { if (!navigator.serviceWorker) { throw write: async (key) => { if (!navigator.serviceWorker) { throw fetch(`serviceworker-write?secret=${key}`); } read: async () => { fetch(`serviceworker-write?secret=${key}`); } read: async () => { write: async (key) => { if (!navigator.serviceWorker) { throw console.log(registration); await navigator.serviceWorker.ready; (registration); await navigator.serviceWorker.ready; console.log same first party: abf0475f-b7ff-41d5-9465-e439243ec199, write: async (key) => { if (!navigator.serviceWorker) { throw ("serviceworker-read"); return await response.text(); } result, new Error("Unsupported"); } let registration = await new Error("Unsupported"); } let registration = await let registration = await navigator.serviceWorker.register( let registration = await navigator.serviceWorker.register( new Error("Unsupported"); } let registration = await console.log("service worker ready"); await sleepMs(100); await ("service worker ready"); await sleepMs(100); await fetch 3aefe95d-2acc-4dfb-9a93-8b362330a688, new Error("Unsupported"); } let registration = await same first party: , , , , result, different first party: Error: navigator.serviceWorker.register( 'serviceWorker.js'); navigator.serviceWorker.register( 'serviceWorker.js'); 'serviceWorker.js'); console.log(registration); await 'serviceWorker.js'); console.log(registration); await navigator.serviceWorker.register( 'serviceWorker.js'); fetch(`serviceworker-write?secret=${key}`); } read: async () => { (`serviceworker-write?secret=${key}`); } read: async () => { let 65973ddf-fd4e-4666-b27f-d532e47a75d5, navigator.serviceWorker.register( 'serviceWorker.js'); ServiceWorkerThe ServiceWorker Failed to register a ServiceWorker for scope ('https:// console.log(registration); await navigator.serviceWorker.ready; console.log(registration); await navigator.serviceWorker.ready; navigator.serviceWorker.ready; console.log("service worker navigator.serviceWorker.ready; console.log("service worker console.log(registration); await navigator.serviceWorker.ready; let registration = await navigator.serviceWorker.register( registration = await navigator.serviceWorker.register( 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, console.log(registration); await navigator.serviceWorker.ready; API allows websites to run code arthuredelstein.net/test-pages/') with script ('https:// console.log("service worker ready"); await sleepMs(100); await console.log("service worker ready"); await sleepMs(100); await ready"); await sleepMs(100); let response = await fetch ready"); await sleepMs(100); let response = await fetch console.log("service worker ready"); await sleepMs(100); await 'serviceWorker.js'); console.log(registration); await 'serviceWorker.js'); console.log(registration); await 95783e57-aee7-4a73-a645-c6cc2d995cf7 result, different first console.log("service worker ready"); await sleepMs(100); await in the background and store arthuredelstein.net/test-pages/serviceWorker.js'): The user fetch(`serviceworker-write?secret=${key}`); } read: async () => { fetch(`serviceworker-write?secret=${key}`); } read: async () => { ("serviceworker-read"); return await response.text(); } result, ("serviceworker-read"); return await response.text(); } result, fetch(`serviceworker-write?secret=${key}`); } read: async () => { navigator.serviceWorker.ready; console.log("service worker navigator.serviceWorker.ready; console.log("service worker ready"); party: Error: Failed to register a ServiceWorker for scope fetch(`serviceworker-write?secret=${key}`); } read: async () => { content in the browser for denied permission to use Service Worker., Error: Failed to let registration = await navigator.serviceWorker.register( let registration = await navigator.serviceWorker.register( same first party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, same first party: Error: navigator.serviceWorker is undefined, let registration = await navigator.serviceWorker.register( ready"); await sleepMs(100); let response = await fetch await sleepMs(100); let response = await fetch("serviceworker-read"); ('https://arthuredelstein.net/test-pages/') with script ('https:/ let registration = await navigator.serviceWorker.register( offline use. If a ServiceWorker register a ServiceWorker for scope ('https://arthuredelstein.net/ 'serviceWorker.js'); console.log(registration); await 'serviceWorker.js'); console.log(registration); await 9d820b16-d670-40c0-ac68-50e242ed5b70, Error: navigator.serviceWorker is undefined, Error: 'serviceWorker.js'); console.log(registration); await ("serviceworker-read"); return await response.text(); } result, return await response.text(); } result, same first party: Error: /arthuredelstein.net/test-pages/serviceWorker.js'): The user 'serviceWorker.js'); console.log(registration); await can be accessed from multiple test-pages/') with script ('https://arthuredelstein.net/ navigator.serviceWorker.ready; console.log("service worker navigator.serviceWorker.ready; console.log("service worker 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, navigator.serviceWorker is undefined, Error: navigator.serviceWorker.ready; console.log("service worker same first party: 109e075c-f3af-43a0-9f3e-031a5a3c3dc0, navigator.serviceWorker is undefined, Error: navigator.serviceWorker denied permission to use Service Worker., Error: Failed to navigator.serviceWorker.ready; console.log("service worker websites, it can be abused to test-pages/serviceWorker.js'): The user denied permission to use ready"); await sleepMs(100); let response = await fetch ready"); await sleepMs(100); let response = await fetch a78bfa05-b279-4e1b-9a07-11354b649bd8, navigator.serviceWorker is undefined, Error: ready"); await sleepMs(100); let response = await fetch 281040ec-68e0-4834-bce0-775462672325, is undefined, Error: navigator.serviceWorker is undefined, Error: register a ServiceWorker for scope ('https://arthuredelstein.net/ ready"); await sleepMs(100); let response = await fetch track users across sites. Service Worker., Error: Failed to register a ServiceWorker for ("serviceworker-read"); return await response.text(); } result, ("serviceworker-read"); return await response.text(); } result, fd7aa2af-8986-47a6-a043-c0a9bfdbd609 result, different first navigator.serviceWorker is undefined result, different first ("serviceworker-read"); return await response.text(); } result, 93238fef-2cc4-48e2-beff-c65dd121e26f, navigator.serviceWorker is undefined, Error: navigator.serviceWorker test-pages/') with script ('https://arthuredelstein.net/ ("serviceworker-read"); return await response.text(); } result, scope ('https://arthuredelstein.net/test-pages/') with script same first party: , , , , result, different first party: , , , , same first party: , , result, different first party: , , party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, party: Error: navigator.serviceWorker is undefined, Error: same first party: , , , , result, different first party: , , , , e106a814-bc1a-422c-8d7a-92533f552b60, is undefined result, different first party: Error: test-pages/serviceWorker.js'): The user denied permission to use same first party: , , , , result, different first party: , , , , ('https://arthuredelstein.net/test-pages/serviceWorker.js'): The unsupported: false, false, false, false, false passed: undefined unsupported: false, false, false passed: undefined test failed: 9d820b16-d670-40c0-ac68-50e242ed5b70, navigator.serviceWorker is undefined, Error: unsupported: false, false, false, false, false passed: undefined da3d7e80-1c90-4750-b247-c5517c117d59 result, different first navigator.serviceWorker is undefined, Error: navigator.serviceWorker Service Worker., Error: Failed to register a ServiceWorker for unsupported: false, false, false, false, false passed: undefined user denied permission to use Service Worker., Error: Failed to test failed: true, true, true, true, true true, true, true 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, navigator.serviceWorker is undefined, Error: test failed: true, true, true, true, true party: , , , , unsupported: false, false, false, false, false is undefined, Error: navigator.serviceWorker is undefined, Error: scope ('https://arthuredelstein.net/test-pages/') with script test failed: true, true, true, true, true register a ServiceWorker for scope ('https://arthuredelstein.net/ a78bfa05-b279-4e1b-9a07-11354b649bd8, navigator.serviceWorker is undefined, Error: passed: true, true, true, true, true test failed: false, false, navigator.serviceWorker is undefined, Error: navigator.serviceWorker ('https://arthuredelstein.net/test-pages/serviceWorker.js'): The test-pages/') with script ('https://arthuredelstein.net/ fd7aa2af-8986-47a6-a043-c0a9bfdbd609 unsupported: false, false, navigator.serviceWorker is undefined unsupported: true, true, false, false, false is undefined unsupported: true, true, true, true, true passed: user denied permission to use Service Worker., Error: Failed to test-pages/serviceWorker.js'): The user denied permission to use false, false, false passed: false, false, false, false, false true, true, true passed: undefined test failed: false, false, undefined test failed: false, false, false, false, false register a ServiceWorker for scope ('https://arthuredelstein.net/ Service Worker., Error: Failed to register a ServiceWorker for test failed: false, false, false, false, false false, false, false test-pages/') with script ('https://arthuredelstein.net/ scope ('https://arthuredelstein.net/test-pages/') with script test-pages/serviceWorker.js'): The user denied permission to use ('https://arthuredelstein.net/test-pages/serviceWorker.js'): The Service Worker., Error: Failed to register a ServiceWorker for user denied permission to use Service Worker. unsupported: false, scope ('https://arthuredelstein.net/test-pages/') with script false, false, false, false passed: undefined test failed: true, ('https://arthuredelstein.net/test-pages/serviceWorker.js'): The true, true, true, true user denied permission to use Service Worker. unsupported: false, false, false, false, false passed: true, true, true, true, true test failed: false, false, false, false, false write: (secret) => { try { let worker = new SharedWorker write: (secret) => { try { let worker = new SharedWorker write: (secret) => { try { let worker = new SharedWorker write: (secret) => { try { let worker = new SharedWorker write: (secret) => { try { let worker = new SharedWorker ("supercookies_sharedworker.js"); worker.port.start(); ("supercookies_sharedworker.js"); worker.port.start(); ("supercookies_sharedworker.js"); worker.port.start(); - write: (secret) => { try { let worker = new SharedWorker write: (secret) => { try { let worker = new SharedWorker write: (secret) => { try { let worker = new SharedWorker ("supercookies_sharedworker.js"); worker.port.start(); ("supercookies_sharedworker.js"); worker.port.start(); worker.port.postMessage(secret); } catch (e) { throw new Error write: (secret) => { try { let worker = new SharedWorker worker.port.postMessage(secret); } catch (e) { throw new Error write: (secret) => { try { let worker = new SharedWorker worker.port.postMessage(secret); } catch (e) { throw new Error ("supercookies_sharedworker.js"); worker.port.start(); ("supercookies_sharedworker.js"); worker.port.start(); ("supercookies_sharedworker.js"); worker.port.start(); worker.port.postMessage(secret); } catch (e) { throw new Error worker.port.postMessage(secret); } catch (e) { throw new Error ("Unsupported"); } } read: () => new Promise((resolve, reject) => ("supercookies_sharedworker.js"); worker.port.start(); ("Unsupported"); } } read: () => new Promise((resolve, reject) => ("supercookies_sharedworker.js"); worker.port.start(); ("Unsupported"); } } read: () => new Promise((resolve, reject) => worker.port.postMessage(secret); } catch (e) { throw new Error worker.port.postMessage(secret); } catch (e) { throw new Error worker.port.postMessage(secret); } catch (e) { throw new Error ("Unsupported"); } } read: () => new Promise((resolve, reject) => ("Unsupported"); } } read: () => new Promise((resolve, reject) => { let worker = new SharedWorker("supercookies_sharedworker.js"); worker.port.postMessage(secret); } catch (e) { throw new Error { let worker = new SharedWorker("supercookies_sharedworker.js"); worker.port.postMessage(secret); } catch (e) { throw new Error { let worker = new SharedWorker("supercookies_sharedworker.js"); ("Unsupported"); } } read: () => new Promise((resolve, reject) => ("Unsupported"); } } read: () => new Promise((resolve, reject) => { ("Unsupported"); } } read: () => new Promise((resolve, reject) => { let worker = new SharedWorker("supercookies_sharedworker.js"); { let worker = new SharedWorker("supercookies_sharedworker.js"); worker.port.start(); worker.port.postMessage("request"); ("Unsupported"); } } read: () => new Promise((resolve, reject) => worker.port.start(); worker.port.postMessage("request"); ("Unsupported"); } } read: () => new Promise((resolve, reject) => worker.port.start(); worker.port.postMessage("request"); { let worker = new SharedWorker("supercookies_sharedworker.js"); let worker = new SharedWorker("supercookies_sharedworker.js"); { let worker = new SharedWorker("supercookies_sharedworker.js"); worker.port.start(); worker.port.postMessage("request"); SharedWorkerThe SharedWorker worker.port.start(); worker.port.postMessage("request"); worker.port.onmessage = (e) => resolve(e.data); setTimeout(() => { let worker = new SharedWorker("supercookies_sharedworker.js"); worker.port.onmessage = (e) => resolve(e.data); setTimeout(() => { let worker = new SharedWorker("supercookies_sharedworker.js"); worker.port.onmessage = (e) => resolve(e.data); setTimeout(() => worker.port.start(); worker.port.postMessage("request"); worker.port.start(); worker.port.postMessage("request"); worker.port.start(); worker.port.postMessage("request"); worker.port.onmessage = (e) => resolve(e.data); setTimeout(() => API allows scripts from worker.port.onmessage = (e) => resolve(e.data); setTimeout(() => reject("no SharedWorker message received"), 100); }) result, same worker.port.start(); worker.port.postMessage("request"); reject("no SharedWorker message received"), 100); }) result, same worker.port.start(); worker.port.postMessage("request"); reject("no SharedWorker message received"), 100); }) result, same worker.port.onmessage = (e) => resolve(e.data); setTimeout(() => worker.port.onmessage = (e) => resolve(e.data); setTimeout(() => worker.port.onmessage = (e) => resolve(e.data); setTimeout(() => reject("no SharedWorker message received"), 100); }) result, same multiple tabs to share a reject("no SharedWorker message received"), 100); }) result, same first party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, worker.port.onmessage = (e) => resolve(e.data); setTimeout(() => first party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, worker.port.onmessage = (e) => resolve(e.data); setTimeout(() => first party: a631e40c-7719-47f9-9802-2d54a24d3d01, reject("no SharedWorker message received"), 100); }) result, same reject("no SharedWorker message received"), 100); }) result, same reject("no SharedWorker message received"), 100); }) result, same first party: b51acfca-da9f-4c94-8276-65083891df3f, background thread of first party: fb9ada0c-2dd5-445b-8766-6a96ede1d675, 31409229-bd59-4c8e-a3b9-b3f1c1278a43, reject("no SharedWorker message received"), 100); }) result, same 9d820b16-d670-40c0-ac68-50e242ed5b70, reject("no SharedWorker message received"), 100); }) result, same ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, first party: Error: Can't find variable: SharedWorker, Error: first party: fda373cd-c540-4d8a-b1d2-06344b686d10, first party: abf0475f-b7ff-41d5-9465-e439243ec199, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, computation. If SharedWorker is 5755b44c-4043-49c5-9206-d69be4536a7b, 08ee6f87-c109-44fc-8a01-1a1964a172b4, first party: 921ea021-85bd-45d2-bffe-067d18811194, 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, first party: ccf7b60c-0a34-4542-9d4a-dc6388ae2f2c, af3ecf84-528b-4dd2-a9f3-00652230e6a7, Can't find variable: SharedWorker, Error: Can't find variable: 7af1be6c-dfff-4a41-b0e8-fdc94d5164a8, 3aefe95d-2acc-4dfb-9a93-8b362330a688, bbbf41aa-2879-425c-97de-177dfdd94789, not partitioned, then it can be e1f98084-6527-424b-b09f-a5c0cda014fb, 16170eca-5e29-4992-831e-d526ddefdcc1, ecc64992-4894-4432-94ed-c2e1822cf985, a78bfa05-b279-4e1b-9a07-11354b649bd8, 435c28c6-4255-4bfe-a586-84fa6938e442, fa675d16-3a4d-4470-84ae-e81f2daffbad, SharedWorker, Error: Can't find variable: SharedWorker, Error: e964f137-cacb-41e9-b414-cee17a19af1c, 65973ddf-fd4e-4666-b27f-d532e47a75d5, 20f1c1dc-74b4-4591-85ff-09418a0a1c40, abused to shared data between 8eb1e74b-357b-4308-a912-1888453d9111, d0cc9018-3bbe-4276-a7d4-68189dece8b5 result, different first bd96efb2-a858-4732-9376-9ea9890e4cbc result, different first fd7aa2af-8986-47a6-a043-c0a9bfdbd609 result, different first ac90c185-5b06-43e2-a37f-c59529ed65a2, c3a50072-0d81-4da7-b5dc-642b7f6317b4 result, different first Can't find variable: SharedWorker result, different first party: 9a200a7b-cdb4-4525-b2a3-1fb3a4d43da2, 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, d88860c2-282f-471a-82ed-861ef21d1e9b result, different first websites in your browser. 4f7a9ad6-187c-4caf-b184-d18908436921 result, different first party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, party: 921ea021-85bd-45d2-bffe-067d18811194, party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, 7f1ad153-7218-42f6-8c33-76b666e5857e, party: a631e40c-7719-47f9-9802-2d54a24d3d01, Error: Can't find variable: SharedWorker, Error: Can't find f75ddab3-8f21-4547-a3ad-58db5cbc1900 result, different first party: 95783e57-aee7-4a73-a645-c6cc2d995cf7 result, different first party: b51acfca-da9f-4c94-8276-65083891df3f, party: Error: undefined, Error: undefined, Error: undefined, 31409229-bd59-4c8e-a3b9-b3f1c1278a43, ecc64992-4894-4432-94ed-c2e1822cf985, 9d820b16-d670-40c0-ac68-50e242ed5b70, 378a0c14-2649-4b3a-93e4-94f5a06a3409 result, different first ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, variable: SharedWorker, Error: Can't find variable: SharedWorker, Error: The operation is insecure., Error: The operation is insecure., party: Error: undefined, Error: undefined, Error: undefined, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, Error: undefined, Error: undefined unsupported: false, false, 08ee6f87-c109-44fc-8a01-1a1964a172b4, bd96efb2-a858-4732-9376-9ea9890e4cbc unsupported: false, false, 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, party: undefined unsupported: false, false, false, false, false af3ecf84-528b-4dd2-a9f3-00652230e6a7, Error: Can't find variable: SharedWorker, Error: Can't find Error: The operation is insecure., Error: The operation is insecure., Error: undefined, Error: undefined unsupported: false, false, bbbf41aa-2879-425c-97de-177dfdd94789, false, false, false passed: true, true, true, true, true test 16170eca-5e29-4992-831e-d526ddefdcc1, false passed: false, false, false test failed: false, false, a78bfa05-b279-4e1b-9a07-11354b649bd8, passed: true, true, true, true, true test failed: false, false, fa675d16-3a4d-4470-84ae-e81f2daffbad, variable: SharedWorker unsupported: true, true, true, true, true Error: The operation is insecure. unsupported: false, false, false, false, false, false passed: true, true, true, true, true test 20f1c1dc-74b4-4591-85ff-09418a0a1c40, failed: false, false, false, false, false d0cc9018-3bbe-4276-a7d4-68189dece8b5 unsupported: false, false, false fd7aa2af-8986-47a6-a043-c0a9bfdbd609 unsupported: false, false, false, false, false c3a50072-0d81-4da7-b5dc-642b7f6317b4 unsupported: false, false, passed: undefined test failed: false, false, false, false, false false, false passed: true, true, true, true, true test failed: false, failed: false, false, false, false, false d88860c2-282f-471a-82ed-861ef21d1e9b unsupported: false, false, false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false, false false, false, false passed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false write: async () => { let results = await fetch("https:// write: async () => { let results = await fetch("https:// write: async () => { let results = await fetch("https:// write: async () => { let results = await fetch("https:// write: async () => { let results = await fetch("https:// write: async () => { let results = await fetch("https:// write: async () => { let results = await fetch("https:// write: async () => { let results = await fetch("https:// write: async () => { let results = await fetch("https:// tls.arthuredelstein.net:8900/"); return (await results.json tls.arthuredelstein.net:8900/"); return (await results.json tls.arthuredelstein.net:8900/"); return (await results.json tls.arthuredelstein.net:8900/"); return (await results.json tls.arthuredelstein.net:8900/"); return (await results.json tls.arthuredelstein.net:8900/"); return (await results.json tls.arthuredelstein.net:8900/"); return (await results.json tls.arthuredelstein.net:8900/"); return (await results.json tls.arthuredelstein.net:8900/"); return (await results.json ()).sessionId; } read: async () => { let results = await fetch ()).sessionId; } read: async () => { let results = await fetch write: async () => { let results = await fetch("https:// ()).sessionId; } read: async () => { let results = await fetch ()).sessionId; } read: async () => { let results = await fetch ()).sessionId; } read: async () => { let results = await fetch ()).sessionId; } read: async () => { let results = await fetch ()).sessionId; } read: async () => { let results = await fetch ()).sessionId; } read: async () => { let results = await fetch ()).sessionId; } read: async () => { let results = await fetch ("https://tls.arthuredelstein.net:8900/"); return (await ("https://tls.arthuredelstein.net:8900/"); return (await tls.arthuredelstein.net:8900/"); return (await results.json ("https://tls.arthuredelstein.net:8900/"); return (await ("https://tls.arthuredelstein.net:8900/"); return (await ("https://tls.arthuredelstein.net:8900/"); return (await ("https://tls.arthuredelstein.net:8900/"); return (await ("https://tls.arthuredelstein.net:8900/"); return (await results.json ("https://tls.arthuredelstein.net:8900/"); return (await ("https://tls.arthuredelstein.net:8900/"); return (await results.json()).sessionId; } result, same first party: results.json()).sessionId; } result, same first party: ()).sessionId; } read: async () => { let results = await fetch results.json()).sessionId; } result, same first party: results.json()).sessionId; } result, same first party: results.json()).sessionId; } result, same first party: results.json()).sessionId; } result, same first party: ()).sessionId; } result, same first party: results.json()).sessionId; } result, same first party: results.json()).sessionId; } result, same first party: ad580ad561e77acc5d817a8a45eaf2e4bf02cd03b7c68035d847c07310241941, 04ee50a41970e5c9904f5ad404a39e6e297d4483f3dbde7aa29a51521713dab5, ("https://tls.arthuredelstein.net:8900/"); return (await fe88a1f5607b86d028feeec34c4135c32aeac6a2647e57608b3db7b97f660a6a, f194919626adb18f01c5baa2d43cac5f35bf7c86d2d2e3e062641e40614a3095, a6d082106f57b44458d9d1ba1f5730a098ba9a072880c4a6503c5825c062500c, bdef76f61c60c433550b2434d644569c5d7cbe3de854da7282e71b5e978d263a, 51ccf541fa45a5ae00af1fbbbafc43410076ce68326b1e7c04a97842917e9c3d, 5f182edeafbfde7ed25f0d4a48c6ee0720f3ee94d36b7f22f3c95fb98cb9a81c, 707baa10224fd3f33cbffa0d00b67b314fadd47bf35a42df6802f75ff8c029b4, TLS Session IDThe TLS protocol 04fe60ce3c83dd8f81d4c2249d7649e1b5c2a26b97e37170ba6dfdca36ab2e62, 444a3125ae9b4b57b29d6d9453b46b724c671221174285ef9388fe9d8ca33f2f, results.json()).sessionId; } result, same first party: 4f675e9f41a4c0f5aee20c53c56c255daa5358d5d1e2caa7b2ae6fcf85149e4a, 5748bbc42dec878f54aa72c9b90993afdbfd3d2cd68d9e9ef16ed2a6fa8eee66, 36e70d2e355c693bae80693c658b7123d288d67499c1851bdc3076e2577ef947, 3b9d21c82ca8ce32775a0614b2f824d224c624bcd18a0ed20fb04b1b09db622a, d3cb0d6bf67b4a34555bcd8a93f93c90c5f9057dc11a38d6cbc00501351b8796, 0f230cf8ada35cfe66aef7f524b295da8d58050edf023f2ab30d66c16d479c25, 6e67acb146e9e36c82699087ced941efd7518f5ecbe5bc5cfa0ef6737cf9a046, is used by HTTPS to make 1a2031a4987ac7ac7708d2f5510c3cc6f8ffe2024a7599ab7f0f93e0d9e1c235, bdbb0732f871cb6648dffd13c838c7178642b1062ae6b80ceff90da75e4e1185, bcfeb2cb82db662dbcf903f6bcd5a1baea8e7d0afc69cdcf168162e0cdf0927d, a4d3f4913e014bc536f67d8232f433aceb8e0e84ed8f08c30a8973d9d9fd188d, 6ee56d705603293eb3d8747d4db847c36b00dad6cc058302db3318c703cf6030, 3b58f83cd8b0077fda61327f02d0b22e59a01565931804d22cb4b8e3160fe81a, 7c7051b84b22ef4c7cfc13b941e1a2b2e5cd5ebf63fe44429abf89b739acea6f, eb2a04903fc4a5f31119793c6345055ab227b11dda041d2f7c48318f7820e773, cd6d1eae7df0df8de06e8a9f0311d0810a79bdb3178a3d6c0508d66c32193f42, ac06bd5854c0e271652df1b3d9ed7f90297ba6972d7f5b05ba670a4d73f34b28, connections secure. If the 96e9ef89ad371e401a5c0056714f87a77e2e294c765e829c218870f72ebea0e7, c6c2cc5ca8c664074fab7ab1cc6c94271aeaef3382076e52de9cce324dad5a1e, 7e0a6812c2d1070cdc104d0a6eea05a108dfa4a65e776484040d4a42a0c1b5a4, 79921fb7ac02a1971b3fafedd75e806a7fdc059171e6e9e00f37875ee022f0f8, d4a0307771627b4e4b87a0ac535515bef94d437fad86238ba9dbb7cf53595a44, 1edbb5cfb51f4ee19ec39f5d6863012334f0e43d328c8e6965cf654ab0a3d7e7, 131b1ec61c24955480d1d3064c8407d71fb006a51f93949dad156be31ce756ed, 9b4ac7721d9cc56777c85d80849cc37c4bba6d08bc5ae5f99b120efef02ed39d, 3440c293b6dfc9e3437f935d5e3ad5b94e1500fe7ef55c5f46736e21c1545385, 3f1f01e3b94c9c4cc56ce8904a0b5d91a23a946cca41a71f14089266d2d25964, browser were to re-use a TLS 3e9d45c513023e779206dc371310bdc8fbba9e397c4500201ab9ae814d0407fb 27c58e6b18113367acbaa37ca79ca5816b1266a8648ab5709147e9537700415c 06c1e320d0de3485d8efd58604f28eac7ecf788fb87241face13aa8787bbe9bc 1a0c25ae284fe182d2e287fcf6e89c62cb3ff830dfe6d195ccf31596723d3abb bafbb95914bef6baf5af6661e72a94560bbca744406310447bc301b007359b67 508498aded6e14af650fc9c04f108a753ab1418e9dee7a70985e303f81afd9f9 00e941d984269e786ea7dbfccdfed350e8e0764285c374389864a4b374e7344a b766f5312c5261db601204b376ffa9b08f6abb76d13c3b17ced4e3265aa33e36 756d63d118629bdf7b461659bec6b04311012f20122e40db86ea831874e458ff ebd7b6e33c70ac78675b819775b600b6958448aa23b0bb61e08c3ba0a2c3d010 session, then the session ID result, different first party: result, different first party: result, different first party: result, different first party: result, different first party: result, different first party: result, different first party: result, different first party: result, different first party: result, different first party: could be used to track users 0430567085ad59a0f9fd41eecb703a58a3b286e1f156ab90bc179b0cd54fa297, 7def94851d3c7e4d832ac6f584da311d7d885a68755f59d3071b8cb7d4501b7f, e631e96e38c18da71c24f1655ce85cc258db5cb4faa5e3b1dd579013d6f12e85, 043095510214397542aa25ad29c19482dcbadf0afeff4933bef84ad6c628f0ed, 04307b2eb34a547de8e44ce95fe6d2faaf527d85800e8592385e4794881d9aa2, e525bb6c955ec7179190b661316b3211ee57cb5a83abffef73bdf0957079249a, b062659f283817751ae0d73c944f6aded686774fdc0da68c45b6371532f53b5c, 45a901bbad471e55612896f7c4b9e250454259c78e5e23ea0b92ddfe513974a7, 9368051e334213ef58d56299ca756fffdde48c1549531f72d54af0b5cbaefca3, 45f4e64ee7a1b26afa4976193d78bad4c58452b2e11c1311a3f88d491c9ba229, across websites. 0430518d0e08bd7a44b9fb744e96e840ecae4e3e2eae1ab5aae4f0a091589cce, 511041439380696e56145e06c24764664d2f5e8f1a6192b748e77739252fd6e6, 59ecb332031d145b275660f28c6955a6bd887e765af7525f85c6e6d24cff08be, 0430b94cff54f71c5317de170e5aba15231fc371e908138890709940db944275, 04306a2c98dcd332d9e9760ec6263ae5fc4bbcfb1bee74e7879f8d91307d5956, e76aa78f202b57dc2c335c8c941ff6e827d2faa3dec7ea9633e844c37fd6e76e, 747c6d576c132310017b9981c22a9e89a0acef1a89cc4cba167f3547009c45c2, 6a1693b51e0634b0c545ed3ac8a58c20c1d396f5f821b4a0630e350f2deca537, 5e370956f3319b2a2e841b971576c340757ae13afd4f3e30eec60b5408ae4aa0, b62f5c1325ba4f8b15cb463c8ab7869ffd86f012453be5df9a1f61273ca2f0fc, 0430f5e9bc37bcbca570e851df1b15d1464f2c7ea12b7a3aa5a7df7c906eaf75, 6847fcfd33b42b5a685ad868f4c75099ad05e4471878e7c779f2f1e9b4560719, 7b9526fb1a06cf7a695d3abfb140006d9ac008012aa3188e133a7f389231ee23 043084c8a7e6435adc6d81efbb6b682e320f034f8ac79d0dfc19cf4275b1a958, 043051606dcbe550fd28d3e81e94029ffa8389fa8349be1ba1180b741f0a151c, 11a3566f4fcc0c93be1c13eb52e1d68427765e17172aa2b1dd1fbffcf1f6209c, 9926235c5338570af1fe9bac51358c7465b481f1e698e3ca67142423d6019c8d, dadc97e0b61a46a9d0334f2024fe2d9944ed8c09bc5ad428a6e5d8d455009af0, e7e488d8fd49fa1409c8a01716ec0429cf54aa1aa99ad7829f1ede0affa1a135, 8f668fd22adc64f103568b39c39154bdc3f39be18a8fd42de8e0b9a31559b163, 04308035b8c5174103d7f54d5b2584979aa88588069e6306ac518a86ece30e36, de0832f58b0f337f0666427e457ede7b87858655ba4ddfa59db35d9323f2a78c, unsupported: false, false, false passed: true, true, true test 0430799ac19488cbe4b88f9d415fdaf9b6e3f52cd739548efc9988263ad22c3f, 0430fbbafa4ef86fd18a5c1ee9a02fd28807488cb23af0fe3ff9eee84fc071d1, 1b19ecbb7b3f39eda593a20fb74aa4efff71387107942245d93393695da3aa26, f0d84d2d917facc7998a965b007e7402870dd8c06cbd6dbbf824b692a600733f, 603409c45ced01c1553b496248858916808bda63649cab2456b9c27cd0d5ccd0, 0205bb7ac5c7f87989501828f35ec612e2c802cd8c0ccf7edf51f67a9bef3df6, b1fcbf021cfc3172b71049e19344b5bbbecc2d519ddea5817380f9d6aefafbbd, 0430529127894ae76aab86a4dd61bb574b9053e77d53a8be0dc022c31b40ab2a 923276a7fde6f4006c197a004587a9e99bb4642ed4f0a96497ad5ddccb5351e0 failed: false, false, false 04300d9598339d7a16ced9d0f4ba5190b5a0338e304b6f1a118f75ddc547a08e 0430b2dcc7cdebd68375a658fc73979ef928a5834b4b385a216bdd3747da6fd0 ede8a0c877c0364be748df0344bb4d06c425502a10dbaf6fb698ccb22d8632cb 5b86a9a3db1194b324714f42855c541a679ceef094d05476fe5dd03fe7f9a6f7 84a143230006bb1574721e100e25dd55bdcea6190d05be9504664b09db41a9ff 22e32314f6a788657c11bbb87452585984e5aa0de3169078e134642815b2337c 754109b01430c422798e90518cca994a6108960857d228be196eb348a3f480a0 unsupported: false, false, false, false, false passed: true, unsupported: false, false, false, false, false passed: true, unsupported: false, false, false, false, false passed: true, unsupported: false, false, false, false, false passed: true, unsupported: false, false, false, false, false passed: true, unsupported: false, false, false, false, false passed: true, unsupported: false, false, false, false, false passed: true, true, unsupported: false, false, false, false, false passed: true, unsupported: false, false, false, false, false passed: true, true, true, true, true test failed: false, false, false, false, true, true, true, true test failed: false, false, false, false, true, true, true, true test failed: false, false, false, false, true, true, true, true test failed: false, false, false, false, true, true, true, true test failed: false, false, false, false, true, true, true, true test failed: false, false, false, false, true, true, true test failed: false, false, false, false, false true, true, true, true test failed: false, false, false, false, true, true, true, true test failed: false, false, false, false, false false false false false false false false write: async (key) => { if (!window.openDatabase) { throw new write: async (key) => { if (!window.openDatabase) { throw new Error("Unsupported"); } let database = window.openDatabase Error("Unsupported"); } let database = window.openDatabase write: async (key) => { if (!window.openDatabase) { throw new ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let tx = ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let tx = write: async (key) => { if (!window.openDatabase) { throw new Error("Unsupported"); } let database = window.openDatabase write: async (key) => { if (!window.openDatabase) { throw new new Promise((resolve) => database.transaction(tx => { new Promise((resolve) => database.transaction(tx => { write: async (key) => { if (!window.openDatabase) { throw new - write: async (key) => { if (!window.openDatabase) { throw new - write: async (key) => { if (!window.openDatabase) { throw new Error("Unsupported"); } let database = window.openDatabase ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let tx = Error("Unsupported"); } let database = window.openDatabase tx.executeSql( `CREATE TABLE IF NOT EXISTS cache( id INTEGER NOT tx.executeSql( `CREATE TABLE IF NOT EXISTS cache( id INTEGER NOT Error("Unsupported"); } let database = window.openDatabase Error("Unsupported"); } let database = window.openDatabase Error("Unsupported"); } let database = window.openDatabase ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let tx = - write: async (key) => { if (!window.openDatabase) { throw new - write: async (key) => { if (!window.openDatabase) { throw new Error new Promise((resolve) => database.transaction(tx => { ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let tx = NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, value TEXT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, value TEXT ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let tx = ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let tx = ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let tx = new Promise((resolve) => database.transaction(tx => { Error("Unsupported"); } let database = window.openDatabase ("Unsupported"); } let database = window.openDatabase tx.executeSql( `CREATE TABLE IF NOT EXISTS cache( id INTEGER NOT new Promise((resolve) => database.transaction(tx => { NOT NULL, UNIQUE (name) )`, [], (tx, rs) => {}, (tx, err) => {}); NOT NULL, UNIQUE (name) )`, [], (tx, rs) => {}, (tx, err) => {}); new Promise((resolve) => database.transaction(tx => { new Promise((resolve) => database.transaction(tx => { new Promise((resolve) => database.transaction(tx => { tx.executeSql( `CREATE TABLE IF NOT EXISTS cache( id INTEGER NOT ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let tx = ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let tx = new NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, value TEXT tx.executeSql( `CREATE TABLE IF NOT EXISTS cache( id INTEGER NOT tx.executeSql( `INSERT OR REPLACE INTO cache(name, value) VALUES tx.executeSql( `INSERT OR REPLACE INTO cache(name, value) VALUES tx.executeSql( `CREATE TABLE IF NOT EXISTS cache( id INTEGER NOT tx.executeSql( `CREATE TABLE IF NOT EXISTS cache( id INTEGER NOT tx.executeSql( `CREATE TABLE IF NOT EXISTS cache( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, value TEXT new Promise((resolve) => database.transaction(tx => { Promise((resolve) => database.transaction(tx => { tx.executeSql( NOT NULL, UNIQUE (name) )`, [], (tx, rs) => {}, (tx, err) => {}); NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, value TEXT (?, ?)`, ["secret", key], (tx, rs) => {}, (tx, rs) => {}); })); } (?, ?)`, ["secret", key], (tx, rs) => {}, (tx, rs) => {}); })); } NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, value TEXT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, value TEXT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, value TEXT NOT NULL, UNIQUE (name) )`, [], (tx, rs) => {}, (tx, err) => {}); tx.executeSql( `CREATE TABLE IF NOT EXISTS cache( id INTEGER NOT `CREATE TABLE IF NOT EXISTS cache( id INTEGER NOT NULL PRIMARY KEY tx.executeSql( `INSERT OR REPLACE INTO cache(name, value) VALUES NOT NULL, UNIQUE (name) )`, [], (tx, rs) => {}, (tx, err) => {}); read: async () => { let database = window.openDatabase read: async () => { let database = window.openDatabase NOT NULL, UNIQUE (name) )`, [], (tx, rs) => {}, (tx, err) => {}); NOT NULL, UNIQUE (name) )`, [], (tx, rs) => {}, (tx, err) => {}); NOT NULL, UNIQUE (name) )`, [], (tx, rs) => {}, (tx, err) => {}); tx.executeSql( `INSERT OR REPLACE INTO cache(name, value) VALUES NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, value TEXT AUTOINCREMENT, name TEXT NOT NULL, value TEXT NOT NULL, UNIQUE (name) (?, ?)`, ["secret", key], (tx, rs) => {}, (tx, rs) => {}); })); } tx.executeSql( `INSERT OR REPLACE INTO cache(name, value) VALUES ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let tx.executeSql( `INSERT OR REPLACE INTO cache(name, value) VALUES tx.executeSql( `INSERT OR REPLACE INTO cache(name, value) VALUES tx.executeSql( `INSERT OR REPLACE INTO cache(name, value) VALUES (?, ?)`, ["secret", key], (tx, rs) => {}, (tx, rs) => {}); })); } NOT NULL, UNIQUE (name) )`, [], (tx, rs) => {}, (tx, err) => {}); )`, [], (tx, rs) => {}, (tx, err) => {}); tx.executeSql( `INSERT OR read: async () => { let database = window.openDatabase (?, ?)`, ["secret", key], (tx, rs) => {}, (tx, rs) => {}); })); } result = await new Promise((resolve, reject) => result = await new Promise((resolve, reject) => (?, ?)`, ["secret", key], (tx, rs) => {}, (tx, rs) => {}); })); } (?, ?)`, ["secret", key], (tx, rs) => {}, (tx, rs) => {}); })); } (?, ?)`, ["secret", key], (tx, rs) => {}, (tx, rs) => {}); })); } read: async () => { let database = window.openDatabase tx.executeSql( `INSERT OR REPLACE INTO cache(name, value) VALUES REPLACE INTO cache(name, value) VALUES(?, ?)`, ["secret", key], (tx, ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let read: async () => { let database = window.openDatabase database.transaction(tx => { tx.executeSql( "SELECT value FROM database.transaction(tx => { tx.executeSql( "SELECT value FROM read: async () => { let database = window.openDatabase read: async () => { let database = window.openDatabase read: async () => { let database = window.openDatabase ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let (?, ?)`, ["secret", key], (tx, rs) => {}, (tx, rs) => {}); })); } rs) => {}, (tx, rs) => {}); })); } read: async () => { let database = result = await new Promise((resolve, reject) => ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let cache WHERE name=?", ["secret"], (tx, rs) => resolve(rs), (tx, cache WHERE name=?", ["secret"], (tx, rs) => resolve(rs), (tx, ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let result = await new Promise((resolve, reject) => read: async () => { let database = window.openDatabase window.openDatabase("sqlite_supercookie", "", "supercookie", 1024 * database.transaction(tx => { tx.executeSql( "SELECT value FROM result = await new Promise((resolve, reject) => Web SQL DatabaseThe Web SQL err) => reject(err)); })); return result.rows.item(0).value; } err) => reject(err)); })); return result.rows.item(0).value; } result = await new Promise((resolve, reject) => result = await new Promise((resolve, reject) => result = await new Promise((resolve, reject) => database.transaction(tx => { tx.executeSql( "SELECT value FROM ("sqlite_supercookie", "", "supercookie", 1024 * 1024); let 1024); let result = await new Promise((resolve, reject) => cache WHERE name=?", ["secret"], (tx, rs) => resolve(rs), (tx, database.transaction(tx => { tx.executeSql( "SELECT value FROM Database is a deprecated web result, same first party: fb9ada0c-2dd5-445b-8766-6a96ede1d675, result, same first party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, database.transaction(tx => { tx.executeSql( "SELECT value FROM database.transaction(tx => { tx.executeSql( "SELECT value FROM database.transaction(tx => { tx.executeSql( "SELECT value FROM cache WHERE name=?", ["secret"], (tx, rs) => resolve(rs), (tx, result = await new Promise((resolve, reject) => database.transaction(tx => { tx.executeSql( "SELECT value FROM cache err) => reject(err)); })); return result.rows.item(0).value; } cache WHERE name=?", ["secret"], (tx, rs) => resolve(rs), (tx, API for storing data in an SQL 5755b44c-4043-49c5-9206-d69be4536a7b, 31409229-bd59-4c8e-a3b9-b3f1c1278a43, cache WHERE name=?", ["secret"], (tx, rs) => resolve(rs), (tx, cache WHERE name=?", ["secret"], (tx, rs) => resolve(rs), (tx, cache WHERE name=?", ["secret"], (tx, rs) => resolve(rs), (tx, err) => reject(err)); })); return result.rows.item(0).value; } database.transaction(tx => { tx.executeSql( "SELECT value FROM WHERE name=?", ["secret"], (tx, rs) => resolve(rs), (tx, err) => result, same first party: abf0475f-b7ff-41d5-9465-e439243ec199, err) => reject(err)); })); return result.rows.item(0).value; } database. e1f98084-6527-424b-b09f-a5c0cda014fb, 08ee6f87-c109-44fc-8a01-1a1964a172b4, err) => reject(err)); })); return result.rows.item(0).value; } err) => reject(err)); })); return result.rows.item(0).value; } err) => reject(err)); })); return result.rows.item(0).value; } result, same first party: a631e40c-7719-47f9-9802-2d54a24d3d01, cache WHERE name=?", ["secret"], (tx, rs) => resolve(rs), (tx, reject(err)); })); return result.rows.item(0).value; } result, same 3aefe95d-2acc-4dfb-9a93-8b362330a688, result, same first party: b51acfca-da9f-4c94-8276-65083891df3f, 8eb1e74b-357b-4308-a912-1888453d9111, 16170eca-5e29-4992-831e-d526ddefdcc1, result, same first party: 921ea021-85bd-45d2-bffe-067d18811194, result, same first party: Error: window.openDatabase is not a result, same first party: Error: window.openDatabase is not a ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, err) => reject(err)); })); return result.rows.item(0).value; } first party: Error: window.openDatabase is not a function, Error: 65973ddf-fd4e-4666-b27f-d532e47a75d5, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, 4f7a9ad6-187c-4caf-b184-d18908436921 result, different first d0cc9018-3bbe-4276-a7d4-68189dece8b5 result, different first ecc64992-4894-4432-94ed-c2e1822cf985, function, Error: window.openDatabase is not a function, Error: function, Error: window.openDatabase is not a function, Error: af3ecf84-528b-4dd2-a9f3-00652230e6a7, result, same first party: Error: Web SQL is deprecated, Error: window.openDatabase is not a function, Error: window.openDatabase is 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, bbbf41aa-2879-425c-97de-177dfdd94789, party: Error: Failed to execute 'openDatabase' on 'Window': party: Error: Failed to execute 'openDatabase' on 'Window': bd96efb2-a858-4732-9376-9ea9890e4cbc result, different first window.openDatabase is not a function, Error: window.openDatabase window.openDatabase is not a function, Error: window.openDatabase fa675d16-3a4d-4470-84ae-e81f2daffbad, Web SQL is deprecated, Error: Web SQL is deprecated, Error: Web not a function, Error: window.openDatabase is not a function, Error: 95783e57-aee7-4a73-a645-c6cc2d995cf7 result, different first 20f1c1dc-74b4-4591-85ff-09418a0a1c40, Access to the WebDatabase API is denied in third party contexts., Access to the WebDatabase API is denied in third party contexts., party: Error: Failed to execute 'openDatabase' on 'Window': is not a function, Error: window.openDatabase is not a function is not a function, Error: window.openDatabase is not a function c3a50072-0d81-4da7-b5dc-642b7f6317b4 result, different first SQL is deprecated, Error: Web SQL is deprecated result, different window.openDatabase is not a function result, different first party: party: Error: An attempt was made to break through the security d88860c2-282f-471a-82ed-861ef21d1e9b result, different first Error: Failed to execute 'openDatabase' on 'Window': Access to Error: Failed to execute 'openDatabase' on 'Window': Access to Access to the WebDatabase API is denied in third party contexts., result, different first party: Error: window.openDatabase is not result, different first party: Error: window.openDatabase is not party: a631e40c-7719-47f9-9802-2d54a24d3d01, first party: Error: Web SQL is deprecated, Error: Web SQL is Error: window.openDatabase is not a function, Error: policy of the user agent., Error: An attempt was made to break party: b51acfca-da9f-4c94-8276-65083891df3f, the WebDatabase API is denied in third party contexts., Error: the WebDatabase API is denied in third party contexts., Error: Error: Failed to execute 'openDatabase' on 'Window': Access to a function, Error: window.openDatabase is not a function, Error: a function, Error: window.openDatabase is not a function, Error: ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, deprecated, Error: Web SQL is deprecated, Error: Web SQL is window.openDatabase is not a function, Error: window.openDatabase is through the security policy of the user agent., Error: An attempt f69e52b8-8ceb-419c-84ab-4beb4fd5714f, Failed to execute 'openDatabase' on 'Window': Access to the Failed to execute 'openDatabase' on 'Window': Access to the the WebDatabase API is denied in third party contexts., Error: window.openDatabase is not a function, Error: window.openDatabase window.openDatabase is not a function, Error: window.openDatabase af3ecf84-528b-4dd2-a9f3-00652230e6a7, deprecated, Error: Web SQL is deprecated unsupported: true, true, not a function, Error: window.openDatabase is not a function, Error: was made to break through the security policy of the user agent., bbbf41aa-2879-425c-97de-177dfdd94789, WebDatabase API is denied in third party contexts., Error: Failed WebDatabase API is denied in third party contexts., Error: Failed Failed to execute 'openDatabase' on 'Window': Access to the is not a function, Error: window.openDatabase is not a function is not a function, Error: window.openDatabase is not a function fa675d16-3a4d-4470-84ae-e81f2daffbad, true, true, true passed: undefined test failed: false, false, window.openDatabase is not a function unsupported: true, true, true, Error: An attempt was made to break through the security policy 20f1c1dc-74b4-4591-85ff-09418a0a1c40, to execute 'openDatabase' on 'Window': Access to the WebDatabase to execute 'openDatabase' on 'Window': Access to the WebDatabase WebDatabase API is denied in third party contexts. unsupported: unsupported: true, true, true, true, true passed: undefined test unsupported: true, true, true, true, true passed: undefined test c3a50072-0d81-4da7-b5dc-642b7f6317b4 unsupported: false, false, false, false, false true, true passed: undefined test failed: false, false, false, false, of the user agent., Error: An attempt was made to break through d88860c2-282f-471a-82ed-861ef21d1e9b unsupported: false, false, API is denied in third party contexts., Error: Failed to execute API is denied in third party contexts., Error: Failed to execute false, false, false passed: true, true, true test failed: false, failed: false, false, false, false, false failed: false, false, false, false, false false, false, false passed: false, false, false, false, false false the security policy of the user agent. unsupported: false, false, false, false, false passed: false, false, false, false, false 'openDatabase' on 'Window': Access to the WebDatabase API is 'openDatabase' on 'Window': Access to the WebDatabase API is false, false test failed: false, false, false, false, false false, false, false passed: true, true, true, true, true test test failed: false, false, false, false, false denied in third party contexts. unsupported: false, false, false, denied in third party contexts. unsupported: false, false, false, failed: false, false, false, false, false false, false passed: true, true, true, true, true test failed: false, false passed: true, true, true, true, true test failed: false, false, false, false, false false, false, false, false, false write: () => new Promise((resolve, reject) => { let xhr = new write: () => new Promise((resolve, reject) => { let xhr = new write: () => new Promise((resolve, reject) => { let xhr = new write: () => new Promise((resolve, reject) => { let xhr = new write: () => new Promise((resolve, reject) => { let xhr = new write: () => new Promise((resolve, reject) => { let xhr = new write: () => new Promise((resolve, reject) => { let xhr = new write: () => new Promise((resolve, reject) => { let xhr = new write: () => new Promise((resolve, reject) => { let xhr = new XMLHttpRequest(); xhr.addEventListener("load", () => resolve( XMLHttpRequest(); xhr.addEventListener("load", () => resolve( write: () => new Promise((resolve, reject) => { let xhr = new XMLHttpRequest(); xhr.addEventListener("load", () => resolve( XMLHttpRequest(); xhr.addEventListener("load", () => resolve( XMLHttpRequest(); xhr.addEventListener("load", () => resolve( XMLHttpRequest(); xhr.addEventListener("load", () => resolve( XMLHttpRequest(); xhr.addEventListener("load", () => resolve( XMLHttpRequest(); xhr.addEventListener("load", () => resolve( XMLHttpRequest(); xhr.addEventListener("load", () => resolve( {"secret": xhr.getResponseHeader("date")})); xhr.open("GET", {"secret": xhr.getResponseHeader("date")})); xhr.open("GET", XMLHttpRequest(); xhr.addEventListener("load", () => resolve( {"secret": xhr.getResponseHeader("date")})); xhr.open("GET", {"secret": xhr.getResponseHeader("date")})); xhr.open("GET", {"secret": xhr.getResponseHeader("date")})); xhr.open("GET", {"secret": xhr.getResponseHeader("date")})); xhr.open("GET", {"secret": xhr.getResponseHeader("date")})); xhr.open("GET", "https:/ {"secret": xhr.getResponseHeader("date")})); xhr.open("GET", {"secret": xhr.getResponseHeader("date")})); xhr.open("GET", "https://arthuredelstein.net"); xhr.setRequestHeader "https://arthuredelstein.net"); xhr.setRequestHeader {"secret": xhr.getResponseHeader("date")})); xhr.open("GET", "https://arthuredelstein.net"); xhr.setRequestHeader "https://arthuredelstein.net"); xhr.setRequestHeader "https://arthuredelstein.net"); xhr.setRequestHeader "https://arthuredelstein.net"); xhr.setRequestHeader /arthuredelstein.net"); xhr.setRequestHeader("Cache-Control", "https://arthuredelstein.net"); xhr.setRequestHeader "https://arthuredelstein.net"); xhr.setRequestHeader ("Cache-Control", "no-cache"); xhr.send(); setTimeout(() => ("Cache-Control", "no-cache"); xhr.send(); setTimeout(() => "https://arthuredelstein.net"); xhr.setRequestHeader ("Cache-Control", "no-cache"); xhr.send(); setTimeout(() => ("Cache-Control", "no-cache"); xhr.send(); setTimeout(() => ("Cache-Control", "no-cache"); xhr.send(); setTimeout(() => ("Cache-Control", "no-cache"); xhr.send(); setTimeout(() => "no-cache"); xhr.send(); setTimeout(() => reject({message: "XHR: no ("Cache-Control", "no-cache"); xhr.send(); setTimeout(() => ("Cache-Control", "no-cache"); xhr.send(); setTimeout(() => reject({message: "XHR: no response"}), 3000); }) read: () => new reject({message: "XHR: no response"}), 3000); }) read: () => new ("Cache-Control", "no-cache"); xhr.send(); setTimeout(() => reject({message: "XHR: no response"}), 3000); }) read: () => new reject({message: "XHR: no response"}), 3000); }) read: () => new reject({message: "XHR: no response"}), 3000); }) read: () => new reject({message: "XHR: no response"}), 3000); }) read: () => new response"}), 3000); }) read: () => new Promise((resolve, reject) => { reject({message: "XHR: no response"}), 3000); }) read: () => new reject({message: "XHR: no response"}), 3000); }) read: () => new XMLHttpRequest cacheSimilar to Promise((resolve, reject) => { let xhr = new XMLHttpRequest(); Promise((resolve, reject) => { let xhr = new XMLHttpRequest(); reject({message: "XHR: no response"}), 3000); }) read: () => new Promise((resolve, reject) => { let xhr = new XMLHttpRequest(); Promise((resolve, reject) => { let xhr = new XMLHttpRequest(); Promise((resolve, reject) => { let xhr = new XMLHttpRequest(); Promise((resolve, reject) => { let xhr = new XMLHttpRequest(); let xhr = new XMLHttpRequest(); xhr.addEventListener("load", () => Promise((resolve, reject) => { let xhr = new XMLHttpRequest(); Promise((resolve, reject) => { let xhr = new XMLHttpRequest(); the newer Fetch API, any xhr.addEventListener("load", () => resolve( xhr.getResponseHeader xhr.addEventListener("load", () => resolve( xhr.getResponseHeader Promise((resolve, reject) => { let xhr = new XMLHttpRequest(); xhr.addEventListener("load", () => resolve( xhr.getResponseHeader xhr.addEventListener("load", () => resolve( xhr.getResponseHeader xhr.addEventListener("load", () => resolve( xhr.getResponseHeader xhr.addEventListener("load", () => resolve( xhr.getResponseHeader resolve( xhr.getResponseHeader("date"))); xhr.open("GET", "https:// xhr.addEventListener("load", () => resolve( xhr.getResponseHeader xhr.addEventListener("load", () => resolve( xhr.getResponseHeader resource received may be cached ("date"))); xhr.open("GET", "https://arthuredelstein.net"); ("date"))); xhr.open("GET", "https://arthuredelstein.net"); xhr.addEventListener("load", () => resolve( xhr.getResponseHeader ("date"))); xhr.open("GET", "https://arthuredelstein.net"); ("date"))); xhr.open("GET", "https://arthuredelstein.net"); ("date"))); xhr.open("GET", "https://arthuredelstein.net"); ("date"))); xhr.open("GET", "https://arthuredelstein.net"); arthuredelstein.net"); xhr.setRequestHeader("Cache-Control", ("date"))); xhr.open("GET", "https://arthuredelstein.net"); ("date"))); xhr.open("GET", "https://arthuredelstein.net"); by the browser. The cache is xhr.setRequestHeader("Cache-Control", "max-age"); xhr.send(); xhr.setRequestHeader("Cache-Control", "max-age"); xhr.send(); ("date"))); xhr.open("GET", "https://arthuredelstein.net"); xhr.setRequestHeader("Cache-Control", "max-age"); xhr.send(); xhr.setRequestHeader("Cache-Control", "max-age"); xhr.send(); xhr.setRequestHeader("Cache-Control", "max-age"); xhr.send(); xhr.setRequestHeader("Cache-Control", "max-age"); xhr.send(); "max-age"); xhr.send(); setTimeout(() => reject({message: "XHR: no xhr.setRequestHeader("Cache-Control", "max-age"); xhr.send(); xhr.setRequestHeader("Cache-Control", "max-age"); xhr.send(); potentially vulnerable to setTimeout(() => reject({message: "XHR: no response"}), 3000); }) setTimeout(() => reject({message: "XHR: no response"}), 3000); }) xhr.setRequestHeader("Cache-Control", "max-age"); xhr.send(); setTimeout(() => reject({message: "XHR: no response"}), 3000); }) setTimeout(() => reject({message: "XHR: no response"}), 3000); }) setTimeout(() => reject({message: "XHR: no response"}), 3000); }) setTimeout(() => reject({message: "XHR: no response"}), 3000); }) response"}), 3000); }) result, same first party: Fri, 07 Jan 2022 setTimeout(() => reject({message: "XHR: no response"}), 3000); }) setTimeout(() => reject({message: "XHR: no response"}), 3000); }) cross-site tracking attack. result, same first party: Fri, 07 Jan 2022 09:26:05 GMT, Fri, 07 result, same first party: Fri, 07 Jan 2022 09:29:13 GMT, Fri, 07 setTimeout(() => reject({message: "XHR: no response"}), 3000); }) result, same first party: Fri, 07 Jan 2022 09:03:46 GMT, Fri, 07 result, same first party: Fri, 07 Jan 2022 09:47:15 GMT, Fri, 07 result, same first party: Fri, 07 Jan 2022 09:39:44 GMT, Fri, 07 result, same first party: Fri, 07 Jan 2022 09:00:17 GMT, Fri, 07 09:08:21 GMT, Fri, 07 Jan 2022 09:11:57 GMT, Fri, 07 Jan 2022 result, same first party: Fri, 07 Jan 2022 09:51:25 GMT, Fri, 07 result, same first party: Fri, 07 Jan 2022 09:42:54 GMT, Fri, 07 Jan 2022 09:26:44 GMT, Fri, 07 Jan 2022 09:27:21 GMT, Fri, 07 Jan Jan 2022 09:29:51 GMT, Fri, 07 Jan 2022 09:30:26 GMT, Fri, 07 Jan result, same first party: Fri, 07 Jan 2022 09:37:58 GMT, Fri, 07 Jan 2022 09:04:29 GMT, Fri, 07 Jan 2022 09:05:14 GMT, Fri, 07 Jan Jan 2022 09:48:05 GMT, Fri, 07 Jan 2022 09:48:55 GMT, Fri, 07 Jan Jan 2022 09:40:19 GMT, Fri, 07 Jan 2022 09:40:52 GMT, Fri, 07 Jan Jan 2022 09:00:59 GMT, Fri, 07 Jan 2022 09:01:40 GMT, Fri, 07 Jan 09:15:43 GMT, Fri, 07 Jan 2022 09:19:26 GMT, Fri, 07 Jan 2022 Jan 2022 09:52:02 GMT, Fri, 07 Jan 2022 09:52:34 GMT, Fri, 07 Jan Jan 2022 09:43:51 GMT, Fri, 07 Jan 2022 09:44:46 GMT, Fri, 07 Jan 2022 09:27:58 GMT, Fri, 07 Jan 2022 09:28:35 GMT result, 2022 09:31:01 GMT, Fri, 07 Jan 2022 09:31:35 GMT result, Jan 2022 09:38:36 GMT, Fri, 07 Jan 2022 09:39:10 GMT result, 2022 09:05:56 GMT, Fri, 07 Jan 2022 09:06:39 GMT result, 2022 09:49:47 GMT, Fri, 07 Jan 2022 09:50:38 GMT result, 2022 09:41:26 GMT, Fri, 07 Jan 2022 09:42:00 GMT result, 2022 09:02:24 GMT, Fri, 07 Jan 2022 09:03:04 GMT result, 09:22:59 GMT result, different first party: Fri, 07 Jan 2022 09:08:44 2022 09:53:07 GMT, Fri, 07 Jan 2022 09:53:40 GMT result, 2022 09:45:41 GMT, Fri, 07 Jan 2022 09:46:35 GMT result, different first party: Fri, 07 Jan 2022 09:26:14 GMT, Fri, 07 Jan different first party: Fri, 07 Jan 2022 09:29:17 GMT, Fri, 07 Jan different first party: Fri, 07 Jan 2022 09:38:02 GMT, Fri, 07 Jan different first party: Fri, 07 Jan 2022 09:03:51 GMT, Fri, 07 Jan different first party: Fri, 07 Jan 2022 09:47:24 GMT, Fri, 07 Jan different first party: Sun, 02 Jan 2022 06:50:17 GMT, Sun, 02 Jan different first party: Sun, 02 Jan 2022 06:38:23 GMT, Sun, 02 Jan GMT, Fri, 07 Jan 2022 09:12:26 GMT, Fri, 07 Jan 2022 09:16:10 GMT, different first party: Thu, 06 Jan 2022 19:25:30 GMT, Thu, 06 Jan different first party: Wed, 05 Jan 2022 10:08:45 GMT, Wed, 05 Jan 2022 09:26:14 GMT, Fri, 07 Jan 2022 09:26:14 GMT, Fri, 07 Jan 2022 09:29:17 GMT, Fri, 07 Jan 2022 09:29:17 GMT, Fri, 07 Jan 2022 09:38:02 GMT, Fri, 07 Jan 2022 09:38:02 GMT unsupported: 2022 09:04:34 GMT, Fri, 07 Jan 2022 09:05:19 GMT, Fri, 07 Jan 2022 09:48:14 GMT, Fri, 07 Jan 2022 09:49:05 GMT, Fri, 07 Jan 2022 06:50:17 GMT, Sun, 02 Jan 2022 06:50:17 GMT, Sun, 02 Jan 2022 06:38:23 GMT, Sun, 02 Jan 2022 06:38:23 GMT, Sun, 02 Jan Fri, 07 Jan 2022 09:19:53 GMT, Fri, 07 Jan 2022 09:23:34 GMT 2022 19:25:30 GMT, Thu, 06 Jan 2022 19:25:30 GMT, Thu, 06 Jan 2022 10:08:45 GMT, Wed, 05 Jan 2022 10:08:45 GMT, Wed, 05 Jan 2022 09:26:14 GMT, Fri, 07 Jan 2022 09:26:14 GMT unsupported: 2022 09:29:17 GMT, Fri, 07 Jan 2022 09:29:17 GMT unsupported: false, false, false passed: true, true, true test failed: false, 2022 09:06:00 GMT, Fri, 07 Jan 2022 09:06:44 GMT unsupported: 2022 09:49:56 GMT, Fri, 07 Jan 2022 09:50:47 GMT unsupported: 2022 06:50:17 GMT, Sun, 02 Jan 2022 06:50:17 GMT unsupported: 2022 06:38:23 GMT, Sun, 02 Jan 2022 06:38:23 GMT unsupported: unsupported: false, false, false, false, false passed: true, true, 2022 19:25:30 GMT, Thu, 06 Jan 2022 19:25:30 GMT unsupported: 2022 10:08:45 GMT, Wed, 05 Jan 2022 10:08:45 GMT unsupported: false, false, false, false, false passed: true, true, true, true, false, false, false, false, false passed: true, true, true, true, false, false false, false, false, false, false passed: true, true, true, true, false, false, false, false, false passed: true, true, true, true, false, false, false, false, false passed: true, true, true, true, false, false, false, false, false passed: true, true, true, true, true, true, true test failed: false, false, false, false, false false, false, false, false, false passed: true, true, true, true, false, false, false, false, false passed: true, true, true, true, true test failed: false, false, false, false, false true test failed: false, false, false, false, false true test failed: false, false, false, false, false true test failed: false, false, false, false, false true test failed: false, false, false, false, false true test failed: false, false, false, false, false true test failed: false, false, false, false, false true test failed: false, false, false, false, false Navigation testsWhen you click a hyperlink to navigate your browser from one site to another, certain browser APIs allow the first site to communicate to the second site. These privacy vulnerabilities can be fixed by introducing new limits on how much data is transfered between sites. document.referrerThe Referer [sic] request header is a write: (secret) => { /* do nothing */ } read: () => new Promise write: (secret) => { /* do nothing */ } read: () => new Promise write: (secret) => { /* do nothing */ } read: () => new Promise write: (secret) => { /* do nothing */ } read: () => new Promise write: (secret) => { /* do nothing */ } read: () => new Promise write: (secret) => { /* do nothing */ } read: () => new Promise write: (secret) => { /* do nothing */ } read: () => new Promise write: (secret) => { /* do nothing */ } read: () => new Promise write: (secret) => { /* do nothing */ } read: () => new Promise mechanism used by browsers to ((resolve) => { parent.postMessage({"read document.referrer": ((resolve) => { parent.postMessage({"read document.referrer": write: (secret) => { /* do nothing */ } read: () => new Promise ((resolve) => { parent.postMessage({"read document.referrer": ((resolve) => { parent.postMessage({"read document.referrer": ((resolve) => { parent.postMessage({"read document.referrer": ((resolve) => { parent.postMessage({"read document.referrer": ((resolve) => { parent.postMessage({"read document.referrer": true}, ((resolve) => { parent.postMessage({"read document.referrer": ((resolve) => { parent.postMessage({"read document.referrer": let a website know where the true}, "*"); addEventListener("message", ({data}) => { resolve true}, "*"); addEventListener("message", ({data}) => { resolve ((resolve) => { parent.postMessage({"read document.referrer": true}, "*"); addEventListener("message", ({data}) => { resolve true}, "*"); addEventListener("message", ({data}) => { resolve true}, "*"); addEventListener("message", ({data}) => { resolve true}, "*"); addEventListener("message", ({data}) => { resolve "*"); addEventListener("message", ({data}) => { resolve(data); }, { true}, "*"); addEventListener("message", ({data}) => { resolve true}, "*"); addEventListener("message", ({data}) => { resolve user is visiting from. This (data); }, { once: true }); }) result, same first party: https:// (data); }, { once: true }); }) result, same first party: https:// true}, "*"); addEventListener("message", ({data}) => { resolve (data); }, { once: true }); }) result, same first party: https:// (data); }, { once: true }); }) result, same first party: https:// (data); }, { once: true }); }) result, same first party: https:// (data); }, { once: true }); }) result, same first party: https:// once: true }); }) result, same first party: https:// (data); }, { once: true }); }) result, same first party: https:// (data); }, { once: true }); }) result, same first party: https:// header is inherently tracking arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// (data); }, { once: true }); }) result, same first party: https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// users across websites. In arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// recent times, browsers have arthuredelstein.net/ result, different first party: https:// arthuredelstein.net/ result, different first party: https:// arthuredelstein.net/ result, different first party: https:// arthuredelstein.net/ result, different first party: https:// arthuredelstein.net/ result, different first party: https:// arthuredelstein.net/ result, different first party: https:// arthuredelstein.net/ result, different first party: https:// arthuredelstein.net/ result, different first party: https:// arthuredelstein.net/ result, different first party: https:// arthuredelstein.net/ result, different first party: https:// switched to a policy of arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// trimming a referrer to convey arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/ unsupported: false, false, false passed: arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// arthuredelstein.net/, https://arthuredelstein.net/, https:// less tracking information, but arthuredelstein.net/ unsupported: false, false, false, false, arthuredelstein.net/ unsupported: false, false, false, false, false, false, false test failed: false, false, false arthuredelstein.net/ unsupported: false, false, false, false, arthuredelstein.net/ unsupported: false, false, false, false, arthuredelstein.net/ unsupported: false, false, false, false, arthuredelstein.net/ unsupported: false, false, false, false, arthuredelstein.net/ unsupported: false, false, false, false, false arthuredelstein.net/ unsupported: false, false, false, false, arthuredelstein.net/ unsupported: false, false, false, false, Referer continues to convey false passed: false, false, false, false, false test failed: false passed: false, false, false, false, false test failed: false passed: false, false, false, false, false test failed: false passed: false, false, false, false, false test failed: false passed: false, false, false, false, false test failed: false passed: false, false, false, false, false test failed: passed: false, false, false, false, false test failed: false, false, false passed: false, false, false, false, false test failed: false passed: false, false, false, false, false test failed: cross-site tracking data by false, false, false, false, false false, false, false, false, false false, false, false, false, false false, false, false, false, false false, false, false, false, false false, false, false, false, false false, false, false false, false, false, false, false false, false, false, false, false default. write: (secret) => sessionStorage.setItem("secret", secret) read: () => sessionStorage.getItem("secret") result, same first write: (secret) => sessionStorage.setItem("secret", secret) write: (secret) => sessionStorage.setItem("secret", secret) write: (secret) => sessionStorage.setItem("secret", secret) write: (secret) => sessionStorage.setItem("secret", secret) party: abf0475f-b7ff-41d5-9465-e439243ec199, write: (secret) => sessionStorage.setItem("secret", secret) sessionStorageThe read: () => sessionStorage.getItem("secret") result, same first read: () => sessionStorage.getItem("secret") result, same first read: () => sessionStorage.getItem("secret") result, same first read: () => sessionStorage.getItem("secret") result, same first 3aefe95d-2acc-4dfb-9a93-8b362330a688, read: () => sessionStorage.getItem("secret") result, same first sessionStorage API is similar write: (secret) => sessionStorage.setItem("secret", secret) party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, write: (secret) => sessionStorage.setItem("secret", secret) party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, write: (secret) => sessionStorage.setItem("secret", secret) party: a631e40c-7719-47f9-9802-2d54a24d3d01, party: 109e075c-f3af-43a0-9f3e-031a5a3c3dc0, write: (secret) => sessionStorage.setItem("secret", secret) read: 65973ddf-fd4e-4666-b27f-d532e47a75d5, party: b51acfca-da9f-4c94-8276-65083891df3f, to the localStorage API, but it read: () => sessionStorage.getItem("secret") result, same first 31409229-bd59-4c8e-a3b9-b3f1c1278a43, read: () => sessionStorage.getItem("secret") result, same first 9d820b16-d670-40c0-ac68-50e242ed5b70, read: () => sessionStorage.getItem("secret") result, same first ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, 281040ec-68e0-4834-bce0-775462672325, () => sessionStorage.getItem("secret") result, same first party: 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, does not persist across tabs or party: fb9ada0c-2dd5-445b-8766-6a96ede1d675, 08ee6f87-c109-44fc-8a01-1a1964a172b4, party: 921ea021-85bd-45d2-bffe-067d18811194, 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, party: ccf7b60c-0a34-4542-9d4a-dc6388ae2f2c, af3ecf84-528b-4dd2-a9f3-00652230e6a7, 93238fef-2cc4-48e2-beff-c65dd121e26f, fda373cd-c540-4d8a-b1d2-06344b686d10, 95783e57-aee7-4a73-a645-c6cc2d995cf7 result, different first bbbf41aa-2879-425c-97de-177dfdd94789, across browser sessions. 5755b44c-4043-49c5-9206-d69be4536a7b, 16170eca-5e29-4992-831e-d526ddefdcc1, ecc64992-4894-4432-94ed-c2e1822cf985, a78bfa05-b279-4e1b-9a07-11354b649bd8, 435c28c6-4255-4bfe-a586-84fa6938e442, fa675d16-3a4d-4470-84ae-e81f2daffbad, e106a814-bc1a-422c-8d7a-92533f552b60, 7af1be6c-dfff-4a41-b0e8-fdc94d5164a8, party: Error: Failed to read the 'sessionStorage' property from 20f1c1dc-74b4-4591-85ff-09418a0a1c40, Nonetheless, it can be used to e1f98084-6527-424b-b09f-a5c0cda014fb, d0cc9018-3bbe-4276-a7d4-68189dece8b5 result, different first bd96efb2-a858-4732-9376-9ea9890e4cbc result, different first fd7aa2af-8986-47a6-a043-c0a9bfdbd609 result, different first ac90c185-5b06-43e2-a37f-c59529ed65a2, c3a50072-0d81-4da7-b5dc-642b7f6317b4 result, different first da3d7e80-1c90-4750-b247-c5517c117d59 result, different first e964f137-cacb-41e9-b414-cee17a19af1c, 'Window': Access is denied for this document., Error: Failed to d88860c2-282f-471a-82ed-861ef21d1e9b result, different first track users if they navigate 8eb1e74b-357b-4308-a912-1888453d9111, party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, party: 921ea021-85bd-45d2-bffe-067d18811194, party: 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, 7f1ad153-7218-42f6-8c33-76b666e5857e, party: a631e40c-7719-47f9-9802-2d54a24d3d01, party: 109e075c-f3af-43a0-9f3e-031a5a3c3dc0, 9a200a7b-cdb4-4525-b2a3-1fb3a4d43da2, read the 'sessionStorage' property from 'Window': Access is party: b51acfca-da9f-4c94-8276-65083891df3f, from one website to another. 4f7a9ad6-187c-4caf-b184-d18908436921 result, different first 31409229-bd59-4c8e-a3b9-b3f1c1278a43, ecc64992-4894-4432-94ed-c2e1822cf985, 9d820b16-d670-40c0-ac68-50e242ed5b70, 378a0c14-2649-4b3a-93e4-94f5a06a3409 result, different first ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, 281040ec-68e0-4834-bce0-775462672325, f75ddab3-8f21-4547-a3ad-58db5cbc1900 result, different first party: , denied for this document., Error: Failed to read the f69e52b8-8ceb-419c-84ab-4beb4fd5714f, This tracking can be thwarted party: , , , , unsupported: false, false, false, false, false 08ee6f87-c109-44fc-8a01-1a1964a172b4, bd96efb2-a858-4732-9376-9ea9890e4cbc unsupported: false, false, 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, party: , , , , unsupported: false, false, false, false, false af3ecf84-528b-4dd2-a9f3-00652230e6a7, 93238fef-2cc4-48e2-beff-c65dd121e26f, , , , unsupported: false, false, false, false, false passed: true, 'sessionStorage' property from 'Window': Access is denied for bbbf41aa-2879-425c-97de-177dfdd94789, by partitioning sessionStorage passed: true, true, true, true, true test failed: false, false, 16170eca-5e29-4992-831e-d526ddefdcc1, false passed: false, false, false test failed: false, false, a78bfa05-b279-4e1b-9a07-11354b649bd8, passed: true, true, true, true, true test failed: false, false, fa675d16-3a4d-4470-84ae-e81f2daffbad, e106a814-bc1a-422c-8d7a-92533f552b60, true, true, true, true test failed: false, false, false, false, false this document., Error: Failed to read the 'sessionStorage' 20f1c1dc-74b4-4591-85ff-09418a0a1c40, between websites. false, false, false d0cc9018-3bbe-4276-a7d4-68189dece8b5 unsupported: false, false, false fd7aa2af-8986-47a6-a043-c0a9bfdbd609 unsupported: false, false, false, false, false c3a50072-0d81-4da7-b5dc-642b7f6317b4 unsupported: false, false, da3d7e80-1c90-4750-b247-c5517c117d59 unsupported: false, false, property from 'Window': Access is denied for this document., d88860c2-282f-471a-82ed-861ef21d1e9b unsupported: false, false, false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false Error: Failed to read the 'sessionStorage' property from false, false, false passed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false 'Window': Access is denied for this document. unsupported: false, test failed: false, false, false, false, false false, false, false, false passed: true, true, true, true, true test failed: false, false, false, false, false write: (secret) => parent.postMessage({"write window.name": write: (secret) => parent.postMessage({"write window.name": write: (secret) => parent.postMessage({"write window.name": write: (secret) => parent.postMessage({"write window.name": write: (secret) => parent.postMessage({"write window.name": write: (secret) => parent.postMessage({"write window.name": secret}) read: () => new Promise((resolve) => { secret}) read: () => new Promise((resolve) => { secret}) read: () => new Promise((resolve) => { secret}) read: () => new Promise((resolve) => { parent.postMessage secret}) read: () => new Promise((resolve) => { secret}) read: () => new Promise((resolve) => { parent.postMessage({"read window.name": true}, "*"); parent.postMessage({"read window.name": true}, "*"); write: (secret) => parent.postMessage({"write window.name": write: (secret) => parent.postMessage({"write window.name": write: (secret) => parent.postMessage({"write window.name": parent.postMessage({"read window.name": true}, "*"); write: (secret) => parent.postMessage({"write window.name": ({"read window.name": true}, "*"); addEventListener("message", parent.postMessage({"read window.name": true}, "*"); parent.postMessage({"read window.name": true}, "*"); addEventListener("message", ({data}) => { resolve(data); }, { addEventListener("message", ({data}) => { resolve(data); }, { secret}) read: () => new Promise((resolve) => { secret}) read: () => new Promise((resolve) => { secret}) read: () => new Promise((resolve) => { addEventListener("message", ({data}) => { resolve(data); }, { secret}) read: () => new Promise((resolve) => { ({data}) => { resolve(data); }, { once: true }); }) result, same addEventListener("message", ({data}) => { resolve(data); }, { addEventListener("message", ({data}) => { resolve(data); }, { window.nameThe window.name API once: true }); }) result, same first party: once: true }); }) result, same first party: parent.postMessage({"read window.name": true}, "*"); parent.postMessage({"read window.name": true}, "*"); parent.postMessage({"read window.name": true}, "*"); once: true }); }) result, same first party: parent.postMessage({"read window.name": true}, "*"); first party: fda373cd-c540-4d8a-b1d2-06344b686d10, once: true }); }) result, same first party: once: true }); }) result, same first party: allows websites to store data fb9ada0c-2dd5-445b-8766-6a96ede1d675, 60d9cae6-595e-4a6b-952e-67d678e4f68b, addEventListener("message", ({data}) => { resolve(data); }, { addEventListener("message", ({data}) => { resolve(data); }, { addEventListener("message", ({data}) => { resolve(data); }, { a631e40c-7719-47f9-9802-2d54a24d3d01, addEventListener("message", ({data}) => { resolve(data); }, { 7af1be6c-dfff-4a41-b0e8-fdc94d5164a8, abf0475f-b7ff-41d5-9465-e439243ec199, b51acfca-da9f-4c94-8276-65083891df3f, that will persist after the 5755b44c-4043-49c5-9206-d69be4536a7b, 31409229-bd59-4c8e-a3b9-b3f1c1278a43, once: true }); }) result, same first party: once: true }); }) result, same first party: once: true }); }) result, same first party: ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, once: true }); }) result, same first party: e964f137-cacb-41e9-b414-cee17a19af1c, 3aefe95d-2acc-4dfb-9a93-8b362330a688, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, user has navigated the tab to a e1f98084-6527-424b-b09f-a5c0cda014fb, 08ee6f87-c109-44fc-8a01-1a1964a172b4, 921ea021-85bd-45d2-bffe-067d18811194, 6ed3e000-1d49-40fb-8e1e-6419f7dd00dd, ccf7b60c-0a34-4542-9d4a-dc6388ae2f2c, af3ecf84-528b-4dd2-a9f3-00652230e6a7, 109e075c-f3af-43a0-9f3e-031a5a3c3dc0, 9a200a7b-cdb4-4525-b2a3-1fb3a4d43da2, 65973ddf-fd4e-4666-b27f-d532e47a75d5, bbbf41aa-2879-425c-97de-177dfdd94789, different website. This 8eb1e74b-357b-4308-a912-1888453d9111, 16170eca-5e29-4992-831e-d526ddefdcc1, ecc64992-4894-4432-94ed-c2e1822cf985, 9d820b16-d670-40c0-ac68-50e242ed5b70, 435c28c6-4255-4bfe-a586-84fa6938e442, fa675d16-3a4d-4470-84ae-e81f2daffbad, 281040ec-68e0-4834-bce0-775462672325, f75ddab3-8f21-4547-a3ad-58db5cbc1900 result, different first party: 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, 20f1c1dc-74b4-4591-85ff-09418a0a1c40, mechanism could be partitioned 4f7a9ad6-187c-4caf-b184-d18908436921 result, different first d0cc9018-3bbe-4276-a7d4-68189dece8b5 result, different first bd96efb2-a858-4732-9376-9ea9890e4cbc result, different first 47c4b9d0-5b5d-4f79-b0f8-c5aad0131f5d, ac90c185-5b06-43e2-a37f-c59529ed65a2, c3a50072-0d81-4da7-b5dc-642b7f6317b4 result, different first 93238fef-2cc4-48e2-beff-c65dd121e26f, fda373cd-c540-4d8a-b1d2-06344b686d10, 95783e57-aee7-4a73-a645-c6cc2d995cf7 result, different first d88860c2-282f-471a-82ed-861ef21d1e9b result, different first so that data is not allowed to party: fb9ada0c-2dd5-445b-8766-6a96ede1d675, party: 60d9cae6-595e-4a6b-952e-67d678e4f68b, party: 921ea021-85bd-45d2-bffe-067d18811194, a78bfa05-b279-4e1b-9a07-11354b649bd8, 7f1ad153-7218-42f6-8c33-76b666e5857e, party: a631e40c-7719-47f9-9802-2d54a24d3d01, e106a814-bc1a-422c-8d7a-92533f552b60, 7af1be6c-dfff-4a41-b0e8-fdc94d5164a8, party: abf0475f-b7ff-41d5-9465-e439243ec199, party: b51acfca-da9f-4c94-8276-65083891df3f, persist between websites. 5755b44c-4043-49c5-9206-d69be4536a7b, 31409229-bd59-4c8e-a3b9-b3f1c1278a43, ecc64992-4894-4432-94ed-c2e1822cf985, fd7aa2af-8986-47a6-a043-c0a9bfdbd609 result, different first 378a0c14-2649-4b3a-93e4-94f5a06a3409 result, different first ec6fdc62-3e3f-48cc-bdb9-c1750a46acfa, da3d7e80-1c90-4750-b247-c5517c117d59 result, different first e964f137-cacb-41e9-b414-cee17a19af1c, 3aefe95d-2acc-4dfb-9a93-8b362330a688, f69e52b8-8ceb-419c-84ab-4beb4fd5714f, e1f98084-6527-424b-b09f-a5c0cda014fb, 08ee6f87-c109-44fc-8a01-1a1964a172b4, bd96efb2-a858-4732-9376-9ea9890e4cbc unsupported: false, false, party: , , , , unsupported: false, false, false, false, false party: , , , , unsupported: false, false, false, false, false af3ecf84-528b-4dd2-a9f3-00652230e6a7, party: , , , , unsupported: false, false, false, false, false 9a200a7b-cdb4-4525-b2a3-1fb3a4d43da2, 65973ddf-fd4e-4666-b27f-d532e47a75d5, bbbf41aa-2879-425c-97de-177dfdd94789, 8eb1e74b-357b-4308-a912-1888453d9111, 16170eca-5e29-4992-831e-d526ddefdcc1, false passed: false, false, false test failed: false, false, passed: true, true, true, true, true test failed: false, false, passed: true, true, true, true, true test failed: false, false, fa675d16-3a4d-4470-84ae-e81f2daffbad, passed: true, true, true, true, true test failed: false, false, f75ddab3-8f21-4547-a3ad-58db5cbc1900 unsupported: false, false, 9a4840e2-920e-4d37-8f8c-9fe5e7dc98c8, 20f1c1dc-74b4-4591-85ff-09418a0a1c40, 4f7a9ad6-187c-4caf-b184-d18908436921 unsupported: false, false, d0cc9018-3bbe-4276-a7d4-68189dece8b5 unsupported: false, false, false false, false, false false, false, false c3a50072-0d81-4da7-b5dc-642b7f6317b4 unsupported: false, false, false, false, false false, false, false passed: false, false, false, false, false test 95783e57-aee7-4a73-a645-c6cc2d995cf7 unsupported: false, false, d88860c2-282f-471a-82ed-861ef21d1e9b unsupported: false, false, false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false failed: false, false, false, false, false false, false, false passed: false, false, false, false, false false, false, false passed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false test failed: false, false, false, false, false HTTPS testsHTTPS is the protocol that web browsers use to connect securely to websites. When HTTPS is being used, the connection is encrypted so that third parties on the network cannot read content being sent between the server and your browser. In the past, insecure connections were the default and websites would need to actively request that a browser use HTTPS. Now the status quo is shifting, and browser makers are moving toward a world where HTTPS is the default protocol. Insecure websiteChecks to see if the browser stops loading an passed: true,true,true,true,true result: Insecure website never insecure website and warns the passed: false,false,false,false,false result: Insecure website passed: false,false,false,false,false result: Insecure website passed: false,false,false result: Insecure website passed: false,false,false,false,false result: Insecure website loaded,Insecure website never loaded,Insecure website never passed: false,false,false,false,false result: Insecure website passed: false,false,false,false,false result: Insecure website passed: false,false,false,false,false result: Insecure website passed: false,false,false,false,false result: Insecure website passed: false,false,false,false,false result: Insecure website user before giving them the loaded,Insecure website loaded,Insecure website loaded,Insecure loaded,Insecure website loaded,Insecure website loaded,Insecure loaded,Insecure website loaded,Insecure website loaded loaded,Insecure website loaded,Insecure website loaded,Insecure loaded,Insecure website never loaded,Insecure website never loaded,Insecure website loaded,Insecure website loaded,Insecure loaded,Insecure website loaded,Insecure website loaded,Insecure loaded,Insecure website loaded,Insecure website loaded,Insecure loaded,Insecure website loaded,Insecure website loaded,Insecure loaded,Insecure website loaded,Insecure website loaded,Insecure option to continue. Known as website loaded,Insecure website loaded website loaded,Insecure website loaded website loaded,Insecure website loaded loaded website loaded,Insecure website loaded website loaded,Insecure website loaded website loaded,Insecure website loaded website loaded,Insecure website loaded website loaded,Insecure website loaded HTTPS-Only Mode in some browsers. Upgradable addressChecks to see if an insecure address entered upgraded: false,false,false,false,false passed: upgraded: false,false,false,false,false passed: upgraded: false,false,false,false,false passed: upgraded: true,true,true,true,true passed: upgraded: false,false,false,false,false passed: upgraded: false,false,false,false,false passed: upgraded: false,false,false,false,false passed: upgraded: false,false,false,false,false passed: into the browser's address bar false,false,false,false,false false,false,false,false,false upgraded: false,false,false passed: false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false upgraded: true,true,true,true,true passed: true,true,true,true,true false,false,false,false,false false,false,false,false,false is upgraded to HTTPS whenever possible. Upgradable hyperlinkChecks to see if the user has clicked on a hyperlink to an insecure upgraded: false,false,false,false,false passed: upgraded: false,false,false,false,false passed: upgraded: false,false,false passed: false,false,false upgraded: false,false,false,false,false passed: upgraded: true,true,true,true,true passed: upgraded: false,false,false,false,false passed: upgraded: false,false,false,false,false passed: upgraded: true,true,true,true,true passed: true,true,true,true,true upgraded: false,false,false,false,false passed: upgraded: false,false,false,false,false passed: address, if the browser false,false,false,false,false false,false,false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false upgrades that address to HTTPS whenever possible. Upgradable imageChecks to see if the browser attempts to passed: true,true,true,true,true result: passed: true,true,true,true,true result: passed: false,false,false,false,false result: loaded passed: true,true,true,true,true result: passed: true,true,true,true,true result: passed: false,false,false,false,false result: loaded passed: false,false,false,false,false result: loaded passed: true,true,true,true,true result: passed: true,true,true,true,true result: upgrade an insecure address for upgraded,upgraded,upgraded,upgraded,upgraded upgraded,upgraded,upgraded,upgraded,upgraded passed: true,true,true result: upgraded,upgraded,upgraded insecurely,loaded insecurely,loaded insecurely,loaded upgraded,upgraded,upgraded,upgraded,upgraded upgraded,upgraded,upgraded,upgraded,upgraded insecurely,loaded insecurely,loaded insecurely,loaded insecurely,loaded insecurely,loaded insecurely,loaded upgraded,upgraded,upgraded,upgraded,upgraded upgraded,upgraded,upgraded,upgraded,upgraded an image to HTTPS whenever insecurely,loaded insecurely insecurely,loaded insecurely insecurely,loaded insecurely possible. Upgradable scriptChecks to see if the browser attempts to passed: true,true,true,true,true result: passed: true,true,true,true,true result: passed: true,true,true,true,true result: passed: true,true,true,true,true result: passed: true,true,true,true,true result: passed: true,true,true,true,true result: passed: true,true,true,true,true result: passed: true,true,true,true,true result: passed: true,true,true,true,true result: upgrade an insecure address for blocked,blocked,blocked,blocked,blocked blocked,blocked,blocked,blocked,blocked passed: true,true,true result: blocked,blocked,blocked blocked,blocked,blocked,blocked,blocked upgraded,upgraded,upgraded,upgraded,upgraded blocked,blocked,blocked,blocked,blocked blocked,blocked,blocked,blocked,blocked blocked,blocked,blocked,blocked,blocked blocked,blocked,blocked,blocked,blocked blocked,blocked,blocked,blocked,blocked an script to HTTPS whenever possible. Misc testsThis category includes tests for the presence of miscellaneous privacy features. GPC enabled first-partyThe Global Privacy Control is an HTTP header that can be sent by a browser to instruct a website not to sell the user's personal header value: 1 passed: true,true,true,true,true header value: undefined passed: false,false,false,false,false header value: undefined passed: false,false,false header value: undefined passed: false,false,false,false,false header value: undefined passed: false,false,false,false,false header value: undefined passed: false,false,false,false,false header value: undefined passed: false,false,false,false,false header value: undefined passed: false,false,false,false,false header value: undefined passed: false,false,false,false,false header value: undefined passed: false,false,false,false,false data to third parties. This test checks to see if the GPC header is sent by default to the top-level website. GPC enabled third-partyThe Global Privacy Control is an HTTP header that can be sent by a browser to instruct a visited website not to sell the user's sec-gpc: 1 passed: true,true,true,true,true passed: false,false,false,false,false passed: false,false,false passed: false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false personal data to other parties. This test checks to see if the GPC header is sent to third-party elements on the web page. IP address leakIP addresses can be used to uniquely identify a large percentage of users. A passed: false,false,false,false,false passed: false,false,false,false,false passed: false,false,false passed: false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false passed: true,true,true,true,true passed: false,false,false,false,false passed: false,false,false,false,false proxy, VPN, or Tor can mask a user's IP address. - write: () => { if (!usingTor) { throw new Error("Unsupported"); - write: () => { if (!usingTor) { throw new Error("Unsupported"); - write: () => { if (!usingTor) { throw new Error("Unsupported"); - write: () => { if (!usingTor) { throw new Error("Unsupported"); - write: () => { if (!usingTor) { throw new Error("Unsupported"); - write: () => { if (!usingTor) { throw new Error("Unsupported"); write: () => { if (!usingTor) { throw new Error("Unsupported"); } } - write: () => { if (!usingTor) { throw new Error("Unsupported"); - write: () => { if (!usingTor) { throw new Error("Unsupported"); } } read: async () => { if (usingTor) { return ipAddress; } else } } read: async () => { if (usingTor) { return ipAddress; } else - write: () => { if (!usingTor) { throw new Error("Unsupported"); } } read: async () => { if (usingTor) { return ipAddress; } else } } read: async () => { if (usingTor) { return ipAddress; } else } } read: async () => { if (usingTor) { return ipAddress; } else } } read: async () => { if (usingTor) { return ipAddress; } else read: async () => { if (usingTor) { return ipAddress; } else { throw } } read: async () => { if (usingTor) { return ipAddress; } else } } read: async () => { if (usingTor) { return ipAddress; } else { throw new Error("Unsupported"); } } unsupported: { throw new Error("Unsupported"); } } unsupported: } } read: async () => { if (usingTor) { return ipAddress; } else { throw new Error("Unsupported"); } } unsupported: { throw new Error("Unsupported"); } } unsupported: { throw new Error("Unsupported"); } } unsupported: { throw new Error("Unsupported"); } } unsupported: new Error("Unsupported"); } } unsupported: { throw new Error("Unsupported"); } } unsupported: { throw new Error("Unsupported"); } } unsupported: Stream isolationBrowsers that true,true,true,true,true readSameFirstParty: Error: true,true,true,true,true readSameFirstParty: Error: { throw new Error("Unsupported"); } } unsupported: true,true,true true,true,true,true,true readSameFirstParty: Error: true,true,true,true,true readSameFirstParty: Error: true,true,true,true,true readSameFirstParty: Error: true,true,true,true,true readSameFirstParty: Error: false,false,false,false,false readSameFirstParty: true,true,true,true,true readSameFirstParty: Error: true,true,true,true,true readSameFirstParty: Error: use Tor can use a different Tor Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: readSameFirstParty: Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: 2605:6400:10:549::1,2a0b:f4c2:2::38,2a0b:f4c2:1::1,2a0b:f4c2:1::1,2a00:c70:2017:1::169 Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: circuit per top-level website. Unsupported,Error: Unsupported readDifferentFirstParty: Error: Unsupported,Error: Unsupported readDifferentFirstParty: Error: Unsupported readDifferentFirstParty: Error: Unsupported,Error: Unsupported,Error: Unsupported readDifferentFirstParty: Error: Unsupported,Error: Unsupported readDifferentFirstParty: Error: Unsupported,Error: Unsupported readDifferentFirstParty: Error: Unsupported,Error: Unsupported readDifferentFirstParty: Error: readDifferentFirstParty: Unsupported,Error: Unsupported readDifferentFirstParty: Error: Unsupported,Error: Unsupported readDifferentFirstParty: Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported testFailed: false,false,false Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: 2a0b:f4c0:16c:4::1,2a01:4262:1ab:ffff::132,91.219.237.21,162.247.74.202,2a0b:f4c2:2::41 Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported,Error: Unsupported testFailed: Unsupported,Error: Unsupported testFailed: Unsupported,Error: Unsupported testFailed: Unsupported,Error: Unsupported testFailed: Unsupported,Error: Unsupported testFailed: Unsupported,Error: Unsupported testFailed: passed: true,true,true,true,true testFailed: Unsupported,Error: Unsupported testFailed: Unsupported,Error: Unsupported testFailed: false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false Tor enabledThe Tor network sends the browser's web requests through a series of relays to hide a user's IP IsTorExit: false,false,false,false,false passed: IsTorExit: false,false,false,false,false passed: IsTorExit: false,false,false,false,false passed: IsTorExit: false,false,false,false,false passed: IsTorExit: false,false,false,false,false passed: IsTorExit: false,false,false,false,false passed: IsTorExit: true,true,true,true,true passed: IsTorExit: false,false,false,false,false passed: IsTorExit: false,false,false,false,false passed: address, thereby helping to false,false,false,false,false false,false,false,false,false IsTorExit: false,false,false passed: false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false mask their identity and location. This test checks to see if the Tor network is being used by default. Fingerprinting resistance testsFingerprinting is a technique trackers use to uniquely identify you as you browse the web. A fingerprinting script will measure several characteristics of your browser and, combining this data, will build a fingerprint that may uniquely identify you among web users. Browsers can introduce countermeasures, such as minimizing the distinguishing information disclosed by certain web APIs so your browser is harder to pick out from the crowd (so-called 'fingerprinting resistance'). Media query screen heightHeight expression: undefined desired expression: innerHeight actual expression: undefined desired expression: innerHeight actual expression: undefined desired expression: innerHeight actual expression: undefined desired expression: innerHeight actual expression: undefined desired expression: innerHeight actual expression: undefined desired expression: innerHeight actual expression: undefined desired expression: innerHeight actual expression: undefined desired expression: innerHeight actual value: expression: undefined desired expression: innerHeight actual expression: undefined desired expression: innerHeight actual of the user's screen in pixels. value: 1440,1440,1440,1440,1440 desired value: value: 1440,1440,1440,1440,1440 desired value: value: 1440,1440,1440 desired value: 900,900,900 passed: value: 1440,1440,1440,1440,1440 desired value: value: 928,928,928,928,928 desired value: 928,928,928,928,928 value: 1440,1440,1440,1440,1440 desired value: value: 1440,1440,1440,1440,1440 desired value: 0,1000,1000,1000,1000 desired value: 0,1000,1000,1000,1000 passed: value: 1440,1440,1440,1440,1440 desired value: value: 1440,1440,1440,1440,1440 desired value: 1112,1112,1112,1112,1112 passed: false,false,false,false,false 1011,1011,1011,1011,1011 passed: false,false,false,false,false false,false,false 983,983,983,983,983 passed: false,false,false,false,false passed: true,true,true,true,true 1341,1341,1341,1341,1341 passed: false,false,false,false,false 860,860,860,860,860 passed: false,false,false,false,false true,true,true,true,true 0,1260,1260,1260,1260 passed: false,false,false,false,false 988,988,988,988,988 passed: false,false,false,false,false Media query screen widthWidth expression: undefined desired expression: innerWidth actual expression: undefined desired expression: innerWidth actual expression: undefined desired expression: innerWidth actual expression: undefined desired expression: innerWidth actual expression: undefined desired expression: innerWidth actual expression: undefined desired expression: innerWidth actual expression: undefined desired expression: innerWidth actual expression: undefined desired expression: innerWidth actual value: expression: undefined desired expression: innerWidth actual expression: undefined desired expression: innerWidth actual of the user's screen in pixels. value: 2560,2560,2560,2560,2560 desired value: value: 2560,2560,2560,2560,2560 desired value: value: 2560,2560,2560 desired value: 1607,1607,1607 passed: value: 2560,2560,2560,2560,2560 desired value: value: 1600,1600,1600,1600,1600 desired value: value: 2560,2560,2560,2560,2560 desired value: value: 2560,2560,2560,2560,2560 desired value: 0,1000,1000,1000,1000 desired value: 0,1000,1000,1000,1000 passed: value: 2560,2560,2560,2560,2560 desired value: value: 2560,2560,2560,2560,2560 desired value: 1200,1200,1200,1200,1200 passed: false,false,false,false,false 1883,1883,1883,1883,1883 passed: false,false,false,false,false false,false,false 1280,1280,1280,1280,1280 passed: false,false,false,false,false 1600,1600,1600,1600,1600 passed: true,true,true,true,true 1240,1240,1240,1240,1240 passed: false,false,false,false,false 1324,1324,1324,1324,1324 passed: false,false,false,false,false true,true,true,true,true 0,1200,1200,1200,1200 passed: false,false,false,false,false 1306,1306,1306,1306,1306 passed: false,false,false,false,false outerHeightHeight of the expression: outerHeight desired expression: innerHeight actual expression: outerHeight desired expression: innerHeight actual expression: outerHeight desired expression: innerHeight actual expression: outerHeight desired expression: innerHeight actual expression: outerHeight desired expression: innerHeight actual expression: outerHeight desired expression: innerHeight actual expression: outerHeight desired expression: innerHeight actual expression: outerHeight desired expression: innerHeight actual expression: outerHeight desired expression: innerHeight actual expression: outerHeight desired expression: innerHeight actual browser window in pixels, value: 1187,1187,1187,1187,1187 desired value: value: 1090,1090,1090,1090,1090 desired value: value: 979,979,979 desired value: 900,900,900 passed: value: 1068,1068,1068,1068,1068 desired value: value: 928,928,928,928,928 desired value: 928,928,928,928,928 value: 1415,1415,1415,1415,1415 desired value: value: 940,940,940,940,940 desired value: 860,860,860,860,860 value: 0,1000,1000,1000,1000 desired value: 0,1000,1000,1000,1000 value: 1371,1371,1371,1371,1371 desired value: value: 1081,1081,1081,1081,1081 desired value: including browser chrome. 1112,1112,1112,1112,1112 passed: false,false,false,false,false 1011,1011,1011,1011,1011 passed: false,false,false,false,false false,false,false 983,983,983,983,983 passed: false,false,false,false,false passed: true,true,true,true,true 1341,1341,1341,1341,1341 passed: false,false,false,false,false passed: false,false,false,false,false passed: true,true,true,true,true 0,1260,1260,1260,1260 passed: false,false,false,false,false 988,988,988,988,988 passed: false,false,false,false,false screen.heightHeight of the expression: screen.height desired expression: innerHeight expression: screen.height desired expression: innerHeight expression: screen.height desired expression: innerHeight expression: screen.height desired expression: innerHeight expression: screen.height desired expression: innerHeight expression: screen.height desired expression: innerHeight expression: screen.height desired expression: innerHeight expression: screen.height desired expression: innerHeight actual expression: screen.height desired expression: innerHeight expression: screen.height desired expression: innerHeight user's screen, in pixels. actual value: 1440,1440,1440,1440,1440 desired value: actual value: 1440,1440,1440,1440,1440 desired value: actual value: 1440,1440,1440 desired value: 900,900,900 passed: actual value: 1440,1440,1440,1440,1440 desired value: actual value: 928,928,928,928,928 desired value: actual value: 1440,1440,1440,1440,1440 desired value: actual value: 1440,1440,1440,1440,1440 desired value: value: 0,1000,1000,1000,1000 desired value: 0,1000,1000,1000,1000 actual value: 1440,1440,1440,1440,1440 desired value: actual value: 1440,1440,1440,1440,1440 desired value: 1112,1112,1112,1112,1112 passed: false,false,false,false,false 1011,1011,1011,1011,1011 passed: false,false,false,false,false false,false,false 983,983,983,983,983 passed: false,false,false,false,false 928,928,928,928,928 passed: true,true,true,true,true 1341,1341,1341,1341,1341 passed: false,false,false,false,false 860,860,860,860,860 passed: false,false,false,false,false passed: true,true,true,true,true 0,1260,1260,1260,1260 passed: false,false,false,false,false 988,988,988,988,988 passed: false,false,false,false,false screen.widthWidth of the user's expression: screen.width desired expression: innerWidth actual expression: screen.width desired expression: innerWidth actual expression: screen.width desired expression: innerWidth actual expression: screen.width desired expression: innerWidth actual expression: screen.width desired expression: innerWidth actual expression: screen.width desired expression: innerWidth actual expression: screen.width desired expression: innerWidth actual expression: screen.width desired expression: innerWidth actual expression: screen.width desired expression: innerWidth actual expression: screen.width desired expression: innerWidth actual screen, in pixels. value: 2560,2560,2560,2560,2560 desired value: value: 2560,2560,2560,2560,2560 desired value: value: 2560,2560,2560 desired value: 1607,1607,1607 passed: value: 2560,2560,2560,2560,2560 desired value: value: 1600,1600,1600,1600,1600 desired value: value: 2560,2560,2560,2560,2560 desired value: value: 2560,2560,2560,2560,2560 desired value: value: 0,1000,1000,1000,1000 desired value: 0,1000,1000,1000,1000 value: 2560,2560,2560,2560,2560 desired value: value: 2560,2560,2560,2560,2560 desired value: 1200,1200,1200,1200,1200 passed: false,false,false,false,false 1883,1883,1883,1883,1883 passed: false,false,false,false,false false,false,false 1280,1280,1280,1280,1280 passed: false,false,false,false,false 1600,1600,1600,1600,1600 passed: true,true,true,true,true 1240,1240,1240,1240,1240 passed: false,false,false,false,false 1324,1324,1324,1324,1324 passed: false,false,false,false,false passed: true,true,true,true,true 0,1200,1200,1200,1200 passed: false,false,false,false,false 1306,1306,1306,1306,1306 passed: false,false,false,false,false screenXPosition, in pixels, of expression: screenX desired expression: 0 actual value: expression: screenX desired expression: 0 actual value: expression: screenX desired expression: 0 actual value: expression: screenX desired expression: 0 actual value: expression: screenX desired expression: 0 actual value: expression: screenX desired expression: 0 actual value: expression: screenX desired expression: 0 actual value: expression: screenX desired expression: 0 actual value: 0,0,0,0,0 expression: screenX desired expression: 0 actual value: expression: screenX desired expression: 0 actual value: the left edge of the browser 123,123,123,123,123 desired value: 0,0,0,0,0 passed: 139,139,139,139,139 desired value: 0,0,0,0,0 passed: 235,235,235 desired value: 0,0,0 passed: false,false,false 4,4,4,4,4 desired value: 0,0,0,0,0 passed: 0,0,0,0,0 desired value: 0,0,0,0,0 passed: 318,318,318,318,318 desired value: 0,0,0,0,0 passed: 542,542,542,542,542 desired value: 0,0,0,0,0 passed: desired value: 0,0,0,0,0 passed: true,true,true,true,true 3439,3439,3439,3439,3439 desired value: 0,0,0,0,0 passed: 326,304,304,304,304 desired value: 0,0,0,0,0 passed: window on screen. false,false,false,false,false false,false,false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false screenYPosition, in pixels, of expression: screenY desired expression: 0 actual value: expression: screenY desired expression: 0 actual value: expression: screenY desired expression: 0 actual value: expression: screenY desired expression: 0 actual value: expression: screenY desired expression: 0 actual value: expression: screenY desired expression: 0 actual value: expression: screenY desired expression: 0 actual value: expression: screenY desired expression: 0 actual value: 0,0,0,0,0 expression: screenY desired expression: 0 actual value: expression: screenY desired expression: 0 actual value: the top edge of the browser 25,25,25,25,25 desired value: 0,0,0,0,0 passed: 202,202,202,202,202 desired value: 0,0,0,0,0 passed: 138,138,138 desired value: 0,0,0 passed: false,false,false 25,25,25,25,25 desired value: 0,0,0,0,0 passed: 0,0,0,0,0 desired value: 0,0,0,0,0 passed: 25,25,25,25,25 desired value: 0,0,0,0,0 passed: 141,141,141,141,141 desired value: 0,0,0,0,0 passed: desired value: 0,0,0,0,0 passed: true,true,true,true,true 69,69,69,69,69 desired value: 0,0,0,0,0 passed: 210,188,188,188,188 desired value: 0,0,0,0,0 passed: window on screen. false,false,false,false,false false,false,false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false System font detectionWeb pages can detect the presence of a expression: undefined desired expression: undefined actual expression: undefined desired expression: undefined actual expression: undefined desired expression: undefined actual expression: undefined desired expression: undefined actual expression: undefined desired expression: undefined actual expression: undefined desired expression: undefined actual expression: undefined desired expression: undefined actual expression: undefined desired expression: undefined actual expression: undefined desired expression: undefined actual font installed on the user's value: undefined desired value: undefined passed: value: undefined desired value: undefined passed: value: undefined desired value: undefined passed: value: undefined desired value: undefined passed: value: undefined desired value: undefined passed: value: undefined desired value: undefined passed: value: undefined desired value: undefined passed: expression: undefined desired expression: undefined actual value: value: undefined desired value: undefined passed: value: undefined desired value: undefined passed: system. The presence or absence false,false,false,false,false false,false,false,false,false false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false true,true,true,true,true undefined desired value: undefined passed: true,true,true,true,true false,false,false,false,false false,false,false,false,false of various fonts is commonly used to fingerprint users. Tracking query parameter testsWhen you browse from one web page to another, tracking companies will frequently attach a 'tracking query parameter' to the address of the second web page. That query parameter may contain a unique identifier that tracks you individually as you browse the web. And these query parameters are frequently synchronized with cookies, making them a powerful tracking vector. Web browsers can protect you from known tracking query parameters by stripping them from web addresses before your browser sends them. (The set of tracking query parameters tested here was largely borrowed from Brave.) __hsfpHubSpot tracking passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false parameter __hsscHubSpot tracking passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false parameter __hstcHubSpot tracking passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false parameter __sDrip.com email address passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false tracking parameter _hsencHubSpot tracking passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false parameter _openstatYandex tracking passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false parameter dclidDoubleClick Click ID passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false (Google) fbclidFacebook Click Identifier passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false gclidGoogle Click Identifier passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false hsCtaTrackingHubSpot tracking passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false parameter igshidInstagram tracking value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false parameter mc_eidMailchimp Email ID (email passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false recipient's address) mkt_tokAdobe Marketo tracking value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false parameter ml_subscriberMailerLite email passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false tracking ml_subscriber_hashMailerLite passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false email tracking msclkidMicrosoft Click ID passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false oly_anon_idOmeda marketing passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false 'anonymous' customer id oly_enc_idOmeda marketing passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false 'known' customer id rb_clickidUnknown high-entropy passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false tracking parameter s_cidAdobe Site Catalyst passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false tracking parameter vero_convVero tracking passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false parameter vero_idVero tracking parameter passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false wickedidWicked Reports passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false e-commerce tracking yclidYandex Click ID passed: true,true,true,true,true value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false value: 9960909729851712 passed: false,false,false,false,false Tracker content blockingWhen you visit a web page, it frequently has third-party embedded tracking content, such as scripts and tracking pixels. These embedded components spy on you. Some browsers and browser extensions maintain list of tracking companies and block their content from being loaded. This section checks to see if a browser blocks 20 of the largest trackers, as reported by https:// whotracks.me. AdobeTests whether the browser blocks the page from loading url: https://munchkin.marketo.net/munchkin.js passed: url: https://munchkin.marketo.net/munchkin.js passed: url: https://munchkin.marketo.net/munchkin.js passed: url: https://munchkin.marketo.net/munchkin.js passed: url: https://munchkin.marketo.net/munchkin.js passed: url: https://munchkin.marketo.net/munchkin.js passed: url: https://munchkin.marketo.net/munchkin.js passed: url: https://munchkin.marketo.net/munchkin.js passed: url: https://munchkin.marketo.net/munchkin.js passed: url: https://munchkin.marketo.net/munchkin.js passed: the tracker at https:// true,true,true,true,true false,false,false,false,false false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false munchkin.marketo.net/ munchkin.js Amazon adsystemTests whether the browser blocks the page from loading the tracker at url: https://aax-us-east.amazon-adsystem.com/x/px passed: url: https://aax-us-east.amazon-adsystem.com/x/px passed: url: https://aax-us-east.amazon-adsystem.com/x/px passed: url: https://aax-us-east.amazon-adsystem.com/x/px passed: url: https://aax-us-east.amazon-adsystem.com/x/px passed: url: https://aax-us-east.amazon-adsystem.com/x/px passed: url: https://aax-us-east.amazon-adsystem.com/x/px passed: url: https://aax-us-east.amazon-adsystem.com/x/px passed: url: https://aax-us-east.amazon-adsystem.com/x/px passed: url: https://aax-us-east.amazon-adsystem.com/x/px passed: https:// true,true,true,true,true false,false,false,false,false false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false aax-us-east.amazon-adsystem.com /x/px AppNextTests whether the browser blocks the page from url: https://acdn.adnxs.com/dmp/up/pixie.js passed: url: https://acdn.adnxs.com/dmp/up/pixie.js passed: url: https://acdn.adnxs.com/dmp/up/pixie.js passed: url: https://acdn.adnxs.com/dmp/up/pixie.js passed: url: https://acdn.adnxs.com/dmp/up/pixie.js passed: url: https://acdn.adnxs.com/dmp/up/pixie.js passed: url: https://acdn.adnxs.com/dmp/up/pixie.js passed: url: https://acdn.adnxs.com/dmp/up/pixie.js passed: url: https://acdn.adnxs.com/dmp/up/pixie.js passed: url: https://acdn.adnxs.com/dmp/up/pixie.js passed: loading the tracker at https:// true,true,true,true,true false,false,false,false,false false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false acdn.adnxs.com/dmp/up/pixie.js Bing AdsTests whether the browser blocks the page from url: https://bat.bing.com/bat.js passed: url: https://bat.bing.com/bat.js passed: url: https://bat.bing.com/bat.js passed: false,false,false url: https://bat.bing.com/bat.js passed: url: https://bat.bing.com/bat.js passed: url: https://bat.bing.com/bat.js passed: url: https://bat.bing.com/bat.js passed: url: https://bat.bing.com/bat.js passed: url: https://bat.bing.com/bat.js passed: url: https://bat.bing.com/bat.js passed: loading the tracker at https:// true,true,true,true,true false,false,false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false bat.bing.com/bat.js ChartbeatTests whether the browser blocks the page from url: https://pdev.chartbeat.net/ping?h=x&p=x&r=&b= passed: url: https://pdev.chartbeat.net/ping?h=x&p=x&r=&b= passed: url: https://pdev.chartbeat.net/ping?h=x&p=x&r=&b= passed: url: https://pdev.chartbeat.net/ping?h=x&p=x&r=&b= passed: url: https://pdev.chartbeat.net/ping?h=x&p=x&r=&b= passed: url: https://pdev.chartbeat.net/ping?h=x&p=x&r=&b= passed: url: https://pdev.chartbeat.net/ping?h=x&p=x&r=&b= passed: url: https://pdev.chartbeat.net/ping?h=x&p=x&r=&b= passed: url: https://pdev.chartbeat.net/ping?h=x&p=x&r=&b= passed: url: https://pdev.chartbeat.net/ping?h=x&p=x&r=&b= passed: loading the tracker at https:// true,true,true,true,true false,false,false,false,false false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false pdev.chartbeat.net/ping?h=x&p=x &r=&b= CriteoTests whether the browser blocks the page from loading url: https://csm.da.us.criteo.net/iev passed: url: https://csm.da.us.criteo.net/iev passed: url: https://csm.da.us.criteo.net/iev passed: false,false,false url: https://csm.da.us.criteo.net/iev passed: url: https://csm.da.us.criteo.net/iev passed: url: https://csm.da.us.criteo.net/iev passed: url: https://csm.da.us.criteo.net/iev passed: url: https://csm.da.us.criteo.net/iev passed: url: https://csm.da.us.criteo.net/iev passed: url: https://csm.da.us.criteo.net/iev passed: the tracker at https:// true,true,true,true,true false,false,false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false csm.da.us.criteo.net/iev DoubleClick (Google)Tests whether the browser blocks the page from loading the tracker url: https://securepubads.g.doubleclick.net/static/glade.js url: https://securepubads.g.doubleclick.net/static/glade.js url: https://securepubads.g.doubleclick.net/static/glade.js url: https://securepubads.g.doubleclick.net/static/glade.js url: https://securepubads.g.doubleclick.net/static/glade.js url: https://securepubads.g.doubleclick.net/static/glade.js url: https://securepubads.g.doubleclick.net/static/glade.js url: https://securepubads.g.doubleclick.net/static/glade.js passed: url: https://securepubads.g.doubleclick.net/static/glade.js url: https://securepubads.g.doubleclick.net/static/glade.js at https:// passed: true,true,true,true,true passed: false,false,false,false,false passed: false,false,false passed: false,false,false,false,false passed: true,true,true,true,true passed: false,false,false,false,false passed: false,false,false,false,false false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false securepubads.g.doubleclick.net/ static/glade.js Facebook PixelTests whether the browser blocks the page from url: https://www.facebook.com/tr?id=123 passed: url: https://www.facebook.com/tr?id=123 passed: url: https://www.facebook.com/tr?id=123 passed: url: https://www.facebook.com/tr?id=123 passed: url: https://www.facebook.com/tr?id=123 passed: url: https://www.facebook.com/tr?id=123 passed: url: https://www.facebook.com/tr?id=123 passed: url: https://www.facebook.com/tr?id=123 passed: url: https://www.facebook.com/tr?id=123 passed: url: https://www.facebook.com/tr?id=123 passed: loading the tracker at https:// true,true,true,true,true false,false,false,false,false false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false www.facebook.com/tr?id=123 Google Ad ServicesTests whether the browser blocks the page from loading the tracker at url: https://www.googleadservices.com/pagead/conversion.js url: https://www.googleadservices.com/pagead/conversion.js url: https://www.googleadservices.com/pagead/conversion.js url: https://www.googleadservices.com/pagead/conversion.js url: https://www.googleadservices.com/pagead/conversion.js url: https://www.googleadservices.com/pagead/conversion.js url: https://www.googleadservices.com/pagead/conversion.js url: https://www.googleadservices.com/pagead/conversion.js passed: url: https://www.googleadservices.com/pagead/conversion.js url: https://www.googleadservices.com/pagead/conversion.js https:// passed: true,true,true,true,true passed: false,false,false,false,false passed: false,false,false passed: false,false,false,false,false passed: true,true,true,true,true passed: false,false,false,false,false passed: false,false,false,false,false false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false www.googleadservices.com/pagead /conversion.js Google AnalyticsTests whether the browser blocks the page url: https://google-analytics.com/urchin.js passed: url: https://google-analytics.com/urchin.js passed: url: https://google-analytics.com/urchin.js passed: url: https://google-analytics.com/urchin.js passed: url: https://google-analytics.com/urchin.js passed: url: https://google-analytics.com/urchin.js passed: url: https://google-analytics.com/urchin.js passed: url: https://google-analytics.com/urchin.js passed: url: https://google-analytics.com/urchin.js passed: url: https://google-analytics.com/urchin.js passed: from loading the tracker at true,true,true,true,true false,false,false,false,false false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false https://google-analytics.com/ urchin.js Google SyndicationTests whether the browser blocks the page from loading the tracker at url: https://tpc.googlesyndication.com/sodar/UFYwWwmt.js url: https://tpc.googlesyndication.com/sodar/UFYwWwmt.js url: https://tpc.googlesyndication.com/sodar/UFYwWwmt.js url: https://tpc.googlesyndication.com/sodar/UFYwWwmt.js url: https://tpc.googlesyndication.com/sodar/UFYwWwmt.js url: https://tpc.googlesyndication.com/sodar/UFYwWwmt.js url: https://tpc.googlesyndication.com/sodar/UFYwWwmt.js url: https://tpc.googlesyndication.com/sodar/UFYwWwmt.js passed: url: https://tpc.googlesyndication.com/sodar/UFYwWwmt.js url: https://tpc.googlesyndication.com/sodar/UFYwWwmt.js https:// passed: true,true,true,true,true passed: false,false,false,false,false passed: false,false,false passed: false,false,false,false,false passed: true,true,true,true,true passed: false,false,false,false,false passed: false,false,false,false,false false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false tpc.googlesyndication.com/sodar /UFYwWwmt.js Google Tag ManagerTests whether the browser blocks the page from loading the tracker at url: https://www.googletagmanager.com/gtag.js?id=GTM-NX4SMZL url: https://www.googletagmanager.com/gtag.js?id=GTM-NX4SMZL url: https://www.googletagmanager.com/gtag.js?id=GTM-NX4SMZL url: https://www.googletagmanager.com/gtag.js?id=GTM-NX4SMZL url: https://www.googletagmanager.com/gtag.js?id=GTM-NX4SMZL url: https://www.googletagmanager.com/gtag.js?id=GTM-NX4SMZL url: https://www.googletagmanager.com/gtag.js?id=GTM-NX4SMZL url: https://www.googletagmanager.com/gtag.js?id=GTM-NX4SMZL url: https://www.googletagmanager.com/gtag.js?id=GTM-NX4SMZL url: https://www.googletagmanager.com/gtag.js?id=GTM-NX4SMZL https:// passed: true,true,true,true,true passed: false,false,false,false,false passed: false,false,false passed: false,false,false,false,false passed: true,true,true,true,true passed: false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false www.googletagmanager.com/ gtag.js?id=GTM-NX4SMZL Index ExchangeTests whether the browser blocks the page from url: https://dsum-sec.casalemedia.com/crum?cm_dsp_id=10& url: https://dsum-sec.casalemedia.com/crum?cm_dsp_id=10& url: https://dsum-sec.casalemedia.com/crum?cm_dsp_id=10& url: https://dsum-sec.casalemedia.com/crum?cm_dsp_id=10& url: https://dsum-sec.casalemedia.com/crum?cm_dsp_id=10& url: https://dsum-sec.casalemedia.com/crum?cm_dsp_id=10& url: https://dsum-sec.casalemedia.com/crum?cm_dsp_id=10& url: https://dsum-sec.casalemedia.com/crum?cm_dsp_id=10& url: https://dsum-sec.casalemedia.com/crum?cm_dsp_id=10& loading the tracker at https:// external_user_id=629685505537&C=1 passed: external_user_id=629685505537&C=1 passed: url: https://dsum-sec.casalemedia.com/crum?cm_dsp_id=10& external_user_id=629685505537&C=1 passed: external_user_id=629685505537&C=1 passed: external_user_id=629685505537&C=1 passed: external_user_id=629685505537&C=1 passed: external_user_id=629685505537&C=1 passed: external_user_id=629685505537&C=1 passed: external_user_id=629685505537&C=1 passed: dsum-sec.casalemedia.com/crum? true,true,true,true,true false,false,false,false,false external_user_id=629685505537&C=1 passed: false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false cm_dsp_id=10&external_user_id= 629685505537&C=1 New RelicTests whether the browser blocks the page from url: https://js-agent.newrelic.com/nr-1212.min.js passed: url: https://js-agent.newrelic.com/nr-1212.min.js passed: url: https://js-agent.newrelic.com/nr-1212.min.js passed: url: https://js-agent.newrelic.com/nr-1212.min.js passed: url: https://js-agent.newrelic.com/nr-1212.min.js passed: url: https://js-agent.newrelic.com/nr-1212.min.js passed: url: https://js-agent.newrelic.com/nr-1212.min.js passed: url: https://js-agent.newrelic.com/nr-1212.min.js passed: url: https://js-agent.newrelic.com/nr-1212.min.js passed: url: https://js-agent.newrelic.com/nr-1212.min.js passed: loading the tracker at https:// true,true,true,true,true false,false,false,false,false false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false js-agent.newrelic.com/ nr-1212.min.js QuantcastTests whether the browser blocks the page from url: https://pixel.quantserve.com/pixel passed: url: https://pixel.quantserve.com/pixel passed: url: https://pixel.quantserve.com/pixel passed: url: https://pixel.quantserve.com/pixel passed: url: https://pixel.quantserve.com/pixel passed: url: https://pixel.quantserve.com/pixel passed: url: https://pixel.quantserve.com/pixel passed: url: https://pixel.quantserve.com/pixel passed: url: https://pixel.quantserve.com/pixel passed: url: https://pixel.quantserve.com/pixel passed: loading the tracker at https:// true,true,true,true,true false,false,false,false,false false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false pixel.quantserve.com/pixel Scorecard Research BeaconTests whether the browser blocks the page from loading the tracker url: https://sb.scorecardresearch.com/internal-c2/default/cs.js url: https://sb.scorecardresearch.com/internal-c2/default/cs.js url: https://sb.scorecardresearch.com/internal-c2/default/cs.js url: https://sb.scorecardresearch.com/internal-c2/default/cs.js url: https://sb.scorecardresearch.com/internal-c2/default/cs.js url: https://sb.scorecardresearch.com/internal-c2/default/cs.js url: https://sb.scorecardresearch.com/internal-c2/default/cs.js url: https://sb.scorecardresearch.com/internal-c2/default/cs.js url: https://sb.scorecardresearch.com/internal-c2/default/cs.js url: https://sb.scorecardresearch.com/internal-c2/default/cs.js at https:// passed: true,true,true,true,true passed: false,false,false,false,false passed: false,false,false passed: false,false,false,false,false passed: true,true,true,true,true passed: false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false passed: false,false,false,false,false sb.scorecardresearch.com/ internal-c2/default/cs.js TaboolaTests whether the browser blocks the page from url: https://cdn.taboola.com/libtrc/UNIQUEID/tfa.js passed: url: https://cdn.taboola.com/libtrc/UNIQUEID/tfa.js passed: url: https://cdn.taboola.com/libtrc/UNIQUEID/tfa.js passed: url: https://cdn.taboola.com/libtrc/UNIQUEID/tfa.js passed: url: https://cdn.taboola.com/libtrc/UNIQUEID/tfa.js passed: url: https://cdn.taboola.com/libtrc/UNIQUEID/tfa.js passed: url: https://cdn.taboola.com/libtrc/UNIQUEID/tfa.js passed: url: https://cdn.taboola.com/libtrc/UNIQUEID/tfa.js passed: url: https://cdn.taboola.com/libtrc/UNIQUEID/tfa.js passed: url: https://cdn.taboola.com/libtrc/UNIQUEID/tfa.js passed: loading the tracker at https:// true,true,true,true,true false,false,false,false,false false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false cdn.taboola.com/libtrc/UNIQUEID /tfa.js Twitter AdsTests whether the browser blocks the page from url: https://static.ads-twitter.com/uwt.js passed: url: https://static.ads-twitter.com/uwt.js passed: url: https://static.ads-twitter.com/uwt.js passed: url: https://static.ads-twitter.com/uwt.js passed: url: https://static.ads-twitter.com/uwt.js passed: url: https://static.ads-twitter.com/uwt.js passed: url: https://static.ads-twitter.com/uwt.js passed: url: https://static.ads-twitter.com/uwt.js passed: url: https://static.ads-twitter.com/uwt.js passed: url: https://static.ads-twitter.com/uwt.js passed: loading the tracker at https:// true,true,true,true,true false,false,false,false,false false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false static.ads-twitter.com/uwt.js Yandex AdsTests whether the browser blocks the page from url: https://yandex.ru/ads/system/header-bidding.js passed: url: https://yandex.ru/ads/system/header-bidding.js passed: url: https://yandex.ru/ads/system/header-bidding.js passed: url: https://yandex.ru/ads/system/header-bidding.js passed: url: https://yandex.ru/ads/system/header-bidding.js passed: url: https://yandex.ru/ads/system/header-bidding.js passed: url: https://yandex.ru/ads/system/header-bidding.js passed: url: https://yandex.ru/ads/system/header-bidding.js passed: url: https://yandex.ru/ads/system/header-bidding.js passed: url: https://yandex.ru/ads/system/header-bidding.js passed: loading the tracker at https:// true,true,true,true,true false,false,false,false,false false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false yandex.ru/ads/system/ header-bidding.js Yandex MetrikaTests whether the browser blocks the page from url: https://mc.yandex.ru/metrika/tag.js passed: url: https://mc.yandex.ru/metrika/tag.js passed: url: https://mc.yandex.ru/metrika/tag.js passed: url: https://mc.yandex.ru/metrika/tag.js passed: url: https://mc.yandex.ru/metrika/tag.js passed: url: https://mc.yandex.ru/metrika/tag.js passed: url: https://mc.yandex.ru/metrika/tag.js passed: url: https://mc.yandex.ru/metrika/tag.js passed: url: https://mc.yandex.ru/metrika/tag.js passed: url: https://mc.yandex.ru/metrika/tag.js passed: loading the tracker at https:// true,true,true,true,true false,false,false,false,false false,false,false false,false,false,false,false true,true,true,true,true false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false false,false,false,false,false mc.yandex.ru/metrika/tag.js Tests ran at 2022-01-07 09:00:03 UTC. Source version: 6e758b3e. Raw data in JSON.