OLD | NEW |
| (Empty) |
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 | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 // Patch file for the dart:async library. | |
6 | |
7 import 'dart:_js_helper' show | |
8 patch, | |
9 Primitives, | |
10 convertDartClosureToJS, | |
11 requiresPreamble; | |
12 import 'dart:_isolate_helper' show | |
13 IsolateNatives, | |
14 TimerImpl, | |
15 leaveJsAsync, | |
16 enterJsAsync, | |
17 isWorker; | |
18 | |
19 import 'dart:_foreign_helper' show JS; | |
20 | |
21 @patch | |
22 class _AsyncRun { | |
23 @patch | |
24 static void _scheduleImmediate(void callback()) { | |
25 scheduleImmediateClosure(callback); | |
26 } | |
27 | |
28 // Lazily initialized. | |
29 static final Function scheduleImmediateClosure = | |
30 _initializeScheduleImmediate(); | |
31 | |
32 static Function _initializeScheduleImmediate() { | |
33 requiresPreamble(); | |
34 if (JS('', 'self.scheduleImmediate') != null) { | |
35 return _scheduleImmediateJsOverride; | |
36 } | |
37 if (JS('', 'self.MutationObserver') != null && | |
38 JS('', 'self.document') != null) { | |
39 // Use mutationObservers. | |
40 var div = JS('', 'self.document.createElement("div")'); | |
41 var span = JS('', 'self.document.createElement("span")'); | |
42 var storedCallback; | |
43 | |
44 internalCallback(_) { | |
45 leaveJsAsync(); | |
46 var f = storedCallback; | |
47 storedCallback = null; | |
48 f(); | |
49 }; | |
50 | |
51 var observer = JS('', 'new self.MutationObserver(#)', | |
52 convertDartClosureToJS(internalCallback, 1)); | |
53 JS('', '#.observe(#, { childList: true })', | |
54 observer, div); | |
55 | |
56 return (void callback()) { | |
57 assert(storedCallback == null); | |
58 enterJsAsync(); | |
59 storedCallback = callback; | |
60 // Because of a broken shadow-dom polyfill we have to change the | |
61 // children instead a cheap property. | |
62 // See https://github.com/Polymer/ShadowDOM/issues/468 | |
63 JS('', '#.firstChild ? #.removeChild(#): #.appendChild(#)', | |
64 div, div, span, div, span); | |
65 }; | |
66 } else if (JS('', 'self.setImmediate') != null) { | |
67 return _scheduleImmediateWithSetImmediate; | |
68 } | |
69 // TODO(20055): We should use DOM promises when available. | |
70 return _scheduleImmediateWithTimer; | |
71 } | |
72 | |
73 static void _scheduleImmediateJsOverride(void callback()) { | |
74 internalCallback() { | |
75 leaveJsAsync(); | |
76 callback(); | |
77 }; | |
78 enterJsAsync(); | |
79 JS('void', 'self.scheduleImmediate(#)', | |
80 convertDartClosureToJS(internalCallback, 0)); | |
81 } | |
82 | |
83 static void _scheduleImmediateWithSetImmediate(void callback()) { | |
84 internalCallback() { | |
85 leaveJsAsync(); | |
86 callback(); | |
87 }; | |
88 enterJsAsync(); | |
89 JS('void', 'self.setImmediate(#)', | |
90 convertDartClosureToJS(internalCallback, 0)); | |
91 } | |
92 | |
93 static void _scheduleImmediateWithTimer(void callback()) { | |
94 Timer._createTimer(Duration.ZERO, callback); | |
95 } | |
96 } | |
97 | |
98 @patch | |
99 class DeferredLibrary { | |
100 @patch | |
101 Future<Null> load() { | |
102 throw 'DeferredLibrary not supported. ' | |
103 'please use the `import "lib.dart" deferred as lib` syntax.'; | |
104 } | |
105 } | |
106 | |
107 @patch | |
108 class Timer { | |
109 @patch | |
110 static Timer _createTimer(Duration duration, void callback()) { | |
111 int milliseconds = duration.inMilliseconds; | |
112 if (milliseconds < 0) milliseconds = 0; | |
113 return new TimerImpl(milliseconds, callback); | |
114 } | |
115 | |
116 @patch | |
117 static Timer _createPeriodicTimer(Duration duration, | |
118 void callback(Timer timer)) { | |
119 int milliseconds = duration.inMilliseconds; | |
120 if (milliseconds < 0) milliseconds = 0; | |
121 return new TimerImpl.periodic(milliseconds, callback); | |
122 } | |
123 } | |
OLD | NEW |