[go: nahoru, domu]

Fetch: Track side_data_blob in BodyStreamBuffer.

In crrev.com/c/1836391 we began always storing the cache_storage entry
blob in the fetch_api_response's side_data_blob field.  This allowed us
to provide code cache data when the main body was provided as either
a blob or as a data pipe.

Unfortunately, this had an unanticipated side effect.  A Response
object's side_data_blob is never cleared.  Therefore that blob handle
is retained until the Response object is garbage collected; even if the
Response body was completely drained.  This in turn holds the
cache_storage entry open which can cause further problems as described
in crbug/1070389.

The problem here is that the side_data_blob should have the same life
time as the main body, but instead its held in the Response object which
does not directly have this information.

This CL fixes the issue by moving the side_data_blob down into the
BodyStreamBuffer class.  This allows to drop its reference once the body
is drained or begins loading.  This fixes the data retention issue for
all possible uses of Response.

Note, however, this only partially fixes crbug/1070389.  Its still
possible for cache_storage entries to be held open for legitimate
reasons; e.g. script holding alive an unconsumed Response object.  To
fix those further issues will require additional changes in simple
disk_cache.

Bug: 1010624,1070389
Change-Id: I2f9d29f346248e233bf3933e1da287d9e493074a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2172584
Commit-Queue: Ben Kelly <wanderview@chromium.org>
Reviewed-by: Tsuyoshi Horo <horo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#764678}
9 files changed
tree: 6a9830cbd8f16302ab96ccc9925c66990fa61e67
  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. cloud_print/
  13. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. jingle/
  31. media/
  32. mojo/
  33. native_client_sdk/
  34. net/
  35. pdf/
  36. ppapi/
  37. printing/
  38. remoting/
  39. rlz/
  40. sandbox/
  41. services/
  42. skia/
  43. sql/
  44. storage/
  45. styleguide/
  46. testing/
  47. third_party/
  48. tools/
  49. ui/
  50. url/
  51. weblayer/
  52. .clang-format
  53. .clang-tidy
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  56. .gitattributes
  57. .gitignore
  58. .gn
  59. .vpython
  60. .vpython3
  61. .yapfignore
  62. AUTHORS
  63. BUILD.gn
  64. CODE_OF_CONDUCT.md
  65. codereview.settings
  66. DEPS
  67. ENG_REVIEW_OWNERS
  68. LICENSE
  69. LICENSE.chromium_os
  70. OWNERS
  71. PRESUBMIT.py
  72. PRESUBMIT_test.py
  73. PRESUBMIT_test_mocks.py
  74. README.md
  75. 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.

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.