blob: c26335499100702cf6a65b32b677f4ab2e02d5f4 [file] [log] [blame]
// 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