Introduce a new flag to reduce TransferSizeUpdated IPC

This CL introduces a new ReduceTransferSizeUpdatedIPC flag.
When this feature is enabled Chromium will send TransferSizeUpdated IPC
from the network service only when DevTools is attached or the request
is for an ad request.
The cost of sending and receiving IPC is not zero. So we hope this can
improve Chromium’s performance and reduce the power consumption.

Note: This feature affects metrics for non-ad resources. We lose the
ability to record incomplete resources in metrics.

# Context
Currently the network service sends the OnTransferSizeUpdated IPC almost
every time it reads the data from the network stack. But the
TransferSizeUpdated IPC is used only for updating DevTools and recording
metrics. Normal users don’t open DevTools while browsing Web pages. And
for normal requests, we don’t need to measure the transferred data size
in real time. The total transferred data can be obtained from
URLLoaderCompletionStatus.encoded_data_length which is passed in
OnComplete() IPC. PageResourceDataUse::DidCompleteResponse() is getting
this value in the renderer process and sending the data to
MetricsWebContentsObserver in the browser process.

But for ad requests, the browser process needs to know the transferred
data size in real time for Heavy ad intervention. So the network service
will continue sending OnTransferSizeUpdated IPC if DevTools is attached
or the request is for an ad even when this feature is enabled.

# History of sending the transfer size
- For legacy IPC, https://crrev.com/80965 started sending the transfer
  size in the existing ResourceMsg_DataReceived IPC to show it in
  DevTools.
- For mojo-loading without network service, https://crrev.com/439697
  started sending the transfer size using a new OnTransferSizeUpdated
  IPC only when DevTools is attached.
- For network service, https://crrev.com/545109 started sending the
  transfer size using the OnTransferSizeUpdated IPC only when DevTools
  is attached. But https://crrev.com/585052 changed it to send the
  OnTransferSizeUpdated IPC even when DevTools is not attached to fix
  the PageLoadMetricsBrowserTest.ReceivedCompleteResources test failure.
  This test is relying on the fact that MetricsWebContentsObserver in
  the browser process can observe the transferred data size even when
  the request is not finished. This is true when the network service
  sends the OnTransferSizeUpdated IPC almost every time it reads the
  data from the network stack. But MetricsWebContentsObserver needs to
  measure the transferred data size in real time only when the request
  is for ad.

Bug: 1502329
Change-Id: I30b536541995565dd5954e579caeefa36b6729a0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5029976
Reviewed-by: John Delaney <johnidel@chromium.org>
Commit-Queue: Tsuyoshi Horo <horo@chromium.org>
Reviewed-by: Clark DuVall <cduvall@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1227178}
13 files changed
tree: 63c869925c07ff138cae459491e138d2f452b8d0
  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. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia_web/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. media/
  31. mojo/
  32. native_client_sdk/
  33. net/
  34. pdf/
  35. ppapi/
  36. printing/
  37. remoting/
  38. rlz/
  39. sandbox/
  40. services/
  41. skia/
  42. sql/
  43. storage/
  44. styleguide/
  45. testing/
  46. third_party/
  47. tools/
  48. ui/
  49. url/
  50. webkit/
  51. .clang-format
  52. .clang-tidy
  53. .eslintrc.js
  54. .git-blame-ignore-revs
  55. .gitattributes
  56. .gitignore
  57. .gitmodules
  58. .gn
  59. .mailmap
  60. .rustfmt.toml
  61. .vpython3
  62. .yapfignore
  63. ATL_OWNERS
  64. AUTHORS
  65. BUILD.gn
  66. CODE_OF_CONDUCT.md
  67. codereview.settings
  68. DEPS
  69. DIR_METADATA
  70. LICENSE
  71. LICENSE.chromium_os
  72. OWNERS
  73. PRESUBMIT.py
  74. PRESUBMIT_test.py
  75. PRESUBMIT_test_mocks.py
  76. README.md
  77. 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.