From: Dave Methvin <dave.methvin@gmail.com>
Date: Mon, 27 Dec 2010 19:30:05 +0000 (-0600)
Subject: When a native browser event is bubbling up the DOM, make sure that the correct isDefa... 
X-Git-Url: http://git.asbjorn.biz/?a=commitdiff_plain;h=64ee5581afd6e9667ad45e75f082c95e2725efa6;p=jquery.git

When a native browser event is bubbling up the DOM, make sure that the correct isDefaultPrevented value is reflected by jQuery's Event object. Fixes #7793.
---

diff --git a/src/event.js b/src/event.js
index fd470e7..c904734 100644
--- a/src/event.js
+++ b/src/event.js
@@ -600,6 +600,12 @@ jQuery.Event = function( src ) {
 	if ( src && src.type ) {
 		this.originalEvent = src;
 		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
+
 	// Event type
 	} else {
 		this.type = src;
diff --git a/test/unit/event.js b/test/unit/event.js
index a647e5f..83f6096 100644
--- a/test/unit/event.js
+++ b/test/unit/event.js
@@ -295,6 +295,41 @@ test("live/delegate immediate propagation", function() {
 	$p.undelegate( "click" );
 });
 
+test("bind/delegate bubbling, isDefaultPrevented (Bug #7793)", function() {
+	expect(2);
+	var $anchor2 = jQuery( "#anchor2" ),
+		$main = jQuery( "#main" ),
+		fakeClick = function($jq) {
+			// Use a native click so we don't get jQuery simulated bubbling
+			if ( document.createEvent ) {
+				var e = document.createEvent( "MouseEvents" );
+				e.initEvent( "click", true, true ); 
+				$jq[0].dispatchEvent(e);
+			}
+			else if ( $jq[0].click ) {
+				$jq[0].click();	// IE
+			}
+		};
+	$anchor2.click(function(e) {
+		e.preventDefault();
+	});
+	$main.delegate("#foo", "click", function(e) {
+		equals( e.isDefaultPrevented(), true, "isDefaultPrevented true passed to bubbled event" );
+	});
+	fakeClick( $anchor2 );
+	$anchor2.unbind( "click" );
+	$main.undelegate( "click" );
+	$anchor2.click(function(e) {
+		// Let the default action occur
+	});
+	$main.delegate("#foo", "click", function(e) {
+		equals( e.isDefaultPrevented(), false, "isDefaultPrevented false passed to bubbled event" );
+	});
+	fakeClick( $anchor2 );
+	$anchor2.unbind( "click" );
+	$main.undelegate( "click" );
+});
+
 test("bind(), iframes", function() {
 	// events don't work with iframes, see #939 - this test fails in IE because of contentDocument
 	var doc = jQuery("#loadediframe").contents();