diff --git a/Gruntfile.js b/Gruntfile.js index 904abbcea..7fa324399 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -14,7 +14,15 @@ module.exports = function( grunt ) { var fs = require( "fs" ), gzip = require( "gzip-js" ), - isTravis = process.env.TRAVIS; + isTravis = process.env.TRAVIS, + oldNode = /^v6\./.test( process.version ); + + // Support: Node.js <8 + // Skip running tasks that dropped support for Node.js 6 + // in those Node versions. + function runIfNewNode( task ) { + return oldNode ? "print_old_node_message:" + task : task; + } if ( !grunt.option( "filename" ) ) { grunt.option( "filename", "jquery.js" ); @@ -220,6 +228,33 @@ module.exports = function( grunt ) { browsers: [ isTravis ? "ChromeHeadlessNoSandbox" : "ChromeHeadless" ] }, + jsdom: { + options: { + files: [ + "test/data/jquery-1.9.1.js", + "test/data/testinit-jsdom.js", + + // We don't support various loading methods like AMD, + // choosing a version etc. for jsdom. + "dist/jquery.js", + + // Replacement for testinit.js#loadTests() + "test/data/testrunner.js", + + // jsdom only runs basic tests + "test/unit/basic.js", + + { pattern: "external/**", included: false, served: true }, + { + pattern: "test/**/*.@(js|css|jpg|html|xml|svg)", + included: false, + served: true + } + ] + }, + browsers: [ "jsdom" ] + }, + // To debug tests with Karma: // 1. Run 'grunt karma:chrome-debug' or 'grunt karma:firefox-debug' // (any karma subtask that has singleRun=false) @@ -285,6 +320,13 @@ module.exports = function( grunt ) { // Integrate jQuery specific tasks grunt.loadTasks( "build/tasks" ); + // Support: Node.js <8 + // Print a message on Node.js <8 notifying the task is skipped there. + grunt.registerTask( "print_old_node_message", function() { + var task = [].slice.call( arguments ).join( ":" ); + grunt.log.writeln( "Old Node.js detected, running the task \"" + task + "\" skipped..." ); + } ); + grunt.registerTask( "lint", [ "jsonlint", @@ -305,7 +347,13 @@ module.exports = function( grunt ) { ] ); grunt.registerTask( "test:fast", "node_smoke_tests" ); - grunt.registerTask( "test:slow", "promises_aplus_tests" ); + grunt.registerTask( "test:slow", [ + "promises_aplus_tests", + + // Support: Node.js <8 + // Karma no longer supports Node.js <8 as it relies on async-await internally. + runIfNewNode( "karma:jsdom" ) + ] ); grunt.registerTask( "test", [ "test:fast", diff --git a/package.json b/package.json index ffe9d1b1d..4124d2d93 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "karma-chrome-launcher": "2.2.0", "karma-firefox-launcher": "1.1.0", "karma-ie-launcher": "1.0.0", + "karma-jsdom-launcher": "7.1.0", "karma-qunit": "3.0.0", "load-grunt-tasks": "4.0.0", "native-promise-only": "0.8.1", diff --git a/test/.eslintrc.json b/test/.eslintrc.json index 2c724626f..a23ea5f98 100644 --- a/test/.eslintrc.json +++ b/test/.eslintrc.json @@ -55,7 +55,10 @@ "overrides": [ { - "files": ["data/core/jquery-iterability-transpiled-es6.js"], + "files": [ + "data/core/jquery-iterability-transpiled-es6.js", + "data/testinit-jsdom.js" + ], "parserOptions": { "ecmaVersion": 2015 } diff --git a/test/data/testinit-jsdom.js b/test/data/testinit-jsdom.js new file mode 100644 index 000000000..e0830cc92 --- /dev/null +++ b/test/data/testinit-jsdom.js @@ -0,0 +1,40 @@ +"use strict"; + +// Support: jsdom 13.2+ +// jsdom implements a throwing `window.scrollTo`. +QUnit.config.scrolltop = false; + +const FILEPATH = "/test/data/testinit-jsdom.js"; +const activeScript = document.currentScript; +const parentUrl = activeScript && activeScript.src ? + activeScript.src.replace( /[?#].*/, "" ) + FILEPATH.replace( /[^/]+/g, ".." ) + "/" : + "../"; +const supportjQuery = this.jQuery; + +// baseURL is intentionally set to "data/" instead of "". +// This is not just for convenience (since most files are in data/) +// but also to ensure that urls without prefix fail. +// Otherwise it's easy to write tests that pass on test/index.html +// but fail in Karma runner (where the baseURL is different). +const baseURL = parentUrl + "test/data/"; + +// Setup global variables before loading jQuery for testing .noConflict() +supportjQuery.noConflict( true ); +window.originaljQuery = this.jQuery = undefined; +window.original$ = this.$ = "replaced"; + +/** + * Add random number to url to stop caching + * + * Also prefixes with baseURL automatically. + * + * @example url("index.html") + * @result "data/index.html?10538358428943" + * + * @example url("mock.php?foo=bar") + * @result "data/mock.php?foo=bar&10538358345554" + */ +function url( value ) { + return baseURL + value + ( /\?/.test( value ) ? "&" : "?" ) + + new Date().getTime() + "" + parseInt( Math.random() * 100000, 10 ); +} diff --git a/test/unit/basic.js b/test/unit/basic.js index b57c0c0ba..bed27dcba 100644 --- a/test/unit/basic.js +++ b/test/unit/basic.js @@ -193,7 +193,9 @@ QUnit.test( "manipulation", function( assert ) { ); } ); -QUnit.test( "offset", function( assert ) { +// Support: jsdom 13.2+ +// jsdom returns 0 for offset-related properties +QUnit[ /jsdom\//.test( navigator.userAgent ) ? "skip" : "test" ]( "offset", function( assert ) { assert.expect( 3 ); var parent = jQuery( "
" ).appendTo( "#qunit-fixture" ),