From: Michał Gołębiowski-Owczarek Date: Mon, 4 Mar 2019 17:30:51 +0000 (+0100) Subject: Build: Update jsdom; migrate a test with Symbol polyfill to an iframe test X-Git-Tag: 3.4.0~17 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=9cb124ed00aad8ac47690e31ad0bb8c3c365663d;p=jquery.git Build: Update jsdom; migrate a test with Symbol polyfill to an iframe test So far, we've been testing that jQuery element iteration works with polyfilled Symbol & transpiled for-of via a Node test with jsdom with the Symbol global removed. Unfortunately, jsdom now requires Symbol to be present for its internal functionality so such a test is no longer possible. Instead, it's been migrated to an iframe test with transpiled JavaScript. This PR also enables us to use ECMAScript 2017 or newer in Node.js code. Closes gh-4305 --- diff --git a/.eslintignore b/.eslintignore index 415493351..3ee82bba3 100644 --- a/.eslintignore +++ b/.eslintignore @@ -11,4 +11,4 @@ test/data/readywaitasset.js test/data/readywaitloader.js test/data/support/csp.js test/data/support/getComputedSupport.js -test/node_smoke_tests/lib/ensure_iterability.js +test/data/core/jquery-iterability-transpiled.js diff --git a/.eslintrc-node.json b/.eslintrc-node.json index 904e7ba94..589144272 100644 --- a/.eslintrc-node.json +++ b/.eslintrc-node.json @@ -4,10 +4,11 @@ "extends": "jquery", "parserOptions": { - "ecmaVersion": 5 + "ecmaVersion": 2017 }, "env": { + "es6": true, "node": true } } diff --git a/.gitignore b/.gitignore index 6b00bc2e2..c00c4ac7e 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,4 @@ npm-debug.log* /node_modules -/test/node_smoke_tests/lib/ensure_iterability.js +/test/data/core/jquery-iterability-transpiled.js diff --git a/Gruntfile.js b/Gruntfile.js index ca82e8016..cf11680c4 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -42,8 +42,8 @@ module.exports = function( grunt ) { }, nodeSmokeTests: { files: { - "test/node_smoke_tests/lib/ensure_iterability.js": - "test/node_smoke_tests/lib/ensure_iterability_es6.js" + "test/data/core/jquery-iterability-transpiled.js": + "test/data/core/jquery-iterability-transpiled-es6.js" } } }, diff --git a/build/tasks/node_smoke_tests.js b/build/tasks/node_smoke_tests.js index bd0a9150e..e3d69db88 100644 --- a/build/tasks/node_smoke_tests.js +++ b/build/tasks/node_smoke_tests.js @@ -1,11 +1,11 @@ -module.exports = function( grunt ) { +module.exports = ( grunt ) => { "use strict"; - var fs = require( "fs" ), - spawnTest = require( "./lib/spawn_test.js" ), - testsDir = "./test/node_smoke_tests/", - nodeSmokeTests = [ "babel:nodeSmokeTests" ]; + const fs = require( "fs" ); + const spawnTest = require( "./lib/spawn_test.js" ); + const testsDir = "./test/node_smoke_tests/"; + const nodeSmokeTests = [ "babel: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 @@ -14,15 +14,15 @@ module.exports = function( grunt ) { // each other, e.g. so that they don't share the require cache. fs.readdirSync( testsDir ) - .filter( function( testFilePath ) { - return fs.statSync( testsDir + testFilePath ).isFile() && - /\.js$/.test( testFilePath ); - } ) - .forEach( function( testFilePath ) { - var taskName = "node_" + testFilePath.replace( /\.js$/, "" ); + .filter( ( testFilePath ) => + fs.statSync( testsDir + testFilePath ).isFile() && + /\.js$/.test( testFilePath ) + ) + .forEach( ( testFilePath ) => { + const taskName = `node_${ testFilePath.replace( /\.js$/, "" ) }`; grunt.registerTask( taskName, function() { - spawnTest( this.async(), "node \"test/node_smoke_tests/" + testFilePath + "\"" ); + spawnTest( this.async(), `node "test/node_smoke_tests/${ testFilePath }"` ); } ); nodeSmokeTests.push( taskName ); diff --git a/package.json b/package.json index 43c8b6271..e09a4765e 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "gzip-js": "0.3.2", "husky": "1.3.1", "insight": "0.10.1", - "jsdom": "5.6.1", + "jsdom": "13.2.0", "karma": "4.0.0", "karma-browserstack-launcher": "1.4.0", "karma-chrome-launcher": "2.2.0", diff --git a/test/.eslintrc.json b/test/.eslintrc.json index c3924fbc6..2c724626f 100644 --- a/test/.eslintrc.json +++ b/test/.eslintrc.json @@ -51,5 +51,14 @@ // Not really too many - waiting for autofix features for these rules "lines-around-comment": "off", "dot-notation": "off" - } + }, + + "overrides": [ + { + "files": ["data/core/jquery-iterability-transpiled-es6.js"], + "parserOptions": { + "ecmaVersion": 2015 + } + } + ] } diff --git a/test/data/core/jquery-iterability-transpiled-es6.js b/test/data/core/jquery-iterability-transpiled-es6.js new file mode 100644 index 000000000..0c3bda624 --- /dev/null +++ b/test/data/core/jquery-iterability-transpiled-es6.js @@ -0,0 +1,14 @@ +/* global startIframeTest */ + +jQuery( function() { + "use strict"; + + var elem = jQuery( "
" ); + var result = ""; + var i; + for ( i of elem ) { + result += i.nodeName; + } + + startIframeTest( result ); +} ); diff --git a/test/data/core/jquery-iterability-transpiled.html b/test/data/core/jquery-iterability-transpiled.html new file mode 100644 index 000000000..69ac18252 --- /dev/null +++ b/test/data/core/jquery-iterability-transpiled.html @@ -0,0 +1,14 @@ + + + + + jQuery objects transpiled iterability test page + + + + + + +

