| 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 import 'dart:_isolate_helper' show | 10 import 'dart:_isolate_helper' show |
| 11 IsolateNatives, | 11 IsolateNatives, |
| 12 TimerImpl, | 12 TimerImpl, |
| 13 global, |
| 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 typedef void _Callback(); | 20 typedef void _Callback(); |
| 20 typedef void _TakeCallback(_Callback callback); | 21 typedef void _TakeCallback(_Callback callback); |
| 21 | 22 |
| 22 @patch | 23 @patch |
| 23 class _AsyncRun { | 24 class _AsyncRun { |
| 24 @patch | 25 @patch |
| 25 static void _scheduleImmediate(void callback()) { | 26 static void _scheduleImmediate(void callback()) { |
| 26 _scheduleImmediateClosure(callback); | 27 _scheduleImmediateClosure(callback); |
| 27 } | 28 } |
| 28 | 29 |
| 29 // Lazily initialized. | 30 // Lazily initialized. |
| 30 static final _TakeCallback _scheduleImmediateClosure = | 31 static final _TakeCallback _scheduleImmediateClosure = |
| 31 _initializeScheduleImmediate(); | 32 _initializeScheduleImmediate(); |
| 32 | 33 |
| 33 static _TakeCallback _initializeScheduleImmediate() { | 34 static _TakeCallback _initializeScheduleImmediate() { |
| 34 // TODO(rnystrom): Not needed by dev_compiler. | 35 // TODO(rnystrom): Not needed by dev_compiler. |
| 35 // requiresPreamble(); | 36 // requiresPreamble(); |
| 36 if (JS('', 'self.scheduleImmediate') != null) { | 37 if (JS('', '#.scheduleImmediate', global) != null) { |
| 37 return _scheduleImmediateJsOverride; | 38 return _scheduleImmediateJsOverride; |
| 38 } | 39 } |
| 39 if (JS('', 'self.MutationObserver') != null && | 40 if (JS('', '#.MutationObserver', global) != null && |
| 40 JS('', 'self.document') != null) { | 41 JS('', '#.document', global) != null) { |
| 41 // Use mutationObservers. | 42 // Use mutationObservers. |
| 42 var div = JS('', 'self.document.createElement("div")'); | 43 var div = JS('', '#.document.createElement("div")', global); |
| 43 var span = JS('', 'self.document.createElement("span")'); | 44 var span = JS('', '#.document.createElement("span")', global); |
| 44 _Callback storedCallback; | 45 _Callback storedCallback; |
| 45 | 46 |
| 46 internalCallback(_) { | 47 internalCallback(_) { |
| 47 leaveJsAsync(); | 48 leaveJsAsync(); |
| 48 var f = storedCallback; | 49 var f = storedCallback; |
| 49 storedCallback = null; | 50 storedCallback = null; |
| 50 f(); | 51 f(); |
| 51 }; | 52 }; |
| 52 | 53 |
| 53 var observer = JS('', 'new self.MutationObserver(#)', internalCallback); | 54 var observer = JS('', 'new #.MutationObserver(#)', global, internalCallbac
k); |
| 54 JS('', '#.observe(#, { childList: true })', | 55 JS('', '#.observe(#, { childList: true })', |
| 55 observer, div); | 56 observer, div); |
| 56 | 57 |
| 57 return (void callback()) { | 58 return (void callback()) { |
| 58 assert(storedCallback == null); | 59 assert(storedCallback == null); |
| 59 enterJsAsync(); | 60 enterJsAsync(); |
| 60 storedCallback = callback; | 61 storedCallback = callback; |
| 61 // Because of a broken shadow-dom polyfill we have to change the | 62 // Because of a broken shadow-dom polyfill we have to change the |
| 62 // children instead a cheap property. | 63 // children instead a cheap property. |
| 63 // See https://github.com/Polymer/ShadowDOM/issues/468 | 64 // See https://github.com/Polymer/ShadowDOM/issues/468 |
| 64 JS('', '#.firstChild ? #.removeChild(#): #.appendChild(#)', | 65 JS('', '#.firstChild ? #.removeChild(#): #.appendChild(#)', |
| 65 div, div, span, div, span); | 66 div, div, span, div, span); |
| 66 }; | 67 }; |
| 67 } else if (JS('', 'self.setImmediate') != null) { | 68 } else if (JS('', '#.setImmediate', global) != null) { |
| 68 return _scheduleImmediateWithSetImmediate; | 69 return _scheduleImmediateWithSetImmediate; |
| 69 } | 70 } |
| 70 // TODO(20055): We should use DOM promises when available. | 71 // TODO(20055): We should use DOM promises when available. |
| 71 return _scheduleImmediateWithTimer; | 72 return _scheduleImmediateWithTimer; |
| 72 } | 73 } |
| 73 | 74 |
| 74 static void _scheduleImmediateJsOverride(void callback()) { | 75 static void _scheduleImmediateJsOverride(void callback()) { |
| 75 internalCallback() { | 76 internalCallback() { |
| 76 leaveJsAsync(); | 77 leaveJsAsync(); |
| 77 callback(); | 78 callback(); |
| 78 }; | 79 }; |
| 79 enterJsAsync(); | 80 enterJsAsync(); |
| 80 JS('void', 'self.scheduleImmediate(#)', internalCallback); | 81 JS('void', '#.scheduleImmediate(#)', global, internalCallback); |
| 81 } | 82 } |
| 82 | 83 |
| 83 static void _scheduleImmediateWithSetImmediate(void callback()) { | 84 static void _scheduleImmediateWithSetImmediate(void callback()) { |
| 84 internalCallback() { | 85 internalCallback() { |
| 85 leaveJsAsync(); | 86 leaveJsAsync(); |
| 86 callback(); | 87 callback(); |
| 87 }; | 88 }; |
| 88 enterJsAsync(); | 89 enterJsAsync(); |
| 89 JS('void', 'self.setImmediate(#)', internalCallback); | 90 JS('void', '#.setImmediate(#)', global, internalCallback); |
| 90 } | 91 } |
| 91 | 92 |
| 92 static void _scheduleImmediateWithTimer(void callback()) { | 93 static void _scheduleImmediateWithTimer(void callback()) { |
| 93 Timer._createTimer(Duration.ZERO, callback); | 94 Timer._createTimer(Duration.ZERO, callback); |
| 94 } | 95 } |
| 95 } | 96 } |
| 96 | 97 |
| 97 @patch | 98 @patch |
| 98 class DeferredLibrary { | 99 class DeferredLibrary { |
| 99 @patch | 100 @patch |
| (...skipping 21 matching lines...) Expand all Loading... |
| 121 } | 122 } |
| 122 } | 123 } |
| 123 | 124 |
| 124 @patch | 125 @patch |
| 125 void _rethrow(Object error, StackTrace stackTrace) { | 126 void _rethrow(Object error, StackTrace stackTrace) { |
| 126 // TODO(rnystrom): Not needed by dev_compiler. | 127 // TODO(rnystrom): Not needed by dev_compiler. |
| 127 // error = wrapException(error); | 128 // error = wrapException(error); |
| 128 JS("void", "#.stack = #", error, stackTrace.toString()); | 129 JS("void", "#.stack = #", error, stackTrace.toString()); |
| 129 JS("void", "throw #", error); | 130 JS("void", "throw #", error); |
| 130 } | 131 } |
| OLD | NEW |