Rationalize embedder.dart and shell.dart
This patch combines embedder.dart and shell.dart into one thing. We should now
handle a bunch of error cases better.
* embedder.connectToApplication has moved to shell.connectToApplication,
matching the rest of the mojo universe.
* embedder.connecttoService has moved to shell.connnectToService (and merged
with shell.requestService).
* shell.requestService is now shell.connectToService, matching the rest of
the mojo universe.
* serviceRegistry has moved from embedder.serviceRegistry to a top-level
getter.
Fixes #1803
This commit is contained in:
@@ -68,7 +68,7 @@ class PianoApp extends StatelessComponent {
|
||||
Future _loadSounds() async {
|
||||
MediaServiceProxy mediaService = new MediaServiceProxy.unbound();
|
||||
try {
|
||||
shell.requestService(null, mediaService);
|
||||
shell.connectToService(null, mediaService);
|
||||
List<Future<MediaPlayerPrepareResponseParams>> pending = <Future<MediaPlayerPrepareResponseParams>>[];
|
||||
for (PianoKey key in keys)
|
||||
pending.add(key.load(mediaService));
|
||||
|
||||
@@ -13,7 +13,6 @@ library services;
|
||||
|
||||
export 'src/services/activity.dart';
|
||||
export 'src/services/asset_bundle.dart';
|
||||
export 'src/services/embedder.dart';
|
||||
export 'src/services/fetch.dart';
|
||||
export 'src/services/image_cache.dart';
|
||||
export 'src/services/image_decoder.dart';
|
||||
|
||||
@@ -22,7 +22,7 @@ const int MULTIPLE_TASK = 0x08000000;
|
||||
|
||||
ActivityProxy _initActivityProxy() {
|
||||
ActivityProxy activity = new ActivityProxy.unbound();
|
||||
shell.requestService('mojo:sky_viewer', activity);
|
||||
shell.connectToService(null, activity);
|
||||
return activity;
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ final UserFeedback userFeedback = _userFeedbackProxy.ptr;
|
||||
|
||||
PathServiceProxy _initPathServiceProxy() {
|
||||
PathServiceProxy proxy = new PathServiceProxy.unbound();
|
||||
shell.requestService(null, proxy);
|
||||
shell.connectToService(null, proxy);
|
||||
return proxy;
|
||||
}
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ class NetworkAssetBundle extends AssetBundle {
|
||||
Future _fetchAndUnpackBundle(String relativeUrl, AssetBundleProxy bundle) async {
|
||||
core.MojoDataPipeConsumer bundleData = (await fetchUrl(relativeUrl)).body;
|
||||
AssetUnpackerProxy unpacker = new AssetUnpackerProxy.unbound();
|
||||
shell.requestService("mojo:asset_bundle", unpacker);
|
||||
shell.connectToService("mojo:asset_bundle", unpacker);
|
||||
unpacker.ptr.unpackZipStream(bundleData, bundle);
|
||||
unpacker.close();
|
||||
}
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
// 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.
|
||||
|
||||
import 'dart:ui_internals' as internals;
|
||||
|
||||
import 'package:mojo/application.dart';
|
||||
import 'package:mojo/bindings.dart' as bindings;
|
||||
import 'package:mojo/core.dart' as core;
|
||||
import 'package:mojo/mojo/service_provider.mojom.dart';
|
||||
import 'package:mojo/mojo/shell.mojom.dart';
|
||||
import 'package:mojo_services/mojo/service_registry.mojom.dart';
|
||||
|
||||
final _EmbedderImpl embedder = new _EmbedderImpl();
|
||||
|
||||
class _EmbedderImpl {
|
||||
ApplicationConnection _connection;
|
||||
ServiceRegistryProxy _serviceRegistry;
|
||||
ShellProxy _shell;
|
||||
bool _internalsHasNoShell = false;
|
||||
|
||||
ShellProxy get shell {
|
||||
if (_internalsHasNoShell || _shell != null) return _shell;
|
||||
|
||||
try {
|
||||
_shell = new ShellProxy.fromHandle(
|
||||
new core.MojoHandle(internals.takeShellProxyHandle()));
|
||||
} catch (e) {
|
||||
_internalsHasNoShell = true;
|
||||
}
|
||||
return _shell;
|
||||
}
|
||||
|
||||
ApplicationConnection get connection {
|
||||
if (_connection == null) {
|
||||
var stubHandle =
|
||||
new core.MojoHandle(internals.takeServicesProvidedToEmbedder());
|
||||
var proxyHandle =
|
||||
new core.MojoHandle(internals.takeServicesProvidedByEmbedder());
|
||||
_connection = new ApplicationConnection(stubHandle.isValid
|
||||
? new ServiceProviderStub.fromHandle(stubHandle)
|
||||
: null, proxyHandle.isValid
|
||||
? new ServiceProviderProxy.fromHandle(proxyHandle)
|
||||
: null);
|
||||
}
|
||||
return _connection;
|
||||
}
|
||||
|
||||
ApplicationConnection connectToApplication(String url) {
|
||||
var proxy = new ServiceProviderProxy.unbound();
|
||||
var stub = new ServiceProviderStub.unbound();
|
||||
shell.ptr.connectToApplication(url, proxy, stub);
|
||||
return new ApplicationConnection(stub, proxy);
|
||||
}
|
||||
|
||||
void connectToService(String url, bindings.ProxyBase proxy) {
|
||||
var appSp = new ServiceProviderProxy.unbound();
|
||||
shell.ptr.connectToApplication(url, appSp, null);
|
||||
var pipe = new core.MojoMessagePipe();
|
||||
proxy.impl.bind(pipe.endpoints[0]);
|
||||
appSp.ptr.connectToService(proxy.name, pipe.endpoints[1]);
|
||||
appSp.close();
|
||||
}
|
||||
|
||||
ServiceRegistryProxy get serviceRegistry {
|
||||
if (_serviceRegistry == null) {
|
||||
_serviceRegistry = new ServiceRegistryProxy.fromHandle(
|
||||
new core.MojoHandle(internals.takeServiceRegistry()));
|
||||
}
|
||||
return _serviceRegistry;
|
||||
}
|
||||
}
|
||||
@@ -17,7 +17,7 @@ export 'package:mojo/mojo/url_response.mojom.dart' show UrlResponse;
|
||||
|
||||
NetworkServiceProxy _initNetworkService() {
|
||||
NetworkServiceProxy networkService = new NetworkServiceProxy.unbound();
|
||||
shell.requestService("mojo:authenticated_network_service", networkService);
|
||||
shell.connectToService("mojo:authenticated_network_service", networkService);
|
||||
return networkService;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ class _KeyboardConnection {
|
||||
|
||||
_KeyboardConnection() {
|
||||
proxy = new KeyboardServiceProxy.unbound();
|
||||
shell.requestService("mojo:keyboard", proxy);
|
||||
shell.connectToService("mojo:keyboard", proxy);
|
||||
}
|
||||
|
||||
KeyboardServiceProxy proxy;
|
||||
|
||||
18
packages/flutter/lib/src/services/service_registry.dart
Normal file
18
packages/flutter/lib/src/services/service_registry.dart
Normal file
@@ -0,0 +1,18 @@
|
||||
// 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.
|
||||
|
||||
import 'dart:ui_internals' as internals;
|
||||
|
||||
import 'package:mojo_services/mojo/service_registry.mojom.dart';
|
||||
import 'package:mojo/core.dart' as core;
|
||||
|
||||
ServiceRegistryProxy _initServiceRegistryProxy() {
|
||||
core.MojoHandle serviceRegistryHandle = new core.MojoHandle(internals.takeShellProxyHandle());
|
||||
if (!serviceRegistryHandle.isValid)
|
||||
return null;
|
||||
return new ServiceRegistryProxy.fromHandle(serviceRegistryHandle);
|
||||
}
|
||||
|
||||
final ServiceRegistryProxy _serviceRegistryProxy = _initServiceRegistryProxy();
|
||||
final ServiceRegistry serviceRegistry = _serviceRegistryProxy?.ptr;
|
||||
@@ -5,47 +5,74 @@
|
||||
import 'dart:ui_internals' as internals;
|
||||
|
||||
import 'package:mojo/application.dart';
|
||||
import 'package:mojo/bindings.dart' as bindings;
|
||||
import 'package:mojo/core.dart' as core;
|
||||
import 'package:mojo/mojo/service_provider.mojom.dart';
|
||||
import 'package:mojo/mojo/shell.mojom.dart';
|
||||
|
||||
import 'embedder.dart';
|
||||
|
||||
ApplicationConnection _initConnection() {
|
||||
int rawHandle = internals.takeServicesProvidedByEmbedder();
|
||||
core.MojoHandle proxyHandle = new core.MojoHandle(rawHandle);
|
||||
ServiceProviderProxy serviceProvider = null;
|
||||
if (proxyHandle.isValid) serviceProvider =
|
||||
new ServiceProviderProxy.fromHandle(proxyHandle);
|
||||
return new ApplicationConnection(null, serviceProvider);
|
||||
}
|
||||
|
||||
// A replacement for requestService. Implementations should return true
|
||||
// A replacement for shell.connectToService. Implementations should return true
|
||||
// if they handled the request, or false if the request should fall through
|
||||
// to the default requestService.
|
||||
typedef bool OverrideRequestService(String url, Object proxy);
|
||||
typedef bool OverrideConnectToService(String url, Object proxy);
|
||||
|
||||
// Set this to intercept calls to requestService and supply an alternative
|
||||
// implementation of a service (for example, a mock for testing).
|
||||
OverrideRequestService overrideRequestService;
|
||||
// Set this to intercept calls to shell.connectToService and supply an
|
||||
// alternative implementation of a service (for example, a mock for testing).
|
||||
OverrideConnectToService overrideConnectToService;
|
||||
|
||||
class _ShellImpl {
|
||||
_ShellImpl._();
|
||||
ShellProxy _initShellProxy() {
|
||||
core.MojoHandle shellHandle = new core.MojoHandle(internals.takeShellProxyHandle());
|
||||
if (!shellHandle.isValid)
|
||||
return null;
|
||||
return new ShellProxy.fromHandle(shellHandle);
|
||||
}
|
||||
|
||||
final ApplicationConnection _connection = _initConnection();
|
||||
ApplicationConnection _initEmbedderConnection() {
|
||||
core.MojoHandle servicesHandle = new core.MojoHandle(internals.takeServicesProvidedByEmbedder());
|
||||
core.MojoHandle exposedServicesHandle = new core.MojoHandle(internals.takeServicesProvidedToEmbedder());
|
||||
ServiceProviderProxy services = servicesHandle.isValid ?
|
||||
new ServiceProviderProxy.fromHandle(servicesHandle) : null;
|
||||
ServiceProviderStub exposedServices = exposedServicesHandle.isValid ?
|
||||
new ServiceProviderStub.fromHandle(exposedServicesHandle) : null;
|
||||
return new ApplicationConnection(exposedServices, services);
|
||||
}
|
||||
|
||||
void _requestService(String url, Object proxy) {
|
||||
if (embedder.shell == null) _connection.requestService(proxy);
|
||||
else embedder.connectToService(url, proxy);
|
||||
final ShellProxy _shellProxy = _initShellProxy();
|
||||
final Shell _shell = _shellProxy?.ptr;
|
||||
final ApplicationConnection _embedderConnection = _initEmbedderConnection();
|
||||
|
||||
class _Shell {
|
||||
_Shell._();
|
||||
|
||||
ApplicationConnection connectToApplication(String url) {
|
||||
if (_shell == null)
|
||||
return null;
|
||||
ServiceProviderProxy services = new ServiceProviderProxy.unbound();
|
||||
ServiceProviderStub exposedServices = new ServiceProviderStub.unbound();
|
||||
_shell.connectToApplication(url, services, exposedServices);
|
||||
return new ApplicationConnection(exposedServices, services);
|
||||
}
|
||||
|
||||
void requestService(String url, Object proxy) {
|
||||
if (overrideRequestService != null) {
|
||||
if (overrideRequestService(url, proxy))
|
||||
return;
|
||||
void _connectToService(String url, bindings.ProxyBase proxy) {
|
||||
if (_shell == null || url == null) {
|
||||
// If we don't have a shell or a url, we try to get the services from the
|
||||
// embedder directly instead of using the shell to connect.
|
||||
_embedderConnection.requestService(proxy);
|
||||
return;
|
||||
}
|
||||
|
||||
_requestService(url, proxy);
|
||||
ServiceProviderProxy services = new ServiceProviderProxy.unbound();
|
||||
_shell.connectToApplication(url, services, null);
|
||||
var pipe = new core.MojoMessagePipe();
|
||||
proxy.impl.bind(pipe.endpoints[0]);
|
||||
services.ptr.connectToService(proxy.name, pipe.endpoints[1]);
|
||||
services.close();
|
||||
}
|
||||
|
||||
void connectToService(String url, Object proxy) {
|
||||
if (overrideConnectToService != null && overrideConnectToService(url, proxy))
|
||||
return;
|
||||
_connectToService(url, proxy);
|
||||
}
|
||||
}
|
||||
|
||||
final _ShellImpl shell = new _ShellImpl._();
|
||||
final _Shell shell = new _Shell._();
|
||||
|
||||
@@ -55,7 +55,7 @@ class SoundEffectPlayer {
|
||||
|
||||
SoundEffectPlayer() {
|
||||
_mediaService = new MediaServiceProxy.unbound();
|
||||
shell.requestService(null, _mediaService);
|
||||
shell.connectToService(null, _mediaService);
|
||||
}
|
||||
|
||||
MediaServiceProxy _mediaService;
|
||||
@@ -165,7 +165,7 @@ class SoundTrackPlayer {
|
||||
|
||||
SoundTrackPlayer() {
|
||||
_mediaService = new MediaServiceProxy.unbound();
|
||||
shell.requestService(null, _mediaService);
|
||||
shell.connectToService(null, _mediaService);
|
||||
}
|
||||
|
||||
MediaServiceProxy _mediaService;
|
||||
|
||||
@@ -4,13 +4,13 @@ import 'package:flutter/src/services/shell.dart' as shell;
|
||||
// of Mojo services.
|
||||
class _ServiceMocker {
|
||||
_ServiceMocker() {
|
||||
shell.overrideRequestService = _requestService;
|
||||
shell.overrideConnectToService = _connectToService;
|
||||
}
|
||||
|
||||
// Map of interface names to mock implementations.
|
||||
Map<String, Object> _interfaceMock = new Map<String, Object>();
|
||||
|
||||
bool _requestService(String url, dynamic proxy) {
|
||||
bool _connectToService(String url, dynamic proxy) {
|
||||
Object mock = _interfaceMock[proxy.impl.name];
|
||||
if (mock != null) {
|
||||
// Replace the proxy's implementation of the service interface with the
|
||||
|
||||
@@ -23,7 +23,7 @@ const String kBundleFile = 'app.flx';
|
||||
|
||||
UpdateServiceProxy _initUpdateService() {
|
||||
UpdateServiceProxy updateService = new UpdateServiceProxy.unbound();
|
||||
shell.requestService(null, updateService);
|
||||
shell.connectToService(null, updateService);
|
||||
return updateService;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user