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;
     }
   }