]> source.dussan.org Git - vaadin-framework.git/commitdiff
Use queue for resync requests. (#12043)
authorAnna Koskinen <Ansku@users.noreply.github.com>
Thu, 30 Jul 2020 10:01:44 +0000 (13:01 +0300)
committerGitHub <noreply@github.com>
Thu, 30 Jul 2020 10:01:44 +0000 (13:01 +0300)
There might be pending requests in the queue when a resync request is
made (e.g. through a theme change). This can cause conflicts if the
resync request is handled immediately. Therefore the resync request
should also be added to the queue and only get resolved when
doSendInvocationsToServer() gets triggered again.

Fixes #11954

client/src/main/java/com/vaadin/client/communication/MessageSender.java

index cde6657d1a77f82ca75d0a406d28b19347367adc..9a443adb2ec184786c67fc9dfc8437641941fdbd 100644 (file)
@@ -47,6 +47,7 @@ public class MessageSender {
 
     private ApplicationConnection connection;
     private boolean hasActiveRequest = false;
+    private boolean resynchronizeRequested = false;
 
     /**
      * Counter for the messages send to the server. First sent message has id 0.
@@ -98,7 +99,7 @@ public class MessageSender {
     private void doSendInvocationsToServer() {
 
         ServerRpcQueue serverRpcQueue = getServerRpcQueue();
-        if (serverRpcQueue.isEmpty()) {
+        if (serverRpcQueue.isEmpty() && !resynchronizeRequested) {
             return;
         }
 
@@ -110,7 +111,7 @@ public class MessageSender {
         JsonArray reqJson = serverRpcQueue.toJson();
         serverRpcQueue.clear();
 
-        if (reqJson.length() == 0) {
+        if (reqJson.length() == 0 && !resynchronizeRequested) {
             // Nothing to send, all invocations were filtered out (for
             // non-existing connectors)
             getLogger().warning(
@@ -124,6 +125,11 @@ public class MessageSender {
                     Version.getFullVersion());
             connection.getConfiguration().setWidgetsetVersionSent();
         }
+        if (resynchronizeRequested) {
+            getLogger().info("Resynchronizing from server");
+            extraJson.put(ApplicationConstants.RESYNCHRONIZE_ID, true);
+            resynchronizeRequested = false;
+        }
         if (showLoadingIndicator) {
             connection.getLoadingIndicator().trigger();
         }
@@ -239,7 +245,8 @@ public class MessageSender {
         hasActiveRequest = false;
 
         if (connection.isApplicationRunning()) {
-            if (getServerRpcQueue().isFlushPending()) {
+            if (getServerRpcQueue().isFlushPending()
+                    || resynchronizeRequested) {
                 sendInvocationsToServer();
             }
             runPostRequestHooks(connection.getConfiguration().getRootPanelId());
@@ -350,10 +357,9 @@ public class MessageSender {
      */
     public void resynchronize() {
         getMessageHandler().onResynchronize();
-        getLogger().info("Resynchronizing from server");
-        JsonObject resyncParam = Json.createObject();
-        resyncParam.put(ApplicationConstants.RESYNCHRONIZE_ID, true);
-        send(Json.createArray(), resyncParam);
+        getLogger().info("Resynchronize from server requested");
+        resynchronizeRequested = true;
+        sendInvocationsToServer();
     }
 
     /**