On Wed, Dec 18, 2024 at 5:32 PM Mike Taylor <miketa...@chromium.org> wrote:
> We discussed this in our OWNERs meeting, and agreed this should be an I2S > that requires 3LGTMs to ship. But, we can just use this thread - no need to > send more mail. Some other folks have other questions, but I'll let them > send them independently. > On 12/13/24 12:57 PM, Mike Taylor wrote: > > Thanks Reema - these are helpful answers. And it seems you're most of the > way to an I2S here - I think "PSA" was probably the incorrect category. > > > We have manually looked at how sites seem to be using > navigator.storage.estimate() and most of the cases we’ve seen seem to be > using it for incognito detection. > > I'd like to better understand the risk to sites who are not using this for > incognito detection. Could you do a random sampling of say, 10 non-FP > usages of quota estimation and see if they are in fact handling > QuotaExceededErrors? > > One more question: what are the actual Quota limits for storage on mobile > (including low-end devices), and WebView? Are any of them lower than 10GiB? > On 12/12/24 1:41 PM, Reema A wrote: > > Thanks for the feedback. Wrote out some more details and answers to > questions that have been asked below: > > *Problem:* > It is trivially easy to detect if a user is in incognito mode through the > Storage Manager’s estimate API because the amount of storage made available > in incognito mode is significantly smaller than in regular mode. We have > found some libraries that seem to be taking advantage of this fact and > using navigator.storage.estimate() to detect if a user is in incognito mode. > > Probably a silly question, but why is the storage made available in incognito inherently smaller than regular mode? Couldn't we increase the incognito quotas, while still keeping them ephemeral? > > *Goals:* > Mitigate detecting incognito mode through navigator.storage.estimate() and > navigator.storageBuckets.estimate() > Reduce fingerprinting value of the estimate() API > Allow estimate() to still be functional for sites with unlimited storage > permissions > Leave quota enforcement unaffected > Minimize potential site breakages > > *Non-goals:* > Mitigating all possible methods of incognito mode detection > Mitigating detecting incognito mode through quota exhausted errors > > *Relevant spec:* > The storage spec <https://storage.spec.whatwg.org/#usage-and-quota> > defines quota as follows: “The storage quota of a storage shelf is an > implementation-defined conservative estimate of the total amount of bytes > it can hold. This amount should be less than the total storage space on the > device. It must not be a function of the available storage space on the > device.” > > *Current state:* > The value returned by estimate() is already just an estimate and in some > cases the actual amount of space available to use may be different. > > *Proposed change:* > Return an artificial quota equal to usage + 10 GiB in the Storage Manager > and Storage Bucket APIs estimate() method in both incognito mode and > regular mode. However, continue to return the old value returned if the > site has unlimited storage permission. Additionally, enforced quota will be > unaffected. > > Would that cause issues for sites where `quota`-`usage` < 10GB ? Would developers run a risk of thinking they are safe to save more data when in fact they are out of quota? (I guess I'm not familiar with how developers use `estimate()` today and how confident they are that the estimate is accurate) > > *Details:* > navigator.storage.estimate().quota returns usage + 10 GiB. For storage > buckets, StorageBucket.estimate().quota will return either the requested > quota set when opening the bucket or usage + 10 GiB if the default quota is > being used. > > *FAQ:* > Q: What about sites that rely on the quota value returned? > As mentioned in the spec, the quota is only an estimate and sites should > already be handling QuotaExceededErrors. > > Q: Why not just return some error indicator? > A: This is more likely to unexpectedly break sites. > > Q: Why return the same value in incognito and non-incognito? > A: To ensure that they’re indistinguishable. > > Q: Why 10 GiB? > This number was proposed because it is likely to be sufficiently high > enough that sites are unlikely to change their behavior based on the quota > estimate being too low for their use case. It is also similar to the > Firefox implementation. > > Q: Why not a random value? > This could result in a unique ID that could be used for fingerprinting. > > Q: Why (usage + 10 GiB) and not just 10 GiB? > A: To ensure that usage is always less than the quota estimate to avoid a > counterintuitive behavior that might break a site. > > Q: What do other browsers do? > Firefox: In best-effort mode, Firefox returns the minimum of 10GiB or 10% > of the total disk size. If the origin has been granted persistent storage, > then it returns the min of 8 TiB or 50% of the total disk size. [source 1 > <https://developer.mozilla.org/en-US/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria>, > source 2 > <https://searchfox.org/mozilla-central/source/dom/quota/ActorsParent.cpp#6828> > ] > Safari: The docs > <https://www.webkit.org/blog/14403/updates-to-storage-policy/> say “Note > that the quota is an upper limit of how much can be stored — there is no > guarantee that a site can store that much, so error handling for > QuotaExceededError is necessary. Also, to reduce fingerprinting risk > introduced by exposing usage and quota, quota might change based on factors > like existing usage and site visit frequency.” > > Q: Have you looked at different use cases and how they might be impacted? > We have manually looked at how sites seem to be using > navigator.storage.estimate() and most of the cases we’ve seen seem to be > using it for incognito detection. > > Q: Do we have test coverage? > Yes, we have unit tests, browser tests, and web platform tests. CLs > <https://chromium-review.googlesource.com/q/a:reemaa+quota> > > Q: What if sites break? > Developers can disable this change via > chrome://flags/#predictable-reported-quota to validate if this is the > cause of the breakage. We can also flip the flag off via Finch if needed. > > *Notes:* > This is based on an investigation and solution proposed by > t...@chromium.org. > > Thanks! > Reema > > On Monday, December 9, 2024 at 6:18:21 AM UTC-5 Mike Taylor wrote: > >> On 12/6/24 5:48 AM, Chromestatus wrote: >> >> Contact emails ree...@chromium.org >> >> Specification None >> >> Summary >> >> Report a predictable storage quota from StorageManager's estimate API for >> sites that do not have unlimited storage permissions. It is possible to >> detect a user's browsing mode via the reported storage quota because the >> storage space made available is significantly smaller in incognito mode >> than in regular mode. This is a mitigation that prevents detection of a >> user's browsing mode via the storage API by reporting an artificial quota, >> equal to usage + 10 Gib, in all browsing modes for sites with limited >> storage permissions. Sites with unlimited storage permissions will be >> unaffected. Enforced quota will also be unaffected. >> >> A small explainer (or more details) would be useful here, it's not >> immediately obvious what changes you're proposing to make. Are we making >> this change only to incognito mode, or to regular mode as well? Do we need >> to update a spec somewhere, or is this already allowed (pointer to the >> relevant spec would be useful)? >> >> Blink component Blink>Storage>Quota >> <https://bugs.chromium.org/p/chromium/issues/list?q=component:Blink%3EStorage%3EQuota> >> >> TAG review None >> >> TAG review status Not applicable >> >> Risks >> >> >> Interoperability and Compatibility >> >> Could you flesh out interop and compat risks here please, i.e. What do >> other browsers do? What do we expect to break (or not) as a result? You >> mention Incognito mode detection (I'm making an educated guess that "user's >> browsing mode" refers to) - have you looked at different use cases and how >> they might be impacted? Do we have test coverage? >> >> None >> >> >> *Gecko*: No signal >> >> *WebKit*: No signal >> >> *Web developers*: No signals >> >> *Other signals*: >> >> WebView application risks >> >> Does this intent deprecate or change behavior of existing APIs, such that >> it has potentially high risk for Android WebView-based applications? >> >> None >> >> >> Debuggability >> >> None >> >> >> Will this feature be supported on all six Blink platforms (Windows, Mac, >> Linux, ChromeOS, Android, and Android WebView)? No >> >> Is this feature fully tested by web-platform-tests >> <https://chromium.googlesource.com/chromium/src/+/main/docs/testing/web_platform_tests.md> >> ? No >> >> Flag name on about://flags predictable-reported-quota >> >> Finch feature name StaticStorageQuota >> >> Requires code in //chrome? False >> >> Tracking bug https://issues.chromium.org/issues/369865059 >> >> Estimated milestones >> Shipping on desktop 133 >> Shipping on Android 133 >> Shipping on WebView 133 >> >> Anticipated spec changes >> >> Open questions about a feature may be a source of future web compat or >> interop issues. Please list open issues (e.g. links to known github issues >> in the project for the feature specification) whose resolution may >> introduce web compat/interop risk (e.g., changing to naming or structure of >> the API in a non-backward-compatible way). >> None >> >> Link to entry on the Chrome Platform Status >> https://chromestatus.com/feature/4977371751645184?gate=4955779474653184 >> >> This intent message was generated by Chrome Platform Status >> <https://chromestatus.com>. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "blink-dev" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to blink-dev+unsubscr...@chromium.org. >> To view this discussion visit >> https://groups.google.com/a/chromium.org/d/msgid/blink-dev/675211ae.050a0220.55f02.00d8.GAE%40google.com >> <https://groups.google.com/a/chromium.org/d/msgid/blink-dev/675211ae.050a0220.55f02.00d8.GAE%40google.com?utm_medium=email&utm_source=footer> >> . >> >> -- > You received this message because you are subscribed to the Google Groups > "blink-dev" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to blink-dev+unsubscr...@chromium.org. > To view this discussion visit > https://groups.google.com/a/chromium.org/d/msgid/blink-dev/866e1227-d7b2-4a7c-bb9e-026cdfc376f7%40chromium.org > <https://groups.google.com/a/chromium.org/d/msgid/blink-dev/866e1227-d7b2-4a7c-bb9e-026cdfc376f7%40chromium.org?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "blink-dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to blink-dev+unsubscr...@chromium.org. To view this discussion visit https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAOmohSJRJ5Z486%3Dbd%3DM8od%2BJdfBE2G8D%3D%3DLbzjnYQmxbc-K2NA%40mail.gmail.com.