From f9af896bb8f4cb37b22d508443174c8edf40fc54 Mon Sep 17 00:00:00 2001 From: Richard Gibson Date: Tue, 8 Sep 2015 15:56:08 -0400 Subject: [PATCH 001/927] Tests: Add dummy modules when running basic tests Without this, other modules don't appear in the QUnit module picker. Ref 855b0c8c288533948b257925a8906f7da3449eed Closes gh-2582 --- test/data/testinit.js | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/test/data/testinit.js b/test/data/testinit.js index fb99badfc2..68de5e3361 100644 --- a/test/data/testinit.js +++ b/test/data/testinit.js @@ -278,20 +278,14 @@ this.loadTests = function() { // Get testSubproject from testrunner first require( [ "data/testrunner.js" ], function() { - var tests = [] - .concat( [ - + var i = 0, + tests = [ // A special module with basic tests, meant for // not fully supported environments like Android 2.3, // jsdom or PhantomJS. We run it everywhere, though, // to make sure tests are not broken. - // - // Support: Android 2.3 only - // When loading basic tests don't load any others to not - // overload Android 2.3. - "unit/basic.js" - ] ) - .concat( basicTests ? [] : [ + "unit/basic.js", + "unit/core.js", "unit/callbacks.js", "unit/deferred.js", @@ -312,14 +306,23 @@ this.loadTests = function() { "unit/dimensions.js", "unit/animation.js", "unit/tween.js" - ] ); + ]; // Ensure load order (to preserve test numbers) ( function loadDep() { - var dep = tests.shift(); + var dep = tests[ i++ ]; if ( dep ) { - require( [ dep ], loadDep ); + if ( !basicTests || i === 1 ) { + require( [ dep ], loadDep ); + + // Support: Android 2.3 only + // When running basic tests, replace other modules with dummies to avoid overloading + // impaired clients. + } else { + QUnit.module( dep.replace( /^.*\/|\.js$/g, "" ) ); + loadDep(); + } } else { QUnit.load(); From f23a64d745759d358d423ba0557e8f74d65f76cc Mon Sep 17 00:00:00 2001 From: Richard Gibson Date: Tue, 8 Sep 2015 16:03:10 -0400 Subject: [PATCH 002/927] Tests: Use QUnit URL parameter parsing --- test/data/testinit.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/test/data/testinit.js b/test/data/testinit.js index 68de5e3361..903bc9c345 100644 --- a/test/data/testinit.js +++ b/test/data/testinit.js @@ -269,12 +269,9 @@ this.iframeCallback = undefined; // Tests are always loaded async QUnit.config.autostart = false; this.loadTests = function() { - var loadSwarm, - url = window.location.search, - basicTests = jQuery.inArray( "module=basic", url.substring( 1 ).split( "&" ) ) > -1; - - url = decodeURIComponent( url.slice( url.indexOf( "swarmURL=" ) + "swarmURL=".length ) ); - loadSwarm = url && url.indexOf( "http" ) === 0; + // Leverage QUnit URL parsing to detect testSwarm environment and "basic" testing mode + var loadSwarm = ( QUnit.urlParams[ "swarmURL" ] + "" ).indexOf( "http" ) === 0, + basicTests = ( QUnit.urlParams[ "module" ] + "" ) === "basic"; // Get testSubproject from testrunner first require( [ "data/testrunner.js" ], function() { From 735dea34fb0ae625542d51eae3f4e7316e403eaa Mon Sep 17 00:00:00 2001 From: Richard Kraaijenhagen Date: Sun, 20 Sep 2015 14:41:37 +0200 Subject: [PATCH 003/927] Docs: "npm run build" was missing from the contributing guides Close gh-2537 --- CONTRIBUTING.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 97a7335125..3f6547c568 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -95,6 +95,12 @@ Get in the habit of pulling in the "upstream" master to stay up to date as jQuer $ git pull upstream master ``` +Run the build script + +```bash +$ npm run build +``` + Run the Grunt tools: ```bash From b078a62013782c7424a4a61a240c23c4c0b42614 Mon Sep 17 00:00:00 2001 From: Oleg Gaidarenko Date: Thu, 10 Sep 2015 13:40:00 +0300 Subject: [PATCH 004/927] Ajax: Mitigate possible XSS vulnerability Proposed by @jaubourg Fixes gh-2432 Closes gh-2588 --- src/ajax.js | 2 +- src/ajax/script.js | 7 +++++++ test/unit/ajax.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/ajax.js b/src/ajax.js index 32b6a1be26..157934ef1b 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -221,7 +221,7 @@ function ajaxConvert( s, response, jqXHR, isSuccess ) { if ( current ) { - // There's only work to do if current dataType is non-auto + // There's only work to do if current dataType is non-auto if ( current === "*" ) { current = prev; diff --git a/src/ajax/script.js b/src/ajax/script.js index 60b1fb6b00..0ec27b4a53 100644 --- a/src/ajax/script.js +++ b/src/ajax/script.js @@ -4,6 +4,13 @@ define( [ "../ajax" ], function( jQuery, document ) { +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + // Install script dataType jQuery.ajaxSetup( { accepts: { diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 14fe0bed68..6479587736 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -71,6 +71,54 @@ QUnit.module( "ajax", { }; } ); + ajaxTest( "jQuery.ajax() - do not execute js (crossOrigin)", 2, function( assert ) { + return { + create: function( options ) { + options.crossDomain = true; + return jQuery.ajax( url( "data/script.php?header=ecma" ), options ); + }, + success: function() { + assert.ok( true, "success" ); + }, + complete: function() { + assert.ok( true, "complete" ); + } + }; + } ); + + ajaxTest( "jQuery.ajax() - execute js for crossOrigin when dataType option is provided", 3, + function( assert ) { + return { + create: function( options ) { + options.crossDomain = true; + options.dataType = "script"; + return jQuery.ajax( url( "data/script.php?header=ecma" ), options ); + }, + success: function() { + assert.ok( true, "success" ); + }, + complete: function() { + assert.ok( true, "complete" ); + } + }; + } + ); + + ajaxTest( "jQuery.ajax() - do not execute js (crossOrigin)", 2, function( assert ) { + return { + create: function( options ) { + options.crossDomain = true; + return jQuery.ajax( url( "data/script.php" ), options ); + }, + success: function() { + assert.ok( true, "success" ); + }, + complete: function() { + assert.ok( true, "complete" ); + } + }; + } ); + ajaxTest( "jQuery.ajax() - success callbacks (late binding)", 8, function( assert ) { return { setup: addGlobalEvents( "ajaxStart ajaxStop ajaxSend ajaxComplete ajaxSuccess", assert ), From 9748e436ad80d6a2e1661ba4cf8d7391ed87c3ad Mon Sep 17 00:00:00 2001 From: Connor Atherton Date: Fri, 25 Sep 2015 12:02:53 -0700 Subject: [PATCH 005/927] Tests: Add .extend test for defined accessor properties Closes gh-2615 --- test/unit/core.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/unit/core.js b/test/unit/core.js index a899e13656..407ae7e2ca 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -1080,6 +1080,29 @@ QUnit.test( "jQuery.extend(Object, Object)", function( assert ) { assert.deepEqual( options2, options2Copy, "Check if not modified: options2 must not be modified" ); } ); +QUnit.test( "jQuery.extend(Object, Object {created with \"defineProperties\"})", function( assert ) { + assert.expect( 2 ); + + var definedObj = Object.defineProperties({}, { + "enumerableProp": { + get: function () { + return true; + }, + enumerable: true + }, + "nonenumerableProp": { + get: function () { + return true; + } + } + }), + accessorObj = {}; + + jQuery.extend( accessorObj, definedObj ); + assert.equal( accessorObj.enumerableProp, true, "Verify that getters are transferred" ); + assert.equal( accessorObj.nonenumerableProp, undefined, "Verify that non-enumerable getters are ignored" ); +} ); + QUnit.test( "jQuery.extend(true,{},{a:[], o:{}}); deep copy with array, followed by object", function( assert ) { assert.expect( 2 ); From ee0854f85bd686b55757e8854a10480f23c928da Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Thu, 1 Oct 2015 16:03:10 -0400 Subject: [PATCH 006/927] Event: Move .bind() and .delegate() to deprecated Fixes gh-2288 Closes gh-2624 --- src/deprecated.js | 22 ++++++++++++++++++++++ src/event/alias.js | 18 ------------------ test/data/testinit.js | 1 + test/unit/deprecated.js | 40 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 18 deletions(-) diff --git a/src/deprecated.js b/src/deprecated.js index dfb13e4ae2..bc75f098ac 100644 --- a/src/deprecated.js +++ b/src/deprecated.js @@ -1,2 +1,24 @@ define( function() { + +jQuery.fn.extend( { + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length === 1 ? + this.off( selector, "**" ) : + this.off( types, selector || "**", fn ); + } +} ); + } ); diff --git a/src/event/alias.js b/src/event/alias.js index d2bdc5bb80..75467353cc 100644 --- a/src/event/alias.js +++ b/src/event/alias.js @@ -19,24 +19,6 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + jQuery.fn.extend( { hover: function( fnOver, fnOut ) { return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - }, - - bind: function( types, data, fn ) { - return this.on( types, null, data, fn ); - }, - unbind: function( types, fn ) { - return this.off( types, null, fn ); - }, - - delegate: function( selector, types, data, fn ) { - return this.on( types, selector, data, fn ); - }, - undelegate: function( selector, types, fn ) { - - // ( namespace ) or ( selector, types [, fn] ) - return arguments.length === 1 ? - this.off( selector, "**" ) : - this.off( types, selector || "**", fn ); } } ); diff --git a/test/data/testinit.js b/test/data/testinit.js index 903bc9c345..1815d8f7b7 100644 --- a/test/data/testinit.js +++ b/test/data/testinit.js @@ -286,6 +286,7 @@ this.loadTests = function() { "unit/core.js", "unit/callbacks.js", "unit/deferred.js", + "unit/deprecated.js", "unit/support.js", "unit/data.js", "unit/queue.js", diff --git a/test/unit/deprecated.js b/test/unit/deprecated.js index 52c137dc35..797290f3bf 100644 --- a/test/unit/deprecated.js +++ b/test/unit/deprecated.js @@ -1,2 +1,42 @@ QUnit.module( "deprecated", { teardown: moduleTeardown } ); + +QUnit.test( "bind/unbind", function( assert ) { + assert.expect( 4 ); + + var markup = jQuery( + "

b

" + ); + + markup + .find( "b" ) + .bind( "click", { bindData: 19 }, function( e, trig ) { + assert.equal( e.type, "click", "correct event type" ); + assert.equal( e.data.bindData, 19, "correct trigger data" ); + assert.equal( trig, 42, "correct bind data" ); + assert.equal( e.target.nodeName.toLowerCase(), "b" , "correct element" ); + } ) + .trigger( "click", [ 42 ] ) + .unbind( "click" ) + .trigger( "click" ) + .remove(); +} ); + +QUnit.test( "delegate/undelegate", function( assert ) { + assert.expect( 2 ); + + var markup = jQuery( + "

b

" + ); + + markup + .delegate( "b", "click", function( e ) { + assert.equal( e.type, "click", "correct event type" ); + assert.equal( e.target.nodeName.toLowerCase(), "b" , "correct element" ); + } ) + .find( "b" ) + .trigger( "click" ) + .end() + .undelegate( "b", "click" ) + .remove(); +} ); \ No newline at end of file From 03eaadb131df925d1072afd2496ee3b41d2f1fc6 Mon Sep 17 00:00:00 2001 From: Gary Ye Date: Fri, 18 Sep 2015 09:59:48 -0700 Subject: [PATCH 007/927] Tests:Docs: Fix various typos * Changes "baar" to "bar" when used with "foo" in readme and comments of js files * mousenter -> mouseenter Thanks @garysye, @KimTaehee Closes gh-2613 Closes gh-2601 --- README.md | 2 +- src/event.js | 2 +- test/data/jquery-1.9.1.js | 2 +- test/data/testinit.js | 4 ++-- test/unit/event.js | 2 +- test/unit/selector.js | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 59728b0f76..de6e1bb826 100644 --- a/README.md +++ b/README.md @@ -302,7 +302,7 @@ t( testName, selector, [ "array", "of", "ids" ] ); Example: ```js -t("Check for something", "//[a]", ["foo", "baar"]); +t("Check for something", "//[a]", ["foo", "bar"]); ``` diff --git a/src/event.js b/src/event.js index 233fd43481..97dbf57b2c 100644 --- a/src/event.js +++ b/src/event.js @@ -810,7 +810,7 @@ jQuery.each( { related = event.relatedTarget, handleObj = event.handleObj; - // For mousenter/leave call the handler if related is outside the target. + // For mouseenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { event.type = handleObj.origType; diff --git a/test/data/jquery-1.9.1.js b/test/data/jquery-1.9.1.js index 80c97a226a..81bdf19f32 100644 --- a/test/data/jquery-1.9.1.js +++ b/test/data/jquery-1.9.1.js @@ -3525,7 +3525,7 @@ jQuery.each( { related = event.relatedTarget, handleObj = event.handleObj; - // For mousenter/leave call the handler if related is outside the target. + // For mouseenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { event.type = handleObj.origType; diff --git a/test/data/testinit.js b/test/data/testinit.js index 1815d8f7b7..e88df966f4 100644 --- a/test/data/testinit.js +++ b/test/data/testinit.js @@ -35,8 +35,8 @@ this.q = function() { * @param {String} a - Assertion name * @param {String} b - Sizzle selector * @param {String} c - Array of ids to construct what is expected - * @example t("Check for something", "//[a]", ["foo", "baar"]); - * @result returns true if "//[a]" return two elements with the IDs 'foo' and 'baar' + * @example t("Check for something", "//[a]", ["foo", "bar"]); + * @result returns true if "//[a]" return two elements with the IDs 'foo' and 'bar' */ QUnit.assert.t = function( a, b, c ) { var f = jQuery( b ).get(), diff --git a/test/unit/event.js b/test/unit/event.js index 797078361d..e66b3e6379 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -879,7 +879,7 @@ QUnit.test( "withinElement implemented with jQuery.contains()", function( assert } ).trigger( "mouseenter" ); - jQuery( "#jc-inner" ).trigger( "mousenter" ); + jQuery( "#jc-inner" ).trigger( "mouseenter" ); jQuery( "#jc-outer" ).off( "mouseenter mouseleave" ).remove(); jQuery( "#jc-inner" ).remove(); diff --git a/test/unit/selector.js b/test/unit/selector.js index 31ce852a68..a1f6abd036 100644 --- a/test/unit/selector.js +++ b/test/unit/selector.js @@ -293,7 +293,7 @@ testIframe( /** * Asserts that a select matches the given IDs - * @example t("Check for something", "//[a]", ["foo", "baar"]); + * @example t("Check for something", "//[a]", ["foo", "bar"]); * @param {String} a - Assertion name * @param {String} b - Sizzle selector * @param {Array} c - Array of ids to construct what is expected From 0c34e688439713725d4215c63bc4cf876d8d0423 Mon Sep 17 00:00:00 2001 From: Martin Naumann Date: Mon, 12 Oct 2015 16:02:25 +0200 Subject: [PATCH 008/927] Build: Fixed issue with base path that contain 'var' Remove the cwd from the paths, so the regex doesn't kick in on "var" Fixes gh-2450 Closes gh-2641 --- build/tasks/build.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/build.js b/build/tasks/build.js index 750bac5b75..74fa47fde4 100644 --- a/build/tasks/build.js +++ b/build/tasks/build.js @@ -53,7 +53,7 @@ module.exports = function( grunt ) { var amdName; // Convert var modules - if ( /.\/var\//.test( path ) ) { + if ( /.\/var\//.test( path.replace( process.cwd(), "" ) ) ) { contents = contents .replace( /define\([\w\W]*?return/, "var " + ( /var\/([\w-]+)/.exec( name )[ 1 ] ) + " =" ) .replace( rdefineEnd, "" ); From d92310050ca7bf0b33825d64e052f9a8809c3e9e Mon Sep 17 00:00:00 2001 From: Oleg Gaidarenko Date: Mon, 12 Oct 2015 18:37:04 +0300 Subject: [PATCH 009/927] Event: fix incorrect test Which was revealed by 03eaadb131df925d1072afd2496ee3b41d2f1fc6 commit, also do not try to fix typos in data/jquery version --- test/data/jquery-1.9.1.js | 2 +- test/unit/event.js | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/test/data/jquery-1.9.1.js b/test/data/jquery-1.9.1.js index 81bdf19f32..80c97a226a 100644 --- a/test/data/jquery-1.9.1.js +++ b/test/data/jquery-1.9.1.js @@ -3525,7 +3525,7 @@ jQuery.each( { related = event.relatedTarget, handleObj = event.handleObj; - // For mouseenter/leave call the handler if related is outside the target. + // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { event.type = handleObj.origType; diff --git a/test/unit/event.js b/test/unit/event.js index e66b3e6379..ebaf42f6b6 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -874,16 +874,10 @@ QUnit.test( "withinElement implemented with jQuery.contains()", function( assert jQuery( "#qunit-fixture" ).append( "
" ); jQuery( "#jc-outer" ).on( "mouseenter mouseleave", function( event ) { - assert.equal( this.id, "jc-outer", this.id + " " + event.type ); - - } ).trigger( "mouseenter" ); + } ); jQuery( "#jc-inner" ).trigger( "mouseenter" ); - - jQuery( "#jc-outer" ).off( "mouseenter mouseleave" ).remove(); - jQuery( "#jc-inner" ).remove(); - } ); QUnit.test( "mouseenter, mouseleave don't catch exceptions", function( assert ) { From cb087ce41daa5db4c8db10e586bdc141f953d93d Mon Sep 17 00:00:00 2001 From: Oleg Gaidarenko Date: Mon, 12 Oct 2015 20:34:16 +0300 Subject: [PATCH 010/927] Ajax: correct indentation As noted by @arthurvr Follow-up for b078a62013782c7424a4a61a240c23c4c0b42614 --- src/ajax/script.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ajax/script.js b/src/ajax/script.js index 0ec27b4a53..3978ba46cd 100644 --- a/src/ajax/script.js +++ b/src/ajax/script.js @@ -6,9 +6,9 @@ define( [ // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } + if ( s.crossDomain ) { + s.contents.script = false; + } } ); // Install script dataType From 239169bb2ede6ea6287d82d1d13b0c354f451749 Mon Sep 17 00:00:00 2001 From: Oleg Gaidarenko Date: Mon, 12 Oct 2015 19:56:46 +0300 Subject: [PATCH 011/927] Ajax: improve content-type detection Fixes gh-2584 Closes gh-2643 --- src/ajax.js | 6 +- src/ajax/script.js | 2 +- test/data/ajax/content-type.php | 5 ++ test/unit/ajax.js | 104 +++++++++++++++++++++++++++++++- 4 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 test/data/ajax/content-type.php diff --git a/src/ajax.js b/src/ajax.js index 157934ef1b..efc4136505 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -322,9 +322,9 @@ jQuery.extend( { }, contents: { - xml: /xml/, - html: /html/, - json: /json/ + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ }, responseFields: { diff --git a/src/ajax/script.js b/src/ajax/script.js index 3978ba46cd..485ba397be 100644 --- a/src/ajax/script.js +++ b/src/ajax/script.js @@ -18,7 +18,7 @@ jQuery.ajaxSetup( { "application/ecmascript, application/x-ecmascript" }, contents: { - script: /(?:java|ecma)script/ + script: /\b(?:java|ecma)script\b/ }, converters: { "text script": function( text ) { diff --git a/test/data/ajax/content-type.php b/test/data/ajax/content-type.php new file mode 100644 index 0000000000..162e3636d7 --- /dev/null +++ b/test/data/ajax/content-type.php @@ -0,0 +1,5 @@ + diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 6479587736..ec3e076135 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -1794,7 +1794,109 @@ QUnit.module( "ajax", { } ); -// //----------- jQuery.ajaxPrefilter() + ajaxTest( "gh-2587 - when content-type not xml, but looks like one", 1, function( assert ) { + return { + url: url( "data/ajax/content-type.php" ), + data: { + "content-type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "response": "" + }, + success: function( result ) { + assert.strictEqual( + typeof result, + "string", + "Should handle it as a string, not xml" + ); + } + }; + } ); + + ajaxTest( "gh-2587 - when content-type not xml, but looks like one", 1, function( assert ) { + return { + url: url( "data/ajax/content-type.php" ), + data: { + "content-type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "response": "" + }, + success: function( result ) { + assert.strictEqual( + typeof result, + "string", + "Should handle it as a string, not xml" + ); + } + }; + } ); + + ajaxTest( "gh-2587 - when content-type not json, but looks like one", 1, function( assert ) { + return { + url: url( "data/ajax/content-type.php" ), + data: { + "content-type": "test/jsontest", + "response": JSON.stringify({test: "test"}) + }, + success: function( result ) { + assert.strictEqual( + typeof result, + "string", + "Should handle it as a string, not json" + ); + } + }; + } ); + + ajaxTest( "gh-2587 - when content-type not html, but looks like one", 1, function( assert ) { + return { + url: url( "data/ajax/content-type.php" ), + data: { + "content-type": "test/htmltest", + "response": "

test

" + }, + success: function( result ) { + assert.strictEqual( + typeof result, + "string", + "Should handle it as a string, not html" + ); + } + }; + } ); + + ajaxTest( "gh-2587 - when content-type not javascript, but looks like one", 1, function( assert ) { + return { + url: url( "data/ajax/content-type.php" ), + data: { + "content-type": "test/testjavascript", + "response": "alert(1)" + }, + success: function( result ) { + assert.strictEqual( + typeof result, + "string", + "Should handle it as a string, not javascript" + ); + } + }; + } ); + + ajaxTest( "gh-2587 - when content-type not ecmascript, but looks like one", 1, function( assert ) { + return { + url: url( "data/ajax/content-type.php" ), + data: { + "content-type": "test/testjavascript", + "response": "alert(1)" + }, + success: function( result ) { + assert.strictEqual( + typeof result, + "string", + "Should handle it as a string, not ecmascript" + ); + } + }; + } ); + +//----------- jQuery.ajaxPrefilter() ajaxTest( "jQuery.ajaxPrefilter() - abort", 1, function( assert ) { return { From 39cdb8c9aa0fde68f733553ba050a2ba9d86474c Mon Sep 17 00:00:00 2001 From: Oleg Gaidarenko Date: Tue, 13 Oct 2015 00:00:38 +0300 Subject: [PATCH 012/927] Ajax: don't expect cross-origin tests run in envs which not support it Follow-up to b078a62013782c7424a4a61a240c23c4c0b42614 --- test/unit/ajax.js | 51 +++++++++++++++++++---------------------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/test/unit/ajax.js b/test/unit/ajax.js index ec3e076135..d39b86a0f7 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -71,21 +71,6 @@ QUnit.module( "ajax", { }; } ); - ajaxTest( "jQuery.ajax() - do not execute js (crossOrigin)", 2, function( assert ) { - return { - create: function( options ) { - options.crossDomain = true; - return jQuery.ajax( url( "data/script.php?header=ecma" ), options ); - }, - success: function() { - assert.ok( true, "success" ); - }, - complete: function() { - assert.ok( true, "complete" ); - } - }; - } ); - ajaxTest( "jQuery.ajax() - execute js for crossOrigin when dataType option is provided", 3, function( assert ) { return { @@ -113,6 +98,11 @@ QUnit.module( "ajax", { success: function() { assert.ok( true, "success" ); }, + fail: function() { + if (jQuery.support.cors === false) { + assert.ok( true, "fail" ); + } + }, complete: function() { assert.ok( true, "complete" ); } @@ -1777,22 +1767,21 @@ QUnit.module( "ajax", { done: function( data ) { assert.ok( false, "done: " + data ); }, - fail: function( jqXHR, status, error ) { - assert.ok( true, "exception caught: " + error ); - assert.strictEqual( jqXHR.status, 0, "proper status code" ); - assert.strictEqual( status, "error", "proper status" ); - } - }, { - url: "http://domain.org:80d", - done: function( data ) { - assert.ok( false, "done: " + data ); - }, - fail: function( _, status, error ) { - assert.ok( true, "fail: " + status + " - " + error ); - } - } ]; - } - ); + fail: function( jqXHR, status, error ) { + assert.ok( true, "exception caught: " + error ); + assert.strictEqual( jqXHR.status, 0, "proper status code" ); + assert.strictEqual( status, "error", "proper status" ); + } + }, { + url: "http://domain.org:80d", + done: function( data ) { + assert.ok( false, "done: " + data ); + }, + fail: function( _, status, error ) { + assert.ok( true, "fail: " + status + " - " + error ); + } + } ]; + } ); ajaxTest( "gh-2587 - when content-type not xml, but looks like one", 1, function( assert ) { return { From 8a734344f2566dab5b8d34ecd79ae81ebd8843c5 Mon Sep 17 00:00:00 2001 From: Christian Grete Date: Sat, 3 Oct 2015 00:28:34 +0200 Subject: [PATCH 013/927] Core: Support Symbol wrapper objects in jQuery.type In ECMAScript 2015 (ES6), the native typeof operator returns "symbol" for Symbol primitives. As it is possible to wrap symbols using the Object constructor, symbols can be objects as well as any other primitive type in JavaScript and should be determined by jQuery.type. Closes gh-2627 --- src/core.js | 2 +- test/unit/core.js | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/core.js b/src/core.js index 3b42d73ab6..b1483c0183 100644 --- a/src/core.js +++ b/src/core.js @@ -442,7 +442,7 @@ if ( typeof Symbol === "function" ) { /* jshint ignore: end */ // Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error".split( " " ), +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), function( i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } ); diff --git a/test/unit/core.js b/test/unit/core.js index 407ae7e2ca..42bfe91c1c 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -272,6 +272,19 @@ QUnit.test( "type", function( assert ) { assert.equal( jQuery.type( new MyObject() ), "object", "Object" ); } ); +QUnit.test( "type for `Symbol`", function( assert ) { + // Prevent reference errors + if( typeof Symbol !== "function" ) { + assert.expect( 0 ); + return + } + + assert.expect( 2 ); + + assert.equal( jQuery.type( Symbol() ), "symbol", "Symbol" ); + assert.equal( jQuery.type( Object( Symbol() ) ), "symbol", "Symbol" ); +}); + QUnit.asyncTest( "isPlainObject", function( assert ) { assert.expect( 15 ); From 625bd303d99408bca86b7002cd42b8716e2b267e Mon Sep 17 00:00:00 2001 From: Oleg Gaidarenko Date: Tue, 13 Oct 2015 01:22:57 +0300 Subject: [PATCH 014/927] Tests: fix code style issues Follow-up for 8a734344f2566dab5b8d34ecd79ae81ebd8843c5 --- test/unit/core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/core.js b/test/unit/core.js index 42bfe91c1c..1ed2663182 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -276,7 +276,7 @@ QUnit.test( "type for `Symbol`", function( assert ) { // Prevent reference errors if( typeof Symbol !== "function" ) { assert.expect( 0 ); - return + return; } assert.expect( 2 ); From 67b76f5986a78d868553b9aec0d0192f5259a078 Mon Sep 17 00:00:00 2001 From: Aurelio De Rosa Date: Mon, 21 Sep 2015 00:05:50 +0100 Subject: [PATCH 015/927] Tests: Account for array-like objects in jQuery.grep Closes gh-2605 --- test/unit/core.js | 79 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 6 deletions(-) diff --git a/test/unit/core.js b/test/unit/core.js index 1ed2663182..33d162d689 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -970,16 +970,83 @@ QUnit.test( "jQuery.grep()", function( assert ) { assert.deepEqual( jQuery.grep( [], searchCriterion ), [], "Empty array" ); assert.deepEqual( jQuery.grep( new Array( 4 ), searchCriterion ), [], "Sparse array" ); - assert.deepEqual( jQuery.grep( [ 1, 2, 3, 4, 5, 6 ], searchCriterion ), [ 2, 4, 6 ], "Satisfying elements present" ); - assert.deepEqual( jQuery.grep( [ 1, 3, 5, 7 ], searchCriterion ), [], "Satisfying elements absent" ); + assert.deepEqual( + jQuery.grep( [ 1, 2, 3, 4, 5, 6 ], searchCriterion ), + [ 2, 4, 6 ], + "Satisfying elements present" + ); + assert.deepEqual( + jQuery.grep( [ 1, 3, 5, 7 ], searchCriterion ), + [], + "Satisfying elements absent" + ); - assert.deepEqual( jQuery.grep( [ 1, 2, 3, 4, 5, 6 ], searchCriterion, true ), [ 1, 3, 5 ], "Satisfying elements present and grep inverted" ); - assert.deepEqual( jQuery.grep( [ 1, 3, 5, 7 ], searchCriterion, true ), [ 1, 3, 5, 7 ], "Satisfying elements absent and grep inverted" ); + assert.deepEqual( + jQuery.grep( [ 1, 2, 3, 4, 5, 6 ], searchCriterion, true ), + [ 1, 3, 5 ], + "Satisfying elements present and grep inverted" + ); + assert.deepEqual( + jQuery.grep( [ 1, 3, 5, 7 ], searchCriterion, true ), + [ 1, 3, 5, 7 ], + "Satisfying elements absent and grep inverted" + ); - assert.deepEqual( jQuery.grep( [ 1, 2, 3, 4, 5, 6 ], searchCriterion, false ), [ 2, 4, 6 ], "Satisfying elements present but grep explicitly uninverted" ); - assert.deepEqual( jQuery.grep( [ 1, 3, 5, 7 ], searchCriterion, false ), [], "Satisfying elements absent and grep explicitly uninverted" ); + assert.deepEqual( + jQuery.grep( [ 1, 2, 3, 4, 5, 6 ], searchCriterion, false ), + [ 2, 4, 6 ], + "Satisfying elements present but grep explicitly uninverted" + ); + assert.deepEqual( + jQuery.grep( [ 1, 3, 5, 7 ], searchCriterion, false ), + [], + "Satisfying elements absent and grep explicitly uninverted" + ); } ); +QUnit.test( "jQuery.grep(Array-like)", function( assert ) { + assert.expect( 7 ); + + var searchCriterion = function( value ) { + return value % 2 === 0; + }; + + assert.deepEqual( jQuery.grep( { length: 0 }, searchCriterion ), [], "Empty array-like" ); + + assert.deepEqual( + jQuery.grep( { 0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, length: 6 }, searchCriterion ), + [ 2, 4, 6 ], + "Satisfying elements present and array-like object used" + ); + assert.deepEqual( + jQuery.grep( { 0: 1, 1: 3, 2: 5, 3: 7, length: 4 }, searchCriterion ), + [], + "Satisfying elements absent and Array-like object used" + ); + + assert.deepEqual( + jQuery.grep( { 0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, length: 6 }, searchCriterion, true ), + [ 1, 3, 5 ], + "Satisfying elements present, array-like object used, and grep inverted" + ); + assert.deepEqual( + jQuery.grep( { 0: 1, 1: 3, 2: 5, 3: 7, length: 4 }, searchCriterion, true ), + [ 1, 3, 5, 7 ], + "Satisfying elements absent, array-like object used, and grep inverted" + ); + + assert.deepEqual( + jQuery.grep( { 0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, length: 6 }, searchCriterion, false ), + [ 2, 4, 6 ], + "Satisfying elements present, Array-like object used, but grep explicitly uninverted" + ); + assert.deepEqual( + jQuery.grep( { 0: 1, 1: 3, 2: 5, 3: 7, length: 4 }, searchCriterion, false ), + [], + "Satisfying elements absent, Array-like object used, and grep explicitly uninverted" + ); +}); + QUnit.test( "jQuery.extend(Object, Object)", function( assert ) { assert.expect( 28 ); From 44f8239d3f9d09d81e2885e9ae7e044277b67341 Mon Sep 17 00:00:00 2001 From: Oleg Gaidarenko Date: Sat, 17 Oct 2015 14:17:20 -0400 Subject: [PATCH 016/927] Build: update Sizzle to 2.2.1 Ref #2644 - `selector` module in Edge - Waiting for Sizzle update Fixes #2390 --- external/sizzle/dist/sizzle.js | 16 ++++++++-------- external/sizzle/dist/sizzle.min.js | 4 ++-- external/sizzle/dist/sizzle.min.map | 2 +- package.json | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/external/sizzle/dist/sizzle.js b/external/sizzle/dist/sizzle.js index f47fb8adb9..9b1e5ba62c 100644 --- a/external/sizzle/dist/sizzle.js +++ b/external/sizzle/dist/sizzle.js @@ -1,12 +1,12 @@ /*! - * Sizzle CSS Selector Engine v2.2.0 + * Sizzle CSS Selector Engine v2.2.1 * http://sizzlejs.com/ * * Copyright jQuery Foundation and other contributors * Released under the MIT license * http://jquery.org/license * - * Date: 2015-04-10 + * Date: 2015-10-17 */ (function( window ) { @@ -191,7 +191,7 @@ try { } function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, + var m, i, elem, nid, nidselect, match, groups, newSelector, newContext = context && context.ownerDocument, // nodeType defaults to 9, since context defaults to document @@ -292,8 +292,9 @@ function Sizzle( selector, context, results, seed ) { // Prefix every selector in the list groups = tokenize( selector ); i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; while ( i-- ) { - groups[i] = "[id='" + nid + "'] " + toSelector( groups[i] ); + groups[i] = nidselect + " " + toSelector( groups[i] ); } newSelector = groups.join( "," ); @@ -380,7 +381,7 @@ function assert( fn ) { */ function addHandle( attrs, handler ) { var arr = attrs.split("|"), - i = attrs.length; + i = arr.length; while ( i-- ) { Expr.attrHandle[ arr[i] ] = handler; @@ -503,10 +504,9 @@ setDocument = Sizzle.setDocument = function( node ) { docElem = document.documentElement; documentIsHTML = !isXML( document ); - // Support: IE 9 - 11 + // Support: IE 9-11, Edge // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Limit the fix to IE with document.documentMode and IE >=9 with document.defaultView - if ( document.documentMode && (parent = document.defaultView) && parent.top !== parent ) { + if ( (parent = document.defaultView) && parent.top !== parent ) { // Support: IE 11 if ( parent.addEventListener ) { parent.addEventListener( "unload", unloadHandler, false ); diff --git a/external/sizzle/dist/sizzle.min.js b/external/sizzle/dist/sizzle.min.js index e9244499b2..8558975d62 100644 --- a/external/sizzle/dist/sizzle.min.js +++ b/external/sizzle/dist/sizzle.min.js @@ -1,3 +1,3 @@ -/*! Sizzle v2.2.0 | (c) jQuery Foundation, Inc. | jquery.org/license */ -!function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=$.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(!(!c.qsa||A[a+" "]||q&&q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="[id='"+k+"'] "+qa(o[h]);r=o.join(","),s=_.test(a)&&oa(b.parentNode)||b}if(r)try{return H.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),n.documentMode&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),!(!c.matchesSelector||!p||A[b+" "]||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),"function"==typeof define&&define.amd?define(function(){return fa}):"undefined"!=typeof module&&module.exports?module.exports=fa:a.Sizzle=fa}(window); +/*! Sizzle v2.2.1 | (c) jQuery Foundation, Inc. | jquery.org/license */ +!function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),"function"==typeof define&&define.amd?define(function(){return fa}):"undefined"!=typeof module&&module.exports?module.exports=fa:a.Sizzle=fa}(window); //# sourceMappingURL=sizzle.min.map \ No newline at end of file diff --git a/external/sizzle/dist/sizzle.min.map b/external/sizzle/dist/sizzle.min.map index 764f27fff3..5438e0e779 100644 --- a/external/sizzle/dist/sizzle.min.map +++ b/external/sizzle/dist/sizzle.min.map @@ -1 +1 @@ -{"version":3,"file":"sizzle.min.js","sources":["sizzle.js"],"names":["window","i","support","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","document","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","matches","contains","expando","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","MAX_NEGATIVE","hasOwn","hasOwnProperty","arr","pop","push_native","push","slice","indexOf","list","elem","len","length","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","unloadHandler","apply","call","childNodes","nodeType","e","target","els","j","Sizzle","selector","context","results","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","nodeName","toLowerCase","getAttribute","replace","setAttribute","toSelector","join","testContext","parentNode","querySelectorAll","qsaError","removeAttribute","keys","cache","key","value","cacheLength","shift","markFunction","fn","assert","div","createElement","removeChild","addHandle","attrs","handler","split","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","type","name","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","parent","doc","documentMode","defaultView","top","addEventListener","attachEvent","className","appendChild","createComment","getById","getElementsByName","find","filter","attrId","getAttributeNode","tag","tmp","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","ret","attr","val","undefined","specified","error","msg","Error","uniqueSort","duplicates","detectDuplicates","sortStable","sort","splice","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">","dir","first"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","last","simple","forward","ofType","xml","uniqueCache","outerCache","nodeIndex","start","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","text","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","eq","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","prototype","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","map","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","elems","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","concat","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","Math","random","token","compiled","div1","defaultValue","define","amd","module","exports"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sizzle.min.js","sources":["sizzle.js"],"names":["window","i","support","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","document","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","matches","contains","expando","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","MAX_NEGATIVE","hasOwn","hasOwnProperty","arr","pop","push_native","push","slice","indexOf","list","elem","len","length","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","unloadHandler","apply","call","childNodes","nodeType","e","target","els","j","Sizzle","selector","context","results","seed","m","nid","nidselect","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","nodeName","toLowerCase","getAttribute","replace","setAttribute","toSelector","join","testContext","parentNode","querySelectorAll","qsaError","removeAttribute","keys","cache","key","value","cacheLength","shift","markFunction","fn","assert","div","createElement","removeChild","addHandle","attrs","handler","split","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","type","name","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","parent","doc","defaultView","top","addEventListener","attachEvent","className","appendChild","createComment","getById","getElementsByName","find","filter","attrId","getAttributeNode","tag","tmp","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","ret","attr","val","undefined","specified","error","msg","Error","uniqueSort","duplicates","detectDuplicates","sortStable","sort","splice","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">","dir","first"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","last","simple","forward","ofType","xml","uniqueCache","outerCache","nodeIndex","start","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","text","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","eq","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","prototype","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","map","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","elems","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","concat","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","Math","random","token","compiled","div1","defaultValue","define","amd","module","exports"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index c513b892d0..fd3f695ece 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "qunit-assert-step": "1.0.3", "requirejs": "2.1.17", "sinon": "1.10.3", - "sizzle": "2.2.0", + "sizzle": "2.2.1", "strip-json-comments": "1.0.3", "testswarm": "1.1.0", "win-spawn": "2.0.0" From 0703fd52ef88a2cdac93502070c51c93ffa1dfdd Mon Sep 17 00:00:00 2001 From: Liza Ramo Date: Sat, 17 Oct 2015 16:48:57 -0400 Subject: [PATCH 017/927] Core: make isNumeric test work on Symbol Ref #2645 Closes #2657 --- src/core.js | 3 ++- test/unit/core.js | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/core.js b/src/core.js index b1483c0183..a31e5f93f9 100644 --- a/src/core.js +++ b/src/core.js @@ -214,7 +214,8 @@ jQuery.extend( { // ...but misinterprets leading-number strings, particularly hex literals ("0x...") // subtraction forces infinities to NaN // adding 1 corrects loss of precision from parseFloat (#15100) - return !jQuery.isArray( obj ) && ( obj - parseFloat( obj ) + 1 ) >= 0; + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; }, isPlainObject: function( obj ) { diff --git a/test/unit/core.js b/test/unit/core.js index 33d162d689..26602dcb2d 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -490,6 +490,13 @@ QUnit.test( "isNumeric", function( assert ) { assert.equal( t( new Date() ), false, "Instance of a Date" ); } ); +QUnit[ typeof Symbol === "function" ? "test" : "skip" ]( "isNumeric(Symbol)", function( assert ) { + assert.expect( 2 ); + + assert.equal( jQuery.isNumeric( Symbol() ), false, "Symbol" ); + assert.equal( jQuery.isNumeric( Object( Symbol() ) ), false, "Symbol inside an object" ); +} ); + QUnit.test( "isXMLDoc - HTML", function( assert ) { assert.expect( 4 ); From 0fb84fa8ccefcd07febf282fd7b80262ad70add7 Mon Sep 17 00:00:00 2001 From: Richard Gibson Date: Sat, 17 Oct 2015 17:40:30 -0400 Subject: [PATCH 018/927] Tests: Keep test iframes around for assertions Ref 44f8239d3f9d09d81e2885e9ae7e044277b67341 Ref gh-2644 Ref gh-2390 --- test/data/testinit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/data/testinit.js b/test/data/testinit.js index e88df966f4..ca8f433d7d 100644 --- a/test/data/testinit.js +++ b/test/data/testinit.js @@ -252,9 +252,9 @@ this.testIframeWithCallback = function( title, fileName, func ) { setTimeout( function() { this.iframeCallback = undefined; - iframe.remove(); func.apply( this, args ); func = function() {}; + iframe.remove(); done(); } ); From e271f665dd8fb617a5015051e1c9df8cebd6c97b Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Sun, 18 Oct 2015 11:02:16 -0400 Subject: [PATCH 019/927] Deprecated: fix amd mode for the deprecated module --- package.json | 1 + src/deprecated.js | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index fd3f695ece..b48f90a981 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "CSS", "Data", "Deferred", + "Deprecated", "Dimensions", "Effects", "Event", diff --git a/src/deprecated.js b/src/deprecated.js index bc75f098ac..78885266dd 100644 --- a/src/deprecated.js +++ b/src/deprecated.js @@ -1,4 +1,6 @@ -define( function() { +define( [ + "./core" +], function( jQuery ) { jQuery.fn.extend( { From 67d7a2eefee768b59eb3d51cb1fb2c671873e58a Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Fri, 9 Oct 2015 15:52:29 -0400 Subject: [PATCH 020/927] CSS: Make show/hide/toggle methods a module Unit test changes some uses of .show() and .hide() to .css( "display", ... ), there was already an implicit assumption in several of the existing tests. Fixes gh-2193 Close gh-2648 --- Gruntfile.js | 1 + README.md | 3 ++- src/css.js | 22 +--------------- src/css/showHide.js | 27 ++++++++++++++++--- test/unit/basic.js | 10 +++++++- test/unit/css.js | 57 ++++++++++++++++++++++++----------------- test/unit/dimensions.js | 16 ++++++------ test/unit/queue.js | 3 +++ 8 files changed, 81 insertions(+), 58 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 143c6631ac..aa919bb08b 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -70,6 +70,7 @@ module.exports = function( grunt ) { ajax: [ "manipulation/_evalUrl", "event/ajax" ], callbacks: [ "deferred" ], css: [ "effects", "dimensions", "offset" ], + "css/showHide": [ "effects" ], sizzle: [ "css/hiddenVisibleSelectors", "effects/animatedSelector" ] } } diff --git a/README.md b/README.md index de6e1bb826..53b6f3fd73 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,8 @@ Some example modules that can be excluded are: - **ajax/xhr**: The XMLHTTPRequest AJAX transport only. - **ajax/script**: The ` + + + + + +

Test for gh-2343 (IE11)

+

+Instructions: In IE11, click on or focus the first radio button. +Then use the left/right arrow keys to select the other radios. +You should see events logged in the results below. +

+
+ 0 + 1 + 2 +
+
+ + + From c577928d45bdcc3ee8f93da89ab7aadca21919f3 Mon Sep 17 00:00:00 2001 From: Julian Alexander Murillo Date: Wed, 20 May 2015 23:59:06 -0500 Subject: [PATCH 025/927] Tests: Change quotes according to style guidelines Close gh-2339 --- test/data/offset/absolute.html | 4 ++-- test/data/offset/body.html | 4 ++-- test/data/offset/fixed.html | 4 ++-- test/data/offset/relative.html | 4 ++-- test/data/offset/scroll.html | 8 ++++---- test/data/offset/static.html | 4 ++-- test/data/offset/table.html | 4 ++-- test/delegatetest.html | 2 +- test/networkerror.html | 2 +- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/test/data/offset/absolute.html b/test/data/offset/absolute.html index 7665d7aac5..58f0cbd2a3 100644 --- a/test/data/offset/absolute.html +++ b/test/data/offset/absolute.html @@ -18,8 +18,8 @@ @@ -24,7 +25,7 @@
-
+

Click the white box to move the marker to it. Clicking the box also changes the position to absolute (if not already) and sets the position according to the position method.

diff --git a/test/unit/css.js b/test/unit/css.js index 5c9f3e01f3..343459dfba 100644 --- a/test/unit/css.js +++ b/test/unit/css.js @@ -728,17 +728,31 @@ QUnit.test( "internal ref to elem.runtimeStyle (bug #7608)", function( assert ) assert.ok( result, "elem.runtimeStyle does not throw exception" ); } ); -QUnit.test( "marginRight computed style (bug #3333)", function( assert ) { - assert.expect( 1 ); +QUnit.test( "computed margins (trac-3333; gh-2237)", function( assert ) { + assert.expect( 2 ); + + var $div = jQuery( "#foo" ), + $child = jQuery( "#en" ); - var $div = jQuery( "#foo" ); $div.css( { "width": "1px", "marginRight": 0 } ); - - assert.equal( $div.css( "marginRight" ), "0px", "marginRight correctly calculated with a width and display block" ); -} ); + assert.equal( $div.css( "marginRight" ), "0px", + "marginRight correctly calculated with a width and display block" ); + + $div.css({ + position: "absolute", + top: 0, + left: 0, + width: "100px" + }); + $child.css({ + width: "50px", + margin: "auto" + }); + assert.equal( $child.css( "marginLeft" ), "25px", "auto margins are computed to pixels" ); +}); QUnit.test( "box model properties incorrectly returning % instead of px, see #10639 and #12088", function( assert ) { assert.expect( 2 ); diff --git a/test/unit/offset.js b/test/unit/offset.js index f0cd477695..85f1da65de 100644 --- a/test/unit/offset.js +++ b/test/unit/offset.js @@ -186,13 +186,14 @@ testIframe( "offset/absolute", "absolute", function( $, window, document, assert } ); testIframe( "offset/relative", "relative", function( $, window, document, assert ) { - assert.expect( 60 ); + assert.expect( 64 ); // get offset var tests = [ { "id": "#relative-1", "top": 7, "left": 7 }, { "id": "#relative-1-1", "top": 15, "left": 15 }, - { "id": "#relative-2", "top": 142, "left": 27 } + { "id": "#relative-2", "top": 142, "left": 27 }, + { "id": "#relative-2-1", "top": 149, "left": 52 } ]; jQuery.each( tests, function() { assert.equal( $( this[ "id" ] ).offset().top, this[ "top" ], "jQuery('" + this[ "id" ] + "').offset().top" ); @@ -203,7 +204,8 @@ testIframe( "offset/relative", "relative", function( $, window, document, assert tests = [ { "id": "#relative-1", "top": 6, "left": 6 }, { "id": "#relative-1-1", "top": 5, "left": 5 }, - { "id": "#relative-2", "top": 141, "left": 26 } + { "id": "#relative-2", "top": 141, "left": 26 }, + { "id": "#relative-2-1", "top": 5, "left": 5 } ]; jQuery.each( tests, function() { assert.equal( $( this[ "id" ] ).position().top, this[ "top" ], "jQuery('" + this[ "id" ] + "').position().top" ); diff --git a/test/unit/support.js b/test/unit/support.js index 8c6b0a28b6..a62e57c73f 100644 --- a/test/unit/support.js +++ b/test/unit/support.js @@ -70,7 +70,8 @@ testIframeWithCallback( "optSelected": true, "pixelMarginRight": true, "pixelPosition": true, - "radioValue": true + "radioValue": true, + "reliableMarginLeft": true }; } else if ( /(msie 10\.0|trident\/7\.0)/i.test( userAgent ) ) { expected = { @@ -86,7 +87,8 @@ testIframeWithCallback( "optSelected": false, "pixelMarginRight": true, "pixelPosition": true, - "radioValue": false + "radioValue": false, + "reliableMarginLeft": true }; } else if ( /msie 9\.0/i.test( userAgent ) ) { expected = { @@ -102,7 +104,8 @@ testIframeWithCallback( "optSelected": false, "pixelMarginRight": true, "pixelPosition": true, - "radioValue": false + "radioValue": false, + "reliableMarginLeft": true }; } else if ( /chrome/i.test( userAgent ) ) { @@ -121,7 +124,8 @@ testIframeWithCallback( "optSelected": true, "pixelMarginRight": true, "pixelPosition": true, - "radioValue": true + "radioValue": true, + "reliableMarginLeft": true }; } else if ( /8\.0(\.\d+|) safari/i.test( userAgent ) ) { expected = { @@ -137,7 +141,8 @@ testIframeWithCallback( "optSelected": true, "pixelMarginRight": true, "pixelPosition": false, - "radioValue": true + "radioValue": true, + "reliableMarginLeft": true }; } else if ( /7\.0(\.\d+|) safari/i.test( userAgent ) ) { expected = { @@ -153,7 +158,8 @@ testIframeWithCallback( "optSelected": true, "pixelMarginRight": true, "pixelPosition": false, - "radioValue": true + "radioValue": true, + "reliableMarginLeft": true }; } else if ( /firefox/i.test( userAgent ) ) { expected = { @@ -169,7 +175,8 @@ testIframeWithCallback( "optSelected": true, "pixelMarginRight": true, "pixelPosition": true, - "radioValue": true + "radioValue": true, + "reliableMarginLeft": false }; } else if ( /iphone os 8/i.test( userAgent ) ) { expected = { @@ -185,7 +192,8 @@ testIframeWithCallback( "optSelected": true, "pixelMarginRight": true, "pixelPosition": false, - "radioValue": true + "radioValue": true, + "reliableMarginLeft": true }; } else if ( /iphone os (6|7)/i.test( userAgent ) ) { expected = { @@ -201,7 +209,8 @@ testIframeWithCallback( "optSelected": true, "pixelMarginRight": true, "pixelPosition": false, - "radioValue": true + "radioValue": true, + "reliableMarginLeft": true }; } else if ( /android 4\.[0-3]/i.test( userAgent ) ) { expected = { @@ -217,33 +226,35 @@ testIframeWithCallback( "optSelected": true, "pixelMarginRight": false, "pixelPosition": false, - "radioValue": true + "radioValue": true, + "reliableMarginLeft": false }; } - if ( expected ) { - QUnit.test( "Verify that the support tests resolve as expected per browser", function( assert ) { - var i, prop, - j = 0; + QUnit.test( "Verify that support tests resolve as expected per browser", function( assert ) { + if ( !expected ) { + assert.expect( 1 ); + assert.ok( false, "Known client: " + userAgent ); + } - for ( prop in computedSupport ) { - j++; - } + var i, prop, + j = 0; - assert.expect( j ); + for ( prop in computedSupport ) { + j++; + } - for ( i in expected ) { + assert.expect( j ); - // TODO check for all modules containing support properties - if ( jQuery.ajax || i !== "ajax" && i !== "cors" ) { - assert.equal( computedSupport[ i ], expected[ i ], - "jQuery.support['" + i + "']: " + computedSupport[ i ] + - ", expected['" + i + "']: " + expected[ i ] ); - } else { - assert.ok( true, "no ajax; skipping jQuery.support[' " + i + " ']" ); - } + for ( i in expected ) { + if ( jQuery.ajax || i !== "ajax" && i !== "cors" ) { + assert.equal( computedSupport[ i ], expected[ i ], + "jQuery.support['" + i + "']: " + computedSupport[ i ] + + ", expected['" + i + "']: " + expected[ i ] ); + } else { + assert.ok( true, "no ajax; skipping jQuery.support['" + i + "']" ); } - } ); - } + } + }); } )(); From e99a3ac7066226d00ff5828de596d4a4b3818c0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82=C4=99biowski?= Date: Sun, 18 Oct 2015 17:26:56 -0400 Subject: [PATCH 032/927] Tests: Add Safari 9 support tests results --- test/unit/support.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/unit/support.js b/test/unit/support.js index a62e57c73f..a661843c3c 100644 --- a/test/unit/support.js +++ b/test/unit/support.js @@ -127,6 +127,23 @@ testIframeWithCallback( "radioValue": true, "reliableMarginLeft": true }; + } else if ( /9\.0(\.\d+|) safari/i.test( userAgent ) ) { + expected = { + "ajax": true, + "boxSizingReliable": true, + "checkClone": true, + "checkOn": true, + "clearCloneStyle": true, + "cors": true, + "createHTMLDocument": true, + "focusin": false, + "noCloneChecked": true, + "optSelected": true, + "pixelMarginRight": true, + "pixelPosition": false, + "radioValue": true, + "reliableMarginLeft": true + }; } else if ( /8\.0(\.\d+|) safari/i.test( userAgent ) ) { expected = { "ajax": true, From 1144e754a6a131bd4affec26fd85299e71bdab06 Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Tue, 20 Oct 2015 12:30:01 -0400 Subject: [PATCH 033/927] Build: Add "deprecated" to the Testswarm module list Ref #1740 Yeah. --- Gruntfile.js | 1 + 1 file changed, 1 insertion(+) diff --git a/Gruntfile.js b/Gruntfile.js index aa919bb08b..dd4b07d308 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -152,6 +152,7 @@ module.exports = function( grunt ) { "css", "data", "deferred", + "deprecated", "dimensions", "effects", "event", From 15ac848868e993dfe5ccd7751a94f5c8edc288bc Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Sun, 18 Oct 2015 15:50:43 -0400 Subject: [PATCH 034/927] Core: make isNumeric limited to strings and numbers Fixes gh-2662 --- src/core.js | 12 ++++++------ test/unit/core.js | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/core.js b/src/core.js index a31e5f93f9..8e43547ac0 100644 --- a/src/core.js +++ b/src/core.js @@ -210,12 +210,12 @@ jQuery.extend( { isNumeric: function( obj ) { - // parseFloat NaNs numeric-cast false positives (null|true|false|"") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - // adding 1 corrects loss of precision from parseFloat (#15100) - var realStringObj = obj && obj.toString(); - return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + ( obj - parseFloat( obj ) + 1 ) >= 0; }, isPlainObject: function( obj ) { diff --git a/test/unit/core.js b/test/unit/core.js index 36504855dc..dc644b504b 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -474,8 +474,8 @@ QUnit.test( "isNumeric", function( assert ) { assert.ok( t( 1.5999999999999999 ), "Very precise floating point number" ); assert.ok( t( 8e5 ), "Exponential notation" ); assert.ok( t( "123e-2" ), "Exponential notation string" ); - assert.ok( t( new ToString( "42" ) ), "Custom .toString returning number" ); + assert.equal( t( new ToString( "42" ) ), false, "Custom .toString returning number" ); assert.equal( t( "" ), false, "Empty string" ); assert.equal( t( " " ), false, "Whitespace characters string" ); assert.equal( t( "\t\t" ), false, "Tab characters string" ); From 47ccf3daadc4b312f850502300129952e70f9d9d Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Sun, 18 Oct 2015 17:21:41 -0400 Subject: [PATCH 035/927] Attributes: do not set properties to false when removing booleans Fixes gh-1759 --- src/attributes/attr.js | 12 ++---------- test/unit/attributes.js | 6 ++++-- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/attributes/attr.js b/src/attributes/attr.js index f88808324d..ae48676d1f 100644 --- a/src/attributes/attr.js +++ b/src/attributes/attr.js @@ -86,21 +86,12 @@ jQuery.extend( { }, removeAttr: function( elem, value ) { - var name, propName, + var name, i = 0, attrNames = value && value.match( rnotwhite ); if ( attrNames && elem.nodeType === 1 ) { while ( ( name = attrNames[ i++ ] ) ) { - propName = jQuery.propFix[ name ] || name; - - // Boolean attributes get special treatment (#10870) - if ( jQuery.expr.match.bool.test( name ) ) { - - // Set corresponding property to false - elem[ propName ] = false; - } - elem.removeAttribute( name ); } } @@ -120,6 +111,7 @@ boolHook = { return name; } }; + jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { var getter = attrHandle[ name ] || jQuery.find.attr; diff --git a/test/unit/attributes.js b/test/unit/attributes.js index 564fb12e07..c1e159b8f0 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -564,7 +564,7 @@ QUnit.test( "attr('tabindex', value)", function( assert ) { } ); QUnit.test( "removeAttr(String)", function( assert ) { - assert.expect( 12 ); + assert.expect( 13 ); var $first; assert.equal( jQuery( "#mark" ).removeAttr( "class" ).attr( "class" ), undefined, "remove class" ); @@ -575,7 +575,9 @@ QUnit.test( "removeAttr(String)", function( assert ) { assert.equal( jQuery( "#fx-test-group" ).attr( "height", "3px" ).removeAttr( "height" ).get( 0 ).style.height, "1px", "Removing height attribute has no effect on height set with style attribute" ); jQuery( "#check1" ).removeAttr( "checked" ).prop( "checked", true ).removeAttr( "checked" ); - assert.equal( document.getElementById( "check1" ).checked, false, "removeAttr sets boolean properties to false" ); + assert.equal( document.getElementById( "check1" ).checked, true, "removeAttr should not set checked to false, since the checked attribute does NOT mirror the checked property" ); + jQuery( "#option1b" ).attr( "selected", "selected" ).removeAttr( "selected" ).attr( "selected", "selected" ); + assert.notEqual( document.getElementById( "select1" ).selectedIndex, 1, "Once the selected attribute is dirty, subsequent settings should not select the option (gh-1759)" ); jQuery( "#text1" ).prop( "readOnly", true ).removeAttr( "readonly" ); assert.equal( document.getElementById( "text1" ).readOnly, false, "removeAttr sets boolean properties to false" ); From 5b554cf04e809d77026d7afba6f02a7599724377 Mon Sep 17 00:00:00 2001 From: Richard Gibson Date: Fri, 23 Oct 2015 11:55:52 -0400 Subject: [PATCH 036/927] Tests: Use standard external domain name Ref 01c360f96390ff16edfe65ef3b34e167087ef645 (cherry picked from commit 36806891657b0a3b7c4a12d9698f2ebf552fd712) --- test/unit/ajax.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/ajax.js b/test/unit/ajax.js index d39b86a0f7..ba11c90ee4 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -1773,7 +1773,7 @@ QUnit.module( "ajax", { assert.strictEqual( status, "error", "proper status" ); } }, { - url: "http://domain.org:80d", + url: "http://" + externalHost + ":80q", done: function( data ) { assert.ok( false, "done: " + data ); }, From f931786018058174fa63551a7a4a3fccf9de41fa Mon Sep 17 00:00:00 2001 From: Richard Gibson Date: Sun, 25 Oct 2015 15:25:56 -0400 Subject: [PATCH 037/927] Tests: Post-Summit cleanup Ref 67d7a2eefee768b59eb3d51cb1fb2c671873e58a Ref c752a5030bc00eb5b45dea9c28963f824a5c4f44 --- test/unit/attributes.js | 2 +- test/unit/dimensions.js | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/test/unit/attributes.js b/test/unit/attributes.js index c1e159b8f0..b70022f9e0 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -739,7 +739,7 @@ QUnit.test( "prop('tabindex')", function( assert ) { QUnit.test( "image.prop( 'tabIndex' )", function( assert ) { assert.expect( 1 ); - var image = jQuery("") + var image = jQuery("") .appendTo("#qunit-fixture"); assert.equal( image.prop("tabIndex" ), -1, "tabIndex on image" ); } ); diff --git a/test/unit/dimensions.js b/test/unit/dimensions.js index aa628ee71c..cdf0248371 100644 --- a/test/unit/dimensions.js +++ b/test/unit/dimensions.js @@ -56,8 +56,6 @@ function testWidth( val, assert ) { assert.equal( blah.width(), null, "Make sure 'null' is returned on an empty set" ); assert.equal( jQuery( window ).width(), document.documentElement.clientWidth, "Window width is equal to width reported by window/document." ); - - assert.expectJqData( this, $div[ 0 ], "olddisplay" ); } QUnit.test( "width()", function( assert ) { @@ -109,8 +107,6 @@ function testHeight( val, assert ) { assert.equal( blah.height(), null, "Make sure 'null' is returned on an empty set" ); assert.equal( jQuery( window ).height(), document.documentElement.clientHeight, "Window width is equal to width reported by window/document." ); - - assert.expectJqData( this, $div[ 0 ], "olddisplay" ); } QUnit.test( "height()", function( assert ) { @@ -165,7 +161,6 @@ QUnit.test( "innerWidth()", function( assert ) { assert.equal( div.innerWidth(), 0, "Make sure that disconnected nodes are handled." ); div.remove(); - assert.expectJqData( this, $div[ 0 ], "olddisplay" ); } ); QUnit.test( "innerHeight()", function( assert ) { @@ -200,7 +195,6 @@ QUnit.test( "innerHeight()", function( assert ) { assert.equal( div.innerHeight(), 0, "Make sure that disconnected nodes are handled." ); div.remove(); - assert.expectJqData( this, $div[ 0 ], "olddisplay" ); } ); QUnit.test( "outerWidth()", function( assert ) { @@ -239,7 +233,6 @@ QUnit.test( "outerWidth()", function( assert ) { assert.equal( div.outerWidth(), 0, "Make sure that disconnected nodes are handled." ); div.remove(); - assert.expectJqData( this, $div[ 0 ], "olddisplay" ); } ); QUnit.test( "child of a hidden elem (or unconnected node) has accurate inner/outer/Width()/Height() see #9441 #9300", function( assert ) { @@ -395,7 +388,6 @@ QUnit.test( "outerHeight()", function( assert ) { assert.equal( div.outerHeight(), 0, "Make sure that disconnected nodes are handled." ); div.remove(); - assert.expectJqData( this, $div[ 0 ], "olddisplay" ); } ); QUnit.test( "passing undefined is a setter #5571", function( assert ) { From 87bd130289c6ed9bfc355c1f8587ae6ce00a4776 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Mon, 26 Oct 2015 11:38:04 -0400 Subject: [PATCH 038/927] Attributes: remove flakey test for selected attribute - The change is already covered by the "checked" test. Since this test is redundant, just drop it. --- test/unit/attributes.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/unit/attributes.js b/test/unit/attributes.js index b70022f9e0..9ea29a1053 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -564,7 +564,7 @@ QUnit.test( "attr('tabindex', value)", function( assert ) { } ); QUnit.test( "removeAttr(String)", function( assert ) { - assert.expect( 13 ); + assert.expect( 12 ); var $first; assert.equal( jQuery( "#mark" ).removeAttr( "class" ).attr( "class" ), undefined, "remove class" ); @@ -576,8 +576,6 @@ QUnit.test( "removeAttr(String)", function( assert ) { jQuery( "#check1" ).removeAttr( "checked" ).prop( "checked", true ).removeAttr( "checked" ); assert.equal( document.getElementById( "check1" ).checked, true, "removeAttr should not set checked to false, since the checked attribute does NOT mirror the checked property" ); - jQuery( "#option1b" ).attr( "selected", "selected" ).removeAttr( "selected" ).attr( "selected", "selected" ); - assert.notEqual( document.getElementById( "select1" ).selectedIndex, 1, "Once the selected attribute is dirty, subsequent settings should not select the option (gh-1759)" ); jQuery( "#text1" ).prop( "readOnly", true ).removeAttr( "readonly" ); assert.equal( document.getElementById( "text1" ).readOnly, false, "removeAttr sets boolean properties to false" ); From dabd5ba96c05279b3ffb052db5b8d17f75996694 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Wed, 28 Oct 2015 13:54:04 -0400 Subject: [PATCH 039/927] Core: use interactive to evaluate dom ready, barring IE9-10 Fixes gh-2100 --- src/core/ready.js | 8 ++++---- test/data/event/interactiveReady.html | 23 +++++++++++++++++++++++ test/unit/event.js | 12 ++++++++++++ 3 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 test/data/event/interactiveReady.html diff --git a/src/core/ready.js b/src/core/ready.js index 7a7ef58699..73c3d706a2 100644 --- a/src/core/ready.js +++ b/src/core/ready.js @@ -70,10 +70,10 @@ jQuery.ready.promise = function( obj ) { // Catch cases where $(document).ready() is called // after the browser event has already occurred. - // We once tried to use readyState "interactive" here, - // but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { + // Support: IE9-10 only + // Older IE sometimes signals "interactive" too soon + if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { // Handle it asynchronously to allow scripts the opportunity to delay ready window.setTimeout( jQuery.ready ); diff --git a/test/data/event/interactiveReady.html b/test/data/event/interactiveReady.html new file mode 100644 index 0000000000..77b37104d0 --- /dev/null +++ b/test/data/event/interactiveReady.html @@ -0,0 +1,23 @@ + + + + +Test case for gh-2100 + + + + + + + + +
+ + diff --git a/test/unit/event.js b/test/unit/event.js index ebaf42f6b6..479f805db7 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -2518,6 +2518,18 @@ testIframeWithCallback( } ); +// need PHP here to make the incepted IFRAME hang +if ( hasPHP ) { + testIframeWithCallback( + "jQuery.ready uses interactive", + "event/interactiveReady.html", + function( isOk, assert ) { + assert.expect( 1 ); + assert.ok( isOk, "jQuery fires ready when the DOM can truly be interacted with" ); + } + ); +} + testIframeWithCallback( "Focusing iframe element", "event/focusElem.html", From 7bb39f35118c33f1f7effc49112579ec9393f02c Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Thu, 29 Oct 2015 15:21:46 -0400 Subject: [PATCH 040/927] Release: remove antiquated release-notes.js --- build/release/release-notes.js | 58 ---------------------------------- 1 file changed, 58 deletions(-) delete mode 100644 build/release/release-notes.js diff --git a/build/release/release-notes.js b/build/release/release-notes.js deleted file mode 100644 index f3f6a6ff26..0000000000 --- a/build/release/release-notes.js +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env node -/* - * jQuery Release Note Generator - */ - -var http = require( "http" ), - extract = /(.*?)<[^"]+"component">\s*(\S+)/g, - version = process.argv[ 2 ]; - -if ( !/^\d+\.\d+/.test( version ) ) { - console.error( "Invalid version number: " + version ); - process.exit( 1 ); -} - -http.request( { - host: "bugs.jquery.com", - port: 80, - method: "GET", - path: "/query?status=closed&resolution=fixed&max=400&" + - "component=!web&order=component&milestone=" + version -}, function( res ) { - var data = []; - - res.on( "data", function( chunk ) { - data.push( chunk ); - } ); - - res.on( "end", function() { - var match, cur, cat, - file = data.join( "" ); - - while ( ( match = extract.exec( file ) ) ) { - if ( "#" + match[ 1 ] !== match[ 2 ] ) { - cat = match[ 3 ]; - - if ( !cur || cur !== cat ) { - if ( cur ) { - console.log( "" ); - } - cur = cat; - console.log( - "

" + cat.charAt( 0 ).toUpperCase() + cat.slice( 1 ) + "

" - ); - console.log( "
" ); - } - - } ); -} ).end(); From cbe5b2b79a46c61ad36ea5df44f80b1cc2c1b60a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82=C4=99biowski?= Date: Fri, 30 Oct 2015 01:34:33 +0100 Subject: [PATCH 041/927] Build: Test on Node 5 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 19136e9407..5e3f4a3a8d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,3 +4,4 @@ node_js: - "0.10" - "0.12" - "4" +- "5" From 1c2b5362ef40058d5b375a40362c88559f81a293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82=C4=99biowski?= Date: Fri, 30 Oct 2015 19:13:45 +0100 Subject: [PATCH 042/927] Tests: Add iOS 9 support tests results --- test/unit/support.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/unit/support.js b/test/unit/support.js index a661843c3c..a76cff2681 100644 --- a/test/unit/support.js +++ b/test/unit/support.js @@ -195,6 +195,23 @@ testIframeWithCallback( "radioValue": true, "reliableMarginLeft": false }; + } else if ( /iphone os 9/i.test( userAgent ) ) { + expected = { + "ajax": true, + "boxSizingReliable": true, + "checkClone": true, + "checkOn": true, + "clearCloneStyle": true, + "cors": true, + "createHTMLDocument": true, + "focusin": false, + "noCloneChecked": true, + "optSelected": true, + "pixelMarginRight": true, + "pixelPosition": false, + "radioValue": true, + "reliableMarginLeft": true + }; } else if ( /iphone os 8/i.test( userAgent ) ) { expected = { "ajax": true, From 47e2aa6593a77c94eef610ac784494884f598253 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82=C4=99biowski?= Date: Fri, 30 Oct 2015 19:14:41 +0100 Subject: [PATCH 043/927] Tests: Remove Safari 7.0 & iOS 6 support tests results --- test/unit/support.js | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/test/unit/support.js b/test/unit/support.js index a76cff2681..b3a85dd6ec 100644 --- a/test/unit/support.js +++ b/test/unit/support.js @@ -161,23 +161,6 @@ testIframeWithCallback( "radioValue": true, "reliableMarginLeft": true }; - } else if ( /7\.0(\.\d+|) safari/i.test( userAgent ) ) { - expected = { - "ajax": true, - "boxSizingReliable": true, - "checkClone": true, - "checkOn": true, - "clearCloneStyle": true, - "cors": true, - "createHTMLDocument": true, - "focusin": false, - "noCloneChecked": true, - "optSelected": true, - "pixelMarginRight": true, - "pixelPosition": false, - "radioValue": true, - "reliableMarginLeft": true - }; } else if ( /firefox/i.test( userAgent ) ) { expected = { "ajax": true, @@ -229,7 +212,7 @@ testIframeWithCallback( "radioValue": true, "reliableMarginLeft": true }; - } else if ( /iphone os (6|7)/i.test( userAgent ) ) { + } else if ( /iphone os 7/i.test( userAgent ) ) { expected = { "ajax": true, "boxSizingReliable": true, From 015d16c02dae770eda88e644ec69ce82f25c0412 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82=C4=99biowski?= Date: Fri, 30 Oct 2015 19:16:27 +0100 Subject: [PATCH 044/927] Tests: Make regexes for iOS devices more rigid --- test/unit/support.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/unit/support.js b/test/unit/support.js index b3a85dd6ec..6a51ccb8ab 100644 --- a/test/unit/support.js +++ b/test/unit/support.js @@ -178,7 +178,7 @@ testIframeWithCallback( "radioValue": true, "reliableMarginLeft": false }; - } else if ( /iphone os 9/i.test( userAgent ) ) { + } else if ( /iphone os 9_/i.test( userAgent ) ) { expected = { "ajax": true, "boxSizingReliable": true, @@ -195,7 +195,7 @@ testIframeWithCallback( "radioValue": true, "reliableMarginLeft": true }; - } else if ( /iphone os 8/i.test( userAgent ) ) { + } else if ( /iphone os 8_/i.test( userAgent ) ) { expected = { "ajax": true, "boxSizingReliable": true, @@ -212,7 +212,7 @@ testIframeWithCallback( "radioValue": true, "reliableMarginLeft": true }; - } else if ( /iphone os 7/i.test( userAgent ) ) { + } else if ( /iphone os 7_/i.test( userAgent ) ) { expected = { "ajax": true, "boxSizingReliable": true, From 70605c8e5655da996ebd395e3c43423daaa08d9c Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Thu, 22 Oct 2015 14:25:32 -0400 Subject: [PATCH 045/927] Ajax: Only form-encode requests with a body Fixes #2658 Closes #2671 --- src/ajax.js | 6 ++++++ src/serialize.js | 4 ++-- test/unit/ajax.js | 42 ++++++++++++++++++++++++++++++++++++++++++ test/unit/serialize.js | 30 +++++++++++++++--------------- 4 files changed, 65 insertions(+), 17 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index efc4136505..289eb2795e 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -12,6 +12,7 @@ define( [ ], function( jQuery, document, rnotwhite, location, nonce, rquery ) { var + r20 = /%20/g, rhash = /#.*$/, rts = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, @@ -601,6 +602,11 @@ jQuery.extend( { // Otherwise add one to the end cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++; } + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); } // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. diff --git a/src/serialize.js b/src/serialize.js index 94698fc2fc..a0b9484606 100644 --- a/src/serialize.js +++ b/src/serialize.js @@ -6,7 +6,7 @@ define( [ "./attributes/prop" ], function( jQuery, rcheckableType ) { -var r20 = /%20/g, +var rbracket = /\[\]$/, rCRLF = /\r?\n/g, rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, @@ -85,7 +85,7 @@ jQuery.param = function( a, traditional ) { } // Return the resulting serialization - return s.join( "&" ).replace( r20, "+" ); + return s.join( "&" ); }; jQuery.fn.extend( { diff --git a/test/unit/ajax.js b/test/unit/ajax.js index ba11c90ee4..7710f9e35b 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -1129,6 +1129,48 @@ QUnit.module( "ajax", { }; } ); + ajaxTest( "jQuery.ajax() - data - x-www-form-urlencoded (gh-2658)", 1, function( assert ) { + return { + url: "bogus.html", + data: { devo: "A Beautiful World" }, + type: "post", + beforeSend: function( _, s ) { + assert.strictEqual( s.data, "devo=A+Beautiful+World", "data is '+'-encoded" ); + return false; + }, + error: true + }; + } ); + + ajaxTest( "jQuery.ajax() - data - text/plain (gh-2658)", 1, function( assert ) { + return { + url: "bogus.html", + data: { devo: "A Beautiful World" }, + type: "post", + contentType: "text/plain", + beforeSend: function( _, s ) { + assert.strictEqual( s.data, "devo=A%20Beautiful%20World", "data is %20-encoded" ); + return false; + }, + error: true + }; + } ); + + ajaxTest( "jQuery.ajax() - data - no processing ", 1, function( assert ) { + return { + url: "bogus.html", + data: { devo: "A Beautiful World" }, + type: "post", + contentType: "x-special-sauce", + processData: false, + beforeSend: function( _, s ) { + assert.deepEqual( s.data, { devo: "A Beautiful World" }, "data is not processed" ); + return false; + }, + error: true + }; + } ); + var ifModifiedNow = new Date(); jQuery.each( diff --git a/test/unit/serialize.js b/test/unit/serialize.js index a64593603b..0eb98560f7 100644 --- a/test/unit/serialize.js +++ b/test/unit/serialize.js @@ -8,7 +8,7 @@ QUnit.test( "jQuery.param()", function( assert ) { assert.equal( !( jQuery.ajaxSettings && jQuery.ajaxSettings.traditional ), true, "traditional flag, falsy by default" ); params = { "foo":"bar", "baz":42, "quux":"All your base are belong to us" }; - assert.equal( jQuery.param( params ), "foo=bar&baz=42&quux=All+your+base+are+belong+to+us", "simple" ); + assert.equal( jQuery.param( params ), "foo=bar&baz=42&quux=All%20your%20base%20are%20belong%20to%20us", "simple" ); params = { "string":"foo","null":null,"undefined":undefined }; assert.equal( jQuery.param( params ), "string=foo&null=&undefined=", "handle nulls and undefineds properly" ); @@ -20,19 +20,19 @@ QUnit.test( "jQuery.param()", function( assert ) { assert.equal( jQuery.param( params ), "foo%5B%5D=a&foo%5B%5D=b&foo%5B%5D=c", "with array of strings" ); params = { "foo": [ "baz", 42, "All your base are belong to us" ] }; - assert.equal( jQuery.param( params ), "foo%5B%5D=baz&foo%5B%5D=42&foo%5B%5D=All+your+base+are+belong+to+us", "more array" ); + assert.equal( jQuery.param( params ), "foo%5B%5D=baz&foo%5B%5D=42&foo%5B%5D=All%20your%20base%20are%20belong%20to%20us", "more array" ); params = { "foo": { "bar": "baz", "beep": 42, "quux": "All your base are belong to us" } }; - assert.equal( jQuery.param( params ), "foo%5Bbar%5D=baz&foo%5Bbeep%5D=42&foo%5Bquux%5D=All+your+base+are+belong+to+us", "even more arrays" ); + assert.equal( jQuery.param( params ), "foo%5Bbar%5D=baz&foo%5Bbeep%5D=42&foo%5Bquux%5D=All%20your%20base%20are%20belong%20to%20us", "even more arrays" ); params = { a:[ 1,2 ], b:{ c:3, d:[ 4,5 ], e:{ x:[ 6 ], y:7, z:[ 8,9 ] }, f:true, g:false, h:undefined }, i:[ 10,11 ], j:true, k:false, l:[ undefined,0 ], m:"cowboy hat?" }; - assert.equal( decodeURIComponent( jQuery.param( params ) ), "a[]=1&a[]=2&b[c]=3&b[d][]=4&b[d][]=5&b[e][x][]=6&b[e][y]=7&b[e][z][]=8&b[e][z][]=9&b[f]=true&b[g]=false&b[h]=&i[]=10&i[]=11&j=true&k=false&l[]=&l[]=0&m=cowboy+hat?", "huge structure" ); + assert.equal( decodeURIComponent( jQuery.param( params ) ), "a[]=1&a[]=2&b[c]=3&b[d][]=4&b[d][]=5&b[e][x][]=6&b[e][y]=7&b[e][z][]=8&b[e][z][]=9&b[f]=true&b[g]=false&b[h]=&i[]=10&i[]=11&j=true&k=false&l[]=&l[]=0&m=cowboy hat?", "huge structure" ); params = { "a": [ 0, [ 1, 2 ], [ 3, [ 4, 5 ], [ 6 ] ], { "b": [ 7, [ 8, 9 ], [ { "c": 10, "d": 11 } ], [ [ 12 ] ], [ [ [ 13 ] ] ], { "e": { "f": { "g": [ 14, [ 15 ] ] } } }, 16 ] }, 17 ] }; assert.equal( decodeURIComponent( jQuery.param( params ) ), "a[]=0&a[1][]=1&a[1][]=2&a[2][]=3&a[2][1][]=4&a[2][1][]=5&a[2][2][]=6&a[3][b][]=7&a[3][b][1][]=8&a[3][b][1][]=9&a[3][b][2][0][c]=10&a[3][b][2][0][d]=11&a[3][b][3][0][]=12&a[3][b][4][0][0][]=13&a[3][b][5][e][f][g][]=14&a[3][b][5][e][f][g][1][]=15&a[3][b][]=16&a[]=17", "nested arrays" ); params = { "a":[ 1,2 ], "b":{ "c":3, "d":[ 4,5 ], "e":{ "x":[ 6 ], "y":7, "z":[ 8,9 ] }, "f":true, "g":false, "h":undefined }, "i":[ 10,11 ], "j":true, "k":false, "l":[ undefined,0 ], "m":"cowboy hat?" }; - assert.equal( jQuery.param( params, true ), "a=1&a=2&b=%5Bobject+Object%5D&i=10&i=11&j=true&k=false&l=&l=0&m=cowboy+hat%3F", "huge structure, forced traditional" ); + assert.equal( jQuery.param( params, true ), "a=1&a=2&b=%5Bobject%20Object%5D&i=10&i=11&j=true&k=false&l=&l=0&m=cowboy%20hat%3F", "huge structure, forced traditional" ); assert.equal( decodeURIComponent( jQuery.param( { "a": [ 1,2,3 ], "b[]": [ 4,5,6 ], "c[d]": [ 7,8,9 ], "e": { "f": [ 10 ], "g": [ 11,12 ], "h": 13 } } ) ), "a[]=1&a[]=2&a[]=3&b[]=4&b[]=5&b[]=6&c[d][]=7&c[d][]=8&c[d][]=9&e[f][]=10&e[g][]=11&e[g][]=12&e[h]=13", "Make sure params are not double-encoded." ); @@ -48,7 +48,7 @@ QUnit.test( "jQuery.param()", function( assert ) { } params = { "foo":"bar", "baz":42, "quux":"All your base are belong to us" }; - assert.equal( jQuery.param( params ), "foo=bar&baz=42&quux=All+your+base+are+belong+to+us", "simple" ); + assert.equal( jQuery.param( params ), "foo=bar&baz=42&quux=All%20your%20base%20are%20belong%20to%20us", "simple" ); params = { "someName": [ 1, 2, 3 ], "regularThing": "blah" }; assert.equal( jQuery.param( params ), "someName=1&someName=2&someName=3®ularThing=blah", "with array" ); @@ -57,19 +57,19 @@ QUnit.test( "jQuery.param()", function( assert ) { assert.equal( jQuery.param( params ), "foo=a&foo=b&foo=c", "with array of strings" ); params = { "foo[]":[ "baz", 42, "All your base are belong to us" ] }; - assert.equal( jQuery.param( params ), "foo%5B%5D=baz&foo%5B%5D=42&foo%5B%5D=All+your+base+are+belong+to+us", "more array" ); + assert.equal( jQuery.param( params ), "foo%5B%5D=baz&foo%5B%5D=42&foo%5B%5D=All%20your%20base%20are%20belong%20to%20us", "more array" ); params = { "foo[bar]":"baz", "foo[beep]":42, "foo[quux]":"All your base are belong to us" }; - assert.equal( jQuery.param( params ), "foo%5Bbar%5D=baz&foo%5Bbeep%5D=42&foo%5Bquux%5D=All+your+base+are+belong+to+us", "even more arrays" ); + assert.equal( jQuery.param( params ), "foo%5Bbar%5D=baz&foo%5Bbeep%5D=42&foo%5Bquux%5D=All%20your%20base%20are%20belong%20to%20us", "even more arrays" ); params = { a:[ 1,2 ], b:{ c:3, d:[ 4,5 ], e:{ x:[ 6 ], y:7, z:[ 8,9 ] }, f:true, g:false, h:undefined }, i:[ 10,11 ], j:true, k:false, l:[ undefined,0 ], m:"cowboy hat?" }; - assert.equal( jQuery.param( params ), "a=1&a=2&b=%5Bobject+Object%5D&i=10&i=11&j=true&k=false&l=&l=0&m=cowboy+hat%3F", "huge structure" ); + assert.equal( jQuery.param( params ), "a=1&a=2&b=%5Bobject%20Object%5D&i=10&i=11&j=true&k=false&l=&l=0&m=cowboy%20hat%3F", "huge structure" ); params = { "a": [ 0, [ 1, 2 ], [ 3, [ 4, 5 ], [ 6 ] ], { "b": [ 7, [ 8, 9 ], [ { "c": 10, d: 11 } ], [ [ 12 ] ], [ [ [ 13 ] ] ], { "e": { "f": { "g": [ 14, [ 15 ] ] } } }, 16 ] }, 17 ] }; - assert.equal( jQuery.param( params ), "a=0&a=1%2C2&a=3%2C4%2C5%2C6&a=%5Bobject+Object%5D&a=17", "nested arrays (not possible when jQuery.param.traditional == true)" ); + assert.equal( jQuery.param( params ), "a=0&a=1%2C2&a=3%2C4%2C5%2C6&a=%5Bobject%20Object%5D&a=17", "nested arrays (not possible when jQuery.param.traditional == true)" ); params = { a:[ 1,2 ], b:{ c:3, d:[ 4,5 ], e:{ x:[ 6 ], y:7, z:[ 8,9 ] }, f:true, g:false, h:undefined }, i:[ 10,11 ], j:true, k:false, l:[ undefined,0 ], m:"cowboy hat?" }; - assert.equal( decodeURIComponent( jQuery.param( params, false ) ), "a[]=1&a[]=2&b[c]=3&b[d][]=4&b[d][]=5&b[e][x][]=6&b[e][y]=7&b[e][z][]=8&b[e][z][]=9&b[f]=true&b[g]=false&b[h]=&i[]=10&i[]=11&j=true&k=false&l[]=&l[]=0&m=cowboy+hat?", "huge structure, forced not traditional" ); + assert.equal( decodeURIComponent( jQuery.param( params, false ) ), "a[]=1&a[]=2&b[c]=3&b[d][]=4&b[d][]=5&b[e][x][]=6&b[e][y]=7&b[e][z][]=8&b[e][z][]=9&b[f]=true&b[g]=false&b[h]=&i[]=10&i[]=11&j=true&k=false&l[]=&l[]=0&m=cowboy hat?", "huge structure, forced not traditional" ); params = { "param1": null }; assert.equal( jQuery.param( params, false ), "param1=", "Make sure that null params aren't traversed." ); @@ -131,19 +131,19 @@ QUnit.test( "serialize()", function( assert ) { "Check input serialization as query string" ); assert.equal( jQuery( "#testForm" ).serialize(), - "T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=", + "T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My%20Name=me&S1=abc&S3=YES&S4=", "Check form serialization as query string" ); assert.equal( jQuery( "input,select,textarea,button", "#testForm" ).serialize(), - "T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=", + "T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My%20Name=me&S1=abc&S3=YES&S4=", "Check input serialization as query string" ); assert.equal( jQuery( "#form, #testForm" ).serialize(), - "action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&email=dave%40jquery.com&number=43&select1=&select2=3&select3=1&select3=2&select5=3&T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=", + "action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&email=dave%40jquery.com&number=43&select1=&select2=3&select3=1&select3=2&select5=3&T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My%20Name=me&S1=abc&S3=YES&S4=", "Multiple form serialization as query string" ); assert.equal( jQuery( "#form, #testForm :input" ).serialize(), - "action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&email=dave%40jquery.com&number=43&select1=&select2=3&select3=1&select3=2&select5=3&T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=", + "action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&email=dave%40jquery.com&number=43&select1=&select2=3&select3=1&select3=2&select5=3&T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My%20Name=me&S1=abc&S3=YES&S4=", "Mixed form/input serialization as query string" ); jQuery( "#html5email, #html5number" ).remove(); } ); From 76e9a95dbeaf28fbc5a64571ebb5959f91a9c14a Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Mon, 2 Nov 2015 12:00:28 -0500 Subject: [PATCH 046/927] Ajax: trigger error callback on native abort - IE9 does not have onabort. Use onreadystatechange instead. Fixes gh-2079 Close gh-2684 --- src/ajax/xhr.js | 49 +++++++++++++++++++++++++++++++++++++++-------- test/unit/ajax.js | 21 +++++++++++++++++++- 2 files changed, 61 insertions(+), 9 deletions(-) diff --git a/src/ajax/xhr.js b/src/ajax/xhr.js index 7ac141e64a..fd4a733e53 100644 --- a/src/ajax/xhr.js +++ b/src/ajax/xhr.js @@ -25,7 +25,7 @@ support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); support.ajax = xhrSupported = !!xhrSupported; jQuery.ajaxTransport( function( options ) { - var callback; + var callback, errorCallback; // Cross domain only allowed if supported through XMLHttpRequest if ( support.cors || xhrSupported && !options.crossDomain ) { @@ -72,17 +72,26 @@ jQuery.ajaxTransport( function( options ) { callback = function( type ) { return function() { if ( callback ) { - callback = xhr.onload = xhr.onerror = null; + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; if ( type === "abort" ) { xhr.abort(); } else if ( type === "error" ) { - complete( - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); + // Support: IE9 + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } } else { complete( xhrSuccessStatus[ xhr.status ] || xhr.status, @@ -103,7 +112,31 @@ jQuery.ajaxTransport( function( options ) { // Listen to events xhr.onload = callback(); - xhr.onerror = callback( "error" ); + errorCallback = xhr.onerror = callback( "error" ); + + // Support: IE9 + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } // Create the abort callback callback = callback( "abort" ); diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 7710f9e35b..4f05306563 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -38,7 +38,7 @@ QUnit.module( "ajax", { ); ajaxTest( "jQuery.ajax() - success callbacks", 8, function( assert ) { - return { + return { setup: addGlobalEvents( "ajaxStart ajaxStop ajaxSend ajaxComplete ajaxSuccess", assert ), url: url( "data/name.html" ), beforeSend: function() { @@ -437,6 +437,25 @@ QUnit.module( "ajax", { }; } ); + ajaxTest( "jQuery.ajax() - native abort", 2, function( assert ) { + return { + url: url( "data/name.php?wait=1" ), + xhr: function() { + var xhr = new window.XMLHttpRequest(); + setTimeout( function() { + xhr.abort(); + }, 100 ); + return xhr; + }, + error: function( xhr, msg ) { + assert.strictEqual( msg, "error", "Native abort triggers error callback" ); + }, + complete: function() { + assert.ok( true, "complete" ); + } + }; + } ); + ajaxTest( "jQuery.ajax() - events with context", 12, function( assert ) { var context = document.createElement( "div" ); From 769446c69775f6c44e35cee1bcdeccafba51be7b Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Sat, 31 Oct 2015 11:24:04 -0400 Subject: [PATCH 047/927] Ajax: Don't throw exceptions on binary data response Fixes gh-2498 Closes gh-2682 The added unit test shows how this could be used to support an ArrayBuffer return, but $.ajax does not support it natively. The goal with this change was to avoid the exception. --- src/ajax/xhr.js | 13 +++++++------ test/unit/ajax.js | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/ajax/xhr.js b/src/ajax/xhr.js index fd4a733e53..db670ff15c 100644 --- a/src/ajax/xhr.js +++ b/src/ajax/xhr.js @@ -97,12 +97,13 @@ jQuery.ajaxTransport( function( options ) { xhrSuccessStatus[ xhr.status ] || xhr.status, xhr.statusText, - // Support: IE9 - // Accessing binary-data responseText throws an exception - // (#11426) - typeof xhr.responseText === "string" ? { - text: xhr.responseText - } : undefined, + // Support: IE9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, xhr.getAllResponseHeaders() ); } diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 4f05306563..12bf2ab31f 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -1660,6 +1660,30 @@ QUnit.module( "ajax", { }; } ); +if ( typeof window.ArrayBuffer === "undefined" || typeof new XMLHttpRequest().responseType !== "string" ) { + + QUnit.skip( "No ArrayBuffer support in XHR", jQuery.noop ); +} else { + + // No built-in support for binary data, but it's easy to add via a prefilter + jQuery.ajaxPrefilter( "arraybuffer", function ( s ) { + s.xhrFields = { responseType: "arraybuffer" }; + s.responseFields.arraybuffer = "response"; + s.converters[ "binary arraybuffer" ] = true; + }); + + ajaxTest( "gh-2498 - jQuery.ajax() - binary data shouldn't throw an exception", 2, function( assert ) { + return { + url: url( "data/1x1.jpg" ), + dataType: "arraybuffer", + success: function( data, s, jqxhr ) { + assert.ok( data instanceof window.ArrayBuffer, "correct data type" ); + assert.ok( jqxhr.response instanceof window.ArrayBuffer, "data in jQXHR" ); + } + }; + } ); +} + QUnit.asyncTest( "#11743 - jQuery.ajax() - script, throws exception", 1, function( assert ) { // Support: Android 2.3 only From 493b0fd7f51054345abe981270bd7839825f79dd Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Sun, 18 Oct 2015 12:24:01 -0400 Subject: [PATCH 048/927] Event: Ensure delegation doesn't error on comment nodes Fixes gh-2055 Close gh-2659 --- test/unit/event.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/test/unit/event.js b/test/unit/event.js index 479f805db7..26d972a5b5 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -1852,6 +1852,33 @@ QUnit.test( "delegated event with intermediate DOM manipulation (#13208)", funct jQuery( "#anchor2" ).trigger( "click" ); } ); +QUnit.test( "ignore comment nodes in event delegation (gh-2055)", function( assert ) { + assert.expect( 1 ); + + // Test if DOMNodeInserted is supported + // This is a back-up for when DOMNodeInserted support + // is eventually removed from browsers + function test() { + var ret = false; + var $fixture = jQuery( "#qunit-fixture" ); + $fixture.on( "DOMNodeInserted", function() { + ret = true; + $fixture.off( "DOMNodeInserted" ); + } ).append( "
" ); + return ret; + } + + var $foo = jQuery( "#foo" ).on( "DOMNodeInserted", "[id]", function() { + assert.ok( true, "No error thrown on comment node" ); + } ), + $comment = jQuery( document.createComment( "comment" ) ) + .appendTo( $foo.find( "#sap" ) ); + + if ( !test() ) { + fireNative( $comment[0], "DOMNodeInserted" ); + } +} ); + QUnit.test( "stopPropagation() stops directly-bound events on delegated target", function( assert ) { assert.expect( 1 ); From e05c63e17a037d550e7dde5d805ee5c4214ee44b Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Wed, 4 Nov 2015 13:27:39 -0500 Subject: [PATCH 049/927] Event: Add basic unit tests for event aliases Fixes gh-2302 Closes gh-2687 At the moment it's not possible to run the full event unit tests without aliases so this was just tested with a custom build by running this one test. --- test/unit/event.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/unit/event.js b/test/unit/event.js index 26d972a5b5..e82db243f1 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -2843,6 +2843,24 @@ QUnit.test( "originalEvent property for Chrome, Safari, Fx & Edge of simulated e jQuery( "#donor-input" ).trigger( "focus" ); } ); +QUnit[ jQuery.fn.click ? "test" : "skip" ]( "Event aliases", function( assert ) { + + // Explicitly skipping focus/blur events due to their flakiness + var $elem = jQuery( "
" ).appendTo( "#qunit-fixture" ), + aliases = ( "resize scroll click dblclick mousedown mouseup " + + "mousemove mouseover mouseout mouseenter mouseleave change " + + "select submit keydown keypress keyup contextmenu" ).split( " " ); + assert.expect( aliases.length ); + + jQuery.each( aliases, function( i, name ) { + + // e.g. $(elem).click(...).click(); + $elem[ name ]( function( event ) { + assert.equal( event.type, name, "triggered " + name ); + } )[ name ]().off( name ); + } ); +} ); + // These tests are unreliable in Firefox if ( !( /firefox/i.test( window.navigator.userAgent ) ) ) { QUnit.test( "Check order of focusin/focusout events", function( assert ) { From 79fc806e8500372a2278795c068d039ee287535f Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Wed, 4 Nov 2015 18:34:14 -0500 Subject: [PATCH 050/927] Attributes: return empty array for select-multiple with no values Fixes gh-2562 Close gh-2689 --- src/attributes/val.js | 2 +- test/unit/attributes.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/attributes/val.js b/src/attributes/val.js index caf0126d4c..5f0b73e008 100644 --- a/src/attributes/val.js +++ b/src/attributes/val.js @@ -90,7 +90,7 @@ jQuery.extend( { var value, option, options = elem.options, index = elem.selectedIndex, - one = elem.type === "select-one" || index < 0, + one = elem.type === "select-one", values = one ? null : [], max = one ? index + 1 : options.length, i = index < 0 ? diff --git a/test/unit/attributes.js b/test/unit/attributes.js index 9ea29a1053..9bf2876881 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -903,10 +903,10 @@ QUnit.test( "val() with non-matching values on dropdown list", function( assert var select6 = jQuery( "" ).appendTo( "#form" ); jQuery( select6 ).val( "nothing" ); - assert.equal( jQuery( select6 ).val(), null, "Non-matching set (single value) on select-multiple" ); + assert.deepEqual( jQuery( select6 ).val(), [], "Non-matching set (single value) on select-multiple" ); jQuery( select6 ).val( [ "nothing1", "nothing2" ] ); - assert.equal( jQuery( select6 ).val(), null, "Non-matching set (array of values) on select-multiple" ); + assert.deepEqual( jQuery( select6 ).val(), [], "Non-matching set (array of values) on select-multiple" ); select6.remove(); } ); From 1da144867f3a49bbac4342bd3f3242baae108eb9 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Thu, 5 Nov 2015 18:13:00 -0500 Subject: [PATCH 051/927] Tests: make editorconfig match css style --- .editorconfig | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.editorconfig b/.editorconfig index a7ed4a83a5..06dbe065b1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -24,5 +24,4 @@ indent_style = tab indent_style = tab [test/**.css] -indent_style = space -indent_size = 8 +indent_style = tab From c9935b6d2db9e1be4bed12f7419e98cdca45763e Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Wed, 4 Nov 2015 21:53:09 -0500 Subject: [PATCH 052/927] Event: Separate trigger/simulate into its own module Fixes gh-1864 Closes gh-2692 This also pulls the focusin/out special event into its own module, since that depends on simulate(). NB: The ajax module triggers events pretty heavily. --- README.md | 2 + src/ajax.js | 2 + src/event.js | 226 +------------------------------------------ src/event/alias.js | 4 +- src/event/focusin.js | 53 ++++++++++ src/event/trigger.js | 199 +++++++++++++++++++++++++++++++++++++ src/jquery.js | 1 + 7 files changed, 261 insertions(+), 226 deletions(-) create mode 100644 src/event/focusin.js create mode 100644 src/event/trigger.js diff --git a/README.md b/README.md index 53b6f3fd73..99bcb2355b 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,8 @@ Some example modules that can be excluded are: - **effects**: The `.animate()` method and its shorthands such as `.slideUp()` or `.hide("slow")`. - **event**: The `.on()` and `.off()` methods and all event functionality. Also removes `event/alias`. - **event/alias**: All event attaching/triggering shorthands like `.click()` or `.mouseover()`. +- **event/focusin**: Cross-browser support for the focusin and focusout events. +- **event/trigger**: The `.trigger()` and `.triggerHandler()` methods. Used by **alias** and **focusin** modules. - **offset**: The `.offset()`, `.position()`, `.offsetParent()`, `.scrollLeft()`, and `.scrollTop()` methods. - **wrap**: The `.wrap()`, `.wrapAll()`, `.wrapInner()`, and `.unwrap()` methods. - **core/ready**: Exclude the ready module if you place your scripts at the end of the body. Any ready callbacks bound with `jQuery()` will simply be called immediately. However, `jQuery(document).ready()` will not be a function and `.on("ready", ...)` or similar will not be triggered. diff --git a/src/ajax.js b/src/ajax.js index 289eb2795e..ca2b910dd0 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -5,9 +5,11 @@ define( [ "./ajax/var/location", "./ajax/var/nonce", "./ajax/var/rquery", + "./core/init", "./ajax/parseJSON", "./ajax/parseXML", + "./event/trigger", "./deferred" ], function( jQuery, document, rnotwhite, location, nonce, rquery ) { diff --git a/src/event.js b/src/event.js index 9d06781b74..ddd92c5fc7 100644 --- a/src/event.js +++ b/src/event.js @@ -2,20 +2,16 @@ define( [ "./core", "./var/document", "./var/rnotwhite", - "./var/hasOwn", "./var/slice", - "./event/support", "./data/var/dataPriv", - "./data/var/acceptData", "./core/init", "./selector" -], function( jQuery, document, rnotwhite, hasOwn, slice, support, dataPriv, acceptData ) { +], function( jQuery, document, rnotwhite, slice, dataPriv ) { var rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rtypenamespace = /^([^.]*)(?:\.(.+)|)/; function returnTrue() { @@ -283,141 +279,6 @@ jQuery.event = { } }, - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - dispatch: function( event ) { // Make a writable jQuery.Event from the native event object @@ -667,37 +528,6 @@ jQuery.event = { } } } - }, - - // Piggyback on a donor event to simulate a different one - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - - // Previously, `originalEvent: {}` was set here, so stopPropagation call - // would not be triggered on donor event, since in our own - // jQuery.event.stopPropagation function we had a check for existence of - // originalEvent.stopPropagation method, so, consequently it would be a noop. - // - // But now, this "simulate" function is used only for events - // for which stopPropagation() is noop, so there is no need for that anymore. - // - // For the compat branch though, guard for "click" and "submit" - // events is still used, but was moved to jQuery.event.stopPropagation function - // because `originalEvent` should point to the original event for the constancy - // with other events and for more focused logic - } - ); - - jQuery.event.trigger( e, null, elem ); - - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } } }; @@ -823,48 +653,6 @@ jQuery.each( { }; } ); -// Support: Firefox -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome, Safari -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} - jQuery.fn.extend( { on: function( types, selector, data, fn ) { @@ -908,18 +696,6 @@ jQuery.fn.extend( { return this.each( function() { jQuery.event.remove( this, types, fn, selector ); } ); - }, - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } } } ); diff --git a/src/event/alias.js b/src/event/alias.js index 75467353cc..b1b8f701f4 100644 --- a/src/event/alias.js +++ b/src/event/alias.js @@ -1,6 +1,8 @@ define( [ "../core", - "../event" + + "../event", + "./trigger" ], function( jQuery ) { jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + diff --git a/src/event/focusin.js b/src/event/focusin.js new file mode 100644 index 0000000000..ae7f831a86 --- /dev/null +++ b/src/event/focusin.js @@ -0,0 +1,53 @@ +define( [ + "../core", + "../data/var/dataPriv", + "./support", + + "../event", + "./trigger" +], function( jQuery, dataPriv, support ) { + +// Support: Firefox +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome, Safari +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} + +return jQuery; +} ); diff --git a/src/event/trigger.js b/src/event/trigger.js new file mode 100644 index 0000000000..448f90878d --- /dev/null +++ b/src/event/trigger.js @@ -0,0 +1,199 @@ +define( [ + "../core", + "../var/document", + "../data/var/dataPriv", + "../data/var/acceptData", + "../var/hasOwn", + + "../event" +], function( jQuery, document, dataPriv, acceptData, hasOwn ) { + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + + // Previously, `originalEvent: {}` was set here, so stopPropagation call + // would not be triggered on donor event, since in our own + // jQuery.event.stopPropagation function we had a check for existence of + // originalEvent.stopPropagation method, so, consequently it would be a noop. + // + // But now, this "simulate" function is used only for events + // for which stopPropagation() is noop, so there is no need for that anymore. + // + // For the compat branch though, guard for "click" and "submit" + // events is still used, but was moved to jQuery.event.stopPropagation function + // because `originalEvent` should point to the original event for the constancy + // with other events and for more focused logic + } + ); + + jQuery.event.trigger( e, null, elem ); + + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + +return jQuery; +} ); diff --git a/src/jquery.js b/src/jquery.js index 66a42808ee..2faa9c3cda 100644 --- a/src/jquery.js +++ b/src/jquery.js @@ -11,6 +11,7 @@ define( [ "./attributes", "./event", "./event/alias", + "./event/focusin", "./manipulation", "./manipulation/_evalUrl", "./wrap", From 2cb8ebadcb77da1c1a12c07bc5274fd456bf3b01 Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Fri, 6 Nov 2015 09:59:14 -0500 Subject: [PATCH 053/927] Event: Make event aliases optional in unit tests --- test/data/event/focusElem.html | 2 +- test/unit/event.js | 85 ++++++++++++++++------------------ 2 files changed, 42 insertions(+), 45 deletions(-) diff --git a/test/data/event/focusElem.html b/test/data/event/focusElem.html index 10726b4ff6..a9a9765184 100644 --- a/test/data/event/focusElem.html +++ b/test/data/event/focusElem.html @@ -9,7 +9,7 @@ diff --git a/test/unit/event.js b/test/unit/event.js index e82db243f1..6193075676 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -900,49 +900,6 @@ QUnit.test( "mouseenter, mouseleave don't catch exceptions", function( assert ) } } ); -if ( jQuery.fn.click ) { - - QUnit.test( "trigger() shortcuts", function( assert ) { - assert.expect( 5 ); - - var counter, clickCounter, - elem = jQuery( "
  • Change location
  • " ).prependTo( "#firstUL" ); - elem.find( "a" ).on( "click", function() { - var close = jQuery( "spanx", this ); // same with jQuery(this).find("span"); - assert.equal( close.length, 0, "Context element does not exist, length must be zero" ); - assert.ok( !close[ 0 ], "Context element does not exist, direct access to element must return undefined" ); - return false; - } ).click(); - - // manually clean up detached elements - elem.remove(); - - jQuery( "#check1" ).click( function() { - assert.ok( true, "click event handler for checkbox gets fired twice, see #815" ); - } ).click(); - - counter = 0; - jQuery( "#firstp" )[ 0 ].onclick = function() { - counter++; - }; - jQuery( "#firstp" ).click(); - assert.equal( counter, 1, "Check that click, triggers onclick event handler also" ); - - clickCounter = 0; - jQuery( "#simon1" )[ 0 ].onclick = function() { - clickCounter++; - }; - jQuery( "#simon1" ).click(); - assert.equal( clickCounter, 1, "Check that click, triggers onclick event handler on an a tag also" ); - - // test that special handlers do not blow up with VML elements (#7071) - jQuery( "" ).appendTo( "head" ); - jQuery( " " ).appendTo( "#form" ); - jQuery( "#oval" ).click().keydown(); - } ); - -} - QUnit.test( "trigger() bubbling", function( assert ) { assert.expect( 18 ); @@ -2778,7 +2735,7 @@ QUnit.test( "preventDefault() on focusin does not throw exception", function( as "Preventing default on focusin throws no exception" ); done(); - } ).focus(); + } ).trigger( "focus" ); } ); QUnit.test( "Donor event interference", function( assert ) { @@ -2843,6 +2800,46 @@ QUnit.test( "originalEvent property for Chrome, Safari, Fx & Edge of simulated e jQuery( "#donor-input" ).trigger( "focus" ); } ); + +QUnit[ jQuery.fn.click ? "test" : "skip" ]( "trigger() shortcuts", function( assert ) { + assert.expect( 5 ); + + var counter, clickCounter, + elem = jQuery( "
  • Change location
  • " ).prependTo( "#firstUL" ); + elem.find( "a" ).on( "click", function() { + var close = jQuery( "spanx", this ); // same with jQuery(this).find("span"); + assert.equal( close.length, 0, "Context element does not exist, length must be zero" ); + assert.ok( !close[ 0 ], "Context element does not exist, direct access to element must return undefined" ); + return false; + } ).click(); + + // manually clean up detached elements + elem.remove(); + + jQuery( "#check1" ).click( function() { + assert.ok( true, "click event handler for checkbox gets fired twice, see #815" ); + } ).click(); + + counter = 0; + jQuery( "#firstp" )[ 0 ].onclick = function() { + counter++; + }; + jQuery( "#firstp" ).click(); + assert.equal( counter, 1, "Check that click, triggers onclick event handler also" ); + + clickCounter = 0; + jQuery( "#simon1" )[ 0 ].onclick = function() { + clickCounter++; + }; + jQuery( "#simon1" ).click(); + assert.equal( clickCounter, 1, "Check that click, triggers onclick event handler on an a tag also" ); + + // test that special handlers do not blow up with VML elements (#7071) + jQuery( "" ).appendTo( "head" ); + jQuery( " " ).appendTo( "#form" ); + jQuery( "#oval" ).click().keydown(); +} ); + QUnit[ jQuery.fn.click ? "test" : "skip" ]( "Event aliases", function( assert ) { // Explicitly skipping focus/blur events due to their flakiness From 7d44d7f9e7cb73ff2b373f08cea13ea9958bb462 Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Fri, 6 Nov 2015 12:24:06 -0500 Subject: [PATCH 054/927] Dimensions: outerWidth/Height include scrollbar Fixes gh-1729 Closes gh-2694 --- src/dimensions.js | 8 ++-- test/unit/dimensions.js | 83 +++++++++++++++++++++-------------------- 2 files changed, 47 insertions(+), 44 deletions(-) diff --git a/src/dimensions.js b/src/dimensions.js index 30b55fbc0e..c5f49ac093 100644 --- a/src/dimensions.js +++ b/src/dimensions.js @@ -19,10 +19,10 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { if ( jQuery.isWindow( elem ) ) { - // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there - // isn't a whole lot we can do. See pull request at this URL for discussion: - // https://github.com/jquery/jquery/pull/764 - return elem.document.documentElement[ "client" + name ]; + // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) + return funcName.indexOf( "outer" ) === 0 ? + elem[ "inner" + name ] : + elem.document.documentElement[ "client" + name ]; } // Get document width or height diff --git a/test/unit/dimensions.js b/test/unit/dimensions.js index cdf0248371..dfc7697f29 100644 --- a/test/unit/dimensions.js +++ b/test/unit/dimensions.js @@ -202,10 +202,11 @@ QUnit.test( "outerWidth()", function( assert ) { var $div, div, $win = jQuery( window ), - $doc = jQuery( document ); + $doc = jQuery( document ), + winwidth = $win.prop( "innerWidth" ); - assert.equal( jQuery( window ).outerWidth(), $win.width(), "Test on window without margin option" ); - assert.equal( jQuery( window ).outerWidth( true ), $win.width(), "Test on window with margin option" ); + assert.equal( jQuery( window ).outerWidth(), winwidth, "Test on window without margin option" ); + assert.equal( jQuery( window ).outerWidth( true ), winwidth, "Test on window with margin option" ); assert.equal( jQuery( document ).outerWidth(), $doc.width(), "Test on document without margin option" ); assert.equal( jQuery( document ).outerWidth( true ), $doc.width(), "Test on document with margin option" ); @@ -235,6 +236,45 @@ QUnit.test( "outerWidth()", function( assert ) { div.remove(); } ); +QUnit.test( "outerHeight()", function( assert ) { + assert.expect( 11 ); + + var $div, div, + $win = jQuery( window ), + $doc = jQuery( document ), + winheight = $win.prop( "innerHeight" ); + + assert.equal( jQuery( window ).outerHeight(), winheight, "Test on window without margin option" ); + assert.equal( jQuery( window ).outerHeight( true ), winheight, "Test on window with margin option" ); + assert.equal( jQuery( document ).outerHeight(), $doc.height(), "Test on document without margin option" ); + assert.equal( jQuery( document ).outerHeight( true ), $doc.height(), "Test on document with margin option" ); + + $div = jQuery( "#nothiddendiv" ); + $div.css( "height", 30 ); + + assert.equal( $div.outerHeight(), 30, "Test with only height set" ); + $div.css( "padding", "20px" ); + assert.equal( $div.outerHeight(), 70, "Test with padding" ); + $div.css( "border", "2px solid #fff" ); + assert.equal( $div.outerHeight(), 74, "Test with padding and border" ); + $div.css( "margin", "10px" ); + assert.equal( $div.outerHeight(), 74, "Test with padding, border and margin without margin option" ); + $div.css( "position", "absolute" ); + assert.equal( $div.outerHeight( true ), 94, "Test with padding, border and margin with margin option" ); + $div.css( "display", "none" ); + assert.equal( $div.outerHeight( true ), 94, "Test hidden div with padding, border and margin with margin option" ); + + // reset styles + $div.css( { "position": "", "display": "", "border": "", "padding": "", "width": "", "height": "" } ); + + div = jQuery( "
    " ); + + // Temporarily require 0 for backwards compat - should be auto + assert.equal( div.outerWidth(), 0, "Make sure that disconnected nodes are handled." ); + + div.remove(); +} ); + QUnit.test( "child of a hidden elem (or unconnected node) has accurate inner/outer/Width()/Height() see #9441 #9300", function( assert ) { assert.expect( 16 ); @@ -353,43 +393,6 @@ QUnit.test( "box-sizing:border-box child of a hidden elem (or unconnected node) $divNormal.remove(); } ); -QUnit.test( "outerHeight()", function( assert ) { - assert.expect( 11 ); - - var $div, div, - $win = jQuery( window ), - $doc = jQuery( document ); - - assert.equal( jQuery( window ).outerHeight(), $win.height(), "Test on window without margin option" ); - assert.equal( jQuery( window ).outerHeight( true ), $win.height(), "Test on window with margin option" ); - assert.equal( jQuery( document ).outerHeight(), $doc.height(), "Test on document without margin option" ); - assert.equal( jQuery( document ).outerHeight( true ), $doc.height(), "Test on document with margin option" ); - - $div = jQuery( "#nothiddendiv" ); - $div.css( "height", 30 ); - - assert.equal( $div.outerHeight(), 30, "Test with only width set" ); - $div.css( "padding", "20px" ); - assert.equal( $div.outerHeight(), 70, "Test with padding" ); - $div.css( "border", "2px solid #fff" ); - assert.equal( $div.outerHeight(), 74, "Test with padding and border" ); - $div.css( "margin", "10px" ); - assert.equal( $div.outerHeight(), 74, "Test with padding, border and margin without margin option" ); - assert.equal( $div.outerHeight( true ), 94, "Test with padding, border and margin with margin option" ); - $div.css( "display", "none" ); - assert.equal( $div.outerHeight( true ), 94, "Test hidden div with padding, border and margin with margin option" ); - - // reset styles - $div.css( { "display": "", "border": "", "padding": "", "width": "", "height": "" } ); - - div = jQuery( "
    " ); - - // Temporarily require 0 for backwards compat - should be auto - assert.equal( div.outerHeight(), 0, "Make sure that disconnected nodes are handled." ); - - div.remove(); -} ); - QUnit.test( "passing undefined is a setter #5571", function( assert ) { assert.expect( 4 ); assert.equal( jQuery( "#nothiddendiv" ).height( 30 ).height( undefined ).height(), 30, ".height(undefined) is chainable (#5571)" ); From 67fa2eab6ef323b1d894e9e7f054c6e8c844d304 Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Sat, 7 Nov 2015 15:51:03 -0500 Subject: [PATCH 055/927] Event: Move VML test out of event alias test Ref gh-2693 --- test/unit/event.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/test/unit/event.js b/test/unit/event.js index 6193075676..12a2b0a5f8 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -2833,11 +2833,6 @@ QUnit[ jQuery.fn.click ? "test" : "skip" ]( "trigger() shortcuts", function( ass }; jQuery( "#simon1" ).click(); assert.equal( clickCounter, 1, "Check that click, triggers onclick event handler on an a tag also" ); - - // test that special handlers do not blow up with VML elements (#7071) - jQuery( "" ).appendTo( "head" ); - jQuery( " " ).appendTo( "#form" ); - jQuery( "#oval" ).click().keydown(); } ); QUnit[ jQuery.fn.click ? "test" : "skip" ]( "Event aliases", function( assert ) { @@ -2858,6 +2853,21 @@ QUnit[ jQuery.fn.click ? "test" : "skip" ]( "Event aliases", function( assert ) } ); } ); +// Support: IE9 (remove when IE9 is no longer supported) +// https://msdn.microsoft.com/en-us/library/hh801223(v=vs.85).aspx +QUnit.test( "VML with special event handlers (trac-7071)", function( assert ) { + assert.expect( 1 ); + + var ns = jQuery( "" ).appendTo( "head" ); + + jQuery( " " ).appendTo( "#form" ); + jQuery( "#form" ).on( "keydown", function() { + assert.ok( true, "no error was thrown" ); + } ); + jQuery( "#oval" ).trigger( "click" ).trigger( "keydown" ); + ns.remove(); +} ); + // These tests are unreliable in Firefox if ( !( /firefox/i.test( window.navigator.userAgent ) ) ) { QUnit.test( "Check order of focusin/focusout events", function( assert ) { From 22449eb968622c2e14d6c8d8de2cf1e1ba4adccd Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Fri, 6 Nov 2015 18:36:38 -0500 Subject: [PATCH 056/927] Manipulation: execute scripts from iframe in the iframe's context Fixes gh-1757 Close gh-2696 --- src/core.js | 7 ++++--- src/manipulation.js | 2 +- test/data/manipulation/scripts-context.html | 18 ++++++++++++++++++ test/unit/manipulation.js | 11 +++++++++++ 4 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 test/data/manipulation/scripts-context.html diff --git a/src/core.js b/src/core.js index 8e43547ac0..9095213eb3 100644 --- a/src/core.js +++ b/src/core.js @@ -258,11 +258,12 @@ jQuery.extend( { }, // Evaluates a script in a global context - globalEval: function( code ) { - var script = document.createElement( "script" ); + globalEval: function( code, context ) { + context = context || document; + var script = context.createElement( "script" ); script.text = code; - document.head.appendChild( script ).parentNode.removeChild( script ); + context.head.appendChild( script ).parentNode.removeChild( script ); }, // Convert dashed to camelCase; used by the css and data modules diff --git a/src/manipulation.js b/src/manipulation.js index ceb970cbd5..eaf2e09983 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -192,7 +192,7 @@ function domManip( collection, args, callback, ignored ) { jQuery._evalUrl( node.src ); } } else { - jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); + jQuery.globalEval( node.textContent.replace( rcleanScript, "" ), doc ); } } } diff --git a/test/data/manipulation/scripts-context.html b/test/data/manipulation/scripts-context.html new file mode 100644 index 0000000000..6958453c5b --- /dev/null +++ b/test/data/manipulation/scripts-context.html @@ -0,0 +1,18 @@ + + + + + body + + +
    + + + + diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index 37da120626..a56956fa11 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -2162,6 +2162,17 @@ testIframeWithCallback( } ); +testIframeWithCallback( + "domManip executes scripts in iframes in the iframes' context", + "manipulation/scripts-context.html", + function( frameWindow, bodyElement, html, assert ) { + assert.expect( 2 ); + jQuery( bodyElement ).append( html ); + assert.ok( !window.scriptTest, "script executed in iframe context" ); + assert.ok( frameWindow.scriptTest, "script executed in iframe context" ); + } +); + QUnit.test( "jQuery.clone - no exceptions for object elements #9587", function( assert ) { assert.expect( 1 ); From 75b3cdd509a2cf0a704767d04557ec392112a438 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Fri, 6 Nov 2015 16:16:53 -0500 Subject: [PATCH 057/927] Dimensions: properly manipulate non-px values Fixes gh-1712 Close gh-2695 --- src/css.js | 28 ++++++++++++------ test/unit/dimensions.js | 65 ++++++++++++++++++++++------------------- 2 files changed, 54 insertions(+), 39 deletions(-) diff --git a/src/css.js b/src/css.js index 0e5a556100..acd4bb3eb4 100644 --- a/src/css.js +++ b/src/css.js @@ -27,8 +27,6 @@ var // except "table", "table-cell", or "table-caption" // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ), - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { letterSpacing: "0", @@ -59,11 +57,14 @@ function vendorPropName( name ) { } function setPositiveNumber( elem, value, subtract ) { - var matches = rnumsplit.exec( value ); + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); return matches ? // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : value; } @@ -336,16 +337,25 @@ jQuery.each( [ "height", "width" ], function( i, name ) { }, set: function( elem, value, extra ) { - var styles = extra && getStyles( elem ); - return setPositiveNumber( elem, value, extra ? - augmentWidthOrHeight( + var matches, + styles = extra && getStyles( elem ), + subtract = extra && augmentWidthOrHeight( elem, name, extra, jQuery.css( elem, "boxSizing", false, styles ) === "border-box", styles - ) : 0 - ); + ); + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ name ] = value; + value = jQuery.css( elem, name ); + } + + return setPositiveNumber( elem, value, subtract ); } }; } ); diff --git a/test/unit/dimensions.js b/test/unit/dimensions.js index dfc7697f29..28f4ecd139 100644 --- a/test/unit/dimensions.js +++ b/test/unit/dimensions.js @@ -418,36 +418,41 @@ QUnit.test( "getters on non elements should return null", function( assert ) { } ); QUnit.test( "setters with and without box-sizing:border-box", function( assert ) { - assert.expect( 20 ); - - // Support: Android 2.3 (-webkit-box-sizing). - var el_bb = jQuery( "
    test
    " ).appendTo( "#qunit-fixture" ), - el = jQuery( "
    test
    " ).appendTo( "#qunit-fixture" ), - expected = 100; - - assert.equal( el_bb.width( 101 ).width(), expected + 1, "test border-box width(int) by roundtripping" ); - assert.equal( el_bb.innerWidth( 108 ).width(), expected + 2, "test border-box innerWidth(int) by roundtripping" ); - assert.equal( el_bb.outerWidth( 117 ).width(), expected + 3, "test border-box outerWidth(int) by roundtripping" ); - assert.equal( el_bb.outerWidth( 118, false ).width(), expected + 4, "test border-box outerWidth(int, false) by roundtripping" ); - assert.equal( el_bb.outerWidth( 129, true ).width(), expected + 5, "test border-box innerWidth(int, true) by roundtripping" ); - - assert.equal( el_bb.height( 101 ).height(), expected + 1, "test border-box height(int) by roundtripping" ); - assert.equal( el_bb.innerHeight( 108 ).height(), expected + 2, "test border-box innerHeight(int) by roundtripping" ); - assert.equal( el_bb.outerHeight( 117 ).height(), expected + 3, "test border-box outerHeight(int) by roundtripping" ); - assert.equal( el_bb.outerHeight( 118, false ).height(), expected + 4, "test border-box outerHeight(int, false) by roundtripping" ); - assert.equal( el_bb.outerHeight( 129, true ).height(), expected + 5, "test border-box innerHeight(int, true) by roundtripping" ); - - assert.equal( el.width( 101 ).width(), expected + 1, "test border-box width(int) by roundtripping" ); - assert.equal( el.innerWidth( 108 ).width(), expected + 2, "test border-box innerWidth(int) by roundtripping" ); - assert.equal( el.outerWidth( 117 ).width(), expected + 3, "test border-box outerWidth(int) by roundtripping" ); - assert.equal( el.outerWidth( 118, false ).width(), expected + 4, "test border-box outerWidth(int, false) by roundtripping" ); - assert.equal( el.outerWidth( 129, true ).width(), expected + 5, "test border-box innerWidth(int, true) by roundtripping" ); - - assert.equal( el.height( 101 ).height(), expected + 1, "test border-box height(int) by roundtripping" ); - assert.equal( el.innerHeight( 108 ).height(), expected + 2, "test border-box innerHeight(int) by roundtripping" ); - assert.equal( el.outerHeight( 117 ).height(), expected + 3, "test border-box outerHeight(int) by roundtripping" ); - assert.equal( el.outerHeight( 118, false ).height(), expected + 4, "test border-box outerHeight(int, false) by roundtripping" ); - assert.equal( el.outerHeight( 129, true ).height(), expected + 5, "test border-box innerHeight(int, true) by roundtripping" ); + assert.expect( 60 ); + + var parent = jQuery( "#foo" ).css({ width: "200px", height: "200px", "font-size": "16px" }), + el_bb = jQuery( "
    " ).appendTo( parent ), + el = jQuery( "
    " ).appendTo( parent ); + + jQuery.each( { + "number": { set: 100, expected: 100 }, + "em": { set: "10em", expected: 160 }, + "percentage": { set: "50%", expected: 100 } + }, function( units, values ) { + assert.equal( el_bb.width( values.set ).width(), values.expected, "test border-box width(" + units + ") by roundtripping" ); + assert.equal( el_bb.innerWidth( values.set ).width(), values.expected - 2, "test border-box innerWidth(" + units + ") by roundtripping" ); + assert.equal( el_bb.outerWidth( values.set ).width(), values.expected - 6, "test border-box outerWidth(" + units + ") by roundtripping" ); + assert.equal( el_bb.outerWidth( values.set, false ).width(), values.expected - 6, "test border-box outerWidth(" + units + ", false) by roundtripping" ); + assert.equal( el_bb.outerWidth( values.set, true ).width(), values.expected - 16, "test border-box innerWidth(" + units + ", true) by roundtripping" ); + + assert.equal( el_bb.height( values.set ).height(), values.expected, "test border-box height(" + units + ") by roundtripping" ); + assert.equal( el_bb.innerHeight( values.set ).height(), values.expected - 2, "test border-box innerHeight(" + units + ") by roundtripping" ); + assert.equal( el_bb.outerHeight( values.set ).height(), values.expected - 6, "test border-box outerHeight(" + units + ") by roundtripping" ); + assert.equal( el_bb.outerHeight( values.set, false ).height(), values.expected - 6, "test border-box outerHeight(" + units + ", false) by roundtripping" ); + assert.equal( el_bb.outerHeight( values.set, true ).height(), values.expected - 16, "test border-box innerHeight(" + units + ", true) by roundtripping" ); + + assert.equal( el.width( values.set ).width(), values.expected, "test non-border-box width(" + units + ") by roundtripping" ); + assert.equal( el.innerWidth( values.set ).width(), values.expected - 2, "test non-border-box innerWidth(" + units + ") by roundtripping" ); + assert.equal( el.outerWidth( values.set ).width(), values.expected - 6, "test non-border-box outerWidth(" + units + ") by roundtripping" ); + assert.equal( el.outerWidth( values.set, false ).width(), values.expected - 6, "test non-border-box outerWidth(" + units + ", false) by roundtripping" ); + assert.equal( el.outerWidth( values.set, true ).width(), values.expected - 16, "test non-border-box innerWidth(" + units + ", true) by roundtripping" ); + + assert.equal( el.height( values.set ).height(), values.expected, "test non-border-box height(" + units + ") by roundtripping" ); + assert.equal( el.innerHeight( values.set ).height(), values.expected - 2, "test non-border-box innerHeight(" + units + ") by roundtripping" ); + assert.equal( el.outerHeight( values.set ).height(), values.expected - 6, "test non-border-box outerHeight(" + units + ") by roundtripping" ); + assert.equal( el.outerHeight( values.set, false ).height(), values.expected - 6, "test non-border-box outerHeight(" + units + ", false) by roundtripping" ); + assert.equal( el.outerHeight( values.set, true ).height(), values.expected - 16, "test non-border-box innerHeight(" + units + ", true) by roundtripping" ); + } ); } ); testIframe( From 97d79ecf6b6c5cc3c1485eb3c46e12986a978f57 Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Mon, 9 Nov 2015 17:49:01 -0500 Subject: [PATCH 058/927] Dimensions: Empty sets should return undefined Ref gh-2319 Closes gh-2701 --- src/dimensions.js | 2 +- test/unit/dimensions.js | 38 +++++++++++++------------------------- 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/src/dimensions.js b/src/dimensions.js index c5f49ac093..3d4dbff10f 100644 --- a/src/dimensions.js +++ b/src/dimensions.js @@ -45,7 +45,7 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { // Set width or height on the element jQuery.style( elem, type, value, extra ); - }, type, chainable ? margin : undefined, chainable, null ); + }, type, chainable ? margin : undefined, chainable ); }; } ); } ); diff --git a/test/unit/dimensions.js b/test/unit/dimensions.js index 28f4ecd139..c681478a00 100644 --- a/test/unit/dimensions.js +++ b/test/unit/dimensions.js @@ -30,7 +30,7 @@ function fn( val ) { function testWidth( val, assert ) { assert.expect( 9 ); - var $div, blah; + var $div, $empty; $div = jQuery( "#nothiddendiv" ); $div.width( val( 30 ) ); @@ -51,9 +51,9 @@ function testWidth( val, assert ) { assert.equal( jQuery( "#nothiddendivchild" ).width(), 20, "Test child width with border and padding" ); jQuery( "#nothiddendiv, #nothiddendivchild" ).css( { "border": "", "padding": "", "width": "" } ); - blah = jQuery( "blah" ); - assert.equal( blah.width( val( 10 ) ), blah, "Make sure that setting a width on an empty set returns the set." ); - assert.equal( blah.width(), null, "Make sure 'null' is returned on an empty set" ); + $empty = jQuery(); + assert.equal( $empty.width( val( 10 ) ), $empty, "Make sure that setting a width on an empty set returns the set." ); + assert.strictEqual( $empty.width(), undefined, "Make sure 'undefined' is returned on an empty set" ); assert.equal( jQuery( window ).width(), document.documentElement.clientWidth, "Window width is equal to width reported by window/document." ); } @@ -104,7 +104,7 @@ function testHeight( val, assert ) { blah = jQuery( "blah" ); assert.equal( blah.height( val( 10 ) ), blah, "Make sure that setting a height on an empty set returns the set." ); - assert.equal( blah.height(), null, "Make sure 'null' is returned on an empty set" ); + assert.strictEqual( blah.height(), undefined, "Make sure 'undefined' is returned on an empty set" ); assert.equal( jQuery( window ).height(), document.documentElement.clientHeight, "Window width is equal to width reported by window/document." ); } @@ -130,7 +130,7 @@ QUnit.test( "height(Function(args))", function( assert ) { } ); QUnit.test( "innerWidth()", function( assert ) { - assert.expect( 6 ); + assert.expect( 7 ); var $div, div, $win = jQuery( window ), @@ -138,6 +138,7 @@ QUnit.test( "innerWidth()", function( assert ) { assert.equal( jQuery( window ).innerWidth(), $win.width(), "Test on window" ); assert.equal( jQuery( document ).innerWidth(), $doc.width(), "Test on document" ); + assert.strictEqual( jQuery().innerWidth(), undefined, "Test on empty set" ); $div = jQuery( "#nothiddendiv" ); $div.css( { @@ -164,7 +165,7 @@ QUnit.test( "innerWidth()", function( assert ) { } ); QUnit.test( "innerHeight()", function( assert ) { - assert.expect( 6 ); + assert.expect( 7 ); var $div, div, $win = jQuery( window ), @@ -172,6 +173,7 @@ QUnit.test( "innerHeight()", function( assert ) { assert.equal( jQuery( window ).innerHeight(), $win.height(), "Test on window" ); assert.equal( jQuery( document ).innerHeight(), $doc.height(), "Test on document" ); + assert.strictEqual( jQuery().innerHeight(), undefined, "Test on empty set" ); $div = jQuery( "#nothiddendiv" ); $div.css( { @@ -198,7 +200,7 @@ QUnit.test( "innerHeight()", function( assert ) { } ); QUnit.test( "outerWidth()", function( assert ) { - assert.expect( 11 ); + assert.expect( 12 ); var $div, div, $win = jQuery( window ), @@ -209,6 +211,7 @@ QUnit.test( "outerWidth()", function( assert ) { assert.equal( jQuery( window ).outerWidth( true ), winwidth, "Test on window with margin option" ); assert.equal( jQuery( document ).outerWidth(), $doc.width(), "Test on document without margin option" ); assert.equal( jQuery( document ).outerWidth( true ), $doc.width(), "Test on document with margin option" ); + assert.strictEqual( jQuery().outerWidth(), undefined, "Test on empty set" ); $div = jQuery( "#nothiddendiv" ); $div.css( "width", 30 ); @@ -237,7 +240,7 @@ QUnit.test( "outerWidth()", function( assert ) { } ); QUnit.test( "outerHeight()", function( assert ) { - assert.expect( 11 ); + assert.expect( 12 ); var $div, div, $win = jQuery( window ), @@ -248,6 +251,7 @@ QUnit.test( "outerHeight()", function( assert ) { assert.equal( jQuery( window ).outerHeight( true ), winheight, "Test on window with margin option" ); assert.equal( jQuery( document ).outerHeight(), $doc.height(), "Test on document without margin option" ); assert.equal( jQuery( document ).outerHeight( true ), $doc.height(), "Test on document with margin option" ); + assert.strictEqual( jQuery().outerHeight(), undefined, "Test on empty set" ); $div = jQuery( "#nothiddendiv" ); $div.css( "height", 30 ); @@ -401,22 +405,6 @@ QUnit.test( "passing undefined is a setter #5571", function( assert ) { assert.equal( jQuery( "#nothiddendiv" ).width( 30 ).width( undefined ).width(), 30, ".width(undefined) is chainable (#5571)" ); } ); -QUnit.test( "getters on non elements should return null", function( assert ) { - assert.expect( 8 ); - - var nonElem = jQuery( "notAnElement" ); - - assert.strictEqual( nonElem.width(), null, ".width() is not null (#12283)" ); - assert.strictEqual( nonElem.innerWidth(), null, ".innerWidth() is not null (#12283)" ); - assert.strictEqual( nonElem.outerWidth(), null, ".outerWidth() is not null (#12283)" ); - assert.strictEqual( nonElem.outerWidth( true ), null, ".outerWidth(true) is not null (#12283)" ); - - assert.strictEqual( nonElem.height(), null, ".height() is not null (#12283)" ); - assert.strictEqual( nonElem.innerHeight(), null, ".innerHeight() is not null (#12283)" ); - assert.strictEqual( nonElem.outerHeight(), null, ".outerHeight() is not null (#12283)" ); - assert.strictEqual( nonElem.outerHeight( true ), null, ".outerHeight(true) is not null (#12283)" ); -} ); - QUnit.test( "setters with and without box-sizing:border-box", function( assert ) { assert.expect( 60 ); From 29370190605ed5ddf5d0371c6ad886a4a4b5e0f9 Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Mon, 9 Nov 2015 18:14:59 -0500 Subject: [PATCH 059/927] Offset: offsetLeft/Top on empty set returns undefined Fixes gh-2319 Closes gh-2702 Ref gh-2701 --- src/offset.js | 2 +- test/unit/offset.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/offset.js b/src/offset.js index bef2a8fa03..f7ef79c3c7 100644 --- a/src/offset.js +++ b/src/offset.js @@ -202,7 +202,7 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( } else { elem[ method ] = val; } - }, method, val, arguments.length, null ); + }, method, val, arguments.length ); }; } ); diff --git a/test/unit/offset.js b/test/unit/offset.js index 85f1da65de..a0f253b4e0 100644 --- a/test/unit/offset.js +++ b/test/unit/offset.js @@ -460,8 +460,8 @@ testIframe( "offset/scroll", "scroll", function( $, win, doc, assert ) { assert.notEqual( $().scrollLeft( 100 ), null, "jQuery().scrollLeft(100) testing setter on empty jquery object" ); assert.notEqual( $().scrollTop( null ), null, "jQuery().scrollTop(null) testing setter on empty jquery object" ); assert.notEqual( $().scrollLeft( null ), null, "jQuery().scrollLeft(null) testing setter on empty jquery object" ); - assert.strictEqual( $().scrollTop(), null, "jQuery().scrollTop(100) testing setter on empty jquery object" ); - assert.strictEqual( $().scrollLeft(), null, "jQuery().scrollLeft(100) testing setter on empty jquery object" ); + assert.strictEqual( $().scrollTop(), undefined, "jQuery().scrollTop() testing getter on empty jquery object" ); + assert.strictEqual( $().scrollLeft(), undefined, "jQuery().scrollLeft() testing getter on empty jquery object" ); // Tests position after parent scrolling (#15239) $( "#scroll-1" ).scrollTop( 0 ); From ab06be561ec74cccaa2d581830210f82326f05c3 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Tue, 10 Nov 2015 12:44:35 -0500 Subject: [PATCH 060/927] Effects: fix loading showHide in AMD mode --- src/css/showHide.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/css/showHide.js b/src/css/showHide.js index 10d2819930..29e2d8bc8e 100644 --- a/src/css/showHide.js +++ b/src/css/showHide.js @@ -67,4 +67,5 @@ jQuery.fn.extend( { } } ); +return showHide; } ); From 88046440da8f5433b510ea705255d1df12c2963e Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Tue, 10 Nov 2015 13:26:15 -0500 Subject: [PATCH 061/927] Selector: pass jQuery unit tests with selector-native - Ignore certain tests that obviously are not supported - Beefed up the sortOrder, uniqueSort, isXMLDoc, and attr functions Fixes gh-1742 Fixes gh-2048 Close gh-2703 --- src/selector-native.js | 125 ++++++++++++--------- test/unit/core.js | 10 +- test/unit/css.js | 8 +- test/unit/effects.js | 41 +++++-- test/unit/event.js | 3 +- test/unit/manipulation.js | 223 +++++++++++++++++++++----------------- test/unit/selector.js | 78 ++++++++----- test/unit/serialize.js | 3 +- test/unit/traversing.js | 34 +++--- 9 files changed, 309 insertions(+), 216 deletions(-) diff --git a/src/selector-native.js b/src/selector-native.js index 121a6a603b..ee81483426 100644 --- a/src/selector-native.js +++ b/src/selector-native.js @@ -1,8 +1,10 @@ define( [ "./core", "./var/document", - "./var/documentElement" -], function( jQuery, document, documentElement ) { + "./var/documentElement", + "./var/hasOwn", + "./var/indexOf" +], function( jQuery, document, documentElement, hasOwn, indexOf ) { /* * Optional (non-Sizzle) selector module for custom builds. @@ -29,69 +31,84 @@ define( [ * customize this stub for the project's specific needs. */ -var hasDuplicate, +var hasDuplicate, sortInput, + sortStable = jQuery.expando.split( "" ).sort( sortOrder ).join( "" ) === jQuery.expando, matches = documentElement.matches || documentElement.webkitMatchesSelector || documentElement.mozMatchesSelector || documentElement.oMatchesSelector || - documentElement.msMatchesSelector, - sortOrder = function( a, b ) { + documentElement.msMatchesSelector; - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } +function sortOrder( a, b ) { - var compare = b.compareDocumentPosition && - a.compareDocumentPosition && - a.compareDocumentPosition( b ); + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } - if ( compare ) { + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } - // Disconnected nodes - if ( compare & 1 ) { + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : - // Choose the first element that is related to our document - if ( a === document || jQuery.contains( document, a ) ) { - return -1; - } - if ( b === document || jQuery.contains( document, b ) ) { - return 1; - } + // Otherwise we know they are disconnected + 1; - // Maintain original order - return 0; - } + // Disconnected nodes + if ( compare & 1 ) { - return compare & 4 ? -1 : 1; + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === document && + jQuery.contains( document, a ) ) { + return -1; + } + if ( b === document || b.ownerDocument === document && + jQuery.contains( document, b ) ) { + return 1; } - // Not directly comparable, sort on existence of method - return a.compareDocumentPosition ? -1 : 1; - }, - uniqueSort = function( results ) { - var elem, - duplicates = [], - i = 0, - j = 0; + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } - hasDuplicate = false; - results.sort( sortOrder ); + return compare & 4 ? -1 : 1; +} - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); +function uniqueSort( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + hasDuplicate = false; + sortInput = !sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); } } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } - return results; - }; + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +} jQuery.extend( { find: function( selector, context, results, seed ) { @@ -157,7 +174,11 @@ jQuery.extend( { return a === bup || !!( bup && bup.nodeType === 1 && adown.contains( bup ) ); }, isXMLDoc: function( elem ) { - return ( elem.ownerDocument || elem ).documentElement.nodeName !== "HTML"; + + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && ( elem.ownerDocument || elem ).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; }, expr: { attrHandle: {}, @@ -177,7 +198,13 @@ jQuery.extend( jQuery.find, { return matches.call( elem, expr ); }, attr: function( elem, name ) { - return elem.getAttribute( name ); + var fn = jQuery.expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + value = fn && hasOwn.call( jQuery.expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, jQuery.isXMLDoc( elem ) ) : + undefined; + return value !== undefined ? value : elem.getAttribute( name ); } } ); diff --git a/test/unit/core.js b/test/unit/core.js index dc644b504b..ee17b70b0e 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -145,7 +145,7 @@ QUnit.test( "jQuery()", function( assert ) { "Empty attributes object is not interpreted as a document (trac-8950)" ); } ); -QUnit.test( "jQuery(selector, context)", function( assert ) { +QUnit[ jQuery.find.compile ? "test" : "skip" ]( "jQuery(selector, context)", function( assert ) { assert.expect( 3 ); assert.deepEqual( jQuery( "div p", "#qunit-fixture" ).get(), q( "sndp", "en", "sap" ), "Basic selector with string as context" ); assert.deepEqual( jQuery( "div p", q( "qunit-fixture" )[ 0 ] ).get(), q( "sndp", "en", "sap" ), "Basic selector with element as context" ); @@ -618,8 +618,12 @@ QUnit.test( "jQuery('html')", function( assert ) { //equal( jQuery( "element[attribute=
    ]" ).length, 0, // "When html is within brackets, do not recognize as html." ); - assert.equal( jQuery( "element:not(
    )" ).length, 0, - "When html is within parens, do not recognize as html." ); + if ( jQuery.find.compile ) { + assert.equal( jQuery( "element:not(
    )" ).length, 0, + "When html is within parens, do not recognize as html." ); + } else { + assert.ok( "skip", "Complex :not not supported in selector-native" ); + } assert.equal( jQuery( "\\" ).length, 0, "Ignore escaped html characters" ); } ); diff --git a/test/unit/css.js b/test/unit/css.js index 343459dfba..8715c56d5a 100644 --- a/test/unit/css.js +++ b/test/unit/css.js @@ -666,9 +666,7 @@ QUnit.test( "show() after hide() should always set display to initial value (#14 } -if ( jQuery.fn.toggle ) { - -QUnit.test( "toggle()", function( assert ) { +QUnit[ jQuery.find.compile && jQuery.fn.toggle ? "test" : "skip" ]( "toggle()", function( assert ) { assert.expect( 9 ); var div, oldHide, x = jQuery( "#foo" ); @@ -701,8 +699,6 @@ QUnit.test( "toggle()", function( assert ) { jQuery.fn.hide = oldHide; } ); -} - QUnit.test( "jQuery.css(elem, 'height') doesn't clear radio buttons (bug #1095)", function( assert ) { assert.expect( 4 ); @@ -1012,7 +1008,7 @@ QUnit.test( "css opacity consistency across browsers (#12685)", function( assert assert.equal( Math.round( el.css( "opacity" ) * 100 ), 20, "remove opacity override" ); } ); -QUnit.test( ":visible/:hidden selectors", function( assert ) { +QUnit[ jQuery.find.compile ? "test" : "skip" ]( ":visible/:hidden selectors", function( assert ) { assert.expect( 17 ); var $div, $table, $a; diff --git a/test/unit/effects.js b/test/unit/effects.js index 9c19205662..0f38f81a5c 100644 --- a/test/unit/effects.js +++ b/test/unit/effects.js @@ -27,7 +27,7 @@ QUnit.module( "effects", { } } ); -QUnit.test( "sanity check", function( assert ) { +QUnit[ jQuery.find.compile ? "test" : "skip" ]( "sanity check", function( assert ) { assert.expect( 1 ); assert.equal( jQuery( "#dl:visible, #qunit-fixture:visible, #foo:visible" ).length, 3, "QUnit state is correct for testing effects" ); } ); @@ -769,7 +769,7 @@ QUnit.test( "stop( queue, ..., ... ) - Stop single queues", function( assert ) { this.clock.tick( 500 ); } ); -QUnit.test( "toggle()", function( assert ) { +QUnit[ jQuery.find.compile ? "test" : "skip" ]( "toggle()", function( assert ) { assert.expect( 6 ); var x = jQuery( "#foo" ); assert.ok( x.is( ":visible" ), "is visible" ); @@ -1534,9 +1534,9 @@ QUnit.test( "User supplied callback called after show when fx off (#8892)", func jQuery.fx.off = true; foo.hide(); foo.fadeIn( 500, function() { - assert.ok( jQuery( this ).is( ":visible" ), "Element is visible in callback" ); + assert.ok( supportjQuery( this ).is( ":visible" ), "Element is visible in callback" ); foo.fadeOut( 500, function() { - assert.ok( jQuery( this ).is( ":hidden" ), "Element is hidden in callback" ); + assert.ok( supportjQuery( this ).is( ":hidden" ), "Element is hidden in callback" ); jQuery.fx.off = false; } ); } ); @@ -1592,7 +1592,7 @@ QUnit.test( "animate should set display for disconnected nodes", function( asser clock.tick( 400 ); } ); -QUnit.test( "Animation callback should not show animated element as :animated (#7157)", function( assert ) { +QUnit[ jQuery.find.compile ? "test" : "skip" ]( "Animation callback should not show animated element as :animated (#7157)", function( assert ) { assert.expect( 1 ); var foo = jQuery( "#foo" ); @@ -1605,7 +1605,7 @@ QUnit.test( "Animation callback should not show animated element as :animated (# this.clock.tick( 100 ); } ); -QUnit.test( "Initial step callback should show element as :animated (#14623)", function( assert ) { +QUnit[ jQuery.find.compile ? "test" : "skip" ]( "Initial step callback should show element as :animated (#14623)", function( assert ) { assert.expect( 1 ); var foo = jQuery( "#foo" ); @@ -2125,7 +2125,12 @@ QUnit.test( ".finish() completes all queued animations", function( assert ) { assert.equal( parseFloat( div.css( prop ) ), value, prop + " finished at correct value" ); } ); assert.equal( div.queue().length, 0, "empty queue when done" ); - assert.equal( div.is( ":animated" ), false, ":animated doesn't match" ); + + if ( jQuery.find.compile ) { + assert.equal( div.is( ":animated" ), false, ":animated doesn't match" ); + } else { + assert.ok( "skip", ":animated selector not supported with selector-native" ); + } // cleanup div.remove(); @@ -2160,7 +2165,12 @@ QUnit.test( ".finish( false ) - unqueued animations", function( assert ) { jQuery.each( animations, function( prop, value ) { assert.equal( parseFloat( div.css( prop ) ), value, prop + " finished at correct value" ); } ); - assert.equal( div.is( ":animated" ), false, ":animated doesn't match" ); + + if ( jQuery.find.compile ) { + assert.equal( div.is( ":animated" ), false, ":animated doesn't match" ); + } else { + assert.ok( "skip", ":animated selector not supported with selector-native" ); + } // cleanup div.remove(); @@ -2194,12 +2204,23 @@ QUnit.test( ".finish( \"custom\" ) - custom queue animations", function( assert // start the first animation div.dequeue( "custom" ); - assert.equal( div.is( ":animated" ), true, ":animated matches" ); + + if ( jQuery.find.compile ) { + assert.equal( div.is( ":animated" ), true, ":animated matches" ); + } else { + assert.ok( "skip", ":animated selector not supported with selector-native" ); + } + div.finish( "custom" ); jQuery.each( animations, function( prop, value ) { assert.equal( parseFloat( div.css( prop ) ), value, prop + " finished at correct value" ); } ); - assert.equal( div.is( ":animated" ), false, ":animated doesn't match" ); + + if ( jQuery.find.compile ) { + assert.equal( div.is( ":animated" ), false, ":animated doesn't match" ); + } else { + assert.ok( "skip", ":animated selector not supported with selector-native" ); + } // cleanup div.remove(); diff --git a/test/unit/event.js b/test/unit/event.js index 12a2b0a5f8..4a5611be82 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -1750,7 +1750,8 @@ QUnit.test( "jQuery.off using dispatched jQuery.Event", function( assert ) { .remove(); } ); -QUnit.test( "delegated event with delegateTarget-relative selector", function( assert ) { +// selector-native does not support scope-fixing in delegation +QUnit[ jQuery.find.compile ? "test" : "skip" ]( "delegated event with delegateTarget-relative selector", function( assert ) { assert.expect( 3 ); var markup = jQuery( "
    " ).appendTo( "#qunit-fixture" ); diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index a56956fa11..4d8eed7d9a 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -353,9 +353,9 @@ QUnit.test( "append(Function) returns String", function( assert ) { QUnit.test( "append(Function) returns Element", function( assert ) { - assert.expect( 2 ); + assert.expect( 2 ); var expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:", - old = jQuery( "#sap" ).html(); + old = jQuery( "#sap" ).html(); jQuery( "#sap" ).append( function( i, val ) { assert.equal( val, old, "Make sure the incoming value is correct." ); @@ -368,7 +368,7 @@ QUnit.test( "append(Function) returns Array", function( assert ) { assert.expect( 2 ); var expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:Yahoo", - old = jQuery( "#sap" ).html(); + old = jQuery( "#sap" ).html(); jQuery( "#sap" ).append( function( i, val ) { assert.equal( val, old, "Make sure the incoming value is correct." ); @@ -381,7 +381,7 @@ QUnit.test( "append(Function) returns jQuery", function( assert ) { assert.expect( 2 ); var expected = "This link has class=\"blog\": Simon Willison's WeblogYahooTry them out:", - old = jQuery( "#sap" ).html(); + old = jQuery( "#sap" ).html(); jQuery( "#sap" ).append( function( i, val ) { assert.equal( val, old, "Make sure the incoming value is correct." ); @@ -583,7 +583,7 @@ QUnit.test( "appendTo(String)", function( assert ) { QUnit.test( "appendTo(Element|Array)", function( assert ) { - assert.expect( 2 ); + assert.expect( 2 ); var expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:"; jQuery( document.getElementById( "first" ) ).appendTo( "#sap" ); @@ -597,9 +597,9 @@ QUnit.test( "appendTo(Element|Array)", function( assert ) { QUnit.test( "appendTo(jQuery)", function( assert ) { - assert.expect( 10 ); + assert.expect( 10 ); - var expected, num, div; + var expected, num, div; assert.ok( jQuery( document.createElement( "script" ) ).appendTo( "body" ).length, "Make sure a disconnected script can be appended." ); expected = "This link has class=\"blog\": Simon Willison's WeblogYahooTry them out:"; @@ -715,7 +715,7 @@ QUnit.test( "prepend(Function) with incoming value -- String", function( assert QUnit.test( "prepend(Function) with incoming value -- Element", function( assert ) { - assert.expect( 2 ); + assert.expect( 2 ); var old, expected; expected = "Try them out:This link has class=\"blog\": Simon Willison's Weblog"; @@ -731,7 +731,7 @@ QUnit.test( "prepend(Function) with incoming value -- Element", function( assert QUnit.test( "prepend(Function) with incoming value -- Array", function( assert ) { - assert.expect( 2 ); + assert.expect( 2 ); var old, expected; expected = "Try them out:YahooThis link has class=\"blog\": Simon Willison's Weblog"; @@ -747,7 +747,7 @@ QUnit.test( "prepend(Function) with incoming value -- Array", function( QUnit.test( "prepend(Function) with incoming value -- jQuery", function( assert ) { - assert.expect( 2 ); + assert.expect( 2 ); var old, expected; expected = "YahooTry them out:This link has class=\"blog\": Simon Willison's Weblog"; @@ -943,27 +943,27 @@ QUnit.test( "before and after w/ empty object (#10812)", function( assert ) { QUnit.test( ".before() and .after() disconnected node", function( assert ) { - assert.expect( 2 ); + assert.expect( 2 ); - assert.equal( jQuery( "" ).before( "
    " ).length, 1, "before() on disconnected node is no-op" ); + assert.equal( jQuery( "" ).before( "
    " ).length, 1, "before() on disconnected node is no-op" ); assert.equal( jQuery( "" ).after( "
    " ).length, 1, "after() on disconnected node is no-op" ); } ); QUnit.test( "insert with .before() on disconnected node last", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expectedBefore = "This is a normal link: bugaYahoo"; + var expectedBefore = "This is a normal link: bugaYahoo"; - jQuery( "#yahoo" ).add( "" ).before( "buga" ); + jQuery( "#yahoo" ).add( "" ).before( "buga" ); assert.equal( jQuery( "#en" ).text(), expectedBefore, "Insert String before with disconnected node last" ); } ); QUnit.test( "insert with .before() on disconnected node first", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expectedBefore = "This is a normal link: bugaYahoo"; + var expectedBefore = "This is a normal link: bugaYahoo"; jQuery( "" ).add( "#yahoo" ).before( "buga" ); assert.equal( jQuery( "#en" ).text(), expectedBefore, "Insert String before with disconnected node first" ); @@ -971,9 +971,9 @@ QUnit.test( "insert with .before() on disconnected node first", function( assert QUnit.test( "insert with .before() on disconnected node last", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expectedAfter = "This is a normal link: Yahoobuga"; + var expectedAfter = "This is a normal link: Yahoobuga"; jQuery( "#yahoo" ).add( "" ).after( "buga" ); assert.equal( jQuery( "#en" ).text(), expectedAfter, "Insert String after with disconnected node last" ); @@ -981,9 +981,9 @@ QUnit.test( "insert with .before() on disconnected node last", function( assert QUnit.test( "insert with .before() on disconnected node last", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expectedAfter = "This is a normal link: Yahoobuga"; + var expectedAfter = "This is a normal link: Yahoobuga"; jQuery( "" ).add( "#yahoo" ).after( "buga" ); assert.equal( jQuery( "#en" ).text(), expectedAfter, "Insert String after with disconnected node first" ); @@ -1000,112 +1000,112 @@ QUnit.test( "insertBefore(String)", function( assert ) { QUnit.test( "insertBefore(Element)", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expected = "This is a normal link: Try them out:Yahoo"; + var expected = "This is a normal link: Try them out:Yahoo"; jQuery( document.getElementById( "first" ) ).insertBefore( "#yahoo" ); assert.equal( jQuery( "#en" ).text(), expected, "Insert element before" ); } ); QUnit.test( "insertBefore(Array)", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expected = "This is a normal link: Try them out:diveintomarkYahoo"; + var expected = "This is a normal link: Try them out:diveintomarkYahoo"; jQuery( [ document.getElementById( "first" ), document.getElementById( "mark" ) ] ).insertBefore( "#yahoo" ); assert.equal( jQuery( "#en" ).text(), expected, "Insert array of elements before" ); } ); QUnit.test( "insertBefore(jQuery)", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expected = "This is a normal link: diveintomarkTry them out:Yahoo"; + var expected = "This is a normal link: diveintomarkTry them out:Yahoo"; jQuery( "#mark, #first" ).insertBefore( "#yahoo" ); assert.equal( jQuery( "#en" ).text(), expected, "Insert jQuery before" ); } ); QUnit.test( ".after(String)", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expected = "This is a normal link: Yahoobuga"; + var expected = "This is a normal link: Yahoobuga"; jQuery( "#yahoo" ).after( "buga" ); assert.equal( jQuery( "#en" ).text(), expected, "Insert String after" ); } ); QUnit.test( ".after(Element)", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expected = "This is a normal link: YahooTry them out:"; + var expected = "This is a normal link: YahooTry them out:"; jQuery( "#yahoo" ).after( document.getElementById( "first" ) ); assert.equal( jQuery( "#en" ).text(), expected, "Insert element after" ); } ); QUnit.test( ".after(Array)", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expected = "This is a normal link: YahooTry them out:diveintomark"; + var expected = "This is a normal link: YahooTry them out:diveintomark"; jQuery( "#yahoo" ).after( [ document.getElementById( "first" ), document.getElementById( "mark" ) ] ); assert.equal( jQuery( "#en" ).text(), expected, "Insert array of elements after" ); } ); QUnit.test( ".after(jQuery)", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expected = "This is a normal link: YahooTry them out:Googlediveintomark"; + var expected = "This is a normal link: YahooTry them out:Googlediveintomark"; jQuery( "#yahoo" ).after( [ jQuery( "#first" ), jQuery( "#mark, #google" ) ] ); assert.equal( jQuery( "#en" ).text(), expected, "Insert array of jQuery objects after" ); } ); QUnit.test( ".after(Function) returns String", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expected = "This is a normal link: Yahoobuga", - val = manipulationFunctionReturningObj; + var expected = "This is a normal link: Yahoobuga", + val = manipulationFunctionReturningObj; jQuery( "#yahoo" ).after( val( "buga" ) ); assert.equal( jQuery( "#en" ).text(), expected, "Insert String after" ); } ); QUnit.test( ".after(Function) returns Element", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expected = "This is a normal link: YahooTry them out:", - val = manipulationFunctionReturningObj; + var expected = "This is a normal link: YahooTry them out:", + val = manipulationFunctionReturningObj; jQuery( "#yahoo" ).after( val( document.getElementById( "first" ) ) ); assert.equal( jQuery( "#en" ).text(), expected, "Insert element after" ); } ); QUnit.test( ".after(Function) returns Array", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expected = "This is a normal link: YahooTry them out:diveintomark", - val = manipulationFunctionReturningObj; + var expected = "This is a normal link: YahooTry them out:diveintomark", + val = manipulationFunctionReturningObj; jQuery( "#yahoo" ).after( val( [ document.getElementById( "first" ), document.getElementById( "mark" ) ] ) ); assert.equal( jQuery( "#en" ).text(), expected, "Insert array of elements after" ); } ); QUnit.test( ".after(Function) returns jQuery", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expected = "This is a normal link: YahooTry them out:Googlediveintomark", - val = manipulationFunctionReturningObj; + var expected = "This is a normal link: YahooTry them out:Googlediveintomark", + val = manipulationFunctionReturningObj; jQuery( "#yahoo" ).after( val( [ jQuery( "#first" ), jQuery( "#mark, #google" ) ] ) ); assert.equal( jQuery( "#en" ).text(), expected, "Insert array of jQuery objects after" ); } ); QUnit.test( ".after(disconnected node)", function( assert ) { - assert.expect( 2 ); + assert.expect( 2 ); - var set = jQuery( "
    " ).before( "test" ); + var set = jQuery( "
    " ).before( "test" ); assert.equal( set[ 0 ].nodeName.toLowerCase(), "div", "Insert after a disconnected node should be a no-op" ); assert.equal( set.length, 1, "Insert the element after the disconnected node should be a no-op" ); } ); @@ -1121,27 +1121,27 @@ QUnit.test( "insertAfter(String)", function( assert ) { QUnit.test( "insertAfter(Element)", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expected = "This is a normal link: YahooTry them out:"; + var expected = "This is a normal link: YahooTry them out:"; jQuery( document.getElementById( "first" ) ).insertAfter( "#yahoo" ); assert.equal( jQuery( "#en" ).text(), expected, "Insert element after" ); } ); QUnit.test( "insertAfter(Array)", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expected = "This is a normal link: YahooTry them out:diveintomark"; + var expected = "This is a normal link: YahooTry them out:diveintomark"; jQuery( [ document.getElementById( "first" ), document.getElementById( "mark" ) ] ).insertAfter( "#yahoo" ); assert.equal( jQuery( "#en" ).text(), expected, "Insert array of elements after" ); } ); QUnit.test( "insertAfter(jQuery)", function( assert ) { - assert.expect( 1 ); + assert.expect( 1 ); - var expected = "This is a normal link: YahoodiveintomarkTry them out:"; + var expected = "This is a normal link: YahoodiveintomarkTry them out:"; jQuery( "#mark, #first" ).insertAfter( "#yahoo" ); assert.equal( jQuery( "#en" ).text(), expected, "Insert jQuery after" ); } ); @@ -1559,8 +1559,17 @@ QUnit.test( "clone(multiple selected options) (Bug #8129)", function( assert ) { var element = jQuery( "" ); - assert.equal( element.clone().find( "option:selected" ).length, element.find( "option:selected" ).length, "Multiple selected options cloned correctly" ); + function getSelectedOptions( collection ) { + return collection.find( "option" ).filter(function( option ) { + return option.selected; + } ); + } + assert.equal( + getSelectedOptions( element.clone() ).length, + getSelectedOptions( element ).length, + "Multiple selected options cloned correctly" + ); } ); QUnit.test( "clone() on XML nodes", function( assert ) { @@ -1754,7 +1763,7 @@ QUnit.test( "html(Function) with incoming value -- jQuery.contents()", function( assert.expect( 14 ); - var actualhtml, j, $div, $div2, insert; + var actualhtml, j, $div, $div2, insert; j = jQuery( "#nonnodes" ).contents(); actualhtml = j.map( function() { @@ -1825,7 +1834,7 @@ QUnit.test( "clone()/html() don't expose jQuery/Sizzle expandos (#12858)", funct QUnit.test( "remove() no filters", function( assert ) { - assert.expect( 2 ); + assert.expect( 2 ); var first = jQuery( "#ap" ).children().first(); @@ -1838,9 +1847,9 @@ QUnit.test( "remove() no filters", function( assert ) { QUnit.test( "remove() with filters", function( assert ) { - assert.expect( 8 ); + assert.expect( 8 ); - var markup, div; + var markup, div; jQuery( "#ap" ).children().remove( "a" ); assert.ok( jQuery( "#ap" ).text().length > 10, "Check text is not removed" ); assert.equal( jQuery( "#ap" ).children().length, 1, "Check filtered remove" ); @@ -1853,12 +1862,18 @@ QUnit.test( "remove() with filters", function( assert ) { div = jQuery( markup ); div.children().remove( "span:nth-child(2n)" ); assert.equal( div.text(), "13", "relative selector in remove" ); - div = jQuery( markup ); - div.children().remove( "span:first" ); - assert.equal( div.text(), "234", "positional selector in remove" ); - div = jQuery( markup ); - div.children().remove( "span:last" ); - assert.equal( div.text(), "123", "positional selector in remove" ); + + if ( jQuery.find.compile ) { + div = jQuery( markup ); + div.children().remove( "span:first" ); + assert.equal( div.text(), "234", "positional selector in remove" ); + div = jQuery( markup ); + div.children().remove( "span:last" ); + assert.equal( div.text(), "123", "positional selector in remove" ); + } else { + assert.ok( "skip", "Positional selectors not supported in selector-native" ); + assert.ok( "skip", "Positional selectors not supported in selector-native" ); + } // using contents will get comments regular, text, and comment nodes // Handle the case where no comment is in the document @@ -1912,50 +1927,56 @@ QUnit.test( "remove() in document order #13779", function( assert ) { QUnit.test( "detach() no filters", function( assert ) { - assert.expect( 3 ); + assert.expect( 3 ); - var first = jQuery( "#ap" ).children().first(); + var first = jQuery( "#ap" ).children().first(); - first.data( "foo", "bar" ); + first.data( "foo", "bar" ); - jQuery( "#ap" ).children().detach(); - assert.ok( jQuery( "#ap" ).text().length > 10, "Check text is not removed" ); - assert.equal( jQuery( "#ap" ).children().length, 0, "Check remove" ); + jQuery( "#ap" ).children().detach(); + assert.ok( jQuery( "#ap" ).text().length > 10, "Check text is not removed" ); + assert.equal( jQuery( "#ap" ).children().length, 0, "Check remove" ); - assert.equal( first.data( "foo" ), "bar" ); - first.remove(); + assert.equal( first.data( "foo" ), "bar" ); + first.remove(); } ); QUnit.test( "detach() with filters", function( assert ) { - assert.expect( 8 ); - - var markup, div; - jQuery( "#ap" ).children().detach( "a" ); - assert.ok( jQuery( "#ap" ).text().length > 10, "Check text is not removed" ); - assert.equal( jQuery( "#ap" ).children().length, 1, "Check filtered remove" ); - - jQuery( "#ap" ).children().detach( "a, code" ); - assert.equal( jQuery( "#ap" ).children().length, 0, "Check multi-filtered remove" ); - - // Positional and relative selectors - markup = "
    1234
    "; - div = jQuery( markup ); - div.children().detach( "span:nth-child(2n)" ); - assert.equal( div.text(), "13", "relative selector in detach" ); - div = jQuery( markup ); - div.children().detach( "span:first" ); - assert.equal( div.text(), "234", "positional selector in detach" ); - div = jQuery( markup ); - div.children().detach( "span:last" ); - assert.equal( div.text(), "123", "positional selector in detach" ); - - // using contents will get comments regular, text, and comment nodes - // Handle the case where no comment is in the document - assert.ok( jQuery( "#nonnodes" ).contents().length >= 2, "Check node,textnode,comment remove works" ); - jQuery( "#nonnodes" ).contents().detach(); - assert.equal( jQuery( "#nonnodes" ).contents().length, 0, "Check node,textnode,comment remove works" ); + assert.expect( 8 ); + + var markup, div; + jQuery( "#ap" ).children().detach( "a" ); + assert.ok( jQuery( "#ap" ).text().length > 10, "Check text is not removed" ); + assert.equal( jQuery( "#ap" ).children().length, 1, "Check filtered remove" ); + + jQuery( "#ap" ).children().detach( "a, code" ); + assert.equal( jQuery( "#ap" ).children().length, 0, "Check multi-filtered remove" ); + + // Positional and relative selectors + markup = "
    1234
    "; + div = jQuery( markup ); + div.children().detach( "span:nth-child(2n)" ); + assert.equal( div.text(), "13", "relative selector in detach" ); + + if ( jQuery.find.compile ) { + div = jQuery( markup ); + div.children().detach( "span:first" ); + assert.equal( div.text(), "234", "positional selector in detach" ); + div = jQuery( markup ); + div.children().detach( "span:last" ); + assert.equal( div.text(), "123", "positional selector in detach" ); + } else { + assert.ok( "skip", "positional selectors not supported in selector-native" ); + assert.ok( "skip", "positional selectors not supported in selector-native" ); + } + + // using contents will get comments regular, text, and comment nodes + // Handle the case where no comment is in the document + assert.ok( jQuery( "#nonnodes" ).contents().length >= 2, "Check node,textnode,comment remove works" ); + jQuery( "#nonnodes" ).contents().detach(); + assert.equal( jQuery( "#nonnodes" ).contents().length, 0, "Check node,textnode,comment remove works" ); } ); QUnit.test( "detach() event cleaning ", function( assert ) { diff --git a/test/unit/selector.js b/test/unit/selector.js index a1f6abd036..2f6e9affda 100644 --- a/test/unit/selector.js +++ b/test/unit/selector.js @@ -4,7 +4,7 @@ QUnit.module( "selector", { teardown: moduleTeardown } ); * This test page is for selector tests that require jQuery in order to do the selection */ -QUnit.test( "element - jQuery only", function( assert ) { +QUnit.test( "element", function( assert ) { assert.expect( 7 ); var fixture = document.getElementById( "qunit-fixture" ); @@ -63,7 +63,7 @@ QUnit.test( "id", function( assert ) { assert.t( "ID with weird characters in it", "#name\\+value", [ "name+value" ] ); } ); -QUnit.test( "class - jQuery only", function( assert ) { +QUnit.test( "class", function( assert ) { assert.expect( 4 ); assert.deepEqual( jQuery( ".blog", document.getElementsByTagName( "p" ) ).get(), q( "mark", "simon" ), "Finding elements with a context." ); @@ -103,8 +103,6 @@ QUnit.test( "selectors with comma", function( assert ) { QUnit.test( "child and adjacent", function( assert ) { assert.expect( 27 ); - var nothiddendiv; - assert.t( "Child", "p > a", [ "simon1","google","groups","mark","yahoo","simon" ] ); assert.t( "Child", "p> a", [ "simon1","google","groups","mark","yahoo","simon" ] ); assert.t( "Child", "p >a", [ "simon1","google","groups","mark","yahoo","simon" ] ); @@ -120,24 +118,27 @@ QUnit.test( "child and adjacent", function( assert ) { assert.t( "Element Preceded By", "#length ~ input", [ "idTest" ] ); assert.t( "Element Preceded By", "#siblingfirst ~ em", [ "siblingnext", "siblingthird" ] ); assert.t( "Element Preceded By (multiple)", "#siblingTest em ~ em ~ em ~ span", [ "siblingspan" ] ); - assert.t( "Element Preceded By, Containing", "#liveHandlerOrder ~ div em:contains('1')", [ "siblingfirst" ] ); + + if ( jQuery.find.compile ) { + assert.t( "Element Preceded By, Containing", "#liveHandlerOrder ~ div em:contains('1')", [ "siblingfirst" ] ); + assert.t( "Combinators are not skipped when mixing general and specific", "#siblingTest > em:contains('x') + em ~ span", [] ); + assert.equal( jQuery( "#listWithTabIndex li:eq(2) ~ li" ).length, 1, "Find by general sibling combinator (#8310)" ); + } else { + assert.ok( "skip", ":contains not supported in selector-native" ); + assert.ok( "skip", ":contains not supported in selector-native" ); + assert.ok( "skip", ":eq not supported in selector-native" ); + } assert.t( "Multiple combinators selects all levels", "#siblingTest em *", [ "siblingchild", "siblinggrandchild", "siblinggreatgrandchild" ] ); assert.t( "Multiple combinators selects all levels", "#siblingTest > em *", [ "siblingchild", "siblinggrandchild", "siblinggreatgrandchild" ] ); assert.t( "Multiple sibling combinators doesn't miss general siblings", "#siblingTest > em:first-child + em ~ span", [ "siblingspan" ] ); - assert.t( "Combinators are not skipped when mixing general and specific", "#siblingTest > em:contains('x') + em ~ span", [] ); assert.equal( jQuery( "#listWithTabIndex" ).length, 1, "Parent div for next test is found via ID (#8310)" ); - assert.equal( jQuery( "#listWithTabIndex li:eq(2) ~ li" ).length, 1, "Find by general sibling combinator (#8310)" ); assert.equal( jQuery( "#__sizzle__" ).length, 0, "Make sure the temporary id assigned by sizzle is cleared out (#8310)" ); assert.equal( jQuery( "#listWithTabIndex" ).length, 1, "Parent div for previous test is still found via ID (#8310)" ); assert.t( "Verify deep class selector", "div.blah > p > a", [] ); - assert.t( "No element deep selector", "div.foo > span > a", [] ); - - nothiddendiv = document.getElementById( "nothiddendiv" ); - assert.t( "Non-existent ancestors", ".fototab > .thumbnails > a", [] ); } ); @@ -162,8 +163,8 @@ QUnit.test( "attributes", function( assert ) { assert.t( "Attribute Equals", "#qunit-fixture a[rel=bookmark]", [ "simon1" ] ); assert.t( "Attribute Equals", "#qunit-fixture a[href='http://www.google.com/']", [ "google" ] ); assert.t( "Attribute Equals", "#qunit-fixture a[ rel = 'bookmark' ]", [ "simon1" ] ); - assert.t( "Attribute Equals Number", "#qunit-fixture option[value=1]", [ "option1b","option2b","option3b","option4b","option5c" ] ); - assert.t( "Attribute Equals Number", "#qunit-fixture li[tabIndex=-1]", [ "foodWithNegativeTabIndex" ] ); + assert.t( "Attribute Equals Number", "#qunit-fixture option[value='1']", [ "option1b","option2b","option3b","option4b","option5c" ] ); + assert.t( "Attribute Equals Number", "#qunit-fixture li[tabIndex='-1']", [ "foodWithNegativeTabIndex" ] ); document.getElementById( "anchor2" ).href = "#2"; assert.t( "href Attribute", "p a[href^='#']", [ "anchor2" ] ); @@ -189,15 +190,25 @@ QUnit.test( "attributes", function( assert ) { assert.t( "Attribute Begins With", "a[href ^= 'http://www']", [ "google","yahoo" ] ); assert.t( "Attribute Ends With", "a[href $= 'org/']", [ "mark" ] ); assert.t( "Attribute Contains", "a[href *= 'google']", [ "google","groups" ] ); - assert.t( "Attribute Is Not Equal", "#ap a[hreflang!='en']", [ "google","groups","anchor1" ] ); + + if ( jQuery.find.compile ) { + assert.t( "Empty values", "#select1 option[value!='']", [ "option1b","option1c","option1d" ] ); + assert.t( "Attribute Is Not Equal", "#ap a[hreflang!='en']", [ "google","groups","anchor1" ] ); + assert.t( "Select options via :selected", "#select1 option:selected", [ "option1a" ] ); + assert.t( "Select options via :selected", "#select2 option:selected", [ "option2d" ] ); + assert.t( "Select options via :selected", "#select3 option:selected", [ "option3b", "option3c" ] ); + assert.t( "Select options via :selected", "select[name='select2'] option:selected", [ "option2d" ] ); + } else { + assert.ok( "skip", "!= not supported in selector-native" ); + assert.ok( "skip", "!= not supported in selector-native" ); + assert.ok( "skip", ":selected not supported in selector-native" ); + assert.ok( "skip", ":selected not supported in selector-native" ); + assert.ok( "skip", ":selected not supported in selector-native" ); + assert.ok( "skip", ":selected not supported in selector-native" ); + } assert.t( "Empty values", "#select1 option[value='']", [ "option1a" ] ); - assert.t( "Empty values", "#select1 option[value!='']", [ "option1b","option1c","option1d" ] ); - assert.t( "Select options via :selected", "#select1 option:selected", [ "option1a" ] ); - assert.t( "Select options via :selected", "#select2 option:selected", [ "option2d" ] ); - assert.t( "Select options via :selected", "#select3 option:selected", [ "option3b", "option3c" ] ); - assert.t( "Select options via :selected", "select[name='select2'] option:selected", [ "option2d" ] ); assert.t( "Grouped Form Elements", "input[name='foo[bar]']", [ "hidden2" ] ); @@ -233,17 +244,24 @@ QUnit.test( "attributes", function( assert ) { assert.t( "Value attribute is retrieved correctly", "input[value=Test]", [ "text1", "text2" ] ); - // #12600 - assert.ok( - jQuery( "" ) - .prop( "value", "option" ) - .is( ":input[value='12600']" ), + if ( jQuery.find.compile ) { + + // #12600 + assert.ok( + jQuery( "" ) + .prop( "value", "option" ) + .is( ":input[value='12600']" ), + + ":input[value=foo] selects select by attribute" + ); + assert.ok( jQuery( "" ).prop( "value", "option" ).is( ":input[value='12600']" ), + ":input[value=foo] selects text input by attribute" + ); + } else { + assert.ok( "skip", ":input not supported in selector-native" ); + assert.ok( "skip", ":input not supported in selector-native" ); + } - ":input[value=foo] selects select by attribute" - ); - assert.ok( jQuery( "" ).prop( "value", "option" ).is( ":input[value='12600']" ), - ":input[value=foo] selects text input by attribute" - ); // #11115 assert.ok( jQuery( "" ).prop( "checked", false ).is( "[checked]" ), @@ -261,7 +279,7 @@ QUnit.test( "disconnected nodes", function( assert ) { assert.equal( $div.is( "div" ), true, "Make sure .is('nodeName') works on disconnected nodes." ); } ); -QUnit.test( "disconnected nodes - jQuery only", function( assert ) { +QUnit[ jQuery.find.compile ? "test" : "skip" ]( "disconnected nodes", function( assert ) { assert.expect( 3 ); var $opt = jQuery( "" ).attr( "value", "whipit" ).appendTo( "#qunit-fixture" ).detach(); diff --git a/test/unit/serialize.js b/test/unit/serialize.js index 0eb98560f7..65d94171ca 100644 --- a/test/unit/serialize.js +++ b/test/unit/serialize.js @@ -142,8 +142,9 @@ QUnit.test( "serialize()", function( assert ) { "action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&email=dave%40jquery.com&number=43&select1=&select2=3&select3=1&select3=2&select5=3&T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My%20Name=me&S1=abc&S3=YES&S4=", "Multiple form serialization as query string" ); - assert.equal( jQuery( "#form, #testForm :input" ).serialize(), + assert.equal( jQuery( "#form, #testForm input, #testForm select, #testForm textarea, #testForm button" ).serialize(), "action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&email=dave%40jquery.com&number=43&select1=&select2=3&select3=1&select3=2&select5=3&T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My%20Name=me&S1=abc&S3=YES&S4=", "Mixed form/input serialization as query string" ); + jQuery( "#html5email, #html5number" ).remove(); } ); diff --git a/test/unit/traversing.js b/test/unit/traversing.js index a16987b220..7766fd3cb8 100644 --- a/test/unit/traversing.js +++ b/test/unit/traversing.js @@ -13,7 +13,7 @@ QUnit.test( "find(String) under non-elements", function( assert ) { assert.equal( j.find( "div" ).addBack().length, 3, "Check node,textnode,comment to find zero divs, but preserves pushStack" ); } ); -QUnit.test( "find(leading combinator)", function( assert ) { +QUnit[ jQuery.find.compile ? "test" : "skip" ]( "find(leading combinator)", function( assert ) { assert.expect( 4 ); assert.deepEqual( jQuery( "#qunit-fixture" ).find( "> div" ).get(), q( "foo", "nothiddendiv", "moretests", "tabindex-tests", "liveHandlerOrder", "siblingTest", "fx-test-group" ), "find child elements" ); @@ -130,7 +130,7 @@ QUnit.test( "is(jQuery)", function( assert ) { assert.ok( !jQuery( "#simon" ).is( jQuery( ".blogTest" )[ 0 ] ), "Check for multiple classes: Expected classes 'blog' and 'link', but not 'blogTest'" ); } ); -QUnit.test( "is() with :has() selectors", function( assert ) { +QUnit[ jQuery.find.compile ? "test" : "skip" ]( "is() with :has() selectors", function( assert ) { assert.expect( 6 ); assert.ok( jQuery( "#foo" ).is( ":has(p)" ), "Check for child: Expected a child 'p' element" ); @@ -142,7 +142,7 @@ QUnit.test( "is() with :has() selectors", function( assert ) { assert.ok( !jQuery( "#foo" ).is( jQuery( "div:has(ul)" ) ), "Check for child: Did not expect 'ul' element" ); } ); -QUnit.test( "is() with positional selectors", function( assert ) { +QUnit[ jQuery.find.compile ? "test" : "skip" ]( "is() with positional selectors", function( assert ) { assert.expect( 27 ); var @@ -279,7 +279,7 @@ QUnit.test( "filter(jQuery)", function( assert ) { assert.deepEqual( jQuery( "#form input" ).filter( elements ).get(), q( "text1" ), "filter(Element)" ); } ); -QUnit.test( "filter() with positional selectors", function( assert ) { +QUnit[ jQuery.find.compile ? "test" : "skip" ]( "filter() with positional selectors", function( assert ) { assert.expect( 19 ); var filterit = function( sel, filter, length ) { @@ -354,7 +354,7 @@ QUnit.test( "closest()", function( assert ) { assert.deepEqual( jq.contents().closest( "*" ).get(), jq.get(), "Text node input (#13332)" ); } ); -QUnit.test( "closest() with positional selectors", function( assert ) { +QUnit[ jQuery.find.compile ? "test" : "skip" ]( "closest() with positional selectors", function( assert ) { assert.expect( 2 ); assert.deepEqual( jQuery( "#qunit-fixture" ).closest( "div:first" ).get(), [], "closest(div:first)" ); @@ -377,8 +377,8 @@ QUnit.test( "closest(jQuery)", function( assert ) { assert.ok( $child.closest( $body.add( $parent ) ).is( "#nothiddendiv" ), "Closest ancestor retrieved." ); } ); -QUnit.test( "not(Selector|undefined)", function( assert ) { - assert.expect( 11 ); +QUnit[ jQuery.find.compile ? "test" : "skip" ]( "not(Selector)", function( assert ) { + assert.expect( 7 ); assert.equal( jQuery( "#qunit-fixture > p#ap > a" ).not( "#google" ).length, 2, "not('selector')" ); assert.deepEqual( jQuery( "p" ).not( ".result" ).get(), q( "firstp", "ap", "sndp", "en", "sap", "first" ), "not('.class')" ); assert.deepEqual( jQuery( "p" ).not( "#ap, #sndp, .result" ).get(), q( "firstp", "en", "sap", "first" ), "not('selector, selector')" ); @@ -387,12 +387,6 @@ QUnit.test( "not(Selector|undefined)", function( assert ) { assert.deepEqual( jQuery( "#ap *" ).not( "code, #mark" ).get(), q( "google", "groups", "anchor1" ), "not('tag, ID selector')" ); assert.deepEqual( jQuery( "#ap *" ).not( "#mark, code" ).get(), q( "google", "groups", "anchor1" ), "not('ID, tag selector')" ); - var all = jQuery( "p" ).get(); - assert.deepEqual( jQuery( "p" ).not( null ).get(), all, "not(null) should have no effect" ); - assert.deepEqual( jQuery( "p" ).not( undefined ).get(), all, "not(undefined) should have no effect" ); - assert.deepEqual( jQuery( "p" ).not( 0 ).get(), all, "not(0) should have no effect" ); - assert.deepEqual( jQuery( "p" ).not( "" ).get(), all, "not('') should have no effect" ); - assert.deepEqual( jQuery( "#form option" ).not( "option.emptyopt:contains('Nothing'),optgroup *,[value='1']" ).get(), q( "option1c", "option1d", "option2c", "option2d", "option3c", "option3d", "option3e", "option4d", "option4e", "option5a", "option5b" ), @@ -400,6 +394,16 @@ QUnit.test( "not(Selector|undefined)", function( assert ) { ); } ); +QUnit.test( "not(undefined)", function( assert ) { + assert.expect( 4 ); + + var all = jQuery( "p" ).get(); + assert.deepEqual( jQuery( "p" ).not( null ).get(), all, "not(null) should have no effect" ); + assert.deepEqual( jQuery( "p" ).not( undefined ).get(), all, "not(undefined) should have no effect" ); + assert.deepEqual( jQuery( "p" ).not( 0 ).get(), all, "not(0) should have no effect" ); + assert.deepEqual( jQuery( "p" ).not( "" ).get(), all, "not('') should have no effect" ); +} ); + QUnit.test( "not(Element)", function( assert ) { assert.expect( 1 ); @@ -500,7 +504,7 @@ QUnit.test( "siblings([String])", function( assert ) { assert.equal( jQuery( "" ).siblings().length, 0, "Detached elements have no siblings (#11370)" ); } ); -QUnit.test( "siblings([String]) - jQuery only", function( assert ) { +QUnit[ jQuery.find.compile ? "test" : "skip" ]( "siblings([String])", function( assert ) { assert.expect( 2 ); assert.deepEqual( jQuery( "#sndp" ).siblings( ":has(code)" ).get(), q( "sap" ), "Check for filtered siblings (has code child element)" ); assert.deepEqual( jQuery( "#sndp" ).siblings( ":has(a)" ).get(), q( "en", "sap" ), "Check for filtered siblings (has anchor child element)" ); @@ -512,7 +516,7 @@ QUnit.test( "children([String])", function( assert ) { assert.deepEqual( jQuery( "#foo" ).children( "#en, #sap" ).get(), q( "en", "sap" ), "Check for multiple filters" ); } ); -QUnit.test( "children([String]) - jQuery only", function( assert ) { +QUnit[ jQuery.find.compile ? "test" : "skip" ]( "children([String])", function( assert ) { assert.expect( 1 ); assert.deepEqual( jQuery( "#foo" ).children( ":has(code)" ).get(), q( "sndp", "sap" ), "Check for filtered children" ); } ); From 5f5aee3b582cff72823efe9ed2785c1d17eadfd3 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Thu, 12 Nov 2015 13:23:53 -0500 Subject: [PATCH 062/927] Release: use chalk instead of colors for terminal colors --- build/release.js | 3 ++- build/release/ensure-sizzle.js | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/build/release.js b/build/release.js index 7fd00bd8c2..5feddfa240 100644 --- a/build/release.js +++ b/build/release.js @@ -56,5 +56,6 @@ module.exports = function( Release ) { module.exports.dependencies = [ "archiver@0.14.2", "shelljs@0.2.6", - "npm@2.3.0" + "npm@2.3.0", + "chalk@1.1.1" ]; diff --git a/build/release/ensure-sizzle.js b/build/release/ensure-sizzle.js index 7957606431..f9c5c70dd1 100644 --- a/build/release/ensure-sizzle.js +++ b/build/release/ensure-sizzle.js @@ -1,5 +1,6 @@ var fs = require( "fs" ), npm = require( "npm" ), + chalk = require( "chalk" ), sizzleLoc = __dirname + "/../../external/sizzle/dist/sizzle.js", rversion = /Engine v(\d+\.\d+\.\d+(?:-[-\.\d\w]+)?)/; @@ -37,12 +38,12 @@ function ensureSizzle( Release, callback ) { // colors is inherited from jquery-release console.log( - "The Sizzle version in the src folder (" + version.red + - ") is not the latest tag (" + latest.green + ")." + "The Sizzle version in the src folder (" + chalk.red( version ) + + ") is not the latest tag (" + chalk.green( latest ) + ")." ); Release.confirm( callback ); } else { - console.log( "Sizzle is latest (" + latest.green + ")" ); + console.log( "Sizzle is latest (" + chalk.green( latest ) + ")" ); callback(); } } ); From 8b65446a60c421cfc3411fe273edcc506783f628 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Thu, 12 Nov 2015 13:25:42 -0500 Subject: [PATCH 063/927] Release: update authors --- AUTHORS.txt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/AUTHORS.txt b/AUTHORS.txt index 58c73afbc9..35565fa20e 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -259,3 +259,16 @@ Chris Rebert Gabriel Schulhof Gilad Peleg Martin Naumann +Marek Lewandowski +Bruno Pérel +Reed Loden +Daniel Nill +Yongwoo Jeon +Sean Henderson +Richard Kraaijenhagen +Connor Atherton +Gary Ye +Christian Grete +Liza Ramo +Julian Alexander Murillo +Joelle Fleurantin From 78b9eac1198627eb4dad0cc35334c7704449f310 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Wed, 11 Nov 2015 10:35:37 -0500 Subject: [PATCH 064/927] Deferred: syncronize single and multiple target handling in $.when Fixes gh-2546 Fixes gh-2018 Close gh-2707 --- src/deferred.js | 22 +++++++++++----------- test/unit/deferred.js | 42 +++++++++++++++++++++++++++++++++++------- 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/deferred.js b/src/deferred.js index e1af425d48..846528e795 100644 --- a/src/deferred.js +++ b/src/deferred.js @@ -294,19 +294,17 @@ jQuery.extend( { }, // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { + when: function() { var method, i = 0, resolveValues = slice.call( arguments ), length = resolveValues.length, // the count of uncompleted subordinates - remaining = length !== 1 || - ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + remaining = length, // the master Deferred. - // If resolveValues consist of only a single Deferred, just use that. - master = remaining === 1 ? subordinate : jQuery.Deferred(), + master = jQuery.Deferred(), // Update function for both resolve and progress values updateFunc = function( i, contexts, values ) { @@ -316,14 +314,17 @@ jQuery.extend( { if ( values === progressValues ) { master.notifyWith( contexts, values ); } else if ( !( --remaining ) ) { - master.resolveWith( contexts, values ); + master.resolveWith( + contexts.length === 1 ? contexts[ 0 ] : contexts, + values + ); } }; }, progressValues, progressContexts, resolveContexts; // Add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { + if ( length > 0 ) { progressValues = new Array( length ); progressContexts = new Array( length ); resolveContexts = new Array( length ); @@ -345,14 +346,13 @@ jQuery.extend( { updateFunc( i, progressContexts, progressValues ) ); } else { - --remaining; + updateFunc( i, resolveContexts, resolveValues )( resolveValues[ i ] ); } } - } // If we're not waiting on anything, resolve the master - if ( !remaining ) { - master.resolveWith( resolveContexts, resolveValues ); + } else { + master.resolveWith(); } return master.promise(); diff --git a/test/unit/deferred.js b/test/unit/deferred.js index 2277df1903..1a721d1ee0 100644 --- a/test/unit/deferred.js +++ b/test/unit/deferred.js @@ -667,7 +667,6 @@ QUnit.test( "jQuery.when", function( assert ) { "undefined": undefined, "a plain object": {}, "an array": [ 1, 2, 3 ] - }, function( message, value ) { assert.ok( jQuery.isFunction( @@ -698,12 +697,10 @@ QUnit.test( "jQuery.when", function( assert ) { } ); jQuery.each( [ 1, 2, 3 ], function( k, i ) { - jQuery.when( cache || jQuery.Deferred( function() { this.resolve( i ); } ) ).done( function( value ) { - assert.strictEqual( value, 1, "Function executed" + ( i > 1 ? " only once" : "" ) ); cache = value; } ); @@ -759,10 +756,8 @@ QUnit.test( "jQuery.when - joined", function( assert ) { expected = shouldResolve ? [ 1, 1 ] : [ 0, undefined ], expectedNotify = shouldNotify && [ willNotify[ id1 ], willNotify[ id2 ] ], code = "jQuery.when( " + id1 + ", " + id2 + " )", - context1 = defer1 && jQuery.isFunction( defer1.promise ) ? defer1.promise() : - ( defer1.then ? window : undefined ), - context2 = defer2 && jQuery.isFunction( defer2.promise ) ? defer2.promise() : - ( defer2.then ? window : undefined ); + context1 = defer1 && jQuery.isFunction( defer1.promise ) ? defer1.promise() : window, + context2 = defer2 && jQuery.isFunction( defer2.promise ) ? defer2.promise() : window; jQuery.when( defer1, defer2 ).done( function( a, b ) { if ( shouldResolve ) { @@ -880,3 +875,36 @@ QUnit.test( "jQuery.when - chaining", function( assert ) { defer.resolve( "other deferred" ); } ); + +QUnit.test( "jQuery.when - solitary thenables", function( assert ) { + + assert.expect( 1 ); + + var done = assert.async(), + rejected = new Promise( function( resolve, reject ) { + setTimeout( function() { + reject( "rejected" ); + }, 100 ); + } ); + + jQuery.when( rejected ).then( + function() { + assert.ok( false, "Rejected, solitary, non-Deferred thenable should not resolve" ); + done(); + }, + function() { + assert.ok( true, "Rejected, solitary, non-Deferred thenable rejected properly" ); + done(); + } + ); +} ); + +QUnit.test( "jQuery.when does not reuse a solitary jQuery Deferred (gh-2018)", function( assert ) { + + assert.expect( 2 ); + var defer = jQuery.Deferred().resolve(), + promise = jQuery.when( defer ); + + assert.equal( promise.state(), "resolved", "Master Deferred is immediately resolved" ); + assert.notStrictEqual( defer.promise(), promise, "jQuery.when returns the master deferred's promise" ); +} ); From cf7102c3f1bcbd135f24947a3a3216cff272bdc2 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Thu, 12 Nov 2015 13:18:59 -0500 Subject: [PATCH 065/927] Release: push a custom slim build to the CDN Fixes gh-2653 Close gh-2711 --- Gruntfile.js | 10 ++++++++-- build/release.js | 16 ++++++++++++++-- build/release/cdn.js | 19 ++++++++++--------- build/release/dist.js | 21 ++++++++++----------- build/tasks/build.js | 8 ++++++-- build/tasks/dist.js | 9 +++++---- build/tasks/sourcemap.js | 3 ++- 7 files changed, 55 insertions(+), 31 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index dd4b07d308..626531b293 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -31,6 +31,10 @@ module.exports = function( grunt ) { // But our modules can delete srcHintOptions.onevar; + if ( !grunt.option( "filename" ) ) { + grunt.option( "filename", "jquery.js" ); + } + grunt.initConfig( { pkg: grunt.file.readJSON( "package.json" ), dst: readOptionalJSON( "dist/.destination.json" ), @@ -173,12 +177,14 @@ module.exports = function( grunt ) { uglify: { all: { files: { - "dist/jquery.min.js": [ "dist/jquery.js" ] + "dist/<%= grunt.option('filename').replace('.js', '.min.js') %>": + "dist/<%= grunt.option('filename') %>" }, options: { preserveComments: false, sourceMap: true, - sourceMapName: "dist/jquery.min.map", + sourceMapName: + "dist/<%= grunt.option('filename').replace('.js', '.min.map') %>", report: "min", beautify: { "ascii_only": true diff --git a/build/release.js b/build/release.js index 5feddfa240..a333d05b44 100644 --- a/build/release.js +++ b/build/release.js @@ -2,7 +2,14 @@ module.exports = function( Release ) { var - files = [ "dist/jquery.js", "dist/jquery.min.js", "dist/jquery.min.map" ], + files = [ + "dist/jquery.js", + "dist/jquery.min.js", + "dist/jquery.min.map", + "dist/jquery.slim.js", + "dist/jquery.slim.min.js", + "dist/jquery.slim.min.map" + ], cdn = require( "./release/cdn" ), dist = require( "./release/dist" ), ensureSizzle = require( "./release/ensure-sizzle" ), @@ -27,6 +34,11 @@ module.exports = function( Release ) { */ generateArtifacts: function( callback ) { Release.exec( "grunt", "Grunt command failed" ); + Release.exec( + "grunt custom:-ajax,-effects,-deprecated --filename=jquery.slim.js && " + + "grunt remove_map_comment --filename=jquery.slim.js", + "Grunt custom failed" + ); cdn.makeReleaseCopies( Release ); callback( files ); }, @@ -47,7 +59,7 @@ module.exports = function( Release ) { */ dist: function( callback ) { cdn.makeArchives( Release, function() { - dist( Release, callback ); + dist( Release, files, callback ); } ); } } ); diff --git a/build/release/cdn.js b/build/release/cdn.js index 07285a56d6..3b485112e9 100644 --- a/build/release/cdn.js +++ b/build/release/cdn.js @@ -5,22 +5,23 @@ var cdnFolder = "dist/cdn", - devFile = "dist/jquery.js", - minFile = "dist/jquery.min.js", - mapFile = "dist/jquery.min.map", - releaseFiles = { - "jquery-VER.js": devFile, - "jquery-VER.min.js": minFile, - "jquery-VER.min.map": mapFile + "jquery-VER.js": "dist/jquery.js", + "jquery-VER.min.js": "dist/jquery.min.js", + "jquery-VER.min.map": "dist/jquery.min.map", + "jquery-VER.slim.js": "dist/jquery.slim.js", + "jquery-VER.slim.min.js": "dist/jquery.slim.min.js", + "jquery-VER.slim.min.map": "dist/jquery.slim.min.map" }, googleFilesCDN = [ - "jquery.js", "jquery.min.js", "jquery.min.map" + "jquery.js", "jquery.min.js", "jquery.min.map", + "jquery.slim.js", "jquery.slim.min.js", "jquery.slim.min.map" ], msFilesCDN = [ - "jquery-VER.js", "jquery-VER.min.js", "jquery-VER.min.map" + "jquery-VER.js", "jquery-VER.min.js", "jquery-VER.min.map", + "jquery-VER.slim.js", "jquery-VER.slim.min.js", "jquery-VER.slim.min.map" ]; /** diff --git a/build/release/dist.js b/build/release/dist.js index 32053eafb0..514d407396 100644 --- a/build/release/dist.js +++ b/build/release/dist.js @@ -1,13 +1,16 @@ -module.exports = function( Release, complete ) { +module.exports = function( Release, files, complete ) { var fs = require( "fs" ), shell = require( "shelljs" ), pkg = require( Release.dir.repo + "/package.json" ), - distRemote = Release.remote.replace( "jquery.git", "jquery-dist.git" ), + distRemote = Release.remote + + // For local and github dists + .replace( /jquery(\.git|$)/, "jquery-dist$1" ), // These files are included with the distribution - files = [ + extras = [ "src", "LICENSE.txt", "AUTHORS.txt", @@ -54,17 +57,13 @@ module.exports = function( Release, complete ) { // Copy dist files var distFolder = Release.dir.dist + "/dist"; shell.mkdir( "-p", distFolder ); - [ - "dist/jquery.js", - "dist/jquery.min.js", - "dist/jquery.min.map" - ].forEach( function( file ) { - shell.cp( Release.dir.repo + "/" + file, distFolder ); + files.forEach( function( file ) { + shell.cp( "-f", Release.dir.repo + "/" + file, distFolder ); } ); // Copy other files - files.forEach( function( file ) { - shell.cp( "-r", Release.dir.repo + "/" + file, Release.dir.dist ); + extras.forEach( function( file ) { + shell.cp( "-rf", Release.dir.repo + "/" + file, Release.dir.dist ); } ); // Write generated bower file diff --git a/build/tasks/build.js b/build/tasks/build.js index 74fa47fde4..c9f1daeb8f 100644 --- a/build/tasks/build.js +++ b/build/tasks/build.js @@ -15,7 +15,6 @@ module.exports = function( grunt ) { config = { baseUrl: "src", name: "jquery", - out: "dist/jquery.js", // We have multiple minify steps optimize: "none", @@ -115,7 +114,7 @@ module.exports = function( grunt ) { done = this.async(), flags = this.flags, optIn = flags[ "*" ], - name = this.data.dest, + name = grunt.option( "filename" ), minimum = this.data.minimum, removeWith = this.data.removeWith, excluded = [], @@ -205,6 +204,11 @@ module.exports = function( grunt ) { } }; + // Filename can be passed to the command line using + // command line options + // e.g. grunt build --filename=jquery-custom.js + name = name ? ( "dist/" + name ) : this.data.dest; + // append commit id to version if ( process.env.COMMIT ) { version += " " + process.env.COMMIT; diff --git a/build/tasks/dist.js b/build/tasks/dist.js index 78ce2f254e..fa6920c889 100644 --- a/build/tasks/dist.js +++ b/build/tasks/dist.js @@ -2,11 +2,12 @@ module.exports = function( grunt ) { "use strict"; - var fs = require( "fs" ), + var fs = require( "fs" ), + filename = grunt.option( "filename" ), distpaths = [ - "dist/jquery.js", - "dist/jquery.min.map", - "dist/jquery.min.js" + "dist/" + filename, + "dist/" + filename.replace( ".js", ".min.map" ), + "dist/" + filename.replace( ".js", ".min.js" ) ]; // Process files for distribution diff --git a/build/tasks/sourcemap.js b/build/tasks/sourcemap.js index 3e4144de01..3f21b2afd0 100644 --- a/build/tasks/sourcemap.js +++ b/build/tasks/sourcemap.js @@ -1,8 +1,9 @@ var fs = require( "fs" ); module.exports = function( grunt ) { - var minLoc = Object.keys( grunt.config( "uglify.all.files" ) )[ 0 ]; + var config = grunt.config( "uglify.all.files" ); grunt.registerTask( "remove_map_comment", function() { + var minLoc = grunt.config.process( Object.keys( config )[ 0 ] ); // Remove the source map comment; it causes way too many problems. // The map file is still generated for manual associations From cb80b42b91bc7d0e75fb842f733878b848a8b9c1 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Mon, 16 Nov 2015 15:36:48 -0500 Subject: [PATCH 066/927] Effects: add tests for using jQuery.speed directly Fixes gh-2716 Close gh-2724 --- test/unit/effects.js | 85 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/test/unit/effects.js b/test/unit/effects.js index 0f38f81a5c..33357deda4 100644 --- a/test/unit/effects.js +++ b/test/unit/effects.js @@ -2495,4 +2495,89 @@ QUnit.test( "Show/hide/toggle and display: inline", function( assert ) { } ); } ); +function testEasing( assert, speed, easing, complete ) { + assert.expect( 4 ); + var options = jQuery.speed( speed, easing, complete ); + + assert.equal( options.duration, 10, "Duration set properly" ); + assert.equal( + jQuery.isFunction( options.easing ) ? options.easing() : options.easing, + "linear", + "Easing set properly" + ); + assert.equal( options.queue, "fx", "Queue defaults to fx" ); + options.complete(); +} + +QUnit.test( "jQuery.speed( speed, easing, complete )", function( assert ) { + testEasing( assert, 10, "linear", function() { + assert.ok( true, "Complete called" ); + } ); +} ); + +QUnit.test( "jQuery.speed( speed, easing, complete ) - with easing function", function( assert ) { + testEasing( + assert, + 10, + function() { + return "linear"; + }, + function() { + assert.ok( true, "Complete called" ); + } + ); +} ); + +QUnit.test( "jQuery.speed( options )", function( assert ) { + testEasing( assert, { + duration: 10, + easing: "linear", + complete: function() { + assert.ok( true, "Complete called" ); + } + } ); +} ); + +QUnit.test( "jQuery.speed( options ) - with easing function", function( assert ) { + testEasing( assert, { + duration: 10, + easing: function() { + return "linear"; + }, + complete: function() { + assert.ok( true, "Complete called" ); + } + } ); +} ); + +QUnit.test( "jQuery.speed( options ) - queue values", function( assert ) { + assert.expect( 5 ); + + var get = function( queue ) { + return jQuery.speed( { queue: queue } ).queue; + }; + + assert.equal( get( null ), "fx", "null defaults to 'fx'" ); + assert.equal( get( undefined ), "fx", "undefined defaults to 'fx'" ); + assert.equal( get( true ), "fx", "true defaults to 'fx'" ); + assert.equal( get( "fx" ), "fx", "'fx' passed through" ); + assert.equal( get( "custom" ), "custom", "'custom' passed through" ); +} ); + +QUnit.test( "jQuery.speed() - durations", function( assert ) { + assert.expect( 5 ); + + var get = function( duration ) { + return jQuery.speed( duration ).duration; + }; + + assert.equal( get( 100 ), 100, "jQuery.speed sets number duration" ); + assert.equal( get(), jQuery.fx.speeds._default, "jQuery.speed falls back default duration" ); + assert.equal( get( "slow" ), jQuery.fx.speeds.slow, "jQuery.speed uses preset speeds" ); + assert.equal( get( "fast" ), jQuery.fx.speeds.fast, "jQuery.speed uses preset speeds" ); + jQuery.fx.off = true; + assert.equal( get( 100 ), 0, "jQuery.speed defaults duration to zero if fx is off" ); + jQuery.fx.off = false; +} ); + } )(); From e0c25abb435db6e210d00407af2ba40e5f0b56ad Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Mon, 16 Nov 2015 15:49:59 -0500 Subject: [PATCH 067/927] Docs: add a note about loading source with AMD - Moves the note about the watch task and the note about loading with AMD to their own section under "Test Suite Tips" Fixes gh-2714 Close gh-2725 --- CONTRIBUTING.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3f6547c568..cd6ab6fc4c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -101,12 +101,6 @@ Run the build script $ npm run build ``` -Run the Grunt tools: - -```bash -$ grunt && grunt watch -``` - Now open the jQuery test suite in a browser at http://localhost/test. If there is a port, be sure to include it. Success! You just built and tested jQuery! @@ -118,13 +112,26 @@ During the process of writing your patch, you will run the test suite MANY times Example: -http://localhost/test/?filter=css +http://localhost/test/?module=css This will only run the "css" module tests. This will significantly speed up your development and debugging. **ALWAYS RUN THE FULL SUITE BEFORE COMMITTING AND PUSHING A PATCH!** +#### Loading changes on the test page + +Rather than rebuilding jQuery with `grunt` every time you make a change, you can use the included `grunt watch` task to rebuild distribution files whenever a file is saved. + +```bash +$ grunt watch +``` + +Alternatively, you can **load tests in AMD** to avoid the need for rebuilding altogether. + +Click "Load with AMD" after loading the test page. + + ### Browser support Remember that jQuery supports multiple browsers and their versions; any contributed code must work in all of them. You can refer to the [browser support page](http://jquery.com/browser-support/) for the current list of supported browsers. From eaa3e9f0cfc68083556cf61195821d90e369f646 Mon Sep 17 00:00:00 2001 From: Richard Gibson Date: Sun, 8 Nov 2015 21:49:47 -0500 Subject: [PATCH 068/927] Ajax: Golf away 21 bytes Close gh-2699 --- src/ajax.js | 58 ++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index ca2b910dd0..27abe375e1 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -406,6 +406,9 @@ jQuery.extend( { // Url cleanup var urlAnchor, + // Request state (becomes false upon send and true upon completion) + completed, + // To know if global events are to be dispatched fireGlobals, @@ -435,9 +438,6 @@ jQuery.extend( { requestHeaders = {}, requestHeadersNames = {}, - // The jqXHR state - state = 0, - // Default abort message strAbort = "canceled", @@ -448,7 +448,7 @@ jQuery.extend( { // Builds headers hashtable if needed getResponseHeader: function( key ) { var match; - if ( state === 2 ) { + if ( completed ) { if ( !responseHeaders ) { responseHeaders = {}; while ( ( match = rheaders.exec( responseHeadersString ) ) ) { @@ -462,14 +462,14 @@ jQuery.extend( { // Raw string getAllResponseHeaders: function() { - return state === 2 ? responseHeadersString : null; + return completed ? responseHeadersString : null; }, // Caches the header setRequestHeader: function( name, value ) { - var lname = name.toLowerCase(); - if ( !state ) { - name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; requestHeaders[ name ] = value; } return this; @@ -477,7 +477,7 @@ jQuery.extend( { // Overrides response content-type header overrideMimeType: function( type ) { - if ( !state ) { + if ( completed == null ) { s.mimeType = type; } return this; @@ -487,16 +487,16 @@ jQuery.extend( { statusCode: function( map ) { var code; if ( map ) { - if ( state < 2 ) { - for ( code in map ) { - - // Lazy-add the new callback in a way that preserves old ones - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } else { + if ( completed ) { // Execute the appropriate callbacks jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } } } return this; @@ -560,7 +560,7 @@ jQuery.extend( { inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); // If request was aborted inside a prefilter, stop there - if ( state === 2 ) { + if ( completed ) { return jqXHR; } @@ -642,7 +642,7 @@ jQuery.extend( { // Allow custom headers/mimetypes and early abort if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { // Abort if not done already and return return jqXHR.abort(); @@ -671,7 +671,7 @@ jQuery.extend( { } // If request was aborted inside ajaxSend, stop there - if ( state === 2 ) { + if ( completed ) { return jqXHR; } @@ -683,18 +683,17 @@ jQuery.extend( { } try { - state = 1; + completed = false; transport.send( requestHeaders, done ); } catch ( e ) { - // Propagate exception as error if not done - if ( state < 2 ) { - done( -1, e ); - - // Simply rethrow otherwise - } else { + // Rethrow post-completion exceptions + if ( completed ) { throw e; } + + // Propagate others as results + done( -1, e ); } } @@ -703,13 +702,12 @@ jQuery.extend( { var isSuccess, success, error, response, modified, statusText = nativeStatusText; - // Called once - if ( state === 2 ) { + // Ignore repeat invocations + if ( completed ) { return; } - // State is "done" now - state = 2; + completed = true; // Clear timeout if it exists if ( timeoutTimer ) { From e077ffb083743f4a4b990f586c9d25d787e7b417 Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Sun, 15 Nov 2015 21:51:18 -0500 Subject: [PATCH 069/927] Ajax: Preserve URL hash on requests Fixes gh-1732 Closes gh-2721 --- src/ajax.js | 28 ++++++++++++++++------------ test/unit/ajax.js | 22 ++++++++++++++++++---- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index 27abe375e1..195a30a20b 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -415,6 +415,9 @@ jQuery.extend( { // Loop variable i, + // uncached part of the url + uncached, + // Create the final options object s = jQuery.ajaxSetup( {}, options ), @@ -516,11 +519,10 @@ jQuery.extend( { // Attach deferreds deferred.promise( jqXHR ); - // Remove hash character (#7531: and string promotion) // Add protocol if not provided (prefilters might expect it) // Handle falsy url in the settings object (#10093: consistency with old signature) // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ).replace( rhash, "" ) + s.url = ( ( url || s.url || location.href ) + "" ) .replace( rprotocol, location.protocol + "//" ); // Alias method option to type as per ticket #12004 @@ -581,30 +583,32 @@ jQuery.extend( { // Save the URL in case we're toying with the If-Modified-Since // and/or If-None-Match header later on - cacheURL = s.url; + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); // More options handling for requests with no content if ( !s.hasContent ) { + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + // If data is available, append data to url if ( s.data ) { - cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data ); + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; // #9682: remove data so that it's not used in an eventual retry delete s.data; } - // Add anti-cache in url if needed + // Add anti-cache in uncached url if needed if ( s.cache === false ) { - s.url = rts.test( cacheURL ) ? - - // If there is already a '_' parameter, set its value - cacheURL.replace( rts, "$1_=" + nonce++ ) : - - // Otherwise add one to the end - cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++; + cacheURL = cacheURL.replace( rts, "" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; } + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + // Change '%20' to '+' if this is encoded form body content (gh-2658) } else if ( s.data && s.processData && ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 12bf2ab31f..f468f44a8e 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -328,12 +328,12 @@ QUnit.module( "ajax", { }; } ); - ajaxTest( "jQuery.ajax() - hash", 3, function( assert ) { + ajaxTest( "jQuery.ajax() - hash", 4, function( assert ) { return [ { url: "data/name.html#foo", beforeSend: function( xhr, settings ) { - assert.equal( settings.url, "data/name.html", "Make sure that the URL is trimmed." ); + assert.equal( settings.url, "data/name.html#foo", "Make sure that the URL has its hash." ); return false; }, error: true @@ -341,7 +341,7 @@ QUnit.module( "ajax", { { url: "data/name.html?abc#foo", beforeSend: function( xhr, settings ) { - assert.equal( settings.url, "data/name.html?abc", "Make sure that the URL is trimmed." ); + assert.equal( settings.url, "data/name.html?abc#foo", "Make sure that the URL has its hash." ); return false; }, error: true @@ -352,7 +352,21 @@ QUnit.module( "ajax", { "test": 123 }, beforeSend: function( xhr, settings ) { - assert.equal( settings.url, "data/name.html?abc&test=123", "Make sure that the URL is trimmed." ); + assert.equal( settings.url, "data/name.html?abc&test=123#foo", "Make sure that the URL has its hash." ); + return false; + }, + error: true + }, + { + url: "data/name.html?abc#brownies", + data: { + "devo": "hat" + }, + cache: false, + beforeSend: function( xhr, settings ) { + // Remove the random number, but ensure the cashe-buster param is there + var url = settings.url.replace( /\d+/, "" ); + assert.equal( url, "data/name.html?abc&devo=hat&_=#brownies", "Make sure that the URL has its hash." ); return false; }, error: true From 6680c1b29ea79bf33ac6bd31578755c7c514ed3e Mon Sep 17 00:00:00 2001 From: Oleg Gaidarenko Date: Sat, 14 Nov 2015 01:28:16 +0300 Subject: [PATCH 070/927] Core: do not expose second argument of the `jQuery.globalEval` Closes jquery/api.jquery.com#831 Closes gh-2718 --- src/core.js | 14 ++++++-------- src/core/DOMEval.js | 14 ++++++++++++++ src/manipulation.js | 5 +++-- 3 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 src/core/DOMEval.js diff --git a/src/core.js b/src/core.js index 9095213eb3..3a54ffc0e6 100644 --- a/src/core.js +++ b/src/core.js @@ -8,8 +8,10 @@ define( [ "./var/class2type", "./var/toString", "./var/hasOwn", - "./var/support" -], function( arr, document, slice, concat, push, indexOf, class2type, toString, hasOwn, support ) { + "./var/support", + "./core/DOMEval" +], function( arr, document, slice, concat, + push, indexOf, class2type, toString, hasOwn, support, DOMEval ) { var version = "@VERSION", @@ -258,12 +260,8 @@ jQuery.extend( { }, // Evaluates a script in a global context - globalEval: function( code, context ) { - context = context || document; - var script = context.createElement( "script" ); - - script.text = code; - context.head.appendChild( script ).parentNode.removeChild( script ); + globalEval: function( code ) { + DOMEval( code ); }, // Convert dashed to camelCase; used by the css and data modules diff --git a/src/core/DOMEval.js b/src/core/DOMEval.js new file mode 100644 index 0000000000..222b0ca2a2 --- /dev/null +++ b/src/core/DOMEval.js @@ -0,0 +1,14 @@ +define( [ + "../var/document" +], function( document ) { + function DOMEval( code, doc ) { + doc = doc || document; + + var script = doc.createElement( "script" ); + + script.text = code; + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + return DOMEval; +} ); diff --git a/src/manipulation.js b/src/manipulation.js index eaf2e09983..cc4fd16cd7 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -15,6 +15,7 @@ define( [ "./data/var/dataPriv", "./data/var/dataUser", "./data/var/acceptData", + "./core/DOMEval", "./core/init", "./traversing", @@ -23,7 +24,7 @@ define( [ ], function( jQuery, concat, push, access, rcheckableType, rtagName, rscriptType, wrapMap, getAll, setGlobalEval, buildFragment, support, - dataPriv, dataUser, acceptData ) { + dataPriv, dataUser, acceptData, DOMEval ) { var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, @@ -192,7 +193,7 @@ function domManip( collection, args, callback, ignored ) { jQuery._evalUrl( node.src ); } } else { - jQuery.globalEval( node.textContent.replace( rcleanScript, "" ), doc ); + DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); } } } From fbf829b7245f7d76ea02a44ab0a62427214b7575 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Mon, 30 Nov 2015 11:30:31 -0500 Subject: [PATCH 071/927] Attributes: exclusively lowercase A-Z in attribute names Fixes gh-2730 Close gh-2749 --- src/attributes/attr.js | 11 +++++++++-- test/unit/attributes.js | 13 ++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/attributes/attr.js b/src/attributes/attr.js index ae48676d1f..00b08489db 100644 --- a/src/attributes/attr.js +++ b/src/attributes/attr.js @@ -7,7 +7,14 @@ define( [ ], function( jQuery, access, support, rnotwhite ) { var boolHook, - attrHandle = jQuery.expr.attrHandle; + attrHandle = jQuery.expr.attrHandle, + + // Exclusively lowercase A-Z in attribute names (gh-2730) + // https://dom.spec.whatwg.org/#converted-to-ascii-lowercase + raz = /[A-Z]+/g, + lowercase = function( ch ) { + return ch.toLowerCase(); + }; jQuery.fn.extend( { attr: function( name, value ) { @@ -39,7 +46,7 @@ jQuery.extend( { // All attributes are lowercase // Grab necessary hook if one is defined if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - name = name.toLowerCase(); + name = name.replace( raz, lowercase ); hooks = jQuery.attrHooks[ name ] || ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); } diff --git a/test/unit/attributes.js b/test/unit/attributes.js index 9bf2876881..cbf83d0ec4 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -451,7 +451,9 @@ QUnit.test( "attr(String, Object)", function( assert ) { $radio = jQuery( "", { "value": "sup", - "type": "radio" + // Use uppercase here to ensure the type + // attrHook is still used + "TYPE": "radio" } ).appendTo( "#testForm" ); assert.equal( $radio.val(), "sup", "Value is not reset when type is set after value on a radio" ); @@ -472,6 +474,15 @@ QUnit.test( "attr(String, Object)", function( assert ) { assert.equal( jQuery( "#name" ).attr( "nonexisting", undefined ).attr( "nonexisting" ), undefined, ".attr('attribute', undefined) does not create attribute (#5571)" ); } ); +QUnit.test( "attr(non-ASCII)", function( assert ) { + assert.expect( 2 ); + + var $div = jQuery( "
    " ).appendTo( "#qunit-fixture" ); + + assert.equal( $div.attr( "Ω" ), "omega", ".attr() exclusively lowercases characters in the range A-Z (gh-2730)" ); + assert.equal( $div.attr( "AØC" ), "alpha", ".attr() exclusively lowercases characters in the range A-Z (gh-2730)" ); +} ); + QUnit.test( "attr - extending the boolean attrHandle", function( assert ) { assert.expect( 1 ); var called = false, From 1823a715660a5f31dd7e05672e9ad020066256a9 Mon Sep 17 00:00:00 2001 From: Jae Sung Park Date: Thu, 3 Dec 2015 15:34:03 +0900 Subject: [PATCH 072/927] Event: Remove duplicated word text on comment Closes #2751 --- src/event/trigger.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/event/trigger.js b/src/event/trigger.js index 448f90878d..8f5f778457 100644 --- a/src/event/trigger.js +++ b/src/event/trigger.js @@ -121,7 +121,7 @@ jQuery.extend( jQuery.event, { special._default.apply( eventPath.pop(), data ) === false ) && acceptData( elem ) ) { - // Call a native DOM method on the target with the same name name as the event. + // Call a native DOM method on the target with the same name as the event. // Don't do default actions on window, that's where global variables be (#6170) if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { From a4d16a26abe3ea36337f7bfc4d1bfe13b893cd17 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Thu, 7 Jan 2016 14:06:41 -0500 Subject: [PATCH 073/927] Revert "Attributes: Remove undocumented .toggleClass( boolean ) signature" This reverts commit 53f798cf4d783bb813b4d1ba97411bc752b275f3. - Turns out this is documented, even if not fully. Need to deprecate before removal. --- src/attributes/classes.js | 69 +++++++++++++++++++++++++++++---------- test/unit/attributes.js | 25 +++++++++++++- 2 files changed, 76 insertions(+), 18 deletions(-) diff --git a/src/attributes/classes.js b/src/attributes/classes.js index 6ab6f6efa5..7933873c4f 100644 --- a/src/attributes/classes.js +++ b/src/attributes/classes.js @@ -1,8 +1,9 @@ define( [ "../core", "../var/rnotwhite", + "../data/var/dataPriv", "../core/init" -], function( jQuery, rnotwhite ) { +], function( jQuery, rnotwhite, dataPriv ) { var rclass = /[\t\r\n\f]/g; @@ -96,26 +97,60 @@ jQuery.fn.extend( { }, toggleClass: function( value, stateVal ) { - var type = typeof value, - classNames = type === "string" ? value.match( rnotwhite ) : []; + var type = typeof value; - return this.each( function( i ) { - var className, - self = jQuery( this ), - c = 0; + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } - if ( type === "function" ) { - classNames = value.call( this, i, getClass( this ), stateVal ) - .match( rnotwhite ) || []; - } + if ( jQuery.isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( type === "string" ) { - // Toggle individual class names based on presence or stateVal - while ( ( className = classNames[ c++ ] ) ) { + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = value.match( rnotwhite ) || []; + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } - if ( stateVal === false || stateVal !== true && self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); } } } ); diff --git a/test/unit/attributes.js b/test/unit/attributes.js index cbf83d0ec4..7f92d3505b 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -1239,7 +1239,7 @@ QUnit.test( "removeClass(undefined) is a no-op", function( assert ) { } ); var testToggleClass = function( valueObj, assert ) { - assert.expect( 11 ); + assert.expect( 19 ); var e = jQuery( "#firstp" ); assert.ok( !e.is( ".test" ), "Assert class not present" ); @@ -1267,6 +1267,29 @@ var testToggleClass = function( valueObj, assert ) { assert.ok( ( e.is( ".testA.testC" ) && !e.is( ".testB" ) ), "Assert 1 class added, 1 class removed, and 1 class kept" ); e.toggleClass( valueObj( "testA testC" ) ); assert.ok( ( !e.is( ".testA" ) && !e.is( ".testB" ) && !e.is( ".testC" ) ), "Assert no class present" ); + + // toggleClass storage + e.toggleClass( true ); + assert.ok( e[ 0 ].className === "", "Assert class is empty (data was empty)" ); + e.addClass( "testD testE" ); + assert.ok( e.is( ".testD.testE" ), "Assert class present" ); + e.toggleClass(); + assert.ok( !e.is( ".testD.testE" ), "Assert class not present" ); + assert.ok( jQuery._data( e[ 0 ], "__className__" ) === "testD testE", "Assert data was stored" ); + e.toggleClass(); + assert.ok( e.is( ".testD.testE" ), "Assert class present (restored from data)" ); + e.toggleClass( false ); + assert.ok( !e.is( ".testD.testE" ), "Assert class not present" ); + e.toggleClass( true ); + assert.ok( e.is( ".testD.testE" ), "Assert class present (restored from data)" ); + e.toggleClass(); + e.toggleClass( false ); + e.toggleClass(); + assert.ok( e.is( ".testD.testE" ), "Assert class present (restored from data)" ); + + // Cleanup + e.removeClass( "testD" ); + assert.expectJqData( this, e[ 0 ], "__className__" ); }; QUnit.test( "toggleClass(String|boolean|undefined[, boolean])", function( assert ) { From df822caff079177d1840d67e03d6b24a93ea99a5 Mon Sep 17 00:00:00 2001 From: Jun Sun Date: Wed, 30 Dec 2015 15:40:08 +0800 Subject: [PATCH 074/927] CSS: Add animation-iteration-count to cssNumber, fix tests Fixes gh-2792 Closes gh-2793 --- src/css.js | 1 + test/unit/css.js | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/css.js b/src/css.js index acd4bb3eb4..5d3a0a6b59 100644 --- a/src/css.js +++ b/src/css.js @@ -190,6 +190,7 @@ jQuery.extend( { // Don't automatically add "px" to these possibly-unitless properties cssNumber: { + "animationIterationCount": true, "columnCount": true, "fillOpacity": true, "flexGrow": true, diff --git a/test/unit/css.js b/test/unit/css.js index 8715c56d5a..4b4017ab87 100644 --- a/test/unit/css.js +++ b/test/unit/css.js @@ -840,26 +840,35 @@ if ( jQuery.fn.offset ) { } ); } -QUnit.test( "Do not append px (#9548, #12990)", function( assert ) { - assert.expect( 2 ); +QUnit.test( "Do not append px (#9548, #12990, #2792)", function( assert ) { + assert.expect( 3 ); var $div = jQuery( "
    " ).appendTo( "#qunit-fixture" ); $div.css( "fill-opacity", 1 ); // Support: Android 2.3 (no support for fill-opacity) - if ( $div.css( "fill-opacity" ) ) { + if ( $div.css( "fill-opacity" ) !== undefined ) { assert.equal( $div.css( "fill-opacity" ), 1, "Do not append px to 'fill-opacity'" ); } else { assert.ok( true, "No support for fill-opacity CSS property" ); } $div.css( "column-count", 1 ); - if ( $div.css( "column-count" ) ) { + if ( $div.css( "column-count" ) !== undefined ) { assert.equal( $div.css( "column-count" ), 1, "Do not append px to 'column-count'" ); } else { assert.ok( true, "No support for column-count CSS property" ); } + + $div.css( "animation-iteration-count", 2 ); + if ( $div.css( "animation-iteration-count" ) !== undefined ) { + // if $div.css( "animation-iteration-count" ) return "1", + // it actually return the default value of animation-iteration-count + assert.equal( $div.css( "animation-iteration-count" ), 2, "Do not append px to 'animation-iteration-count'" ); + } else { + assert.ok( true, "No support for animation-iteration-count CSS property" ); + } } ); QUnit.test( "css('width') and css('height') should respect box-sizing, see #11004", function( assert ) { From fb9472c7fbf9979f48ef49aff76903ac130d0959 Mon Sep 17 00:00:00 2001 From: Leonardo Braga Date: Wed, 7 Oct 2015 00:51:23 -0400 Subject: [PATCH 075/927] Manipulation: Bring tagname regexes up to spec Fixes gh-2005 Closes gh-2634 --- src/core/var/rsingleTag.js | 2 +- src/manipulation.js | 2 +- src/manipulation/var/rtagName.js | 2 +- test/unit/manipulation.js | 67 ++++++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/core/var/rsingleTag.js b/src/core/var/rsingleTag.js index 1a55ee39d2..1ddf95ed4d 100644 --- a/src/core/var/rsingleTag.js +++ b/src/core/var/rsingleTag.js @@ -1,5 +1,5 @@ define( function() { // Match a standalone tag - return ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); + return ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); } ); diff --git a/src/manipulation.js b/src/manipulation.js index cc4fd16cd7..6c4b3ede87 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -27,7 +27,7 @@ define( [ dataPriv, dataUser, acceptData, DOMEval ) { var - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, // Support: IE 10-11, Edge 10240+ // In IE/Edge using regex groups here causes severe slowdowns. diff --git a/src/manipulation/var/rtagName.js b/src/manipulation/var/rtagName.js index 9e542694a7..1f8751ed8a 100644 --- a/src/manipulation/var/rtagName.js +++ b/src/manipulation/var/rtagName.js @@ -1,3 +1,3 @@ define( function() { - return ( /<([\w:-]+)/ ); + return ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); } ); diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index 4d8eed7d9a..f72000fc4d 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -500,6 +500,73 @@ QUnit.test( "html(String) tag-hyphenated elements (Bug #1987)", function( assert assert.equal( j.children().text(), "text", "Tags with multiple hypens behave normally" ); } ); +QUnit.test( "Tag name processing respects the HTML Standard (gh-2005)", function( assert ) { + + assert.expect( 240 ); + + var wrapper = jQuery( "
    " ), + nameTerminatingChars = "\x20\t\r\n\f".split( "" ), + specialChars = "[ ] { } _ - = + \\ ( ) * & ^ % $ # @ ! ~ ` ' ; ? ¥ « µ λ ⊕ ≈ ξ ℜ ♣ €" + .split( " " ); + + specialChars.push( specialChars.join( "" ) ); + + jQuery.each( specialChars, function( i, characters ) { + assertSpecialCharsSupport( "html", characters ); + assertSpecialCharsSupport( "append", characters ); + } ); + + jQuery.each( nameTerminatingChars, function( i, character ) { + assertNameTerminatingCharsHandling( "html", character ); + assertNameTerminatingCharsHandling( "append", character ); + } ); + + function buildChild( method, html ) { + wrapper[ method ]( html ); + return wrapper.children()[ 0 ]; + } + + function assertSpecialCharsSupport( method, characters ) { + var child, + codepoint = characters.charCodeAt( 0 ).toString( 16 ).toUpperCase(), + description = characters.length === 1 ? + "U+" + ( "000" + codepoint ).slice( -4 ) + " " + characters : + "all special characters", + nodeName = "valid" + characters + "tagname"; + + child = buildChild( method, "<" + nodeName + ">" ); + assert.equal( child.nodeName.toUpperCase(), nodeName.toUpperCase(), + method + "(): Paired tag name includes " + description ); + + child = buildChild( method, "<" + nodeName + ">" ); + assert.equal( child.nodeName.toUpperCase(), nodeName.toUpperCase(), + method + "(): Unpaired tag name includes " + description ); + + child = buildChild( method, "<" + nodeName + "/>" ); + assert.equal( child.nodeName.toUpperCase(), nodeName.toUpperCase(), + method + "(): Self-closing tag name includes " + description ); + } + + function assertNameTerminatingCharsHandling( method, character ) { + var child, + codepoint = character.charCodeAt( 0 ).toString( 16 ).toUpperCase(), + description = "U+" + ( "000" + codepoint ).slice( -4 ) + " " + character, + nodeName = "div" + character + "this-will-be-discarded"; + + child = buildChild( method, "<" + nodeName + ">" ); + assert.equal( child.nodeName.toUpperCase(), "DIV", + method + "(): Paired tag name terminated by " + description ); + + child = buildChild( method, "<" + nodeName + ">" ); + assert.equal( child.nodeName.toUpperCase(), "DIV", + method + "(): Unpaired open tag name terminated by " + description ); + + child = buildChild( method, "<" + nodeName + "/>" ); + assert.equal( child.nodeName.toUpperCase(), "DIV", + method + "(): Self-closing tag name terminated by " + description ); + } +} ); + QUnit.test( "IE8 serialization bug", function( assert ) { assert.expect( 2 ); From 5c4be05d3b32456553dc944853b77fa96ae8b2b8 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Mon, 11 Jan 2016 11:25:36 -0500 Subject: [PATCH 076/927] Selector: update Sizzle to 2.3.0 --- external/sizzle/dist/sizzle.js | 234 ++++++++++++++++++---------- external/sizzle/dist/sizzle.min.js | 4 +- external/sizzle/dist/sizzle.min.map | 2 +- package.json | 2 +- 4 files changed, 158 insertions(+), 84 deletions(-) diff --git a/external/sizzle/dist/sizzle.js b/external/sizzle/dist/sizzle.js index 9b1e5ba62c..cb93a5be54 100644 --- a/external/sizzle/dist/sizzle.js +++ b/external/sizzle/dist/sizzle.js @@ -1,12 +1,12 @@ /*! - * Sizzle CSS Selector Engine v2.2.1 - * http://sizzlejs.com/ + * Sizzle CSS Selector Engine v2.3.0 + * https://sizzlejs.com/ * * Copyright jQuery Foundation and other contributors * Released under the MIT license * http://jquery.org/license * - * Date: 2015-10-17 + * Date: 2016-01-04 */ (function( window ) { @@ -47,9 +47,6 @@ var i, return 0; }, - // General-purpose constants - MAX_NEGATIVE = 1 << 31, - // Instance methods hasOwn = ({}).hasOwnProperty, arr = [], @@ -58,7 +55,7 @@ var i, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf as it's faster than native - // http://jsperf.com/thor-indexof-vs-for/5 + // https://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) { var i = 0, len = list.length; @@ -78,7 +75,7 @@ var i, whitespace = "[\\x20\\t\\r\\n\\f]", // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + @@ -135,9 +132,9 @@ var i, rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, - rescape = /'|\\/g, - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), funescape = function( _, escaped, escapedWhitespace ) { var high = "0x" + escaped - 0x10000; @@ -153,13 +150,39 @@ var i, String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + // Used for iframes // See setDocument() // Removing the function wrapper causes a "Permission Denied" // error in IE unloadHandler = function() { setDocument(); - }; + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true; + }, + { dir: "parentNode", next: "legend" } + ); // Optimize for push.apply( _, NodeList ) try { @@ -191,7 +214,7 @@ try { } function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, nidselect, match, groups, newSelector, + var m, i, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, // nodeType defaults to 9, since context defaults to document @@ -284,7 +307,7 @@ function Sizzle( selector, context, results, seed ) { // Capture the context ID, setting it first if necessary if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rescape, "\\$&" ); + nid = nid.replace( rcssescape, fcssescape ); } else { context.setAttribute( "id", (nid = expando) ); } @@ -292,9 +315,8 @@ function Sizzle( selector, context, results, seed ) { // Prefix every selector in the list groups = tokenize( selector ); i = groups.length; - nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; while ( i-- ) { - groups[i] = nidselect + " " + toSelector( groups[i] ); + groups[i] = "#" + nid + " " + toSelector( groups[i] ); } newSelector = groups.join( "," ); @@ -355,22 +377,22 @@ function markFunction( fn ) { /** * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result + * @param {Function} fn Passed the created element and returns a boolean result */ function assert( fn ) { - var div = document.createElement("div"); + var el = document.createElement("fieldset"); try { - return !!fn( div ); + return !!fn( el ); } catch (e) { return false; } finally { // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); + if ( el.parentNode ) { + el.parentNode.removeChild( el ); } // release memory in IE - div = null; + el = null; } } @@ -397,8 +419,7 @@ function addHandle( attrs, handler ) { function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); + a.sourceIndex - b.sourceIndex; // Use IE sourceIndex if available on both nodes if ( diff ) { @@ -439,6 +460,34 @@ function createButtonPseudo( type ) { }; } +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + // Known :disabled false positives: + // IE: *[disabled]:not(button, input, select, textarea, optgroup, option, menuitem, fieldset) + // not IE: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Check form elements and option elements for explicit disabling + return "label" in elem && elem.disabled === disabled || + "form" in elem && elem.disabled === disabled || + + // Check non-disabled form elements for fieldset[disabled] ancestors + "form" in elem && elem.disabled === false && ( + // Support: IE6-11+ + // Ancestry is covered for us + elem.isDisabled === disabled || + + // Otherwise, assume any non-
    " + + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + ""; // Support: IE8, Opera 11-12.16 // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT - // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( div.querySelectorAll("[msallowcapture^='']").length ) { + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // Support: IE8 // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { + if ( !el.querySelectorAll("[selected]").length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { rbuggyQSA.push("~="); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { + if ( !el.querySelectorAll(":checked").length ) { rbuggyQSA.push(":checked"); } // Support: Safari 8+, iOS 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibing-combinator selector` fails - if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { rbuggyQSA.push(".#.+[+~]"); } }); - assert(function( div ) { + assert(function( el ) { + el.innerHTML = "" + + ""; + // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment var input = document.createElement("input"); input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "name", "D" ); + el.appendChild( input ).setAttribute( "name", "D" ); // Support: IE8 // Enforce case-sensitivity of name attribute - if ( div.querySelectorAll("[name=d]").length ) { + if ( el.querySelectorAll("[name=d]").length ) { rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); + el.querySelectorAll("*,:x"); rbuggyQSA.push(",.*:"); }); } @@ -710,14 +771,14 @@ setDocument = Sizzle.setDocument = function( node ) { docElem.oMatchesSelector || docElem.msMatchesSelector) )) ) { - assert(function( div ) { + assert(function( el ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); + support.disconnectedMatch = matches.call( el, "*" ); // This should fail with an exception // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); + matches.call( el, "[s!='']:x" ); rbuggyMatches.push( "!=", pseudos ); }); } @@ -919,6 +980,10 @@ Sizzle.attr = function( elem, name ) { null; }; +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; @@ -1386,13 +1451,8 @@ Expr = Sizzle.selectors = { }, // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), "checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements @@ -1594,7 +1654,9 @@ function toSelector( tokens ) { function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", doneName = done++; return combinator.first ? @@ -1630,14 +1692,16 @@ function addCombinator( matcher, combinator, base ) { // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - if ( (oldCache = uniqueCache[ dir ]) && + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements return (newCache[ 2 ] = oldCache[ 2 ]); } else { // Reuse newcache so results back-propagate to previous elements - uniqueCache[ dir ] = newCache; + uniqueCache[ key ] = newCache; // A match means we're done; a fail means we have to keep checking if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { @@ -2080,17 +2144,17 @@ setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { +support.sortDetached = assert(function( el ) { // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; }); // Support: IE<8 // Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#" ; +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#" ; }) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { @@ -2101,10 +2165,10 @@ if ( !assert(function( div ) { // Support: IE<9 // Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; }) ) { addHandle( "value", function( elem, name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { @@ -2115,8 +2179,8 @@ if ( !support.attributes || !assert(function( div ) { // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; }) ) { addHandle( booleans, function( elem, name, isXML ) { var val; @@ -2130,6 +2194,16 @@ if ( !assert(function( div ) { } // EXPOSE +var _sizzle = window.Sizzle; + +Sizzle.noConflict = function() { + if ( window.Sizzle === Sizzle ) { + window.Sizzle = _sizzle; + } + + return Sizzle; +}; + if ( typeof define === "function" && define.amd ) { define(function() { return Sizzle; }); // Sizzle requires that there be a global window in Common-JS like environments diff --git a/external/sizzle/dist/sizzle.min.js b/external/sizzle/dist/sizzle.min.js index 8558975d62..7358ad95c8 100644 --- a/external/sizzle/dist/sizzle.min.js +++ b/external/sizzle/dist/sizzle.min.js @@ -1,3 +1,3 @@ -/*! Sizzle v2.2.1 | (c) jQuery Foundation, Inc. | jquery.org/license */ -!function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),"function"==typeof define&&define.amd?define(function(){return fa}):"undefined"!=typeof module&&module.exports?module.exports=fa:a.Sizzle=fa}(window); +/*! Sizzle v2.3.0 | (c) jQuery Foundation, Inc. | jquery.org/license */ +!function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\x00-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\x00"===a?"�":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[0>c?c+b:c]}),even:pa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e)}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,e>i&&ya(a.slice(i,e)),f>e&&ya(a=a.slice(e)),f>e&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null});var Aa=a.Sizzle;ga.noConflict=function(){return a.Sizzle===ga&&(a.Sizzle=Aa),ga},"function"==typeof define&&define.amd?define(function(){return ga}):"undefined"!=typeof module&&module.exports?module.exports=ga:a.Sizzle=ga}(window); //# sourceMappingURL=sizzle.min.map \ No newline at end of file diff --git a/external/sizzle/dist/sizzle.min.map b/external/sizzle/dist/sizzle.min.map index 5438e0e779..d86726d5f5 100644 --- a/external/sizzle/dist/sizzle.min.map +++ b/external/sizzle/dist/sizzle.min.map @@ -1 +1 @@ -{"version":3,"file":"sizzle.min.js","sources":["sizzle.js"],"names":["window","i","support","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","document","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","matches","contains","expando","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","MAX_NEGATIVE","hasOwn","hasOwnProperty","arr","pop","push_native","push","slice","indexOf","list","elem","len","length","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","unloadHandler","apply","call","childNodes","nodeType","e","target","els","j","Sizzle","selector","context","results","seed","m","nid","nidselect","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","nodeName","toLowerCase","getAttribute","replace","setAttribute","toSelector","join","testContext","parentNode","querySelectorAll","qsaError","removeAttribute","keys","cache","key","value","cacheLength","shift","markFunction","fn","assert","div","createElement","removeChild","addHandle","attrs","handler","split","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","type","name","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","parent","doc","defaultView","top","addEventListener","attachEvent","className","appendChild","createComment","getById","getElementsByName","find","filter","attrId","getAttributeNode","tag","tmp","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","ret","attr","val","undefined","specified","error","msg","Error","uniqueSort","duplicates","detectDuplicates","sortStable","sort","splice","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">","dir","first"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","last","simple","forward","ofType","xml","uniqueCache","outerCache","nodeIndex","start","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","text","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","eq","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","prototype","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","map","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","elems","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","concat","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","Math","random","token","compiled","div1","defaultValue","define","amd","module","exports"],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["sizzle.js"],"names":["window","i","support","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","document","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","matches","contains","expando","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","hasOwn","hasOwnProperty","arr","pop","push_native","push","slice","indexOf","list","elem","len","length","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","toString","unloadHandler","disabledAncestor","addCombinator","disabled","dir","next","apply","call","childNodes","nodeType","e","target","els","j","Sizzle","selector","context","results","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","nodeName","toLowerCase","getAttribute","replace","setAttribute","toSelector","join","testContext","parentNode","querySelectorAll","qsaError","removeAttribute","keys","cache","key","value","cacheLength","shift","markFunction","fn","assert","el","createElement","removeChild","addHandle","attrs","handler","split","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","type","name","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","subWindow","doc","defaultView","top","addEventListener","attachEvent","className","appendChild","createComment","getById","getElementsByName","find","filter","attrId","getAttributeNode","tag","tmp","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","ret","attr","val","undefined","specified","escape","sel","error","msg","Error","uniqueSort","duplicates","detectDuplicates","sortStable","sort","splice","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">","first"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","last","simple","forward","ofType","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","text","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","eq","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","prototype","filters","parseOnly","tokens","soFar","preFilters","cached","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","map","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","elems","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","concat","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","Math","random","token","compiled","defaultValue","_sizzle","noConflict","define","amd","module","exports"],"mappings":";CAUA,SAAWA,GAEX,GAAIC,GACHC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EAAU,SAAW,EAAI,GAAIC,MAC7BC,EAAetB,EAAOa,SACtBU,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAY,SAAUC,EAAGC,GAIxB,MAHKD,KAAMC,IACVpB,GAAe,GAET,GAIRqB,KAAcC,eACdC,KACAC,EAAMD,EAAIC,IACVC,EAAcF,EAAIG,KAClBA,EAAOH,EAAIG,KACXC,EAAQJ,EAAII,MAGZC,EAAU,SAAUC,EAAMC,GAGzB,IAFA,GAAIxC,GAAI,EACPyC,EAAMF,EAAKG,OACAD,EAAJzC,EAASA,IAChB,GAAKuC,EAAKvC,KAAOwC,EAChB,MAAOxC,EAGT,OAAO,IAGR2C,EAAW,6HAKXC,EAAa,sBAGbC,EAAa,kCAGbC,EAAa,MAAQF,EAAa,KAAOC,EAAa,OAASD,EAE9D,gBAAkBA,EAElB,2DAA6DC,EAAa,OAASD,EACnF,OAEDG,EAAU,KAAOF,EAAa,wFAKAC,EAAa,eAM3CE,EAAc,GAAIC,QAAQL,EAAa,IAAK,KAC5CM,EAAQ,GAAID,QAAQ,IAAML,EAAa,8BAAgCA,EAAa,KAAM,KAE1FO,EAAS,GAAIF,QAAQ,IAAML,EAAa,KAAOA,EAAa,KAC5DQ,EAAe,GAAIH,QAAQ,IAAML,EAAa,WAAaA,EAAa,IAAMA,EAAa,KAE3FS,EAAmB,GAAIJ,QAAQ,IAAML,EAAa,iBAAmBA,EAAa,OAAQ,KAE1FU,EAAU,GAAIL,QAAQF,GACtBQ,EAAc,GAAIN,QAAQ,IAAMJ,EAAa,KAE7CW,GACCC,GAAM,GAAIR,QAAQ,MAAQJ,EAAa,KACvCa,MAAS,GAAIT,QAAQ,QAAUJ,EAAa,KAC5Cc,IAAO,GAAIV,QAAQ,KAAOJ,EAAa,SACvCe,KAAQ,GAAIX,QAAQ,IAAMH,GAC1Be,OAAU,GAAIZ,QAAQ,IAAMF,GAC5Be,MAAS,GAAIb,QAAQ,yDAA2DL,EAC/E,+BAAiCA,EAAa,cAAgBA,EAC9D,aAAeA,EAAa,SAAU,KACvCmB,KAAQ,GAAId,QAAQ,OAASN,EAAW,KAAM,KAG9CqB,aAAgB,GAAIf,QAAQ,IAAML,EAAa,mDAC9CA,EAAa,mBAAqBA,EAAa,mBAAoB,MAGrEqB,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,EAAW,OAIXC,EAAY,GAAIrB,QAAQ,qBAAuBL,EAAa,MAAQA,EAAa,OAAQ,MACzF2B,GAAY,SAAUC,EAAGC,EAASC,GACjC,GAAIC,GAAO,KAAOF,EAAU,KAI5B,OAAOE,KAASA,GAAQD,EACvBD,EACO,EAAPE,EAECC,OAAOC,aAAcF,EAAO,OAE5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,QAK5DG,GAAa,+CACbC,GAAa,SAAUC,EAAIC,GAC1B,MAAKA,GAGQ,SAAPD,EACG,IAIDA,EAAG3C,MAAO,EAAG,IAAO,KAAO2C,EAAGE,WAAYF,EAAGtC,OAAS,GAAIyC,SAAU,IAAO,IAI5E,KAAOH,GAOfI,GAAgB,WACfzE,KAGD0E,GAAmBC,GAClB,SAAU9C,GACT,MAAOA,GAAK+C,YAAa,IAExBC,IAAK,aAAcC,KAAM,UAI7B,KACCrD,EAAKsD,MACHzD,EAAMI,EAAMsD,KAAMtE,EAAauE,YAChCvE,EAAauE,YAId3D,EAAKZ,EAAauE,WAAWlD,QAASmD,SACrC,MAAQC,IACT1D,GAASsD,MAAOzD,EAAIS,OAGnB,SAAUqD,EAAQC,GACjB7D,EAAYuD,MAAOK,EAAQ1D,EAAMsD,KAAKK,KAKvC,SAAUD,EAAQC,GACjB,GAAIC,GAAIF,EAAOrD,OACd1C,EAAI,CAEL,OAAS+F,EAAOE,KAAOD,EAAIhG,MAC3B+F,EAAOrD,OAASuD,EAAI,IAKvB,QAASC,IAAQC,EAAUC,EAASC,EAASC,GAC5C,GAAIC,GAAGvG,EAAGwC,EAAMgE,EAAKC,EAAOC,EAAQC,EACnCC,EAAaR,GAAWA,EAAQS,cAGhChB,EAAWO,EAAUA,EAAQP,SAAW,CAKzC,IAHAQ,EAAUA,MAGe,gBAAbF,KAA0BA,GACxB,IAAbN,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,MAAOQ,EAIR,KAAMC,KAEEF,EAAUA,EAAQS,eAAiBT,EAAU/E,KAAmBT,GACtED,EAAayF,GAEdA,EAAUA,GAAWxF,EAEhBE,GAAiB,CAIrB,GAAkB,KAAb+E,IAAoBY,EAAQrC,EAAW0C,KAAMX,IAGjD,GAAMI,EAAIE,EAAM,IAGf,GAAkB,IAAbZ,EAAiB,CACrB,KAAMrD,EAAO4D,EAAQW,eAAgBR,IAUpC,MAAOF,EALP,IAAK7D,EAAKwE,KAAOT,EAEhB,MADAF,GAAQjE,KAAMI,GACP6D,MAYT,IAAKO,IAAepE,EAAOoE,EAAWG,eAAgBR,KACrDrF,EAAUkF,EAAS5D,IACnBA,EAAKwE,KAAOT,EAGZ,MADAF,GAAQjE,KAAMI,GACP6D,MAKH,CAAA,GAAKI,EAAM,GAEjB,MADArE,GAAKsD,MAAOW,EAASD,EAAQa,qBAAsBd,IAC5CE,CAGD,KAAME,EAAIE,EAAM,KAAOxG,EAAQiH,wBACrCd,EAAQc,uBAGR,MADA9E,GAAKsD,MAAOW,EAASD,EAAQc,uBAAwBX,IAC9CF,EAKT,GAAKpG,EAAQkH,MACXxF,EAAewE,EAAW,QACzBpF,IAAcA,EAAUqG,KAAMjB,IAAc,CAE9C,GAAkB,IAAbN,EACJe,EAAaR,EACbO,EAAcR,MAMR,IAAwC,WAAnCC,EAAQiB,SAASC,cAA6B,EAGnDd,EAAMJ,EAAQmB,aAAc,OACjCf,EAAMA,EAAIgB,QAAS1C,GAAYC,IAE/BqB,EAAQqB,aAAc,KAAOjB,EAAMrF,GAIpCuF,EAASrG,EAAU8F,GACnBnG,EAAI0G,EAAOhE,MACX,OAAQ1C,IACP0G,EAAO1G,GAAK,IAAMwG,EAAM,IAAMkB,GAAYhB,EAAO1G,GAElD2G,GAAcD,EAAOiB,KAAM,KAG3Bf,EAAavC,EAAS+C,KAAMjB,IAAcyB,GAAaxB,EAAQyB,aAC9DzB,EAGF,GAAKO,EACJ,IAIC,MAHAvE,GAAKsD,MAAOW,EACXO,EAAWkB,iBAAkBnB,IAEvBN,EACN,MAAQ0B,IACR,QACIvB,IAAQrF,GACZiF,EAAQ4B,gBAAiB,QAS/B,MAAOzH,GAAQ4F,EAASqB,QAAStE,EAAO,MAAQkD,EAASC,EAASC,GASnE,QAAS7E,MACR,GAAIwG,KAEJ,SAASC,GAAOC,EAAKC,GAMpB,MAJKH,GAAK7F,KAAM+F,EAAM,KAAQjI,EAAKmI,mBAE3BH,GAAOD,EAAKK,SAEZJ,EAAOC,EAAM,KAAQC,EAE9B,MAAOF,GAOR,QAASK,IAAcC,GAEtB,MADAA,GAAIrH,IAAY,EACTqH,EAOR,QAASC,IAAQD,GAChB,GAAIE,GAAK9H,EAAS+H,cAAc,WAEhC,KACC,QAASH,EAAIE,GACZ,MAAO5C,GACR,OAAO,EACN,QAEI4C,EAAGb,YACPa,EAAGb,WAAWe,YAAaF,GAG5BA,EAAK,MASP,QAASG,IAAWC,EAAOC,GAC1B,GAAI9G,GAAM6G,EAAME,MAAM,KACrBhJ,EAAIiC,EAAIS,MAET,OAAQ1C,IACPE,EAAK+I,WAAYhH,EAAIjC,IAAO+I,EAU9B,QAASG,IAAcrH,EAAGC,GACzB,GAAIqH,GAAMrH,GAAKD,EACduH,EAAOD,GAAsB,IAAftH,EAAEgE,UAAiC,IAAf/D,EAAE+D,UACnChE,EAAEwH,YAAcvH,EAAEuH,WAGpB,IAAKD,EACJ,MAAOA,EAIR,IAAKD,EACJ,MAASA,EAAMA,EAAIG,YAClB,GAAKH,IAAQrH,EACZ,MAAO,EAKV,OAAOD,GAAI,EAAI,GAOhB,QAAS0H,IAAmBC,GAC3B,MAAO,UAAUhH,GAChB,GAAIiH,GAAOjH,EAAK6E,SAASC,aACzB,OAAgB,UAATmC,GAAoBjH,EAAKgH,OAASA,GAQ3C,QAASE,IAAoBF,GAC5B,MAAO,UAAUhH,GAChB,GAAIiH,GAAOjH,EAAK6E,SAASC,aACzB,QAAiB,UAATmC,GAA6B,WAATA,IAAsBjH,EAAKgH,OAASA,GAQlE,QAASG,IAAsBpE,GAI9B,MAAO,UAAU/C,GAGhB,MAAO,SAAWA,IAAQA,EAAK+C,WAAaA,GAC3C,QAAU/C,IAAQA,EAAK+C,WAAaA,GAGpC,QAAU/C,IAAQA,EAAK+C,YAAa,IAGnC/C,EAAKoH,aAAerE,GAIpB/C,EAAKoH,cAAgBrE,IACnB,SAAW/C,KAAS6C,GAAkB7C,MAAY+C,IASxD,QAASsE,IAAwBrB,GAChC,MAAOD,IAAa,SAAUuB,GAE7B,MADAA,IAAYA,EACLvB,GAAa,SAAUjC,EAAMrF,GACnC,GAAIgF,GACH8D,EAAevB,KAAQlC,EAAK5D,OAAQoH,GACpC9J,EAAI+J,EAAarH,MAGlB,OAAQ1C,IACFsG,EAAOL,EAAI8D,EAAa/J,MAC5BsG,EAAKL,KAAOhF,EAAQgF,GAAKK,EAAKL,SAYnC,QAAS2B,IAAaxB,GACrB,MAAOA,IAAmD,mBAAjCA,GAAQa,sBAAwCb,EAI1EnG,EAAUiG,GAAOjG,WAOjBG,EAAQ8F,GAAO9F,MAAQ,SAAUoC,GAGhC,GAAIwH,GAAkBxH,IAASA,EAAKqE,eAAiBrE,GAAMwH,eAC3D,OAAOA,GAA+C,SAA7BA,EAAgB3C,UAAsB,GAQhE1G,EAAcuF,GAAOvF,YAAc,SAAUsJ,GAC5C,GAAIC,GAAYC,EACfC,EAAMH,EAAOA,EAAKpD,eAAiBoD,EAAO5I,CAG3C,OAAK+I,KAAQxJ,GAA6B,IAAjBwJ,EAAIvE,UAAmBuE,EAAIJ,iBAKpDpJ,EAAWwJ,EACXvJ,EAAUD,EAASoJ,gBACnBlJ,GAAkBV,EAAOQ,GAIpBS,IAAiBT,IACpBuJ,EAAYvJ,EAASyJ,cAAgBF,EAAUG,MAAQH,IAGnDA,EAAUI,iBACdJ,EAAUI,iBAAkB,SAAUnF,IAAe,GAG1C+E,EAAUK,aACrBL,EAAUK,YAAa,WAAYpF,KAUrCnF,EAAQ6C,WAAa2F,GAAO,SAAUC,GAErC,MADAA,GAAG+B,UAAY,KACP/B,EAAGnB,aAAa,eAOzBtH,EAAQgH,qBAAuBwB,GAAO,SAAUC,GAE/C,MADAA,GAAGgC,YAAa9J,EAAS+J,cAAc,MAC/BjC,EAAGzB,qBAAqB,KAAKvE,SAItCzC,EAAQiH,uBAAyB/C,EAAQiD,KAAMxG,EAASsG,wBAMxDjH,EAAQ2K,QAAUnC,GAAO,SAAUC,GAElC,MADA7H,GAAQ6J,YAAahC,GAAK1B,GAAK7F,GACvBP,EAASiK,oBAAsBjK,EAASiK,kBAAmB1J,GAAUuB,SAIzEzC,EAAQ2K,SACZ1K,EAAK4K,KAAS,GAAI,SAAU9D,EAAIZ,GAC/B,GAAuC,mBAA3BA,GAAQW,gBAAkCjG,EAAiB,CACtE,GAAIyF,GAAIH,EAAQW,eAAgBC,EAChC,OAAOT,IAAMA,QAGfrG,EAAK6K,OAAW,GAAI,SAAU/D,GAC7B,GAAIgE,GAAShE,EAAGQ,QAASlD,EAAWC,GACpC,OAAO,UAAU/B,GAChB,MAAOA,GAAK+E,aAAa,QAAUyD,YAM9B9K,GAAK4K,KAAS,GAErB5K,EAAK6K,OAAW,GAAK,SAAU/D,GAC9B,GAAIgE,GAAShE,EAAGQ,QAASlD,EAAWC,GACpC,OAAO,UAAU/B,GAChB,GAAIyH,GAAwC,mBAA1BzH,GAAKyI,kBACtBzI,EAAKyI,iBAAiB,KACvB,OAAOhB,IAAQA,EAAK7B,QAAU4C,KAMjC9K,EAAK4K,KAAU,IAAI7K,EAAQgH,qBAC1B,SAAUiE,EAAK9E,GACd,MAA6C,mBAAjCA,GAAQa,qBACZb,EAAQa,qBAAsBiE,GAG1BjL,EAAQkH,IACZf,EAAQ0B,iBAAkBoD,GAD3B,QAKR,SAAUA,EAAK9E,GACd,GAAI5D,GACH2I,KACAnL,EAAI,EAEJqG,EAAUD,EAAQa,qBAAsBiE,EAGzC,IAAa,MAARA,EAAc,CAClB,MAAS1I,EAAO6D,EAAQrG,KACA,IAAlBwC,EAAKqD,UACTsF,EAAI/I,KAAMI,EAIZ,OAAO2I,GAER,MAAO9E,IAITnG,EAAK4K,KAAY,MAAI7K,EAAQiH,wBAA0B,SAAUuD,EAAWrE,GAC3E,MAA+C,mBAAnCA,GAAQc,wBAA0CpG,EACtDsF,EAAQc,uBAAwBuD,GADxC,QAWDzJ,KAOAD,MAEMd,EAAQkH,IAAMhD,EAAQiD,KAAMxG,EAASkH,qBAG1CW,GAAO,SAAUC,GAMhB7H,EAAQ6J,YAAahC,GAAK0C,UAAY,UAAYjK,EAAU,qBAC1CA,EAAU,kEAOvBuH,EAAGZ,iBAAiB,wBAAwBpF,QAChD3B,EAAUqB,KAAM,SAAWQ,EAAa,gBAKnC8F,EAAGZ,iBAAiB,cAAcpF,QACvC3B,EAAUqB,KAAM,MAAQQ,EAAa,aAAeD,EAAW,KAI1D+F,EAAGZ,iBAAkB,QAAU3G,EAAU,MAAOuB,QACrD3B,EAAUqB,KAAK,MAMVsG,EAAGZ,iBAAiB,YAAYpF,QACrC3B,EAAUqB,KAAK,YAMVsG,EAAGZ,iBAAkB,KAAO3G,EAAU,MAAOuB,QAClD3B,EAAUqB,KAAK,cAIjBqG,GAAO,SAAUC,GAChBA,EAAG0C,UAAY,mFAKf,IAAIC,GAAQzK,EAAS+H,cAAc,QACnC0C,GAAM5D,aAAc,OAAQ,UAC5BiB,EAAGgC,YAAaW,GAAQ5D,aAAc,OAAQ,KAIzCiB,EAAGZ,iBAAiB,YAAYpF,QACpC3B,EAAUqB,KAAM,OAASQ,EAAa,eAKS,IAA3C8F,EAAGZ,iBAAiB,YAAYpF,QACpC3B,EAAUqB,KAAM,WAAY,aAK7BvB,EAAQ6J,YAAahC,GAAKnD,UAAW,EACY,IAA5CmD,EAAGZ,iBAAiB,aAAapF,QACrC3B,EAAUqB,KAAM,WAAY,aAI7BsG,EAAGZ,iBAAiB,QACpB/G,EAAUqB,KAAK,YAIXnC,EAAQqL,gBAAkBnH,EAAQiD,KAAOnG,EAAUJ,EAAQI,SAChEJ,EAAQ0K,uBACR1K,EAAQ2K,oBACR3K,EAAQ4K,kBACR5K,EAAQ6K,qBAERjD,GAAO,SAAUC,GAGhBzI,EAAQ0L,kBAAoB1K,EAAQ0E,KAAM+C,EAAI,KAI9CzH,EAAQ0E,KAAM+C,EAAI,aAClB1H,EAAcoB,KAAM,KAAMW,KAI5BhC,EAAYA,EAAU2B,QAAU,GAAIO,QAAQlC,EAAU4G,KAAK,MAC3D3G,EAAgBA,EAAc0B,QAAU,GAAIO,QAAQjC,EAAc2G,KAAK,MAIvEuC,EAAa/F,EAAQiD,KAAMvG,EAAQ+K,yBAKnC1K,EAAWgJ,GAAc/F,EAAQiD,KAAMvG,EAAQK,UAC9C,SAAUW,EAAGC,GACZ,GAAI+J,GAAuB,IAAfhK,EAAEgE,SAAiBhE,EAAEmI,gBAAkBnI,EAClDiK,EAAMhK,GAAKA,EAAE+F,UACd,OAAOhG,KAAMiK,MAAWA,GAAwB,IAAjBA,EAAIjG,YAClCgG,EAAM3K,SACL2K,EAAM3K,SAAU4K,GAChBjK,EAAE+J,yBAA8D,GAAnC/J,EAAE+J,wBAAyBE,MAG3D,SAAUjK,EAAGC,GACZ,GAAKA,EACJ,MAASA,EAAIA,EAAE+F,WACd,GAAK/F,IAAMD,EACV,OAAO,CAIV,QAAO,GAOTD,EAAYsI,EACZ,SAAUrI,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,MADApB,IAAe,EACR,CAIR,IAAIqL,IAAWlK,EAAE+J,yBAA2B9J,EAAE8J,uBAC9C,OAAKG,GACGA,GAIRA,GAAYlK,EAAEgF,eAAiBhF,MAAUC,EAAE+E,eAAiB/E,GAC3DD,EAAE+J,wBAAyB9J,GAG3B,EAGc,EAAViK,IACF9L,EAAQ+L,cAAgBlK,EAAE8J,wBAAyB/J,KAAQkK,EAGxDlK,IAAMjB,GAAYiB,EAAEgF,gBAAkBxF,GAAgBH,EAASG,EAAcQ,GAC1E,GAEHC,IAAMlB,GAAYkB,EAAE+E,gBAAkBxF,GAAgBH,EAASG,EAAcS,GAC1E,EAIDrB,EACJ6B,EAAS7B,EAAWoB,GAAMS,EAAS7B,EAAWqB,GAChD,EAGe,EAAViK,EAAc,GAAK,IAE3B,SAAUlK,EAAGC,GAEZ,GAAKD,IAAMC,EAEV,MADApB,IAAe,EACR,CAGR,IAAIyI,GACHnJ,EAAI,EACJiM,EAAMpK,EAAEgG,WACRiE,EAAMhK,EAAE+F,WACRqE,GAAOrK,GACPsK,GAAOrK,EAGR,KAAMmK,IAAQH,EACb,MAAOjK,KAAMjB,EAAW,GACvBkB,IAAMlB,EAAW,EACjBqL,EAAM,GACNH,EAAM,EACNrL,EACE6B,EAAS7B,EAAWoB,GAAMS,EAAS7B,EAAWqB,GAChD,CAGK,IAAKmK,IAAQH,EACnB,MAAO5C,IAAcrH,EAAGC,EAIzBqH,GAAMtH,CACN,OAASsH,EAAMA,EAAItB,WAClBqE,EAAGE,QAASjD,EAEbA,GAAMrH,CACN,OAASqH,EAAMA,EAAItB,WAClBsE,EAAGC,QAASjD,EAIb,OAAQ+C,EAAGlM,KAAOmM,EAAGnM,GACpBA,GAGD,OAAOA,GAENkJ,GAAcgD,EAAGlM,GAAImM,EAAGnM,IAGxBkM,EAAGlM,KAAOqB,EAAe,GACzB8K,EAAGnM,KAAOqB,EAAe,EACzB,GAGKT,GAjXCA,GAoXTsF,GAAOjF,QAAU,SAAUoL,EAAMC,GAChC,MAAOpG,IAAQmG,EAAM,KAAM,KAAMC,IAGlCpG,GAAOoF,gBAAkB,SAAU9I,EAAM6J,GASxC,IAPO7J,EAAKqE,eAAiBrE,KAAW5B,GACvCD,EAAa6B,GAId6J,EAAOA,EAAK7E,QAASnE,EAAkB,UAElCpD,EAAQqL,iBAAmBxK,IAC9Ba,EAAe0K,EAAO,QACpBrL,IAAkBA,EAAcoG,KAAMiF,OACtCtL,IAAkBA,EAAUqG,KAAMiF,IAErC,IACC,GAAIE,GAAMtL,EAAQ0E,KAAMnD,EAAM6J,EAG9B,IAAKE,GAAOtM,EAAQ0L,mBAGlBnJ,EAAK5B,UAAuC,KAA3B4B,EAAK5B,SAASiF,SAChC,MAAO0G,GAEP,MAAOzG,IAGV,MAAOI,IAAQmG,EAAMzL,EAAU,MAAQ4B,IAASE,OAAS,GAG1DwD,GAAOhF,SAAW,SAAUkF,EAAS5D,GAKpC,OAHO4D,EAAQS,eAAiBT,KAAcxF,GAC7CD,EAAayF,GAEPlF,EAAUkF,EAAS5D,IAG3B0D,GAAOsG,KAAO,SAAUhK,EAAMiH,IAEtBjH,EAAKqE,eAAiBrE,KAAW5B,GACvCD,EAAa6B,EAGd,IAAIgG,GAAKtI,EAAK+I,WAAYQ,EAAKnC,eAE9BmF,EAAMjE,GAAMzG,EAAO4D,KAAMzF,EAAK+I,WAAYQ,EAAKnC,eAC9CkB,EAAIhG,EAAMiH,GAAO3I,GACjB4L,MAEF,OAAeA,UAARD,EACNA,EACAxM,EAAQ6C,aAAehC,EACtB0B,EAAK+E,aAAckC,IAClBgD,EAAMjK,EAAKyI,iBAAiBxB,KAAUgD,EAAIE,UAC1CF,EAAIrE,MACJ,MAGJlC,GAAO0G,OAAS,SAAUC,GACzB,OAAQA,EAAM,IAAIrF,QAAS1C,GAAYC,KAGxCmB,GAAO4G,MAAQ,SAAUC,GACxB,KAAM,IAAIC,OAAO,0CAA4CD,IAO9D7G,GAAO+G,WAAa,SAAU5G,GAC7B,GAAI7D,GACH0K,KACAjH,EAAI,EACJjG,EAAI,CAOL,IAJAU,GAAgBT,EAAQkN,iBACxB1M,GAAaR,EAAQmN,YAAc/G,EAAQhE,MAAO,GAClDgE,EAAQgH,KAAMzL,GAETlB,EAAe,CACnB,MAAS8B,EAAO6D,EAAQrG,KAClBwC,IAAS6D,EAASrG,KACtBiG,EAAIiH,EAAW9K,KAAMpC,GAGvB,OAAQiG,IACPI,EAAQiH,OAAQJ,EAAYjH,GAAK,GAQnC,MAFAxF,GAAY,KAEL4F,GAORlG,EAAU+F,GAAO/F,QAAU,SAAUqC,GACpC,GAAIyH,GACHsC,EAAM,GACNvM,EAAI,EACJ6F,EAAWrD,EAAKqD,QAEjB,IAAMA,GAMC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAGjE,GAAiC,gBAArBrD,GAAK+K,YAChB,MAAO/K,GAAK+K,WAGZ,KAAM/K,EAAOA,EAAKgL,WAAYhL,EAAMA,EAAOA,EAAK8G,YAC/CiD,GAAOpM,EAASqC,OAGZ,IAAkB,IAAbqD,GAA+B,IAAbA,EAC7B,MAAOrD,GAAKiL,cAhBZ,OAASxD,EAAOzH,EAAKxC,KAEpBuM,GAAOpM,EAAS8J,EAkBlB,OAAOsC,IAGRrM,EAAOgG,GAAOwH,WAGbrF,YAAa,GAEbsF,aAAcpF,GAEd9B,MAAOjD,EAEPyF,cAEA6B,QAEA8C,UACCC,KAAOrI,IAAK,aAAcsI,OAAO,GACjCC,KAAOvI,IAAK,cACZwI,KAAOxI,IAAK,kBAAmBsI,OAAO,GACtCG,KAAOzI,IAAK,oBAGb0I,WACCtK,KAAQ,SAAU6C,GAUjB,MATAA,GAAM,GAAKA,EAAM,GAAGe,QAASlD,EAAWC,IAGxCkC,EAAM,IAAOA,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAM,IAAKe,QAASlD,EAAWC,IAExD,OAAbkC,EAAM,KACVA,EAAM,GAAK,IAAMA,EAAM,GAAK,KAGtBA,EAAMpE,MAAO,EAAG,IAGxByB,MAAS,SAAU2C,GA6BlB,MAlBAA,GAAM,GAAKA,EAAM,GAAGa,cAEY,QAA3Bb,EAAM,GAAGpE,MAAO,EAAG,IAEjBoE,EAAM,IACXP,GAAO4G,MAAOrG,EAAM,IAKrBA,EAAM,KAAQA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAAK,GAAmB,SAAbA,EAAM,IAA8B,QAAbA,EAAM,KACzFA,EAAM,KAAUA,EAAM,GAAKA,EAAM,IAAqB,QAAbA,EAAM,KAGpCA,EAAM,IACjBP,GAAO4G,MAAOrG,EAAM,IAGdA,GAGR5C,OAAU,SAAU4C,GACnB,GAAI0H,GACHC,GAAY3H,EAAM,IAAMA,EAAM,EAE/B,OAAKjD,GAAiB,MAAE4D,KAAMX,EAAM,IAC5B,MAIHA,EAAM,GACVA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAGxB2H,GAAY9K,EAAQ8D,KAAMgH,KAEpCD,EAAS9N,EAAU+N,GAAU,MAE7BD,EAASC,EAAS9L,QAAS,IAAK8L,EAAS1L,OAASyL,GAAWC,EAAS1L,UAGvE+D,EAAM,GAAKA,EAAM,GAAGpE,MAAO,EAAG8L,GAC9B1H,EAAM,GAAK2H,EAAS/L,MAAO,EAAG8L,IAIxB1H,EAAMpE,MAAO,EAAG,MAIzB0I,QAECpH,IAAO,SAAU0K,GAChB,GAAIhH,GAAWgH,EAAiB7G,QAASlD,EAAWC,IAAY+C,aAChE,OAA4B,MAArB+G,EACN,WAAa,OAAO,GACpB,SAAU7L,GACT,MAAOA,GAAK6E,UAAY7E,EAAK6E,SAASC,gBAAkBD,IAI3D3D,MAAS,SAAU+G,GAClB,GAAI6D,GAAU9M,EAAYiJ,EAAY,IAEtC,OAAO6D,KACLA,EAAU,GAAIrL,QAAQ,MAAQL,EAAa,IAAM6H,EAAY,IAAM7H,EAAa,SACjFpB,EAAYiJ,EAAW,SAAUjI,GAChC,MAAO8L,GAAQlH,KAAgC,gBAAnB5E,GAAKiI,WAA0BjI,EAAKiI,WAA0C,mBAAtBjI,GAAK+E,cAAgC/E,EAAK+E,aAAa,UAAY,OAI1J3D,KAAQ,SAAU6F,EAAM8E,EAAUC,GACjC,MAAO,UAAUhM,GAChB,GAAIiM,GAASvI,GAAOsG,KAAMhK,EAAMiH,EAEhC,OAAe,OAAVgF,EACgB,OAAbF,EAEFA,GAINE,GAAU,GAEU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAOnM,QAASkM,GAChC,OAAbD,EAAoBC,GAASC,EAAOnM,QAASkM,GAAU,GAC1C,OAAbD,EAAoBC,GAASC,EAAOpM,OAAQmM,EAAM9L,UAAa8L,EAClD,OAAbD,GAAsB,IAAME,EAAOjH,QAASxE,EAAa,KAAQ,KAAMV,QAASkM,GAAU,GAC7E,OAAbD,EAAoBE,IAAWD,GAASC,EAAOpM,MAAO,EAAGmM,EAAM9L,OAAS,KAAQ8L,EAAQ,KACxF,IAZO,IAgBV1K,MAAS,SAAU0F,EAAMkF,EAAM5E,EAAUgE,EAAOa,GAC/C,GAAIC,GAAgC,QAAvBpF,EAAKnH,MAAO,EAAG,GAC3BwM,EAA+B,SAArBrF,EAAKnH,MAAO,IACtByM,EAAkB,YAATJ,CAEV,OAAiB,KAAVZ,GAAwB,IAATa,EAGrB,SAAUnM,GACT,QAASA,EAAKqF,YAGf,SAAUrF,EAAM4D,EAAS2I,GACxB,GAAI7G,GAAO8G,EAAaC,EAAYhF,EAAMiF,EAAWC,EACpD3J,EAAMoJ,IAAWC,EAAU,cAAgB,kBAC3CO,EAAS5M,EAAKqF,WACd4B,EAAOqF,GAAUtM,EAAK6E,SAASC,cAC/B+H,GAAYN,IAAQD,EACpB1F,GAAO,CAER,IAAKgG,EAAS,CAGb,GAAKR,EAAS,CACb,MAAQpJ,EAAM,CACbyE,EAAOzH,CACP,OAASyH,EAAOA,EAAMzE,GACrB,GAAKsJ,EACJ7E,EAAK5C,SAASC,gBAAkBmC,EACd,IAAlBQ,EAAKpE,SAEL,OAAO,CAITsJ,GAAQ3J,EAAe,SAATgE,IAAoB2F,GAAS,cAE5C,OAAO,EAMR,GAHAA,GAAUN,EAAUO,EAAO5B,WAAa4B,EAAOE,WAG1CT,GAAWQ,EAAW,CAK1BpF,EAAOmF,EACPH,EAAahF,EAAM9I,KAAc8I,EAAM9I,OAIvC6N,EAAcC,EAAYhF,EAAKsF,YAC7BN,EAAYhF,EAAKsF,cAEnBrH,EAAQ8G,EAAaxF,OACrB0F,EAAYhH,EAAO,KAAQ5G,GAAW4G,EAAO,GAC7CkB,EAAO8F,GAAahH,EAAO,GAC3B+B,EAAOiF,GAAaE,EAAOxJ,WAAYsJ,EAEvC,OAASjF,IAASiF,GAAajF,GAAQA,EAAMzE,KAG3C4D,EAAO8F,EAAY,IAAMC,EAAMjN,MAGhC,GAAuB,IAAlB+H,EAAKpE,YAAoBuD,GAAQa,IAASzH,EAAO,CACrDwM,EAAaxF,IAAWlI,EAAS4N,EAAW9F,EAC5C,YAuBF,IAjBKiG,IAEJpF,EAAOzH,EACPyM,EAAahF,EAAM9I,KAAc8I,EAAM9I,OAIvC6N,EAAcC,EAAYhF,EAAKsF,YAC7BN,EAAYhF,EAAKsF,cAEnBrH,EAAQ8G,EAAaxF,OACrB0F,EAAYhH,EAAO,KAAQ5G,GAAW4G,EAAO,GAC7CkB,EAAO8F,GAKH9F,KAAS,EAEb,MAASa,IAASiF,GAAajF,GAAQA,EAAMzE,KAC3C4D,EAAO8F,EAAY,IAAMC,EAAMjN,MAEhC,IAAO4M,EACN7E,EAAK5C,SAASC,gBAAkBmC,EACd,IAAlBQ,EAAKpE,aACHuD,IAGGiG,IACJJ,EAAahF,EAAM9I,KAAc8I,EAAM9I,OAIvC6N,EAAcC,EAAYhF,EAAKsF,YAC7BN,EAAYhF,EAAKsF,cAEnBP,EAAaxF,IAAWlI,EAAS8H,IAG7Ba,IAASzH,GACb,KASL,OADA4G,IAAQuF,EACDvF,IAAS0E,GAAW1E,EAAO0E,IAAU,GAAK1E,EAAO0E,GAAS,KAKrEjK,OAAU,SAAU2L,EAAQ1F,GAK3B,GAAI2F,GACHjH,EAAKtI,EAAK6C,QAASyM,IAAYtP,EAAKwP,WAAYF,EAAOlI,gBACtDpB,GAAO4G,MAAO,uBAAyB0C,EAKzC,OAAKhH,GAAIrH,GACDqH,EAAIsB,GAIPtB,EAAG9F,OAAS,GAChB+M,GAASD,EAAQA,EAAQ,GAAI1F,GACtB5J,EAAKwP,WAAW1N,eAAgBwN,EAAOlI,eAC7CiB,GAAa,SAAUjC,EAAMrF,GAC5B,GAAI0O,GACHC,EAAUpH,EAAIlC,EAAMwD,GACpB9J,EAAI4P,EAAQlN,MACb,OAAQ1C,IACP2P,EAAMrN,EAASgE,EAAMsJ,EAAQ5P,IAC7BsG,EAAMqJ,KAAW1O,EAAS0O,GAAQC,EAAQ5P,MAG5C,SAAUwC,GACT,MAAOgG,GAAIhG,EAAM,EAAGiN,KAIhBjH,IAITzF,SAEC8M,IAAOtH,GAAa,SAAUpC,GAI7B,GAAIkF,MACHhF,KACAyJ,EAAUxP,EAAS6F,EAASqB,QAAStE,EAAO,MAE7C,OAAO4M,GAAS3O,GACfoH,GAAa,SAAUjC,EAAMrF,EAASmF,EAAS2I,GAC9C,GAAIvM,GACHuN,EAAYD,EAASxJ,EAAM,KAAMyI,MACjC/O,EAAIsG,EAAK5D,MAGV,OAAQ1C,KACDwC,EAAOuN,EAAU/P,MACtBsG,EAAKtG,KAAOiB,EAAQjB,GAAKwC,MAI5B,SAAUA,EAAM4D,EAAS2I,GAKxB,MAJA1D,GAAM,GAAK7I,EACXsN,EAASzE,EAAO,KAAM0D,EAAK1I,GAE3BgF,EAAM,GAAK,MACHhF,EAAQnE,SAInB8N,IAAOzH,GAAa,SAAUpC,GAC7B,MAAO,UAAU3D,GAChB,MAAO0D,IAAQC,EAAU3D,GAAOE,OAAS,KAI3CxB,SAAYqH,GAAa,SAAU0H,GAElC,MADAA,GAAOA,EAAKzI,QAASlD,EAAWC,IACzB,SAAU/B,GAChB,OAASA,EAAK+K,aAAe/K,EAAK0N,WAAa/P,EAASqC,IAASF,QAAS2N,GAAS,MAWrFE,KAAQ5H,GAAc,SAAU4H,GAM/B,MAJM5M,GAAY6D,KAAK+I,GAAQ,KAC9BjK,GAAO4G,MAAO,qBAAuBqD,GAEtCA,EAAOA,EAAK3I,QAASlD,EAAWC,IAAY+C,cACrC,SAAU9E,GAChB,GAAI4N,EACJ,GACC,IAAMA,EAAWtP,EAChB0B,EAAK2N,KACL3N,EAAK+E,aAAa,aAAe/E,EAAK+E,aAAa,QAGnD,MADA6I,GAAWA,EAAS9I,cACb8I,IAAaD,GAA2C,IAAnCC,EAAS9N,QAAS6N,EAAO,YAE5C3N,EAAOA,EAAKqF,aAAiC,IAAlBrF,EAAKqD,SAC3C,QAAO,KAKTE,OAAU,SAAUvD,GACnB,GAAI6N,GAAOtQ,EAAOuQ,UAAYvQ,EAAOuQ,SAASD,IAC9C,OAAOA,IAAQA,EAAKhO,MAAO,KAAQG,EAAKwE,IAGzCuJ,KAAQ,SAAU/N,GACjB,MAAOA,KAAS3B,GAGjB2P,MAAS,SAAUhO,GAClB,MAAOA,KAAS5B,EAAS6P,iBAAmB7P,EAAS8P,UAAY9P,EAAS8P,gBAAkBlO,EAAKgH,MAAQhH,EAAKmO,OAASnO,EAAKoO,WAI7HC,QAAWlH,IAAsB,GACjCpE,SAAYoE,IAAsB,GAElCmH,QAAW,SAAUtO,GAGpB,GAAI6E,GAAW7E,EAAK6E,SAASC,aAC7B,OAAqB,UAAbD,KAA0B7E,EAAKsO,SAA0B,WAAbzJ,KAA2B7E,EAAKuO,UAGrFA,SAAY,SAAUvO,GAOrB,MAJKA,GAAKqF,YACTrF,EAAKqF,WAAWmJ,cAGVxO,EAAKuO,YAAa,GAI1BE,MAAS,SAAUzO,GAKlB,IAAMA,EAAOA,EAAKgL,WAAYhL,EAAMA,EAAOA,EAAK8G,YAC/C,GAAK9G,EAAKqD,SAAW,EACpB,OAAO,CAGT,QAAO,GAGRuJ,OAAU,SAAU5M,GACnB,OAAQtC,EAAK6C,QAAe,MAAGP,IAIhC0O,OAAU,SAAU1O,GACnB,MAAO0B,GAAQkD,KAAM5E,EAAK6E,WAG3BgE,MAAS,SAAU7I,GAClB,MAAOyB,GAAQmD,KAAM5E,EAAK6E,WAG3B8J,OAAU,SAAU3O,GACnB,GAAIiH,GAAOjH,EAAK6E,SAASC,aACzB,OAAgB,UAATmC,GAAkC,WAAdjH,EAAKgH,MAA8B,WAATC,GAGtDwG,KAAQ,SAAUzN,GACjB,GAAIgK,EACJ,OAAuC,UAAhChK,EAAK6E,SAASC,eACN,SAAd9E,EAAKgH,OAImC,OAArCgD,EAAOhK,EAAK+E,aAAa,UAA2C,SAAvBiF,EAAKlF,gBAIvDwG,MAASjE,GAAuB,WAC/B,OAAS,KAGV8E,KAAQ9E,GAAuB,SAAUE,EAAcrH,GACtD,OAASA,EAAS,KAGnB0O,GAAMvH,GAAuB,SAAUE,EAAcrH,EAAQoH,GAC5D,OAAoB,EAAXA,EAAeA,EAAWpH,EAASoH,KAG7CuH,KAAQxH,GAAuB,SAAUE,EAAcrH,GAEtD,IADA,GAAI1C,GAAI,EACI0C,EAAJ1C,EAAYA,GAAK,EACxB+J,EAAa3H,KAAMpC,EAEpB,OAAO+J,KAGRuH,IAAOzH,GAAuB,SAAUE,EAAcrH,GAErD,IADA,GAAI1C,GAAI,EACI0C,EAAJ1C,EAAYA,GAAK,EACxB+J,EAAa3H,KAAMpC,EAEpB,OAAO+J,KAGRwH,GAAM1H,GAAuB,SAAUE,EAAcrH,EAAQoH,GAE5D,IADA,GAAI9J,GAAe,EAAX8J,EAAeA,EAAWpH,EAASoH,IACjC9J,GAAK,GACd+J,EAAa3H,KAAMpC,EAEpB,OAAO+J,KAGRyH,GAAM3H,GAAuB,SAAUE,EAAcrH,EAAQoH,GAE5D,IADA,GAAI9J,GAAe,EAAX8J,EAAeA,EAAWpH,EAASoH,IACjC9J,EAAI0C,GACbqH,EAAa3H,KAAMpC,EAEpB,OAAO+J,OAKV7J,EAAK6C,QAAa,IAAI7C,EAAK6C,QAAY,EAGvC,KAAM/C,KAAOyR,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5E3R,EAAK6C,QAAS/C,GAAMuJ,GAAmBvJ,EAExC,KAAMA,KAAO8R,QAAQ,EAAMC,OAAO,GACjC7R,EAAK6C,QAAS/C,GAAM0J,GAAoB1J,EAIzC,SAAS0P,OACTA,GAAWsC,UAAY9R,EAAK+R,QAAU/R,EAAK6C,QAC3C7C,EAAKwP,WAAa,GAAIA,IAEtBrP,EAAW6F,GAAO7F,SAAW,SAAU8F,EAAU+L,GAChD,GAAItC,GAASnJ,EAAO0L,EAAQ3I,EAC3B4I,EAAO1L,EAAQ2L,EACfC,EAAS5Q,EAAYyE,EAAW,IAEjC,IAAKmM,EACJ,MAAOJ,GAAY,EAAII,EAAOjQ,MAAO,EAGtC+P,GAAQjM,EACRO,KACA2L,EAAanS,EAAKgO,SAElB,OAAQkE,EAAQ,GAGTxC,IAAYnJ,EAAQtD,EAAO2D,KAAMsL,OACjC3L,IAEJ2L,EAAQA,EAAM/P,MAAOoE,EAAM,GAAG/D,SAAY0P,GAE3C1L,EAAOtE,KAAO+P,OAGfvC,GAAU,GAGJnJ,EAAQrD,EAAa0D,KAAMsL,MAChCxC,EAAUnJ,EAAM6B,QAChB6J,EAAO/P,MACNgG,MAAOwH,EAEPpG,KAAM/C,EAAM,GAAGe,QAAStE,EAAO,OAEhCkP,EAAQA,EAAM/P,MAAOuN,EAAQlN,QAI9B,KAAM8G,IAAQtJ,GAAK6K,SACZtE,EAAQjD,EAAWgG,GAAO1C,KAAMsL,KAAcC,EAAY7I,MAC9D/C,EAAQ4L,EAAY7I,GAAQ/C,MAC7BmJ,EAAUnJ,EAAM6B,QAChB6J,EAAO/P,MACNgG,MAAOwH,EACPpG,KAAMA,EACNvI,QAASwF,IAEV2L,EAAQA,EAAM/P,MAAOuN,EAAQlN,QAI/B,KAAMkN,EACL,MAOF,MAAOsC,GACNE,EAAM1P,OACN0P,EACClM,GAAO4G,MAAO3G,GAEdzE,EAAYyE,EAAUO,GAASrE,MAAO,GAGzC,SAASqF,IAAYyK,GAIpB,IAHA,GAAInS,GAAI,EACPyC,EAAM0P,EAAOzP,OACbyD,EAAW,GACA1D,EAAJzC,EAASA,IAChBmG,GAAYgM,EAAOnS,GAAGoI,KAEvB,OAAOjC,GAGR,QAASb,IAAewK,EAASyC,EAAYC,GAC5C,GAAIhN,GAAM+M,EAAW/M,IACpBiN,EAAOF,EAAW9M,KAClB0C,EAAMsK,GAAQjN,EACdkN,EAAmBF,GAAgB,eAARrK,EAC3BwK,EAAWpR,GAEZ,OAAOgR,GAAWzE,MAEjB,SAAUtL,EAAM4D,EAAS2I,GACxB,MAASvM,EAAOA,EAAMgD,GACrB,GAAuB,IAAlBhD,EAAKqD,UAAkB6M,EAC3B,MAAO5C,GAAStN,EAAM4D,EAAS2I,IAMlC,SAAUvM,EAAM4D,EAAS2I,GACxB,GAAI6D,GAAU5D,EAAaC,EAC1B4D,GAAavR,EAASqR,EAGvB,IAAK5D,GACJ,MAASvM,EAAOA,EAAMgD,GACrB,IAAuB,IAAlBhD,EAAKqD,UAAkB6M,IACtB5C,EAAStN,EAAM4D,EAAS2I,GAC5B,OAAO,MAKV,OAASvM,EAAOA,EAAMgD,GACrB,GAAuB,IAAlBhD,EAAKqD,UAAkB6M,EAO3B,GANAzD,EAAazM,EAAMrB,KAAcqB,EAAMrB,OAIvC6N,EAAcC,EAAYzM,EAAK+M,YAAeN,EAAYzM,EAAK+M,cAE1DkD,GAAQA,IAASjQ,EAAK6E,SAASC,cACnC9E,EAAOA,EAAMgD,IAAShD,MAChB,CAAA,IAAMoQ,EAAW5D,EAAa7G,KACpCyK,EAAU,KAAQtR,GAAWsR,EAAU,KAAQD,EAG/C,MAAQE,GAAU,GAAMD,EAAU,EAMlC,IAHA5D,EAAa7G,GAAQ0K,EAGfA,EAAU,GAAM/C,EAAStN,EAAM4D,EAAS2I,GAC7C,OAAO,IASf,QAAS+D,IAAgBC,GACxB,MAAOA,GAASrQ,OAAS,EACxB,SAAUF,EAAM4D,EAAS2I,GACxB,GAAI/O,GAAI+S,EAASrQ,MACjB,OAAQ1C,IACP,IAAM+S,EAAS/S,GAAIwC,EAAM4D,EAAS2I,GACjC,OAAO,CAGT,QAAO,GAERgE,EAAS,GAGX,QAASC,IAAkB7M,EAAU8M,EAAU5M,GAG9C,IAFA,GAAIrG,GAAI,EACPyC,EAAMwQ,EAASvQ,OACJD,EAAJzC,EAASA,IAChBkG,GAAQC,EAAU8M,EAASjT,GAAIqG,EAEhC,OAAOA,GAGR,QAAS6M,IAAUnD,EAAWoD,EAAKpI,EAAQ3E,EAAS2I,GAOnD,IANA,GAAIvM,GACH4Q,KACApT,EAAI,EACJyC,EAAMsN,EAAUrN,OAChB2Q,EAAgB,MAAPF,EAEE1Q,EAAJzC,EAASA,KACVwC,EAAOuN,EAAU/P,OAChB+K,GAAUA,EAAQvI,EAAM4D,EAAS2I,MACtCqE,EAAahR,KAAMI,GACd6Q,GACJF,EAAI/Q,KAAMpC,GAMd,OAAOoT,GAGR,QAASE,IAAYpF,EAAW/H,EAAU2J,EAASyD,EAAYC,EAAYC,GAO1E,MANKF,KAAeA,EAAYpS,KAC/BoS,EAAaD,GAAYC,IAErBC,IAAeA,EAAYrS,KAC/BqS,EAAaF,GAAYE,EAAYC,IAE/BlL,GAAa,SAAUjC,EAAMD,EAASD,EAAS2I,GACrD,GAAI2E,GAAM1T,EAAGwC,EACZmR,KACAC,KACAC,EAAcxN,EAAQ3D,OAGtBoR,EAAQxN,GAAQ0M,GAAkB7M,GAAY,IAAKC,EAAQP,UAAaO,GAAYA,MAGpF2N,GAAY7F,IAAe5H,GAASH,EAEnC2N,EADAZ,GAAUY,EAAOH,EAAQzF,EAAW9H,EAAS2I,GAG9CiF,EAAalE,EAEZ0D,IAAgBlN,EAAO4H,EAAY2F,GAAeN,MAMjDlN,EACD0N,CAQF,IALKjE,GACJA,EAASiE,EAAWC,EAAY5N,EAAS2I,GAIrCwE,EAAa,CACjBG,EAAOR,GAAUc,EAAYJ,GAC7BL,EAAYG,KAAUtN,EAAS2I,GAG/B/O,EAAI0T,EAAKhR,MACT,OAAQ1C,KACDwC,EAAOkR,EAAK1T,MACjBgU,EAAYJ,EAAQ5T,MAAS+T,EAAWH,EAAQ5T,IAAOwC,IAK1D,GAAK8D,GACJ,GAAKkN,GAActF,EAAY,CAC9B,GAAKsF,EAAa,CAEjBE,KACA1T,EAAIgU,EAAWtR,MACf,OAAQ1C,KACDwC,EAAOwR,EAAWhU,KAEvB0T,EAAKtR,KAAO2R,EAAU/T,GAAKwC,EAG7BgR,GAAY,KAAOQ,KAAkBN,EAAM3E,GAI5C/O,EAAIgU,EAAWtR,MACf,OAAQ1C,KACDwC,EAAOwR,EAAWhU,MACtB0T,EAAOF,EAAalR,EAASgE,EAAM9D,GAASmR,EAAO3T,IAAM,KAE1DsG,EAAKoN,KAAUrN,EAAQqN,GAAQlR,SAOlCwR,GAAad,GACZc,IAAe3N,EACd2N,EAAW1G,OAAQuG,EAAaG,EAAWtR,QAC3CsR,GAEGR,EACJA,EAAY,KAAMnN,EAAS2N,EAAYjF,GAEvC3M,EAAKsD,MAAOW,EAAS2N,KAMzB,QAASC,IAAmB9B,GAwB3B,IAvBA,GAAI+B,GAAcpE,EAAS7J,EAC1BxD,EAAM0P,EAAOzP,OACbyR,EAAkBjU,EAAK0N,SAAUuE,EAAO,GAAG3I,MAC3C4K,EAAmBD,GAAmBjU,EAAK0N,SAAS,KACpD5N,EAAImU,EAAkB,EAAI,EAG1BE,EAAe/O,GAAe,SAAU9C,GACvC,MAAOA,KAAS0R,GACdE,GAAkB,GACrBE,EAAkBhP,GAAe,SAAU9C,GAC1C,MAAOF,GAAS4R,EAAc1R,GAAS,IACrC4R,GAAkB,GACrBrB,GAAa,SAAUvQ,EAAM4D,EAAS2I,GACrC,GAAIxC,IAAS4H,IAAqBpF,GAAO3I,IAAY5F,MACnD0T,EAAe9N,GAASP,SACxBwO,EAAc7R,EAAM4D,EAAS2I,GAC7BuF,EAAiB9R,EAAM4D,EAAS2I,GAGlC,OADAmF,GAAe,KACR3H,IAGG9J,EAAJzC,EAASA,IAChB,GAAM8P,EAAU5P,EAAK0N,SAAUuE,EAAOnS,GAAGwJ,MACxCuJ,GAAazN,GAAcwN,GAAgBC,GAAYjD,QACjD,CAIN,GAHAA,EAAU5P,EAAK6K,OAAQoH,EAAOnS,GAAGwJ,MAAO9D,MAAO,KAAMyM,EAAOnS,GAAGiB,SAG1D6O,EAAS3O,GAAY,CAGzB,IADA8E,IAAMjG,EACMyC,EAAJwD,EAASA,IAChB,GAAK/F,EAAK0N,SAAUuE,EAAOlM,GAAGuD,MAC7B,KAGF,OAAO8J,IACNtT,EAAI,GAAK8S,GAAgBC,GACzB/S,EAAI,GAAK0H,GAERyK,EAAO9P,MAAO,EAAGrC,EAAI,GAAIuU,QAASnM,MAAgC,MAAzB+J,EAAQnS,EAAI,GAAIwJ,KAAe,IAAM,MAC7EhC,QAAStE,EAAO,MAClB4M,EACI7J,EAAJjG,GAASiU,GAAmB9B,EAAO9P,MAAOrC,EAAGiG,IACzCxD,EAAJwD,GAAWgO,GAAoB9B,EAASA,EAAO9P,MAAO4D,IAClDxD,EAAJwD,GAAWyB,GAAYyK,IAGzBY,EAAS3Q,KAAM0N,GAIjB,MAAOgD,IAAgBC,GAGxB,QAASyB,IAA0BC,EAAiBC,GACnD,GAAIC,GAAQD,EAAYhS,OAAS,EAChCkS,EAAYH,EAAgB/R,OAAS,EACrCmS,EAAe,SAAUvO,EAAMF,EAAS2I,EAAK1I,EAASyO,GACrD,GAAItS,GAAMyD,EAAG6J,EACZiF,EAAe,EACf/U,EAAI,IACJ+P,EAAYzJ,MACZ0O,KACAC,EAAgBzU,EAEhBsT,EAAQxN,GAAQsO,GAAa1U,EAAK4K,KAAU,IAAG,IAAKgK,GAEpDI,EAAiB5T,GAA4B,MAAjB2T,EAAwB,EAAIE,KAAKC,UAAY,GACzE3S,EAAMqR,EAAMpR,MASb,KAPKoS,IACJtU,EAAmB4F,IAAYxF,GAAYwF,GAAW0O,GAM/C9U,IAAMyC,GAA4B,OAApBD,EAAOsR,EAAM9T,IAAaA,IAAM,CACrD,GAAK4U,GAAapS,EAAO,CACxByD,EAAI,EACEG,GAAW5D,EAAKqE,gBAAkBjG,IACvCD,EAAa6B,GACbuM,GAAOjO,EAER,OAASgP,EAAU2E,EAAgBxO,KAClC,GAAK6J,EAAStN,EAAM4D,GAAWxF,EAAUmO,GAAO,CAC/C1I,EAAQjE,KAAMI,EACd,OAGGsS,IACJxT,EAAU4T,GAKPP,KAEEnS,GAAQsN,GAAWtN,IACxBuS,IAIIzO,GACJyJ,EAAU3N,KAAMI,IAgBnB,GATAuS,GAAgB/U,EASX2U,GAAS3U,IAAM+U,EAAe,CAClC9O,EAAI,CACJ,OAAS6J,EAAU4E,EAAYzO,KAC9B6J,EAASC,EAAWiF,EAAY5O,EAAS2I,EAG1C,IAAKzI,EAAO,CAEX,GAAKyO,EAAe,EACnB,MAAQ/U,IACA+P,EAAU/P,IAAMgV,EAAWhV,KACjCgV,EAAWhV,GAAKkC,EAAIyD,KAAMU,GAM7B2O,GAAa9B,GAAU8B,GAIxB5S,EAAKsD,MAAOW,EAAS2O,GAGhBF,IAAcxO,GAAQ0O,EAAWtS,OAAS,GAC5CqS,EAAeL,EAAYhS,OAAW,GAExCwD,GAAO+G,WAAY5G,GAUrB,MALKyO,KACJxT,EAAU4T,EACV1U,EAAmByU,GAGblF,EAGT,OAAO4E,GACNpM,GAAcsM,GACdA,EAGFvU,EAAU4F,GAAO5F,QAAU,SAAU6F,EAAUM,GAC9C,GAAIzG,GACH0U,KACAD,KACAnC,EAAS3Q,EAAewE,EAAW,IAEpC,KAAMmM,EAAS,CAER7L,IACLA,EAAQpG,EAAU8F,IAEnBnG,EAAIyG,EAAM/D,MACV,OAAQ1C,IACPsS,EAAS2B,GAAmBxN,EAAMzG,IAC7BsS,EAAQnR,GACZuT,EAAYtS,KAAMkQ,GAElBmC,EAAgBrS,KAAMkQ,EAKxBA,GAAS3Q,EAAewE,EAAUqO,GAA0BC,EAAiBC,IAG7EpC,EAAOnM,SAAWA,EAEnB,MAAOmM,IAYR/R,EAAS2F,GAAO3F,OAAS,SAAU4F,EAAUC,EAASC,EAASC,GAC9D,GAAItG,GAAGmS,EAAQkD,EAAO7L,EAAMsB,EAC3BwK,EAA+B,kBAAbnP,IAA2BA,EAC7CM,GAASH,GAAQjG,EAAW8F,EAAWmP,EAASnP,UAAYA,EAM7D,IAJAE,EAAUA,MAIY,IAAjBI,EAAM/D,OAAe,CAIzB,GADAyP,EAAS1L,EAAM,GAAKA,EAAM,GAAGpE,MAAO,GAC/B8P,EAAOzP,OAAS,GAAkC,QAA5B2S,EAAQlD,EAAO,IAAI3I,MAC5CvJ,EAAQ2K,SAAgC,IAArBxE,EAAQP,UAAkB/E,GAC7CZ,EAAK0N,SAAUuE,EAAO,GAAG3I,MAAS,CAGnC,GADApD,GAAYlG,EAAK4K,KAAS,GAAGuK,EAAMpU,QAAQ,GAAGuG,QAAQlD,EAAWC,IAAY6B,QAAkB,IACzFA,EACL,MAAOC,EAGIiP,KACXlP,EAAUA,EAAQyB,YAGnB1B,EAAWA,EAAS9D,MAAO8P,EAAO7J,QAAQF,MAAM1F,QAIjD1C,EAAIwD,EAAwB,aAAE4D,KAAMjB,GAAa,EAAIgM,EAAOzP,MAC5D,OAAQ1C,IAAM,CAIb,GAHAqV,EAAQlD,EAAOnS,GAGVE,EAAK0N,SAAWpE,EAAO6L,EAAM7L,MACjC,KAED,KAAMsB,EAAO5K,EAAK4K,KAAMtB,MAEjBlD,EAAOwE,EACZuK,EAAMpU,QAAQ,GAAGuG,QAASlD,EAAWC,IACrCF,EAAS+C,KAAM+K,EAAO,GAAG3I,OAAU5B,GAAaxB,EAAQyB,aAAgBzB,IACpE,CAKJ,GAFA+L,EAAO7E,OAAQtN,EAAG,GAClBmG,EAAWG,EAAK5D,QAAUgF,GAAYyK,IAChChM,EAEL,MADA/D,GAAKsD,MAAOW,EAASC,GACdD,CAGR,SAeJ,OAPEiP,GAAYhV,EAAS6F,EAAUM,IAChCH,EACAF,GACCtF,EACDuF,GACCD,GAAW/B,EAAS+C,KAAMjB,IAAcyB,GAAaxB,EAAQyB,aAAgBzB,GAExEC,GAMRpG,EAAQmN,WAAajM,EAAQ6H,MAAM,IAAIqE,KAAMzL,GAAY+F,KAAK,MAAQxG,EAItElB,EAAQkN,mBAAqBzM,EAG7BC,IAIAV,EAAQ+L,aAAevD,GAAO,SAAUC,GAEvC,MAA0E,GAAnEA,EAAGkD,wBAAyBhL,EAAS+H,cAAc,eAMrDF,GAAO,SAAUC,GAEtB,MADAA,GAAG0C,UAAY,mBAC+B,MAAvC1C,EAAG8E,WAAWjG,aAAa,WAElCsB,GAAW,yBAA0B,SAAUrG,EAAMiH,EAAMrJ,GAC1D,MAAMA,GAAN,OACQoC,EAAK+E,aAAckC,EAA6B,SAAvBA,EAAKnC,cAA2B,EAAI,KAOjErH,EAAQ6C,YAAe2F,GAAO,SAAUC,GAG7C,MAFAA,GAAG0C,UAAY,WACf1C,EAAG8E,WAAW/F,aAAc,QAAS,IACY,KAA1CiB,EAAG8E,WAAWjG,aAAc,YAEnCsB,GAAW,QAAS,SAAUrG,EAAMiH,EAAMrJ,GACzC,MAAMA,IAAyC,UAAhCoC,EAAK6E,SAASC,cAA7B,OACQ9E,EAAK+S,eAOT9M,GAAO,SAAUC,GACtB,MAAsC,OAA/BA,EAAGnB,aAAa,eAEvBsB,GAAWlG,EAAU,SAAUH,EAAMiH,EAAMrJ,GAC1C,GAAIqM,EACJ,OAAMrM,GAAN,OACQoC,EAAMiH,MAAW,EAAOA,EAAKnC,eACjCmF,EAAMjK,EAAKyI,iBAAkBxB,KAAWgD,EAAIE,UAC7CF,EAAIrE,MACL,MAMJ,IAAIoN,IAAUzV,EAAOmG,MAErBA,IAAOuP,WAAa,WAKnB,MAJK1V,GAAOmG,SAAWA,KACtBnG,EAAOmG,OAASsP,IAGVtP,IAGe,kBAAXwP,SAAyBA,OAAOC,IAC3CD,OAAO,WAAa,MAAOxP,MAEE,mBAAX0P,SAA0BA,OAAOC,QACnDD,OAAOC,QAAU3P,GAEjBnG,EAAOmG,OAASA,IAIbnG","file":"sizzle.min.js"} \ No newline at end of file diff --git a/package.json b/package.json index b48f90a981..1d751ae43e 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "qunit-assert-step": "1.0.3", "requirejs": "2.1.17", "sinon": "1.10.3", - "sizzle": "2.2.1", + "sizzle": "2.3.0", "strip-json-comments": "1.0.3", "testswarm": "1.1.0", "win-spawn": "2.0.0" From f5fb8d71cb20bdbe1b536d05a0b40b503e4e1a43 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Mon, 11 Jan 2016 11:42:33 -0500 Subject: [PATCH 077/927] Build: Encode non-ASCII as \uXXXX --- Gruntfile.js | 1 + 1 file changed, 1 insertion(+) diff --git a/Gruntfile.js b/Gruntfile.js index 626531b293..1e204ad23c 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -183,6 +183,7 @@ module.exports = function( grunt ) { options: { preserveComments: false, sourceMap: true, + ASCIIOnly: true, sourceMapName: "dist/<%= grunt.option('filename').replace('.js', '.min.map') %>", report: "min", From bdf1b8f317d793d8ebbbe7787955edabf201a685 Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Mon, 11 Jan 2016 19:10:28 -0500 Subject: [PATCH 078/927] Deferred: Remove undocumented progress notifications in $.when Fixes gh-2710 Closes gh-2816 --- src/deferred.js | 39 ++++++++++++++++++--------------------- test/unit/deferred.js | 24 ++++-------------------- 2 files changed, 22 insertions(+), 41 deletions(-) diff --git a/src/deferred.js b/src/deferred.js index 846528e795..ff12ac3e0c 100644 --- a/src/deferred.js +++ b/src/deferred.js @@ -295,7 +295,7 @@ jQuery.extend( { // Deferred helper when: function() { - var method, + var method, resolveContexts, i = 0, resolveValues = slice.call( arguments ), length = resolveValues.length, @@ -306,47 +306,44 @@ jQuery.extend( { // the master Deferred. master = jQuery.Deferred(), - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { + // Update function for both resolving subordinates + updateFunc = function( i ) { return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( values === progressValues ) { - master.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { master.resolveWith( - contexts.length === 1 ? contexts[ 0 ] : contexts, - values + resolveContexts.length === 1 ? resolveContexts[ 0 ] : resolveContexts, + resolveValues ); } }; - }, - progressValues, progressContexts, resolveContexts; + }; - // Add listeners to Deferred subordinates; treat others as resolved + // Add listeners to promise-like subordinates; treat others as resolved if ( length > 0 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); resolveContexts = new Array( length ); for ( ; i < length; i++ ) { + + // jQuery.Deferred - treated specially to get resolve-sync behavior if ( resolveValues[ i ] && jQuery.isFunction( ( method = resolveValues[ i ].promise ) ) ) { method.call( resolveValues[ i ] ) - .progress( updateFunc( i, progressContexts, progressValues ) ) - .done( updateFunc( i, resolveContexts, resolveValues ) ) + .done( updateFunc( i ) ) .fail( master.reject ); + + // Other thenables } else if ( resolveValues[ i ] && jQuery.isFunction( ( method = resolveValues[ i ].then ) ) ) { method.call( resolveValues[ i ], - updateFunc( i, resolveContexts, resolveValues ), - master.reject, - updateFunc( i, progressContexts, progressValues ) + updateFunc( i ), + master.reject ); } else { - updateFunc( i, resolveContexts, resolveValues )( resolveValues[ i ] ); + updateFunc( i )( resolveValues[ i ] ); } } diff --git a/test/unit/deferred.js b/test/unit/deferred.js index 1a721d1ee0..83c2f4f6bd 100644 --- a/test/unit/deferred.js +++ b/test/unit/deferred.js @@ -710,13 +710,12 @@ QUnit.test( "jQuery.when", function( assert ) { QUnit.test( "jQuery.when - joined", function( assert ) { - assert.expect( 195 ); + assert.expect( 81 ); var deferreds = { rawValue: 1, fulfilled: jQuery.Deferred().resolve( 1 ), rejected: jQuery.Deferred().reject( 0 ), - notified: jQuery.Deferred().notify( true ), eventuallyFulfilled: jQuery.Deferred().notify( true ), eventuallyRejected: jQuery.Deferred().notify( true ), fulfilledStandardPromise: Promise.resolve( 1 ), @@ -733,11 +732,6 @@ QUnit.test( "jQuery.when - joined", function( assert ) { eventuallyRejected: true, rejectedStandardPromise: true }, - willNotify = { - notified: true, - eventuallyFulfilled: true, - eventuallyRejected: true - }, counter = 49; QUnit.stop(); @@ -752,9 +746,7 @@ QUnit.test( "jQuery.when - joined", function( assert ) { jQuery.each( deferreds, function( id2, defer2 ) { var shouldResolve = willSucceed[ id1 ] && willSucceed[ id2 ], shouldError = willError[ id1 ] || willError[ id2 ], - shouldNotify = willNotify[ id1 ] || willNotify[ id2 ], expected = shouldResolve ? [ 1, 1 ] : [ 0, undefined ], - expectedNotify = shouldNotify && [ willNotify[ id1 ], willNotify[ id2 ] ], code = "jQuery.when( " + id1 + ", " + id2 + " )", context1 = defer1 && jQuery.isFunction( defer1.promise ) ? defer1.promise() : window, context2 = defer2 && jQuery.isFunction( defer2.promise ) ? defer2.promise() : window; @@ -773,10 +765,6 @@ QUnit.test( "jQuery.when - joined", function( assert ) { } else { assert.ok( false, code + " => reject" ); } - } ).progress( function( a, b ) { - assert.deepEqual( [ a, b ], expectedNotify, code + " => progress" ); - assert.strictEqual( this[ 0 ], expectedNotify[ 0 ] ? context1 : undefined, code + " => first context OK" ); - assert.strictEqual( this[ 1 ], expectedNotify[ 1 ] ? context2 : undefined, code + " => second context OK" ); } ).always( restart ); } ); } ); @@ -784,19 +772,15 @@ QUnit.test( "jQuery.when - joined", function( assert ) { deferreds.eventuallyRejected.reject( 0 ); } ); -QUnit.test( "jQuery.when - resolved", function( assert ) { +QUnit.test( "jQuery.when - notify does not affect resolved", function( assert ) { - assert.expect( 6 ); + assert.expect( 3 ); var a = jQuery.Deferred().notify( 1 ).resolve( 4 ), b = jQuery.Deferred().notify( 2 ).resolve( 5 ), c = jQuery.Deferred().notify( 3 ).resolve( 6 ); - jQuery.when( a, b, c ).progress( function( a, b, c ) { - assert.strictEqual( a, 1, "first notify value ok" ); - assert.strictEqual( b, 2, "second notify value ok" ); - assert.strictEqual( c, 3, "third notify value ok" ); - } ).done( function( a, b, c ) { + jQuery.when( a, b, c ).done( function( a, b, c ) { assert.strictEqual( a, 4, "first resolve value ok" ); assert.strictEqual( b, 5, "second resolve value ok" ); assert.strictEqual( c, 6, "third resolve value ok" ); From 36a7cf9b1e1f96fe27710ab3f06043d01ad54d0e Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Mon, 23 Nov 2015 13:57:10 -0500 Subject: [PATCH 079/927] Deferred: Warn on exceptions that are likely programming errors Fixes gh-2736 Closes gh-2737 --- src/deferred.js | 13 +++++++- src/deferred/exceptionHook.js | 19 +++++++++++ src/jquery.js | 1 + test/unit/deferred.js | 59 +++++++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/deferred/exceptionHook.js diff --git a/src/deferred.js b/src/deferred.js index ff12ac3e0c..6a1ef3b438 100644 --- a/src/deferred.js +++ b/src/deferred.js @@ -157,12 +157,17 @@ jQuery.extend( { mightThrow(); } catch ( e ) { + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + // Support: Promises/A+ section 2.3.3.3.4.1 // https://promisesaplus.com/#point-61 // Ignore post-resolution exceptions if ( depth + 1 >= maxDepth ) { - // Only substitue handlers pass on context + // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Thrower ) { that = undefined; @@ -182,6 +187,12 @@ jQuery.extend( { if ( depth ) { process(); } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } window.setTimeout( process ); } }; diff --git a/src/deferred/exceptionHook.js b/src/deferred/exceptionHook.js new file mode 100644 index 0000000000..b9955063a6 --- /dev/null +++ b/src/deferred/exceptionHook.js @@ -0,0 +1,19 @@ +define( [ + "../core", + "../deferred" +], function( jQuery ) { + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE9 + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, stack ); + } +}; + +} ); diff --git a/src/jquery.js b/src/jquery.js index 2faa9c3cda..4cc9c8a909 100644 --- a/src/jquery.js +++ b/src/jquery.js @@ -4,6 +4,7 @@ define( [ "./traversing", "./callbacks", "./deferred", + "./deferred/exceptionHook", "./core/ready", "./data", "./queue", diff --git a/test/unit/deferred.js b/test/unit/deferred.js index 83c2f4f6bd..d65ce34ca9 100644 --- a/test/unit/deferred.js +++ b/test/unit/deferred.js @@ -525,6 +525,65 @@ QUnit.test( "jQuery.Deferred.then - spec compatibility", function( assert ) { } catch ( _ ) {} } ); +QUnit[ window.console ? "test" : "skip" ]( "jQuery.Deferred.exceptionHook", function( assert ) { + + assert.expect( 1 ); + + var done = assert.async(), + defer = jQuery.Deferred(), + oldWarn = window.console.warn; + + window.console.warn = function( msg ) { + assert.ok( /barf/.test( msg ), "Message: " + msg ); + }; + jQuery.when( + defer.then( function() { + // Should get an error + jQuery.barf(); + } ).then( null, jQuery.noop ), + defer.then( function() { + // Should NOT get an error + throw new Error( "Make me a sandwich" ); + } ).then( null, jQuery.noop ) + ).then( function( ) { + window.console.warn = oldWarn; + done(); + } ); + + defer.resolve(); +} ); + +QUnit[ window.console ? "test" : "skip" ]( "jQuery.Deferred.exceptionHook with stack hooks", function( assert ) { + + assert.expect( 2 ); + + var done = assert.async(), + defer = jQuery.Deferred(), + oldWarn = window.console.warn; + + jQuery.Deferred.getStackHook = function() { + // Default exceptionHook assumes the stack is in a form console.warn can log, + // but a custom getStackHook+exceptionHook pair could save a raw form and + // format it to a string only when an exception actually occurs. + // For the unit test we just ensure the plumbing works. + return "NO STACK FOR YOU"; + }; + + window.console.warn = function( msg, stack ) { + assert.ok( /cough_up_hairball/.test( msg ), "Function mentioned: " + msg ); + assert.ok( /NO STACK FOR YOU/.test( stack ), "Stack trace included: " + stack ); + }; + defer.then( function() { + jQuery.cough_up_hairball(); + } ).then( null, function( ) { + window.console.warn = oldWarn; + delete jQuery.Deferred.getStackHook; + done(); + } ); + + defer.resolve(); +} ); + QUnit.test( "jQuery.Deferred - 1.x/2.x compatibility", function( assert ) { assert.expect( 8 ); From aae44111e2d30d908b48f6711272efddb84e6b79 Mon Sep 17 00:00:00 2001 From: Josh Soref Date: Fri, 4 Dec 2015 06:49:23 +0000 Subject: [PATCH 080/927] Docs: Fix various spelling errors Closes gh-2761 --- build/release/dist.js | 2 +- src/deferred.js | 2 +- test/unit/ajax.js | 2 +- test/unit/animation.js | 2 +- test/unit/core.js | 2 +- test/unit/manipulation.js | 6 +++--- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build/release/dist.js b/build/release/dist.js index 514d407396..fc12a1a00c 100644 --- a/build/release/dist.js +++ b/build/release/dist.js @@ -73,7 +73,7 @@ module.exports = function( Release, files, complete ) { Release.exec( "git add .", "Error adding files." ); Release.exec( "git commit -m 'Release " + Release.newVersion + "'", - "Error commiting files." + "Error committing files." ); console.log(); diff --git a/src/deferred.js b/src/deferred.js index 6a1ef3b438..bc2ea86377 100644 --- a/src/deferred.js +++ b/src/deferred.js @@ -135,7 +135,7 @@ jQuery.extend( { // Handle all other returned values } else { - // Only substitue handlers pass on context + // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Identity ) { that = undefined; diff --git a/test/unit/ajax.js b/test/unit/ajax.js index f468f44a8e..3e00afd4e5 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -364,7 +364,7 @@ QUnit.module( "ajax", { }, cache: false, beforeSend: function( xhr, settings ) { - // Remove the random number, but ensure the cashe-buster param is there + // Remove the random number, but ensure the cache-buster param is there var url = settings.url.replace( /\d+/, "" ); assert.equal( url, "data/name.html?abc&devo=hat&_=#brownies", "Make sure that the URL has its hash." ); return false; diff --git a/test/unit/animation.js b/test/unit/animation.js index 3b1479432c..3c5e711d72 100644 --- a/test/unit/animation.js +++ b/test/unit/animation.js @@ -169,7 +169,7 @@ QUnit.test( "Animation.prefilter - prefilter return hooks", function( assert ) { ); assert.equal( TweenSpy.callCount, 0, "Returning something never creates tweens" ); - // Test overriden usage on queues: + // Test overridden usage on queues: prefilter.reset(); element = jQuery( "
    " ) .css( "height", 50 ) diff --git a/test/unit/core.js b/test/unit/core.js index ee17b70b0e..05f99156f7 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -484,7 +484,7 @@ QUnit.test( "isNumeric", function( assert ) { assert.equal( t( true ), false, "Boolean true literal" ); assert.equal( t( false ), false, "Boolean false literal" ); assert.equal( t( "bcfed5.2" ), false, "Number with preceding non-numeric characters" ); - assert.equal( t( "7.2acdgs" ), false, "Number with trailling non-numeric characters" ); + assert.equal( t( "7.2acdgs" ), false, "Number with trailing non-numeric characters" ); assert.equal( t( undefined ), false, "Undefined value" ); assert.equal( t( null ), false, "Null value" ); assert.equal( t( NaN ), false, "NaN value" ); diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index f72000fc4d..8242df79a2 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -495,9 +495,9 @@ QUnit.test( "html(String) tag-hyphenated elements (Bug #1987)", function( assert } ); var j = jQuery( "text" ); - assert.ok( jQuery.nodeName( j[ 0 ], "TR-MULTIPLE-HYPHENS" ), "Tags with multiple hypens" ); - assert.ok( jQuery.nodeName( j.children()[ 0 ], "TD-WITH-HYPHEN" ), "Tags with multiple hypens" ); - assert.equal( j.children().text(), "text", "Tags with multiple hypens behave normally" ); + assert.ok( jQuery.nodeName( j[ 0 ], "TR-MULTIPLE-HYPHENS" ), "Tags with multiple hyphens" ); + assert.ok( jQuery.nodeName( j.children()[ 0 ], "TD-WITH-HYPHEN" ), "Tags with multiple hyphens" ); + assert.equal( j.children().text(), "text", "Tags with multiple hyphens behave normally" ); } ); QUnit.test( "Tag name processing respects the HTML Standard (gh-2005)", function( assert ) { From 1712457fbc648caa1b6a86cd36f79eacb1100d10 Mon Sep 17 00:00:00 2001 From: Henry Wong Date: Sat, 5 Dec 2015 01:35:01 -0800 Subject: [PATCH 081/927] Tests: fixed grammar in comment Close gh-2757 --- test/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/index.html b/test/index.html index 54a1ee041e..fa515c8e5f 100644 --- a/test/index.html +++ b/test/index.html @@ -40,7 +40,7 @@
    - +
    From 605413994f06b01b0295ff681e9043049542b99a Mon Sep 17 00:00:00 2001 From: Richard Gibson Date: Sat, 7 Nov 2015 03:27:06 -0500 Subject: [PATCH 082/927] Docs: Reference new feature guidelines and API tenets Fixes gh-2320 Close gh-2697 --- CONTRIBUTING.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cd6ab6fc4c..9699a53c18 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,9 +12,11 @@ Note: This is the code development repository for *jQuery Core* only. Before ope ## Getting Involved -We've put together [a short guide with tips, tricks, and ideas on getting started](http://contribute.jquery.org/open-source/). We're always looking for help identifying bugs, writing and reducing test cases, and documentation. +[API design principles](https://github.com/jquery/jquery/wiki/API-design-guidelines) -More information on how to contribute to this and other jQuery Foundation projects is at [contribute.jquery.org](http://contribute.jquery.org). Please review our [commit & pull request guide](http://contribute.jquery.org/commits-and-pull-requests/) and [style guides](http://contribute.jquery.org/style-guide/) for instructions on how to maintain a fork and submit patches. Before we can merge any pull request, we'll also need you to sign our [contributor license agreement](http://contribute.jquery.org/cla/). +We're always looking for help [identifying bugs](#how-to-report-bugs), writing and reducing test cases, and improving documentation. And although new features are rare, anything passing our [guidelines](https://github.com/jquery/jquery/wiki/Adding-new-features) will be considered. + +More information on how to contribute to this and other jQuery Foundation projects is at [contribute.jquery.org](http://contribute.jquery.org), including a short guide with tips, tricks, and ideas on [getting started with open source](http://contribute.jquery.org/open-source/). Please review our [commit & pull request guide](http://contribute.jquery.org/commits-and-pull-requests/) and [style guides](http://contribute.jquery.org/style-guide/) for instructions on how to maintain a fork and submit patches. Before we can merge any pull request, we'll also need you to sign our [contributor license agreement](http://contribute.jquery.org/cla/). ## Questions and Discussion From b0b280cd61d1fa12b67bd723ac2c2fa91b92db01 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Sun, 29 Nov 2015 09:41:37 -0800 Subject: [PATCH 083/927] Docs: Updated links to https where they are supported. Close gh-2746 --- CONTRIBUTING.md | 24 ++++++++++++------------ README.md | 20 ++++++++++---------- package.json | 2 +- src/intro.js | 6 +++--- src/manipulation.js | 2 +- src/queue/delay.js | 2 +- test/networkerror.html | 2 +- test/readywait.html | 4 ++-- test/unit/manipulation.js | 2 +- 9 files changed, 32 insertions(+), 32 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9699a53c18..1975f7109d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,8 +7,8 @@ Note: This is the code development repository for *jQuery Core* only. Before opening an issue or making a pull request, be sure you're in the right place. * jQuery plugin issues should be reported to the author of the plugin. -* jQuery Core API documentation issues can be filed [at the API repo](http://github.com/jquery/api.jquery.com/issues). -* Bugs or suggestions for other jQuery Foundation projects should be filed in [their respective repos](http://github.com/jquery/). +* jQuery Core API documentation issues can be filed [at the API repo](https://github.com/jquery/api.jquery.com/issues). +* Bugs or suggestions for other jQuery Foundation projects should be filed in [their respective repos](https://github.com/jquery/). ## Getting Involved @@ -16,22 +16,22 @@ Note: This is the code development repository for *jQuery Core* only. Before ope We're always looking for help [identifying bugs](#how-to-report-bugs), writing and reducing test cases, and improving documentation. And although new features are rare, anything passing our [guidelines](https://github.com/jquery/jquery/wiki/Adding-new-features) will be considered. -More information on how to contribute to this and other jQuery Foundation projects is at [contribute.jquery.org](http://contribute.jquery.org), including a short guide with tips, tricks, and ideas on [getting started with open source](http://contribute.jquery.org/open-source/). Please review our [commit & pull request guide](http://contribute.jquery.org/commits-and-pull-requests/) and [style guides](http://contribute.jquery.org/style-guide/) for instructions on how to maintain a fork and submit patches. Before we can merge any pull request, we'll also need you to sign our [contributor license agreement](http://contribute.jquery.org/cla/). +More information on how to contribute to this and other jQuery Foundation projects is at [contribute.jquery.org](https://contribute.jquery.org), including a short guide with tips, tricks, and ideas on [getting started with open source](https://contribute.jquery.org/open-source/). Please review our [commit & pull request guide](https://contribute.jquery.org/commits-and-pull-requests/) and [style guides](https://contribute.jquery.org/style-guide/) for instructions on how to maintain a fork and submit patches. Before we can merge any pull request, we'll also need you to sign our [contributor license agreement](https://contribute.jquery.org/cla/). ## Questions and Discussion ### Forum and IRC -jQuery is so popular that many developers have knowledge of its capabilities and limitations. Most questions about using jQuery can be answered on popular forums such as [Stack Overflow](http://stackoverflow.com). Please start there when you have questions, even if you think you've found a bug. +jQuery is so popular that many developers have knowledge of its capabilities and limitations. Most questions about using jQuery can be answered on popular forums such as [Stack Overflow](https://stackoverflow.com). Please start there when you have questions, even if you think you've found a bug. -The jQuery Core team watches the [jQuery Development Forum](http://forum.jquery.com/developing-jquery-core). If you have longer posts or questions that can't be answered in places such as Stack Overflow, please feel free to post them there. If you think you've found a bug, please [file it in the bug tracker](#how-to-report-bugs). The Core team can be found in the [#jquery-dev](http://webchat.freenode.net/?channels=jquery-dev) IRC channel on irc.freenode.net. +The jQuery Core team watches the [jQuery Development Forum](https://forum.jquery.com/developing-jquery-core). If you have longer posts or questions that can't be answered in places such as Stack Overflow, please feel free to post them there. If you think you've found a bug, please [file it in the bug tracker](#how-to-report-bugs). The Core team can be found in the [#jquery-dev](https://webchat.freenode.net/?channels=jquery-dev) IRC channel on irc.freenode.net. ### Weekly Status Meetings -The jQuery Core team has a weekly meeting to discuss the progress of current work. The meeting is held in the [#jquery-meeting](http://webchat.freenode.net/?channels=jquery-meeting) IRC channel on irc.freenode.net at [Noon EST](http://www.timeanddate.com/worldclock/fixedtime.html?month=1&day=17&year=2011&hour=12&min=0&sec=0&p1=43) on Mondays. +The jQuery Core team has a weekly meeting to discuss the progress of current work. The meeting is held in the [#jquery-meeting](https://webchat.freenode.net/?channels=jquery-meeting) IRC channel on irc.freenode.net at [Noon EST](https://www.timeanddate.com/worldclock/fixedtime.html?month=1&day=17&year=2011&hour=12&min=0&sec=0&p1=43) on Mondays. -[jQuery Core Meeting Notes](http://meetings.jquery.org/category/core/) +[jQuery Core Meeting Notes](https://meetings.jquery.org/category/core/) ## How to Report Bugs @@ -40,7 +40,7 @@ The jQuery Core team has a weekly meeting to discuss the progress of current wor Most bugs reported to our bug tracker are actually bugs in user code, not in jQuery code. Keep in mind that just because your code throws an error inside of jQuery, this does *not* mean the bug is a jQuery bug. -Ask for help first in the [Using jQuery Forum](http://forum.jquery.com/using-jquery) or another discussion forum like [Stack Overflow](http://stackoverflow.com/). You will get much quicker support, and you will help avoid tying up the jQuery team with invalid bug reports. +Ask for help first in the [Using jQuery Forum](https://forum.jquery.com/using-jquery) or another discussion forum like [Stack Overflow](https://stackoverflow.com/). You will get much quicker support, and you will help avoid tying up the jQuery team with invalid bug reports. ### Disable browser extensions @@ -48,11 +48,11 @@ Make sure you have reproduced the bug with all browser extensions and add-ons di ### Try the latest version of jQuery -Bugs in old versions of jQuery may have already been fixed. In order to avoid reporting known issues, make sure you are always testing against the [latest build](http://code.jquery.com/jquery.js). We cannot fix bugs in older released files, if a bug has been fixed in a subsequent version of jQuery the site should upgrade. +Bugs in old versions of jQuery may have already been fixed. In order to avoid reporting known issues, make sure you are always testing against the [latest build](https://code.jquery.com/jquery.js). We cannot fix bugs in older released files, if a bug has been fixed in a subsequent version of jQuery the site should upgrade. ### Simplify the test case -When experiencing a problem, [reduce your code](http://webkit.org/quality/reduction.html) to the bare minimum required to reproduce the issue. This makes it *much* easier to isolate and fix the offending code. Bugs reported without reduced test cases take on average 9001% longer to fix than bugs that are submitted with them, so you really should try to do this if at all possible. +When experiencing a problem, [reduce your code](https://webkit.org/quality/reduction.html) to the bare minimum required to reproduce the issue. This makes it *much* easier to isolate and fix the offending code. Bugs reported without reduced test cases take on average 9001% longer to fix than bugs that are submitted with them, so you really should try to do this if at all possible. ### Search for related or duplicate issues @@ -65,7 +65,7 @@ We *love* when people contribute back to the project by patching the bugs they f ### Build a Local Copy of jQuery -Create a fork of the jQuery repo on github at http://github.com/jquery/jquery +Create a fork of the jQuery repo on github at https://github.com/jquery/jquery Change directory to your web root directory, whatever that might be: @@ -136,6 +136,6 @@ Click "Load with AMD" after loading the test page. ### Browser support -Remember that jQuery supports multiple browsers and their versions; any contributed code must work in all of them. You can refer to the [browser support page](http://jquery.com/browser-support/) for the current list of supported browsers. +Remember that jQuery supports multiple browsers and their versions; any contributed code must work in all of them. You can refer to the [browser support page](https://jquery.com/browser-support/) for the current list of supported browsers. Note that browser support differs depending on whether you are targeting the `master` or `compat` branch. diff --git a/README.md b/README.md index 99bcb2355b..ae686a13a8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[jQuery](http://jquery.com/) — New Wave JavaScript +[jQuery](https://jquery.com/) — New Wave JavaScript ================================================== Contribution Guides @@ -6,15 +6,15 @@ Contribution Guides In the spirit of open source software development, jQuery always encourages community code contribution. To help you get started and before you jump into writing code, be sure to read these important contribution guidelines thoroughly: -1. [Getting Involved](http://contribute.jquery.org/) -2. [Core Style Guide](http://contribute.jquery.org/style-guide/js/) -3. [Writing Code for jQuery Foundation Projects](http://contribute.jquery.org/code/) +1. [Getting Involved](https://contribute.jquery.org/) +2. [Core Style Guide](https://contribute.jquery.org/style-guide/js/) +3. [Writing Code for jQuery Foundation Projects](https://contribute.jquery.org/code/) Environments in which to use jQuery -------------------------------------- -- [Browser support](http://jquery.com/browser-support/) differs between the master branch and the compat branch. Specifically, the master branch does not support legacy browsers such as IE8. The jQuery team continues to provide support for legacy browsers on the compat branch. Use the latest compat release if support for those browsers is required. See [browser support](http://jquery.com/browser-support/) for more info. +- [Browser support](https://jquery.com/browser-support/) differs between the master branch and the compat branch. Specifically, the master branch does not support legacy browsers such as IE8. The jQuery team continues to provide support for legacy browsers on the compat branch. Use the latest compat release if support for those browsers is required. See [browser support](https://jquery.com/browser-support/) for more info. - To use jQuery in Node, browser extensions, and other non-browser environments, use only master branch releases given the name "jquery" rather than "jquery-compat". The compat branch does not support these environments. @@ -23,7 +23,7 @@ What you need to build your own jQuery In order to build jQuery, you need to have the latest Node.js/npm and git 1.7 or later. Earlier versions might work, but are not supported. -For Windows, you have to download and install [git](http://git-scm.com/downloads) and [Node.js](http://nodejs.org/download/). +For Windows, you have to download and install [git](http://git-scm.com/downloads) and [Node.js](https://nodejs.org/en/download/). OS X users should install [Homebrew](http://brew.sh/). Once Homebrew is installed, run `brew install git` to install git, and `brew install node` to install Node.js. @@ -176,9 +176,9 @@ grunt watch Run the unit tests with a local server that supports PHP. Ensure that you run the site from the root directory, not the "test" directory. No database is required. Pre-configured php local servers are available for Windows and Mac. Here are some options: - Windows: [WAMP download](http://www.wampserver.com/en/) -- Mac: [MAMP download](http://www.mamp.info/en/index.html) +- Mac: [MAMP download](https://www.mamp.info/en/downloads/) - Linux: [Setting up LAMP](https://www.linux.com/learn/tutorials/288158-easy-lamp-server-installation) -- [Mongoose (most platforms)](http://code.google.com/p/mongoose/) +- [Mongoose (most platforms)](https://code.google.com/p/mongoose/) @@ -250,7 +250,7 @@ The following are some commands that can be used there: * `Ctrl + S` - save * `Ctrl + Q` - quit -[QUnit](http://api.qunitjs.com) Reference +[QUnit](https://api.qunitjs.com) Reference ----------------- ### Test methods ### @@ -373,4 +373,4 @@ Questions? ---------- If you have any questions, please feel free to ask on the -[Developing jQuery Core forum](http://forum.jquery.com/developing-jquery-core) or in #jquery on irc.freenode.net. +[Developing jQuery Core forum](https://forum.jquery.com/developing-jquery-core) or in #jquery on irc.freenode.net. diff --git a/package.json b/package.json index 1d751ae43e..e3f2cc0741 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "JavaScript library for DOM operations", "version": "3.0.0-pre", "main": "dist/jquery.js", - "homepage": "http://jquery.com", + "homepage": "https://jquery.com", "author": { "name": "jQuery Foundation and other contributors", "url": "https://github.com/jquery/jquery/blob/master/AUTHORS.txt" diff --git a/src/intro.js b/src/intro.js index aab47c2d98..2918495260 100644 --- a/src/intro.js +++ b/src/intro.js @@ -1,13 +1,13 @@ /*! * jQuery JavaScript Library v@VERSION - * http://jquery.com/ + * https://jquery.com/ * * Includes Sizzle.js - * http://sizzlejs.com/ + * https://sizzlejs.com/ * * Copyright jQuery Foundation and other contributors * Released under the MIT license - * http://jquery.org/license + * https://jquery.org/license * * Date: @DATE */ diff --git a/src/manipulation.js b/src/manipulation.js index 6c4b3ede87..0d10219621 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -239,7 +239,7 @@ jQuery.extend( { if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); diff --git a/src/queue/delay.js b/src/queue/delay.js index 8d5844d6b4..4def286ded 100644 --- a/src/queue/delay.js +++ b/src/queue/delay.js @@ -5,7 +5,7 @@ define( [ ], function( jQuery ) { // Based off of the plugin by Clint Helfers, with permission. -// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ jQuery.fn.delay = function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; diff --git a/test/networkerror.html b/test/networkerror.html index 8057408e46..f666ee0480 100644 --- a/test/networkerror.html +++ b/test/networkerror.html @@ -40,7 +40,7 @@

    This is a test page for - + #8135 which was reported in Firefox when accessing properties diff --git a/test/readywait.html b/test/readywait.html index 7a736bef5a..e34a0d7955 100644 --- a/test/readywait.html +++ b/test/readywait.html @@ -39,9 +39,9 @@

    This is a test page for jQuery.readyWait and jQuery.holdReady, see - #6781 + #6781 and - #8803. + #8803.

    Test for jQuery.holdReady, which can be used diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index 8242df79a2..1346cc06a6 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -2575,7 +2575,7 @@ QUnit.test( "insertAfter, insertBefore, etc do not work when destination is orig "

    1
    2
    " ].join( "" ) ).appendTo( "#qunit-fixture" ); - // complex case based on http://jsfiddle.net/pbramos/gZ7vB/ + // complex case based on https://jsfiddle.net/pbramos/gZ7vB/ jQuery( "#test4087-complex div" )[ name ]( "#test4087-complex li:last-child div:last-child" ); assert.equal( jQuery( "#test4087-complex li:last-child div" ).length, name === "replaceAll" ? 1 : 2, name + " a node to itself, complex case." ); From 0e2f8f9effd2c95647be534bf9055e099aad7cfd Mon Sep 17 00:00:00 2001 From: "Martijn W. van der Lee" Date: Mon, 11 Jan 2016 20:59:33 +0100 Subject: [PATCH 084/927] Traversing: .not/.filter consistency with non-elements Fixes gh-2808 Close gh-2809 --- src/traversing/findFilter.js | 2 +- test/unit/traversing.js | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/traversing/findFilter.js b/src/traversing/findFilter.js index ee76a57a75..f3a929e539 100644 --- a/src/traversing/findFilter.js +++ b/src/traversing/findFilter.js @@ -33,7 +33,7 @@ function winnow( elements, qualifier, not ) { } return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; } ); } diff --git a/test/unit/traversing.js b/test/unit/traversing.js index 7766fd3cb8..d38d40be5f 100644 --- a/test/unit/traversing.js +++ b/test/unit/traversing.js @@ -430,6 +430,17 @@ QUnit.test( "not(jQuery)", function( assert ) { assert.deepEqual( jQuery( "p" ).not( jQuery( "#ap, #sndp, .result" ) ).get(), q( "firstp", "en", "sap", "first" ), "not(jQuery)" ); } ); +QUnit.test( "not(Selector) excludes non-element nodes (gh-2808)", function( assert ) { + assert.expect( 3 ); + + var mixedContents = jQuery( "#nonnodes" ).contents(), + childElements = q( "nonnodesElement" ); + + assert.deepEqual( mixedContents.not( "*" ).get(), [], "not *" ); + assert.deepEqual( mixedContents.not( "[id=a],[id=b]" ).get(), childElements, "not [id=a],[id=b]" ); + assert.deepEqual( mixedContents.not( "[id=a],*,[id=b]" ).get(), [], "not [id=a],*,[id=b]" ); +} ); + QUnit.test( "has(Element)", function( assert ) { assert.expect( 3 ); var obj, detached, multipleParent; From a268f5225cad9ab380494e61a10105cc9eb107e7 Mon Sep 17 00:00:00 2001 From: Richard Gibson Date: Tue, 12 Jan 2016 00:56:29 -0500 Subject: [PATCH 085/927] Traversing: Never let .closest() match positional selectors Fixes gh-2796 Close gh-2818 --- src/traversing.js | 27 ++++++++++++++------------- test/unit/traversing.js | 21 +++++++++++++++++---- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/traversing.js b/src/traversing.js index 0d4c1c4c36..8525c0a5df 100644 --- a/src/traversing.js +++ b/src/traversing.js @@ -39,23 +39,24 @@ jQuery.fn.extend( { i = 0, l = this.length, matched = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; + targets = typeof selectors !== "string" && jQuery( selectors ); - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - // Always skip document fragments - if ( cur.nodeType < 11 && ( pos ? - pos.index( cur ) > -1 : + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { - matched.push( cur ); - break; + matched.push( cur ); + break; + } } } } diff --git a/test/unit/traversing.js b/test/unit/traversing.js index d38d40be5f..3e0c3765b7 100644 --- a/test/unit/traversing.js +++ b/test/unit/traversing.js @@ -323,7 +323,7 @@ QUnit[ jQuery.find.compile ? "test" : "skip" ]( "filter() with positional select } ); QUnit.test( "closest()", function( assert ) { - assert.expect( 13 ); + assert.expect( 14 ); var jq; @@ -344,6 +344,12 @@ QUnit.test( "closest()", function( assert ) { // Test on disconnected node assert.equal( jQuery( "

    " ).find( "p" ).closest( "table" ).length, 0, "Make sure disconnected closest work." ); + assert.deepEqual( + jQuery( "#firstp" ).closest( q( "qunit-fixture" ) ).get(), + q( "qunit-fixture" ), + "Non-string match target" + ); + // Bug #7369 assert.equal( jQuery( "
    " ).closest( "[foo]" ).length, 1, "Disconnected nodes with attribute selector" ); assert.equal( jQuery( "
    text
    " ).closest( "[lang]" ).length, 0, "Disconnected nodes with text and non-existent attribute selector" ); @@ -355,10 +361,17 @@ QUnit.test( "closest()", function( assert ) { } ); QUnit[ jQuery.find.compile ? "test" : "skip" ]( "closest() with positional selectors", function( assert ) { - assert.expect( 2 ); + assert.expect( 3 ); - assert.deepEqual( jQuery( "#qunit-fixture" ).closest( "div:first" ).get(), [], "closest(div:first)" ); - assert.deepEqual( jQuery( "#qunit-fixture div" ).closest( "body:first div:last" ).get(), q( "fx-tests" ), "closest(body:first div:last)" ); + assert.deepEqual( jQuery( "#qunit-fixture" ).closest( "div:first" ).get(), [], + "closest(div:first)" ); + assert.deepEqual( jQuery( "#qunit-fixture div" ).closest( "body:first div:last" ).get(), [], + "closest(body:first div:last)" ); + assert.deepEqual( + jQuery( "#qunit-fixture div" ).closest( "body:first div:last", document ).get(), + [], + "closest(body:first div:last, document)" + ); } ); QUnit.test( "closest(jQuery)", function( assert ) { From dba93f79c405373ec3a492fd0a4bf89b3136a6e6 Mon Sep 17 00:00:00 2001 From: Richard Gibson Date: Mon, 11 Jan 2016 02:26:55 -0500 Subject: [PATCH 086/927] CSS: Restore cascade-override behavior in .show Fixes gh-2654 Fixes gh-2308 Close gh-2810 Ref 86419b10bfa5e3b71a7d416288ab806d47a31d1f --- src/css/showHide.js | 44 ++++++- src/effects.js | 13 +- test/data/testsuite.css | 14 +- test/unit/css.js | 275 ++++++++++++++++++++++++++++++++++++---- test/unit/effects.js | 161 ++++++++++++----------- 5 files changed, 391 insertions(+), 116 deletions(-) diff --git a/src/css/showHide.js b/src/css/showHide.js index 29e2d8bc8e..9c62d55645 100644 --- a/src/css/showHide.js +++ b/src/css/showHide.js @@ -4,6 +4,31 @@ define( [ "../css/var/isHidden" ], function( jQuery, dataPriv, isHidden ) { +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ), + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + function showHide( elements, show ) { var display, elem, values = [], @@ -19,23 +44,30 @@ function showHide( elements, show ) { display = elem.style.display; if ( show ) { - if ( display === "none" ) { - // Restore a pre-hide() value if we have one - values[ index ] = dataPriv.get( elem, "display" ) || ""; + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && jQuery.css( elem, "display" ) === "none" ) { + values[ index ] = getDefaultDisplay( elem ); } } else { if ( display !== "none" ) { values[ index ] = "none"; - // Remember the value we're replacing + // Remember what we're overwriting dataPriv.set( elem, "display", display ); } } } - // Set the display of the elements in a second loop - // to avoid the constant reflow + // Set the display of the elements in a second loop to avoid constant reflow for ( index = 0; index < length; index++ ) { if ( values[ index ] != null ) { elements[ index ].style.display = values[ index ]; diff --git a/src/effects.js b/src/effects.js index 64f9353eff..43162e1fb8 100644 --- a/src/effects.js +++ b/src/effects.js @@ -154,9 +154,16 @@ function defaultPrefilter( elem, props, opts ) { } display = jQuery.css( elem, "display" ); if ( display === "none" ) { - display = restoreDisplay || swap( elem, { "display": "" }, function() { - return jQuery.css( elem, "display" ); - } ); + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } } // Animate inline elements as inline-block diff --git a/test/data/testsuite.css b/test/data/testsuite.css index 50619b98d7..253bea9988 100644 --- a/test/data/testsuite.css +++ b/test/data/testsuite.css @@ -20,10 +20,6 @@ div#fx-tests div.overflow { overflow: visible; } -div.inline { - display: inline; -} - div.autoheight { height: auto; } @@ -68,11 +64,6 @@ div.noopacity { opacity: 0; } -div.hidden, -span.hidden { - display: none; -} - div#fx-tests div.widewidth { background-repeat: repeat-x; } @@ -134,3 +125,8 @@ section { background:#f0f; display:block; } #span-14824 { display: block; } #display { display: list-item !important; } + +.block { display: block; } +.inline { display: inline; } +.list-item { display: list-item; } +.hidden, .none { display: none; } diff --git a/test/unit/css.js b/test/unit/css.js index 4b4017ab87..4ecd08a685 100644 --- a/test/unit/css.js +++ b/test/unit/css.js @@ -474,26 +474,7 @@ QUnit.test( "css(Object) where values are Functions with incoming values", funct // .show(), .hide(), can be excluded from the build if ( jQuery.fn.show && jQuery.fn.hide ) { -QUnit.test( "show(); hide()", function( assert ) { - - assert.expect( 4 ); - - var hiddendiv, div; - - hiddendiv = jQuery( "div.hidden" ); - hiddendiv.hide(); - assert.equal( hiddendiv.css( "display" ), "none", "Cascade-hidden div after hide()" ); - hiddendiv.show(); - assert.equal( hiddendiv.css( "display" ), "none", "Show does not trump CSS cascade" ); - - div = jQuery( "
    " ).hide(); - assert.equal( div.css( "display" ), "none", "Detached div hidden" ); - div.appendTo( "#qunit-fixture" ).show(); - assert.equal( div.css( "display" ), "block", "Initially-detached div after show()" ); - -} ); - -QUnit.test( "show();", function( assert ) { +QUnit.test( "show()", function( assert ) { assert.expect( 18 ); @@ -557,11 +538,20 @@ QUnit.test( "show();", function( assert ) { jQuery( "
    test
    text test" ).hide().remove(); } ); -QUnit.test( "show() resolves correct default display for detached nodes", function( assert ) { - assert.expect( 16 ); +QUnit.test( "show/hide detached nodes", function( assert ) { + assert.expect( 19 ); var div, span, tr; + div = jQuery( "
    " ).hide(); + assert.equal( div.css( "display" ), "none", "hide() updates inline style of a detached div" ); + div.appendTo( "#qunit-fixture" ); + assert.equal( div.css( "display" ), "none", + "A hidden-while-detached div is hidden after attachment" ); + div.show(); + assert.equal( div.css( "display" ), "block", + "A hidden-while-detached div can be shown after attachment" ); + div = jQuery( "