Core: Support non-browser environments

Fixes gh-2133
Fixes gh-2501
Closes gh-2504
Refs gh-1950
Refs gh-1949
Refs gh-2397
Refs gh-1537
Refs gh-2504
Refs 842958e7ae
This commit is contained in:
Michał Gołębiowski 2015-07-28 12:58:44 +02:00
parent 9b04201ff2
commit 04ec688e80
45 changed files with 363 additions and 68 deletions

2
.gitignore vendored
View File

@ -10,3 +10,5 @@
/dist /dist
/node_modules /node_modules
/test/node_smoke_tests/lib/ensure_iterability.js

View File

@ -1,5 +1,6 @@
{ {
"preset": "jquery", "preset": "jquery",
"excludeFiles": [ "external", "src/intro.js", "src/outro.js" ] "excludeFiles": [ "external", "src/intro.js", "src/outro.js",
"test/node_smoke_tests/lib/ensure_iterability.js" ]
} }

View File

@ -9,3 +9,4 @@ test/data/readywaitasset.js
test/data/readywaitloader.js test/data/readywaitloader.js
test/data/support/csp.js test/data/support/csp.js
test/data/support/getComputedSupport.js test/data/support/getComputedSupport.js
test/node_smoke_tests/lib/ensure_iterability.js

View File

