Index: client/touch/Scroller.dart |
diff --git a/client/touch/Scroller.dart b/client/touch/Scroller.dart |
index a9da0ebd72d9cab8ab7d61816c5351d6f8c23dc1..f125c747b1d7acf0202a9e3383ffb52542808310 100644 |
--- a/client/touch/Scroller.dart |
+++ b/client/touch/Scroller.dart |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
// for details. All rights reserved. Use of this source code is governed by a |
// BSD-style license that can be found in the LICENSE file. |
@@ -32,21 +32,6 @@ |
*/ |
typedef void Callback(); |
-// Helper method to await the completion of 2 futures. |
-void joinFutures(List<Future> futures, Callback callback) { |
- int count = 0; |
- int len = futures.length; |
- void helper(value) { |
- count++; |
- if (count == len) { |
- callback(); |
- } |
- } |
- for (Future p in futures) { |
- p.then(helper); |
- } |
-} |
- |
class Scroller implements Draggable, MomentumDelegate { |
/** Pixels to move each time an arrow key is pressed. */ |
@@ -231,8 +216,8 @@ class Scroller implements Draggable, MomentumDelegate { |
// The scrollable element must be relatively positioned. |
// TODO(jacobr): this assert fires asynchronously which could be confusing. |
if (_scrollTechnique == ScrollerScrollTechnique.RELATIVE_POSITIONING) { |
- _element.computedStyle.then((CSSStyleDeclaration style) { |
- assert(style.position != "static"); |
+ window.requestMeasurementFrame(() { |
+ assert(_element.computedStyle.position != "static"); |
}); |
} |
@@ -503,6 +488,8 @@ class Scroller implements Draggable, MomentumDelegate { |
reconfigure(() { |
final touch = e.touches[0]; |
if (_momentum.decelerating) { |
+ // TODO(jacobr): this won't do any good as it is called too late due |
+ // to async measurement. |
e.preventDefault(); |
e.stopPropagation(); |
stop(); |
@@ -541,24 +528,18 @@ class Scroller implements Draggable, MomentumDelegate { |
* and maxPoint allowed for scrolling. |
*/ |
void _resize(Callback callback) { |
- final frameRect = _frame.rect; |
- Future contentSizeFuture; |
- |
- if (_lookupContentSizeDelegate !== null) { |
- contentSizeFuture = _lookupContentSizeDelegate(); |
- contentSizeFuture.then((Size size) { |
- _contentSize = size; |
- }); |
- } else { |
- contentSizeFuture = _element.rect; |
- contentSizeFuture.then((ElementRect rect) { |
- _contentSize = new Size(rect.scroll.width, rect.scroll.height); |
- }); |
- } |
+ window.requestMeasurementFrame(() { |
+ final offset = _frame.rect.offset; |
+ |
+ if (_lookupContentSizeDelegate !== null) { |
+ // Guaranteed to be called within a measurement frame |
+ _contentSize = _lookupContentSizeDelegate(); |
+ } else { |
+ final scroll = _element.rect.scroll; |
+ _contentSize = new Size(scroll.width, scroll.height); |
+ } |
- joinFutures(<Future>[frameRect, contentSizeFuture], () { |
- _scrollSize = new Size(frameRect.value.offset.width, |
- frameRect.value.offset.height); |
+ _scrollSize = new Size(offset.width, offset.height); |
Size adjusted = _getAdjustedContentSize(); |
_maxPoint = new Coordinate(-_maxOffset.x, -_maxOffset.y); |
_minPoint = new Coordinate( |
@@ -566,7 +547,7 @@ class Scroller implements Draggable, MomentumDelegate { |
_scrollSize.width - adjusted.width + _minOffset.x, _maxPoint.x), |
Math.min( |
_scrollSize.height - adjusted.height + _minOffset.y, _maxPoint.y)); |
- callback(); |
+ return callback; |
}); |
} |