[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}
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.