Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit df0b200

Browse files
authored
[Windows] Introduce FlutterWindowsViewController (#47242)
This change begins the migration to the Windows embedder's new ownership model: 1. Renames `FlutterDesktopViewControllerState` to `FlutterWindowsViewController` 2. Moves ownership of the `FlutterWindowsEngine` from the `FlutterWindowsView` to the `FlutterWindowsViewController` For more information, refer to: [flutter.dev/go/windows-multi-view-ownership-updates](https://flutter.dev/go/windows-multi-view-ownership-updates) Part of flutter/flutter#137267 [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
1 parent c18f8f1 commit df0b200

13 files changed

+178
-126
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3927,6 +3927,7 @@ ORIGIN: ../../../flutter/shell/platform/windows/flutter_windows_texture_registra
39273927
ORIGIN: ../../../flutter/shell/platform/windows/flutter_windows_texture_registrar.h + ../../../flutter/LICENSE
39283928
ORIGIN: ../../../flutter/shell/platform/windows/flutter_windows_view.cc + ../../../flutter/LICENSE
39293929
ORIGIN: ../../../flutter/shell/platform/windows/flutter_windows_view.h + ../../../flutter/LICENSE
3930+
ORIGIN: ../../../flutter/shell/platform/windows/flutter_windows_view_controller.h + ../../../flutter/LICENSE
39303931
ORIGIN: ../../../flutter/shell/platform/windows/keyboard_handler_base.h + ../../../flutter/LICENSE
39313932
ORIGIN: ../../../flutter/shell/platform/windows/keyboard_key_channel_handler.cc + ../../../flutter/LICENSE
39323933
ORIGIN: ../../../flutter/shell/platform/windows/keyboard_key_channel_handler.h + ../../../flutter/LICENSE
@@ -6733,6 +6734,7 @@ FILE: ../../../flutter/shell/platform/windows/flutter_windows_texture_registrar.
67336734
FILE: ../../../flutter/shell/platform/windows/flutter_windows_texture_registrar.h
67346735
FILE: ../../../flutter/shell/platform/windows/flutter_windows_view.cc
67356736
FILE: ../../../flutter/shell/platform/windows/flutter_windows_view.h
6737+
FILE: ../../../flutter/shell/platform/windows/flutter_windows_view_controller.h
67366738
FILE: ../../../flutter/shell/platform/windows/keyboard_handler_base.h
67376739
FILE: ../../../flutter/shell/platform/windows/keyboard_key_channel_handler.cc
67386740
FILE: ../../../flutter/shell/platform/windows/keyboard_key_channel_handler.h

shell/platform/windows/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ source_set("flutter_windows_source") {
6969
"flutter_windows_texture_registrar.h",
7070
"flutter_windows_view.cc",
7171
"flutter_windows_view.h",
72+
"flutter_windows_view_controller.h",
7273
"keyboard_handler_base.h",
7374
"keyboard_key_channel_handler.cc",
7475
"keyboard_key_channel_handler.h",

shell/platform/windows/accessibility_bridge_windows_unittests.cc

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,11 @@ std::shared_ptr<AccessibilityBridgeWindowsSpy> GetAccessibilityBridgeSpy(
186186
void ExpectWinEventFromAXEvent(int32_t node_id,
187187
ui::AXEventGenerator::Event ax_event,
188188
ax::mojom::Event expected_event) {
189+
auto engine = GetTestEngine();
189190
auto window_binding_handler =
190191
std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
191192
FlutterWindowsViewSpy view(std::move(window_binding_handler));
192-
view.SetEngine(GetTestEngine());
193+
view.SetEngine(engine.get());
193194
view.OnUpdateSemanticsEnabled(true);
194195

195196
auto bridge = GetAccessibilityBridgeSpy(view);
@@ -206,10 +207,11 @@ void ExpectWinEventFromAXEventOnFocusNode(int32_t node_id,
206207
ui::AXEventGenerator::Event ax_event,
207208
ax::mojom::Event expected_event,
208209
int32_t focus_id) {
210+
auto engine = GetTestEngine();
209211
auto window_binding_handler =
210212
std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
211213
FlutterWindowsViewSpy view(std::move(window_binding_handler));
212-
view.SetEngine(GetTestEngine());
214+
view.SetEngine(engine.get());
213215
view.OnUpdateSemanticsEnabled(true);
214216

215217
auto bridge = GetAccessibilityBridgeSpy(view);
@@ -231,10 +233,11 @@ void ExpectWinEventFromAXEventOnFocusNode(int32_t node_id,
231233
} // namespace
232234

233235
TEST(AccessibilityBridgeWindows, GetParent) {
236+
auto engine = GetTestEngine();
234237
auto window_binding_handler =
235238
std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
236239
FlutterWindowsViewSpy view(std::move(window_binding_handler));
237-
view.SetEngine(GetTestEngine());
240+
view.SetEngine(engine.get());
238241
view.OnUpdateSemanticsEnabled(true);
239242

240243
auto bridge = view.accessibility_bridge().lock();
@@ -247,10 +250,11 @@ TEST(AccessibilityBridgeWindows, GetParent) {
247250
}
248251

249252
TEST(AccessibilityBridgeWindows, GetParentOnRootRetunsNullptr) {
253+
auto engine = GetTestEngine();
250254
auto window_binding_handler =
251255
std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
252256
FlutterWindowsViewSpy view(std::move(window_binding_handler));
253-
view.SetEngine(GetTestEngine());
257+
view.SetEngine(engine.get());
254258
view.OnUpdateSemanticsEnabled(true);
255259

256260
auto bridge = view.accessibility_bridge().lock();
@@ -261,10 +265,11 @@ TEST(AccessibilityBridgeWindows, GetParentOnRootRetunsNullptr) {
261265
}
262266

263267
TEST(AccessibilityBridgeWindows, DispatchAccessibilityAction) {
268+
auto engine = GetTestEngine();
264269
auto window_binding_handler =
265270
std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
266271
FlutterWindowsViewSpy view(std::move(window_binding_handler));
267-
view.SetEngine(GetTestEngine());
272+
view.SetEngine(engine.get());
268273
view.OnUpdateSemanticsEnabled(true);
269274

270275
auto bridge = view.accessibility_bridge().lock();
@@ -297,10 +302,11 @@ TEST(AccessibilityBridgeWindows, OnAccessibilityEventChildrenChanged) {
297302
}
298303

299304
TEST(AccessibilityBridgeWindows, OnAccessibilityEventFocusChanged) {
305+
auto engine = GetTestEngine();
300306
auto window_binding_handler =
301307
std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
302308
FlutterWindowsViewSpy view(std::move(window_binding_handler));
303-
view.SetEngine(GetTestEngine());
309+
view.SetEngine(engine.get());
304310
view.OnUpdateSemanticsEnabled(true);
305311

306312
auto bridge = GetAccessibilityBridgeSpy(view);

shell/platform/windows/flutter_windows.cc

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "flutter/shell/platform/windows/flutter_window.h"
2323
#include "flutter/shell/platform/windows/flutter_windows_engine.h"
2424
#include "flutter/shell/platform/windows/flutter_windows_view.h"
25+
#include "flutter/shell/platform/windows/flutter_windows_view_controller.h"
2526
#include "flutter/shell/platform/windows/window_binding_handler.h"
2627
#include "flutter/shell/platform/windows/window_state.h"
2728

@@ -39,6 +40,16 @@ static FlutterDesktopEngineRef HandleForEngine(
3940
return reinterpret_cast<FlutterDesktopEngineRef>(engine);
4041
}
4142

43+
static flutter::FlutterWindowsViewController* ViewControllerFromHandle(
44+
FlutterDesktopViewControllerRef ref) {
45+
return reinterpret_cast<flutter::FlutterWindowsViewController*>(ref);
46+
}
47+
48+
static FlutterDesktopViewControllerRef HandleForViewController(
49+
flutter::FlutterWindowsViewController* view_controller) {
50+
return reinterpret_cast<FlutterDesktopViewControllerRef>(view_controller);
51+
}
52+
4253
// Returns the view corresponding to the given opaque API handle.
4354
static flutter::FlutterWindowsView* ViewFromHandle(FlutterDesktopViewRef ref) {
4455
return reinterpret_cast<flutter::FlutterWindowsView*>(ref);
@@ -64,58 +75,65 @@ static FlutterDesktopTextureRegistrarRef HandleForTextureRegistrar(
6475
FlutterDesktopViewControllerRef FlutterDesktopViewControllerCreate(
6576
int width,
6677
int height,
67-
FlutterDesktopEngineRef engine) {
78+
FlutterDesktopEngineRef engine_ref) {
6879
std::unique_ptr<flutter::WindowBindingHandler> window_wrapper =
6980
std::make_unique<flutter::FlutterWindow>(width, height);
7081

71-
auto state = std::make_unique<FlutterDesktopViewControllerState>();
72-
state->view =
82+
auto engine = std::unique_ptr<flutter::FlutterWindowsEngine>(
83+
EngineFromHandle(engine_ref));
84+
auto view =
7385
std::make_unique<flutter::FlutterWindowsView>(std::move(window_wrapper));
74-
// Take ownership of the engine, starting it if necessary.
75-
state->view->SetEngine(
76-
std::unique_ptr<flutter::FlutterWindowsEngine>(EngineFromHandle(engine)));
77-
state->view->CreateRenderSurface();
78-
if (!state->view->GetEngine()->running()) {
79-
if (!state->view->GetEngine()->Run()) {
86+
auto controller = std::make_unique<flutter::FlutterWindowsViewController>(
87+
std::move(engine), std::move(view));
88+
89+
controller->view()->SetEngine(controller->engine());
90+
controller->view()->CreateRenderSurface();
91+
if (!controller->engine()->running()) {
92+
if (!controller->engine()->Run()) {
8093
return nullptr;
8194
}
8295
}
8396

8497
// Must happen after engine is running.
85-
state->view->SendInitialBounds();
86-
state->view->SendInitialAccessibilityFeatures();
87-
return state.release();
98+
controller->view()->SendInitialBounds();
99+
controller->view()->SendInitialAccessibilityFeatures();
100+
101+
return HandleForViewController(controller.release());
88102
}
89103

90-
void FlutterDesktopViewControllerDestroy(
91-
FlutterDesktopViewControllerRef controller) {
104+
void FlutterDesktopViewControllerDestroy(FlutterDesktopViewControllerRef ref) {
105+
auto controller = ViewControllerFromHandle(ref);
92106
delete controller;
93107
}
94108

95109
FlutterDesktopEngineRef FlutterDesktopViewControllerGetEngine(
96-
FlutterDesktopViewControllerRef controller) {
97-
return HandleForEngine(controller->view->GetEngine());
110+
FlutterDesktopViewControllerRef ref) {
111+
auto controller = ViewControllerFromHandle(ref);
112+
return HandleForEngine(controller->engine());
98113
}
99114

100115
FlutterDesktopViewRef FlutterDesktopViewControllerGetView(
101-
FlutterDesktopViewControllerRef controller) {
102-
return HandleForView(controller->view.get());
116+
FlutterDesktopViewControllerRef ref) {
117+
auto controller = ViewControllerFromHandle(ref);
118+
return HandleForView(controller->view());
103119
}
104120

105121
void FlutterDesktopViewControllerForceRedraw(
106-
FlutterDesktopViewControllerRef controller) {
107-
controller->view->ForceRedraw();
122+
FlutterDesktopViewControllerRef ref) {
123+
auto controller = ViewControllerFromHandle(ref);
124+
controller->view()->ForceRedraw();
108125
}
109126

110127
bool FlutterDesktopViewControllerHandleTopLevelWindowProc(
111-
FlutterDesktopViewControllerRef controller,
128+
FlutterDesktopViewControllerRef ref,
112129
HWND hwnd,
113130
UINT message,
114131
WPARAM wparam,
115132
LPARAM lparam,
116133
LRESULT* result) {
134+
auto controller = ViewControllerFromHandle(ref);
117135
std::optional<LRESULT> delegate_result =
118-
controller->view->GetEngine()
136+
controller->engine()
119137
->window_proc_delegate_manager()
120138
->OnTopLevelWindowProc(hwnd, message, wparam, lparam);
121139
if (delegate_result) {

0 commit comments

Comments
 (0)