Skip to content

Commit

Permalink
Fix #12838: hook point for non-jQuery.ajax synchronous script fetch/e…
Browse files Browse the repository at this point in the history
…xecute in domManip. Close jquerygh-1051.
  • Loading branch information
gibson042 committed Apr 17, 2013
1 parent ea5c22e commit 03db1ad
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 39 deletions.
46 changes: 23 additions & 23 deletions src/ajax.js
Original file line number Diff line number Diff line change
Expand Up @@ -194,25 +194,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
Expand Down Expand Up @@ -694,15 +675,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
Expand Down
20 changes: 12 additions & 8 deletions src/manipulation.js
Original file line number Diff line number Diff line change
Expand Up @@ -256,14 +256,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.textContent.replace( rcleanScript, "" ) );
}
Expand Down Expand Up @@ -465,6 +458,17 @@ jQuery.extend({
data_user.discard( elem );
data_priv.discard( elem );
}
},

_evalUrl: function( url ) {
return jQuery.ajax({
url: url,
type: "GET",
dataType: "text",
async: false,
global: false,
success: jQuery.globalEval
});
}
});

Expand Down
59 changes: 51 additions & 8 deletions test/unit/manipulation.js
Original file line number Diff line number Diff line change
Expand Up @@ -1880,14 +1880,19 @@ test( "html() - script exceptions bubble (#11743)", function() {
ok( false, "Exception ignored" );
}, "Exception bubbled from inline script" );

var onerror = window.onerror;
window.onerror = function() {
ok( true, "Exception thrown in remote script" );
window.onerror = onerror;
};
if ( jQuery.ajax ) {
var onerror = window.onerror;
window.onerror = function() {
ok( true, "Exception thrown in remote script" );
};

jQuery("#qunit-fixture").html("<script src='data/badcall.js'></script>");
ok( true, "Exception ignored" );
jQuery("#qunit-fixture").html("<script src='data/badcall.js'></script>");
ok( true, "Exception ignored" );
window.onerror = onerror;
} else {
ok( true, "No jQuery.ajax" );
ok( true, "No jQuery.ajax" );
}
});

test( "checked state is cloned with clone()", function() {
Expand Down Expand Up @@ -1927,7 +1932,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(),
Expand Down Expand Up @@ -1968,6 +1973,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( "insertAfter, insertBefore, etc do not work when destination is original element. Element is removed (#4087)", function() {
Expand Down

0 comments on commit 03db1ad

Please sign in to comment.