]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fixed issue with IE8 showing loading indicator when it should not (#7448)
authorArtur Signell <artur@vaadin.com>
Thu, 4 Apr 2013 09:08:38 +0000 (12:08 +0300)
committerArtur Signell <artur@vaadin.com>
Thu, 4 Apr 2013 09:08:38 +0000 (12:08 +0300)
Change-Id: I07fd3f3051d3114e419a3a75a7a102c6ea52ab53

client/src/com/vaadin/client/VLoadingIndicator.java

index ca29d6a042b7483ae3cca7a281c7a6f8a5f6015f..d85ee7eaa0594bc2bf827be83f7fe873b2d065c9 100644 (file)
@@ -26,21 +26,72 @@ public class VLoadingIndicator {
     private int delayStateDelay = 1500;
     private int waitStateDelay = 5000;
 
-    private Timer initialTimer = new Timer() {
+    /**
+     * Timer with method for checking if it has been cancelled. This class is a
+     * workaround for a IE8 problem which causes a timer to be fired even if it
+     * has been cancelled.
+     * 
+     * @author Vaadin Ltd
+     * @since 7.1
+     */
+    private abstract static class LoadingIndicatorTimer extends Timer {
+        private boolean cancelled = false;
+
+        @Override
+        public void cancel() {
+            super.cancel();
+            cancelled = true;
+        }
+
+        @Override
+        public void schedule(int delayMillis) {
+            super.schedule(delayMillis);
+            cancelled = false;
+        }
+
+        @Override
+        public void scheduleRepeating(int periodMillis) {
+            super.scheduleRepeating(periodMillis);
+            cancelled = false;
+        }
+
+        /**
+         * Checks if this timer has been cancelled.
+         * 
+         * @return true if the timer has been cancelled, false otherwise
+         */
+        public boolean isCancelled() {
+            return cancelled;
+        }
+    }
+
+    private Timer initialTimer = new LoadingIndicatorTimer() {
         @Override
         public void run() {
+            if (isCancelled()) {
+                // IE8 does not properly cancel the timer in all cases.
+                return;
+            }
             show();
         }
     };
-    private Timer delayStateTimer = new Timer() {
+    private Timer delayStateTimer = new LoadingIndicatorTimer() {
         @Override
         public void run() {
+            if (isCancelled()) {
+                // IE8 does not properly cancel the timer in all cases.
+                return;
+            }
             getElement().setClassName(PRIMARY_STYLE_NAME + "-delay");
         }
     };
-    private Timer waitStateTimer = new Timer() {
+    private Timer waitStateTimer = new LoadingIndicatorTimer() {
         @Override
         public void run() {
+            if (isCancelled()) {
+                // IE8 does not properly cancel the timer in all cases.
+                return;
+            }
             getElement().setClassName(PRIMARY_STYLE_NAME + "-wait");
         }
     };