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

  1. 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.

  2. 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.

  3. 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).

  4. Detection Attack Lab

    Runs the classic Incognito-detection vectors — quota threshold, RAM-fraction inference, legacy webkitRequestFileSystem probe — against your current browser. Chrome 151 should report "indistinguishable" in both modes. Open in both modes to compare.

  5. 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.

  6. 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

references

implementation reference

Need the exact API surface, compatibility boundaries, errors, lifecycle, and source links? Read the matching gendn reference ↗