| 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 |