Skip to content
Permalink
Browse files

Fix #12061. Avoid window.onbeforeunload to permit multiple handlers. C…

…lose gh-894.
  • Loading branch information...
markelog authored and dmethvin committed Aug 14, 2012
1 parent 0834143 commit 9dd0b010174dbfa70142a995a875a316337e1913
Showing with 56 additions and 18 deletions.
  1. +4 −9 src/event.js
  2. +52 −9 test/unit/event.js
@@ -549,16 +549,11 @@ jQuery.event = {
},

beforeunload: {
setup: function( data, namespaces, eventHandle ) {
// We only want to do this special case on windows
if ( jQuery.isWindow( this ) ) {
this.onbeforeunload = eventHandle;
}
},
postDispatch: function( event ) {

teardown: function( namespaces, eventHandle ) {
if ( this.onbeforeunload === eventHandle ) {
this.onbeforeunload = null;
// Even when returnValue equals to undefined Firefox will still show alert
if ( event.result !== undefined ) {
event.originalEvent.returnValue = event.result;
}
}
}
@@ -1369,20 +1369,63 @@ test("Submit event can be stopped (#11049)", function() {
form.remove();
});

test("on(beforeunload) creates/deletes window property instead of adding/removing event listener", function() {
expect(3);
// Test beforeunload event only if it supported (i.e. not Opera)
if ( window.onbeforeunload === null ) {
asyncTest("on(beforeunload)", 4, function() {
var doc,
forIE6 = 0,
iframe = jQuery("<iframe src='data/iframe.html' />");

iframe.appendTo("#qunit-fixture").one( "load", function() {
doc = iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument;

jQuery( doc ).on( "beforeunload", function() {
ok( true, "beforeunload event is fired" );
});

strictEqual( doc.onbeforeunload, null, "onbeforeunload property on window object still equals null" );

jQuery( doc ).on( "beforeunload", function() {

// On iframe in IE6 beforeunload event will not fire if event is binded through window object,
// nevertheless, test should continue
window.setTimeout(function() {
if ( !forIE6 ) {
checker();
}
});
});

doc.onbeforeunload = function() {
if ( !forIE6 ) {
forIE6++;
checker();
}
};

equal( window.onbeforeunload, null, "window property is null/undefined up until now" );
function checker() {
ok( true, "window.onbeforeunload handler is called" );
iframe = jQuery("<iframe src='data/iframe.html' />");

var handle = function () {};
jQuery(window).on( "beforeunload", handle );
iframe.appendTo("#qunit-fixture").one( "load", function() {
doc = iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument;

equal( typeof window.onbeforeunload, "function", "window property is set to a function");
jQuery( doc ).on( "beforeunload", function() {
strictEqual( doc.onbeforeunload, null, "Event handler is fired, even when onbeforeunload property on window is nulled" );

jQuery(window).off( "beforeunload", handle );
start();
});

equal( window.onbeforeunload, null, "window property has been unset to null/undefined" );
});
doc.onbeforeunload = null;

doc.location.reload();
});
}

doc.location.reload();
});
});
}

test("jQuery.Event( type, props )", function() {

1 comment on commit 9dd0b01

@mgol

This comment has been minimized.

Copy link
Member

mgol commented on 9dd0b01 Feb 6, 2014

@markelog Can you chime in in this bug? https://bugzilla.mozilla.org/show_bug.cgi?id=968065 It's supposed to be fixed long ago.

Please sign in to comment.
You can’t perform that action at this time.