Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 typedef void AnimationCallback(num currentTime); | 5 typedef void AnimationCallback(num currentTime); |
| 6 | 6 |
| 7 class CallbackData { | 7 class CallbackData { |
| 8 final AnimationCallback callback; | 8 final AnimationCallback callback; |
| 9 final num minTime; | 9 final num minTime; |
| 10 int id; | 10 int id; |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 36 static final FRAMES_PER_SECOND = 60; | 36 static final FRAMES_PER_SECOND = 60; |
| 37 static final MS_PER_FRAME = 1000 ~/ FRAMES_PER_SECOND; | 37 static final MS_PER_FRAME = 1000 ~/ FRAMES_PER_SECOND; |
| 38 static final USE_INTERVALS = false; | 38 static final USE_INTERVALS = false; |
| 39 | 39 |
| 40 /** List of callbacks to be executed next animation frame. */ | 40 /** List of callbacks to be executed next animation frame. */ |
| 41 List<CallbackData> _callbacks; | 41 List<CallbackData> _callbacks; |
| 42 int _intervalId; | 42 int _intervalId; |
| 43 bool _isMobileSafari = false; | 43 bool _isMobileSafari = false; |
| 44 Css _safariHackCss; | 44 Css _safariHackCss; |
| 45 int _frameCount = 0; | 45 int _frameCount = 0; |
| 46 bool _webkitAnimationFrameMaybeAvailable = true; | 46 bool _animationFrameMaybeAvailable = true; |
| 47 | 47 |
| 48 AnimationScheduler() | 48 AnimationScheduler() |
| 49 : _callbacks = new List<CallbackData>() { | 49 : _callbacks = new List<CallbackData>() { |
| 50 if (_isMobileSafari) { | 50 if (_isMobileSafari) { |
| 51 // TODO(jacobr): find a better workaround for the issue that 3d transforms | 51 // TODO(jacobr): find a better workaround for the issue that 3d transforms |
| 52 // sometimes don't render on iOS without forcing a layout. | 52 // sometimes don't render on iOS without forcing a layout. |
| 53 final element = new Element.tag('div'); | 53 final element = new Element.tag('div'); |
| 54 document.body.nodes.add(element); | 54 document.body.nodes.add(element); |
| 55 _safariHackCss = new Css(element.style); | 55 _safariHackCss = new Css(element.style); |
| 56 _safariHackCss.position = 'absolute'; | 56 _safariHackCss.position = 'absolute'; |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 86 _setupInterval(); | 86 _setupInterval(); |
| 87 } | 87 } |
| 88 } | 88 } |
| 89 | 89 |
| 90 void _setupInterval() { | 90 void _setupInterval() { |
| 91 // Assert that we never schedule multiple frames at once. | 91 // Assert that we never schedule multiple frames at once. |
| 92 assert(_intervalId === null); | 92 assert(_intervalId === null); |
| 93 if (USE_INTERVALS) { | 93 if (USE_INTERVALS) { |
| 94 _intervalId = window.setInterval(_step, MS_PER_FRAME); | 94 _intervalId = window.setInterval(_step, MS_PER_FRAME); |
| 95 } else { | 95 } else { |
| 96 if (_webkitAnimationFrameMaybeAvailable) { | 96 if (_animationFrameMaybeAvailable) { |
| 97 // First try to see if the browser supports the requestAnimationFrame AP I, | |
| 98 // and if that check fails, fall back to using WebKit/Mozilla/IE specifi c | |
| 99 // versions of the API. | |
| 97 try { | 100 try { |
| 98 // TODO(jacobr): passing in document should not be required. | 101 // TODO(jacobr): passing in document should not be required. |
| 99 _intervalId = window.webkitRequestAnimationFrame( | 102 _intervalId = window.requestAnimationFrame( |
|
Jacob
2011/10/17 18:24:57
This approach would cause multiple exceptions to b
| |
| 100 (int ignored) { _step(); }, document); | 103 (int ignored) { _step(); }, document); |
| 101 // TODO(jacobr) fix this odd type error. | 104 // TODO(jacobr) fix this odd type error. |
| 102 } catch (var e) { | 105 } catch (var e) { |
| 103 _webkitAnimationFrameMaybeAvailable = false; | 106 try { |
| 107 _intervalId = window.webkitRequestAnimationFrame( | |
| 108 (int ignored) { _step(); }, document); | |
| 109 } catch (var e) { | |
| 110 try { | |
|
Jacob
2011/10/17 18:24:57
at some point, window.mozRequestAnimationFrame mig
| |
| 111 _intervalId = window.mozRequestAnimationFrame( | |
| 112 (int ignored) { _step(); }, document); | |
| 113 } catch (e) { | |
| 114 try { | |
| 115 _intervalId = window.msRequestAnimationFrame( | |
| 116 (int ignored) { _step(); }, document); | |
| 117 } catch (var e) { | |
| 118 _animationFrameMaybeAvailable = false; | |
| 119 } | |
| 120 } | |
| 121 } | |
| 104 } | 122 } |
| 105 } | 123 } |
| 106 if (!_webkitAnimationFrameMaybeAvailable) { | 124 if (!_animationFrameMaybeAvailable) { |
| 107 _intervalId = window.setTimeout(() { _step(); }, MS_PER_FRAME); | 125 _intervalId = window.setTimeout(() { _step(); }, MS_PER_FRAME); |
| 108 } | 126 } |
| 109 } | 127 } |
| 110 } | 128 } |
| 111 | 129 |
| 112 void _step() { | 130 void _step() { |
| 113 if (_callbacks.isEmpty()) { | 131 if (_callbacks.isEmpty()) { |
| 114 // Cancel the interval on the first frame where there aren't actually | 132 // Cancel the interval on the first frame where there aren't actually |
| 115 // any available callbacks. | 133 // any available callbacks. |
| 116 assert(_intervalId != null); | 134 assert(_intervalId != null); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 157 _frameCount++; | 175 _frameCount++; |
| 158 if (_isMobileSafari) { | 176 if (_isMobileSafari) { |
| 159 // Hack to work around an iOS bug where sometimes animations do not | 177 // Hack to work around an iOS bug where sometimes animations do not |
| 160 // render if only webkit transforms were modified. | 178 // render if only webkit transforms were modified. |
| 161 // TODO(jacobr): find a cleaner workaround. | 179 // TODO(jacobr): find a cleaner workaround. |
| 162 int offset = _frameCount % 2; | 180 int offset = _frameCount % 2; |
| 163 _safariHackCss.left = '${offset}px'; | 181 _safariHackCss.left = '${offset}px'; |
| 164 } | 182 } |
| 165 } | 183 } |
| 166 } | 184 } |
| OLD | NEW |