Browse Source

Fix NPE if stopping navigation in onBeforeUnload (#19541)

Change-Id: Idcba5ceeff9df88a4ea7fe6b34e2e2537b7ee58c
tags/7.7.0.alpha1
Artur Signell 8 years ago
parent
commit
ae0d2bd61c

+ 8
- 0
client/src/com/vaadin/client/communication/XhrConnection.java View 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;

+ 47
- 0
uitest/src/com/vaadin/tests/application/ConfirmBrowserTabClose.java View File

@@ -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;" + "});");
}
}

Loading…
Cancel
Save