jQuery objects transpiled iterability test page

+ + diff --git a/test/node_smoke_tests/document_missing.js b/test/node_smoke_tests/document_missing.js index 348e9a4ef..0f6a3f78b 100644 --- a/test/node_smoke_tests/document_missing.js +++ b/test/node_smoke_tests/document_missing.js @@ -1,10 +1,10 @@ "use strict"; -var assert = require( "assert" ), - ensureGlobalNotCreated = require( "./lib/ensure_global_not_created" ), - jQueryFactory = require( "../../dist/jquery.js" ); +const assert = require( "assert" ); +const ensureGlobalNotCreated = require( "./lib/ensure_global_not_created" ); +const jQueryFactory = require( "../../dist/jquery.js" ); -assert.throws( function() { +assert.throws( () => { jQueryFactory( {} ); }, /jQuery requires a window with a document/ ); diff --git a/test/node_smoke_tests/document_passed.js b/test/node_smoke_tests/document_passed.js index 5999cc744..b1154d3a3 100644 --- a/test/node_smoke_tests/document_passed.js +++ b/test/node_smoke_tests/document_passed.js @@ -1,14 +1,12 @@ "use strict"; -var assert = require( "assert" ); +const { JSDOM } = require( "jsdom" ); -require( "jsdom" ).env( "", function( errors, window ) { - assert.ifError( errors ); +const { window } = new JSDOM( "" ); - var ensureJQuery = require( "./lib/ensure_jquery" ), - ensureGlobalNotCreated = require( "./lib/ensure_global_not_created" ), - jQuery = require( "../../dist/jquery.js" )( window ); +const ensureJQuery = require( "./lib/ensure_jquery" ); +const ensureGlobalNotCreated = require( "./lib/ensure_global_not_created" ); +const jQuery = require( "../../dist/jquery.js" )( window ); - ensureJQuery( jQuery ); - ensureGlobalNotCreated( module.exports ); -} ); +ensureJQuery( jQuery ); +ensureGlobalNotCreated( module.exports ); diff --git a/test/node_smoke_tests/document_present_originally.js b/test/node_smoke_tests/document_present_originally.js index f75148708..89b0c7bd8 100644 --- a/test/node_smoke_tests/document_present_originally.js +++ b/test/node_smoke_tests/document_present_originally.js @@ -1,17 +1,15 @@ "use strict"; -var assert = require( "assert" ); +const { JSDOM } = require( "jsdom" ); -require( "jsdom" ).env( "", function( errors, window ) { - assert.ifError( errors ); +const { window } = new JSDOM( "" ); - // Pretend the window is a global. - global.window = window; +// Pretend the window is a global. +global.window = window; - var ensureJQuery = require( "./lib/ensure_jquery" ), - ensureGlobalNotCreated = require( "./lib/ensure_global_not_created" ), - jQuery = require( "../../dist/jquery.js" ); +const ensureJQuery = require( "./lib/ensure_jquery" ); +const ensureGlobalNotCreated = require( "./lib/ensure_global_not_created" ); +const jQuery = require( "../../dist/jquery.js" ); - ensureJQuery( jQuery ); - ensureGlobalNotCreated( module.exports, window ); -} ); +ensureJQuery( jQuery ); +ensureGlobalNotCreated( module.exports, window ); diff --git a/test/node_smoke_tests/iterable_with_symbol_polyfill.js b/test/node_smoke_tests/iterable_with_symbol_polyfill.js deleted file mode 100644 index 34701d691..000000000 --- a/test/node_smoke_tests/iterable_with_symbol_polyfill.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; - -var assert = require( "assert" ); - -delete global.Symbol; -require( "core-js" ); - -assert.strictEqual( typeof Symbol, "function", "Expected Symbol to be a function" ); -assert.notEqual( typeof Symbol.iterator, "symbol", "Expected Symbol.iterator to be polyfilled" ); - -require( "./lib/ensure_iterability" )(); diff --git a/test/node_smoke_tests/lib/ensure_global_not_created.js b/test/node_smoke_tests/lib/ensure_global_not_created.js index 7cc83b541..95db62226 100644 --- a/test/node_smoke_tests/lib/ensure_global_not_created.js +++ b/test/node_smoke_tests/lib/ensure_global_not_created.js @@ -1,15 +1,15 @@ "use strict"; -var assert = require( "assert" ); +const assert = require( "assert" ); // Ensure the jQuery property on global/window/module.exports/etc. was not // created in a CommonJS environment. // `global` is always checked in addition to passed parameters. -module.exports = function ensureGlobalNotCreated() { - var args = [].slice.call( arguments ).concat( global ); - - args.forEach( function( object ) { +const ensureGlobalNotCreated = ( ...args ) => { + [ ...args, global ].forEach( function( object ) { assert.strictEqual( object.jQuery, undefined, "A jQuery global was created in a CommonJS environment." ); } ); }; + +module.exports = ensureGlobalNotCreated; diff --git a/test/node_smoke_tests/lib/ensure_iterability_es6.js b/test/node_smoke_tests/lib/ensure_iterability_es6.js index 4b30690a5..a948f1996 100644 --- a/test/node_smoke_tests/lib/ensure_iterability_es6.js +++ b/test/node_smoke_tests/lib/ensure_iterability_es6.js @@ -1,23 +1,25 @@ "use strict"; -var assert = require( "assert" ); +const assert = require( "assert" ); -module.exports = function ensureIterability() { - require( "jsdom" ).env( "", function( errors, window ) { - assert.ifError( errors ); +const ensureIterability = () => { + const { JSDOM } = require( "jsdom" ); - var i, - ensureJQuery = require( "./ensure_jquery" ), - jQuery = require( "../../../dist/jquery.js" )( window ), - elem = jQuery( "
" ), - result = ""; + const { window } = new JSDOM( "" ); - ensureJQuery( jQuery ); + let i; + const ensureJQuery = require( "./ensure_jquery" ); + const jQuery = require( "../../../dist/jquery.js" )( window ); + const elem = jQuery( "
" ); + let result = ""; - for ( i of elem ) { - result += i.nodeName; - } + ensureJQuery( jQuery ); - assert.strictEqual( result, "DIVSPANA", "for-of works on jQuery objects" ); - } ); + for ( i of elem ) { + result += i.nodeName; + } + + assert.strictEqual( result, "DIVSPANA", "for-of works on jQuery objects" ); }; + +module.exports = ensureIterability; diff --git a/test/node_smoke_tests/lib/ensure_jquery.js b/test/node_smoke_tests/lib/ensure_jquery.js index 0933a1d33..5b7c064f1 100644 --- a/test/node_smoke_tests/lib/ensure_jquery.js +++ b/test/node_smoke_tests/lib/ensure_jquery.js @@ -1,9 +1,11 @@ "use strict"; -var assert = require( "assert" ); +const assert = require( "assert" ); // Check if the object we got is the jQuery object by invoking a basic API. -module.exports = function ensureJQuery( jQuery ) { +const ensureJQuery = ( jQuery ) => { assert( /^jQuery/.test( jQuery.expando ), "jQuery.expando was not detected, the jQuery bootstrap process has failed" ); }; + +module.exports = ensureJQuery; diff --git a/test/promises_aplus_adapters/deferred.js b/test/promises_aplus_adapters/deferred.js index 31af16655..5e3ffe2d8 100644 --- a/test/promises_aplus_adapters/deferred.js +++ b/test/promises_aplus_adapters/deferred.js @@ -1,20 +1,17 @@ "use strict"; -require( "jsdom" ).env( "", function( errors, window ) { - if ( errors ) { - console.error( errors ); - return; - } +const { JSDOM } = require( "jsdom" ); - var jQuery = require( "../../" )( window ); +const { window } = new JSDOM( "" ); - module.exports.deferred = function() { - var deferred = jQuery.Deferred(); +const jQuery = require( "../../" )( window ); - return { - promise: deferred.promise(), - resolve: deferred.resolve.bind( deferred ), - reject: deferred.reject.bind( deferred ) - }; +module.exports.deferred = () => { + const deferred = jQuery.Deferred(); + + return { + promise: deferred.promise(), + resolve: deferred.resolve.bind( deferred ), + reject: deferred.reject.bind( deferred ) }; -} ); +}; diff --git a/test/promises_aplus_adapters/when.js b/test/promises_aplus_adapters/when.js index adde1a13a..3e945d475 100644 --- a/test/promises_aplus_adapters/when.js +++ b/test/promises_aplus_adapters/when.js @@ -1,49 +1,45 @@ "use strict"; -require( "jsdom" ).env( "", function( errors, window ) { - if ( errors ) { - console.error( errors ); - return; - } +const { JSDOM } = require( "jsdom" ); - var jQuery = require( "../../" )( window ); +const { window } = new JSDOM( "" ); - module.exports.deferred = function() { - var adopted, promised, - obj = { - resolve: function() { - if ( !adopted ) { - adopted = jQuery.when.apply( jQuery, arguments ); - if ( promised ) { - adopted.then( promised.resolve, promised.reject ); - } - } - return adopted; - }, - reject: function( value ) { - if ( !adopted ) { - adopted = jQuery.when( jQuery.Deferred().reject( value ) ); - if ( promised ) { - adopted.then( promised.resolve, promised.reject ); - } - } - return adopted; - }, +const jQuery = require( "../../" )( window ); - // A manually-constructed thenable that works even if calls precede resolve/reject - promise: { - then: function() { - if ( !adopted ) { - if ( !promised ) { - promised = jQuery.Deferred(); - } - return promised.then.apply( promised, arguments ); - } - return adopted.then.apply( adopted, arguments ); - } +module.exports.deferred = () => { + let adopted, promised; + + return { + resolve: function() { + if ( !adopted ) { + adopted = jQuery.when.apply( jQuery, arguments ); + if ( promised ) { + adopted.then( promised.resolve, promised.reject ); } - }; + } + return adopted; + }, + reject: function( value ) { + if ( !adopted ) { + adopted = jQuery.when( jQuery.Deferred().reject( value ) ); + if ( promised ) { + adopted.then( promised.resolve, promised.reject ); + } + } + return adopted; + }, - return obj; + // A manually-constructed thenable that works even if calls precede resolve/reject + promise: { + then: function() { + if ( !adopted ) { + if ( !promised ) { + promised = jQuery.Deferred(); + } + return promised.then.apply( promised, arguments ); + } + return adopted.then.apply( adopted, arguments ); + } + } }; -} ); +}; diff --git a/test/unit/core.js b/test/unit/core.js index 260038300..8205aa242 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -1425,6 +1425,17 @@ QUnit.test( "Iterability of jQuery objects (gh-1693)", function( assert ) { } } ); +testIframe( + "Iterability of jQuery objects with Symbol polyfill (gh-1693)", + "core/jquery-iterability-transpiled.html", + function( assert, jQuery, window, document, testString ) { + assert.expect( 1 ); + + assert.strictEqual( testString, "DIVSPANA", + "for-of works on jQuery objects with Symbol polyfilled" ); + } +); + QUnit[ jQuery.Deferred ? "test" : "skip" ]( "jQuery.readyException (original)", function( assert ) { assert.expect( 1 );