@ -34,6 +34,18 @@ module.exports = function( grunt ) {
cache: "build/.sizecache.json" cache: "build/.sizecache.json"
} }
}, },
babel: {
options: {
sourceMap: "inline",
retainLines: true
},
nodeSmokeTests: {
files: {
"test/node_smoke_tests/lib/ensure_iterability.js":
"test/node_smoke_tests/lib/ensure_iterability_es6.js"
}
}
},
build: { build: {
all: { all: {
dest: "dist/jquery.js", dest: "dist/jquery.js",
@ -159,11 +171,9 @@ module.exports = function( grunt ) {
grunt.registerTask( "lint", [ "jsonlint", "jshint", "jscs" ] ); grunt.registerTask( "lint", [ "jsonlint", "jshint", "jscs" ] );
// Only defined for master at this time, but kept for cross-branch consistency grunt.registerTask( "test_fast", [ "node_smoke_tests" ] );
grunt.registerTask( "test_fast", [] );
// gh-2133 TODO: cherry-pick 76df9e4e389d80bff410a9e5f08b848de1d21a2f for promises-aplus-tests grunt.registerTask( "test", [ "test_fast", "promises_aplus_tests" ] );
grunt.registerTask( "test", [ "test_fast"/*, "promises-aplus-tests"*/ ] );
// Short list as a high frequency watch task // Short list as a high frequency watch task
grunt.registerTask( "dev", [ "build:*:*", "lint", "uglify", "remove_map_comment", "dist:*" ] ); grunt.registerTask( "dev", [ "build:*:*", "lint", "uglify", "remove_map_comment", "dist:*" ] );

View File

@ -0,0 +1,27 @@
module.exports = function( grunt ) {
grunt.registerTask( "jsdom", function() {
var current,
pkg = grunt.config( "pkg" ),
version = pkg.jsdomVersions[
// Unfortunately, this is currently the only
// way to tell the difference between Node and iojs
/^v0/.test( process.version ) ? "node" : "iojs"
];
try {
current = require( "jsdom/package.json" ).version;
if ( current === version ) {
return;
}
} catch ( e ) {}
// Use npm on the command-line
// There is no local npm
grunt.util.spawn( {
cmd: "npm",
args: [ "install", "jsdom@" + version ],
opts: { stdio: "inherit" }
}, this.async() );
});
};

View File

@ -0,0 +1,16 @@
/* jshint node: true */
"use strict";
// Run Node with provided parameters: the first one being the Grunt
// done function and latter ones being files to be tested.
// See the comment in ../node_smoke_tests.js for more information.
module.exports = function spawnTest( done ) {
var testPaths = [].slice.call( arguments, 1 ),
spawn = require( "win-spawn" );
spawn( "node", testPaths, { stdio: "inherit" } )
.on( "close", function( code ) {
done( code === 0 );
} );
} ;

View File

@ -0,0 +1,32 @@
module.exports = function( grunt ) {
"use strict";
var fs = require( "fs" ),
spawnTest = require( "./lib/spawn_test.js" ),
testsDir = "./test/node_smoke_tests/",
nodeSmokeTests = [ "jsdom", "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
// on success or another one on failure. Spawning in sub-processes is
// important so that the tests & the main process don't interfere with
// 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$/, "" );
grunt.registerTask( taskName, function() {
spawnTest( this.async(), "test/node_smoke_tests/" + testFilePath );
} );
nodeSmokeTests.push( taskName );
} );
grunt.registerTask( "node_smoke_tests", nodeSmokeTests );
};

View File

@ -0,0 +1,13 @@
module.exports = function( grunt ) {
"use strict";
var spawnTest = require( "./lib/spawn_test.js" );
grunt.registerTask( "promises_aplus_tests", function() {
spawnTest( this.async(),
"./node_modules/.bin/promises-aplus-tests",
"test/promises_aplus_adapter.js"
);
} );
};

View File

@ -26,7 +26,9 @@
"dependencies": {}, "dependencies": {},
"devDependencies": { "devDependencies": {
"commitplease": "2.0.0", "commitplease": "2.0.0",
"core-js": "0.9.17",
"grunt": "0.4.5", "grunt": "0.4.5",
"grunt-babel": "5.0.1",
"grunt-cli": "0.1.13", "grunt-cli": "0.1.13",
"grunt-compare-size": "0.4.0", "grunt-compare-size": "0.4.0",
"grunt-contrib-jshint": "0.11.2", "grunt-contrib-jshint": "0.11.2",
@ -46,7 +48,12 @@
"sinon": "1.12.2", "sinon": "1.12.2",
"sizzle": "2.2.0", "sizzle": "2.2.0",
"strip-json-comments": "1.0.3", "strip-json-comments": "1.0.3",
"testswarm": "1.1.0" "testswarm": "1.1.0",
"win-spawn": "2.0.0"
},
"jsdomVersions": {
"node": "3.1.2",
"iojs": "5.3.0"
}, },
"scripts": { "scripts": {
"build": "npm install && grunt", "build": "npm install && grunt",

View File

@ -16,11 +16,11 @@
// The above browsers are failing a lot of tests in the ES5 // The above browsers are failing a lot of tests in the ES5
// test suite at http://test262.ecmascript.org. // test suite at http://test262.ecmascript.org.
"es3": true, "es3": true,
"browser": true,
"wsh": true,
"globals": { "globals": {
"window": true,
"JSON": false, "JSON": false,
"jQuery": true, "jQuery": true,
"define": false, "define": false,
"module": false, "module": false,

View File

@ -1,13 +1,15 @@
define([ define([
"./core", "./core",
"./var/document",
"./var/rnotwhite", "./var/rnotwhite",
"./ajax/var/location",
"./ajax/var/nonce", "./ajax/var/nonce",
"./ajax/var/rquery", "./ajax/var/rquery",
"./core/init", "./core/init",
"./ajax/parseJSON", "./ajax/parseJSON",
"./ajax/parseXML", "./ajax/parseXML",
"./deferred" "./deferred"
], function( jQuery, rnotwhite, nonce, rquery ) { ], function( jQuery, document, rnotwhite, location, nonce, rquery ) {
var var
rhash = /#.*$/, rhash = /#.*$/,
@ -643,7 +645,7 @@ jQuery.extend({
// Timeout // Timeout
if ( s.async && s.timeout > 0 ) { if ( s.async && s.timeout > 0 ) {
timeoutTimer = setTimeout(function() { timeoutTimer = window.setTimeout(function() {
jqXHR.abort("timeout"); jqXHR.abort("timeout");
}, s.timeout ); }, s.timeout );
} }
@ -677,7 +679,7 @@ jQuery.extend({
// Clear timeout if it exists // Clear timeout if it exists
if ( timeoutTimer ) { if ( timeoutTimer ) {
clearTimeout( timeoutTimer ); window.clearTimeout( timeoutTimer );
} }
// Dereference transport for early garbage collection // Dereference transport for early garbage collection

View File

@ -10,10 +10,10 @@ jQuery.parseXML = function( data ) {
} }
try { try {
if ( window.DOMParser ) { // Standard if ( window.DOMParser ) { // Standard
tmp = new DOMParser(); tmp = new window.DOMParser();
xml = tmp.parseFromString( data, "text/xml" ); xml = tmp.parseFromString( data, "text/xml" );
} else { // IE } else { // IE
xml = new ActiveXObject( "Microsoft.XMLDOM" ); xml = new window.ActiveXObject( "Microsoft.XMLDOM" );
xml.async = "false"; xml.async = "false";
xml.loadXML( data ); xml.loadXML( data );
} }

View File

@ -1,7 +1,8 @@
define([ define([
"../core", "../core",
"../var/document",
"../ajax" "../ajax"
], function( jQuery ) { ], function( jQuery, document ) {
// Install script dataType // Install script dataType
jQuery.ajaxSetup({ jQuery.ajaxSetup({

3
src/ajax/var/location.js Normal file
View File

@ -0,0 +1,3 @@
define(function() {
return window.location;
});

View File

@ -1,8 +1,9 @@
define([ define([
"../core", "../core",
"../var/document",
"../var/support", "../var/support",
"../ajax" "../ajax"
], function( jQuery, support ) { ], function( jQuery, document, support ) {
// Create the request object // Create the request object
// (This is still attached to ajaxSettings for backward compatibility) // (This is still attached to ajaxSettings for backward compatibility)

View File

@ -1,21 +1,25 @@
define([ define([
"../var/document",
"../var/support" "../var/support"
], function( support ) { ], function( document, support ) {
(function() { (function() {
// Minified: var a,b,c,d,e var a,
var input, div, select, a, opt; input = document.createElement( "input" ),
div = document.createElement( "div" ),
select = document.createElement( "select" ),
opt = select.appendChild( document.createElement( "option" ) );
// Setup // Setup
div = document.createElement( "div" ); div.innerHTML = " <link/><a href='/a'>a</a>";
div.innerHTML = " <link/><a href='/a'>a</a><input type='checkbox'/>"; // Support: Windows Web Apps (WWA)
a = div.getElementsByTagName("a")[ 0 ]; // `type` must use .setAttribute for WWA (#14901)
input.setAttribute( "type", "checkbox" );
div.appendChild( input );
a = div.getElementsByTagName( "a" )[ 0 ];
// First batch of tests. // First batch of tests.
select = document.createElement("select");
opt = select.appendChild( document.createElement("option") );
input = div.getElementsByTagName("input")[ 0 ];
a.style.cssText = "top:1px"; a.style.cssText = "top:1px";
// Get the style information from getAttribute // Get the style information from getAttribute

View File

@ -1,5 +1,6 @@
define([ define([
"./var/deletedIds", "./var/deletedIds",
"./var/document",
"./var/slice", "./var/slice",
"./var/concat", "./var/concat",
"./var/push", "./var/push",
@ -8,7 +9,8 @@ define([
"./var/toString", "./var/toString",
"./var/hasOwn", "./var/hasOwn",
"./var/support" "./var/support"
], function( deletedIds, slice, concat, push, indexOf, class2type, toString, hasOwn, support ) { ], function( deletedIds, document, slice, concat, push, indexOf,
class2type, toString, hasOwn, support ) {
var var
version = "@VERSION+compat", version = "@VERSION+compat",

View File

@ -1,16 +1,14 @@
// Initialize a jQuery object // Initialize a jQuery object
define([ define([
"../core", "../core",
"../var/document",
"./var/rsingleTag", "./var/rsingleTag",
"../traversing/findFilter" "../traversing/findFilter"
], function( jQuery, rsingleTag ) { ], function( jQuery, document, rsingleTag ) {
// A central reference to the root jQuery(document) // A central reference to the root jQuery(document)
var rootjQuery, var rootjQuery,
// Use the correct document accordingly with window argument (sandbox)
document = window.document,
// A simple way to check for HTML strings // A simple way to check for HTML strings
// Prioritize #id over <tag> to avoid XSS via location.hash (#9521) // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
// Strict HTML recognition (#11290: must start with <) // Strict HTML recognition (#11290: must start with <)

View File

@ -1,11 +1,12 @@
define([ define([
"../core", "../core",
"../var/document",
"./var/rsingleTag", "./var/rsingleTag",
"../manipulation/buildFragment", "../manipulation/buildFragment",
// This is the only module that needs core/support // This is the only module that needs core/support
"./support" "./support"
], function( jQuery, rsingleTag, buildFragment, support ) { ], function( jQuery, document, rsingleTag, buildFragment, support ) {
// data: string of html // data: string of html
// context (optional): If specified, the fragment will be created in this context, // context (optional): If specified, the fragment will be created in this context,

View File

@ -1,7 +1,8 @@
define([ define([
"../core", "../core",
"../var/document",
"../deferred" "../deferred"
], function( jQuery ) { ], function( jQuery, document ) {
// The deferred used on DOM ready // The deferred used on DOM ready
var readyList; var readyList;
@ -72,7 +73,7 @@ function detach() {
function completed() { function completed() {
// readyState === "complete" is good enough for us to call the dom ready in oldIE // readyState === "complete" is good enough for us to call the dom ready in oldIE
if ( document.addEventListener || if ( document.addEventListener ||
event.type === "load" || window.event.type === "load" ||
document.readyState === "complete" ) { document.readyState === "complete" ) {
detach(); detach();
@ -93,7 +94,7 @@ jQuery.ready.promise = function( obj ) {
// http://bugs.jquery.com/ticket/12282#comment:15 // http://bugs.jquery.com/ticket/12282#comment:15
if ( document.readyState === "complete" ) { if ( document.readyState === "complete" ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready // Handle it asynchronously to allow scripts the opportunity to delay ready
setTimeout( jQuery.ready ); window.setTimeout( jQuery.ready );
// Standards-based browsers support DOMContentLoaded // Standards-based browsers support DOMContentLoaded
} else if ( document.addEventListener ) { } else if ( document.addEventListener ) {

View File

@ -1,6 +1,7 @@
define([ define([
"../var/document",
"../var/support" "../var/support"
], function( support ) { ], function( document, support ) {
// Support: Safari 8+ // Support: Safari 8+
// In Safari 8 documents created via document.implementation.createHTMLDocument // In Safari 8 documents created via document.implementation.createHTMLDocument

View File

@ -3,12 +3,13 @@ define([
"./var/pnum", "./var/pnum",
"./core/access", "./core/access",
"./css/var/rmargin", "./css/var/rmargin",
"./var/document",
"./var/rcssNum", "./var/rcssNum",
"./css/var/rnumnonpx", "./css/var/rnumnonpx",
"./css/var/cssExpand", "./css/var/cssExpand",
"./css/var/isHidden", "./css/var/isHidden",
"./css/curCSS",
"./css/var/swap", "./css/var/swap",
"./css/curCSS",
"./css/adjustCSS", "./css/adjustCSS",
"./css/addGetHookIf", "./css/addGetHookIf",
"./css/support", "./css/support",
@ -17,8 +18,8 @@ define([
"./core/init", "./core/init",
"./core/ready", "./core/ready",
"./selector" // contains "./selector" // contains
], function( jQuery, pnum, access, rmargin, rcssNum, rnumnonpx, cssExpand, isHidden, ], function( jQuery, pnum, access, rmargin, document, rcssNum, rnumnonpx, cssExpand,
curCSS, swap, adjustCSS, addGetHookIf, support, showHide ) { isHidden, swap, curCSS, adjustCSS, addGetHookIf, support, showHide ) {
var var
// BuildExclude // BuildExclude

View File

@ -1,11 +1,12 @@
define([ define([
"exports", "exports",
"../core", "../core",
"../var/documentElement",
"./var/rnumnonpx", "./var/rnumnonpx",
"./var/rmargin", "./var/rmargin",
"./support", "./support",
"../selector" // contains "../selector" // contains
], function( exports, jQuery, rnumnonpx, rmargin, support ) { ], function( exports, jQuery, documentElement, rnumnonpx, rmargin, support ) {
var getStyles, curCSS, var getStyles, curCSS,
rposition = /^(top|right|bottom|left)$/; rposition = /^(top|right|bottom|left)$/;
@ -68,7 +69,7 @@ if ( window.getComputedStyle ) {
ret : ret :
ret + ""; ret + "";
}; };
} else if ( document.documentElement.currentStyle ) { } else if ( documentElement.currentStyle ) {
getStyles = function( elem ) { getStyles = function( elem ) {
return elem.currentStyle; return elem.currentStyle;
}; };

View File

@ -1,32 +1,30 @@
define([ define([
"../core", "../core",
"../var/document",
"../var/documentElement",
"../var/support" "../var/support"
], function( jQuery, support ) { ], function( jQuery, document, documentElement, support ) {
(function() { (function() {
var div, container, style, a, pixelPositionVal, boxSizingReliableVal, gBCRDimensionsVal, var pixelPositionVal, boxSizingReliableVal, gBCRDimensionsVal,
pixelMarginRightVal, reliableHiddenOffsetsVal, reliableMarginRightVal; pixelMarginRightVal, reliableHiddenOffsetsVal, reliableMarginRightVal,
container = document.createElement( "div" ),
// Setup
div = document.createElement( "div" ); div = document.createElement( "div" );
div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
a = div.getElementsByTagName( "a" )[ 0 ];
style = a && a.style;
// Finish early in limited (non-browser) environments // Finish early in limited (non-browser) environments
if ( !style ) { if ( !div.style ) {
return; return;
} }
style.cssText = "float:left;opacity:.5"; div.style.cssText = "float:left;opacity:.5";
// Support: IE<9 // Support: IE<9
// Make sure that element opacity exists (as opposed to filter) // Make sure that element opacity exists (as opposed to filter)
support.opacity = style.opacity === "0.5"; support.opacity = div.style.opacity === "0.5";
// Verify style float existence // Verify style float existence
// (IE uses styleFloat instead of cssFloat) // (IE uses styleFloat instead of cssFloat)
support.cssFloat = !!style.cssFloat; support.cssFloat = !!div.style.cssFloat;
div.style.backgroundClip = "content-box"; div.style.backgroundClip = "content-box";
div.cloneNode( true ).style.backgroundClip = ""; div.cloneNode( true ).style.backgroundClip = "";

View File

@ -1,6 +1,7 @@
define([ define([
"../var/document",
"../var/support" "../var/support"
], function( support ) { ], function( document, support ) {
(function() { (function() {
var div = document.createElement( "div" ); var div = document.createElement( "div" );

View File

@ -176,7 +176,7 @@ jQuery.extend({
if ( depth ) { if ( depth ) {
process(); process();
} else { } else {
setTimeout( process ); window.setTimeout( process );
} }
}; };
} }

10
src/effects.js vendored
View File

@ -1,5 +1,6 @@
define([ define([
"./core", "./core",
"./var/document",
"./var/rcssNum", "./var/rcssNum",
"./var/rnotwhite", "./var/rnotwhite",
"./css/var/cssExpand", "./css/var/cssExpand",
@ -15,7 +16,8 @@ define([
"./manipulation", "./manipulation",
"./css", "./css",
"./effects/Tween" "./effects/Tween"
], function( jQuery, rcssNum, rnotwhite, cssExpand, isHidden, swap, adjustCSS, showHide ) { ], function( jQuery, document, rcssNum, rnotwhite, cssExpand, isHidden, swap,
adjustCSS, showHide ) {
var var
fxNow, timerId, fxNow, timerId,
@ -31,7 +33,7 @@ function raf() {
// Animations created synchronously will run synchronously // Animations created synchronously will run synchronously
function createFxNow() { function createFxNow() {
setTimeout(function() { window.setTimeout(function() {
fxNow = undefined; fxNow = undefined;
}); });
return ( fxNow = jQuery.now() ); return ( fxNow = jQuery.now() );
@ -640,14 +642,14 @@ jQuery.fx.interval = 13;
jQuery.fx.start = function() { jQuery.fx.start = function() {
timerId = window.requestAnimationFrame ? timerId = window.requestAnimationFrame ?
window.requestAnimationFrame( raf ) : window.requestAnimationFrame( raf ) :
setInterval( jQuery.fx.tick, jQuery.fx.interval ); window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
}; };
jQuery.fx.stop = function() { jQuery.fx.stop = function() {
if ( window.cancelAnimationFrame ) { if ( window.cancelAnimationFrame ) {
window.cancelAnimationFrame( timerId ); window.cancelAnimationFrame( timerId );
} else { } else {
clearInterval( timerId ); window.clearInterval( timerId );
} }
timerId = null; timerId = null;

View File

@ -1,5 +1,6 @@
define([ define([
"./core", "./core",
"./var/document",
"./var/rnotwhite", "./var/rnotwhite",
"./var/hasOwn", "./var/hasOwn",
"./var/slice", "./var/slice",
@ -8,7 +9,7 @@ define([
"./core/init", "./core/init",
"./data", "./data",
"./selector" "./selector"
], function( jQuery, rnotwhite, hasOwn, slice, support ) { ], function( jQuery, document, rnotwhite, hasOwn, slice, support ) {
var rformElems = /^(?:input|select|textarea)$/i, var rformElems = /^(?:input|select|textarea)$/i,
rkeyEvent = /^key/, rkeyEvent = /^key/,

View File

@ -1,6 +1,7 @@
define([ define([
"../var/document",
"../var/support" "../var/support"
], function( support ) { ], function( document, support ) {
(function() { (function() {
var i, eventName, var i, eventName,

View File

@ -1,5 +1,6 @@
define([ define([
"./core", "./core",
"./var/document",
"./var/concat", "./var/concat",
"./var/push", "./var/push",
"./var/deletedIds", "./var/deletedIds",
@ -22,7 +23,7 @@ define([
"./traversing", "./traversing",
"./selector", "./selector",
"./event" "./event"
], function( jQuery, concat, push, deletedIds, access, ], function( jQuery, document, concat, push, deletedIds, access,
rcheckableType, rtagName, rscriptType, rleadingWhitespace, nodeNames, rcheckableType, rtagName, rscriptType, rleadingWhitespace, nodeNames,
createSafeFragment, wrapMap, getAll, setGlobalEval, createSafeFragment, wrapMap, getAll, setGlobalEval,
buildFragment, support ) { buildFragment, support ) {

View File

@ -1,11 +1,13 @@
define([ define([
"../core", "../core",
"../var/document",
"../var/support" "../var/support"
], function( jQuery, support ) { ], function( jQuery, document, support ) {
(function() { (function() {
var div = document.createElement( "div" ), var div = document.createElement( "div" ),
fragment = document.createDocumentFragment(); fragment = document.createDocumentFragment(),
input = document.createElement( "input" );
// Setup // Setup
div.innerHTML = " <link/><a href='/a'></a>"; div.innerHTML = " <link/><a href='/a'></a>";
@ -29,7 +31,13 @@ define([
// #11217 - WebKit loses check when the name is after the checked attribute // #11217 - WebKit loses check when the name is after the checked attribute
fragment.appendChild( div ); fragment.appendChild( div );
div.innerHTML = "<input type='radio' checked='checked' name='t'/>"; // Support: Windows Web Apps (WWA)
// `name` and `type` must use .setAttribute for WWA (#14901)
input.setAttribute( "type", "radio" );
input.setAttribute( "checked", "checked" );
input.setAttribute( "name", "t" );
div.appendChild( input );
// Support: Android<4.2 // Support: Android<4.2
// Older WebKit doesn't clone checked state correctly in fragments // Older WebKit doesn't clone checked state correctly in fragments

View File

@ -1,6 +1,8 @@
define([ define([
"./core", "./core",
"./core/access", "./core/access",
"./var/document",
"./var/documentElement",
"./css/var/rnumnonpx", "./css/var/rnumnonpx",
"./css/curCSS", "./css/curCSS",
"./css/addGetHookIf", "./css/addGetHookIf",
@ -9,7 +11,7 @@ define([
"./core/init", "./core/init",
"./css", "./css",
"./selector" // contains "./selector" // contains
], function( jQuery, access, rnumnonpx, curCSS, addGetHookIf, support ) { ], function( jQuery, access, document, documentElement, rnumnonpx, curCSS, addGetHookIf, support ) {
// BuildExclude // BuildExclude
curCSS = curCSS.curCSS; curCSS = curCSS.curCSS;

View File

@ -11,9 +11,9 @@ jQuery.fn.delay = function( time, type ) {
type = type || "fx"; type = type || "fx";
return this.queue( type, function( next, hooks ) { return this.queue( type, function( next, hooks ) {
var timeout = setTimeout( next, time ); var timeout = window.setTimeout( next, time );
hooks.stop = function() { hooks.stop = function() {
clearTimeout( timeout ); window.clearTimeout( timeout );
}; };
}); });
}; };

3
src/var/document.js Normal file
View File

@ -0,0 +1,3 @@
define(function() {
return window.document;
});

View File

@ -0,0 +1,5 @@
define([
"./document"
], function( document ) {
return document.documentElement;
});

View File

@ -0,0 +1,14 @@
{
"boss": true,
"curly": true,
"eqeqeq": true,
"eqnull": true,
"expr": true,
"immed": true,
"noarg": true,
"quotmark": "double",
"undef": true,
"unused": true,
"node": true
}

View File

@ -0,0 +1,11 @@
"use strict";
var assert = require( "assert" ),
ensureGlobalNotCreated = require( "./lib/ensure_global_not_created" ),
jQueryFactory = require( "../../dist/jquery.js" );
assert.throws( function () {
jQueryFactory( {} );
}, /jQuery requires a window with a document/ );
ensureGlobalNotCreated( module.exports );

View File

@ -0,0 +1,14 @@
"use strict";
var assert = require( "assert" );
require( "jsdom" ).env( "", function( errors, window ) {
assert.ifError( errors );
var ensureJQuery = require( "./lib/ensure_jquery" ),
ensureGlobalNotCreated = require( "./lib/ensure_global_not_created" ),
jQuery = require( "../../dist/jquery.js" )( window );
ensureJQuery( jQuery );
ensureGlobalNotCreated( module.exports );
} );

View File

@ -0,0 +1,17 @@
"use strict";
var assert = require( "assert" );
require( "jsdom" ).env( "", function( errors, window ) {
assert.ifError( errors );
// 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" );
ensureJQuery( jQuery );
ensureGlobalNotCreated( module.exports, window );
} );

View File

@ -0,0 +1,8 @@
"use strict";
if ( typeof Symbol === "undefined" ) {
console.log( "Symbols not supported, skipping the test..." );
process.exit();
}
require( "./lib/ensure_iterability_es6" )();

View File

@ -0,0 +1,13 @@
/* jshint esnext: true */
"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" )();

View File

@ -0,0 +1,15 @@
"use strict";
var 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 ) {
assert.strictEqual( object.jQuery, undefined,
"A jQuery global was created in a CommonJS environment." );
} );
};

View File

@ -0,0 +1,25 @@
/* jshint esnext: true */
"use strict";
var assert = require( "assert" );
module.exports = function ensureIterability() {
require( "jsdom" ).env( "", function( errors, window ) {
assert.ifError( errors );
var i,
ensureJQuery = require( "./ensure_jquery" ),
jQuery = require( "../../../dist/jquery.js" )( window ),
elem = jQuery( "<div></div><span></span><a></a>" ),
result = "";
ensureJQuery( jQuery );
for ( i of elem ) {
result += i.nodeName;
}
assert.strictEqual( result, "DIVSPANA", "for-of doesn't work on jQuery objects" );
} );
};

View File

@ -0,0 +1,9 @@
"use strict";
var assert = require( "assert" );
// Check if the object we got is the jQuery object by invoking a basic API.
module.exports = function ensureJQuery( jQuery ) {
assert( /^jQuery/.test( jQuery.expando ),
"jQuery.expando was not detected, the jQuery bootstrap process has failed" );
};

View File

@ -0,0 +1,22 @@
/* jshint node: true */
"use strict";
require( "jsdom" ).env( "", function ( errors, window ) {
if ( errors ) {
console.error( errors );
return;
}
var jQuery = require( ".." )( window );
exports.deferred = function () {
var deferred = jQuery.Deferred();
return {
promise: deferred.promise(),
resolve: deferred.resolve.bind( deferred ),
reject: deferred.reject.bind( deferred )
};
};
} );