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

Side by Side Diff: dart/frog/lib/node/node.dart

Issue 10164004: Remove frogsh. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased Created 8 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « dart/frog/lib/frog_coreimpl_sources.gypi ('k') | dart/frog/minfrog » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
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.
4
5 /**
6 * A collection of helper io functions implemented using node.js.
7 *
8 * Idea is to clone the node.js API as closely as possible while adding types.
9 * Dart libraries on top of this will experiment with different APIs.
10 */
11 #library('node');
12
13 // The sandbox needs to import the constructor functions for all the non-hidden native types we use.
14
15 var createSandbox() native
16 """return {'require': require, 'process': process, 'console': console,
17 'Buffer' : Buffer,
18 'setTimeout\$': this.setTimeout, 'clearTimeout': clearTimeout};""";
19
20 typedef void RequestListener(ServerRequest request, ServerResponse response);
21
22 // TODO(nweiz): properly title-case these class names
23
24 class http native "require('http')" {
25 static Server createServer(RequestListener listener) native;
26 }
27
28 class Server native "http.Server" {
29 void listen(int port, [String hostname, Function callback]) native;
30 }
31
32 class ServerRequest native "http.IncomingMessage" {
33 final String method;
34 final String url;
35 final Map<String, String> headers;
36 final String httpVersion;
37
38 void setEncoding([String encoding]) {}
39 }
40
41 class ServerResponse native "http.ServerResponse" {
42 int statusCode;
43
44 void setHeader(String name, String value) native;
45
46 String getHeader(String name) native;
47
48 void removeHeader(String name) native;
49
50 void write(String data, [String encoding = 'utf8']) native;
51
52 void end([String data, String encoding = 'utf8']) native;
53 }
54
55 class Console native "Console" {
56 // TODO(jimhug): Map node.js's ability to take multiple args to what?
57 void log(String text) native;
58 void info(String text) native;
59 void warn(String text) native;
60 void error(String text) native;
61 void dir(Object obj) native;
62 void time(String label) native;
63 void timeEnd(String label) native;
64 void trace() native;
65 void assert(bool value, [String message]) native;
66 }
67
68 Console get console()
69 native "return console;";
70
71 /**
72 Implement as much of EventEmitter polymorphically as is possible,
73 given that frogsh function objects do not interoperate perfectly with
74 JavaScript function objects
75 */
76
77 // typedef EventListener([arg1, arg2, arg3]);
78
79 interface EventEmitter {
80 // void addListener(String event, EventListener listener);
81 // void on(String event, EventListener listener);
82 // void once(String event, EventListener listener);
83 // void removeListener(String event, EventListener listener);
84 // List<EventListener> listeners(String event);
85 void removeAllListeners(String event);
86 void setMaxListeners(num n);
87 // TODO(jackpal): use rest arguments
88 void emit(String event, [var arg1, var arg2, var arg3]);
89 }
90
91 typedef void ProcessExitListener();
92 typedef void ProcessUncaughtExceptionListener(Exception err);
93 typedef void ProcessSignalListener();
94
95 class Process implements EventEmitter native "Process" {
96 var _process;
97
98 // Note: This is not an exhaustive list of signals. Check with your
99 // OS documentation for sigaction to see which signals are
100 // available in your OS.
101
102 final SIGHUP='SIGHUP';
103 final SIGINT='SIGINT';
104 final SIGQUIT='SIGQUIT';
105 final SIGILL='SIGILL';
106 final SIGTRAP='SIGTRAP';
107 final SIGABRT='SIGABRT';
108 final SIGEMT='SIGEMT';
109 final SIGFPE='SIGFPE';
110 final SIGKILL='SIGKILL';
111 final SIGBUS='SIGBUS';
112 final SIGSEGV='SIGSEGV';
113 final SIGSYS='SIGSYS';
114 final SIGPIPE='SIGPIPE';
115 final SIGALRM='SIGALRM';
116 final SIGTERM='SIGTERM';
117 final SIGURG='SIGURG';
118 final SIGSTOP='SIGSTOP';
119 final SIGTSTP='SIGTSTP';
120 final SIGCONT='SIGCONT';
121 final SIGCHLD='SIGCHLD';
122 final SIGTTIN='SIGTTIN';
123 final SIGTTOU='SIGTTOU';
124 final SIGIO='SIGIO';
125 final SIGXCPU='SIGXCPU';
126 final SIGXFSZ='SIGXFSZ';
127 final SIGVTALRM='SIGVTALRM';
128 final SIGPROF='SIGPROF';
129 final SIGWINCH='SIGWINCH';
130 final SIGINFO='SIGINFO';
131 final SIGUSR1='SIGUSR1';
132 final SIGUSR2='SIGUSR2';
133
134 Process(var this._process);
135
136 // Implement EventEmitter
137 void removeAllListeners(String event)
138 native "this._process.removeAllListeners(event);";
139 void setMaxListeners(num n)
140 native "this._process.setMaxListeners(n);";
141 void emit(String event, [var arg1, var arg2, var arg3])
142 native "this._process.emit(event, arg1, arg2, arg3)";
143
144 // Exit event
145 void emitExit()
146 native "this._process.emit('exit');";
147 void addListenerExit(ProcessExitListener listener)
148 native "this._process.addListener('exit', listener);";
149 void onExit(ProcessExitListener listener)
150 native "this._process.on('exit', listener);";
151 void onceExit(ProcessExitListener listener)
152 native "this._process.once('exit', listener);";
153 void removeListenerExit(ProcessExitListener listener)
154 native "this._process.removeListener('exit', listener);";
155 List<ProcessExitListener> listenersExit()
156 native "return this._process.listeners('exit');";
157
158 // UncaughtException event
159 void emitUncaughtException(Exception err)
160 native "this._process.emit('uncaughtException', err);";
161 void addListenerUncaughtException(ProcessUncaughtExceptionListener listener)
162 native "this._process.addListener('uncaughtException', listener);";
163 void onUncaughtException(ProcessUncaughtExceptionListener listener)
164 native "this._process.on('uncaughtException', listener);";
165 void onceUncaughtException(ProcessUncaughtExceptionListener listener)
166 native "this._process.once('uncaughtException', listener);";
167 void removeListenerUncaughtException(
168 ProcessUncaughtExceptionListener listener)
169 native "this._process.removeListener('uncaughtException', listener);";
170 List<ProcessUncaughtExceptionListener> listenersUncaughtException()
171 native "return this._process.listeners('uncaughtException');";
172
173 // Signal events
174 void emitSignal(String signal)
175 native "this._process.emit(signal);";
176 void addListenerSignal(String signal, ProcessSignalListener listener)
177 native "this._process.addListener(signal, listener);";
178 void onSignal(String signal, ProcessSignalListener listener)
179 native "this._process.on(signal, listener);";
180 void onceSignal(String signal, ProcessSignalListener listener)
181 native "this._process.once(signal, listener);";
182 void removeListenerSignal(String signal, ProcessSignalListener listener)
183 native "this._process.removeListener(signal, listener);";
184 List<ProcessSignalListener> listenersSignal(String signal)
185 native "return this._process.listeners(signal);";
186
187 WritableStream get stdout()
188 native "return this._process.stdout;";
189 WritableStream get stderr()
190 native "return this._process.stderr;";
191 ReadableStream get stdin()
192 native "return this._process.stdin;";
193
194 List<String> get argv()
195 native "return this._process.argv;";
196 void set argv(List<String> value)
197 native "this._process.argv = value;";
198 String get execPath()
199 native "return this._process.execPath;";
200 String chdir(String directory)
201 native "this._process.chdir(directory);";
202
203 String cwd()
204 native "return this._process.cwd();";
205
206 EnvMap get env() => new EnvMap(_process);
207
208 void exit([int code = 0])
209 native "this._process.exit(code);";
210 int getgid()
211 native "return this._process.getgid();";
212 void setgid(var gid_or_groupname)
213 native "this._process.setgid(uid_or_groupname);";
214 int getuid()
215 native "return this._process.getuid();";
216 void setuid(var uid_or_username)
217 native "this._process.setuid(uid_or_groupname);";
218 String get version()
219 native "return this._process.version;";
220 String get installPrefix()
221 native "return this._process.installPrefix;";
222 void kill(int pid, [String signal=SIGTERM])
223 native "this._process.kill(pid, signal);";
224 int get pid()
225 native "return this._process.pid;";
226 String get title()
227 native "return this._process.title;";
228 String get platform()
229 native "return this._process.platform;";
230
231 // TODO(jackpal) implement Map memoryUsage() native;
232 void nextTick(Function callback)
233 native "return this._process.nextTick(callback);";
234 int umask([int mask])
235 native "return this._process.umask(mask);";
236 }
237
238 var get _process()
239 native "return process;";
240
241 Process get process() {
242 return new Process(_process);
243 }
244
245 class EnvMap {
246 var _process;
247 const EnvMap(this._process);
248 operator [](key) native "return this._process.env[key];";
249
250 }
251
252 typedef void UtilPumpCallback(var error);
253
254 class util native "require('util')" {
255 static void debug(String string) native;
256 static void log(String string) native;
257 static void inspect(var object, [bool showHidden=false, num depth=2]) native;
258 static pump(ReadableStream readableStream, WritableStream writeableStream,
259 [UtilPumpCallback callback]) native;
260 // the method inherits(a,b) doesn't make sense for Dart
261 }
262
263 // Object is either a Buffer or a String, depending upon whether setEncoding has been called.
264 typedef void ReadableStreamDataListener(var object);
265 typedef void ReadableStreamEndListener();
266 typedef void ReadableStreamErrorListener(Object exception);
267 typedef void ReadableStreamCloseListener();
268
269 class ReadableStream implements EventEmitter native "*ReadStream" {
270 // EventEmitter
271 void removeAllListeners(String event) native;
272 void setMaxListeners(num n) native;
273 void emit(String event, [var arg1, var arg2, var arg3]) native;
274
275 // Data event
276 void emitData(var data)
277 native "this.emit('data', data);";
278 void addListenerData(ReadableStreamDataListener listener)
279 native "this.addListener('data', listener);";
280 void onData(ReadableStreamDataListener listener)
281 native "this.on('data', listener);";
282 void onceData(ReadableStreamDataListener listener)
283 native "this.once('data', listener);";
284 void removeListenerData(ReadableStreamDataListener listener)
285 native "this.removeListener('data', listener);";
286 List<ReadableStreamDataListener> listenersData()
287 native "return this._process.listeners('data');";
288
289 // End event
290 void emitEnd()
291 native "this.emit('end');";
292 void addListenerEnd(ReadableStreamEndListener listener)
293 native "this.addListener('end', listener);";
294 void onEnd(ReadableStreamEndListener listener)
295 native "this.on('end', listener);";
296 void onceEnd(ReadableStreamEndListener listener)
297 native "this.once('end', listener);";
298 void removeListenerEnd(ReadableStreamEndListener listener)
299 native "this.removeListener('end', listener);";
300 List<ReadableStreamEndListener> listenersEnd()
301 native "return this._process.listeners('end');";
302
303 // Error event
304 void emitError(Object exception)
305 native "this.emit('error', exception);";
306 void addListenerError(ReadableStreamErrorListener listener)
307 native "this.addListener('error', listener);";
308 void onError(ReadableStreamErrorListener listener)
309 native "this.on('error', listener);";
310 void onceError(ReadableStreamErrorListener listener)
311 native "this.once('error', listener);";
312 void removeListenerError(ReadableStreamErrorListener listener)
313 native "this.removeListener('error', listener);";
314 List<ReadableStreamErrorListener> listenersError()
315 native "return this._process.listeners('error');";
316
317 // Close event
318 void emitClose()
319 native "this.emit('close');";
320 void addListenerClose(ReadableStreamCloseListener listener)
321 native "this.addListener('close', listener);";
322 void onClose(ReadableStreamCloseListener listener)
323 native "this.on('close', listener);";
324 void onceClose(ReadableStreamCloseListener listener)
325 native "this.once('close', listener);";
326 void removeListenerClose(ReadableStreamCloseListener listener)
327 native "this.removeListener('close', listener);";
328 List<ReadableStreamCloseListener> listenersClose()
329 native "return this._process.listeners('close');";
330
331 bool readable;
332 void setEncoding(String encoding) native;
333 void pause() native;
334 void resume() native;
335 void destroy() native;
336 void destroySoon() native;
337 void pipe(WritableStream destination, [bool end=true])
338 native "this.pipe(destination, {'end': end});";
339 }
340
341 typedef void WritableStreamDrainListener();
342 typedef void WritableStreamErrorListener(Object exception);
343 typedef void WritableStreamCloseListener();
344 typedef void WritableStreamPipeListener(ReadableStream src);
345
346 class WritableStream implements EventEmitter native "*WriteStream" {
347 // EventEmitter
348 void removeAllListeners(String event) native "this._writeStream.removeAllListe ners(event);";
349 void setMaxListeners(num n) native;
350 void emit(String event, [var arg1, var arg2, var arg3]) native;
351
352 // Drain event
353 void emitDrain()
354 native "this.emit('drain');";
355 void addListenerDrain(WritableStreamDrainListener listener)
356 native "this.addListener('drain', listener);";
357 void onDrain(WritableStreamDrainListener listener)
358 native "this.on('drain', listener);";
359 void onceDrain(WritableStreamDrainListener listener)
360 native "this.once('drain', listener);";
361 void removeListenerDrain(WritableStreamDrainListener listener)
362 native "this.removeListener('drain', listener);";
363 List<WritableStreamDrainListener> listenersDrain()
364 native "return this._process.listeners('drain');";
365
366 // Error event
367 void emitError(Object exception)
368 native "this.emit('error', exception);";
369 void addListenerError(WritableStreamErrorListener listener)
370 native "this.addListener('error', listener);";
371 void onError(WritableStreamErrorListener listener)
372 native "this.on('error', listener);";
373 void onceError(WritableStreamErrorListener listener)
374 native "this.once('error', listener);";
375 void removeListenerError(WritableStreamErrorListener listener)
376 native "this.removeListener('error', listener);";
377 List<WritableStreamErrorListener> listenersError()
378 native "return this._process.listeners('error');";
379
380 // Close event
381 void emitClose()
382 native "this.emit('close');";
383 void addListenerClose(WritableStreamCloseListener listener)
384 native "this.addListener('close', listener);";
385 void onClose(WritableStreamCloseListener listener)
386 native "this.on('close', listener);";
387 void onceClose(WritableStreamCloseListener listener)
388 native "this.once('close', listener);";
389 void removeListenerClose(WritableStreamCloseListener listener)
390 native "this.removeListener('close', listener);";
391 List<WritableStreamCloseListener> listenersClose()
392 native "return this._process.listeners('close');";
393
394 // Pipe event
395 void emitPipe(ReadableStream src)
396 native "this.emit('pipe', src);";
397 void addListenerPipe(WritableStreamPipeListener listener)
398 native "this.addListener('pipe', listener);";
399 void onPipe(WritableStreamPipeListener listener)
400 native "this.on('pipe', listener);";
401 void oncePipe(WritableStreamPipeListener listener)
402 native "this.once('pipe', listener);";
403 void removeListenerPipe(WritableStreamPipeListener listener)
404 native "this.removeListener('pipe', listener);";
405 List<WritableStreamPipeListener> listenersPipe()
406 native "return this._process.listeners('pipe');";
407
408 bool writable;
409 bool write(String string, [String encoding='utf8', int fd]) native;
410 bool writeBuffer(Buffer buffer) native;
411 void end([String string, String encoding='utf8']) native;
412 void endBuffer(Buffer buffer) native "this.end(buffer);";
413 void destroy() native;
414 void destroySoon() native;
415 }
416
417 class vm native "require('vm')" {
418 static void runInThisContext(String code, [String filename]) native;
419 static void runInNewContext(String code, [var sandbox, String filename])
420 native;
421 static Script createScript(String code, [String filename]) native;
422 static Context createContext([sandbox]) native;
423 static runInContext(String code, Context context, [String filename]) native;
424 }
425
426 interface Context {}
427
428 class Script native "vm.Script" {
429 void runInThisContext() native;
430 void runInNewContext([Map sandbox]) native;
431 }
432
433 class fs native "require('fs')" {
434 static void writeFileSync(String outfile, String text) native;
435
436 static String readFileSync(String filename, [String encoding = 'utf8'])
437 native;
438
439 static String realpathSync(String path) native;
440
441 static void mkdirSync(String path, [num mode = 511 /* 0777 octal */]) native;
442 static List<String> readdirSync(String path) native;
443 static void rmdirSync(String path) native;
444 static Stats statSync(String path) native;
445 static void unlinkSync(String path) native;
446
447 static void writeSync(int fd, String text) native;
448 static int openSync(String path, String flags,
449 [num mode = 438] /* 0666 octal */) native;
450 static void closeSync(int fd) native;
451 }
452
453 class Stats native "fs.Stats" {
454 bool isFile() native;
455 bool isDirectory() native;
456 bool isBlockDevice() native;
457 bool isCharacterDevice() native;
458 bool isSymbolicLink() native;
459 bool isFIFO() native;
460 bool isSocket() native;
461
462 // TODO(rnystrom): There are also the other fields we can add here if needed.
463 // See: http://nodejs.org/docs/v0.6.1/api/fs.html#fs.Stats.
464 }
465
466 class path native "require('path')" {
467 static bool existsSync(String filename) native;
468 static String dirname(String path) native;
469 static String basename(String path) native;
470 static String extname(String path) native;
471 static String normalize(String path) native;
472 // TODO(jimhug): Get the right signatures for normalizeArray and join
473 }
474
475 class Readline native "require('readline')" {
476 static ReadlineInterface createInterface(input, output) native;
477 }
478
479 class ReadlineInterface native "Readline.Interface" {
480 void setPrompt(String prompt, [int length]) native;
481 void prompt() native;
482 void on(String event, Function callback) native;
483 }
484
485 interface TimeoutId {}
486
487 TimeoutId setTimeout(Function callback, num delay, [arg]) native;
488 clearTimeout(TimeoutId id) native;
489
490 typedef void ChildProcessExitListener(int code, String signal);
491
492 class ChildProcess implements EventEmitter native "ChildProcess" {
493 var _childprocess;
494
495 ChildProcess(this._childprocess);
496
497 // EventEmitter
498 void removeAllListeners(String event)
499 native "this._childprocess.removeAllListeners(event);";
500 void setMaxListeners(num n)
501 native "this._childprocess.setMaxListeners(n);";
502 void emit(String event, [var arg1, var arg2, var arg3])
503 native "this._childprocess.emit(event, arg1, arg2, arg3);";
504
505 // 'exit' event
506 void addListenerExit(ChildProcessExitListener listener)
507 native "this._childprocess.addListener('exit', listener);";
508 void onExit(ChildProcessExitListener listener)
509 native "this._childprocess.on('exit', listener);";
510 void onceExit(ChildProcessExitListener listener)
511 native "this._childprocess.once('exit', listener);";
512 void removeListenerExit(ChildProcessExitListener listener)
513 native "this._childprocess.removeListener('exit', listener);";
514 List<ChildProcessExitListener> listenersExit()
515 native "return this._childprocess.listeners('exit');";
516
517 WritableStream get stdin()
518 native "return this._childprocess.stdin;";
519
520 ReadableStream get stdout()
521 native "return this._childprocess.stdout;";
522 ReadableStream get stderr()
523 native "return this._childprocess.stderr;";
524 int get pid()
525 native "return this._childprocess.pid;";
526 }
527
528 typedef void Child_processCallback(Error error, String stdout, String stderr);
529
530 class Child_process native {
531 var _cp;
532
533 Child_process() {
534 _cp = _get_child_process();
535 }
536
537 // TODOO(jackpal): translate options into a Javascript dictionary
538 ChildProcess spawn(String command, [List<String> args,
539 Map<String, Object> options]){
540 return new ChildProcess(_spawn(_cp, command, args));
541 }
542
543 // TODOO(jackpal): translate options into a Javascript dictionary
544 ChildProcess exec(String command, Child_processCallback callback,
545 [Map<String, Object> options]) {
546 // Note the argument order to exec is different than to _exec,
547 // because Dart can't have optional arguments in the middle of
548 // an argument list.
549 return new ChildProcess(_exec(_cp, command, options, callback));
550 }
551
552 static var _spawn(var cp, String command, List<String> args)
553 native "return cp.spawn(command, args);";
554 static var _exec(var cp, String command, Map<String, Object> options,
555 Child_processCallback callback)
556 native "return cp.exec(command, options, callback);";
557
558 static var _get_child_process()
559 native "return require('child_process');";
560 }
561
562 var get child_process() {
563 return new Child_process();
564 }
565
566 class Buffer native "Buffer" {
567 Buffer(int size) native;
568 Buffer.fromSize(int size)
569 native "return new Buffer(size);";
570 Buffer.fromList(List<int> list)
571 native "return new Buffer(list);";
572 Buffer.fromString(String string, [String encoding='utf8'])
573 native "return new Buffer(string, encoding);";
574 // the default length is buffer.length-offset
575 int write(String string, int offset, int length, [String encoding='utf8'])
576 native;
577 static int get charsWritten()
578 native "return Buffer._charsWritten;";
579 String toString(String encoding, int start, int end) native;
580 int operator[](int index)
581 native "return this[index];";
582 int operator[]=(int index, int value)
583 native "this[index] = value; return value;";
584 static bool isBuffer(obj) native;
585 static int byteLength(String string, [String encoding='utf8']) native;
586 int length;
587 void copy(Buffer targetBuffer, int targetStart, int sourceStart, int sourceEnd ) native;
588 Buffer slice(int start, int end) native;
589
590 int readUInt8(int offset, [bool noAssert=false]) native;
591 int readUInt16LE(int offset, [bool noAssert=false]) native;
592 int readUInt16BE(int offset, [bool noAssert=false]) native;
593 int readUInt32LE(int offset, [bool noAssert=false]) native;
594 int readUInt32BE(int offset, [bool noAssert=false]) native;
595
596 int readInt8(int offset, [bool noAssert=false]) native;
597 int readInt16LE(int offset, [bool noAssert=false]) native;
598 int readInt16BE(int offset, [bool noAssert=false]) native;
599 int readInt32LE(int offset, [bool noAssert=false]) native;
600 int readInt32BE(int offset, [bool noAssert=false]) native;
601
602 double readFloatLE(int offset, [bool noAssert=false]) native;
603 double readFloatBE(int offset, [bool noAssert=false]) native;
604 double readDoubleLE(int offset, [bool noAssert=false]) native;
605 double readDoubleBE(int offset, [bool noAssert=false]) native;
606
607 void writeUInt8(int value, int offset, [bool noAssert=false]) native;
608 void writeUInt16LE(int value, int offset, [bool noAssert=false]) native;
609 void writeUInt16BE(int value, int offset, [bool noAssert=false]) native;
610 void writeUInt32LE(int value, int offset, [bool noAssert=false]) native;
611 void writeUInt32BE(int value, int offset, [bool noAssert=false]) native;
612
613 void writeInt8(int value, int offset, [bool noAssert=false]) native;
614 void writeInt16LE(int value, int offset, [bool noAssert=false]) native;
615 void writeInt16BE(int value, int offset, [bool noAssert=false]) native;
616 void writeInt32LE(int value, int offset, [bool noAssert=false]) native;
617 void writeInt32BE(int value, int offset, [bool noAssert=false]) native;
618
619 void writeFloatLE(double value, int offset, [bool noAssert=false]) native;
620 void writeFloatBE(double value, int offset, [bool noAssert=false]) native;
621 void writeDoubleLE(double value, int offset, [bool noAssert=false]) native;
622 void writeDoubleBE(double value, int offset, [bool noAssert=false]) native;
623
624 // end defaults to buffer.length
625 void fill(int value, int offset, int end) native;
626
627 static int INSPECT_MAX_BYTES;
628 }
629
630 class Error native "Error" {
631 var stack;
632 var arguments;
633 var type;
634 String message;
635 bool killed;
636 int code;
637 String signal;
638 }
OLDNEW
« no previous file with comments | « dart/frog/lib/frog_coreimpl_sources.gypi ('k') | dart/frog/minfrog » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698