| Index: third_party/mojo/src/mojo/public/dart/src/application.dart | 
| diff --git a/third_party/mojo/src/mojo/public/dart/src/application.dart b/third_party/mojo/src/mojo/public/dart/src/application.dart | 
| index 3ae900b5ce884a95669d031425ee1b1cc07ccf07..03d0843f4e55e1d7947ce27064746eea71eb7f75 100644 | 
| --- a/third_party/mojo/src/mojo/public/dart/src/application.dart | 
| +++ b/third_party/mojo/src/mojo/public/dart/src/application.dart | 
| @@ -9,35 +9,42 @@ class _ApplicationImpl implements application_mojom.Application { | 
| shell_mojom.ShellProxy shell; | 
| Application _application; | 
|  | 
| -  _ApplicationImpl(Application application, | 
| -      core.MojoMessagePipeEndpoint endpoint) { | 
| +  _ApplicationImpl( | 
| +      Application application, core.MojoMessagePipeEndpoint endpoint) { | 
| _application = application; | 
| -    _stub = new application_mojom.ApplicationStub.fromEndpoint(endpoint) | 
| -        ..delegate = this | 
| -        ..listen(); | 
| +    _stub = new application_mojom.ApplicationStub.fromEndpoint(endpoint, this); | 
| +    _stub.onError = close; | 
| } | 
|  | 
| _ApplicationImpl.fromHandle(Application application, core.MojoHandle handle) { | 
| _application = application; | 
| -    _stub = new application_mojom.ApplicationStub.fromHandle(handle) | 
| -        ..delegate = this | 
| -        ..listen(); | 
| +    _stub = new application_mojom.ApplicationStub.fromHandle(handle, this); | 
| +    _stub.onError = close; | 
| } | 
|  | 
| -  void initialize(bindings.ProxyBase shellProxy, List<String> args, | 
| -      String url) { | 
| +  set onError(core.ErrorHandler f) { | 
| +    _stub.onError = f; | 
| +  } | 
| + | 
| +  void initialize( | 
| +      bindings.ProxyBase shellProxy, List<String> args, String url) { | 
| assert(shell == null); | 
| shell = shellProxy; | 
| _application.initialize(args, url); | 
| } | 
|  | 
| +  @override | 
| void acceptConnection(String requestorUrl, ServiceProviderStub services, | 
| -      bindings.ProxyBase exposedServices, String requested_url) => | 
| -      _application._acceptConnection(requestorUrl, services, exposedServices); | 
| +      bindings.ProxyBase exposedServices, String resolvedUrl) => _application | 
| +      ._acceptConnection(requestorUrl, services, exposedServices, resolvedUrl); | 
|  | 
| +  @override | 
| void requestQuit() => _application._requestQuitAndClose(); | 
|  | 
| -  void close({bool nodefer: false}) => shell.close(); | 
| +  Future close({bool nodefer: false}) { | 
| +    if (shell != null) shell.close(); | 
| +    return _stub.close(); | 
| +  } | 
| } | 
|  | 
| // TODO(zra): Better documentation and examples. | 
| @@ -48,23 +55,26 @@ class _ApplicationImpl implements application_mojom.Application { | 
| abstract class Application { | 
| _ApplicationImpl _applicationImpl; | 
| List<ApplicationConnection> _applicationConnections; | 
| +  Function onError; | 
|  | 
| Application(core.MojoMessagePipeEndpoint endpoint) { | 
| _applicationConnections = []; | 
| _applicationImpl = new _ApplicationImpl(this, endpoint); | 
| +    _applicationImpl.onError = _errorHandler; | 
| } | 
|  | 
| Application.fromHandle(core.MojoHandle appHandle) { | 
| _applicationConnections = []; | 
| _applicationImpl = new _ApplicationImpl.fromHandle(this, appHandle); | 
| +    _applicationImpl.onError = _errorHandler; | 
| } | 
|  | 
| void initialize(List<String> args, String url) {} | 
|  | 
| // TODO(skydart): This is a temporary fix to allow sky application to consume | 
| // mojo services. Do not use for any other purpose. | 
| -  void initializeFromShellProxy(shell_mojom.ShellProxy shellProxy, | 
| -      List<String> args, String url) => | 
| +  void initializeFromShellProxy( | 
| +          shell_mojom.ShellProxy shellProxy, List<String> args, String url) => | 
| _applicationImpl.initialize(shellProxy, args, url); | 
|  | 
| // Returns a connection to the app at |url|. | 
| @@ -88,23 +98,34 @@ abstract class Application { | 
| close(); | 
| } | 
|  | 
| -  void close() { | 
| +  void _errorHandler() { | 
| +    close().then((_) { | 
| +      if (onError != null) onError(); | 
| +    }); | 
| +  } | 
| + | 
| +  Future close() { | 
| +    assert(_applicationImpl != null); | 
| +    _applicationConnections.forEach((c) => c.close()); | 
| +    _applicationConnections.clear(); | 
| +    return _applicationImpl.close(); | 
| +  } | 
| + | 
| +  // This method closes all the application connections. Used during apptesting. | 
| +  void resetConnections() { | 
| assert(_applicationImpl != null); | 
| _applicationConnections.forEach((c) => c.close()); | 
| _applicationConnections.clear(); | 
| -    _applicationImpl.close(); | 
| } | 
|  | 
| void _acceptConnection(String requestorUrl, ServiceProviderStub services, | 
| -      ServiceProviderProxy exposedServices) { | 
| +      ServiceProviderProxy exposedServices, String resolvedUrl) { | 
| var connection = new ApplicationConnection(services, exposedServices); | 
| _applicationConnections.add(connection); | 
| -    acceptConnection(requestorUrl, connection); | 
| +    acceptConnection(requestorUrl, resolvedUrl, connection); | 
| } | 
|  | 
| // Override this method to provide services on |connection|. | 
| -  // If you provide at least one service or set fallbackServiceProvider, | 
| -  // then you must invoke connection.listen(). | 
| -  void acceptConnection(String requestorUrl, ApplicationConnection connection) { | 
| -  } | 
| +  void acceptConnection(String requestorUrl, String resolvedUrl, | 
| +      ApplicationConnection connection) {} | 
| } | 
|  |