Commit 8f2a0ab1 authored by Kenneth Russell's avatar Kenneth Russell Committed by Commit Bot

Fix canvas rate limiting for certain canvas scenarios.

In certain situations the "SetIsBeingDisplayed" notification for
CanvasRenderingContext2D - coming from HTMLCanvasElement - occurs
before the Canvas2DLayerBridge is allocated. In order to reliably
allocate the rate limiter when needed, set the display status of the
Canvas2DLayerBridge upon its allocation / installation.

Bug: 1038670
Tbr: fserb@chromium.org
Change-Id: I8029462ec7c94f4644763cd8b662471b69a7d64b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1999085
Commit-Queue: Kenneth Russell <kbr@chromium.org>
Reviewed-by: default avatarPhilip Rogers <pdr@chromium.org>
Reviewed-by: default avatarJuanmi Huertas <juanmihd@chromium.org>
Cr-Commit-Position: refs/heads/master@{#732282}
parent 92e35fbe
...@@ -1106,11 +1106,15 @@ void HTMLCanvasElement::SetCanvas2DLayerBridgeInternal( ...@@ -1106,11 +1106,15 @@ void HTMLCanvasElement::SetCanvas2DLayerBridgeInternal(
canvas2d_bridge_ = CreateUnaccelerated2dBuffer(); canvas2d_bridge_ = CreateUnaccelerated2dBuffer();
} }
if (canvas2d_bridge_) if (!canvas2d_bridge_)
canvas2d_bridge_->SetCanvasResourceHost(this);
else
return; return;
canvas2d_bridge_->SetCanvasResourceHost(this);
bool is_being_displayed =
GetLayoutObject() && GetComputedStyle() &&
GetComputedStyle()->Visibility() == EVisibility::kVisible;
canvas2d_bridge_->SetIsBeingDisplayed(is_being_displayed);
did_fail_to_create_resource_provider_ = false; did_fail_to_create_resource_provider_ = false;
UpdateMemoryUsage(); UpdateMemoryUsage();
......
...@@ -674,7 +674,7 @@ scoped_refptr<StaticBitmapImage> blink::CanvasRenderingContext2D::GetImage( ...@@ -674,7 +674,7 @@ scoped_refptr<StaticBitmapImage> blink::CanvasRenderingContext2D::GetImage(
void CanvasRenderingContext2D::FinalizeFrame() { void CanvasRenderingContext2D::FinalizeFrame() {
TRACE_EVENT0("blink", "CanvasRenderingContext2D::FinalizeFrame"); TRACE_EVENT0("blink", "CanvasRenderingContext2D::FinalizeFrame");
if (canvas() && canvas()->GetCanvas2DLayerBridge()) if (IsPaintable())
canvas()->GetCanvas2DLayerBridge()->FinalizeFrame(); canvas()->GetCanvas2DLayerBridge()->FinalizeFrame();
usage_counters_.num_frames_since_reset++; usage_counters_.num_frames_since_reset++;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment