| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "third_party/blink/renderer/core/html/canvas/html_canvas_element.h" |
| |
| #include "third_party/blink/renderer/core/paint/paint_layer.h" |
| #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" |
| |
| namespace blink { |
| |
| class HTMLCanvasElementTest : public RenderingTest { |
| public: |
| HTMLCanvasElementTest() |
| : RenderingTest(MakeGarbageCollected<SingleChildLocalFrameClient>()) {} |
| }; |
| |
| TEST_F(HTMLCanvasElementTest, CreateLayerUpdatesCompositing) { |
| // Enable script so that the canvas will create a LayoutHTMLCanvas. |
| GetDocument().GetSettings()->SetScriptEnabled(true); |
| |
| SetBodyInnerHTML("<canvas id='canvas'></canvas>"); |
| auto* canvas = To<HTMLCanvasElement>(GetDocument().getElementById("canvas")); |
| auto* layer = GetPaintLayerByElementId("canvas"); |
| ASSERT_TRUE(layer); |
| EXPECT_EQ(CompositingReason::kNone, layer->DirectCompositingReasons()); |
| |
| EXPECT_FALSE(layer->NeedsCompositingInputsUpdate()); |
| canvas->CreateLayer(); |
| EXPECT_TRUE(layer->NeedsCompositingInputsUpdate()); |
| UpdateAllLifecyclePhasesForTest(); |
| ASSERT_EQ(layer, |
| To<LayoutBoxModelObject>(canvas->GetLayoutObject())->Layer()); |
| EXPECT_EQ(CompositingReason::kCanvas, layer->DirectCompositingReasons()); |
| } |
| |
| TEST_F(HTMLCanvasElementTest, CanvasInvalidation) { |
| GetDocument().GetSettings()->SetScriptEnabled(true); |
| |
| SetBodyInnerHTML("<canvas id='canvas' width='10px' height='10px'></canvas>"); |
| EXPECT_FALSE( |
| GetDocument().GetPage()->Animator().has_canvas_invalidation_for_test()); |
| auto* script = GetDocument().CreateRawElement(html_names::kScriptTag); |
| script->setTextContent(R"JS( |
| var canvas = document.getElementById('canvas'); |
| var ctx = canvas.getContext('2d'); |
| ctx.fillStyle = 'green'; |
| ctx.fillRect(0, 0, 10, 10); |
| )JS"); |
| GetDocument().body()->appendChild(script); |
| EXPECT_TRUE( |
| GetDocument().GetPage()->Animator().has_canvas_invalidation_for_test()); |
| RunDocumentLifecycle(); |
| EXPECT_FALSE( |
| GetDocument().GetPage()->Animator().has_canvas_invalidation_for_test()); |
| } |
| |
| TEST_F(HTMLCanvasElementTest, CanvasNotInvalidatedOnFirstFrameInDOM) { |
| GetDocument().GetSettings()->SetScriptEnabled(true); |
| EXPECT_FALSE( |
| GetDocument().GetPage()->Animator().has_canvas_invalidation_for_test()); |
| auto* script = GetDocument().CreateRawElement(html_names::kScriptTag); |
| script->setTextContent(R"JS( |
| var canvas = document.createElement('canvas'); |
| document.body.appendChild(canvas); |
| var ctx = canvas.getContext('2d'); |
| ctx.fillStyle = 'green'; |
| ctx.fillRect(0, 0, 10, 10); |
| )JS"); |
| GetDocument().body()->appendChild(script); |
| EXPECT_FALSE( |
| GetDocument().GetPage()->Animator().has_canvas_invalidation_for_test()); |
| } |
| |
| TEST_F(HTMLCanvasElementTest, CanvasNotInvalidatedOnFirstPaint) { |
| GetDocument().GetSettings()->SetScriptEnabled(true); |
| SetBodyInnerHTML("<canvas id='canvas' style='display:none'></canvas>"); |
| EXPECT_FALSE( |
| GetDocument().GetPage()->Animator().has_canvas_invalidation_for_test()); |
| RunDocumentLifecycle(); |
| auto* script = GetDocument().CreateRawElement(html_names::kScriptTag); |
| script->setTextContent(R"JS( |
| var canvas = document.getElementById('canvas'); |
| canvas.style.display = 'block'; |
| var ctx = canvas.getContext('2d'); |
| ctx.fillStyle = 'green'; |
| ctx.fillRect(0, 0, 10, 10); |
| )JS"); |
| GetDocument().body()->appendChild(script); |
| EXPECT_FALSE( |
| GetDocument().GetPage()->Animator().has_canvas_invalidation_for_test()); |
| } |
| |
| TEST_F(HTMLCanvasElementTest, CanvasInvalidationInFrame) { |
| SetBodyInnerHTML(R"HTML( |
| <iframe id='iframe'></iframe> |
| )HTML"); |
| SetChildFrameHTML(R"HTML( |
| <canvas id='canvas' width='10px' height='10px'></canvas> |
| )HTML"); |
| |
| GetDocument().GetSettings()->SetScriptEnabled(true); |
| ChildDocument().GetSettings()->SetScriptEnabled(true); |
| EXPECT_FALSE( |
| ChildDocument().GetPage()->Animator().has_canvas_invalidation_for_test()); |
| RunDocumentLifecycle(); |
| auto* script = ChildDocument().CreateRawElement(html_names::kScriptTag); |
| script->setTextContent(R"JS( |
| var canvas = document.getElementById('canvas'); |
| var ctx = canvas.getContext('2d'); |
| ctx.fillStyle = 'green'; |
| ctx.fillRect(0, 0, 10, 10); |
| )JS"); |
| ChildDocument().body()->appendChild(script); |
| EXPECT_TRUE( |
| GetDocument().GetPage()->Animator().has_canvas_invalidation_for_test()); |
| } |
| |
| } // namespace blink |