Chromium Code Reviews| 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 |