From 5b9bf134390d56d6b6916225d86c1328e70e9970 Mon Sep 17 00:00:00 2001 From: Richard Gibson Date: Sun, 2 Dec 2012 23:32:16 -0500 Subject: [PATCH] No ticket: improve global variable/ajax request tracking --- test/.jshintrc | 1 - test/data/test.js | 2 +- test/data/testinit.js | 55 ++++++++++++++++++++++----------------- test/data/testrunner.js | 16 ++++++------ test/unit/ajax.js | 33 ++++++++++++++++++----- test/unit/core.js | 3 +-- test/unit/manipulation.js | 12 +-------- 7 files changed, 68 insertions(+), 54 deletions(-) diff --git a/test/.jshintrc b/test/.jshintrc index 3513666d5..2dd668c3f 100644 --- a/test/.jshintrc +++ b/test/.jshintrc @@ -45,7 +45,6 @@ "createXMLFragment": true, "moduleTeardown": true, "testFoo": true, - "foobar": true, "url": true, "t": true, "q": true, diff --git a/test/data/test.js b/test/data/test.js index 69f492dcc..a18815315 100644 --- a/test/data/test.js +++ b/test/data/test.js @@ -1,3 +1,3 @@ -var foobar = "bar"; +var testBar = "bar"; jQuery('#ap').html('bar'); ok( true, "test.js executed"); diff --git a/test/data/testinit.js b/test/data/testinit.js index a866d3227..2088407a6 100644 --- a/test/data/testinit.js +++ b/test/data/testinit.js @@ -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); }); }; diff --git a/test/data/testrunner.js b/test/data/testrunner.js index b17bf265f..085203c96 100644 --- a/test/data/testrunner.js +++ b/test/data/testrunner.js @@ -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; } }; diff --git a/test/unit/ajax.js b/test/unit/ajax.js index a65f90536..f88b5d7cc 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -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" ); diff --git a/test/unit/core.js b/test/unit/core.js index 603368b9e..6ecfe5a4f 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -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() { diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index 4a980b249..530224354 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -704,7 +704,7 @@ test("append(xml)", function() { }); test("appendTo(String|Element|Array|jQuery)", function() { - expect( 16 + ( jQuery.getScript ? 1 : 0 ) ); + expect( 16 ); var defaultText = "Try them out:"; @@ -775,16 +775,6 @@ test("appendTo(String|Element|Array|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) {