diff --git a/sky/engine/bindings/BUILD.gn b/sky/engine/bindings/BUILD.gn index 171858d13d5460e332709daeea86a05e69845120..4b7211e739998209da5b996a7ecf46cd9ebeb8b1 100644 --- a/sky/engine/bindings/BUILD.gn +++ b/sky/engine/bindings/BUILD.gn @@ -20,10 +20,29 @@ source_set("bindings") { "exception_state.h", "exception_state_placeholder.cc", "exception_state_placeholder.h", + "flutter_dart_state.cc", + "flutter_dart_state.h", "mojo_services.cc", "mojo_services.h", ] + if (is_android) { + sources += [ + "jni/dart_jni.cc", + "jni/dart_jni.h", + "jni/jni_api.cc", + "jni/jni_api.h", + "jni/jni_array.cc", + "jni/jni_array.h", + "jni/jni_class.cc", + "jni/jni_class.h", + "jni/jni_object.cc", + "jni/jni_object.h", + "jni/jni_string.cc", + "jni/jni_string.h", + ] + } + defines = [ "DART_IO_SECURE_SOCKET_DISABLED" ] deps = [ diff --git a/sky/engine/bindings/dart_runtime_hooks.cc b/sky/engine/bindings/dart_runtime_hooks.cc index 4ab5a707032e4842ee56b624271ae7eca2f30666..01b324c0655ea79c6601ce48b08d73b9a12e4727 100644 --- a/sky/engine/bindings/dart_runtime_hooks.cc +++ b/sky/engine/bindings/dart_runtime_hooks.cc @@ -86,7 +86,7 @@ static void InitDartInternal(Dart_Handle builtin_library, Dart_Handle timer_name = ToDart("timerFactory"); DART_CHECK_VALID(Dart_SetField(vm_hooks, timer_name, timer)); } else { - CHECK(isolate_type == DartRuntimeHooks::DartIOIsolate); + CHECK(isolate_type == DartRuntimeHooks::SecondaryIsolate); Dart_Handle io_lib = Dart_LookupLibrary(ToDart("dart:io")); DART_CHECK_VALID(io_lib); Dart_Handle setup_hooks = Dart_NewStringFromCString("_setupHooks"); @@ -111,7 +111,7 @@ static void InitDartAsync(Dart_Handle builtin_library, schedule_microtask = GetClosure(builtin_library, "_getScheduleMicrotaskClosure"); } else { - CHECK(isolate_type == DartRuntimeHooks::DartIOIsolate); + CHECK(isolate_type == DartRuntimeHooks::SecondaryIsolate); Dart_Handle isolate_lib = Dart_LookupLibrary(ToDart("dart:isolate")); Dart_Handle method_name = Dart_NewStringFromCString("_getIsolateScheduleImmediateClosure"); diff --git a/sky/engine/bindings/dart_runtime_hooks.h b/sky/engine/bindings/dart_runtime_hooks.h index bf5484cbbe9cf1993ae518c4c923ae5b9c03b945..ddb8d77b20be2858937736870ab384f88be25f46 100644 --- a/sky/engine/bindings/dart_runtime_hooks.h +++ b/sky/engine/bindings/dart_runtime_hooks.h @@ -15,7 +15,7 @@ class DartRuntimeHooks { public: enum IsolateType { MainIsolate, - DartIOIsolate, + SecondaryIsolate, }; static void Install(IsolateType isolate_type, const std::string& script_uri); diff --git a/sky/engine/bindings/flutter_dart_state.cc b/sky/engine/bindings/flutter_dart_state.cc new file mode 100644 index 0000000000000000000000000000000000000000..0a7039ac03fb1c8eddc449599705041009b1fc4a --- /dev/null +++ b/sky/engine/bindings/flutter_dart_state.cc @@ -0,0 +1,71 @@ +// Copyright 2016 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 "sky/engine/bindings/flutter_dart_state.h" + +#include "sky/engine/bindings/mojo_services.h" +#include "sky/engine/tonic/dart_converter.h" + +#ifdef OS_ANDROID +#include "sky/engine/bindings/jni/dart_jni.h" +#endif + +namespace blink { + +IsolateClient::~IsolateClient() { +} + +FlutterDartState::FlutterDartState(IsolateClient* isolate_client, + const std::string& url) + : isolate_client_(isolate_client), url_(url) { +} + +FlutterDartState::~FlutterDartState() { + // We've already destroyed the isolate. Revoke any weak ptrs held by + // DartPersistentValues so they don't try to enter the destroyed isolate to + // clean themselves up. + weak_factory_.InvalidateWeakPtrs(); +} + +FlutterDartState* FlutterDartState::CreateForChildIsolate() { + return new FlutterDartState(isolate_client_, url_); +} + +FlutterDartState* FlutterDartState::Current() { + return static_cast(DartState::Current()); +} + +void FlutterDartState::DidSetIsolate() { + Scope dart_scope(this); + x_handle_.Set(this, ToDart("x")); + y_handle_.Set(this, ToDart("y")); + dx_handle_.Set(this, ToDart("_dx")); + dy_handle_.Set(this, ToDart("_dy")); + value_handle_.Set(this, ToDart("_value")); + + Dart_Handle library = Dart_LookupLibrary(ToDart("dart:ui")); + color_class_.Set(this, Dart_GetType(library, ToDart("Color"), 0, 0)); +} + +void FlutterDartState::set_mojo_services( + std::unique_ptr mojo_services) { + mojo_services_ = std::move(mojo_services); +} + +MojoServices* FlutterDartState::mojo_services() { + return mojo_services_.get(); +} + +#ifdef OS_ANDROID +void FlutterDartState::set_jni_data( + std::unique_ptr jni_data) { + jni_data_ = std::move(jni_data); +} + +DartJniIsolateData* FlutterDartState::jni_data() { + return jni_data_.get(); +} +#endif + +} // namespace blink diff --git a/sky/engine/bindings/flutter_dart_state.h b/sky/engine/bindings/flutter_dart_state.h new file mode 100644 index 0000000000000000000000000000000000000000..45d77fa2575876571ee7ee6321e52903850cacc3 --- /dev/null +++ b/sky/engine/bindings/flutter_dart_state.h @@ -0,0 +1,78 @@ +// Copyright 2015 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. + +#ifndef SKY_ENGINE_BINDINGS_FLUTTER_DART_STATE_H_ +#define SKY_ENGINE_BINDINGS_FLUTTER_DART_STATE_H_ + +#include + +#include "dart/runtime/include/dart_api.h" +#include "sky/engine/tonic/dart_persistent_value.h" +#include "sky/engine/tonic/dart_state.h" + +namespace blink { + +class DartJniIsolateData; +class MojoServices; + +class IsolateClient { + public: + virtual void DidCreateSecondaryIsolate(Dart_Isolate isolate) = 0; + + protected: + virtual ~IsolateClient(); +}; + +class FlutterDartState : public DartState { + public: + FlutterDartState* CreateForChildIsolate(); + ~FlutterDartState() override; + + void DidSetIsolate() override; + + IsolateClient* isolate_client() { return isolate_client_; } + const std::string& url() const { return url_; } + + static FlutterDartState* Current(); + + // Cached handles to strings used in Dart/C++ conversions. + Dart_Handle x_handle() { return x_handle_.value(); } + Dart_Handle y_handle() { return y_handle_.value(); } + Dart_Handle dx_handle() { return dx_handle_.value(); } + Dart_Handle dy_handle() { return dy_handle_.value(); } + Dart_Handle value_handle() { return value_handle_.value(); } + Dart_Handle color_class() { return color_class_.value(); } + + void set_mojo_services(std::unique_ptr mojo_services); + MojoServices* mojo_services(); + +#ifdef OS_ANDROID + void set_jni_data(std::unique_ptr jni_data); + DartJniIsolateData* jni_data(); +#endif + + protected: + FlutterDartState(IsolateClient* isolate_client, const std::string& url); + + private: + IsolateClient* isolate_client_; + std::string url_; + + DartPersistentValue x_handle_; + DartPersistentValue y_handle_; + DartPersistentValue dx_handle_; + DartPersistentValue dy_handle_; + DartPersistentValue value_handle_; + DartPersistentValue color_class_; + + std::unique_ptr mojo_services_; + +#ifdef OS_ANDROID + std::unique_ptr jni_data_; +#endif +}; + +} // namespace blink + +#endif // SKY_ENGINE_BINDINGS_FLUTTER_DART_STATE_H_ diff --git a/sky/engine/bindings/jni/BUILD.gn b/sky/engine/bindings/jni/BUILD.gn deleted file mode 100644 index 69acfefb31dccb2d42c9590ea448b03a7e78e825..0000000000000000000000000000000000000000 --- a/sky/engine/bindings/jni/BUILD.gn +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2016 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. - -source_set("jni") { - sources = [ - "dart_jni.cc", - "dart_jni.h", - "jni_api.cc", - "jni_api.h", - "jni_array.cc", - "jni_array.h", - "jni_class.cc", - "jni_class.h", - "jni_object.cc", - "jni_object.h", - "jni_string.cc", - "jni_string.h", - ] - - deps = [ - "//base", - "//dart/runtime:libdart", - "//sky/engine/tonic", - "//sky/engine/wtf", - ] -} diff --git a/sky/engine/bindings/jni/dart_jni.cc b/sky/engine/bindings/jni/dart_jni.cc index 1116e7ecb6dd6268f97cdf79371239d5b997b44f..deaef798148aaccf4d90be655f0c96b546eb8781 100644 --- a/sky/engine/bindings/jni/dart_jni.cc +++ b/sky/engine/bindings/jni/dart_jni.cc @@ -7,6 +7,7 @@ #include "base/logging.h" #include "base/android/jni_android.h" #include "base/android/jni_string.h" +#include "sky/engine/bindings/flutter_dart_state.h" #include "sky/engine/bindings/jni/jni_api.h" #include "sky/engine/bindings/jni/jni_array.h" #include "sky/engine/bindings/jni/jni_class.h" @@ -15,6 +16,7 @@ #include "sky/engine/tonic/dart_args.h" #include "sky/engine/tonic/dart_binding_macros.h" #include "sky/engine/tonic/dart_converter.h" +#include "sky/engine/wtf/MakeUnique.h" namespace blink { @@ -35,12 +37,6 @@ const uint8_t* GetSymbol(Dart_NativeFunction native_function) { return g_natives->GetSymbol(native_function); } -// Data cached for each Dart isolate. -struct DartJniIsolateData : public base::SupportsUserData::Data { - Dart_PersistentHandle jni_object_type; - Dart_PersistentHandle jni_float_type; -}; - // Data cached from the Java VM. struct DartJniJvmData { ScopedJavaGlobalRef class_loader; @@ -51,21 +47,13 @@ struct DartJniJvmData { DartJniJvmData* g_jvm_data = nullptr; -void* UserDataKey() { - // Return a unique key for our per-isolate data. - static int data_key = 0; - return reinterpret_cast(&data_key); -} - void CreateIsolateData() { - DartState::Current()->SetUserData(UserDataKey(), new DartJniIsolateData()); + static_cast(DartState::Current())->set_jni_data( + WTF::MakeUnique()); } DartJniIsolateData* IsolateData() { - base::SupportsUserData::Data* user_data = - DartState::Current()->GetUserData(UserDataKey()); - DCHECK(user_data); - return static_cast(user_data); + return static_cast(DartState::Current())->jni_data(); } } // anonymous namespace diff --git a/sky/engine/bindings/jni/dart_jni.h b/sky/engine/bindings/jni/dart_jni.h index 11f7f3f1b0f7d5653e1bc4f1008c95bd471c4872..4fc94caf0f4f86c0b81aaf6d1e46beb7e8c602d8 100644 --- a/sky/engine/bindings/jni/dart_jni.h +++ b/sky/engine/bindings/jni/dart_jni.h @@ -43,6 +43,12 @@ class DartJni { static Dart_Handle jni_float_type(); }; +// Data cached for each Dart isolate. +struct DartJniIsolateData { + Dart_PersistentHandle jni_object_type; + Dart_PersistentHandle jni_float_type; +}; + class JniMethodArgs { public: void Convert(JNIEnv* env, diff --git a/sky/engine/bindings/mojo_services.cc b/sky/engine/bindings/mojo_services.cc index fd275321ae28e99a2786ee738e7c93fd88d69865..d38f865fd12cd20da1b75fb6a57c22fdd55b1aac 100644 --- a/sky/engine/bindings/mojo_services.cc +++ b/sky/engine/bindings/mojo_services.cc @@ -7,7 +7,7 @@ #include "base/threading/worker_pool.h" #include "mojo/public/cpp/application/connect.h" #include "mojo/public/cpp/bindings/array.h" -#include "services/asset_bundle/asset_unpacker_impl.h" +#include "sky/engine/bindings/flutter_dart_state.h" #include "sky/engine/tonic/dart_converter.h" #include "sky/engine/tonic/dart_error.h" #include "sky/engine/tonic/dart_library_natives.h" @@ -16,11 +16,8 @@ namespace blink { namespace { -int kMojoServicesKey = 0; - MojoServices* GetMojoServices() { - DartState* state = DartState::Current(); - return static_cast(state->GetUserData(&kMojoServicesKey)); + return static_cast(DartState::Current())->mojo_services(); } void DartTakeRootBundleHandle(Dart_NativeArguments args) { @@ -62,22 +59,20 @@ void MojoServices::RegisterNatives(DartLibraryNatives* natives) { void MojoServices::Create(Dart_Isolate isolate, sky::ServicesDataPtr services, + mojo::ServiceProviderPtr services_from_embedder, mojo::asset_bundle::AssetBundlePtr root_bundle) { - DartState* state = DartState::From(isolate); - state->SetUserData(&kMojoServicesKey, new MojoServices( - services.Pass(), root_bundle.Pass())); + FlutterDartState* state = static_cast( + DartState::From(isolate)); + state->set_mojo_services(std::unique_ptr(new MojoServices( + services.Pass(), services_from_embedder.Pass(), root_bundle.Pass()))); } MojoServices::MojoServices(sky::ServicesDataPtr services, + mojo::ServiceProviderPtr services_from_embedder, mojo::asset_bundle::AssetBundlePtr root_bundle) : services_(services.Pass()), - root_bundle_(root_bundle.Pass()), - service_provider_impl_(GetProxy(&service_provider_)) { - if (services_ && services_->services_provided_by_embedder) { - service_provider_impl_.set_fallback_service_provider( - services_->services_provided_by_embedder.get()); - } - service_provider_impl_.AddService(this); + services_from_embedder_(services_from_embedder.Pass()), + root_bundle_(root_bundle.Pass()) { if (services_ && services_->services_provided_to_embedder.is_pending()) { services_provided_to_embedder_ = services_->services_provided_to_embedder.Pass(); } else { @@ -88,19 +83,12 @@ MojoServices::MojoServices(sky::ServicesDataPtr services, MojoServices::~MojoServices() { } -void MojoServices::Create( - mojo::ApplicationConnection* connection, - mojo::InterfaceRequest request) { - new mojo::asset_bundle::AssetUnpackerImpl( - request.Pass(), base::WorkerPool::GetTaskRunner(true)); -} - mojo::Handle MojoServices::TakeShellProxy() { return services_ ? services_->shell.PassInterface().PassHandle().release() : mojo::Handle(); } mojo::Handle MojoServices::TakeServicesProvidedByEmbedder() { - return service_provider_.PassInterface().PassHandle().release(); + return services_from_embedder_.PassInterface().PassHandle().release(); } mojo::Handle MojoServices::TakeRootBundleHandle() { diff --git a/sky/engine/bindings/mojo_services.h b/sky/engine/bindings/mojo_services.h index 69339c2fcb566613f62fcd5f589cef4667bd77ea..00aeb581baef54b6c8b4de76e1402267c9b26818 100644 --- a/sky/engine/bindings/mojo_services.h +++ b/sky/engine/bindings/mojo_services.h @@ -5,9 +5,7 @@ #ifndef SKY_ENGINE_BINDINGS_MOJO_SERVICES_H_ #define SKY_ENGINE_BINDINGS_MOJO_SERVICES_H_ -#include "base/supports_user_data.h" #include "dart/runtime/include/dart_api.h" -#include "mojo/public/cpp/application/interface_factory.h" #include "mojo/public/cpp/application/service_provider_impl.h" #include "mojo/public/interfaces/application/service_provider.mojom.h" #include "mojo/services/asset_bundle/interfaces/asset_bundle.mojom.h" @@ -20,14 +18,13 @@ class ApplicationConnection; namespace blink { class DartLibraryNatives; -class MojoServices - : public base::SupportsUserData::Data, - public mojo::InterfaceFactory { +class MojoServices { public: - ~MojoServices() override; + ~MojoServices(); static void Create(Dart_Isolate isolate, sky::ServicesDataPtr services, + mojo::ServiceProviderPtr services_from_embedder, mojo::asset_bundle::AssetBundlePtr root_bundle); static void RegisterNatives(DartLibraryNatives* natives); @@ -40,19 +37,13 @@ class MojoServices private: explicit MojoServices(sky::ServicesDataPtr services, + mojo::ServiceProviderPtr services_from_embedder, mojo::asset_bundle::AssetBundlePtr root_bundle); - // |mojo::InterfaceFactory| implementation: - void Create( - mojo::ApplicationConnection* connection, - mojo::InterfaceRequest) override; - sky::ServicesDataPtr services_; + mojo::ServiceProviderPtr services_from_embedder_; mojo::asset_bundle::AssetBundlePtr root_bundle_; - mojo::ServiceProviderPtr service_provider_; - mojo::ServiceProviderImpl service_provider_impl_; - // We need to hold this object to work around // https://github.com/domokit/mojo/issues/536 mojo::ServiceProviderPtr services_from_dart_; diff --git a/sky/engine/core/BUILD.gn b/sky/engine/core/BUILD.gn index 1fab5dabf77737698126813f337f1da513f17d94..38eec01380ed20769c51af0ebb13c4fb870ab639 100644 --- a/sky/engine/core/BUILD.gn +++ b/sky/engine/core/BUILD.gn @@ -78,10 +78,6 @@ static_library("core") { "//mojo/services/navigation/interfaces", ] - if (is_android) { - deps += [ "//sky/engine/bindings/jni" ] - } - sources = sky_core_files sources += [ "$target_gen_dir/sky_embedder_service_isolate_resources.cc" ] diff --git a/sky/engine/core/script/dart_init.cc b/sky/engine/core/script/dart_init.cc index a796a70cbcf279b4c229833214553572e327c1e8..8c3fc98dd743e5d1d102cb2bfb6a4ef51e94c61c 100644 --- a/sky/engine/core/script/dart_init.cc +++ b/sky/engine/core/script/dart_init.cc @@ -33,6 +33,7 @@ #include "sky/engine/tonic/dart_state.h" #include "sky/engine/tonic/dart_wrappable.h" #include "sky/engine/tonic/uint8_list.h" +#include "sky/engine/wtf/MakeUnique.h" #ifdef OS_ANDROID #include "sky/engine/bindings/jni/dart_jni.h" @@ -130,10 +131,7 @@ Dart_Isolate IsolateCreateCallback(const char* script_uri, DartIO::InitForIsolate(); DartUI::InitForIsolate(); DartMojoInternal::InitForIsolate(); -#ifdef OS_ANDROID - DartJni::InitForIsolate(); -#endif - DartRuntimeHooks::Install(DartRuntimeHooks::DartIOIsolate, ""); + DartRuntimeHooks::Install(DartRuntimeHooks::SecondaryIsolate, ""); const SkySettings& settings = SkySettings::Get(); if (settings.enable_observatory) { std::string ip = "127.0.0.1"; @@ -157,7 +155,10 @@ Dart_Isolate IsolateCreateCallback(const char* script_uri, CHECK(zip_asset_bundle->GetAsBuffer(kSnapshotAssetKey, &snapshot_data)); } - DartState* dart_state = new DartState(); + FlutterDartState* parent_dart_state = + static_cast(callback_data); + FlutterDartState* dart_state = parent_dart_state->CreateForChildIsolate(); + Dart_Isolate isolate = Dart_CreateIsolate( script_uri, main, reinterpret_cast(DART_SYMBOL(kDartIsolateSnapshotBuffer)), @@ -172,15 +173,18 @@ Dart_Isolate IsolateCreateCallback(const char* script_uri, DartIO::InitForIsolate(); DartUI::InitForIsolate(); DartMojoInternal::InitForIsolate(); -#ifdef OS_ANDROID - DartJni::InitForIsolate(); -#endif - DartRuntimeHooks::Install(DartRuntimeHooks::MainIsolate, script_uri); + DartRuntimeHooks::Install(DartRuntimeHooks::SecondaryIsolate, script_uri); + + dart_state->class_library().add_provider( + "ui", + WTF::MakeUnique(dart_state, "dart:ui")); if (!snapshot_data.empty()) { CHECK(!LogIfError(Dart_LoadScriptFromSnapshot( snapshot_data.data(), snapshot_data.size()))); } + + dart_state->isolate_client()->DidCreateSecondaryIsolate(isolate); } Dart_ExitIsolate(); diff --git a/sky/engine/core/script/dom_dart_state.cc b/sky/engine/core/script/dom_dart_state.cc index e9754a41cfa4bee41b7633d618a94722e78eefa7..f44f4f0aef3f34ef0e2dd74942811d3bcd96a433 100644 --- a/sky/engine/core/script/dom_dart_state.cc +++ b/sky/engine/core/script/dom_dart_state.cc @@ -4,38 +4,24 @@ #include "sky/engine/core/script/dom_dart_state.h" -#include "sky/engine/tonic/dart_converter.h" #include "sky/engine/core/window/window.h" namespace blink { -DOMDartState::DOMDartState(std::unique_ptr window, const std::string& url) - : window_(std::move(window)), url_(url) { +DOMDartState::DOMDartState(IsolateClient* isolate_client, + const std::string& url, + std::unique_ptr window) + : FlutterDartState(isolate_client, url), + window_(std::move(window)) { } DOMDartState::~DOMDartState() { - // We've already destroyed the isolate. Revoke any weak ptrs held by - // DartPersistentValues so they don't try to enter the destroyed isolate to - // clean themselves up. - weak_factory_.InvalidateWeakPtrs(); } DOMDartState* DOMDartState::Current() { return static_cast(DartState::Current()); } -void DOMDartState::DidSetIsolate() { - Scope dart_scope(this); - x_handle_.Set(this, ToDart("x")); - y_handle_.Set(this, ToDart("y")); - dx_handle_.Set(this, ToDart("_dx")); - dy_handle_.Set(this, ToDart("_dy")); - value_handle_.Set(this, ToDart("_value")); - - Dart_Handle library = Dart_LookupLibrary(ToDart("dart:ui")); - color_class_.Set(this, Dart_GetType(library, ToDart("Color"), 0, 0)); -} - void DOMDartState::set_font_selector(PassRefPtr selector) { font_selector_ = selector; } diff --git a/sky/engine/core/script/dom_dart_state.h b/sky/engine/core/script/dom_dart_state.h index a4302077c8b715aa7cb6540c3fa33ceb5eb95b11..483794858494b0e016e866e4c8492f67b2c4d176 100644 --- a/sky/engine/core/script/dom_dart_state.h +++ b/sky/engine/core/script/dom_dart_state.h @@ -5,50 +5,28 @@ #ifndef SKY_ENGINE_CORE_SCRIPT_DOM_DART_STATE_H_ #define SKY_ENGINE_CORE_SCRIPT_DOM_DART_STATE_H_ -#include - -#include "dart/runtime/include/dart_api.h" +#include "sky/engine/bindings/flutter_dart_state.h" #include "sky/engine/platform/fonts/FontSelector.h" -#include "sky/engine/tonic/dart_state.h" #include "sky/engine/wtf/RefPtr.h" -#include "sky/engine/wtf/text/WTFString.h" namespace blink { class Window; -class DOMDartState : public DartState { +class DOMDartState : public FlutterDartState { public: - DOMDartState(std::unique_ptr window, const std::string& url); + DOMDartState(IsolateClient* isolate_client, const std::string& url, + std::unique_ptr window); ~DOMDartState() override; - virtual void DidSetIsolate(); - Window* window() const { return window_.get(); } - const std::string& url() const { return url_; } static DOMDartState* Current(); - // Cached handles to strings used in Dart/C++ conversions. - Dart_Handle x_handle() { return x_handle_.value(); } - Dart_Handle y_handle() { return y_handle_.value(); } - Dart_Handle dx_handle() { return dx_handle_.value(); } - Dart_Handle dy_handle() { return dy_handle_.value(); } - Dart_Handle value_handle() { return value_handle_.value(); } - Dart_Handle color_class() { return color_class_.value(); } - void set_font_selector(PassRefPtr selector); PassRefPtr font_selector(); private: std::unique_ptr window_; - std::string url_; - - DartPersistentValue x_handle_; - DartPersistentValue y_handle_; - DartPersistentValue dx_handle_; - DartPersistentValue dy_handle_; - DartPersistentValue value_handle_; - DartPersistentValue color_class_; RefPtr font_selector_; }; diff --git a/sky/engine/public/sky/BUILD.gn b/sky/engine/public/sky/BUILD.gn index 298f5a47d51426c8687caa21e417b7e39861222a..bb5315657e509fe63ac1e18eab3c6fb34fe3ac7b 100644 --- a/sky/engine/public/sky/BUILD.gn +++ b/sky/engine/public/sky/BUILD.gn @@ -9,6 +9,7 @@ source_set("sky") { "//mojo/public/cpp/system", "//mojo/services/network/interfaces", "//skia", + "//sky/engine/bindings", "//sky/engine/core", "//sky/engine/platform", "//sky/engine/wtf", diff --git a/sky/engine/public/sky/sky_headless.cc b/sky/engine/public/sky/sky_headless.cc index 15e4dbf74c923c6cddb908e0a82ba7bab5ef2e2b..637269db1998f8ca1e0c1642b85ea92bf56c877b 100644 --- a/sky/engine/public/sky/sky_headless.cc +++ b/sky/engine/public/sky/sky_headless.cc @@ -22,7 +22,7 @@ void SkyHeadless::Init(const std::string& name) { dart_controller_ = WTF::MakeUnique(); dart_controller_->CreateIsolateFor(WTF::MakeUnique( - WTF::MakeUnique(this), name)); + this, name, WTF::MakeUnique(this))); DOMDartState* dart_state = dart_controller_->dart_state(); DartState::Scope scope(dart_state); @@ -43,4 +43,7 @@ void SkyHeadless::FlushRealTimeEvents() { void SkyHeadless::Render(Scene* scene) { } +void SkyHeadless::DidCreateSecondaryIsolate(Dart_Isolate isolate) { +} + } // namespace blink diff --git a/sky/engine/public/sky/sky_headless.h b/sky/engine/public/sky/sky_headless.h index 06c647cc6eef0f16c1138a99adc79bcf03da8d4a..82eeab50aa6f9311cf69c41f9eaf71025de01fb1 100644 --- a/sky/engine/public/sky/sky_headless.h +++ b/sky/engine/public/sky/sky_headless.h @@ -8,6 +8,7 @@ #include #include "base/basictypes.h" +#include "sky/engine/bindings/flutter_dart_state.h" #include "sky/engine/core/window/window.h" #include "sky/engine/wtf/OwnPtr.h" #include "sky/engine/wtf/text/WTFString.h" @@ -19,7 +20,7 @@ class DartController; class Scene; // This class provides a way to run Dart script without a View. -class SkyHeadless : public WindowClient { +class SkyHeadless : public WindowClient, public IsolateClient { public: class Client { public: @@ -40,6 +41,8 @@ class SkyHeadless : public WindowClient { void FlushRealTimeEvents() override; void Render(Scene* scene) override; + void DidCreateSecondaryIsolate(Dart_Isolate isolate) override; + std::unique_ptr dart_controller_; Client* client_; diff --git a/sky/engine/public/sky/sky_view.cc b/sky/engine/public/sky/sky_view.cc index d53ad3198681812e6b395acc2ae340b65537f12d..1d0d1624554cbf1efc1cba66208e473d75a22ad4 100644 --- a/sky/engine/public/sky/sky_view.cc +++ b/sky/engine/public/sky/sky_view.cc @@ -56,12 +56,12 @@ void SkyView::CreateView(const std::string& script_uri) { dart_controller_ = WTF::MakeUnique(); dart_controller_->CreateIsolateFor(WTF::MakeUnique( - WTF::MakeUnique(this), script_uri)); + this, script_uri, WTF::MakeUnique(this))); DOMDartState* dart_state = dart_controller_->dart_state(); DartState::Scope scope(dart_state); dart_state->window()->DidCreateIsolate(); - client_->DidCreateIsolate(dart_state->isolate()); + client_->DidCreateMainIsolate(dart_state->isolate()); GetWindow()->UpdateWindowMetrics(display_metrics_); GetWindow()->UpdateLocale(language_code_, country_code_); @@ -107,6 +107,10 @@ void SkyView::Render(Scene* scene) { layer_tree_ = scene->takeLayerTree(); } +void SkyView::DidCreateSecondaryIsolate(Dart_Isolate isolate) { + client_->DidCreateSecondaryIsolate(isolate); +} + void SkyView::OnAppLifecycleStateChanged(sky::AppLifecycleState state) { GetWindow()->OnAppLifecycleStateChanged(state); } diff --git a/sky/engine/public/sky/sky_view.h b/sky/engine/public/sky/sky_view.h index 8b392afd2904c680870fdc5ac5e474b384c3e86d..a571091eaee8f5f89607d82e22616f523e3331c6 100644 --- a/sky/engine/public/sky/sky_view.h +++ b/sky/engine/public/sky/sky_view.h @@ -12,6 +12,7 @@ #include "flow/layers/layer_tree.h" #include "mojo/public/cpp/system/data_pipe.h" #include "mojo/services/network/interfaces/url_loader.mojom.h" +#include "sky/engine/bindings/flutter_dart_state.h" #include "sky/engine/core/window/window.h" #include "sky/engine/public/platform/sky_display_metrics.h" #include "sky/engine/public/platform/WebCommon.h" @@ -32,7 +33,7 @@ class View; class WebInputEvent; class Window; -class SkyView : public WindowClient { +class SkyView : public WindowClient, public IsolateClient { public: static std::unique_ptr Create(SkyViewClient* client); ~SkyView(); @@ -67,6 +68,8 @@ class SkyView : public WindowClient { void FlushRealTimeEvents() override; void Render(Scene* scene) override; + void DidCreateSecondaryIsolate(Dart_Isolate isolate) override; + SkyViewClient* client_; SkyDisplayMetrics display_metrics_; std::string language_code_; diff --git a/sky/engine/public/sky/sky_view_client.h b/sky/engine/public/sky/sky_view_client.h index 341d3ca4610e826d2518299eb977936d99dd8417..a488d54e401bd1c6fc088655535ce9b307efff4f 100644 --- a/sky/engine/public/sky/sky_view_client.h +++ b/sky/engine/public/sky/sky_view_client.h @@ -19,7 +19,8 @@ class SkyViewClient { virtual void FlushRealTimeEvents() = 0; virtual void Render(std::unique_ptr layer_tree) = 0; - virtual void DidCreateIsolate(Dart_Isolate isolate) = 0; + virtual void DidCreateMainIsolate(Dart_Isolate isolate) = 0; + virtual void DidCreateSecondaryIsolate(Dart_Isolate isolate) = 0; protected: virtual ~SkyViewClient(); diff --git a/sky/engine/tonic/dart_state.h b/sky/engine/tonic/dart_state.h index 64c5ecfe845ad88a7ffcd07764c27e7db63c9993..f018f30e870d9128c5e7b5dd2b581ca40b7c2f57 100644 --- a/sky/engine/tonic/dart_state.h +++ b/sky/engine/tonic/dart_state.h @@ -7,7 +7,6 @@ #include "base/logging.h" #include "base/memory/weak_ptr.h" -#include "base/supports_user_data.h" #include "dart/runtime/include/dart_api.h" #include "sky/engine/tonic/dart_api_scope.h" #include "sky/engine/tonic/dart_isolate_scope.h" @@ -25,7 +24,7 @@ class DartMessageHandler; // reference to a DartState instance, please hold a base::WeakPtr. // // DartState is analogous to gin::PerIsolateData and JSC::ExecState. -class DartState : public base::SupportsUserData { +class DartState { public: class Scope { public: diff --git a/sky/shell/BUILD.gn b/sky/shell/BUILD.gn index ef733a2a9fb5eec6f438917edb8884aed1538d5b..a558b40843729fc7bac0074e3c2c8ad01a3ea69e 100644 --- a/sky/shell/BUILD.gn +++ b/sky/shell/BUILD.gn @@ -140,7 +140,6 @@ if (is_android) { "//mojo/android:libsystem_java", "//mojo/edk/base_edk", "//mojo/edk/system", - "//sky/engine/bindings/jni", "//ui/gl", ":common", ":gpu_direct", diff --git a/sky/shell/ui/engine.cc b/sky/shell/ui/engine.cc index f9d1d5af1a2a6494bdb51f9674561723171b51bd..bea64c8a0f4a8a4977328029fe63bd6c3569cf54 100644 --- a/sky/shell/ui/engine.cc +++ b/sky/shell/ui/engine.cc @@ -103,6 +103,13 @@ void Engine::OnOutputSurfaceDestroyed(const base::Closure& gpu_continuation) { void Engine::SetServices(ServicesDataPtr services) { services_ = services.Pass(); + if (services_->services_provided_by_embedder) { + services_provided_by_embedder_ = + services_->services_provided_by_embedder.Pass(); + service_provider_impl_.set_fallback_service_provider( + services_provided_by_embedder_.get()); + } + if (services_->scene_scheduler) { animator_->Reset(); animator_->set_scene_scheduler(services_->scene_scheduler.Pass()); @@ -113,7 +120,7 @@ void Engine::SetServices(ServicesDataPtr services) { mojo::ConnectToService(services_->shell.get(), "mojo:vsync", &vsync_provider); } else { - mojo::ConnectToService(services_->services_provided_by_embedder.get(), + mojo::ConnectToService(services_provided_by_embedder_.get(), &vsync_provider); } animator_->Reset(); @@ -271,14 +278,39 @@ void Engine::OnAppLifecycleStateChanged(sky::AppLifecycleState state) { sky_view_->OnAppLifecycleStateChanged(state); } -void Engine::DidCreateIsolate(Dart_Isolate isolate) { - blink::MojoServices::Create(isolate, services_.Pass(), root_bundle_.Pass()); +void Engine::DidCreateMainIsolate(Dart_Isolate isolate) { + mojo::ServiceProviderPtr services_from_embedder; + service_provider_bindings_.AddBinding( + &service_provider_impl_, mojo::GetProxy(&services_from_embedder)); + + blink::MojoServices::Create( + isolate, services_.Pass(), services_from_embedder.Pass(), + root_bundle_.Pass()); if (zip_asset_bundle_) { FlutterFontSelector::install(zip_asset_bundle_); } } +void Engine::DidCreateSecondaryIsolate(Dart_Isolate isolate) { + mojo::ServiceProviderPtr services_from_embedder; + mojo::InterfaceRequest request = + mojo::GetProxy(&services_from_embedder); + blink::Platform::current()->GetUITaskRunner()->PostTask(FROM_HERE, + base::Bind(&Engine::BindToServiceProvider, + weak_factory_.GetWeakPtr(), + base::Passed(&request))); + + blink::MojoServices::Create( + isolate, nullptr, services_from_embedder.Pass(), nullptr); +} + +void Engine::BindToServiceProvider( + mojo::InterfaceRequest request) { + service_provider_bindings_.AddBinding(&service_provider_impl_, + request.Pass()); +} + void Engine::StopAnimator() { animator_->Stop(); } diff --git a/sky/shell/ui/engine.h b/sky/shell/ui/engine.h index 7a7919fdc4af06893efd210910a2810367ab7b82..3d13cda87380e3b481a1272843d8906869b56dcd 100644 --- a/sky/shell/ui/engine.h +++ b/sky/shell/ui/engine.h @@ -9,6 +9,9 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/single_thread_task_runner.h" +#include "mojo/common/binding_set.h" +#include "mojo/public/cpp/application/interface_factory.h" +#include "mojo/public/cpp/application/service_provider_impl.h" #include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/system/core.h" #include "mojo/public/cpp/system/data_pipe.h" @@ -82,7 +85,11 @@ class Engine : public UIDelegate, void ScheduleFrame() override; void FlushRealTimeEvents() override; void Render(std::unique_ptr layer_tree) override; - void DidCreateIsolate(Dart_Isolate isolate) override; + void DidCreateMainIsolate(Dart_Isolate isolate) override; + void DidCreateSecondaryIsolate(Dart_Isolate isolate) override; + + void BindToServiceProvider( + mojo::InterfaceRequest request); void RunFromLibrary(const std::string& name); void RunFromSnapshotStream(const std::string& name, @@ -99,6 +106,10 @@ class Engine : public UIDelegate, std::unique_ptr animator_; ServicesDataPtr services_; + mojo::ServiceProviderImpl service_provider_impl_; + mojo::ServiceProviderPtr services_provided_by_embedder_; + mojo::BindingSet service_provider_bindings_; + mojo::asset_bundle::AssetBundlePtr root_bundle_; std::unique_ptr dart_library_provider_; std::unique_ptr sky_view_;