Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(226)

Side by Side Diff: sdk/lib/developer/extension.dart

Issue 1299493007: Rework service extensions to be safe (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« runtime/vm/isolate.cc ('K') | « runtime/vm/symbols.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of dart.developer; 5 part of dart.developer;
6 6
7 class ServiceExtensionResponse { 7 class ServiceExtensionResponse {
8 final String _result; 8 final String _result;
9 final int _errorCode; 9 final int _errorCode;
10 final String _errorDetail; 10 final String _errorDetail;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 throw new ArgumentError('Extension already registered: $method'); 95 throw new ArgumentError('Extension already registered: $method');
96 } 96 }
97 if (handler is! ServiceExtensionHandler) { 97 if (handler is! ServiceExtensionHandler) {
98 throw new ArgumentError.value(handler, 98 throw new ArgumentError.value(handler,
99 'handler', 99 'handler',
100 'Must be a ServiceExtensionHandler'); 100 'Must be a ServiceExtensionHandler');
101 } 101 }
102 _extensions[method] = handler; 102 _extensions[method] = handler;
103 } 103 }
104 104
105 bool _scheduleExtension(String method, 105 Object _scheduleExtension(String method,
turnidge 2015/08/20 17:34:39 Function?
Cutch 2015/08/20 18:09:37 Done.
106 List<String> parameterKeys, 106 List<String> parameterKeys,
107 List<String> parameterValues, 107 List<String> parameterValues,
108 SendPort replyPort, 108 SendPort replyPort,
109 Object id) { 109 Object id) {
110 ServiceExtensionHandler handler = _extensions[method]; 110 ServiceExtensionHandler handler = _extensions[method];
111 if (handler == null) { 111 if (handler == null) {
112 return false; 112 return null;
113 } 113 }
114 // Defer execution of handler until next event loop. 114 // This closure will be executed at the next turn of the event loop.
115 Timer.run(() { 115 return () {
116 var parameters = {}; 116 var parameters = {};
117 for (var i = 0; i < parameterKeys.length; i++) { 117 for (var i = 0; i < parameterKeys.length; i++) {
118 parameters[parameterKeys[i]] = parameterValues[i]; 118 parameters[parameterKeys[i]] = parameterValues[i];
119 } 119 }
120 var response; 120 var response;
121 try { 121 try {
122 response = handler(method, parameters); 122 response = handler(method, parameters);
123 } catch (e, st) { 123 } catch (e, st) {
124 var errorDetails = (st == null) ? '$e' : '$e\n$st'; 124 var errorDetails = (st == null) ? '$e' : '$e\n$st';
125 response = new ServiceExtensionResponse.error( 125 response = new ServiceExtensionResponse.error(
(...skipping 15 matching lines...) Expand all
141 ServiceExtensionResponse.kExtensionError, 141 ServiceExtensionResponse.kExtensionError,
142 errorDetails); 142 errorDetails);
143 }).then((response) { 143 }).then((response) {
144 if (response == null) { 144 if (response == null) {
145 response = new ServiceExtensionResponse.error( 145 response = new ServiceExtensionResponse.error(
146 ServiceExtensionResponse.kExtensionError, 146 ServiceExtensionResponse.kExtensionError,
147 "Extension handler returned null"); 147 "Extension handler returned null");
148 } 148 }
149 _postResponse(replyPort, id, response); 149 _postResponse(replyPort, id, response);
150 }); 150 });
151 }); 151 };
152 return true;
153 } 152 }
154 153
155 _postResponse(SendPort replyPort, 154 _postResponse(SendPort replyPort,
156 Object id, 155 Object id,
157 ServiceExtensionResponse response) { 156 ServiceExtensionResponse response) {
158 assert(replyPort != null); 157 assert(replyPort != null);
159 if (id == null) { 158 if (id == null) {
160 // No id -> no response. 159 // No id -> no response.
161 replyPort.send(null); 160 replyPort.send(null);
162 return; 161 return;
163 } 162 }
164 assert(id != null); 163 assert(id != null);
165 StringBuffer sb = new StringBuffer(); 164 StringBuffer sb = new StringBuffer();
166 sb.write('{"jsonrpc":"2.0",'); 165 sb.write('{"jsonrpc":"2.0",');
167 if (response._isError()) { 166 if (response._isError()) {
168 sb.write('"error":'); 167 sb.write('"error":');
169 } else { 168 } else {
170 sb.write('"result":'); 169 sb.write('"result":');
171 } 170 }
172 sb.write('${response._toString()},'); 171 sb.write('${response._toString()},');
173 if (id is String) { 172 if (id is String) {
174 sb.write('"id":"$id"}'); 173 sb.write('"id":"$id"}');
175 } else { 174 } else {
176 sb.write('"id":$id}'); 175 sb.write('"id":$id}');
177 } 176 }
178 replyPort.send(sb.toString()); 177 replyPort.send(sb.toString());
179 } 178 }
OLDNEW
« runtime/vm/isolate.cc ('K') | « runtime/vm/symbols.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698