Ship PrefetchFollowsNormalCacheSemantics

This removes the "5-minute rule" for prefetches, where they ignore
normal HTTP cache semantics for 5 minutes and instead stay cached in the
HTTP cache. This applies to <link rel=prefetch>, NoStatePrefetch (i.e.
<link rel=prerender>), and speculation rules prefetch.

Note that for speculation rules prefetch, because there is the separate
in-memory speculation rules prefetch cache, 2xx responses without
caching headers will still be stored in that in-memory cache. They just
won't be HTTP cached, in a way that was counter to the website's
expressed preferences.

Shipping this was approved back in May 2023, with an accompanying Finch
study to check for regressions [1]. However, we forgot to actually
change the default.

This is of new urgency now because of the impact on speculation rules
prefetch, which is is causing web developer pain. A web platform test is
included for the specific painful scenario, which fails before this
change and passes afterward.

Most of this CL consists of test updates: many of our tests relied on
not needing caching headers to make <link rel=prefetch> or
<link rel=prerender> work, and so do things like assume there will never
be a second request to those URLs. The general fix is to apply caching
headers to the resources in question, as that represents the intended
real-world usage of <link rel=prefetch>. (And, to a lesser extent, the
nonstandard and hopefully-one-day-removed <link rel=prerender>.)

Notably, the WPT prefetch-document.html was failing in all browsers
before this, including in Firefox which has a highly spec-conformant
implementation. It should now be passing.

PrerendererImplBrowserTestPrefetchAhead.PrefetchSuccessPrefetchMatchResolverTimeoutPrerenderFailure
was disabled, since it appears to never have been working as expected,
with the HTTP caching hiding the real problem. Issue 372851198 tracks
fixing that test.

Tests specifically for the 5-minute rule were deleted.

[1]: https://groups.google.com/a/chromium.org/g/blink-dev/c/Zdo71C0k9C0

Bug: 40232065, 381099745, 356624471, 372851198
Change-Id: I7d42c43efd89486587d8b7fc8ddd4412b31ef0bf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6056830
Reviewed-by: Rakina Zata Amni <rakina@chromium.org>
Commit-Queue: Domenic Denicola <domenic@chromium.org>
Reviewed-by: Adam Rice <ricea@chromium.org>
Reviewed-by: Hiroki Nakagawa <nhiroki@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1390213}
26 files changed
tree: 826cc1c2d94a68018ea641eb26c816664d1f99cc
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. codelabs/
  13. components/
  14. content/
  15. crypto/
  16. dbus/
  17. device/
  18. docs/
  19. extensions/
  20. fuchsia_web/
  21. gin/
  22. google_apis/
  23. gpu/
  24. headless/
  25. infra/
  26. ios/
  27. ipc/
  28. media/
  29. mojo/
  30. native_client_sdk/
  31. net/
  32. pdf/
  33. ppapi/
  34. printing/
  35. remoting/
  36. rlz/
  37. sandbox/
  38. services/
  39. skia/
  40. sql/
  41. storage/
  42. styleguide/
  43. testing/
  44. third_party/
  45. tools/
  46. ui/
  47. url/
  48. webkit/
  49. .clang-format
  50. .clang-tidy
  51. .clangd
  52. .git-blame-ignore-revs
  53. .gitallowed
  54. .gitattributes
  55. .gitignore
  56. .gitmodules
  57. .gn
  58. .mailmap
  59. .rustfmt.toml
  60. .vpython3
  61. .yapfignore
  62. ATL_OWNERS
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. CPPLINT.cfg
  68. CRYPTO_OWNERS
  69. DEPS
  70. DIR_METADATA
  71. LICENSE
  72. LICENSE.chromium_os
  73. OWNERS
  74. PRESUBMIT.py
  75. PRESUBMIT_test.py
  76. PRESUBMIT_test_mocks.py
  77. README.md
  78. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure.

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.

If you found a bug, please file it at https://crbug.com/new.