Merge branch 'fix7762' into jquery master. Fixes #7762.
authorColin Snover <github.com@zetafleet.com>
Thu, 30 Dec 2010 06:02:56 +0000 (00:02 -0600)
committerColin Snover <github.com@zetafleet.com>
Thu, 30 Dec 2010 06:02:56 +0000 (00:02 -0600)
src/ajax.js
src/core.js
src/data.js
src/event.js
src/manipulation.js
src/transports/script.js
test/data/testinit.js
test/unit/core.js
test/unit/event.js
test/unit/manipulation.js

index 3f4f732..18ea203 100644 (file)
@@ -113,9 +113,8 @@ jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".sp
        };
 });
 
-jQuery.extend({
-
-       get: function( url, data, callback, type ) {
+jQuery.each( [ "get", "post" ], function( i, method ) {
+       jQuery[ method ] = function( url, data, callback, type ) {
                // shift arguments if data argument was omited
                if ( jQuery.isFunction( data ) ) {
                        type = type || callback;
@@ -124,13 +123,16 @@ jQuery.extend({
                }
 
                return jQuery.ajax({
-                       type: "GET",
+                       type: method,
                        url: url,
                        data: data,
                        success: callback,
                        dataType: type
                });
-       },
+       };
+});
+
+jQuery.extend({
 
        getScript: function( url, callback ) {
                return jQuery.get(url, null, callback, "script");
@@ -140,23 +142,6 @@ jQuery.extend({
                return jQuery.get(url, data, callback, "json");
        },
 
-       post: function( url, data, callback, type ) {
-               // shift arguments if data argument was omited
-               if ( jQuery.isFunction( data ) ) {
-                       type = type || callback;
-                       callback = data;
-                       data = {};
-               }
-
-               return jQuery.ajax({
-                       type: "POST",
-                       url: url,
-                       data: data,
-                       success: callback,
-                       dataType: type
-               });
-       },
-
        ajaxSetup: function( settings ) {
                jQuery.extend( jQuery.ajaxSettings, settings );
        },
index 346e52d..4da1212 100644 (file)
@@ -886,6 +886,11 @@ function doScrollCheck() {
        jQuery.ready();
 }
 
+// Expose jQuery as an Asynchronous Module
+if ( typeof define === "function" ) {
+       define( "jquery", [], function () { return jQuery; } );
+}
+
 // Expose jQuery to the global object
 return (window.jQuery = window.$ = jQuery);
 
index 21b7543..4d1d1bd 100644 (file)
@@ -10,7 +10,8 @@ jQuery.extend({
        uuid: 0,
 
        // Unique for each copy of jQuery on the page
-       expando: "jQuery" + jQuery.now(),
+       // Non-digits removed to match rinlinejQuery
+       expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
 
        // The following elements throw uncatchable exceptions if you
        // attempt to add expando properties to them.
index b66cfab..675e5ff 100644 (file)
@@ -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;
index 5f4b15d..96caa02 100644 (file)
@@ -440,12 +440,12 @@ jQuery.buildFragment = function( args, nodes, scripts ) {
        var fragment, cacheable, cacheresults,
                doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
 
-       // Only cache "small" (1/2 KB) strings that are associated with the main document
+       // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
        // Cloning options loses the selected state, so don't cache them
        // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
        // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
        if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
-               !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+               args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
 
                cacheable = true;
                cacheresults = jQuery.fragments[ args[0] ];
index fe38735..7416a2d 100644 (file)
@@ -47,10 +47,9 @@ jQuery.xhr.bindTransport("script", function(s) {
                                script.src = s.url;
                                
                                // Attach handlers for all browsers
-                               script.onload = script.onreadystatechange = function(statusText) {
+                               script.onload = script.onreadystatechange = function( _ , statusText) {
                                        
-                                       if ( (!script.readyState ||
-                                                       script.readyState === "loaded" || script.readyState === "complete") ) {
+                                       if ( ! script.readyState || /loaded|complete/.test( script.readyState ) ) {
                                                                
                                                // Handle memory leak in IE
                                                script.onload = script.onreadystatechange = null;
@@ -60,10 +59,10 @@ jQuery.xhr.bindTransport("script", function(s) {
                                                        head.removeChild( script );
                                                }
                                                
-                                               script = undefined;
+                                               script = 0;
                                                
-                                               // Callback & dereference
-                                               callback(statusText ? 0 : 200, statusText || "success");
+                                               // Callback
+                                               callback( statusText ? 0 : 200, statusText || "success" );
                                        }
                                };
                                // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
@@ -73,7 +72,7 @@ jQuery.xhr.bindTransport("script", function(s) {
                        
                        abort: function(statusText) {
                                if ( script ) {
-                                       script.onload(statusText);
+                                       script.onload( 0 , statusText );
                                }
                        }
                };
index a66f71d..8f431fb 100644 (file)
@@ -1,7 +1,12 @@
 var jQuery = this.jQuery || "jQuery", // For testing .noConflict()
        $ = this.$ || "$",
        originaljQuery = jQuery,
-       original$ = $;
+       original$ = $,
+       commonJSDefined;
+
+function define(module, dependencies, callback) {
+       commonJSDefined = callback();
+}
 
 /**
  * Returns an array of elements with the given IDs, eg.
index 7057783..5c80569 100644 (file)
@@ -12,7 +12,9 @@ test("Basic requirements", function() {
 });
 
 test("jQuery()", function() {
-       expect(23);
+       expect(24);
+
+       strictEqual( commonJSDefined, jQuery, "CommonJS registered (Bug #7102)" );
 
        // Basic constructor's behavior
 
@@ -151,7 +153,7 @@ test("selector state", function() {
        test = jQuery("#main").eq(0);
        equals( test.selector, "#main.slice(0,1)", "#main eq Selector" );
        equals( test.context, document, "#main eq Context" );
-       
+
        var d = "<div />";
        equals(
                jQuery(d).appendTo(jQuery(d)).selector,
@@ -253,38 +255,38 @@ test("isPlainObject", function() {
 
        // The use case that we want to match
        ok(jQuery.isPlainObject({}), "{}");
-       
+
        // Not objects shouldn't be matched
        ok(!jQuery.isPlainObject(""), "string");
        ok(!jQuery.isPlainObject(0) && !jQuery.isPlainObject(1), "number");
        ok(!jQuery.isPlainObject(true) && !jQuery.isPlainObject(false), "boolean");
        ok(!jQuery.isPlainObject(null), "null");
        ok(!jQuery.isPlainObject(undefined), "undefined");
-       
+
        // Arrays shouldn't be matched
        ok(!jQuery.isPlainObject([]), "array");
+
        // Instantiated objects shouldn't be matched
        ok(!jQuery.isPlainObject(new Date), "new Date");
+
        var fn = function(){};
+
        // Functions shouldn't be matched
        ok(!jQuery.isPlainObject(fn), "fn");
+
        // Again, instantiated objects shouldn't be matched
        ok(!jQuery.isPlainObject(new fn), "new fn (no methods)");
+
        // Makes the function a little more realistic
        // (and harder to detect, incidentally)
        fn.prototype = {someMethod: function(){}};
+
        // Again, instantiated objects shouldn't be matched
        ok(!jQuery.isPlainObject(new fn), "new fn");
 
        // DOM Element
        ok(!jQuery.isPlainObject(document.createElement("div")), "DOM Element");
-       
+
        // Window
        ok(!jQuery.isPlainObject(window), "window");
 
@@ -298,7 +300,7 @@ test("isPlainObject", function() {
                        document.body.removeChild( iframe );
                        start();
                };
+
                var doc = iframe.contentDocument || iframe.contentWindow.document;
                doc.open();
                doc.write("<body onload='window.parent.iframeDone(Object);'>");
@@ -659,7 +661,7 @@ test("jQuery.merge()", function() {
 
        // Fixed at [5998], #3641
        same( parse([-2,-1], [0,1,2]), [-2,-1,0,1,2], "Second array including a zero (falsy)");
-       
+
        // After fixing #5527
        same( parse([], [null, undefined]), [null, undefined], "Second array including null and undefined values");
        same( parse({length:0}, [1,2]), {length:2, 0:1, 1:2}, "First array like");
@@ -694,7 +696,7 @@ test("jQuery.extend(Object, Object)", function() {
        equals( deep1.foo2, document, "Make sure that a deep clone was not attempted on the document" );
 
        ok( jQuery.extend(true, {}, nestedarray).arr !== arr, "Deep extend of object must clone child array" );
-       
+
        // #5991
        ok( jQuery.isArray( jQuery.extend(true, { arr: {} }, nestedarray).arr ), "Cloned array heve to be an Array" );
        ok( jQuery.isPlainObject( jQuery.extend(true, { arr: arr }, { arr: {} }).arr ), "Cloned object heve to be an plain object" );
@@ -715,13 +717,13 @@ test("jQuery.extend(Object, Object)", function() {
        empty = {};
        jQuery.extend(true, empty, optionsWithCustomObject);
        ok( empty.foo && empty.foo.date === customObject, "Custom objects copy correctly (no methods)" );
-       
+
        // Makes the class a little more realistic
        myKlass.prototype = { someMethod: function(){} };
        empty = {};
        jQuery.extend(true, empty, optionsWithCustomObject);
        ok( empty.foo && empty.foo.date === customObject, "Custom objects copy correctly" );
-       
+
        var ret = jQuery.extend(true, { foo: 4 }, { foo: new Number(5) } );
        ok( ret.foo == 5, "Wrapped numbers copy correctly" );
 
@@ -849,10 +851,10 @@ test("jQuery.makeArray", function(){
 
 test("jQuery.isEmptyObject", function(){
        expect(2);
-       
+
        equals(true, jQuery.isEmptyObject({}), "isEmptyObject on empty object literal" );
        equals(false, jQuery.isEmptyObject({a:1}), "isEmptyObject on non-empty object literal" );
-       
+
        // What about this ?
        // equals(true, jQuery.isEmptyObject(null), "isEmptyObject on null" );
 });
@@ -878,23 +880,23 @@ test("jQuery.proxy", function(){
 
 test("jQuery.parseJSON", function(){
        expect(8);
-       
+
        equals( jQuery.parseJSON(), null, "Nothing in, null out." );
        equals( jQuery.parseJSON( null ), null, "Nothing in, null out." );
        equals( jQuery.parseJSON( "" ), null, "Nothing in, null out." );
-       
+
        same( jQuery.parseJSON("{}"), {}, "Plain object parsing." );
        same( jQuery.parseJSON('{"test":1}'), {"test":1}, "Plain object parsing." );
 
        same( jQuery.parseJSON('\n{"test":1}'), {"test":1}, "Make sure leading whitespaces are handled." );
-       
+
        try {
                jQuery.parseJSON("{a:1}");
                ok( false, "Test malformed JSON string." );
        } catch( e ) {
                ok( true, "Test malformed JSON string." );
        }
-       
+
        try {
                jQuery.parseJSON("{'a':1}");
                ok( false, "Test malformed JSON string." );
index a647e5f..83f6096 100644 (file)
@@ -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();
index da16354..e273cf0 100644 (file)
@@ -1247,3 +1247,20 @@ test("jQuery.cleanData", function() {
                return div;
        }
 });
+
+test("jQuery.buildFragment - no plain-text caching (Bug #6779)", function() {
+       expect(1);
+
+       // DOM manipulation fails if added text matches an Object method
+       var $f = jQuery( "<div />" ).appendTo( "#main" ),
+               bad = [ "start-", "toString", "hasOwnProperty", "append", "here&there!", "-end" ];
+
+       for ( var i=0; i < bad.length; i++ ) {
+               try {
+                       $f.append( bad[i] );
+               }
+               catch(e) {}
+       }
+    equals($f.text(), bad.join(''), "Cached strings that match Object properties");
+       $f.remove();
+});