No ticket: improve global variable/ajax request tracking

This commit is contained in:
Richard Gibson 2012-12-02 23:32:16 -05:00
parent 27c9360a1b
commit 5b9bf13439
7 changed files with 68 additions and 54 deletions

View File

@ -45,7 +45,6 @@
"createXMLFragment": true,
"moduleTeardown": true,
"testFoo": true,
"foobar": true,
"url": true,
"t": true,
"q": true,

View File

@ -1,3 +1,3 @@
var foobar = "bar";
var testBar = "bar";
jQuery('#ap').html('bar');
ok( true, "test.js executed");

View File

@ -158,39 +158,46 @@ function ajaxTest( title, expect, options ) {
if ( options.setup ) {
options.setup();
}
var aborted = false,
abort = function( reason ) {
if ( !aborted ) {
aborted = true;
var completed = false,
complete = function() {
completed = true;
delete ajaxTest.abort;
},
abort = ajaxTest.abort = function( reason ) {
if ( !completed ) {
complete();
ok( false, "unexpected " + reason );
jQuery.each( requests, function( _, request ) {
request.abort();
if ( request && request.abort ) {
request.abort();
}
});
}
},
requests = jQuery.map( requestOptions, function( options ) {
var request = ( options.create || jQuery.ajax )( options );
requests = jQuery.map( requestOptions, function( options, index ) {
var request = ( options.create || jQuery.ajax )( options ),
callIfDefined = function( deferType, optionType ) {
var handler = options[ deferType ] || !!options[ optionType ];
return handler ?
function() {
if ( !completed && jQuery.isFunction( handler ) ) {
handler.apply( this, arguments );
}
} :
function() {
abort( optionType );
};
};
if ( options.afterSend ) {
options.afterSend( request );
}
return request;
return request.then( callIfDefined( "done", "success" ), callIfDefined( "fail", "error" ) );
});
jQuery.when.apply( jQuery, jQuery.map( requests, function( request, index ) {
function callIfDefined( deferType, optionType ) {
var handler = requestOptions[ index ][ deferType ] || !!requestOptions[ index ][ optionType ];
return handler ? function() {
if ( !aborted && jQuery.isFunction( handler ) ) {
handler.apply( this, arguments );
}
} : function() {
abort( optionType );
}
}
return request.then( callIfDefined( "done", "success" ), callIfDefined( "fail", "error" ) );
}) ).always(
options.teardown,
start
);
jQuery.when.apply( jQuery, requests ).always( complete, options.teardown, start);
});
};

View File

@ -3,10 +3,10 @@
*/
jQuery.noConflict();
// For checking globals pollution
window[ jQuery.expando ] = undefined;
// ...in Gecko
this.getInterface = this.getInterface;
// For checking globals pollution despite auto-created globals in various environments
jQuery.each( [ jQuery.expando, "getInterface", "Packages", "java", "netscape" ], function( i, name ) {
window[ name ] = window[ name ];
});
// Expose Sizzle for Sizzle's selector tests
// We remove Sizzle's globalization in jQuery
@ -138,7 +138,7 @@ function testSubproject( label, url, risTests ) {
// Explanation at http://perfectionkills.com/understanding-delete/#ie_bugs
var Globals = (function() {
var globals = {};
return QUnit.config.noglobals ? {
return {
register: function( name ) {
globals[ name ] = true;
jQuery.globalEval( "var " + name );
@ -153,9 +153,6 @@ var Globals = (function() {
"; } catch( x ) {}" );
}
}
} : {
register: jQuery.noop,
cleanup: jQuery.noop
};
})();
@ -312,6 +309,9 @@ var Globals = (function() {
}
if ( jQuery.active !== undefined && jQuery.active !== oldActive ) {
equal( jQuery.active, 0, "No AJAX requests are still active" );
if ( ajaxTest.abort ) {
ajaxTest.abort("active request");
}
oldActive = jQuery.active;
}
};

View File

@ -533,7 +533,7 @@ module( "ajax", {
ajaxTest( "jQuery.ajax() - dataType html", 5, {
setup: function() {
Globals.register("testFoo");
Globals.register("foobar");
Globals.register("testBar");
},
dataType: "html",
url: url("data/test.html"),
@ -541,7 +541,7 @@ module( "ajax", {
ok( data.match( /^html text/ ), "Check content for datatype html" );
jQuery("#ap").html( data );
strictEqual( window["testFoo"], "foo", "Check if script was evaluated for datatype html" );
strictEqual( window["foobar"], "bar", "Check if script src was evaluated for datatype html" );
strictEqual( window["testBar"], "bar", "Check if script src was evaluated for datatype html" );
}
});
@ -588,6 +588,7 @@ module( "ajax", {
jQuery( document ).off("ajaxError.passthru");
start();
});
Globals.register("testBar");
ok( jQuery.get( url(target), success ), "get" );
ok( jQuery.post( url(target), success ), "post" );
@ -836,28 +837,37 @@ module( "ajax", {
});
ajaxTest( "jQuery.ajax() - script, Remote", 2, {
setup: function() {
Globals.register("testBar");
},
url: window.location.href.replace( /[^\/]*$/, "" ) + "data/test.js",
dataType: "script",
success: function( data ) {
ok( window[ "foobar" ], "Script results returned (GET, no callback)" );
strictEqual( window["testBar"], "bar", "Script results returned (GET, no callback)" );
}
});
ajaxTest( "jQuery.ajax() - script, Remote with POST", 3, {
setup: function() {
Globals.register("testBar");
},
url: window.location.href.replace( /[^\/]*$/, "" ) + "data/test.js",
type: "POST",
dataType: "script",
success: function( data, status ) {
ok( window[ "foobar" ], "Script results returned (POST, no callback)" );
strictEqual( window["testBar"], "bar", "Script results returned (POST, no callback)" );
strictEqual( status, "success", "Script results returned (POST, no callback)" );
}
});
ajaxTest( "jQuery.ajax() - script, Remote with scheme-less URL", 2, {
setup: function() {
Globals.register("testBar");
},
url: window.location.href.replace( /[^\/]*$/, "" ).replace( /^.*?\/\//, "//" ) + "data/test.js",
dataType: "script",
success: function( data ) {
ok( window[ "foobar" ], "Script results returned (GET, no callback)" );
strictEqual( window["testBar"], "bar", "Script results returned (GET, no callback)" );
}
});
@ -1655,17 +1665,20 @@ module( "ajax", {
//----------- jQuery.getScript()
asyncTest( "jQuery.getScript( String, Function ) - with callback", 2, function() {
Globals.register("testBar");
jQuery.getScript( url("data/test.js"), function( data, _, jqXHR ) {
strictEqual( foobar, "bar", "Check if script was evaluated" );
strictEqual( window["testBar"], "bar", "Check if script was evaluated" );
start();
});
});
asyncTest( "jQuery.getScript( String, Function ) - no callback", 1, function() {
Globals.register("testBar");
jQuery.getScript( url("data/test.js") ).done( start );
});
asyncTest( "#8082 - jQuery.getScript( String, Function ) - source as responseText", 2, function() {
Globals.register("testBar");
jQuery.getScript( url("data/test.js"), function( data, _, jqXHR ) {
strictEqual( data, jqXHR.responseText, "Same-domain script requests returns the source of the script" );
start();
@ -1729,10 +1742,14 @@ module( "ajax", {
asyncTest( "jQuery.fn.load( String, Function ) - check scripts", 7, function() {
var verifyEvaluation = function() {
strictEqual( window["foobar"], "bar", "Check if script src was evaluated after load" );
strictEqual( window["testBar"], "bar", "Check if script src was evaluated after load" );
strictEqual( jQuery("#ap").html(), "bar", "Check if script evaluation has modified DOM");
start();
};
Globals.register("testFoo");
Globals.register("testBar");
jQuery("#first").load( url("data/test.html"), function() {
ok( jQuery("#first").html().match( /^html text/ ), "Check content after loading html" );
strictEqual( jQuery("#foo").html(), "foo", "Check if script evaluation has modified DOM" );
@ -1742,6 +1759,8 @@ module( "ajax", {
});
asyncTest( "jQuery.fn.load( String, Function ) - check file with only a script tag", 3, function() {
Globals.register("testFoo");
jQuery("#first").load( url("data/test2.html"), function() {
strictEqual( jQuery("#foo").html(), "foo", "Check if script evaluation has modified DOM");
strictEqual( window["testFoo"], "foo", "Check if script was evaluated after load" );

View File

@ -195,6 +195,7 @@ test( "selector state", function() {
test( "globalEval", function() {
expect( 3 );
Globals.register("globalEvalTest");
jQuery.globalEval("globalEvalTest = 1;");
equal( window.globalEvalTest, 1, "Test variable assignments are global" );
@ -204,8 +205,6 @@ test( "globalEval", function() {
jQuery.globalEval("this.globalEvalTest = 3;");
equal( window.globalEvalTest, 3, "Test context (this) is the window object" );
jQuery.globalEval("delete globalEvalTest;");
});
test("noConflict", function() {

View File

@ -704,7 +704,7 @@ test("append(xml)", function() {
});
test("appendTo(String|Element|Array<Element>|jQuery)", function() {
expect( 16 + ( jQuery.getScript ? 1 : 0 ) );
expect( 16 );
var defaultText = "Try them out:";
@ -775,16 +775,6 @@ test("appendTo(String|Element|Array<Element>|jQuery)", function() {
div.remove().appendTo("#qunit-fixture");
equal( jQuery("#qunit-fixture div").length, num, "Make sure all the removed divs were inserted." );
QUnit.reset();
if ( jQuery.getScript ) {
stop();
jQuery.getScript("data/test.js", function() {
jQuery("script[src*='data\\/test\\.js']").remove();
start();
});
}
});
var testPrepend = function(val) {