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

Side by Side Diff: sdk/lib/js/dart2js/js_dart2js.dart

Issue 15782009: RFC: introduce dart:js (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: remove Element handling + fix js_dartium for passing tests Created 7 years, 6 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
OLDNEW
(Empty)
1 // Copyright (c) 2013, 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 library dart.js;
6
7 import 'dart:_foreign_helper' show JS;
8 import 'dart:_js_helper' show convertDartClosureToJS;
9
10 JsObject get context {
11 return new JsObject._fromJs(JS('=Object', 'window'));
12 }
13
14 scoped(f) => f();
15
16 dynamic retain(Serializable<JsObject> object) {}
17 void release(Serializable<JsObject> object) {}
18
19 JsObject jsify(dynamic data) => data == null ? null : new JsObject._json(data);
20
21 class Callback implements Serializable<JsFunction> {
22 final Function _f; // here to allow capture in closure
23 final bool _withThis; // here to allow capture in closure
24 dynamic _jsFunction;
25
26 Callback._internal(this._f, this._withThis) {
27 _jsFunction = JS('=Object', r'''
28 (function(){
29 var f = #;
30 return function(){
31 return f(this, Array.prototype.slice.apply(arguments));
32 };
33 }).apply(this)''', convertDartClosureToJS(_call, 2));
34 }
35
36 _call(thisArg, List args) {
37 final arguments = new List.from(args);
38 if (_withThis) arguments.insert(0, thisArg);
39 final dartArgs = arguments.map(_convertToDart).toList();
40 return _convertToJS(Function.apply(_f, dartArgs));
41 }
42
43 JsFunction toJs() => new JsFunction._fromJs(_jsFunction);
44
45 dispose() {}
46
47 factory Callback.once(Function f, {bool withThis: false}) =>
48 new Callback._internal(f, withThis);
49
50 factory Callback.many(Function f, {bool withThis: false}) =>
51 new Callback._internal(f, withThis);
52 }
53
54 class JsObject implements Serializable<JsObject> {
55 final dynamic _jsObject;
56
57 JsObject._fromJs(this._jsObject);
58
59 factory JsObject(Serializable<JsFunction> constructor, [List arguments]) {
60 final constr = _convertToJS(constructor);
61 if (arguments == null) {
62 return new JsObject._fromJs(JS('=Object', 'new #()', constr));
63 }
64 final args = arguments.map(_convertToJS).toList();
65 switch (args.length) {
66 case 0:
67 return new JsObject._fromJs(JS('=Object', 'new #()', constr));
68 case 1:
69 return new JsObject._fromJs(JS('=Object', 'new #(#)', constr, args[0]));
70 case 2:
71 return new JsObject._fromJs(JS('=Object', 'new #(#,#)', constr, args[0],
72 args[1]));
73 case 3:
74 return new JsObject._fromJs(JS('=Object', 'new #(#,#,#)', constr,
75 args[0], args[1], args[2]));
76 case 4:
77 return new JsObject._fromJs(JS('=Object', 'new #(#,#,#,#)', constr,
78 args[0], args[1], args[2], args[3]));
79 case 5:
80 return new JsObject._fromJs(JS('=Object', 'new #(#,#,#,#,#)', constr,
81 args[0], args[1], args[2], args[3], args[4]));
82 case 6:
83 return new JsObject._fromJs(JS('=Object', 'new #(#,#,#,#,#,#)', constr,
84 args[0], args[1], args[2], args[3], args[4], args[5]));
85 case 7:
86 return new JsObject._fromJs(JS('=Object', 'new #(#,#,#,#,#,#,#)',
87 constr, args[0], args[1], args[2], args[3], args[4], args[5],
88 args[6]));
89 case 8:
90 return new JsObject._fromJs(JS('=Object', 'new #(#,#,#,#,#,#,#,#)',
91 constr, args[0], args[1], args[2], args[3], args[4], args[5],
92 args[6], args[7]));
93 case 9:
94 return new JsObject._fromJs(JS('=Object', 'new #(#,#,#,#,#,#,#,#,#)',
95 constr, args[0], args[1], args[2], args[3], args[4], args[5],
96 args[6], args[7], args[8]));
97 case 10:
98 return new JsObject._fromJs(JS('=Object', 'new #(#,#,#,#,#,#,#,#,#,#)',
99 constr, args[0], args[1], args[2], args[3], args[4], args[5],
100 args[6], args[7], args[8], args[9]));
101 }
102 return new JsObject._fromJs(JS('=Object', r'''(function(){
103 var Type = function(){};
104 Type.prototype = #.prototype;
105 var instance = new Type();
106 ret = constructor.apply(instance, #);
vsm 2013/06/11 16:17:44 'constructor' isn't in scope here. I think you ne
alexandre.ardhuin 2013/06/12 21:29:19 Done.
107 ret = Object(ret) === ret ? ret : instance;
108 })()''', constr, args));
109 }
110
111 factory JsObject._json(data) => new JsObject._fromJs(_convertDataTree(data));
112
113 static _convertDataTree(data) {
114 if (data is Map) {
115 final convertedData = JS('=Object', '{}');
116 for (var key in data.keys) {
117 JS('=Object', '#[#]=#', convertedData, key,
118 _convertDataTree(data[key]));
119 }
120 return convertedData;
121 } else if (data is Iterable) {
122 return data.map(_convertDataTree).toList();
123 } else {
124 return _convertToJS(data);
125 }
126 }
127
128 JsObject toJs() => this;
129
130 operator[](key) => _convertToDart(JS('=Object', '#[#]', _convertToJS(this), ke y));
vsm 2013/06/11 16:17:44 Nit: line length > 80
alexandre.ardhuin 2013/06/12 21:29:19 Done.
131 operator[]=(key, value) => JS('void', '#[#]=#', _convertToJS(this), key,
132 _convertToJS(value));
133
134 operator==(other) => identical(this, other) ||
135 (other is JsObject && JS('bool', '# == #', _convertToJS(this),
136 _convertToJS(other)));
137
138 bool hasProperty(String property) => JS('bool', '# in #', property,
139 _convertToJS(this));
140
141 void deleteProperty(String name) {
142 JS('void', 'delete #[#]', _convertToJS(this), name);
143 }
144
145 bool instanceof(Serializable<JsFunction> type) =>
146 JS('bool', '# instanceof #', _convertToJS(this), _convertToJS(type));
147
148 String toString() {
149 try {
150 return JS('String', '#.toString()', _convertToJS(this));
151 } catch(e) {
152 return super.toString();
153 }
154 }
155
156 callMethod(String name, [List args]) =>
157 _convertToDart(JS('=Object', '#[#].apply(#, #)', _convertToJS(this), name,
158 _convertToJS(this),
159 args == null ? null : args.map(_convertToJS).toList()));
160 }
161
162 class JsFunction extends JsObject implements Serializable<JsFunction> {
163 JsFunction._fromJs(jsObject) : super._fromJs(jsObject);
164 apply(thisArg, [List args]) =>
165 _convertToDart(JS('=Object', '#.apply(#, #)', _convertToJS(this),
166 _convertToJS(thisArg),
167 args == null ? null : args.map(_convertToJS).toList()));
168 }
169
170 abstract class Serializable<T> {
171 T toJs();
172 }
173
174 class _DartProxy {
175 dynamic o;
176 _DartProxy(this.o);
177 }
178
179 dynamic _convertToJS(dynamic o) {
180 if (o == null) {
181 return null;
182 } else if (o is String || o is num || o is bool) {
183 return o;
184 } else if (o is JsObject) {
185 return o._jsObject;
186 } else if (o is Serializable) {
187 return _convertToJS(o.toJs());
188 } else {
189 return new _DartProxy(o);
190 }
191 }
vsm 2013/06/11 16:17:44 Nit: space between functions.
alexandre.ardhuin 2013/06/12 21:29:19 Done.
192 dynamic _convertToDart(dynamic o) {
193 if (o == null) {
194 return null;
195 } else if (o is num || o is String || o is bool) {
196 return o;
197 } else if (JS('bool', '# instanceof Function', o)) {
198 return new JsFunction._fromJs(JS('Function', '#', o));
vsm 2013/06/11 16:17:44 I think this should be JS('=Object', ...) as well.
alexandre.ardhuin 2013/06/12 21:29:19 Done.
199 } else if (o is _DartProxy) {
200 return o.o;
201 } else {
202 return new JsObject._fromJs(JS('=Object', '#', o));
203 }
204 }
205
206 int proxyCount({all: false, dartOnly: false, jsOnly: false}) => 0;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698