Index: sdk/lib/developer/extension.dart |
diff --git a/sdk/lib/developer/extension.dart b/sdk/lib/developer/extension.dart |
index 95c3db2e7253eb3b3d2b7aab9bba0d2f5f2853b0..04b3149ccdae24594a5aebcfba4c3c36a41e7d39 100644 |
--- a/sdk/lib/developer/extension.dart |
+++ b/sdk/lib/developer/extension.dart |
@@ -102,54 +102,53 @@ void registerExtension(String method, ServiceExtensionHandler handler) { |
_extensions[method] = handler; |
} |
-bool _extensionExists(String method) { |
- return _extensions[method] != null; |
-} |
- |
-bool _invokeExtension(String method, |
- List<String> parameterKeys, |
- List<String> parameterValues, |
- SendPort replyPort, |
- Object id) { |
+bool _scheduleExtension(String method, |
+ List<String> parameterKeys, |
+ List<String> parameterValues, |
+ SendPort replyPort, |
+ Object id) { |
ServiceExtensionHandler handler = _extensions[method]; |
- assert(handler != null); |
- var parameters = {}; |
- for (var i = 0; i < parameterKeys.length; i++) { |
- parameters[parameterKeys[i]] = parameterValues[i]; |
- } |
- var response; |
- try { |
- response = handler(method, parameters); |
- } catch (e, st) { |
- var errorDetails = (st == null) ? '$e' : '$e\n$st'; |
- response = new ServiceExtensionResponse.error( |
- ServiceExtensionResponse.kExtensionError, |
- errorDetails); |
- _postResponse(replyPort, id, response); |
- return true; |
+ if (handler == null) { |
+ return false; |
} |
- if (response is! Future) { |
- response = new ServiceExtensionResponse.error( |
- ServiceExtensionResponse.kExtensionError, |
- "Extension handler must return a Future"); |
- _postResponse(replyPort, id, response); |
- return true; |
- } |
- response.catchError((e, st) { |
- var errorDetails = (st == null) ? '$e' : '$e\n$st'; |
- return new ServiceExtensionResponse.error( |
- ServiceExtensionResponse.kExtensionError, |
- errorDetails); |
- }).then((response) { |
- if (response == null) { |
+ // Defer execution of handler until next event loop. |
+ Timer.run(() { |
+ var parameters = {}; |
+ for (var i = 0; i < parameterKeys.length; i++) { |
+ parameters[parameterKeys[i]] = parameterValues[i]; |
+ } |
+ var response; |
+ try { |
+ response = handler(method, parameters); |
+ } catch (e, st) { |
+ var errorDetails = (st == null) ? '$e' : '$e\n$st'; |
response = new ServiceExtensionResponse.error( |
ServiceExtensionResponse.kExtensionError, |
- "Extension handler returned null"); |
+ errorDetails); |
+ _postResponse(replyPort, id, response); |
+ return; |
} |
- _postResponse(replyPort, id, response); |
+ if (response is! Future) { |
+ response = new ServiceExtensionResponse.error( |
+ ServiceExtensionResponse.kExtensionError, |
+ "Extension handler must return a Future"); |
+ _postResponse(replyPort, id, response); |
+ return; |
+ } |
+ response.catchError((e, st) { |
+ var errorDetails = (st == null) ? '$e' : '$e\n$st'; |
+ return new ServiceExtensionResponse.error( |
+ ServiceExtensionResponse.kExtensionError, |
+ errorDetails); |
+ }).then((response) { |
+ if (response == null) { |
+ response = new ServiceExtensionResponse.error( |
+ ServiceExtensionResponse.kExtensionError, |
+ "Extension handler returned null"); |
+ } |
+ _postResponse(replyPort, id, response); |
+ }); |
}); |
- // Push an event on the event loop so that we invoke the scheduled microtasks. |
- Timer.run(() {}); |
return true; |
} |