Fixing a bug in ResizeLayoutPanel where moving the scroll bars triggers a scroll event on older versions of Safari, which causes an infinite loop.
http://gwt-code-reviews.appspot.com/1314801
Review by: pdr@google.com
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9586 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/ResizeLayoutPanel.java b/user/src/com/google/gwt/user/client/ui/ResizeLayoutPanel.java
index ab9a885..ddb90dc 100644
--- a/user/src/com/google/gwt/user/client/ui/ResizeLayoutPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/ResizeLayoutPanel.java
@@ -117,6 +117,7 @@
private Element expandableInner;
private int lastOffsetHeight = -1;
private int lastOffsetWidth = -1;
+ private boolean resettingScrollables;
@Override
public void init(Element elem, Delegate delegate) {
@@ -189,7 +190,7 @@
}
public void onBrowserEvent(Event event) {
- if (Event.ONSCROLL == event.getTypeInt()) {
+ if (!resettingScrollables && Event.ONSCROLL == event.getTypeInt()) {
EventTarget eventTarget = event.getEventTarget();
if (!Element.is(eventTarget)) {
return;
@@ -224,6 +225,15 @@
*/
private boolean resetScrollables() {
/*
+ * Older versions of safari trigger a synchronous scroll event when we
+ * update scrollTop/scrollLeft, so we set a boolean to ignore that event.
+ */
+ if (resettingScrollables) {
+ return false;
+ }
+ resettingScrollables = true;
+
+ /*
* Reset expandable element. Scrollbars are not rendered if the div is too
* small, so we need to set the dimensions of the inner div to a value
* greater than the offsetWidth/Height.
@@ -244,8 +254,10 @@
if (lastOffsetHeight != offsetHeight || lastOffsetWidth != offsetWidth) {
lastOffsetHeight = offsetHeight;
lastOffsetWidth = offsetWidth;
+ resettingScrollables = false;
return true;
}
+ resettingScrollables = false;
return false;
}
}