diff --git a/.gitignore b/.gitignore index a6685904e..836cb81c4 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ npm-debug.log* /node_modules /test/data/core/jquery-iterability-transpiled.js +/test/data/qunit-fixture.js diff --git a/.travis.yml b/.travis.yml index 114a9e9b2..02a0e04dd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,20 @@ matrix: addons: chrome: stable firefox: latest + # Run tests against the slim build. + - node_js: "12" + env: + - NPM_SCRIPT="test:slim" + - BROWSERS="ChromeHeadless" + addons: + chrome: stable + # Run tests against the no-deprecated build. + - node_js: "12" + env: + - NPM_SCRIPT="test:no-deprecated" + - BROWSERS="ChromeHeadless" + addons: + chrome: stable # Run ES module tests. - node_js: "12" env: diff --git a/Gruntfile.js b/Gruntfile.js index 2a6226a03..c966ef99e 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -41,7 +41,7 @@ module.exports = function( grunt ) { retainLines: true, plugins: [ "@babel/transform-for-of" ] }, - nodeSmokeTests: { + tests: { files: { "test/data/core/jquery-iterability-transpiled.js": "test/data/core/jquery-iterability-transpiled-es6.js" @@ -314,7 +314,13 @@ module.exports = function( grunt ) { "karma:jsdom" ] ); + grunt.registerTask( "test:prepare", [ + "qunit_fixture", + "babel:tests" + ] ); + grunt.registerTask( "test", [ + "test:prepare", "test:fast", "test:slow" ] ); @@ -336,7 +342,7 @@ module.exports = function( grunt ) { "uglify", "remove_map_comment", "dist:*", - "qunit_fixture", + "test:prepare", "eslint:dist", "test:fast", "compare_size" diff --git a/build/tasks/node_smoke_tests.js b/build/tasks/node_smoke_tests.js index 40c49a4d9..574a63b4a 100644 --- a/build/tasks/node_smoke_tests.js +++ b/build/tasks/node_smoke_tests.js @@ -4,7 +4,7 @@ module.exports = ( grunt ) => { const fs = require( "fs" ); const spawnTest = require( "./lib/spawn_test.js" ); const testsDir = "./test/node_smoke_tests/"; - const nodeSmokeTests = [ "babel:nodeSmokeTests" ]; + const nodeSmokeTests = []; // Fire up all tests defined in test/node_smoke_tests/*.js in spawned sub-processes. // All the files under test/node_smoke_tests/*.js are supposed to exit with 0 code diff --git a/package.json b/package.json index 73789b2c2..6500d4458 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,9 @@ "test:browser": "grunt && grunt karma:main", "test:esmodules": "grunt && grunt karma:esmodules", "test:amd": "grunt && grunt karma:amd", - "test": "grunt && grunt test:slow && grunt karma:main && grunt karma:esmodules && grunt karma:amd", + "test:no-deprecated": "grunt test:prepare && grunt custom:-deprecated && grunt karma:main", + "test:slim": "grunt test:prepare && grunt custom:slim && grunt karma:main", + "test": "npm run test:slim && npm run test:no-deprecated && grunt && grunt test:slow && grunt karma:main && grunt karma:esmodules && grunt karma:amd", "jenkins": "npm run test:browserless" }, "commitplease": { diff --git a/src/ajax.js b/src/ajax.js index 3d4ce017b..44ec6e83b 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -6,7 +6,7 @@ import nonce from "./ajax/var/nonce.js"; import rquery from "./ajax/var/rquery.js"; import "./core/init.js"; -import "./ajax/parseXML.js"; +import "./core/parseXML.js"; import "./event/trigger.js"; import "./deferred.js"; import "./serialize.js"; // jQuery.param diff --git a/src/ajax/parseXML.js b/src/core/parseXML.js similarity index 100% rename from src/ajax/parseXML.js rename to src/core/parseXML.js diff --git a/src/jquery.js b/src/jquery.js index 24e58a93c..53515267b 100644 --- a/src/jquery.js +++ b/src/jquery.js @@ -21,8 +21,9 @@ import "./ajax.js"; import "./ajax/xhr.js"; import "./ajax/script.js"; import "./ajax/jsonp.js"; -import "./core/parseHTML.js"; import "./ajax/load.js"; +import "./core/parseXML.js"; +import "./core/parseHTML.js"; import "./event/ajax.js"; import "./effects.js"; import "./effects/animatedSelector.js"; diff --git a/test/data/core/dynamic_ready.html b/test/data/core/dynamic_ready.html index e8180cd2b..fade7adc2 100644 --- a/test/data/core/dynamic_ready.html +++ b/test/data/core/dynamic_ready.html @@ -2,7 +2,7 @@ - + diff --git a/test/data/offset/absolute.html b/test/data/offset/absolute.html index 9d8700465..4883e81be 100644 --- a/test/data/offset/absolute.html +++ b/test/data/offset/absolute.html @@ -18,15 +18,15 @@ diff --git a/test/data/offset/body.html b/test/data/offset/body.html index 75757d7e6..a27e242af 100644 --- a/test/data/offset/body.html +++ b/test/data/offset/body.html @@ -12,13 +12,13 @@ diff --git a/test/data/offset/fixed.html b/test/data/offset/fixed.html index 48a2c4797..9016f87a9 100644 --- a/test/data/offset/fixed.html +++ b/test/data/offset/fixed.html @@ -15,10 +15,10 @@ diff --git a/test/data/offset/scroll.html b/test/data/offset/scroll.html index 28cade1c3..3b9848fe4 100644 --- a/test/data/offset/scroll.html +++ b/test/data/offset/scroll.html @@ -17,16 +17,16 @@ diff --git a/test/data/offset/static.html b/test/data/offset/static.html index 1f4c3dc3d..913f9d260 100644 --- a/test/data/offset/static.html +++ b/test/data/offset/static.html @@ -13,15 +13,15 @@ diff --git a/test/data/offset/table.html b/test/data/offset/table.html index eeac19b77..1650e7297 100644 --- a/test/data/offset/table.html +++ b/test/data/offset/table.html @@ -13,13 +13,13 @@ diff --git a/test/data/qunit-fixture.js b/test/data/qunit-fixture.js deleted file mode 100644 index 9ec615c96..000000000 --- a/test/data/qunit-fixture.js +++ /dev/null @@ -1,2 +0,0 @@ -// Generated by build/tasks/qunit_fixture.js -QUnit.config.fixture = "

