[Blink] Have ReplaceExistingResourceProvider not destroy/recreate bridge

HTMLCanvasElement::ReplaceExistingResourceProviderFor2DContext()
currently does the following [1] (note that the code flow is a little
convoluted, but this is effectively what happens):

a. Bails out if there is no current resource provider
b. Clears the current resource provider
c. Tries to create a new resource provider and bails out if it can't be
   created
d. Replaces the current Canvas2DLayerBridge ivar with a newly-created
   one, with the current one being destroyed when the method returns

This CL removes (d) as prep for eliminating Canvas2DLayerBridge
altogether. The reasoning for the removal is as follows:

* The net effect of (d) is that if hibernation was pending or active
  when the code reaches (d), it will no longer be after execution of (d)
* It is in fact not possible for hibernation to be active when the code
  reaches (d) as the resource provider is dropped on starting
  hibernation [2] and hence the code would bail out at (a) (note that
  if the resource provider were recreated in the interim hibernation
  would have been ended [3]).
* Hence, the only case we need to reason about is hibernation being
  pending (i.e, [4] has been invoked but HibernateOrLogFailure() is
  still pending)
* ReplaceExistingResourceProviderFor2DContext() is called from
  DisableAcceleration() and RecreateCanvasInGPURasterMode()
* DisableAcceleration() switches the canvas to CPU raster mode. In this
  case, a pending hibernation will be aborted when it triggers assuming
  that there is no switch back to GPU raster mode in between [5].
* RecreateCanvasInGPURasterMode() is called only when the canvas is in
  CPU raster mode [6][7]. When the canvas is in CPU raster mode,
  hibernation will not be initiated [8]. Hence, if there is a
  hibernation pending when this method is called it must be the case
  that the canvas was in GPU raster mode when hibernation was initiated,
  was subsequently switched to CPU raster mode, and is now being
  switched *back* to GPU raster mode.

The net effect of this reasoning is that the only behavioral impact of
this change is the following:

* If while hibernation is pending there is a switch from GPU raster to
  CPU raster and then back to GPU raster via DisableAcceleration() and
  RecreateCanvasInGPURasterMode(), the pending hibernation will not be
  dropped, whereas in the current code structure that pending
  hibernation *will* be dropped on the call to DisableAcceleration().

This behavioral change seems harmless and in fact beneficial.

The changes to the tests in this CL reflect the behavioral impact:

* A "sticky" switch to CPU raster mode while hibernation is pending will
  still cause hibernation to be aborted
* A switch to CPU raster mode and then back to GPU raster mode while
  hibernation is pending will now *not* caused hibernation to be aborted

[1] https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/canvas/html_canvas_element.cc;l=1979;drc=f39c57f31413abcb41d3068cfb2c7a1718003cc5;bpv=1;bpt=1?q=ReplaceExistingResource&sq=&ss=chromium%2Fchromium%2Fsrc
[2] https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/graphics/canvas_hibernation_handler.cc;l=456;drc=f39c57f31413abcb41d3068cfb2c7a1718003cc5?q=HibernateOrL&ss=chromium
[3] https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/canvas/html_canvas_element.cc;l=2116;drc=f39c57f31413abcb41d3068cfb2c7a1718003cc5
[4] https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/graphics/canvas_hibernation_handler.cc;l=485;drc=f39c57f31413abcb41d3068cfb2c7a1718003cc5;bpv=1;bpt=1
[5] https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/graphics/canvas_hibernation_handler.cc;l=427-432;drc=f39c57f31413abcb41d3068cfb2c7a1718003cc5?q=HibernateOrL&ss=chromium
[6] https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/canvas/html_canvas_element.cc;l=1716-1719;drc=f39c57f31413abcb41d3068cfb2c7a1718003cc5?q=RecreateCanvasInGp&ss=chromium
[7] https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/canvas/html_canvas_element.cc;l=1726-1727;drc=f39c57f31413abcb41d3068cfb2c7a1718003cc5?q=RecreateCanvasInGp&ss=chromium
[8] https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc;l=931-933;drc=f39c57f31413abcb41d3068cfb2c7a1718003cc5;bpv=1;bpt=1

Bug: 371227617
Change-Id: Ib694df8e66d1defd9f19a06a53d3deca0466eda5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6075282
Reviewed-by: Jean-Philippe Gravel <jpgravel@chromium.org>
Commit-Queue: Colin Blundell <blundell@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1404044}
2 files changed
tree: 76a96160cbb367d11bdc7126dd46be5232222b4b
  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.