Correctly call PushConnection.disconnect instead of setting to null.
Also remove the obsolete PushHandler.disconnectCallback.
Change-Id: Ied055d489a269b016318947cd89cf0b46003c596
}
};
- /**
- * 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) {
"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) {
--- /dev/null
+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);
+ }
+}
--- /dev/null
+/*
+ * 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));
+
+ }
+}