This is an old revision of the document!
Table of Contents
Provenance: privacy:browser_protection
Working log behind Measuring with Browser Tracking Protections On. Corpus-wide caveats: corpus. No bibliography keys beyond the four this sitting appended to the shared bibliography (§8). No ~~DISCUSSION~~: comments belong on the content page, following the convention set by the earlier provenance: pages.
Run: 2026-09-01. Item privacy:browser_protection (new). Creating, not extending: no page with this id existed, and neither privacy:browser_extensions nor any other page covered browser-shipped protections as a treatment. contributing uses “Browser protection” as its worked example of a page that does not exist yet; it now does.
1. What this page is backing, and what it is not
The item asked for Firefox ETP, Safari ITP, Brave Shields and Edge Tracking Prevention as a treatment — paired crawls with the protection on versus off. The page keeps that scope and pushes three neighbours away explicitly:
| Boundary | Where it goes instead |
|---|---|
| the filter list as an instrument, and its ground-truth circularity | filter_lists |
| what you do with the requests once collected | requests, fingerprinting |
| privacy of extensions (what an extension leaks) | not written; distinct topic, not created here |
| extension-side blockers as arms (uBlock, AdGuard, MV3) | covered on the page only as an adjacent verdict class, pointing at filter_lists |
Overlap check. privacy_sandbox carries the Chrome half of “the browser is a variable”; this page cross-links to it rather than restating it. browser_storage owns partitioning as a storage question; this page owns it as an arm. stateful_stateless owns statefulness; this page names it as a thing to hold constant. No figure is duplicated across those pages.
2. Populations and denominators
Every figure on the content page comes from one of these. Nothing is a share of “all 5,859 papers”.
| # | Query | Population | N | Result |
|---|---|---|---|---|
| Q1 | corpus size, structured extraction | — | — | 5,859 papers, 7 venues, 2010–2026 |
| Q2 | corpus size, rendered full text (paper.cols.txt) | — | — | 5,869 |
| Q3 | ran a crawl: crawlConfig != null OR studyTypes has automated-web-crawl | all | 5,859 | 1,120 |
| Q4 | Q3 AND platforms has web | crawled | 1,120 | 857 |
| Q5 | names >=1 of six browser-shipped protections (full-text sweep) | full text | 5,869 | 121 (2.1%) |
| Q6 | per-mechanism paper counts | full text | 5,869 | Brave Shields 78, Safari ITP 41, Firefox ETP 27, Total Cookie Protection 17, bounce-tracking 12, Chrome Tracking Protection 1, Edge Tracking Prevention 0 |
| Q7 | per-year counts of Q5 | full text | per year | table on the page; 2010–2016 all zero |
| Q8 | crawled AND Q5 | crawled | 1,120 | 84 (7.5%) |
| Q9 | web-crawled AND Q5 | webCrawled | 857 | 84 (9.8%) |
| Q10 | web crawls 2019–2022 naming a protection | webCrawled 2019–2022 | 266 | 43 (16.2%) |
| Q11 | web crawls 2023–2026 naming a protection | webCrawled 2023–2026 | 332 | 37 (11.1%) |
| Q12 | web crawls 2024–2026 naming a protection | webCrawled 2024–2026 | 235 | 24 (10.2%) |
| Q13 | states >=1 browser in crawlConfig.browsers | crawled | 1,120 | 529 (47.2%) |
| Q14 | folded browser families, paper-counted | stating a browser | 529 | table on the page; Chrome 217, Firefox 154, Chromium 101, Tor Browser 37, Edge 15, Safari 11, Brave 10, DuckDuckGo 2, Firefox Focus 1 |
| Q15 | >=2 distinct real browser families | stating a browser | 529 | 80 (15.1%); also 7.1% of all 1,120 crawling |
| Q16 | >=3 distinct real browser families | stating a browser | 529 | 25 (4.7%) |
| Q17 | any used/produced tool of category browser | all | 5,859 | 747 papers |
| Q18 | of Q17, >=1 such tool carries a version string | Q17 | 747 | 276 (36.9%) |
| Q19 | Q18 restricted to the crawling population | crawled ∩ Q17 | 465 | 170 (36.6%) |
| Q20 | hand audit of the Q8 candidate pool | Q8 | 84 | 15 in, 3 in-baseline, 1 in-instrument, 2 spoof, 1 control-only, 4 adjacent, 58 out-background |
| Q21 | distinct papers naming Chrome or Chromium | stating a browser | 529 | 304 (57.5%) |
| Q22 | distinct papers naming a privacy-branded browser (Tor Browser, Brave, DuckDuckGo, Firefox Focus, LibreWolf/Mullvad) | stating a browser | 529 | 46 (8.7%), of which Tor Browser 37 |
| Q23 | Q21 and not Q22 | stating a browser | 529 | 291 (55.0%) |
| Q24 | papers citing Microsoft's Edge tracking-prevention documentation (scripts/bp_edge_cite.mjs) | full text | 5,869 | 5 |
| Q25 | papers naming Storage.runBounceTrackingMitigations or Storage.getRelatedWebsiteSets (scripts/bp_cdp_sweep.mjs) | full text | 5,869 | 0 |
| Q26 | of the 26 audited papers, how many use an LLM as a method (scripts/bp_llm_headless.mjs) | audited | 26 | 0 (2 match the regex, both acknowledgements thanking ChatGPT for copy-editing) |
| Q27 | of the 26, how many vary headless versus headful as an arm (same script) | audited | 26 | 0 (3 match, all choosing headful deliberately and saying why) |
Q8 and Q9 share their numerator, and the report asserts it. All 84 papers in the Q8 candidate pool also carry platforms containing web, so 7.5%-of-1,120 and 9.8%-of-857 are the same 84 papers against two legitimate denominators. That looks like a copy-paste error and is not one, so bp_report.mjs computes the set difference and prints it; it is empty.
Distinct-paper roll-ups, added after a self-check. A first draft said “60.1% of the stating papers drove Chrome or Chromium”, computed as (217 + 101) / 529 from the family table. That is a sum of multi-valued rows and double-counts any paper naming both Chrome and Chromium. The report now computes the roll-ups directly and the page carries those instead: Chrome or Chromium, 304 of 529 (57.5%); a privacy-branded browser (Tor Browser, Brave, DuckDuckGo, Firefox Focus, LibreWolf/Mullvad), 46 of 529 (8.7%); Chrome or Chromium and no privacy-branded browser, 291 (55.0%). Firefox, Safari and Edge are deliberately outside “privacy-branded”: they are mainstream browsers that acquired a default protection on a datable year (2019, 2017, 2019), and folding them in would make a sixteen-year count read as if the protection had always been there. A first draft of the same sentence also said “the entire protective-browser column is 60 papers”, which was an unlabelled partial sum (Tor 37 + Safari 11 + Brave 10 + DuckDuckGo 2) that silently omitted Edge and Firefox. Both were wrong before publication of the final revision; recorded because a summed multi-valued column is the easiest error on this page to make and the hardest to see.
2.1 The full-text sweep, and why it is case-sensitive
The mechanism regexes are in scripts/bp_report.mjs. Two rules, both learned the hard way elsewhere on this wiki:
- Whitespace is collapsed before matching. A PDF line break inside “Enhanced Tracking\nProtection” silently undercounts otherwise.
- Acronyms with ordinary-English homographs are matched case-sensitively.
/\bETP\b/and/\bITP\b/are case-sensitive; the descriptive phrases (tracking protection,content blocking) are not. A case-insensitive/\bitp\b/ipicks up nothing extra here, but the general failure mode — a hyphen satisfying\b— is why the rule is applied.
The regexes, exactly as run:
Firefox ETP /Enhanced\s+Tracking\s+Protection|\bETP\b/ Firefox Total Cookie Prot. /Total\s+Cookie\s+Protection|\bdFPI\b|dynamic\s+first[-\s]party\s+isolation/ Safari ITP /Intelligent\s+Tracking\s+Prevention|\bITP\b/ Brave Shields /Brave(?:['’]s)?\s+(?:Shields|shields|browser|Browser|ad[-\s]?block)|\bShields\s*(?:up|down|enabled|disabled)\b/ Edge Tracking Prevention /(?:Microsoft\s+)?Edge(?:['’]s)?\s+[Tt]racking\s+[Pp]revention|tracking\s+prevention\s+(?:feature\s+)?(?:in|of)\s+(?:Microsoft\s+)?Edge/ Chrome Tracking Protection /Chrome(?:['’]s)?\s+Tracking\s+Protection|Tracking\s+Protection\s+in\s+Chrome/ bounce-tracking mitigation /bounce[-\s]tracking(?:\s+(?:protection|mitigation))?/i
2.2 The Edge zero is not a probe artefact
“Nobody has measured Edge” is the strongest negative claim on the page, and a narrow regex must never be the source of a “nobody”. So it was widened twice.
- The first widening,
scripts/bp_edge_check.mjs, allowed up to 120 characters between “Edge” and a protection word, in either order, case-insensitively. It matched 176 papers and was almost entirely noise: graph edges, basic blocks, “knowl-edge” hyphenated across a line. Unusable, and recorded here because it is exactly the widening a reader would ask for. - The second,
scripts/bp_edge_check2.mjs, searched the corpus case-sensitively for the exact product nameTracking Prevention, excluding occurrences preceded byIntelligent, and printed every window. It found 18 papers, 20 occurrences. All 20 were read. Seventeen are reference-list entries pointing at WebKit'stracking-preventionpolicy page or Microsoft's Edge documentation. Three are body occurrences, and none of the three is about Edge: XSinator (CCS 2021), which calls Firefox's ETP “Enhanced Tracking Prevention” while noting that Edge's mechanism relies on blocklists; PURL (USENIX Security 2024), which makes the same slip about Firefox's ETP Strict; and a 2020 CCS survey whose Table 3 uses “Tracking Prevention” as a coding-category label. - A third sweep,
scripts/bp_edge_cite.mjs, counts papers citing Microsoft's own Edge tracking-prevention documentation — thelearn.microsoft.compage, the 2019msedgedevannouncement, or a reference titled “Tracking Prevention in Microsoft Edge”. 5 papers, all citing it in passing while measuring something else.
Corrected in review — see §15.2. The paragraph above originally read “Sixteen are reference-list entries” and named Double-Edged Shield (USENIX 2025) as one of two substantive body mentions. Double-Edged Shield is not among the 18 at all: its Edge sentence is nowhere near the literal string “Tracking Prevention”, and it only ever surfaced in the first, rejected 176-paper widening that this same section calls unusable. Sixteen plus two also does not make twenty. The headline zero was never in doubt; the evidence behind it was wrong, and it was wrong in the specific way of citing data the log itself had discarded.
So the claim on the page is stated as named as a mechanism by zero papers, backed by cited by five and measured by none, not as a bare regex zero.
3. The hand audit: inclusion rule and all 84 candidates
The rule was written before the table, and is reproduced verbatim on the content page. The candidate pool is Q8 (84 papers). scripts/bp_audit_sheet.mjs printed every candidate's protection mentions as ±320-character windows into out_bp_audit_sheet.md (134 KB); all 84 were read at window level. The 26 that were not obviously background were then read in their methodology and evaluation sections; those 26 verdicts are in scripts/bp_audit.json and printed in §5 below. The remaining 58 are listed in §5 by title.
A triage aid that must not be mistaken for the rule. scripts/bp_audit_assist.mjs ordered the 84 by whether a protection mention sits within 400 characters of first-person methodology language. Only 19 of 84 scored above zero — and the zero bucket contains OmniCrawl, Who Left Open the Cookie Jar, Navigating Murky Waters, Bridges to Self and Browsing without Third-Party Cookies, all of which are in. The assist is a reading order. Using it as a filter would have thrown away a third of the result set, and it is recorded here so nobody later mistakes its output for a finding.
3.1 Dating the designs, and two probed absences
The page's “Which of these designs is current” table buckets the 26 audited papers by period: 7 from 2017–2021, 8 from 2022–2023, 11 from 2024–2026. The status column is a judgement (§12), not a count; the dates are not.
Two claims in that section are of the “nobody does X” kind, which must never come from recall or from a single narrow regex. Both are probes over all 26 audited papers, both print their hits, and both are committed as scripts/bp_llm_headless.mjs with the output in scripts/bp_llm_headless-output.txt:
- No LLM as a method. Case-sensitive
/\b(?:LLM|large language model|GPT-?\d|ChatGPT|Llama|Gemini)\b/.promptandBERTare deliberately excluded: the first fires on ordinary prose, the second on pre-LLM classifiers, and including either would have produced a false positive rather than a false negative — the safer error in the other direction. 2 of 26 match, both acknowledgements sections thanking ChatGPT for copy-editing. Both are printed in the output. - No headless-versus-headful arm.
/headful|non-headless|headed mode|headless\s+(?:and|vs\.?|versus)\s+head/i. 3 of 26 match, and reading all three shows each chose headful and said why (bot detection); none varies it. The page says exactly that rather than the bare zero, and quotes all three.
A wider first pass over the same 26 used /\b(?:LLM|...|BERT|prompt(?:ing|ed)?)\b/i and matched 11 papers, all of them on BERT or on the ordinary word “prompt”. That number is in this log rather than on the page because it measures the regex, not the literature.
4. Running it
cd /workspace/artifacts/wiki node scripts/bp_report.mjs > scripts/bp_report-output.txt # every figure, with denominators node scripts/bp_quotecheck.mjs > scripts/bp_quotecheck-output.txt # every paper quote vs paper.cols.txt PLAYWRIGHT_BROWSERS_PATH=/workspace/.playwright \ node sandbox/bp_arms_probe.mjs > scripts/bp_arms_probe-output.txt # the Chromium arm probe node scripts/bp_edge_check2.mjs # the Edge zero, printed in full node scripts/bp_audit_sheet.mjs # rebuild the 84-candidate worksheet node scripts/bp_llm_headless.mjs > scripts/bp_llm_headless-output.txt # the two probed absences node scripts/bp_edge_cite.mjs # papers citing Microsoft's Edge docs node scripts/bp_cdp_sweep.mjs # papers naming the two CDP commands node scripts/check_wrap.mjs pages/privacy_browser_protection.txt
bp_report.mjs reads /workspace/publications_dataset/data directly. browser_fold.mjs is imported by the report; bp_audit.json holds the hand verdicts and is the only non-derived input.
5. Unedited report output
- bp_report-output.txt
corpus (extraction): 5859 papers, 7 venues, 2010-2026 population 'crawled' (crawlConfig != null OR studyTypes has automated-web-crawl): 1120 population 'webCrawled' (crawled AND platforms has web): 857 ===== 1. Full-text sweep: who names a browser-shipped protection ===== papers with rendered full text: 5869 mechanism papers share of 5869 Firefox ETP 27 0.5% Firefox Total Cookie Protection 17 0.3% Safari ITP 41 0.7% Brave Shields 78 1.3% Edge Tracking Prevention 0 0.0% Chrome Tracking Protection 1 0.0% bounce-tracking mitigation 12 0.2% Tor Browser 129 2.2% DuckDuckGo browser 4 0.1% Firefox Focus 10 0.2% private browsing / Incognito 197 3.4% the phrase "tracking protection" 108 1.8% the phrase "tracking prevention" 63 1.1% the phrase "content blocking" 57 1.0% extension-side blocker (kept separate) uBlock Origin 75 1.3% Ghostery 110 1.9% Privacy Badger 63 1.1% Adblock Plus 124 2.1% AdGuard 71 1.2% NoScript 40 0.7% ANY of the six named browser-shipped protections: 121 2.1% ===== 1b. By year (2026 and 2025 are provisional venue-years) ===== year full text any named protection Brave Shields Safari ITP Firefox ETP 2010 118 0 0 0 0 2011 116 0 0 0 0 2012 151 0 0 0 0 2013 125 0 0 0 0 2014 165 0 0 0 0 2015 190 0 0 0 0 2016 182 0 0 0 0 2017 232 1 1 1 0 2018 254 6 4 2 0 2019 402 7 4 3 0 2020 402 16 9 8 3 2021 380 17 11 8 4 2022 546 21 15 7 7 2023 720 17 11 6 3 2024 701 14 9 2 4 2025 770 16 8 3 4 2026 415 6 6 1 2 ===== 2. Which browser did the crawl drive? (population: crawled, N=1120) ===== states at least one browser: 529 47.2% of 1120 folded family papers share of 529 stating Chrome 217 41.0% Firefox 154 29.1% Chromium 101 19.1% automation library named instead of a browser 45 8.5% Tor Browser 37 7.0% headless engine (PhantomJS / HtmlUnit / WebKit port) 29 5.5% Internet Explorer 16 3.0% Edge 15 2.8% Safari 11 2.1% Opera 10 1.9% Brave 10 1.9% HTTP client, not a browser 2 0.4% DuckDuckGo 2 0.4% Yandex 2 0.4% Whale 2 0.4% CocCoc 2 0.4% WebView 2 0.4% Firefox Focus 1 0.2% UNMAPPED RESIDUE of the browser fold (42 distinct strings, printed in full): 4 headless browser 2 browser instances 1 real Web browser 1 custom lightweight web browser 1 graphical web browser 1 regular browser 1 mobile web browser 1 scriptable browser instances 1 Android browser 1 Android phone 1 non-headless web browser 1 Android smartphone 1 Nexus tablet 1 Apple iPhone6 1 iPad2 1 WhatsApp Web client 1 Telegram Web client 1 PageGraph-instrumented browser 1 default browser 1 Spartacus browser 1 automated web browser library 1 Ghostery 1 mobile-emulated browser 1 Vivaldi 1 Samsung 1 Dolphin 1 Mint 1 Kiwi 1 QQ 1 UC International 1 headless Python crawler 1 Tor 1 WeChat Windows client 1 UC 1 360 1 QQ browser 1 Instabridge 1 Xunlei 1 local browser 1 default Android browser 1 Foxhound 1 basic HTTP fetcher papers naming >= 2 distinct real browser families: 80 15.1% of 529 stating, 7.1% of 1120 crawling DISTINCT PAPERS (not a sum of family rows): name Chrome or Chromium: 304 57.5% of 529 stating name a privacy-branded browser 46 8.7% of 529 stating (Tor Browser, Brave, DuckDuckGo, Firefox Focus, LibreWolf/Mullvad) Chrome/Chromium and no privacy-branded browser 291 55.0% of 529 stating name Brave, DuckDuckGo, Firefox Focus or LibreWolf (i.e. not Tor): 10 2020 IMC Hiding in Plain Site: Detecting JavaScript Obfuscation through Concealed Browser API Usage. Chromium, Brave 2020 NDSS Deceptive Previews: A Study of the Link Preview Trustworthiness in Social Platforms Firefox, Chrome, Brave 2021 PETS Domain name encryption is not enough: privacy leakage via IP-based website fingerprinting Chrome, Brave 2022 PETS How Can and Would People Protect From Online Tracking? Chrome, Firefox, Brave 2022 PETS OmniCrawl: Comprehensive Measurement of Web Tracking With Real Desktop and Mobile Browsers Chrome, Firefox, Brave, Tor Browser, Firefox Focus, DuckDuckGo 2022 WWW Measuring the Privacy vs. Compatibility Trade-off in Preventing Third-Party Stateful Tracking. Chromium, Brave 2023 IMC Not only E.T. Phones Home: Analysing the Native User Tracking of Mobile Browsers. Chrome, Edge, Opera, Yandex, Brave, DuckDuckGo, Whale, CocCoc 2023 NDSS Navigating Murky Waters: Automated Browser Feature Testing for Uncovering Tracking Vectors Brave, Chrome, Edge, Firefox, Safari, Opera 2025 CCS Lock the Door But Keep the Window Open: Extracting App-Protected Accessibility Information from Browser-Rendered Websites. Chrome, Firefox, Brave, Edge 2025 PETS Beyond the Request: Harnessing HTTP Response Headers for Cross-Browser Web Tracker Detection in an Imbalanced Setting Chrome, Brave, Firefox papers naming >= 3 distinct real browser families: 25 4.7% of 529 stating the >=3-family papers (this is where a cross-browser design actually lives): 2025 CCS — Lock the Door But Keep the Window Open: Extracting App-Protected Accessibility Information from Browser-Rendered Websites. Chrome, Firefox, Brave, Edge 2014 IEEE-SP — Stealing Webpages Rendered on Your Browser by Exploiting GPU Vulnerabilities. Chromium, Firefox, headless engine (PhantomJS / HtmlUnit / WebKit port) 2015 IEEE-SP — Ad Injection at Scale: Assessing Deceptive Advertisement Modifications. Chrome, Firefox, Internet Explorer 2018 IEEE-SP — Surveylance: Automatically Detecting Online Survey Scams. Chrome, Firefox, Internet Explorer 2019 IEEE-SP — PhishFarm: A Scalable Framework for Measuring the Effectiveness of Evasion Techniques against Browser Phishing Blacklists. Chrome, Safari, Firefox, Opera, Edge, Internet Explorer 2023 IEEE-SP — The Leaky Web: Automated Discovery of Cross-Site Information Leaks in Browsers and the Web. Chromium, Firefox, headless engine (PhantomJS / HtmlUnit / WebKit port) 2019 IMC — What You See is NOT What You Get: Discovering and Tracking Social Engineering Attack Campaigns. Chromium, Chrome, Internet Explorer, Edge 2023 IMC — Not only E.T. Phones Home: Analysing the Native User Tracking of Mobile Browsers. Chrome, Edge, Opera, Yandex, Brave, DuckDuckGo, Whale, CocCoc 2020 NDSS — Cross-Origin State Inference (COSI) Attacks: Leaking Web Site States through XS-Leaks Chrome, Firefox, Edge 2020 NDSS — Deceptive Previews: A Study of the Link Preview Trustworthiness in Social Platforms Firefox, Chrome, Brave 2023 NDSS — Navigating Murky Waters: Automated Browser Feature Testing for Uncovering Tracking Vectors Brave, Chrome, Edge, Firefox, Safari, Opera 2025 NDSS — Cross-Origin Web Attacks via HTTP/2 Server Push and Signed HTTP Exchange Chrome, Safari, Edge, Firefox, Opera, Internet Explorer, Yandex, CocCoc, Whale 2019 PETS — 4 Years of EU Cookie Law: Results and Lessons Learned Chrome, Internet Explorer, Firefox 2022 PETS — How Can and Would People Protect From Online Tracking? Chrome, Firefox, Brave 2022 PETS — OmniCrawl: Comprehensive Measurement of Web Tracking With Real Desktop and Mobile Browsers Chrome, Firefox, Brave, Tor Browser, Firefox Focus, DuckDuckGo 2025 PETS — Beyond the Request: Harnessing HTTP Response Headers for Cross-Browser Web Tracker Detection in an Imbalanced Setting Chrome, Brave, Firefox 2026 PETS — Clicking into Exposure: Uncovering Privacy Risks of Google Click Identifier in YouTube Ads Chrome, Firefox, Edge 2020 USENIX — PhishTime: Continuous Longitudinal Measurement of the Effectiveness of Anti-phishing Blacklists Chrome, Safari, Firefox, Internet Explorer, Edge, Opera 2021 USENIX — PhishPrint: Evading Phishing Detection Crawlers by Prior Profiling Chrome, Internet Explorer, Opera 2022 USENIX — The Security Lottery: Measuring Client-Side Web Security Inconsistencies Chrome, Firefox, Edge, Opera, Safari 2023 USENIX — A Study of Multi-Factor and Risk-Based Authentication Availability Chrome, Firefox, Safari 2025 USENIX — DNS FLaRE: A Flush-Reload Attack on DNS Forwarders Chrome, Edge, Opera, Chromium, Firefox 2013 WWW — Two years of short URLs internet measurement: security threats and countermeasures. Chrome, Firefox, Opera, automation library named instead of a browser 2020 WWW — Apophanies or Epiphanies? How Crawlers Impact Our Understanding of the Web. Firefox, Chromium, Tor Browser, headless engine (PhantomJS / HtmlUnit / WebKit port) 2023 WWW — Efficient and Low Overhead Website Fingerprinting Attacks and Defenses based on TCP/IP Traffic. Edge, Chrome, Firefox ===== 3. Did the paper pin a browser version? ===== papers with >=1 used/produced tool of category "browser": 747 of those, >=1 such tool carries a version string: 276 36.9% restricted to the crawled population: 465 papers, 170 with a version 36.6% ===== 4. Crawling papers that name a browser-shipped protection ===== crawled papers with full text: 1120 crawled AND names a protection: 84 7.5% of 1120 web-crawled AND names a protection: 84 9.8% of 857 crawled AND names a protection but NOT platforms:web: 0 (so both rows share the numerator) web crawls 2019-2022: 266, naming a protection: 43 16.2% web crawls 2023-2026: 332, naming a protection: 37 11.1% web crawls 2024-2026: 235, naming a protection: 24 10.2% ===== 5. Hand-audited set: what the protection was actually doing in the paper ===== candidate pool (crawled AND names a browser-shipped protection): 84 every candidate's protection mentions were read as +/-320-char windows (scripts/bp_audit_sheet.mjs); the ones below were then read in their methodology/evaluation sections. audited rows: 26 rows outside the candidate pool: 0 15 in 4 adjacent 3 in-baseline 2 spoof 1 in-instrument 1 control-only 58 out-background (protection named only in background, related work or the reference list) --- in --- 2018 USENIX Who Left Open the Cookie Jar? A Comprehensive Evaluation of Third-Party Cookie Policies arms: 7 browsers x their built-in third-party cookie policies, plus 31 ad-blocking and 15 anti-tracking extensions, driven through a test-case generator and an intercepting proxy why: the policy is the thing varied 2019 WWW Evaluating Anti-Fingerprinting Privacy Enhancing Technologies arms: 15 anti-fingerprinting PETs incl. Brave and the Tor Browser Bundle, against unmodified Chrome and Firefox baselines why: explicit no-PET baseline 2020 PETS In-Depth Evaluation of Redirect Tracking and Link Usage arms: OpenWPM Firefox under several browser settings, plus Ghostery, plus Safari ITP 2.3 driven by hand because Safari could not be automated why: protection varied across settings 2021 NDSS Tales of Favicons and Caches: Persistent Tracking in Modern Browsers arms: Brave in strict mode against four anti-fingerprinting extensions and an unprotected baseline why: protection evaluated against a control 2021 PETS Domain name encryption is not enough: privacy leakage via IP-based website fingerprinting arms: the same website set crawled twice: Chrome without blocking, then Brave desktop 1.6.30, at the same time why: clean two-arm design, same sites, overlapping window 2022 WWW Measuring the Privacy vs. Compatibility Trade-off in Preventing Third-Party Stateful Tracking arms: 4 third-party storage policies (permissive / blocking / site-keyed / page-length) x 2 instances each = 8 stateful crawls in parallel over 3,419 page URLs spidered from the Tranco 1k why: the flagship paired-crawl design in this corpus 2022 PETS OmniCrawl: Comprehensive Measurement of Web Tracking With Real Desktop and Mobile Browsers arms: 42 browser instances in parallel - Chrome and Firefox plus Brave, Tor, Firefox Focus, DuckDuckGo and Ghostery - on 4 desktops and 18 Android phones in two locations, over 20,000 Tranco sites why: largest cross-browser arm set in the corpus 2023 NDSS Navigating Murky Waters: Automated Browser Feature Testing for Uncovering Tracking Vectors arms: 21 browser mechanisms read/written across 126 versions of 7 browsers (Brave, Chrome, Edge, Firefox, Safari, Opera, Tor) over a two-year period why: browser version is the treatment 2024 IMC Browsing without Third-Party Cookies: What Do You See? arms: three Firefox profiles per domain - baseline, control, experimental - where only the experimental arm has third-party cookies disabled; 7,490 of the Tranco top 10,000 crawled successfully why: has a same-condition control arm as well as the treatment 2025 CCS Local Frames: Exploiting Inherited Origins to Bypass Content Blockers arms: Brave (macOS 1.68.141, iOS 1.68, Android 1.68.137), the Safari Content Blocker API, DuckDuckGo, uBlock Origin Lite, AdBlock Plus and AdGuard, against a purpose-built test site why: per-product, per-platform arms 2025 IMC FP-Inconsistent: Measurement and Analysis of Fingerprint Inconsistencies in Evasive Bot Traffic arms: Brave 1.69.160 and Tor 13.5.2, plus uBlock Origin 1.59.0 and AdBlock Plus 4.5.1 on Chrome 128, across macOS, Linux, iOS and Android why: protections run to check they are not misread as bots 2025 NDSS Cascading Spy Sheets: Exploiting the Complexity of Modern CSS for Email and Browser Fingerprinting arms: Tor and Brave among 1,176 OS-browser combinations; Brave excluded from the font test because its randomisation would produce false positives why: names the arm it had to drop, and why 2025 PETS Beyond the Request: Harnessing HTTP Response Headers for Cross-Browser Web Tracker Detection in an Imbalanced Setting arms: Chrome, Firefox and Brave data from the T.EX extension; models trained on Chrome and tested on all three, plus a Chrome set from a year later why: cross-browser generalisation is the research question 2026 PETS Clicking into Exposure: Uncovering Privacy Risks of Google Click Identifier in YouTube Ads arms: Chrome, Firefox and Edge why: per-browser tracking incidence is reported 2026 USENIX Bridges to Self: Silent Web-to-App Tracking on Mobile via Localhost arms: Brave, Firefox ETP in Standard and in Strict, and DuckDuckGo, each tested against the localhost bridge why: the ETP Standard-vs-Strict split is the finding --- in-baseline --- 2022 USENIX Khaleesi: Breaker of Advertising and Tracking Request Chains arms: Safari's ITP is one of four comparison classifiers for the authors' own detector why: the protection is a baseline, not an arm 2023 USENIX TRIDENT: Towards Detecting and Mitigating Web-based Social Engineering Attacks arms: Brave Shields set up locally and fed script/frame URL pairs, as the industry comparison against TRIDENT why: Shields run as a library, not as a browser 2023 CCS CookieGraph: Understanding and Detecting First-Party Tracking Cookies arms: compares its own detector against ITP's cap on first-party cookie expiry as an existing countermeasure why: policy compared analytically, not run --- in-instrument --- 2025 USENIX Websites' Global Privacy Control Compliance at Scale and over Time arms: Selenium + Firefox Nightly, with Firefox's own ETP used as the tracker classifier through its categorisation API why: the protection is the measuring instrument --- spoof --- 2021 PETS The CNAME of the Game: Large-scale Analysis of DNS-based Tracking Evasion arms: the crawl was run twice, once with Chrome's User-Agent and once with Safari's, in headless Chrome both times why: Safari was impersonated, not run - and it still found Criteo treating Safari differently 2022 IMC Measuring UID smuggling in the wild arms: Chrome, and Chrome with a spoofed Safari User-Agent why: same design, same caveat --- control-only --- 2024 USENIX PURL: Safe and Effective Sanitization of Link Decoration arms: one arm: Firefox v102 with ETP explicitly turned off, stateless, 20K Tranco sample, March-April 2023 why: the exemplar of stating the protection state of a single-arm crawl --- adjacent --- 2021 CCS SugarCoat: Programmatically Generating Privacy-Preserving, Web-Compatible Resource Replacements for Content Blocking arms: 902 pages under three conditions, instrumented vs stock Chromium; output targets Brave's adblock-rust engine and uBlock Origin why: blocking-tool arms rather than browser-shipped protection arms 2023 PETS Blocking JavaScript Without Breaking the Web: An Empirical Investigation arms: levels of JavaScript blocking in Chrome why: the treatment is a blocking policy the authors imposed, not one a browser ships 2025 USENIX Double-Edged Shield: On the Fingerprintability of Customized Ad Blockers arms: user-customised ad-blocker configurations harvested from public forums; Brave Shields is tabulated but left out of the configuration analysis because its community-forum posts do not carry the detailed filter-list configurations why: extension configuration is the treatment 2026 PETS Privacy vs. Profit: The Impact of Google's Manifest Version 3 (MV3) Update on Ad Blocker Effectiveness arms: MV3 vs MV2 instances of four ad blockers over a main sample of 924 ad-supported websites x five measurement runs, plus 191- and 185-site stratified samples, in Chrome and Firefox why: extension platform, not browser protection - but it is the corpus's best-powered blocker experiment --- out-background: every candidate not audited above --- 2017 IMC The ad wars: retrospective measurement and analysis of anti-adblock filter lists. 2018 CCS The Web's Sixth Sense: A Study of Scripts Accessing Smartphone Sensors. 2018 WWW Hiding in the Crowd: an Analysis of the Effectiveness of Browser Fingerprinting at Large Scale. 2019 CCS AdVersarial: Perceptual Ad Blocking meets Adversarial Machine Learning. 2019 CCS Oh, the Places You've Been! User Reactions to Longitudinal Transparency About Third-Party Web Tracking and Inferencing. 2020 IMC Hiding in Plain Site: Detecting JavaScript Obfuscation through Concealed Browser API Usage. 2020 IMC Reading In-Between the Lines: An Analysis of Dissenter. 2020 IMC When Push Comes to Ads: Measuring the Rise of (Malicious) Push Advertising. 2020 NDSS Deceptive Previews: A Study of the Link Preview Trustworthiness in Social Platforms 2020 NDSS Melting Pot of Origins: Compromising the Intermediary Web Services that Rehost Websites 2020 PETS A Comparative Measurement Study of Web Tracking on Mobile and Desktop Environments 2020 PETS Inferring Tracker-Advertiser Relationships in the Online Advertising Ecosystem using Header Bidding 2020 PETS Missed by Filter Lists: Detecting Unknown Third-Party Trackers with Invisible Pixels 2020 WWW Beyond the Front Page: Measuring Third Party Dynamics in the Field. 2020 WWW Dirty Clicks: A Study of the Usability and Security Implications of Click-related Behaviors on the Web. 2020 WWW Stop tracking me Bro! Differential Tracking of User Demographics on Hyper-Partisan Websites. 2020 WWW The Representativeness of Automated Web Crawls as a Surrogate for Human Browsing. 2020 IEEE-SP AdGraph: A Graph-Based Approach to Ad and Tracker Blocking. 2020 CCS You've Changed: Detecting Malicious Browser Extensions through their Update Deltas. 2021 IEEE-SP Fingerprinting the Fingerprinters: Learning to Detect Browser Fingerprinting Behaviors. 2021 IMC TrackerSift: untangling mixed tracking and functional web resources. 2021 NDSS CV-Inspector: Towards Automating Detection of Adblock Circumvention 2021 PETS Privacy Preference Signals: Past, Present and Future 2021 USENIX PhishPrint: Evading Phishing Detection Crawlers by Prior Profiling 2021 WWW Cookie Swap Party: Abusing First-Party Cookies for Web Tracking. 2021 WWW User Tracking in the Post-cookie Era: How Websites Bypass GDPR Consent to Track Users. 2022 IMC Muzeel: assessing the impact of JavaScript dead code elimination on mobile web performance. 2022 NDSS HARPO: Learning to Subvert Online Behavioral Advertising 2022 PETS How Can and Would People Protect From Online Tracking? 2022 PETS How Not to Handle Keys: Timing Attacks on FIDO Authenticator Privacy 2022 PETS My Cookie is a phoenix: detection, measurement, and lawfulness of cookie respawning with browser fingerprinting 2022 USENIX Automating Cookie Consent and GDPR Violation Detection 2022 USENIX Leaky Forms: A Study of Email and Password Exfiltration Before Form Submission 2022 USENIX The Dangers of Human Touch: Fingerprinting Browser Extensions through User Actions 2022 WWW Investigating Advertisers' Domain-changing Behaviors and Their Impacts on Ad-blocker Filter Lists. 2022 IEEE-SP WTAGRAPH: Web Tracking and Advertising Detection using Graph Neural Networks. 2023 CCS iLeakage: Browser-based Timerless Speculative Execution Attacks on Apple Devices. 2023 CCS Read Between the Lines: Detecting Tracking JavaScript with Bytecode Classification. 2023 PETS A Utility-Preserving Obfuscation Approach for YouTube Recommendations 2023 IMC Reviving Dead Links on the Web with Fable. 2023 USENIX Defining "Broken": User Experiences and Remediation Tactics When Ad-Blocking or Tracking-Protection Tools Break a Website’s User Experience 2023 USENIX Rods with Laser Beams: Understanding Browser Fingerprinting on Phishing Pages 2023 WWW Who Funds Misinformation? A Systematic Analysis of the Ad-related Profit Routines of Fake News Sites. 2023 IEEE-SP Fashion Faux Pas: Implicit Stylistic Fingerprints for Bypassing Browsers' Anti-Fingerprinting Defenses. 2023 IEEE-SP The Leaky Web: Automated Discovery of Cross-Site Information Leaks in Browsers and the Web. 2024 CCS Blocking Tracking JavaScript at the Function Granularity. 2024 PETS The Devil is in the Details: Detection, Measurement and Lawfulness of Server-Side Tracking on the Web 2024 PETS Website Data Transparency in the Browser 2024 NDSS FP-Fed: Privacy-Preserving Federated Detection of Browser Fingerprinting 2024 USENIX FV8: A Forced Execution JavaScript Engine for Detecting Evasive Techniques 2024 PETS Opted Out, Yet Tracked: Are Regulations Enough to Protect Your Privacy? 2024 WWW AdFlush: A Real-World Deployable Machine Learning Solution for Effective Advertisement and Web Tracker Prevention. 2024 WWW The Double Edged Sword: Identifying Authentication Pages and their Fingerprinting Behavior. 2025 IMC $CookieGuard: $ Characterizing and Isolating the First-Party Cookie Jar. 2025 PETS Onion-Location Measurements and Fingerprinting 2025 PETS Intractable Cookie Crumbs: Unveiling the Nexus of Stateful Banner Interaction and Tracking Cookies 2025 CCS Exploiting the Shared Storage API. 2026 NDSS PhishLang: A Real-Time, Fully Client-Side Phishing Detection Framework Using MobileBERT
5.1 The two-absences probe, unedited
- bp_llm_headless-output.txt
hand-audited papers: 26 --- LLM as a method --- 2026 PETS Clicking into Exposure: Uncovering Privacy Risks of Google Click Identifier in YouTube Ads ...e the anonymous PoPETs Editor and Reviewers for their valuable feedback, which significantly improved the paper. The authors used generative AI-based tools Grammarly and ChatGPT-5 to revise the text, correct any typos, grammatical errors, and awkward phrasing. No content was generated related to technical results, data, code, or analysis. References [1] 2016... 2026 PETS Privacy vs. Profit: The Impact of Google's Manifest Version 3 (MV3) Update on Ad Blocker Effectiveness ...rs who rely on ad blockers for a more private and ad-free browsing experience. 541 Proceedings on Privacy Enhancing Technologies 2026(1) Acknowledgments The authors used ChatGPT to revise the text throughout the paper to correct any typos, grammatical errors, and awkward phrasing. This project has received funding from the European Research Council (ERC) und... papers matched: 2 --- headless vs headful --- 2022 WWW Measuring the Privacy vs. Compatibility Trade-off in Preventing Third-Party Stateful Tracking ...across return visits. All crawls were performed in parallel and simultaneously from a single network vantage point. Each page visit was performed in a freshly launched, non-headless (i.e., rendering to the Xvfb headless display server) browser instance. Navigation was allowed to time out after 30 seconds. Assuming no navigation timeout, our crawlers waited... ...nable sampling of site content without exhausting our time and space budget, as PageGraph can generate large volumes of data per page. All our crawlers were stateful and non-headless, giving them a fair chance at evading the most trivial forms of bot detection. More sophisticated bot detection depending on "human" interactions with page content should treat... 2025 USENIX Websites' Global Privacy Control Compliance at Scale and over Time ...second batch, which we had randomly was one of the main error sources we encountered.9 Our selected as well. To ensure that there were sufficient sites with crawler uses non-headless mode to appear more similar to a GPP Strings in the test set we randomly selected 40 sites from human user. Each site is allotted 35 seconds to load and 22 the 109 sites for whi... 2022 IMC Measuring UID smuggling in the wild ...on all four crawlers: in fact, many in- Chrome extension, to record web requests. We use Puppeteer in stances occurred on only a single crawler. For example, we encoun- "headful" mode, using the monitor emulator XVFB [53], to reduce tered many cases where each crawler loaded the same originator the chance that CrumbCruncher will be identified as a bot. While... papers matched: 3
6. The browser fold, and its residue in full
scripts/browser_fold.mjs maps free-text crawlConfig.browsers strings to product families by an ordered regex list — the more specific product wins over its engine, so “Tor Browser” is not folded into Firefox and “Brave” is not folded into Chromium. The fold is deliberately product-level, not version-level: this page's question is which browser's protections were in the crawl, and “Firefox 52” and “Firefox Nightly” answer that the same way. Version reporting is counted separately, from the tools[].version field (Q18, Q19).
The rules, in order:
/tor\s*browser|tor\s*bundle|\btbb\b/i -> Tor Browser /brave/i -> Brave /duckduckgo|\bddg\b/i -> DuckDuckGo /firefox\s*focus/i -> Firefox Focus /librewolf|mullvad\s*browser/i -> LibreWolf / Mullvad /\bedge\b|edgehtml/i -> Edge /\bopera\b|\bop2\b/i -> Opera /yandex/i -> Yandex /\bwhale\b/i -> Whale /coccoc/i -> CocCoc /\bsafari\b/i -> Safari /internet\s*explorer|\bie\s*\d|\bie\b/i -> Internet Explorer /firefox|mozilla|gecko|\bnightly\b/i -> Firefox /chromium/i -> Chromium /chrome/i -> Chrome /webkit|slimerjs|phantomjs|htmlunit/i -> headless engine (PhantomJS / HtmlUnit / WebKit port) /webview/i -> WebView /selenium|puppeteer|playwright|webdriver|mechanize/i -> automation library named instead of a browser /wget|curl|python\s*requests|http\s*client/i -> HTTP client, not a browser
226 distinct strings in, 18 families out, 42 strings unmapped. The residue is printed by the report and reproduced in §5; it is dominated by “headless browser”, “regular browser”, device names (“Nexus tablet”, “Apple iPhone6”) and CJK-market browsers the fold has no family for (UC, QQ, 360, Xunlei, Kiwi, Dolphin, Vivaldi, Samsung). One residue entry is a category error in the source data — “Ghostery” appears in crawlConfig.browsers although Ghostery is an extension in every context except its own mobile browser; the fold leaves it in the residue rather than guessing.
The Internet Explorer rule reads \bie\s*\d|\bie\b rather than the \bie\b\s*\d*|\bie\b it started as, because the figures review (§15.2) pointed out that a word boundary cannot follow “IE” in the no-space form IE11. No string in the current 226 takes that form, so no published figure changed; the rule was fixed anyway and unit-checked against IE11, IE 11, IE, Internet Explorer 8, pie and tie. Re-running the report after the change produced a byte-identical output.
Two folding decisions a reasonable person would make differently:
- “automation library named instead of a browser” (45 papers) is kept as a family rather than dropped. It is a finding — 8.5% of the papers that answered “which browser” answered with “Selenium” — and hiding it in the residue would make the browser shares look better than they are. It is excluded from the >=2- and >=3-family counts (Q15, Q16) along with “HTTP client, not a browser”, because neither is a browser.
- Chrome and Chromium are separate families. Merging them would give a cleaner single “no default protection” row, but they are different builds with different default flag sets, which is precisely this page's subject. The distinct-paper roll-up in Q21 is how the page states the combined figure without summing the rows.
7. Quotes checked against the source
scripts/bp_quotecheck.mjs checks every verbatim quote the page takes from a corpus paper against data/fulltext/<year>/<venue>/<slug>/paper.cols.txt, whitespace collapsed on both sides and smart quotes normalised, nothing else. 45 of 45 spans pass. It started at 32 spans; the citations review (§15.3) found two quotes on the page that the checker did not cover at all, which is the failure mode a passing checker hides, and the coverage was extended rather than the finding waved through. Four more spans were added with the “which designs are current” section.
- bp_quotecheck-output.txt
OK 2022 WWW deployed two instances of each tested policy to verify behavioral consistency and provid OK 2022 WWW produced 3,419 total deduplicated page URLs to visit OK 2022 PETS use two identical Chrome instances to measure the OK 2022 PETS baseline variability between visits to the same website OK 2022 PETS We visit 20,000 websites with a total of 42 browser instances running in parallel across OK 2021 PETS from 91% to 76% OK 2024 IMC more than 90% of domains exhibit less than a 10% screenshot difference when cookies are OK 2024 IMC we arrive at a final list of 7,490 successfully crawled domains OK 2025 NDSS would induce false positives in our evaluation OK 2026 USENIX Our measurements show that ETP blocks the Meta Pixel only in Strict mode OK 2024 USENIX We turn off all built-in tracking protections provided by Firefox (Enhanced Tracking Pro OK 2025 USENIX We identify trackers with Firefox's built-in Enhanced Tracking Protection [54], which id OK 2021 PETS performed the experiment twice: once with the Chrome User-Agent string, and once with Sa OK 2021 PETS would only resort to first-party tracking for Safari users OK 2020 PETS Ghostery could only block 11 out of 30 top redirect domain cookies, whereas Safari block OK 2019 WWW to be most effective, revealing under 3 bits of entropy OK 2019 WWW reveal over 11 bits of entropy and hence are marginally better than OK 2019 WWW not using any AFPET at all OK 2019 WWW The original fingerprints reveal 13.002 and 12.359 bits of entropy OK 2026 PETS no statistically significant reduction in ad-blocking or anti-tracking effectiveness for OK 2026 PETS a main sample of 924 websites across five separate measurement runs OK 2026 PETS does not strip URL parameters like gclid or fbclid OK 2025 CCS 73.7% of the requests made by these local frames should be blocked by popular filter lis OK 2025 CCS We disclosed each of the 19 vulnerabilities we found to the relevant organization OK 2018 USENIX By applying the framework to 7 browsers, 31 ad blocking and 15 anti-tracking extensions OK 2018 USENIX We performed a crawl on the Alexa top 10,000, visiting 160,059 web pages OK 2023 NDSS a total of 126 versions of seven major browsers OK 2023 NDSS we test 21 browser mechanisms and uncover a slew of tracking vectors, including 13 OK 2021 NDSS In our analysis, we use Brave's strict mode OK 2021 PETS strumented the Brave browser (desktop version 1.6.30) OK 2021 PETS to crawl these websites a second time OK 2023 USENIX we compared T RIDENT with two stateof-the-art tools: Brave Shields OK 2022 PETS We study privacy-focused browsers and find their pro OK 2022 PETS tections differ significantly and in general are less for OK 2021 PETS at the same time with crawling the OK 2022 IMC unless the user has loaded the site as a first party in the previous 45 days OK 2025 USENIX These posts do not include the detailed browser filter-list configurations OK 2019 WWW Brave Browser spoofs the User-Agent to appear like Chrome, OK 2019 WWW but modifies the Accept-Language header, language and OK 2019 WWW plugins differently than baseline Chrome OK 2019 WWW Brave users stand out from other Chrome users OK 2026 PETS No content was generated related to technical results, data, code, or analysis OK 2022 WWW non-headless (i.e., rendering to the Xvfb headless display server) OK 2022 WWW a fair chance at evading the most trivial forms of bot detection OK 2025 USENIX crawler uses non-headless mode to appear more similar to a 45 verbatim, 0 not found in the .cols rendering (of 45)
7.1 What the check caught, and what was changed
The first run had three FAILs, all of them two-column splices in the .cols rendering rather than misquotations of the paper. A fourth splice turned up later, in [1Datta, Amit; Lu, Jianan; Tschantz, Michael Carl (2019): "Evaluating Anti-Fingerprinting Privacy Enhancing Technologies", in: Proceedings of the ACM Web Conference. (DOI)]'s Brave sentence, only because the citations reviewer noticed that sentence was not in the checker at all; it is marked with [...] on the page and both halves are now checked. All three were on the page as continuous quoted sentences, which is a misquotation of the rendering even where it is faithful to the PDF. Fixed before publication:
| Quote | What .cols actually has | Fix |
|---|---|---|
| OmniCrawl, “use two identical Chrome instances to measure the baseline variability between visits to the same website” | ...to measure the added unsafe-inline to the CSP headers of only three. baseline variability between visits... — a sentence from the adjacent column spliced in | quoted with an explicit [...] marker and a note pointing here |
| OmniCrawl, “protections differ significantly and in general are less for lower-ranked sites” | broken as their pro / tections differ across a column boundary | de-quoted; the page now paraphrases |
| TRIDENT, “set up its ad-blocking component locally” | set up its ad-blocking component [49] locally — a reference marker inside the span | de-quoted; the page now describes it |
One further near-miss worth recording: we instrumented the Brave browser (desktop version 1.6.30) fails as written because the rendering hyphenates it as we in-strumented. The version number itself is correct and is stated, not quoted, on the page.
Caveat this check cannot clear. It verifies the page against the .cols rendering, not against the PDF. Column-reading-order repair is imperfect, and the corpus README reports that 57.9% of extraction quotes match their source exactly, 37% via an 8-word run, and 0.9% cannot be located at all. A quote that passes here is faithful to the text this project reads; if a figure is load-bearing for your own work, open the PDF.
8. Bibliography entries added
Four keys appended to bibliography before the closing tag, taking it from 724 to 728 entries. Checked first for key collisions (none) and for DOI collisions (10.2478/popets-2021-0078 absent), and after the append for duplicate keys across the whole file (none: 728 entries, 728 distinct keys).
| Key | Paper | Metadata source |
|---|---|---|
hoang2021_domain | Hoang et al., Domain name encryption is not enough, PoPETs 2021 | bibgen.mjs failed loudly: PETS index records carry no authors. Authors and pages read off the PoPETs landing page with curl and a browser User-Agent; DOI derived as 10.2478/popets-2021-0078 and matched against the landing page |
trampert2025_cascading | Trampert et al., Cascading Spy Sheets, NDSS 2025 | bibgen.mjs, clean |
yang2023_trident | Yang, Allen, Landen, Perdisci, Lee, TRIDENT, USENIX Security 2023 | bibgen.mjs emitted TODO-AUTHORS; authors read from the USENIX presentation page with curl (WebFetch gets 403 from usenix.org) |
elhajjchehade2025_double | El Hajj Chehade, Stock, Troncoso, Double-Edged Shield, USENIX Security 2025 | as above. Key uses the full surname elhajjchehade rather than bibgen`s auto-derived el2025_double, which would have implied a surname of “El” |
Cache purge required and performed. The first published render showed the four new keys as unresolved: 22 of 26 inline indices rendered and the reference list stopped short. ?purge=true on bibliography and then on the content page fixed it. Re-verified: 50 inline markers, 26 distinct indices 1–26, 26 reference entries, and the only remaining red link on the page is the one to this page.
9. Browser measurements: what was measured, and what was not
| Claim on the page | How it was established | Status |
|---|---|---|
The six-arm Chromium result (setCookieControls works, four other knobs do not) | sandbox/bp_arms_probe.mjs, run 2026-09-01, Chromium 151.0.7922.34 + Playwright 1.62.1, local HTTPS origins, output in §10 | measured, first-hand |
--test-third-party-cookie-phaseout is a real switch; --block-third-party-cookies is not | strings -a on the Chromium binary: the first appears twice, the second not at all | measured, first-hand |
Storage.setThirdPartyCookieBlocking does not exist; Network.setCookieControls does, and is experimental | the browser's own /json/protocol descriptor, enumerated over --remote-debugging-port | measured, first-hand |
Playwright 1.62.1 sets browser.contentblocking.features.standard | read from node_modules/playwright-core/lib/coreBundle.js; the whole 86-preference default object was dumped and filtered | source-level |
| That pref is dead in Firefox 153.0 | the string features.standard appears in neither browser/omni.ja nor omni.ja nor libxul.so. Firefox's own ContentBlockingPrefs.sys.mjs names only PREF_STRICT_DEF: “browser.contentblocking.features.strict” and comments that the standard category “is defined as expecting default values of the listed prefs” | source-level |
That build ships network.cookie.cookieBehavior = 5 | browser/defaults/preferences/firefox.js inside browser/omni.ja | source-level |
5 is BEHAVIOR_PARTITION_FOREIGN | the same build's applyCategoryPref mapping, case “cookieBehavior5” | source-level |
Firefox's bounce-tracking “off” is MODE_ENABLED_DRY_RUN | ContentBlockingPrefs.sys.mjs, case “-btp”, with the source comment quoted on the page | source-level |
ETP Strict ships cookieBehavior5 — the same partitioning as Standard | browser.contentblocking.features.strict in browser/defaults/preferences/firefox.js inside browser/omni.ja reads tp,tpPrivate,cookieBehavior5,cookieBehaviorPBM5,cryptoTP,fp,stp,emailTP,emailTPPrivate,-consentmanagerSkip,-consentmanagerSkipPrivate,lvl2,rp,rpTop,qps,qpsPBM,fpp,fppPrivate,btp,lna | source-level |
| Playwright's Firefox is 153.0; stable is 155.0 | application.ini in the build (Version=153.0, BuildID=20260722045016) and product-details.mozilla.org | measured / fetched |
Firefox could not be launched in this container. Playwright's Firefox 153.0 dies at startup with RenderCompositorSWGL failed mapping default framebuffer, no dt, headless, headless with software-rendering prefs, and headful under a manually started Xvfb :99 (xvfb-run itself is unusable here: xauth is not installed). So no runtime pref value was read back, and the page says so in three places rather than implying a measurement. Brave, Edge, Safari, Tor Browser and DuckDuckGo were not available in this environment at all.
10. Unedited arm-probe output
- bp_arms_probe-output.txt
browser: Chromium 151.0.7922.34 playwright: 1.62.1 ARM default (no extra flags), run 1 third-party cookies in the jar: ["tp_http","tp"] document.cookie inside the frame: "tp_http=set-from-header; tp=set-from-js" Cookie header the 3p then saw: ["tp_http=set-from-header; tp=set-from-js"] ARM default (no extra flags), run 2 third-party cookies in the jar: ["tp_http","tp"] document.cookie inside the frame: "tp_http=set-from-header; tp=set-from-js" Cookie header the 3p then saw: ["tp_http=set-from-header; tp=set-from-js"] ARM --test-third-party-cookie-phaseout third-party cookies in the jar: ["tp_http","tp"] document.cookie inside the frame: "tp_http=set-from-header; tp=set-from-js" Cookie header the 3p then saw: ["tp_http=set-from-header; tp=set-from-js"] ARM --block-third-party-cookies (no such switch) third-party cookies in the jar: ["tp_http","tp"] document.cookie inside the frame: "tp_http=set-from-header; tp=set-from-js" Cookie header the 3p then saw: ["tp_http=set-from-header; tp=set-from-js"] ARM --incognito third-party cookies in the jar: ["tp_http","tp"] document.cookie inside the frame: "tp_http=set-from-header; tp=set-from-js" Cookie header the 3p then saw: ["tp_http=set-from-header; tp=set-from-js"] ARM CDP Network.setCookieControls(true) third-party cookies in the jar: [] document.cookie inside the frame: "" Cookie header the 3p then saw: [null] ARM CDP Storage.setThirdPartyCookieBlocking CDP error: cdpSession.send: Protocol error (Storage.setThirdPartyCookieBlocking): 'Storage.setThirdPartyCookieBlocking' wasn't found third-party cookies in the jar: ["tp_http","tp"] document.cookie inside the frame: "tp_http=set-from-header; tp=set-from-js" Cookie header the 3p then saw: ["tp_http=set-from-header; tp=set-from-js"]
The two default rows are the same condition run twice, and match exactly. That is what makes the setCookieControls row readable as an effect rather than as noise, and it is the same discipline the page recommends for a real paired crawl.
11. External sources, and how each was verified
All fetched 2026-09-01. Everything on the content page's browser table is quoted from a vendor primary source, never from recall.
| Source | How verified | Used for |
|---|---|---|
| WebKit, "Tracking Prevention in WebKit" | fetched; ITP behaviours quoted verbatim | Safari row |
| WebKit blog, "Full Third-Party Cookie Blocking and More" | fetched; date 2020-03-24, Safari 13.1 / iOS 13.4, sentence quoted verbatim | Safari shipping date |
| Microsoft Learn, "Tracking prevention in Microsoft Edge" | fetched with its front-matter; ms.date 2021-01-07, updated_at 2026-06-12. Levels, the Basic/Balanced/Strict enforcement matrix, the Disconnect lists, the site-engagement threshold of 4.1 and the CompatExceptions list all quoted verbatim | Edge row and two of the three pitfalls |
| Mozilla blog, 2019-09-03 | fetched; Firefox 69, sentence quoted verbatim | ETP default-on date |
| Mozilla blog, 2022-06-14 | fetched; page carries “updated August 28, 2024”; cookie-jar sentence quoted verbatim | Total Cookie Protection date |
product-details.mozilla.org/1.0/firefox_versions.json | fetched; LATEST_FIREFOX_VERSION 155.0, LAST_RELEASE_DATE 2026-09-01, FIREFOX_ESR 140.15.0esr | Firefox current version |
Brave Help Center, Shields and the Shields-while-browsing article (support.brave.com migrated to support.brave.app — corrected in review, see §15.1) | fetched through Playwright Chromium (both are behind a JS/CDN gate that curl and WebFetch do not clear); Standard-versus-Aggressive wording quoted | Brave row |
api.github.com/repos/brave/brave-browser/releases/latest | JSON API, not releases.atom. Corrected in review — see §15.3. This row first read “stable v1.94.118, published 2026-09-01”, taken from the unfiltered releases list. That object carries prerelease: true. /releases/latest excludes prereleases and returns v1.94.117, published 2026-08-26T08:10:10Z, Chromium 152.0.7977.64; Brave's own release-notes page agrees (“Release Notes v1.94.117 (Aug 27, 2026)”) | Brave version |
aus1.torproject.org/torbrowser/update_3/release/downloads.json | fetched; Tor Browser 15.0.21 | Tor Browser version |
| DuckDuckGo, "Web Tracking Protections" | fetched; the protection list quoted; the page carries no dates or versions and the row says so | DuckDuckGo row |
versionhistory.googleapis.com Chrome stable | fetched; 152.0.7977.75, serving from 2026-09-01 | context for “Playwright ships Chromium 151” |
registry.npmjs.org for adblock-rs, adblock-rust, @ghostery/adblocker, @cliqz/adblocker | fetched | the “driving each browser” row on Brave's engine |
api.github.com/repos/webfp/tor-browser-selenium + PyPI tbselenium | fetched; 0.9.0 2024-10-23, last commit 2025-07-26, CI pinned to TB 14.5.5, repo not archived | the Tor Browser row and an Open Question |
11.1 Checked and rejected
support.mozilla.orgETP articles. The obvious source for the ETP row.WebFetchreturns a JS-shell error page, and driving it with Playwright Chromium hits a CAPTCHA (“Enter the characters seen in the image below”). Rejected as unfetchable; the ETP row is built from the two Mozilla blog posts, which are datable, plus the shipped preference files of the build itself, which are better evidence than documentation anyway.- A web-search summary of Firefox Bounce Tracking Protection's default level. A search snippet asserted that BTP is Strict-only. That is consistent with the build's own category table, but a search summary is not a source. The page instead states what the build's
ContentBlockingPrefs.sys.mjsshows — thatbtpappears in the strict rule set and that the “off” state isMODE_ENABLED_DRY_RUN— and makes no claim about the Standard default, which was not established. firefox-source-docs.mozilla.orgbounce-tracking page. Fetched; it names the pref and says “0 is fully disabled and 1 is fully enabled” but gives neither the default nor the ETP level. Kept as background, not cited for a figure.- The npm package
adblock-rust(9.0.0, February 2021, no repository field). Not Brave's engine despite the name matching Brave's GitHub repository. Rejected, and named on the page as a trap, because the correct package isadblock-rs. releases.atomfor Brave versions. Not used: its element order pairs each version with the wrong date. The JSON API was used instead.- Any SEO listicle or “best privacy browsers 2026” page. None consulted; every browser-behaviour claim traces to a vendor page, a shipped binary or a paper.
12. Judgement calls
- Creating a page rather than broadening a neighbour. requests and fingerprinting both assume the default browser; folding “the browser is a treatment” into either would have buried it under a classification topic. filter_lists owns the list, not the browser that ships it. A reasonable person could have made this a section of crawler instead; that was rejected because the content is a study-design question, not an instrument-comparison question.
- Extension-side blockers are
adjacent, notin. uBlock Origin, AdGuard, Privacy Badger and the MV3 work are the neighbouring literature and a reader will want them, so they are named with their figures — but counting them as browser-shipped protections would have doubled the “in” set with a different treatment. The verdict class makes the choice visible instead of silent. - User-Agent spoofing gets its own verdict class rather than being excluded. Two corpus papers ran a “Safari” arm this way. Excluding them would hide a common and easily-misread design; including them as
inwould endorse it.spoofsays both things. - Tor Browser is counted in the browser fold but not treated as a tracking-protection arm. It is the most-named protective browser in the corpus (37 papers) and almost all of that is anonymity work. Treating those 37 as tracking-protection arms would have quadrupled the headline and been wrong.
- The page dates every protection and refuses to rank them. The corpus can say what the field did (Brave 78 papers, ITP 41, ETP 27). It cannot say which protection a 2026 student should use as a treatment, and the page does not pretend otherwise: the browser table is dated, the per-year table is given, and the recommendation is about design (duplicate arms, verified state, pinned versions) rather than about which vendor to pick.
- Chromium was measured and the others were not, and the page is lopsided because of it. A reasonable person would have found a way to run Brave or Firefox. This environment could not, and the page marks every unmeasured claim rather than levelling the tone.
13. What could not be established
- Why
--test-third-party-cookie-phaseouthad no effect in Chromium 151 on the Playwright path, given that the switch exists in the binary. Not investigated beyond confirming the effect and the switch's existence. Candidate explanations not tested: it may gate a field-trial state rather than the cookie setting directly, or Playwright's default flag set may override it. - The runtime value of
network.cookie.cookieBehaviorin a Playwright-driven Firefox. Source-level evidence says 5; the browser would not launch. One line of work for anyone with a working Firefox, and listed as an Open Question. - Whether Firefox Bounce Tracking Protection is on in Standard. See §11.1.
- Brave, Edge, Safari, Tor Browser and DuckDuckGo behaviour, first-hand. None available here.
- The distance between a crawler profile and a real profile under Edge's site-engagement relaxation, Safari's interaction-based storage grants and Firefox's 45-day first-party exemption. The page raises it as an Open Question; nothing in the corpus measures it.
- Whether the 58
out-backgroundpapers are all really background. They were read at window level, not in full. A paper that discusses a protection only in a section the window sampler did not reach would be misfiled. The window count per paper is inout_bp_candidates.jsonand the full worksheet is regenerable.
14. The run itself
- Date: 2026-09-01. Corpus at the time: 5,859 extracted papers, 5,869 with rendered full text, 7 venues, 2010–2026.
- Browser environment: Chromium 151.0.7922.34 and Firefox 153.0 as shipped with Playwright 1.62.1, Linux container, no GPU. Firefox does not start (§9).
- Model: the page, the report scripts, the folds and the hand audit were produced by Claude (Opus 5) in one sitting. Four review passes were run as sub-agents; see §15.
- Failure modes these checks do not catch, learned the hard way in this run. Recorded as failure modes rather than as a tally, because the point is which check to add next time: (a) three quotes published as continuous sentences that are column splices in the rendering (§7.1); (b) an initial
browser_fold.mjsthat exported a flatPROTECTS_BY_DEFAULTset — deleted before use, because “protects by default” is time-dependent (Firefox did not before 2019, Safari did not before 2017) and a flat set would have produced a confidently wrong count; © the first Edge widening that matched 176 papers of graph edges (§2.2); (d)scripts/prov_embed.py, which re-embeds the script outputs into this page, silently swallowed the whole quote-check block when an empty<file text …></file>placeholder let its non-greedy body pattern run on to the next block's closing tag. Caught by counting<file textopeners after a rebuild, not by reading. The pattern now refuses to cross an opener, and the comment in the script says why. - No accidental exposure. Credentials live in
.env, gitignored, and are never logged byscripts/dw.mjs. No content was sent to any external LLM provider.
15. Review log
Four review passes, all told explicitly that the author's context may not be exhaustive and all handed the page text, the report script, its unedited output and this log. The three focused passes ran in parallel; the generic pass ran after their findings were applied.
15.1 External currency (Sonnet)
Told to fetch, not recall, every dated or versioned claim. Verdict: the browser table, all seven version numbers, four of the five dates and both CDP claims verified correct against primary sources fetched on 2026-09-01.
| Finding | Action |
|---|---|
Brave's help centre has migrated: the two cited support.brave.com article URLs now 301 to support.brave.app. Content unchanged | accepted. Both citations repointed, with a note that the old paths still resolve and that both are CDN-gated against curl |
| The 2019-06-27 Edge Tracking Prevention preview date rested on prior knowledge: Microsoft's current documentation does not carry it | accepted, and closed. The Microsoft Edge Team blog post of that date was fetched (blogs.windows.com/msedgedev/2019/06/27/…), and the row now cites it and quotes it, including “The default tracking prevention setting is Balanced” — which strengthens the Edge row rather than only dating it |
Storage.runBounceTrackingMitigations and Storage.getRelatedWebsiteSets exist at devtools-protocol tip-of-tree and are topically adjacent but unmentioned | accepted. Added to the bounce-tracking paragraph, with the point that unlike the Privacy Sandbox commands beside them these two survive at tip-of-tree, and that forcing the purge is what an arm wants |
| Several 2026 SEO pages claim Chrome now shows a third-party-cookie prompt, contradicting Google's own blog | noted, no change. The reviewer rejected them as unreliable and confirmed Google's April 2025 position is still current. The page already cites the primary source through privacy_sandbox |
safaridriver, msedgedriver and Appium not independently re-verified against a vendor changelog | noted, no change. No contradicting evidence; the page does not attach a version or a date to any of the three, so there is no figure to go stale |
15.2 Figures versus the script (Sonnet)
Re-ran bp_report.mjs, bp_arms_probe.mjs and bp_edge_check2.mjs and diffed against the committed outputs: byte-identical, no drift. Independently re-derived the 84/1,120 versus 84/857 identity (0 discrepancy either way), the 226 distinct browser strings and 42-string residue, the arms counts, the version-pinning figures and the audit verdict arithmetic (15+3+1+2+1+4+58 = 84). Confirmed the usedOrMentioned filter keeps only used/produced and that no query counts tuples.
Mutation-tested the published probe, which was the point of the pass: inverting enableThirdPartyCookieRestriction to false flips the working arm back to an unblocked control, and making the “third party” same-site as the first party flips the CDP-block arm from blocked to unblocked. The probe is sensitive, not vacuous.
| Finding | Action |
|---|---|
| The Edge evidence cited a paper from the rejected widening. The provenance page named Double-Edged Shield as one of two substantive body mentions in the 18-paper scan. It is not in those 18 at all: its Edge sentence is nowhere near the literal string “Tracking Prevention”, and it only surfaced in the 176-paper noisy widening this log itself calls unusable. The real 18 contain three body occurrences, not two — XSinator, PURL and a 2020 CCS survey's coding-category label — and none of the three is about Edge | accepted, medium-high. The section was rebuilt. The page now says 17 of 20 occurrences are reference-list entries, names all three body occurrences and states that none concerns Edge, and adds a second, committed sweep (scripts/bp_edge_cite.mjs) counting the 5 papers that cite Microsoft's Edge tracking-prevention documentation. The headline zero was never in doubt; the evidence behind it now matches the data |
ukani2025_local: “five products found vulnerable” undercounts. The paper also says “We apply our tests to six popular Web privacy and security tools—identifying at least one vulnerability in each for a total of 19” | already fixed before this arrived, from the parallel citations pass, which found the same tension from the other side. The row now says five products whose bugs expose users, plus a sixth non-exposing bug in DuckDuckGo, 19 vulnerabilities disclosed to six parties, and that AdGuard's patch is partial. Both reviewers were right about different sentences in the same paper |
datta2019_evaluating framing inverted. The page read “13 of the 15 PETs moved that from about 13 bits to about 11”, which sounds like an achieved reduction. The paper's own sentence is that all AFPETs but Brave and Tor BB “reveal over 11 bits of entropy and hence are marginally better than not using any AFPET at all” | accepted, medium. Rewritten to the paper's framing, quoted, and turned into the page's point: a protection arm can move your metric hardly at all, and that is a finding |
Latent bug in browser_fold.mjs: \bie\b cannot match the no-space form IE11. No string in the current 226 takes that form, so no published figure is affected | accepted, low. Rule changed to \bie\s*\d alternation and unit-checked against IE11, IE 11, IE, Internet Explorer 8, pie and tie. Re-ran the report: no drift |
15.3 Citations and quotes (Sonnet)
Verified all 26 citekeys resolve, no key collisions in the 728-entry bibliography, and checked the four new keys author-by-author against the papers and the venue landing pages. Independently re-read all 15 in rows plus the baseline, instrument, spoof and adjacent classifications against the paper text, and confirmed the rendered page: 50 inline markers, 26 distinct keys, 26 reference entries, one expected red link.
| Finding | Action |
|---|---|
The Brave version was a prerelease. The page said stable 1.94.118 on 2026-09-01, taken from the unfiltered releases list. That release object carries prerelease: true; /releases/latest, which excludes prereleases, returns v1.94.117, published 2026-08-26 | accepted, moderate — and independently re-confirmed twice before changing: the API's prerelease flag, and Brave's own release-notes page, which is headed “Release Notes v1.94.117 (Aug 27, 2026)”. Fixed, with the trap written into the footnote. The Chromium figure (152.0.7977.64) was right either way |
| “Firefox's Disconnect-based blocking has a 45-day first-party-visit exemption” had no source anywhere, on a page whose own stated standard is that every browser-behaviour claim traces to a vendor page, a binary or a paper | accepted, moderate. It does have a source — [2Randall, Audrey; Snyder, Peter; Ukani, Alisha; Snoeren, Alex C.; Voelker, Geoffrey M.; Savage, Stefan; Schulman, Aaron (2022): "Measuring UID smuggling in the wild", in: Proceedings of the ACM Internet Measurement Conference. (DOI)], “Firefox clears all storage from sites on the Disconnect tracking list after 24 hours, unless the user has loaded the site as a first party in the previous 45 days” — which was in the reading and not in the citation. Both occurrences now cite it, and the quote is in the checker |
A reference marker silently dropped mid-quote. The [3Hausladen, Katherine; Wang, Oliver; Eng, Sophie; Wang, Jocelyn; Wijaya, Francisca; May, Matthew; Zimmeck, Sebastian (2025): "Websites' Global Privacy Control Compliance at Scale and over Time", in: Proceedings of the USENIX Security Symposium. (Link)] quote omitted the source's [54] with no [...], which is exactly the defect §7.1 caught for TRIDENT and fixed | accepted, minor but embarrassing. The marker is restored inside the quote. The general lesson is now enforced by the checker rather than by care: see the next row |
| Two quotes on the page were not in the checker at all — [4Hoang, Nguyen Phong; Niaki, Arian Akhavan; Gill, Phillipa; Polychronakis, Michalis (2021): "Domain name encryption is not enough: privacy leakage via IP-based website fingerprinting", Proceedings on Privacy Enhancing Technologies 2021(4):420-440. (DOI)]'s “at the same time” and [1Datta, Amit; Lu, Jianan; Tschantz, Michael Carl (2019): "Evaluating Anti-Fingerprinting Privacy Enhancing Technologies", in: Proceedings of the ACM Web Conference. (DOI)]'s Brave User-Agent sentence — so “32 verbatim, 0 not found” undercounted the page's real quote surface | accepted. Both added, plus the Double-Edged Shield forum sentence and the datta2019 halves. The checker now covers 41 spans, all passing. Checking the datta2019 sentence exposed a fourth two-column splice, now marked with [...] on the page |
elhajjchehade2025_double: wrong reason for excluding Brave. The page said Brave's forum “is not public”; the paper's Appendix B says the posts “do not include the detailed browser filter-list configurations” | accepted, moderate. Reworded on the page and in bp_audit.json, and the paper's sentence added to the quote checker |
| “Announced for new installs on 2019-06-04” was not supported by the cited September post, which says only “June 2019” | accepted, minor. The June post was in the reading; it is now cited by URL and quoted directly |
Three DOI collisions elsewhere in the 728-entry bibliography (fouad2022my/fouad2022_cookie; two boettger2025_regional-type entries; ahmad2026_ipfp/ahmad2026_more): the same paper twice under two keys, which a key-collision check cannot see | accepted as real, deferred, not touched. None of the six keys is cited by this page. Merging them means repointing every page that cites the losing key, and a half-merged bibliography breaks every page that cites a deleted key — so it is a sitting of its own. Filed as a work item on wiki-measuretheweb rather than done here |
| §15 of this log was an empty header while §14 promised four review passes | accepted; you are reading the fix |
15.4 What a narrow brief cannot catch
Three defects in this run fell between the focused reviewers' briefs. They are recorded as classes of blind spot, because each one implies a check that is missing rather than a reviewer who was careless.
- Correct arithmetic on the wrong quantity. The 60.1% Chrome-or-Chromium share was a sum of multi-valued table rows; the figures reviewer re-derived it and confirmed the arithmetic, which was right. A number guard compares a page to a script; it cannot see that the script is computing something the sentence does not mean. Only the distinct-paper roll-up (Q21–Q23) closes it.
- A claim with no fetchable source, no script output and no paper quote. The ETP Strict row (§15.5) sat in exactly the hole between the three briefs: the currency reviewer had nothing to fetch because SUMO is CAPTCHA-walled, the figures reviewer had no script that produced it, and the citations reviewer had no paper to check it against — so it was the only mechanism cell in the browser table with no citation, and it was wrong. The check that closes this is mechanical: grep the page for every factual cell and ask which of the three passes owns it; the ones nobody owns are the ones to re-derive.
- A passing checker that does not cover the thing you want checked.
bp_quotecheck.mjsreported 32 of 32 while two quotes on the page were absent from its list. Coverage was found by a reviewer reading the page against the checker, not by the checker. The lesson is the same one as for the probes: a green check is a statement about its inputs.
15.5 Generic pass (Fable)
No checklist; briefed to find what the three focused passes were not looking for, and given the target reader. It found the run's worst error, in the one place the other three structurally could not.
| Finding | Action |
|---|---|
The ETP Strict row was factually wrong, and was the only mechanism cell in the browser table with no citation. It said Strict adds “blocking all cross-site cookies”, and the published Firefox snippet's comment said cookieBehavior 1 was “closest to ETP Strict”. The build the page reads for every other Firefox claim says otherwise: browser.contentblocking.features.strict is tp,tpPrivate,cookieBehavior5,cookieBehaviorPBM5,cryptoTP,fp,stp,emailTP,emailTPPrivate,-consentmanagerSkip,-consentmanagerSkipPrivate,lvl2,rp,rpTop,qps,qpsPBM,fpp,fppPrivate,btp,lna — Strict's cookie behaviour is 5, identical to Standard | accepted, and the most serious finding of the run. Verified independently from browser/omni.ja before changing anything. The row is rewritten from the strict string, the code comment is corrected (cookieBehavior 1 is a custom state no ETP preset ships), the strict string is now evidence in §9 (Q-row-equivalent), and a footnote records that Mozilla's user-facing wording describes what partitioning achieves rather than a different cookieBehavior. Blocked versus partitioned is precisely the distinction this page teaches, so getting it backwards was not a detail |
| This log's evidence sections still asserted three facts that §15 said had been corrected — the Edge narrative in §2.2, the Brave version in §11, the Brave support domain in §11. Someone checking a number lands on the section, not the review log | accepted. All three corrected in place with a “corrected in review — see §15.x” marker, so the wrong version and the reason it was wrong both stay visible |
An indented line rendered as literal preformatted text, [...] markup and all, because DokuWiki does not parse inline markup inside an indented block. Verified in the live DOM. (The reviewer notes privacy:privacy_sandbox has the same bug, so “match the sibling” was the wrong instinct) | accepted. Replaced with a <code> block. The sibling's instance is left alone: not this page's to fix, and flagged here instead |
| OpenWPM — the field's dominant Firefox harness — was missing from the section whose thesis is “your library has already set the protection state” | accepted. A row added saying plainly that it was not examined here and that a third pref-setting layer makes the read-back matter more, not less |
No reusable-artifact section, unlike the sibling privacy:privacy_sandbox | accepted, and it paid. Ten artefacts listed, every URL fetched: nine resolve, and [5Jueckstock, Jordan; Snyder, Peter; Sarker, Shaown; Kapravelos, Alexandros; Livshits, Benjamin (2022): "Measuring the Privacy vs. Compatibility Trade-off in Preventing Third-Party Stateful Tracking", in: Proceedings of the ACM Web Conference. (DOI)]'s Chromium storage-policy patches 404 at the wspr-ncsu URL printed in the paper and live under the first author's account instead. The flagship paper's arm-building code was one dead link from being unfindable |
| The page preaches read-back but supplied a mechanism for only two of eight arms | accepted. A new subsection gives the one recipe that generalises — a canary origin visited first in every arm — and says explicitly that nothing in the corpus does this, so it is a recommendation and not a measured practice |
| Three claims where confidence outran evidence: the lead's “a good number are not in the state their authors think”; a trend row comparing 2023–2026 with its own subset 2024–2026; “sixteen years” for a seventeen-venue-year corpus | all three accepted. The lead now says what the evidence is (tool defaults plus one probe) and that nobody has checked published crawls; the subset row is deleted and the two remaining windows are disjoint; the count is corrected |
| “Four produced a control arm” flattens a real distinction — three failed silently, one threw a protocol error, and the silence is the hazard | accepted. Both the box and the discussion now separate them |
| One zero with no committed probe: the CDP-command sweep | accepted. scripts/bp_cdp_sweep.mjs was already written but had no Q-row and no cross-reference. Q25 added, and the page now points at it. Q24, Q26 and Q27 added for the other three sweeps at the same time |
| Edge appears five times, twice near-verbatim; and a fourth paragraph under “Three things in that table” is crawl tooling, not table fallout | accepted. The Open Questions bullet is cut to a pointer, and the CDP bounce-tracking paragraph is moved into the driving section under its own heading |
| The driving table does not say which rows are hearsay — only Chromium was exercised, and the admission lived 200 lines away | accepted. One sentence above the table |
| Two sections of this log are scorekeeping: §14's “mistakes caught before any reviewer saw it” and §15.4's “what the focused reviewers did not catch” | accepted. Both reframed as failure modes with the check that would close each, which is the reusable part. The reviewer is right that credit allocation is not what a working log is for |
| “The page does answer its own question” | recorded, and the three gaps it named between that and a usable Monday morning (artifacts, read-back, OpenWPM) are the three accepted above |
15.6 What no reviewer caught
scripts/prov_embed.py, which re-embeds script output into this page, silently deleted §6 and §7 of this log during a rebuild: an empty <file text …></file> placeholder let its non-greedy body pattern run on to the next block's closing tag and swallow everything between. Caught by counting <file text openers and section headings after the rebuild, not by reading, and not by any review pass — all four had read the file before the damage. The pattern now refuses to cross an opener. The general form: a generator that edits a published page in place needs a structural check after every run, because the failure is a deletion and a deletion leaves nothing to notice.
References
- [1]
- Datta, Amit; Lu, Jianan; Tschantz, Michael Carl (2019): "Evaluating Anti-Fingerprinting Privacy Enhancing Technologies", in: Proceedings of the ACM Web Conference. (DOI)
- [2]
- Randall, Audrey; Snyder, Peter; Ukani, Alisha; Snoeren, Alex C.; Voelker, Geoffrey M.; Savage, Stefan; Schulman, Aaron (2022): "Measuring UID smuggling in the wild", in: Proceedings of the ACM Internet Measurement Conference. (DOI)
- [3]
- Hausladen, Katherine; Wang, Oliver; Eng, Sophie; Wang, Jocelyn; Wijaya, Francisca; May, Matthew; Zimmeck, Sebastian (2025): "Websites' Global Privacy Control Compliance at Scale and over Time", in: Proceedings of the USENIX Security Symposium. (Link)
- [4]
- Hoang, Nguyen Phong; Niaki, Arian Akhavan; Gill, Phillipa; Polychronakis, Michalis (2021): "Domain name encryption is not enough: privacy leakage via IP-based website fingerprinting", Proceedings on Privacy Enhancing Technologies 2021(4):420-440. (DOI)
- [5]
- Jueckstock, Jordan; Snyder, Peter; Sarker, Shaown; Kapravelos, Alexandros; Livshits, Benjamin (2022): "Measuring the Privacy vs. Compatibility Trade-off in Preventing Third-Party Stateful Tracking", in: Proceedings of the ACM Web Conference. (DOI)
