aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtur Signell <artur@vaadin.com>2016-02-07 19:23:29 +0200
committerVaadin Code Review <review@vaadin.com>2016-02-13 12:58:43 +0000
commitae0d2bd61cb82a524e4ef810de21f0bc72aecc93 (patch)
tree7d7a750903bb2db9d18ecc7a7cb2e5f82c86c375
parente025ba86520da8953365429c2b9956be95e14684 (diff)
downloadvaadin-framework-ae0d2bd61cb82a524e4ef810de21f0bc72aecc93.tar.gz
vaadin-framework-ae0d2bd61cb82a524e4ef810de21f0bc72aecc93.zip
Fix NPE if stopping navigation in onBeforeUnload (#19541)
Change-Id: Idcba5ceeff9df88a4ea7fe6b34e2e2537b7ee58c
-rw-r--r--client/src/com/vaadin/client/communication/XhrConnection.java8
-rw-r--r--uitest/src/com/vaadin/tests/application/ConfirmBrowserTabClose.java47
2 files changed, 55 insertions, 0 deletions
diff --git a/client/src/com/vaadin/client/communication/XhrConnection.java b/client/src/com/vaadin/client/communication/XhrConnection.java
index ff8155259e..11e3cf3cb7 100644
--- a/client/src/com/vaadin/client/communication/XhrConnection.java
+++ b/client/src/com/vaadin/client/communication/XhrConnection.java
@@ -254,6 +254,14 @@ public class XhrConnection {
private static native boolean resendRequest(Request request)
/*-{
var xhr = request.@com.google.gwt.http.client.Request::xmlHttpRequest
+ if (xhr == null) {
+ // This might be called even though the request has completed,
+ // if the webkitMaybeIgnoringRequests has been set to true on beforeunload
+ // but unload was cancelled after that. It will then stay on until the following
+ // request and if that request completes before we get here (<250mS), we will
+ // hit this case.
+ return false;
+ }
if (xhr.readyState != 1) {
// Progressed to some other readyState -> no longer blocked
return false;
diff --git a/uitest/src/com/vaadin/tests/application/ConfirmBrowserTabClose.java b/uitest/src/com/vaadin/tests/application/ConfirmBrowserTabClose.java
new file mode 100644
index 0000000000..3d3d84f9bd
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/application/ConfirmBrowserTabClose.java
@@ -0,0 +1,47 @@
+/*
+ * 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.application;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUIWithLog;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+
+public class ConfirmBrowserTabClose extends AbstractTestUIWithLog {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ // To test the behavior, do
+ // 1. Open the test in the browser
+ // 2. Close the browser tab/window
+ // 3. Choose to stay on the page after all
+ // 4. Click the button
+ // There should be no error
+ Button b = new Button("Say hello", new Button.ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ log("Hello");
+ }
+ });
+ addComponent(b);
+ getPage().getJavaScript().eval(
+ "window.addEventListener('beforeunload', function (e) {"
+ + "var confirmationMessage = 'Please stay!';"
+ + "e.returnValue = confirmationMessage;"
+ + "return confirmationMessage;" + "});");
+ }
+}