Goktug Gokdogan has submitted this change and it was merged.

Change subject: Makes GWT.runAsync to always run async.
......................................................................


Makes GWT.runAsync to always run async.

Fixes issue 5560

Change-Id: Ia55b41c6978a7d2824ceeb3289dc48fe05bf117b
Review-Link: https://gwt-review.googlesource.com/#/c/2770/
---
M user/src/com/google/gwt/core/client/GWT.java
M user/src/com/google/gwt/core/client/impl/AsyncFragmentLoader.java
M user/test/com/google/gwt/dev/jjs/test/RunAsyncFailureTest.java
M user/test/com/google/gwt/dev/jjs/test/RunAsyncTest.java
4 files changed, 128 insertions(+), 15 deletions(-)

Approvals:
  Roberto Lublinerman: Looks good to me, approved
  Leeroy Jenkins: Verified



diff --git a/user/src/com/google/gwt/core/client/GWT.java b/user/src/com/google/gwt/core/client/GWT.java
index f9b68b2..3d3440d 100644
--- a/user/src/com/google/gwt/core/client/GWT.java
+++ b/user/src/com/google/gwt/core/client/GWT.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.core.client;

+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
 import com.google.gwt.core.client.impl.Impl;

 /**
@@ -258,14 +259,18 @@
    */
@SuppressWarnings("unused") // parameter will be used following replacement
   public static void runAsync(Class<?> name, RunAsyncCallback callback) {
-    callback.onSuccess();
+    runAsync(callback);
   }

   /**
* Run the specified callback once the necessary code for it has been loaded.
    */
-  public static void runAsync(RunAsyncCallback callback) {
-    callback.onSuccess();
+  public static void runAsync(final RunAsyncCallback callback) {
+    Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+      @Override public void execute() {
+        callback.onSuccess();
+      }
+    });
   }

   /**
diff --git a/user/src/com/google/gwt/core/client/impl/AsyncFragmentLoader.java b/user/src/com/google/gwt/core/client/impl/AsyncFragmentLoader.java
index 528a734..77ab67f 100644
--- a/user/src/com/google/gwt/core/client/impl/AsyncFragmentLoader.java
+++ b/user/src/com/google/gwt/core/client/impl/AsyncFragmentLoader.java
@@ -18,6 +18,8 @@
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.RunAsyncCallback;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;

 /**
  * <p>
@@ -587,7 +589,7 @@
private void runAsyncImpl(final int fragment, RunAsyncCallback callback) {
     if (isLoaded[fragment]) {
       assert allCallbacks[fragment] == null;
-      callback.onSuccess();
+      executeOnSuccessAsynchronously(callback);
       return;
     }

@@ -615,6 +617,28 @@
     }
   }

+  /**
+   * Executes onSuccess asynchronously.
+   */
+ private void executeOnSuccessAsynchronously(final RunAsyncCallback callback) {
+    Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+      @Override public void execute() {
+        executeOnSuccess(callback);
+      }
+    });
+  }
+
+  private void executeOnSuccess(RunAsyncCallback callback) {
+    /*
+ * Calls on {@link RunAsyncCallback#onSuccess} from {@link AsyncFragmentLoader} is special + * treated (See RescueVisitor in ControlFlowAnalyzer) so that code splitter will not follow them + * on fragment analysis. That is, if don't call onSuccess from here and instead call it directly + * from the scheduled command, then it will make the code splitter put the split point code in
+     * the initial fragment.
+     */
+    callback.onSuccess();
+  }
+
   private void startLoadingFragment(int fragment) {
     assert (fragmentLoading < 0);
     fragmentLoading = fragment;
diff --git a/user/test/com/google/gwt/dev/jjs/test/RunAsyncFailureTest.java b/user/test/com/google/gwt/dev/jjs/test/RunAsyncFailureTest.java
index 65d6fae..8b771cf 100644
--- a/user/test/com/google/gwt/dev/jjs/test/RunAsyncFailureTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/RunAsyncFailureTest.java
@@ -17,6 +17,8 @@

 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.RunAsyncCallback;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.RepeatingCommand;
 import com.google.gwt.core.client.impl.LoadingStrategyBase;
 import com.google.gwt.junit.DoNotRunWith;
 import com.google.gwt.junit.Platform;
@@ -82,6 +84,8 @@

   private static final int RUNASYNC_TIMEOUT = 30000;

+  private static int staticWrittenByAsync;
+
   @Override
   public String getModuleName() {
     return "com.google.gwt.dev.jjs.RunAsyncFailure";
@@ -165,6 +169,19 @@
       }
     });
   }
