Pass the Mozart ViewHost into Dart

Dart needs access to the ViewHost in order to create child views.
This commit is contained in:
Adam Barth 2016-02-03 14:39:45 -08:00
parent 4192794b60
commit aec7d422e7
7 changed files with 21 additions and 4 deletions

View File

@ -11,3 +11,4 @@ int takeServiceRegistry() native "takeServiceRegistry";
int takeServicesProvidedByEmbedder() native "takeServicesProvidedByEmbedder";
int takeServicesProvidedToEmbedder() native "takeServicesProvidedToEmbedder";
int takeShellProxyHandle() native "takeShellProxyHandle";
int takeViewHostHandle() native "takeViewHostHandle";

View File

@ -15,6 +15,7 @@ mojom("interfaces") {
"//mojo/services/asset_bundle/interfaces",
"//mojo/services/gfx/composition/interfaces",
"//mojo/services/service_registry/interfaces",
"//mojo/services/ui/views/interfaces",
"//sky/services/pointer:interfaces",
]
}

View File

@ -9,6 +9,7 @@ import "mojo/public/interfaces/application/shell.mojom";
import "mojo/services/asset_bundle/interfaces/asset_bundle.mojom";
import "mojo/services/gfx/composition/interfaces/scheduling.mojom";
import "mojo/services/service_registry/interfaces/service_registry.mojom";
import "mojo/services/ui/views/interfaces/views.mojom";
import "sky/services/engine/input_event.mojom";
import "sky/services/pointer/pointer.mojom";
@ -32,6 +33,7 @@ struct ServicesData {
mojo.ServiceRegistry? service_registry;
mojo.ServiceProvider? services_provided_by_embedder;
mojo.ServiceProvider&? services_provided_to_embedder;
mojo.ui.ViewHost? view_host;
mojo.gfx.composition.SceneScheduler? scene_scheduler;
};

View File

@ -17,14 +17,16 @@ ViewImpl::ViewImpl(ServicesDataPtr services,
: binding_(this), url_(url), listener_binding_(this) {
DCHECK(services);
mojo::ui::ViewHostPtr view_host;
// Views
mojo::ConnectToService(
services->shell.get(), "mojo:view_manager_service", &view_manager_);
mojo::ui::ViewPtr view;
binding_.Bind(mojo::GetProxy(&view));
view_manager_->RegisterView(
view.Pass(), mojo::GetProxy(&view_host_), url_, callback);
view_host_->GetServiceProvider(mojo::GetProxy(&view_service_provider_));
view.Pass(), mojo::GetProxy(&view_host), url_, callback);
view_host->GetServiceProvider(mojo::GetProxy(&view_service_provider_));
// Input
mojo::ConnectToService(view_service_provider_.get(), &input_connection_);
@ -34,8 +36,9 @@ ViewImpl::ViewImpl(ServicesDataPtr services,
// Compositing
mojo::gfx::composition::ScenePtr scene;
view_host_->CreateScene(mojo::GetProxy(&scene));
view_host->CreateScene(mojo::GetProxy(&scene));
scene->GetScheduler(mojo::GetProxy(&services->scene_scheduler));
services->view_host = view_host.Pass();
// Engine
shell_view_.reset(new ShellView(Shell::Shared()));

View File

@ -49,7 +49,6 @@ class ViewImpl : public mojo::ui::View,
mojo::StrongBinding<mojo::ui::View> binding_;
std::string url_;
mojo::ui::ViewManagerPtr view_manager_;
mojo::ui::ViewHostPtr view_host_;
mojo::ServiceProviderPtr view_service_provider_;
mojo::ui::InputConnectionPtr input_connection_;
mojo::Binding<mojo::ui::InputListener> listener_binding_;

View File

@ -51,6 +51,11 @@ void TakeServicesProvidedToEmbedder(Dart_NativeArguments args) {
args, GetInternals()->TakeServicesProvidedToEmbedder().value());
}
void TakeViewHostHandle(Dart_NativeArguments args) {
Dart_SetIntegerReturnValue(
args, GetInternals()->TakeViewHostHandle().value());
}
static DartLibraryNatives* g_natives;
void EnsureNatives() {
@ -63,6 +68,7 @@ void EnsureNatives() {
{"takeServicesProvidedByEmbedder", TakeServicesProvidedByEmbedder, 0, true},
{"takeServicesProvidedToEmbedder", TakeServicesProvidedToEmbedder, 0, true},
{"takeShellProxyHandle", TakeShellProxyHandle, 0, true},
{"takeViewHostHandle", TakeViewHostHandle, 0, true},
});
}
@ -136,5 +142,9 @@ mojo::Handle Internals::TakeServicesProvidedToEmbedder() {
return services_provided_to_embedder_.PassMessagePipe().release();
}
mojo::Handle Internals::TakeViewHostHandle() {
return services_ ? services_->view_host.PassInterface().PassHandle().release() : mojo::Handle();
}
} // namespace shell
} // namespace sky

View File

@ -35,6 +35,7 @@ class Internals
mojo::Handle TakeServicesProvidedByEmbedder();
mojo::Handle TakeServicesProvidedToEmbedder();
mojo::Handle TakeRootBundleHandle();
mojo::Handle TakeViewHostHandle();
private:
explicit Internals(ServicesDataPtr services,