10 #include "flutter/shell/platform/windows/testing/engine_modifier.h"
11 #include "flutter/shell/platform/windows/testing/flutter_windows_engine_builder.h"
12 #include "flutter/shell/platform/windows/testing/mock_window_binding_handler.h"
13 #include "flutter/shell/platform/windows/testing/windows_test.h"
14 #include "gmock/gmock.h"
15 #include "gtest/gtest.h"
21 using ::testing::Return;
23 class MockFlutterWindowsView :
public FlutterWindowsView {
26 std::unique_ptr<WindowBindingHandler> window)
35 PresentSoftwareBitmap,
36 (
const void* allocation,
size_t row_bytes,
size_t height),
38 MOCK_METHOD(
bool, ClearSoftwareBitmap, (), (
override));
41 FML_DISALLOW_COPY_AND_ASSIGN(MockFlutterWindowsView);
44 class CompositorSoftwareTest :
public WindowsTest {
46 CompositorSoftwareTest() =
default;
47 virtual ~CompositorSoftwareTest() =
default;
50 FlutterWindowsEngine* engine() {
return engine_.get(); }
51 MockFlutterWindowsView* view() {
return view_.get(); }
53 void UseEngineWithView() {
54 FlutterWindowsEngineBuilder builder{GetContext()};
56 auto window = std::make_unique<MockWindowBindingHandler>();
57 EXPECT_CALL(*window.get(), SetView).Times(1);
58 EXPECT_CALL(*window.get(), GetWindowHandle).WillRepeatedly(Return(
nullptr));
60 engine_ = builder.Build();
61 view_ = std::make_unique<MockFlutterWindowsView>(engine_.get(),
66 std::unique_ptr<FlutterWindowsEngine> engine_;
67 std::unique_ptr<MockFlutterWindowsView> view_;
69 FML_DISALLOW_COPY_AND_ASSIGN(CompositorSoftwareTest);
74 TEST_F(CompositorSoftwareTest, CreateBackingStore) {
77 FlutterBackingStoreConfig config = {};
78 FlutterBackingStore backing_store = {};
84 TEST_F(CompositorSoftwareTest, Present) {
89 FlutterBackingStoreConfig config = {};
90 FlutterBackingStore backing_store = {};
94 FlutterLayer layer = {};
95 layer.type = kFlutterLayerContentTypeBackingStore;
96 layer.backing_store = &backing_store;
97 const FlutterLayer* layer_ptr = &layer;
99 EXPECT_CALL(*view(), PresentSoftwareBitmap).WillOnce(Return(
true));
100 EXPECT_TRUE(compositor.
Present(view(), &layer_ptr, 1));
105 TEST_F(CompositorSoftwareTest, PresentEmpty) {
110 EXPECT_CALL(*view(), ClearSoftwareBitmap).WillOnce(Return(
true));
111 EXPECT_TRUE(compositor.
Present(view(),
nullptr, 0));
121 TEST_F(CompositorSoftwareTest, PresentMultiLayers) {
126 FlutterBackingStoreConfig config = {
sizeof(config), {2, 2}};
127 FlutterBackingStore backing_store0 = {
sizeof(FlutterBackingStore),
nullptr};
128 FlutterBackingStore backing_store1 = {
sizeof(FlutterBackingStore),
nullptr};
133 uint32_t pixels0[4] = {0xff000000, 0xff0000ff, 0xff00ff00, 0xffffffff};
134 uint32_t pixels1[4] = {0x7f0000ff, 0x00ffffff, 0x7fff0000, 0xff000000};
136 std::memcpy(
const_cast<void*
>(backing_store0.software.allocation), pixels0,
137 sizeof(uint32_t) * 4);
138 std::memcpy(
const_cast<void*
>(backing_store1.software.allocation), pixels1,
139 sizeof(uint32_t) * 4);
141 FlutterLayer layer0 = {};
142 layer0.type = kFlutterLayerContentTypeBackingStore;
143 layer0.backing_store = &backing_store0;
144 layer0.offset = {0, 0};
145 layer0.size = {2, 2};
147 FlutterLayer layer1 = layer0;
148 layer1.backing_store = &backing_store1;
149 const FlutterLayer* layer_ptr[2] = {&layer0, &layer1};
151 EXPECT_CALL(*view(), PresentSoftwareBitmap)
152 .WillOnce([&](
const void* allocation,
size_t row_bytes,
size_t height) {
153 auto pixel_data =
static_cast<const uint32_t*
>(allocation);
154 EXPECT_EQ(row_bytes, 2 *
sizeof(uint32_t));
155 EXPECT_EQ(height, 2);
156 EXPECT_EQ(pixel_data[0], 0xff00007f);
157 EXPECT_EQ(pixel_data[1], 0xff0000ff);
158 EXPECT_EQ(pixel_data[2], 0xff7f8000);
159 EXPECT_EQ(pixel_data[3], 0xff000000);
162 EXPECT_TRUE(compositor.
Present(view(), layer_ptr, 2));
171 TEST_F(CompositorSoftwareTest, PresentOffsetLayers) {
176 FlutterBackingStoreConfig config0 = {
sizeof(FlutterBackingStoreConfig),
178 FlutterBackingStore backing_store0 = {
sizeof(FlutterBackingStore),
nullptr};
179 FlutterBackingStoreConfig config1 = {
sizeof(FlutterBackingStoreConfig),
181 FlutterBackingStore backing_store1 = {
sizeof(FlutterBackingStore),
nullptr};
186 uint32_t pixels0 = 0xff0000ff;
187 uint32_t pixels1[2] = {0xffff0000, 0xffff0000};
189 std::memcpy(
const_cast<void*
>(backing_store0.software.allocation), &pixels0,
190 sizeof(uint32_t) * 1);
191 std::memcpy(
const_cast<void*
>(backing_store1.software.allocation), pixels1,
192 sizeof(uint32_t) * 2);
194 FlutterLayer layer0 = {};
195 layer0.type = kFlutterLayerContentTypeBackingStore;
196 layer0.backing_store = &backing_store0;
197 layer0.offset = {0, 0};
198 layer0.size = {1, 1};
200 FlutterLayer layer1 = layer0;
201 layer1.backing_store = &backing_store1;
202 layer1.offset = {0, 1};
203 layer1.size = {2, 1};
204 const FlutterLayer* layer_ptr[2] = {&layer0, &layer1};
206 EXPECT_CALL(*view(), PresentSoftwareBitmap)
207 .WillOnce([&](
const void* allocation,
size_t row_bytes,
size_t height) {
208 auto pixel_data =
static_cast<const uint32_t*
>(allocation);
209 EXPECT_EQ(row_bytes, 2 *
sizeof(uint32_t));
210 EXPECT_EQ(height, 2);
211 EXPECT_EQ(pixel_data[0], 0xff0000ff);
212 EXPECT_EQ(pixel_data[1], 0xff000000);
213 EXPECT_EQ(pixel_data[2], 0xffff0000);
214 EXPECT_EQ(pixel_data[3], 0xffff0000);
217 EXPECT_TRUE(compositor.
Present(view(), layer_ptr, 2));
bool CollectBackingStore(const FlutterBackingStore *store) override
|Compositor|
bool Present(FlutterWindowsView *view, const FlutterLayer **layers, size_t layers_count) override
|Compositor|
bool CreateBackingStore(const FlutterBackingStoreConfig &config, FlutterBackingStore *result) override
|Compositor|
FlutterWindowsView(FlutterViewId view_id, FlutterWindowsEngine *engine, std::unique_ptr< WindowBindingHandler > window_binding, bool is_sized_to_content, const BoxConstraints &box_constraints, FlutterWindowsViewSizingDelegate *sizing_delegate=nullptr, std::shared_ptr< WindowsProcTable > windows_proc_table=nullptr)
MOCK_METHOD(void, NotifyWinEventWrapper,(ui::AXPlatformNodeWin *, ax::mojom::Event),(override))
MockFlutterWindowsView(FlutterWindowsEngine *engine, std::unique_ptr< WindowBindingHandler > wbh)
TEST_F(AccessibilityPluginTest, DirectAnnounceCall)
constexpr FlutterViewId kImplicitViewId