diff --git a/.gitignore b/.gitignore index a6685904e3..836cb81c45 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 114a9e9b26..02a0e04dd8 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 2a6226a03f..c966ef99e4 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 40c49a4d98..574a63b4a4 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 73789b2c2f..6500d44587 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 3d4ce017ba..44ec6e83b6 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 24e58a93cc..53515267bf 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 e8180cd2b0..fade7adc2d 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 9d87004652..4883e81bef 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 75757d7e60..a27e242aff 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 48a2c47975..9016f87a98 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 28cade1c37..3b9848fe49 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 1f4c3dc3dc..913f9d260d 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 eeac19b77c..1650e72972 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 9ec615c966..0000000000 --- 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 a2cc34e327..e1f290f32c 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 b440f38227..c1a6eacf6c 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 27a9132166..2063ac82cc 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 df9d5ffa85..d5a577ffb0 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 4019fbe814..cecad3f345 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 fa944bcebf..b71a547992 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 df7eaf4ca7..7735544bce 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 d3396b1c49..fd33c0a18f 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 d23421ddd2..c4e6a6c5ed 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;