| Index: runtime/bin/directory_impl.dart | 
| diff --git a/runtime/bin/directory_impl.dart b/runtime/bin/directory_impl.dart | 
| index b5329350664d5be433b47b42d569ceb0ac884dec..8262e592f5f526b5655c209539b7a863f3607107 100644 | 
| --- a/runtime/bin/directory_impl.dart | 
| +++ b/runtime/bin/directory_impl.dart | 
| @@ -24,18 +24,21 @@ class _Directory implements Directory { | 
| static _delete(String path, bool recursive) native "Directory_Delete"; | 
| static SendPort _newServicePort() native "Directory_NewServicePort"; | 
|  | 
| -  void exists(void callback(bool exists)) { | 
| +  Future<bool> exists() { | 
| _ensureDirectoryService(); | 
| +    Completer<bool> completer = new Completer<bool>(); | 
| List request = new List(2); | 
| request[0] = kExistsRequest; | 
| request[1] = _path; | 
| _directoryService.call(request).then((response) { | 
| if (_isErrorResponse(response)) { | 
| -        _handleErrorResponse(response, "Exists failed"); | 
| +        var e = _exceptionFromResponse(response, "Exists failed"); | 
| +        completer.completeException(e); | 
| } else { | 
| -        callback(response == 1); | 
| +        completer.complete(response == 1); | 
| } | 
| }); | 
| +    return completer.future; | 
| } | 
|  | 
| bool existsSync() { | 
| @@ -49,18 +52,21 @@ class _Directory implements Directory { | 
| return (result == 1); | 
| } | 
|  | 
| -  void create(void callback()) { | 
| +  Future<Directory> create() { | 
| _ensureDirectoryService(); | 
| +    Completer<Directory> completer = new Completer<Directory>(); | 
| List request = new List(2); | 
| request[0] = kCreateRequest; | 
| request[1] = _path; | 
| _directoryService.call(request).then((response) { | 
| if (_isErrorResponse(response)) { | 
| -        _handleErrorResponse(response, "Creation failed"); | 
| +        var e = _exceptionFromResponse(response, "Creation failed"); | 
| +        completer.completeException(e); | 
| } else { | 
| -        callback(); | 
| +        completer.complete(this); | 
| } | 
| }); | 
| +    return completer.future; | 
| } | 
|  | 
| void createSync() { | 
| @@ -73,19 +79,23 @@ class _Directory implements Directory { | 
| } | 
| } | 
|  | 
| -  void createTemp(void callback()) { | 
| +  Future<Directory> createTemp() { | 
| _ensureDirectoryService(); | 
| +    Completer<Directory> completer = new Completer<Directory>(); | 
| List request = new List(2); | 
| request[0] = kCreateTempRequest; | 
| request[1] = _path; | 
| _directoryService.call(request).then((response) { | 
| if (_isErrorResponse(response)) { | 
| -        _handleErrorResponse(response, "Creation of temporary directory failed"); | 
| +        var e = | 
| +            _exceptionFromResponse(response, | 
| +                                   "Creation of temporary directory failed"); | 
| +        completer.completeException(e); | 
| } else { | 
| -        _path = response; | 
| -        callback(); | 
| +        completer.complete(new Directory(response)); | 
| } | 
| }); | 
| +    return completer.future; | 
| } | 
|  | 
| void createTempSync() { | 
| @@ -98,30 +108,33 @@ class _Directory implements Directory { | 
| _path, | 
| result); | 
| } | 
| -    _path = result; | 
| +    return new Directory(result); | 
| } | 
|  | 
| -  void _deleteHelper(bool recursive, String errorMsg, void callback()) { | 
| +  Future<Directory> _deleteHelper(bool recursive, String errorMsg) { | 
| _ensureDirectoryService(); | 
| +    Completer<Directory> completer = new Completer<Directory>(); | 
| List request = new List(3); | 
| request[0] = kDeleteRequest; | 
| request[1] = _path; | 
| request[2] = recursive; | 
| _directoryService.call(request).then((response) { | 
| if (_isErrorResponse(response)) { | 
| -        _handleErrorResponse(response, errorMsg); | 
| +        var e = _exceptionFromResponse(response, errorMsg); | 
| +        completer.completeException(e); | 
| } else { | 
| -        callback(); | 
| +        completer.complete(this); | 
| } | 
| }); | 
| +    return completer.future; | 
| } | 
|  | 
| -  void delete(void callback()) { | 
| -    _deleteHelper(false, "Deletion failed", callback); | 
| +  Future<Directory> delete() { | 
| +    return _deleteHelper(false, "Deletion failed"); | 
| } | 
|  | 
| -  void deleteRecursively(void callback()) { | 
| -    _deleteHelper(true, "Deletion failed", callback); | 
| +  Future<Directory> deleteRecursively() { | 
| +    return _deleteHelper(true, "Deletion failed"); | 
| } | 
|  | 
| void deleteSync() { | 
| @@ -144,7 +157,42 @@ class _Directory implements Directory { | 
| } | 
| } | 
|  | 
| -  void list([bool recursive = false]) { | 
| +  DirectoryLister list([bool recursive = false]) { | 
| +    return new _DirectoryLister(_path, recursive); | 
| +  } | 
| + | 
| +  String get path() { return _path; } | 
| + | 
| +  bool _isErrorResponse(response) { | 
| +    return response is List && response[0] != _FileUtils.kSuccessResponse; | 
| +  } | 
| + | 
| +  Exception _exceptionFromResponse(response, String message) { | 
| +    assert(_isErrorResponse(response)); | 
| +    switch (response[_FileUtils.kErrorResponseErrorType]) { | 
| +      case _FileUtils.kIllegalArgumentResponse: | 
| +        return new IllegalArgumentException(); | 
| +      case _FileUtils.kOSErrorResponse: | 
| +        var err = new OSError(response[_FileUtils.kOSErrorResponseMessage], | 
| +                              response[_FileUtils.kOSErrorResponseErrorCode]); | 
| +        return new DirectoryIOException(message, _path, err); | 
| +      default: | 
| +        return new Exception("Unknown error"); | 
| +    } | 
| +  } | 
| + | 
| +  void _ensureDirectoryService() { | 
| +    if (_directoryService == null) { | 
| +      _directoryService = _newServicePort(); | 
| +    } | 
| +  } | 
| + | 
| +  final String _path; | 
| +  SendPort _directoryService; | 
| +} | 
| + | 
| +class _DirectoryLister implements DirectoryLister { | 
| +  _DirectoryLister(String path, bool recursive) { | 
| final int kListDirectory = 0; | 
| final int kListFile = 1; | 
| final int kListError = 2; | 
| @@ -156,13 +204,13 @@ class _Directory implements Directory { | 
| final int kResponseError = 2; | 
|  | 
| List request = new List(3); | 
| -    request[0] = kListRequest; | 
| -    request[1] = _path; | 
| +    request[0] = _Directory.kListRequest; | 
| +    request[1] = path; | 
| request[2] = recursive; | 
| ReceivePort responsePort = new ReceivePort(); | 
| // Use a separate directory service port for each listing as | 
| // listing operations on the same directory can run in parallel. | 
| -    _newServicePort().send(request, responsePort.toSendPort()); | 
| +    _Directory._newServicePort().send(request, responsePort.toSendPort()); | 
| responsePort.receive((message, replyTo) { | 
| if (message is !List || message[kResponseType] is !int) { | 
| responsePort.close(); | 
| @@ -216,14 +264,6 @@ class _Directory implements Directory { | 
| _onError = onError; | 
| } | 
|  | 
| -  String get path() { return _path; } | 
| - | 
| -  void _ensureDirectoryService() { | 
| -    if (_directoryService == null) { | 
| -      _directoryService = _newServicePort(); | 
| -    } | 
| -  } | 
| - | 
| void _reportError(e) { | 
| if (_onError != null) { | 
| _onError(e); | 
| @@ -232,32 +272,8 @@ class _Directory implements Directory { | 
| } | 
| } | 
|  | 
| -  bool _isErrorResponse(response) { | 
| -    return response is List && response[0] != _FileUtils.kSuccessResponse; | 
| -  } | 
| - | 
| -  void _handleErrorResponse(response, String message) { | 
| -    assert(_isErrorResponse(response)); | 
| -    switch (response[_FileUtils.kErrorResponseErrorType]) { | 
| -      case _FileUtils.kIllegalArgumentResponse: | 
| -        _reportError(new IllegalArgumentException()); | 
| -        break; | 
| -      case _FileUtils.kOSErrorResponse: | 
| -        var err = new OSError(response[_FileUtils.kOSErrorResponseMessage], | 
| -                              response[_FileUtils.kOSErrorResponseErrorCode]); | 
| -        _reportError(new DirectoryIOException(message, _path, err)); | 
| -        break; | 
| -      default: | 
| -        _reportError(new Exception("Unknown error")); | 
| -        break; | 
| -    } | 
| -  } | 
| - | 
| Function _onDir; | 
| Function _onFile; | 
| Function _onDone; | 
| Function _onError; | 
| - | 
| -  String _path; | 
| -  SendPort _directoryService; | 
| } | 
|  |