From 72f11adacc08d9a3a25f43aa017ca87a93f7d0ab Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Mon, 1 Oct 2018 17:09:17 -0700 Subject: [PATCH] Do not register UI-related native functions in secondary isolates Fixes https://github.com/flutter/flutter/issues/22478 --- lib/ui/dart_ui.cc | 23 +++++++++++++++++++++-- lib/ui/dart_ui.h | 2 +- runtime/dart_isolate.cc | 2 +- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/ui/dart_ui.cc b/lib/ui/dart_ui.cc index 5fb48d436e99b..0d1e18c645ba5 100644 --- a/lib/ui/dart_ui.cc +++ b/lib/ui/dart_ui.cc @@ -35,6 +35,7 @@ namespace blink { namespace { static tonic::DartLibraryNatives* g_natives; +static tonic::DartLibraryNatives* g_natives_secondary; Dart_NativeFunction GetNativeFunction(Dart_Handle name, int argument_count, @@ -42,10 +43,21 @@ Dart_NativeFunction GetNativeFunction(Dart_Handle name, return g_natives->GetNativeFunction(name, argument_count, auto_setup_scope); } +Dart_NativeFunction GetNativeFunctionSecondary(Dart_Handle name, + int argument_count, + bool* auto_setup_scope) { + return g_natives_secondary->GetNativeFunction(name, argument_count, + auto_setup_scope); +} + const uint8_t* GetSymbol(Dart_NativeFunction native_function) { return g_natives->GetSymbol(native_function); } +const uint8_t* GetSymbolSecondary(Dart_NativeFunction native_function) { + return g_natives_secondary->GetSymbol(native_function); +} + } // namespace void DartUI::InitForGlobal() { @@ -73,13 +85,20 @@ void DartUI::InitForGlobal() { SemanticsUpdateBuilder::RegisterNatives(g_natives); Vertices::RegisterNatives(g_natives); Window::RegisterNatives(g_natives); + + // Secondary isolates do not provide UI-related APIs. + g_natives_secondary = new tonic::DartLibraryNatives(); + DartRuntimeHooks::RegisterNatives(g_natives_secondary); } } -void DartUI::InitForIsolate() { +void DartUI::InitForIsolate(bool is_root_isolate) { FML_DCHECK(g_natives); + auto get_native_function = + is_root_isolate ? GetNativeFunction : GetNativeFunctionSecondary; + auto get_symbol = is_root_isolate ? GetSymbol : GetSymbolSecondary; DART_CHECK_VALID(Dart_SetNativeResolver(Dart_LookupLibrary(ToDart("dart:ui")), - GetNativeFunction, GetSymbol)); + get_native_function, get_symbol)); } } // namespace blink diff --git a/lib/ui/dart_ui.h b/lib/ui/dart_ui.h index 4c00bda211a44..dc5fecac3f5f6 100644 --- a/lib/ui/dart_ui.h +++ b/lib/ui/dart_ui.h @@ -12,7 +12,7 @@ namespace blink { class DartUI { public: static void InitForGlobal(); - static void InitForIsolate(); + static void InitForIsolate(bool is_root_isolate); private: FML_DISALLOW_IMPLICIT_CONSTRUCTORS(DartUI); diff --git a/runtime/dart_isolate.cc b/runtime/dart_isolate.cc index 7aa7939301363..db01e619cba32 100644 --- a/runtime/dart_isolate.cc +++ b/runtime/dart_isolate.cc @@ -243,7 +243,7 @@ bool DartIsolate::LoadLibraries(bool is_root_isolate) { DartIO::InitForIsolate(); - DartUI::InitForIsolate(); + DartUI::InitForIsolate(is_root_isolate); const bool is_service_isolate = Dart_IsServiceIsolate(isolate());