]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix NPE if stopping navigation in onBeforeUnload (#19541)
authorArtur Signell <artur@vaadin.com>
Sun, 7 Feb 2016 17:23:29 +0000 (19:23 +0200)
committerVaadin Code Review <review@vaadin.com>
Sat, 13 Feb 2016 12:58:43 +0000 (12:58 +0000)
Change-Id: Idcba5ceeff9df88a4ea7fe6b34e2e2537b7ee58c

client/src/com/vaadin/client/communication/XhrConnection.java
uitest/src/com/vaadin/tests/application/ConfirmBrowserTabClose.java [new file with mode: 0644]

index ff8155259ead736d6cce653ce4e299878e5ffe81..11e3cf3cb7bf2641fbbb0f5aa1da112d36398010 100644 (file)
@@ -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 (file)
index 0000000..3d3d84f
--- /dev/null
@@ -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;" + "});");
+    }
+}