OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 // Patch file for the dart:async library. | 5 // Patch file for the dart:async library. |
6 | 6 |
7 import 'dart:_js_helper' show | 7 import 'dart:_js_helper' show |
8 patch, | 8 patch, |
9 Primitives; | 9 Primitives, |
10 convertDartClosureToJS; | |
vsm
2016/05/05 21:23:40
Note - this is just identity on the first arg in D
Bob Nystrom
2016/05/05 22:03:46
Done.
| |
10 import 'dart:_isolate_helper' show | 11 import 'dart:_isolate_helper' show |
11 IsolateNatives, | 12 IsolateNatives, |
12 TimerImpl, | 13 TimerImpl, |
13 leaveJsAsync, | 14 leaveJsAsync, |
14 enterJsAsync, | 15 enterJsAsync, |
15 isWorker; | 16 isWorker; |
16 | 17 |
17 import 'dart:_foreign_helper' show JS; | 18 import 'dart:_foreign_helper' show JS; |
18 | 19 |
19 @patch | 20 @patch |
20 class _AsyncRun { | 21 class _AsyncRun { |
21 @patch | 22 @patch |
22 static void _scheduleImmediate(void callback()) { | 23 static void _scheduleImmediate(void callback()) { |
23 scheduleImmediateClosure(callback); | 24 _scheduleImmediateClosure(callback); |
24 } | 25 } |
25 | 26 |
26 // Lazily initialized. | 27 // Lazily initialized. |
27 static final Function scheduleImmediateClosure = | 28 static final Function _scheduleImmediateClosure = |
28 _initializeScheduleImmediate(); | 29 _initializeScheduleImmediate(); |
29 | 30 |
30 static Function _initializeScheduleImmediate() { | 31 static Function _initializeScheduleImmediate() { |
32 // TODO(rnystrom): Not needed by dev_compiler. | |
33 // requiresPreamble(); | |
31 if (JS('', 'self.scheduleImmediate') != null) { | 34 if (JS('', 'self.scheduleImmediate') != null) { |
32 return _scheduleImmediateJsOverride; | 35 return _scheduleImmediateJsOverride; |
33 } | 36 } |
34 if (JS('', 'self.MutationObserver') != null && | 37 if (JS('', 'self.MutationObserver') != null && |
35 JS('', 'self.document') != null) { | 38 JS('', 'self.document') != null) { |
36 // Use mutationObservers. | 39 // Use mutationObservers. |
37 var div = JS('', 'self.document.createElement("div")'); | 40 var div = JS('', 'self.document.createElement("div")'); |
38 var span = JS('', 'self.document.createElement("span")'); | 41 var span = JS('', 'self.document.createElement("span")'); |
39 var storedCallback; | 42 var storedCallback; |
40 | 43 |
41 internalCallback(_) { | 44 internalCallback(_) { |
42 leaveJsAsync(); | 45 leaveJsAsync(); |
43 var f = storedCallback; | 46 var f = storedCallback; |
44 storedCallback = null; | 47 storedCallback = null; |
45 f(); | 48 f(); |
46 }; | 49 }; |
47 | 50 |
48 var observer = JS('', 'new self.MutationObserver(#)', internalCallback); | 51 var observer = JS('', 'new self.MutationObserver(#)', |
52 convertDartClosureToJS(internalCallback, 1)); | |
49 JS('', '#.observe(#, { childList: true })', | 53 JS('', '#.observe(#, { childList: true })', |
50 observer, div); | 54 observer, div); |
51 | 55 |
52 return (void callback()) { | 56 return (void callback()) { |
53 assert(storedCallback == null); | 57 assert(storedCallback == null); |
54 enterJsAsync(); | 58 enterJsAsync(); |
55 storedCallback = callback; | 59 storedCallback = callback; |
56 // Because of a broken shadow-dom polyfill we have to change the | 60 // Because of a broken shadow-dom polyfill we have to change the |
57 // children instead a cheap property. | 61 // children instead a cheap property. |
58 // See https://github.com/Polymer/ShadowDOM/issues/468 | 62 // See https://github.com/Polymer/ShadowDOM/issues/468 |
59 JS('', '#.firstChild ? #.removeChild(#): #.appendChild(#)', | 63 JS('', '#.firstChild ? #.removeChild(#): #.appendChild(#)', |
60 div, div, span, div, span); | 64 div, div, span, div, span); |
61 }; | 65 }; |
62 } else if (JS('', 'self.setImmediate') != null) { | 66 } else if (JS('', 'self.setImmediate') != null) { |
63 return _scheduleImmediateWithSetImmediate; | 67 return _scheduleImmediateWithSetImmediate; |
64 } | 68 } |
65 // TODO(20055): We should use DOM promises when available. | 69 // TODO(20055): We should use DOM promises when available. |
66 return _scheduleImmediateWithTimer; | 70 return _scheduleImmediateWithTimer; |
67 } | 71 } |
68 | 72 |
69 static void _scheduleImmediateJsOverride(void callback()) { | 73 static void _scheduleImmediateJsOverride(void callback()) { |
70 internalCallback() { | 74 internalCallback() { |
71 leaveJsAsync(); | 75 leaveJsAsync(); |
72 callback(); | 76 callback(); |
73 }; | 77 }; |
74 enterJsAsync(); | 78 enterJsAsync(); |
75 JS('void', 'self.scheduleImmediate(#)', internalCallback); | 79 JS('void', 'self.scheduleImmediate(#)', |
80 convertDartClosureToJS(internalCallback, 0)); | |
76 } | 81 } |
77 | 82 |
78 static void _scheduleImmediateWithSetImmediate(void callback()) { | 83 static void _scheduleImmediateWithSetImmediate(void callback()) { |
79 internalCallback() { | 84 internalCallback() { |
80 leaveJsAsync(); | 85 leaveJsAsync(); |
81 callback(); | 86 callback(); |
82 }; | 87 }; |
83 enterJsAsync(); | 88 enterJsAsync(); |
84 JS('void', 'self.setImmediate(#)', internalCallback); | 89 JS('void', 'self.setImmediate(#)', |
90 convertDartClosureToJS(internalCallback, 0)); | |
85 } | 91 } |
86 | 92 |
87 static void _scheduleImmediateWithTimer(void callback()) { | 93 static void _scheduleImmediateWithTimer(void callback()) { |
88 Timer._createTimer(Duration.ZERO, callback); | 94 Timer._createTimer(Duration.ZERO, callback); |
89 } | 95 } |
90 } | 96 } |
91 | 97 |
92 @patch | 98 @patch |
93 class DeferredLibrary { | 99 class DeferredLibrary { |
94 @patch | 100 @patch |
(...skipping 14 matching lines...) Expand all Loading... | |
109 | 115 |
110 @patch | 116 @patch |
111 static Timer _createPeriodicTimer(Duration duration, | 117 static Timer _createPeriodicTimer(Duration duration, |
112 void callback(Timer timer)) { | 118 void callback(Timer timer)) { |
113 int milliseconds = duration.inMilliseconds; | 119 int milliseconds = duration.inMilliseconds; |
114 if (milliseconds < 0) milliseconds = 0; | 120 if (milliseconds < 0) milliseconds = 0; |
115 return new TimerImpl.periodic(milliseconds, callback); | 121 return new TimerImpl.periodic(milliseconds, callback); |
116 } | 122 } |
117 } | 123 } |
118 | 124 |
119 bool get _hasDocument => JS('String', 'typeof document') == 'object'; | 125 @patch |
126 void _rethrow(Object error, StackTrace stackTrace) { | |
127 // TODO(rnystrom): Not needed by dev_compiler. | |
128 // error = wrapException(error); | |
129 JS("void", "#.stack = #", error, stackTrace.toString()); | |
130 JS("void", "throw #", error); | |
131 } | |
OLD | NEW |