]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix improper merge of 3d0ff32b from 7.1 to master (#13620)
authorJohannes Dahlström <johannesd@vaadin.com>
Fri, 2 May 2014 15:29:42 +0000 (18:29 +0300)
committerArtur Signell <artur@vaadin.com>
Thu, 8 May 2014 17:36:22 +0000 (17:36 +0000)
Correctly call PushConnection.disconnect instead of setting to null.
Also remove the obsolete PushHandler.disconnectCallback.

Change-Id: Ied055d489a269b016318947cd89cf0b46003c596

server/src/com/vaadin/server/communication/PushHandler.java
uitest/src/com/vaadin/tests/push/PushWithPreserveOnRefresh.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/push/PushWithPreserveOnRefreshTest.java [new file with mode: 0644]

index c6126f9d21c36cc4a71c325f01ea1d6d4c3677d3..983ada32792d53558f8c5ea4d9585bb687dbd01e 100644 (file)
@@ -186,46 +186,6 @@ public class PushHandler extends AtmosphereResourceEventListenerAdapter {
         }
     };
 
-    /**
-     * Callback used when a connection is closed, either deliberately or because
-     * an error occurred.
-     */
-    private final PushEventCallback disconnectCallback = new PushEventCallback() {
-        @Override
-        public void run(AtmosphereResource resource, UI ui) throws IOException {
-            PushMode pushMode = ui.getPushConfiguration().getPushMode();
-            AtmospherePushConnection connection = getConnectionForUI(ui);
-
-            String id = resource.uuid();
-
-            if (connection == null) {
-                getLogger()
-                        .log(Level.WARNING,
-                                "Could not find push connection to close: {0} with transport {1}",
-                                new Object[] { id, resource.transport() });
-            } else {
-                if (!pushMode.isEnabled()) {
-                    /*
-                     * The client is expected to close the connection after push
-                     * mode has been set to disabled.
-                     */
-                    getLogger().log(Level.FINER,
-                            "Connection closed for resource {0}", id);
-                } else {
-                    /*
-                     * Unexpected cancel, e.g. if the user closes the browser
-                     * tab.
-                     */
-                    getLogger()
-                            .log(Level.FINER,
-                                    "Connection unexpectedly closed for resource {0} with transport {1}",
-                                    new Object[] { id, resource.transport() });
-                }
-                connection.disconnect();
-            }
-        }
-    };
-
     private VaadinServletService service;
 
     public PushHandler(VaadinServletService service) {
@@ -428,7 +388,12 @@ public class PushHandler extends AtmosphereResourceEventListenerAdapter {
                                     "Connection unexpectedly closed for resource {0} with transport {1}",
                                     new Object[] { id, resource.transport() });
                 }
-                ui.setPushConnection(null);
+                if (pushConnection.isConnected()) {
+                    // disconnect() assumes the push connection is connected but
+                    // this method can currently be called more than once during
+                    // disconnect, depending on the situation
+                    pushConnection.disconnect();
+                }
             }
 
         } catch (final Exception e) {
diff --git a/uitest/src/com/vaadin/tests/push/PushWithPreserveOnRefresh.java b/uitest/src/com/vaadin/tests/push/PushWithPreserveOnRefresh.java
new file mode 100644 (file)
index 0000000..8834a05
--- /dev/null
@@ -0,0 +1,48 @@
+package com.vaadin.tests.push;
+
+import com.vaadin.annotations.PreserveOnRefresh;
+import com.vaadin.annotations.Push;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.tests.util.Log;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.Label;
+
+@PreserveOnRefresh
+@Push
+public class PushWithPreserveOnRefresh extends AbstractTestUI {
+
+    private Log log = new Log(5);
+    private int times = 0;
+
+    @Override
+    protected void setup(VaadinRequest request) {
+        // Internal parameter sent by vaadinBootstrap.js,
+        addComponent(new Label("window.name: " + request.getParameter("v-wn")));
+        addComponent(new Label("UI id: " + getUIId()));
+        addComponent(log);
+
+        Button b = new Button("click me");
+        b.addClickListener(new ClickListener() {
+
+            @Override
+            public void buttonClick(ClickEvent event) {
+                log.log("Button has been clicked " + (++times) + " times");
+            }
+        });
+
+        addComponent(b);
+    }
+
+    @Override
+    protected String getTestDescription() {
+        return "Refreshing the browser window should preserve the state and push should continue to work";
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return Integer.valueOf(13620);
+    }
+}
diff --git a/uitest/src/com/vaadin/tests/push/PushWithPreserveOnRefreshTest.java b/uitest/src/com/vaadin/tests/push/PushWithPreserveOnRefreshTest.java
new file mode 100644 (file)
index 0000000..3c532b2
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.push;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class PushWithPreserveOnRefreshTest extends MultiBrowserTest {
+
+    @Test
+    public void ensurePushWorksAfterRefresh() {
+        openTestURL();
+        $(ButtonElement.class).first().click();
+        $(ButtonElement.class).first().click();
+        Assert.assertEquals("2. Button has been clicked 2 times", getLogRow(0));
+        openTestURL();
+        Assert.assertEquals("2. Button has been clicked 2 times", getLogRow(0));
+        $(ButtonElement.class).first().click();
+        Assert.assertEquals("3. Button has been clicked 3 times", getLogRow(0));
+
+    }
+}