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

Commit 69ae569

Browse files
Do not register UI-related native functions in secondary isolates (#6401)
Fixes flutter/flutter#22478
1 parent 19c135c commit 69ae569

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

lib/ui/dart_ui.cc

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,29 @@ namespace blink {
3535
namespace {
3636

3737
static tonic::DartLibraryNatives* g_natives;
38+
static tonic::DartLibraryNatives* g_natives_secondary;
3839

3940
Dart_NativeFunction GetNativeFunction(Dart_Handle name,
4041
int argument_count,
4142
bool* auto_setup_scope) {
4243
return g_natives->GetNativeFunction(name, argument_count, auto_setup_scope);
4344
}
4445

46+
Dart_NativeFunction GetNativeFunctionSecondary(Dart_Handle name,
47+
int argument_count,
48+
bool* auto_setup_scope) {
49+
return g_natives_secondary->GetNativeFunction(name, argument_count,
50+
auto_setup_scope);
51+
}
52+
4553
const uint8_t* GetSymbol(Dart_NativeFunction native_function) {
4654
return g_natives->GetSymbol(native_function);
4755
}
4856

57+
const uint8_t* GetSymbolSecondary(Dart_NativeFunction native_function) {
58+
return g_natives_secondary->GetSymbol(native_function);
59+
}
60+
4961
} // namespace
5062

5163
void DartUI::InitForGlobal() {
@@ -73,13 +85,20 @@ void DartUI::InitForGlobal() {
7385
SemanticsUpdateBuilder::RegisterNatives(g_natives);
7486
Vertices::RegisterNatives(g_natives);
7587
Window::RegisterNatives(g_natives);
88+
89+
// Secondary isolates do not provide UI-related APIs.
90+
g_natives_secondary = new tonic::DartLibraryNatives();
91+
DartRuntimeHooks::RegisterNatives(g_natives_secondary);
7692
}
7793
}
7894

79-
void DartUI::InitForIsolate() {
95+
void DartUI::InitForIsolate(bool is_root_isolate) {
8096
FML_DCHECK(g_natives);
97+
auto get_native_function =
98+
is_root_isolate ? GetNativeFunction : GetNativeFunctionSecondary;
99+
auto get_symbol = is_root_isolate ? GetSymbol : GetSymbolSecondary;
81100
DART_CHECK_VALID(Dart_SetNativeResolver(Dart_LookupLibrary(ToDart("dart:ui")),
82-
GetNativeFunction, GetSymbol));
101+
get_native_function, get_symbol));
83102
}
84103

85104
} // namespace blink

lib/ui/dart_ui.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace blink {
1212
class DartUI {
1313
public:
1414
static void InitForGlobal();
15-
static void InitForIsolate();
15+
static void InitForIsolate(bool is_root_isolate);
1616

1717
private:
1818
FML_DISALLOW_IMPLICIT_CONSTRUCTORS(DartUI);

runtime/dart_isolate.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ bool DartIsolate::LoadLibraries(bool is_root_isolate) {
243243

244244
DartIO::InitForIsolate();
245245

246-
DartUI::InitForIsolate();
246+
DartUI::InitForIsolate(is_root_isolate);
247247

248248
const bool is_service_isolate = Dart_IsServiceIsolate(isolate());
249249

0 commit comments

Comments
 (0)