]> source.dussan.org Git - jquery.git/commitdiff
Fix #12838: hook point for non-jQuery.ajax synchronous script fetch/execute in domMan...
authorRichard Gibson <richard.gibson@gmail.com>
Sun, 2 Dec 2012 05:14:25 +0000 (00:14 -0500)
committerRichard Gibson <richard.gibson@gmail.com>
Wed, 17 Apr 2013 16:01:03 +0000 (12:01 -0400)
(cherry picked from commit 03db1ada2cc223edf545c5a452e55062647837fa)

src/ajax.js
src/manipulation.js
test/unit/manipulation.js

index 14586d18fcee059242a9e937518a14ec28b651e0..4478034d9a93fa4585860c5b7c69b1c0a527c45b 100644 (file)
@@ -193,25 +193,6 @@ jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSucces
        };
 });
 
-jQuery.each( [ "get", "post" ], function( i, method ) {
-       jQuery[ method ] = function( url, data, callback, type ) {
-               // shift arguments if data argument was omitted
-               if ( jQuery.isFunction( data ) ) {
-                       type = type || callback;
-                       callback = data;
-                       data = undefined;
-               }
-
-               return jQuery.ajax({
-                       url: url,
-                       type: method,
-                       dataType: type,
-                       data: data,
-                       success: callback
-               });
-       };
-});
-
 jQuery.extend({
 
        // Counter for holding the number of active queries
@@ -695,15 +676,34 @@ jQuery.extend({
                return jqXHR;
        },
 
-       getScript: function( url, callback ) {
-               return jQuery.get( url, undefined, callback, "script" );
-       },
-
        getJSON: function( url, data, callback ) {
                return jQuery.get( url, data, callback, "json" );
+       },
+
+       getScript: function( url, callback ) {
+               return jQuery.get( url, undefined, callback, "script" );
        }
 });
 
+jQuery.each( [ "get", "post" ], function( i, method ) {
+       jQuery[ method ] = function( url, data, callback, type ) {
+               // shift arguments if data argument was omitted
+               if ( jQuery.isFunction( data ) ) {
+                       type = type || callback;
+                       callback = data;
+                       data = undefined;
+               }
+
+               return jQuery.ajax({
+                       url: url,
+                       type: method,
+                       dataType: type,
+                       data: data,
+                       success: callback
+               });
+       };
+});
+
 /* Handles responses to an ajax request:
  * - finds the right dataType (mediates between content-type and expected dataType)
  * - returns the corresponding response
index cf0024a55f06f70ed5787dc003e3499fbea2003b..938fb0c3a6b2e6813d324764ddadf332c91d12e6 100644 (file)
@@ -354,14 +354,7 @@ jQuery.fn.extend({
 
                                                        if ( node.src ) {
                                                                // Hope ajax is available...
-                                                               jQuery.ajax({
-                                                                       url: node.src,
-                                                                       type: "GET",
-                                                                       dataType: "script",
-                                                                       async: false,
-                                                                       global: false,
-                                                                       "throws": true
-                                                               });
+                                                               jQuery._evalUrl( node.src );
                                                        } else {
                                                                jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
                                                        }
@@ -798,5 +791,16 @@ jQuery.extend({
                                }
                        }
                }
+       },
+
+       _evalUrl: function( url ) {
+               return jQuery.ajax({
+                       url: url,
+                       type: "GET",
+                       dataType: "text",
+                       async: false,
+                       global: false,
+                       success: jQuery.globalEval
+               });
        }
 });
index 2aef444ff150d296d743f71083428f40b8920af4..a1962df3b933c138517b3339938cb6791c0c28d4 100644 (file)
@@ -2150,14 +2150,18 @@ test( "html() - script exceptions bubble (#11743)", function() {
        expect( 2 );
 
        raises(function() {
-               jQuery("#qunit-fixture").html("<script>undefined(); ok( false, 'error not thrown' );</script>");
-               ok( false, "error ignored" );
-       }, "exception bubbled from inline script" );
-
-       raises(function() {
-               jQuery("#qunit-fixture").html("<script src='data/badcall.js'></script>");
-               ok( false, "error ignored" );
-       }, "exception bubbled from remote script" );
+               jQuery("#qunit-fixture").html("<script>undefined(); ok( false, 'Exception not thrown' );</script>");
+               ok( false, "Exception ignored" );
+       }, "Exception bubbled from inline script" );
+
+       if ( jQuery.ajax ) {
+               raises(function() {
+                       jQuery("#qunit-fixture").html("<script src='data/badcall.js'></script>");
+                       ok( false, "Exception ignored" );
+               }, "Exception thrown in remote script" );
+       } else {
+               ok( true, "No jQuery.ajax" );
+       }
 });
 
 test( "checked state is cloned with clone()", function() {
@@ -2197,7 +2201,7 @@ testIframeWithCallback( "buildFragment works even if document[0] is iframe's win
 
 test( "script evaluation (#11795)", function() {
 
-       expect( 11 );
+       expect( 13 );
 
        var scriptsIn, scriptsOut,
                fixture = jQuery("#qunit-fixture").empty(),
@@ -2238,6 +2242,44 @@ test( "script evaluation (#11795)", function() {
        fixture.append( scriptsOut.detach() );
        deepEqual( fixture.children("script").get(), scriptsOut.get(), "Scripts detached without reevaluation" );
        objGlobal.ok = isOk;
+
+       if ( jQuery.ajax ) {
+               Globals.register("testBar");
+               jQuery("#qunit-fixture").append( "<script src='" + url("data/test.js") + "'/>" );
+               strictEqual( window["testBar"], "bar", "Global script evaluation" );
+       } else {
+               ok( true, "No jQuery.ajax" );
+               ok( true, "No jQuery.ajax" );
+       }
+});
+
+test( "jQuery._evalUrl (#12838)", function() {
+
+       expect( 5 );
+
+       var message, expectedArgument,
+               ajax = jQuery.ajax,
+               evalUrl = jQuery._evalUrl;
+
+       message = "jQuery.ajax implementation";
+       expectedArgument = 1;
+       jQuery.ajax = function( input ) {
+               equal( ( input.url || input ).slice( -1 ), expectedArgument, message );
+               expectedArgument++;
+       };
+       jQuery("#qunit-fixture").append("<script src='1'/><script src='2'/>");
+       equal( expectedArgument, 3, "synchronous execution" );
+
+       message = "custom implementation";
+       expectedArgument = 3;
+       jQuery._evalUrl = jQuery.ajax;
+       jQuery.ajax = function( options ) {
+               strictEqual( options, {}, "Unexpected call to jQuery.ajax" );
+       };
+       jQuery("#qunit-fixture").append("<script src='3'/><script src='4'/>");
+
+       jQuery.ajax = ajax;
+       jQuery._evalUrl = evalUrl;
 });
 
 test( "wrapping scripts (#10470)", function() {