+
+  private void runAsync5() {
+    GWT.runAsync(new RunAsyncCallback() {
+      public void onFailure(Throwable caught) {
+        staticWrittenByAsync++;
+      }
+      public void onSuccess() {
+        // Use the string "INSTALL_FAILURE_TEST" so we can identify this
+        // fragment on the server.  In the fail message is good enough.
+ fail("INSTALL_FAILURE_TEST_2 - Code should have failed to install!");
+      }
+    });
+  }

   /**
    * Test the basic functionality of retrying runAsync until is succeeds.
@@ -201,4 +218,33 @@
     LoadingStrategyBase.MAX_AUTO_RETRY_COUNT = 3;
     runAsync4();
   }
+
+  public void testDownloadSuccessButInstallFailureStillRunsAsync() {
+    delayTestFinish(RUNASYNC_TIMEOUT);
+    LoadingStrategyBase.MAX_AUTO_RETRY_COUNT = 3;
+    staticWrittenByAsync = 0;
+
+    assertRunAsyncIsAsync();
+
+    // Give it little bit more time to loaded and try runAsync again
+    Scheduler.get().scheduleFixedPeriod(new RepeatingCommand() {
+      @Override public boolean execute() {
+        if (staticWrittenByAsync == 0) {
+          return true;
+        }
+
+        // Code is loaded, let's assert it still runs async
+        assertRunAsyncIsAsync();
+
+        finishTest();
+        return false;
+      }
+    }, 100);
+  }
+
+  private void assertRunAsyncIsAsync() {
+    final int lastValue = staticWrittenByAsync;
+    runAsync5();
+    assertEquals(lastValue, staticWrittenByAsync);
+  }
 }
diff --git a/user/test/com/google/gwt/dev/jjs/test/RunAsyncTest.java b/user/test/com/google/gwt/dev/jjs/test/RunAsyncTest.java
index e9e7c94..38a8e6c 100644
--- a/user/test/com/google/gwt/dev/jjs/test/RunAsyncTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/RunAsyncTest.java
@@ -18,6 +18,8 @@
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
 import com.google.gwt.core.client.RunAsyncCallback;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.RepeatingCommand;
 import com.google.gwt.junit.client.GWTTestCase;

 /**
@@ -29,6 +31,8 @@
   private static final int RUNASYNC_TIMEOUT = 10000;

   private static String staticWrittenInBaseButReadLater;
+
+  private static int staticWrittenByAsync;

   @Override
   public String getModuleName() {
@@ -70,6 +74,44 @@
         finishTest();
       }
     });
+  }
+
+  /**
+   * Test runAsync always runs async.
+   */
+  public void testAsyncIsAlwaysAsync() {
+    delayTestFinish(RUNASYNC_TIMEOUT);
+    staticWrittenByAsync = 0;
+
+    assertRunAsyncIsAsync();
+
+    // Give it little bit more time to loaded and try runAsync again
+    Scheduler.get().scheduleFixedPeriod(new RepeatingCommand() {
+      @Override public boolean execute() {
+        if (staticWrittenByAsync == 0) {
+          return true;
+        }
+
+        // Code is loaded, let's assert it still runs async
+        assertRunAsyncIsAsync();
+
+        finishTest();
+        return false;
+      }
+    }, 100);
+  }
+
+  private void assertRunAsyncIsAsync() {
+    final int lastValue = staticWrittenByAsync;
+    GWT.runAsync(RunAsyncTest.class, new RunAsyncCallback() {
+      public void onFailure(Throwable caught) {
+        throw new RuntimeException(caught);
+      }
+      public void onSuccess() {
+        staticWrittenByAsync++;
+      }
+    });
+    assertEquals(lastValue, staticWrittenByAsync);
   }

   /**
@@ -130,17 +172,13 @@
     });
     delayTestFinish(RUNASYNC_TIMEOUT);

-    try {
-      GWT.runAsync(new RunAsyncCallback() {
-        public void onFailure(Throwable caught) {
-        }
+    GWT.runAsync(new RunAsyncCallback() {
+      public void onFailure(Throwable caught) {
+      }

-        public void onSuccess() {
-          throw toThrow;
-        }
-      });
-    } catch (Throwable e) {
-      GWT.maybeReportUncaughtException(e);
-    }
+      public void onSuccess() {
+        throw toThrow;
+      }
+    });
   }
 }

--
To view, visit https://gwt-review.googlesource.com/2770
To unsubscribe, visit https://gwt-review.googlesource.com/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ia55b41c6978a7d2824ceeb3289dc48fe05bf117b
Gerrit-PatchSet: 2
Gerrit-Project: gwt
Gerrit-Branch: master
Gerrit-Owner: Goktug Gokdogan <[email protected]>
Gerrit-Reviewer: Goktug Gokdogan <[email protected]>
Gerrit-Reviewer: Leeroy Jenkins <[email protected]>
Gerrit-Reviewer: Roberto Lublinerman <[email protected]>

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors
--- You received this message because you are subscribed to the Google Groups "GWT Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to