v151 · Storage · Privacy
IncognitoStaticStorageQuota
Chrome 151 fixes a privacy leak in the StorageManager.estimate() API: Incognito mode could previously be detected because it returned a quota derived from available RAM rather than the disk-based bucketed value. The fix makes Incognito and normal mode return identical quota estimates, eliminating the fingerprint vector.
concepts
-
Quota Estimate Demo
Call
navigator.storage.estimate()and inspect the returned quota. In Chrome 151+, the value is identical whether or not you're in Incognito — the bucketed formula applies in both modes. Compare normal vs. Incognito tabs to verify the fix. -
Privacy Leak Explainer
Step-by-step explanation of how the original quota leak worked: Incognito returned a RAM-derived value (typically 120 MB on a 16 GB device) while normal mode returned a disk-derived value (up to 10 GiB). Any site calling
estimate()could compare the quota against known thresholds to detect Incognito with high confidence. -
Quota Comparator
Calls
navigator.storage.estimate()live and shows quota, usage, and available space. A simulation panel lets you dial in a RAM size and compares the pre-Chrome 151 Incognito (RAM/20 = detectable) versus Chrome 151 (same bucketed disk-based formula = indistinguishable). -
Detection Attack Lab
Runs the classic Incognito-detection vectors — quota threshold, RAM-fraction inference, legacy
webkitRequestFileSystemprobe — against your current browser. Chrome 151 should report "indistinguishable" in both modes. Open in both modes to compare. -
Bucketed Formula Explorer
Side-by-side simulation of the pre-Chrome 151 formula (RAM/20 in Incognito) versus the Chrome 151 formula (disk-bucketed in both modes). Slide RAM, disk and site-usage and watch the leak open or close.
-
Privacy flow simulator
Replay the attacker threshold check with adjustable RAM, disk bucket, and quota threshold values. Shows exactly why Chrome 151 makes normal and Incognito quota estimates indistinguishable for this signal.
why it shipped
The StorageManager predictable-quota feature (shipped earlier) buckets the quota for non-unlimited-storage sites to max(10 GiB, ceil(actual_quota_GiB)) + usage. This formula works correctly in normal mode (actual_quota is disk-based, always large) but in Incognito mode, Chrome sets the actual_quota to a fraction of available RAM — often around 120 MB on a 16 GB machine. This small value slips below the 10 GiB floor, making the incognito quota read as a raw RAM-derived number rather than the bucketed floor that normal mode returns. The result: any script calling estimate() could reliably distinguish Incognito by comparing the quota against known thresholds. Chrome 151 applies the same disk-derived bucketing formula in Incognito, hiding the RAM-based value.
what changed
- Before (Chrome <151):
estimate().quotain Incognito could return ~120 MB (or similar RAM-fraction), far below the 10 GiB floor used in normal mode - After (Chrome 151+):
estimate().quotain Incognito returns the same bucketed disk-based value as normal mode — differences are no longer exploitable for detection
references
implementation reference
Need the exact API surface, compatibility boundaries, errors, lifecycle, and source links? Read the matching gendn reference ↗