See this blog entry for more information.

\n

\n\tHere are some [links] in a normal paragraph: Google,\n\tGoogle Groups (Link).\n\tThis link has class=\"blog\":\n\tdiveintomark\n\n

\n
\n\t

Everything inside the red border is inside a div with id=\"foo\".

\n\t

This is a normal link: Yahoo

\n\t

This link has class=\"blog\": Simon Willison's Weblog

\n\n
\n
\n\t
\n
\n\n

Try them out:

\n\n
    \n
    \n\t\n\t\n\t\n\t\n\n\t\n\t\n\t\n\n\t\n\t\n\n\t\n\t\n\n\t\n\n\t\n\n\t\n\t\n\t\n\t\n\t\n\n\t\n\t\t\n\t\t\n\t\n\n\t\n\t\n\t\"'台北Táiběi\"'\n\t\n\t\n\t\n\n\ttest element\n
    \nFloat test.\n\n
    \n\t\n\t\n
    \n
    \n\n
    \n\t\n\t\n\t\n\t\n
    \n\n
    \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t
    \n\t\t
    \n\t\t\t\n\t\t
    \n\t
    \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n
    \n
    \n\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t
    \n\t
    hi there
    \n\t
    \n\t\t
    hidden
    \n\t
    \n\t
    \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t
    \n\t
    \n\t
    \n\t\t\n\t\t\n\t
    \n\t
    \n\t\t\n\t\t\n\t\t
    C
    \n\t
    \n\t
    \n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
    \n
    \n\n
    \n\t
      \n\t\t
    1. Rice
    2. \n\t\t
    3. Beans
    4. \n\t\t
    5. Blinis
    6. \n\t\t
    7. Tofu
    8. \n\t
    \n\n\t
    I'm hungry. I should...
    \n\t...Eat lots of food... |\n\t...Eat a little food... |\n\t...Eat no food...\n\t...Eat a burger...\n\t...Eat some funyuns...\n\t...Eat some funyuns...\n\t\n\t\n\t\n\t\n\t\t\n\t\n
    \n\n
    \n\t\n\t\n
    \n\n
    \n\t
    \n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\tNeither enabled nor disabled\n\t
    \n\t
    \n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\tNeither enabled nor disabled\n\t
    \n\t\n\t\n
    \n\n
    \n\t1\n\t2\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n
    \n
    \n\t
    \n\t\t
    fadeIn
    fadeIn
    \n\t\t
    fadeOut
    fadeOut
    \n\n\t\t
    show
    show
    \n\t\t
    hide
    hide
    \n\t\t
    hide
    hide
    \n\n\t\t
    togglein
    togglein
    \n\t\t
    toggleout
    toggleout
    \n\t\t
    toggleout
    toggleout
    \n\n\t\t
    slideUp
    slideUp
    \n\t\t
    slideDown
    slideDown
    \n\t\t
    slideUp
    slideUp
    \n\n\t\t
    slideToggleIn
    slideToggleIn
    \n\t\t
    slideToggleOut
    slideToggleOut
    \n\n\t\t
    fadeToggleIn
    fadeToggleIn
    \n\t\t
    fadeToggleOut
    fadeToggleOut
    \n\n\t\t
    fadeTo
    fadeTo
    \n\t
    \n\n\t
    \n\t\n
    \n
    \n"; diff --git a/test/unit/ajax.js b/test/unit/ajax.js index a2cc34e32..e1f290f32 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -255,7 +255,7 @@ QUnit.module( "ajax", { ajaxTest( "jQuery.ajax() - headers", 8, function( assert ) { return { setup: function() { - jQuery( document ).ajaxSend( function( evt, xhr ) { + jQuery( document ).on( "ajaxSend", function( evt, xhr ) { xhr.setRequestHeader( "ajax-send", "test" ); } ); }, @@ -580,10 +580,10 @@ QUnit.module( "ajax", { return { setup: function() { jQuery( context ).appendTo( "#foo" ) - .ajaxSend( event ) - .ajaxComplete( event ) - .ajaxError( event ) - .ajaxSuccess( event ); + .on( "ajaxSend", event ) + .on( "ajaxComplete", event ) + .on( "ajaxError", event ) + .on( "ajaxSuccess", event ); }, requests: [ { url: url( "name.html" ), @@ -2539,7 +2539,7 @@ if ( typeof window.ArrayBuffer === "undefined" || typeof new XMLHttpRequest().re var done = assert.async(); addGlobalEvents( "ajaxStart ajaxStop ajaxSend ajaxComplete ajaxError", assert )(); - jQuery( document ).ajaxStop( done ); + jQuery( document ).on( "ajaxStop", done ); jQuery( "
    " ).load( baseURL + "404.txt", function() { assert.ok( true, "complete" ); } ); @@ -2727,7 +2727,7 @@ if ( typeof window.ArrayBuffer === "undefined" || typeof new XMLHttpRequest().re jQuery.ajaxSetup( { dataType: "json" } ); - jQuery( document ).ajaxComplete( function( e, xml, s ) { + jQuery( document ).on( "ajaxComplete", function( e, xml, s ) { assert.strictEqual( s.dataType, "html", "Verify the load() dataType was html" ); jQuery( document ).off( "ajaxComplete" ); done(); @@ -2748,7 +2748,7 @@ if ( typeof window.ArrayBuffer === "undefined" || typeof new XMLHttpRequest().re } } ); jQuery( "#foo" ).load( baseURL + "mock.php?action=echoQuery", data ); - jQuery( document ).ajaxComplete( function( event, jqXHR, options ) { + jQuery( document ).on( "ajaxComplete", function( event, jqXHR, options ) { assert.ok( ~options.data.indexOf( "foo=bar" ), "Data from ajaxSettings was used" ); done(); } ); diff --git a/test/unit/callbacks.js b/test/unit/callbacks.js index b440f3822..c1a6eacf6 100644 --- a/test/unit/callbacks.js +++ b/test/unit/callbacks.js @@ -4,6 +4,12 @@ QUnit.module( "callbacks", { ( function() { +if ( !jQuery.Callbacks ) { + return; +} + +( function() { + var output, addToOutput = function( string ) { return function() { @@ -387,3 +393,5 @@ QUnit.test( "jQuery.Callbacks() - list with memory stays locked (gh-3469)", func cb.fire(); assert.equal( fired, 11, "Post-lock() fire ignored" ); } ); + +} )(); diff --git a/test/unit/deferred.js b/test/unit/deferred.js index 27a913216..2063ac82c 100644 --- a/test/unit/deferred.js +++ b/test/unit/deferred.js @@ -2,6 +2,12 @@ QUnit.module( "deferred", { afterEach: moduleTeardown } ); +( function() { + +if ( !jQuery.Deferred ) { + return; +} + jQuery.each( [ "", " - new operator" ], function( _, withNew ) { function createDeferred( fn ) { @@ -1111,3 +1117,5 @@ QUnit.test( "jQuery.when(...) - opportunistically synchronous", function( assert when = "after"; } ); + +} )(); diff --git a/test/unit/deprecated.js b/test/unit/deprecated.js index df9d5ffa8..d5a577ffb 100644 --- a/test/unit/deprecated.js +++ b/test/unit/deprecated.js @@ -1,7 +1,7 @@ QUnit.module( "deprecated", { afterEach: moduleTeardown } ); -QUnit.test( "bind/unbind", function( assert ) { +QUnit[ jQuery.fn.bind ? "test" : "skip" ]( "bind/unbind", function( assert ) { assert.expect( 4 ); var markup = jQuery( @@ -22,7 +22,7 @@ QUnit.test( "bind/unbind", function( assert ) { .remove(); } ); -QUnit.test( "delegate/undelegate", function( assert ) { +QUnit[ jQuery.fn.delegate ? "test" : "skip" ]( "delegate/undelegate", function( assert ) { assert.expect( 2 ); var markup = jQuery( @@ -95,6 +95,45 @@ QUnit[ jQuery.fn.click ? "test" : "skip" ]( "trigger() shortcuts", function( ass assert.equal( clickCounter, 1, "Check that click, triggers onclick event handler on an a tag also" ); } ); +if ( jQuery.ajax && jQuery.fn.ajaxSend ) { + ajaxTest( "jQuery.ajax() - events with context", 12, function( assert ) { + var context = document.createElement( "div" ); + + function event( e ) { + assert.equal( this, context, e.type ); + } + + function callback( msg ) { + return function() { + assert.equal( this, context, "context is preserved on callback " + msg ); + }; + } + + return { + setup: function() { + jQuery( context ).appendTo( "#foo" ) + .ajaxSend( event ) + .ajaxComplete( event ) + .ajaxError( event ) + .ajaxSuccess( event ); + }, + requests: [ { + url: url( "name.html" ), + context: context, + beforeSend: callback( "beforeSend" ), + success: callback( "success" ), + complete: callback( "complete" ) + }, { + url: url( "404.txt" ), + context: context, + beforeSend: callback( "beforeSend" ), + error: callback( "error" ), + complete: callback( "complete" ) + } ] + }; + } ); +} + QUnit[ jQuery.fn.click ? "test" : "skip" ]( "Event aliases", function( assert ) { // Explicitly skipping focus/blur events due to their flakiness @@ -113,7 +152,7 @@ QUnit[ jQuery.fn.click ? "test" : "skip" ]( "Event aliases", function( assert ) } ); } ); -QUnit.test( "jQuery.proxy", function( assert ) { +QUnit[ jQuery.proxy ? "test" : "skip" ]( "jQuery.proxy", function( assert ) { assert.expect( 9 ); var test2, test3, test4, fn, cb, @@ -161,7 +200,7 @@ QUnit.test( "jQuery.proxy", function( assert ) { cb.call( thisObject, "arg3" ); } ); -QUnit.test( "trim", function( assert ) { +QUnit[ jQuery.trim ? "test" : "skip" ]( "trim", function( assert ) { assert.expect( 13 ); var nbsp = String.fromCharCode( 160 ); diff --git a/test/unit/event.js b/test/unit/event.js index 4019fbe81..cecad3f34 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -1317,7 +1317,7 @@ QUnit.test( "Delegated events with malformed selectors (gh-3071)", function( ass jQuery( "#foo" ).on( "click", "nonexistent:not", function() {} ); }, "short-circuitable malformed selector throws on attach" ); - jQuery( "#foo > :first-child" ).click(); + jQuery( "#foo > :first-child" ).trigger( "click" ); assert.ok( true, "malformed selector does not throw on event" ); } ); @@ -2495,7 +2495,7 @@ QUnit.test( "drag/drop events copy mouse-related event properties (gh-1925, gh-2 fireNative( $fixture[ 0 ], "drop" ); - $fixture.unbind( "dragmove drop" ).remove(); + $fixture.off( "dragmove drop" ).remove(); } ); QUnit.test( "focusin using non-element targets", function( assert ) { @@ -2548,7 +2548,8 @@ testIframe( function( assert, jQuery, window, document, isOk ) { assert.expect( 1 ); assert.ok( isOk, "$.when( $.ready ) works" ); - } + }, + jQuery.when ? QUnit.test : QUnit.skip ); // need PHP here to make the incepted IFRAME hang diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index fa944bceb..b71a54799 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -2400,7 +2400,6 @@ QUnit.test( "html() - script exceptions bubble (#11743)", function( assert ) { assert.ok( true, "Exception ignored" ); } else { assert.ok( true, "No jQuery.ajax" ); - assert.ok( true, "No jQuery.ajax" ); } }; @@ -2490,7 +2489,7 @@ QUnit.test( "script evaluation (#11795)", function( assert ) { } } ); -QUnit.test( "jQuery._evalUrl (#12838)", function( assert ) { +QUnit[ jQuery.ajax ? "test" : "skip" ]( "jQuery._evalUrl (#12838)", function( assert ) { assert.expect( 5 ); @@ -2788,7 +2787,8 @@ QUnit.test( "Make sure tags with single-character names are found (gh-4124)", fu assert.strictEqual( htmlOut, htmlIn ); } ); -QUnit.test( "Insert script with data-URI (gh-1887)", function( assert ) { +// The AJAX module is needed for jQuery._evalUrl. +QUnit[ jQuery.ajax ? "test" : "skip" ]( "Insert script with data-URI (gh-1887)", function( assert ) { assert.expect( 1 ); Globals.register( "testFoo" ); @@ -2869,10 +2869,11 @@ testIframe( } ); }, + // The AJAX module is needed for jQuery._evalUrl. // Support: Edge <=18+ // Edge doesn't support nonce in non-inline scripts. // See https://web.archive.org/web/20171203124125/https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/13246371/ - QUnit[ /\bedge\//i.test( navigator.userAgent ) ? "skip" : "test" ] + QUnit[ jQuery.ajax && !/\bedge\//i.test( navigator.userAgent ) ? "test" : "skip" ] ); testIframe( diff --git a/test/unit/queue.js b/test/unit/queue.js index df7eaf4ca..7735544bc 100644 --- a/test/unit/queue.js +++ b/test/unit/queue.js @@ -1,5 +1,11 @@ QUnit.module( "queue", { afterEach: moduleTeardown } ); +( function() { + +if ( !jQuery.fn.queue ) { + return; +} + QUnit.test( "queue() with other types", function( assert ) { var done = assert.async( 2 ); assert.expect( 14 ); @@ -329,3 +335,5 @@ QUnit[ jQuery.fn.stop ? "test" : "skip" ]( "queue stop hooks", function( assert foo.stop( false, true ); } ); + +} )(); diff --git a/test/unit/ready.js b/test/unit/ready.js index d3396b1c4..fd33c0a18 100644 --- a/test/unit/ready.js +++ b/test/unit/ready.js @@ -2,7 +2,7 @@ QUnit.module( "ready" ); ( function() { var notYetReady, noEarlyExecution, - whenified = jQuery.when( jQuery.ready ), + whenified = jQuery.when && jQuery.when( jQuery.ready ), promisified = Promise.resolve( jQuery.ready ), start = new Date(), order = [], @@ -105,7 +105,7 @@ QUnit.module( "ready" ); } ); } ); - QUnit.test( "jQuery.when(jQuery.ready)", function( assert ) { + QUnit[ jQuery.when ? "test" : "skip" ]( "jQuery.when(jQuery.ready)", function( assert ) { assert.expect( 2 ); var done = jQuery.map( new Array( 2 ), function() { return assert.async(); } ); @@ -149,15 +149,18 @@ QUnit.module( "ready" ); } ); } ); - testIframe( - "holdReady test needs to be a standalone test since it deals with DOM ready", - "readywait.html", - function( assert, jQuery, window, document, releaseCalled ) { - assert.expect( 2 ); - var now = new Date(); - assert.ok( now - start >= 300, "Needs to have waited at least half a second" ); - assert.ok( releaseCalled, "The release function was called, which resulted in ready" ); - } - ); + // jQuery.holdReady is deprecated, skip the test if it was excluded. + if ( jQuery.holdReady ) { + testIframe( + "holdReady test needs to be a standalone test since it deals with DOM ready", + "readywait.html", + function( assert, jQuery, window, document, releaseCalled ) { + assert.expect( 2 ); + var now = new Date(); + assert.ok( now - start >= 300, "Needs to have waited at least half a second" ); + assert.ok( releaseCalled, "The release function was called, which resulted in ready" ); + } + ); + } } )(); diff --git a/test/unit/serialize.js b/test/unit/serialize.js index d23421ddd..c4e6a6c5e 100644 --- a/test/unit/serialize.js +++ b/test/unit/serialize.js @@ -77,7 +77,7 @@ QUnit.test( "jQuery.param()", function( assert ) { assert.equal( jQuery.param( params ), "", "jQuery.param( undefined ) === empty string" ); } ); -QUnit.test( "jQuery.param() not affected by ajaxSettings", function( assert ) { +QUnit[ jQuery.ajax ? "test" : "skip" ]( "jQuery.param() not affected by ajaxSettings", function( assert ) { assert.expect( 1 ); var oldTraditional = jQuery.ajaxSettings.traditional;