jquery-rails 4.3.3 → 4.3.5

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of jquery-rails might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 04d1efc7599676f1ea73a09cc228adedb46f6ed37b21d9116af50fe9bbe53421
4
- data.tar.gz: 48d97478901ba3d1f41625bedb98ba287ec04ab8165e1cf311ffa9d68056358d
3
+ metadata.gz: f9d31cb4fc9b3f730d69521de0b5b6cc90b0f1ac36fb3337055a5f2337d5c540
4
+ data.tar.gz: 8f2ee03cba1960799862363e3bf7a2ab318aba07e246b494cf43aa0206ac9d8e
5
5
  SHA512:
6
- metadata.gz: 8039284c3cfea4e800b89a6f97362b1a5614ba25ad7afce0175fb2330eb00d583bf3ad5b7ceb17d2447994953c7d472378459c4e1dc3775464f4b32723561247
7
- data.tar.gz: 802371ba0cef86bfa6273415a1be6216f16d37cdede192d172f8bb976bbe24073e8167271619d404bee08a5d9a583deab8de65ae52b71e974555e485153e2dd1
6
+ metadata.gz: 8d7b8ccaab858087cdb2044bbc497d2cd17316362531a1856da8f4784be328840cb4a2a4bf4b03361ed561196c39eec2d68d41e8a05fc87fabf227974a9f9291
7
+ data.tar.gz: 525216ae5c50a6d3616d978ab6763ffd90df5bef8a473aeb47594f67aace08fd6b2cd60194ec87b1d18b06b946a8f06c9434dd312e3e6511054475ada5502d85
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## 4.3.5
2
+
3
+ - update jquery to 3.4.1
4
+
5
+ ## 4.3.4
6
+
7
+ - update jquery to 3.4.0
8
+
1
9
  ## 4.3.3
2
10
 
3
11
  - update jquery to 3.3.1
data/README.md CHANGED
@@ -24,6 +24,12 @@ versions of jQuery.
24
24
 
25
25
  ## Installation
26
26
 
27
+ Add
28
+ ```
29
+ gem 'jquery-rails'
30
+ ```
31
+ to your Gemfile.
32
+
27
33
  The jquery and jquery-ujs files will be added to the asset pipeline and available for you to use. If they're not already in `app/assets/javascripts/application.js` by default, add these lines:
28
34
 
29
35
  ```js
@@ -72,4 +78,4 @@ jquery-rails is released under the [MIT License](MIT-LICENSE).
72
78
 
73
79
  ## Acknowledgements
74
80
 
75
- Many thanks are due to all of [the jquery-rails contributors](https://github.com/rails/jquery-rails/graphs/contributors). Special thanks to [JangoSteve](http://github.com/JangoSteve) for tirelessly answering questions and accepting patches, and the [Rails Core Team](https://github.com/organizations/rails/teams/617) for making jquery-rails an official part of Rails 3.1.
81
+ Many thanks are due to all of [the jquery-rails contributors](https://github.com/rails/jquery-rails/graphs/contributors). Special thanks to [JangoSteve](http://github.com/JangoSteve) for tirelessly answering questions and accepting patches, and the [Rails Core Team](https://github.com/orgs/rails/people) for making jquery-rails an official part of Rails 3.1.
data/VERSIONS.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  | Gem | jQuery | jQuery UJS | jQuery UI |
4
4
  |--------|--------|------------| ----------|
5
+ | 4.3.5 | 1.12.4 & 2.2.4 & 3.4.1 | 1.2.2 | - |
6
+ | 4.3.4 | 1.12.4 & 2.2.4 & 3.4.0 | 1.2.2 | - |
5
7
  | 4.3.3 | 1.12.4 & 2.2.4 & 3.3.1 | 1.2.2 | - |
6
8
  | 4.3.2 | 1.12.4 & 2.2.4 & 3.3.0 | 1.2.2 | - |
7
9
  | 4.3.1 | 1.12.4 & 2.2.4 & 3.2.1 | 1.2.2 | - |
@@ -49,7 +49,7 @@ module Rails::Dom::Testing::Assertions::SelectorAssertions
49
49
 
50
50
  PATTERN_HTML = "['\"]((\\\\\"|\\\\'|[^\"'])*)['\"]"
51
51
  PATTERN_UNICODE_ESCAPED_CHAR = /\\u([0-9a-zA-Z]{4})/
52
- SKELETAL_PATTERN = "(?:jQuery|\\$)\\(%s\\)\\.%s\\(%s\\);"
52
+ SKELETAL_PATTERN = "(?:jQuery|\\$)\\(%s\\)\\.%s\\(%s\\)[;]?"
53
53
 
54
54
  def assert_select_jquery(*args, &block)
55
55
  jquery_method = args.first.is_a?(Symbol) ? args.shift : nil
@@ -1,9 +1,9 @@
1
1
  module Jquery
2
2
  module Rails
3
- VERSION = "4.3.3"
3
+ VERSION = "4.3.5"
4
4
  JQUERY_VERSION = "1.12.4"
5
5
  JQUERY_2_VERSION = "2.2.4"
6
- JQUERY_3_VERSION = "3.3.1"
6
+ JQUERY_3_VERSION = "3.4.1"
7
7
  JQUERY_UJS_VERSION = "1.2.2"
8
8
  end
9
9
  end
@@ -1,3 +1,4 @@
1
+ require 'ostruct'
1
2
  require_relative 'test_helper'
2
3
  require_relative '../lib/jquery/assert_select'
3
4
 
@@ -19,6 +20,9 @@ class AssertSelectJQueryTest < ActiveSupport::TestCase
19
20
  $("#cart tr:not(.total_line) > *").remove();
20
21
  $("[href|=\"val\"][href$=\"val\"][href^=\"val\"]").remove();
21
22
  $("tr + td, li").remove();
23
+
24
+ // without semicolon
25
+ $("#browser_cart").hide("blind", 1000)
22
26
  JS
23
27
 
24
28
  setup do
@@ -28,6 +32,7 @@ class AssertSelectJQueryTest < ActiveSupport::TestCase
28
32
  def test_target_as_receiver
29
33
  assert_nothing_raised do
30
34
  assert_select_jquery :show, :blind, '#card'
35
+ assert_select_jquery :hide, :blind, '#browser_cart'
31
36
  assert_select_jquery :html, '#id' do
32
37
  assert_select 'p', 'something'
33
38
  end
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * jQuery JavaScript Library v3.3.1
2
+ * jQuery JavaScript Library v3.4.1
3
3
  * https://jquery.com/
4
4
  *
5
5
  * Includes Sizzle.js
@@ -9,7 +9,7 @@
9
9
  * Released under the MIT license
10
10
  * https://jquery.org/license
11
11
  *
12
- * Date: 2018-01-20T17:24Z
12
+ * Date: 2019-05-01T21:04Z
13
13
  */
14
14
  ( function( global, factory ) {
15
15
 
@@ -91,20 +91,33 @@ var isWindow = function isWindow( obj ) {
91
91
  var preservedScriptAttributes = {
92
92
  type: true,
93
93
  src: true,
94
+ nonce: true,
94
95
  noModule: true
95
96
  };
96
97
 
97
- function DOMEval( code, doc, node ) {
98
+ function DOMEval( code, node, doc ) {
98
99
  doc = doc || document;
99
100
 
100
- var i,
101
+ var i, val,
101
102
  script = doc.createElement( "script" );
102
103
 
103
104
  script.text = code;
104
105
  if ( node ) {
105
106
  for ( i in preservedScriptAttributes ) {
106
- if ( node[ i ] ) {
107
- script[ i ] = node[ i ];
107
+
108
+ // Support: Firefox 64+, Edge 18+
109
+ // Some browsers don't support the "nonce" property on scripts.
110
+ // On the other hand, just using `getAttribute` is not enough as
111
+ // the `nonce` attribute is reset to an empty string whenever it
112
+ // becomes browsing-context connected.
113
+ // See https://github.com/whatwg/html/issues/2369
114
+ // See https://html.spec.whatwg.org/#nonce-attributes
115
+ // The `node.getAttribute` check was added for the sake of
116
+ // `jQuery.globalEval` so that it can fake a nonce-containing node
117
+ // via an object.
118
+ val = node[ i ] || node.getAttribute && node.getAttribute( i );
119
+ if ( val ) {
120
+ script.setAttribute( i, val );
108
121
  }
109
122
  }
110
123
  }
@@ -129,7 +142,7 @@ function toType( obj ) {
129
142
 
130
143
 
131
144
  var
132
- version = "3.3.1",
145
+ version = "3.4.1",
133
146
 
134
147
  // Define a local copy of jQuery
135
148
  jQuery = function( selector, context ) {
@@ -258,25 +271,28 @@ jQuery.extend = jQuery.fn.extend = function() {
258
271
 
259
272
  // Extend the base object
260
273
  for ( name in options ) {
261
- src = target[ name ];
262
274
  copy = options[ name ];
263
275
 
276
+ // Prevent Object.prototype pollution
264
277
  // Prevent never-ending loop
265
- if ( target === copy ) {
278
+ if ( name === "__proto__" || target === copy ) {
266
279
  continue;
267
280
  }
268
281
 
269
282
  // Recurse if we're merging plain objects or arrays
270
283
  if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
271
284
  ( copyIsArray = Array.isArray( copy ) ) ) ) {
285
+ src = target[ name ];
272
286
 
273
- if ( copyIsArray ) {
274
- copyIsArray = false;
275
- clone = src && Array.isArray( src ) ? src : [];
276
-
287
+ // Ensure proper type for the source value
288
+ if ( copyIsArray && !Array.isArray( src ) ) {
289
+ clone = [];
290
+ } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
291
+ clone = {};
277
292
  } else {
278
- clone = src && jQuery.isPlainObject( src ) ? src : {};
293
+ clone = src;
279
294
  }
295
+ copyIsArray = false;
280
296
 
281
297
  // Never move original objects, clone them
282
298
  target[ name ] = jQuery.extend( deep, clone, copy );
@@ -329,9 +345,6 @@ jQuery.extend( {
329
345
  },
330
346
 
331
347
  isEmptyObject: function( obj ) {
332
-
333
- /* eslint-disable no-unused-vars */
334
- // See https://github.com/eslint/eslint/issues/6125
335
348
  var name;
336
349
 
337
350
  for ( name in obj ) {
@@ -341,8 +354,8 @@ jQuery.extend( {
341
354
  },
342
355
 
343
356
  // Evaluates a script in a global context
344
- globalEval: function( code ) {
345
- DOMEval( code );
357
+ globalEval: function( code, options ) {
358
+ DOMEval( code, { nonce: options && options.nonce } );
346
359
  },
347
360
 
348
361
  each: function( obj, callback ) {
@@ -498,14 +511,14 @@ function isArrayLike( obj ) {
498
511
  }
499
512
  var Sizzle =
500
513
  /*!
501
- * Sizzle CSS Selector Engine v2.3.3
514
+ * Sizzle CSS Selector Engine v2.3.4
502
515
  * https://sizzlejs.com/
503
516
  *
504
- * Copyright jQuery Foundation and other contributors
517
+ * Copyright JS Foundation and other contributors
505
518
  * Released under the MIT license
506
- * http://jquery.org/license
519
+ * https://js.foundation/
507
520
  *
508
- * Date: 2016-08-08
521
+ * Date: 2019-04-08
509
522
  */
510
523
  (function( window ) {
511
524
 
@@ -539,6 +552,7 @@ var i,
539
552
  classCache = createCache(),
540
553
  tokenCache = createCache(),
541
554
  compilerCache = createCache(),
555
+ nonnativeSelectorCache = createCache(),
542
556
  sortOrder = function( a, b ) {
543
557
  if ( a === b ) {
544
558
  hasDuplicate = true;
@@ -600,8 +614,7 @@ var i,
600
614
 
601
615
  rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
602
616
  rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
603
-
604
- rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
617
+ rdescend = new RegExp( whitespace + "|>" ),
605
618
 
606
619
  rpseudo = new RegExp( pseudos ),
607
620
  ridentifier = new RegExp( "^" + identifier + "$" ),
@@ -622,6 +635,7 @@ var i,
622
635
  whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
623
636
  },
624
637
 
638
+ rhtml = /HTML$/i,
625
639
  rinputs = /^(?:input|select|textarea|button)$/i,
626
640
  rheader = /^h\d$/i,
627
641
 
@@ -676,9 +690,9 @@ var i,
676
690
  setDocument();
677
691
  },
678
692
 
679
- disabledAncestor = addCombinator(
693
+ inDisabledFieldset = addCombinator(
680
694
  function( elem ) {
681
- return elem.disabled === true && ("form" in elem || "label" in elem);
695
+ return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
682
696
  },
683
697
  { dir: "parentNode", next: "legend" }
684
698
  );
@@ -791,18 +805,22 @@ function Sizzle( selector, context, results, seed ) {
791
805
 
792
806
  // Take advantage of querySelectorAll
793
807
  if ( support.qsa &&
794
- !compilerCache[ selector + " " ] &&
795
- (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
796
-
797
- if ( nodeType !== 1 ) {
798
- newContext = context;
799
- newSelector = selector;
808
+ !nonnativeSelectorCache[ selector + " " ] &&
809
+ (!rbuggyQSA || !rbuggyQSA.test( selector )) &&
800
810
 
801
- // qSA looks outside Element context, which is not what we want
802
- // Thanks to Andrew Dupont for this workaround technique
803
- // Support: IE <=8
811
+ // Support: IE 8 only
804
812
  // Exclude object elements
805
- } else if ( context.nodeName.toLowerCase() !== "object" ) {
813
+ (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) {
814
+
815
+ newSelector = selector;
816
+ newContext = context;
817
+
818
+ // qSA considers elements outside a scoping root when evaluating child or
819
+ // descendant combinators, which is not what we want.
820
+ // In such cases, we work around the behavior by prefixing every selector in the
821
+ // list with an ID selector referencing the scope context.
822
+ // Thanks to Andrew Dupont for this technique.
823
+ if ( nodeType === 1 && rdescend.test( selector ) ) {
806
824
 
807
825
  // Capture the context ID, setting it first if necessary
808
826
  if ( (nid = context.getAttribute( "id" )) ) {
@@ -824,17 +842,16 @@ function Sizzle( selector, context, results, seed ) {
824
842
  context;
825
843
  }
826
844
 
827
- if ( newSelector ) {
828
- try {
829
- push.apply( results,
830
- newContext.querySelectorAll( newSelector )
831
- );
832
- return results;
833
- } catch ( qsaError ) {
834
- } finally {
835
- if ( nid === expando ) {
836
- context.removeAttribute( "id" );
837
- }
845
+ try {
846
+ push.apply( results,
847
+ newContext.querySelectorAll( newSelector )
848
+ );
849
+ return results;
850
+ } catch ( qsaError ) {
851
+ nonnativeSelectorCache( selector, true );
852
+ } finally {
853
+ if ( nid === expando ) {
854
+ context.removeAttribute( "id" );
838
855
  }
839
856
  }
840
857
  }
@@ -998,7 +1015,7 @@ function createDisabledPseudo( disabled ) {
998
1015
  // Where there is no isDisabled, check manually
999
1016
  /* jshint -W018 */
1000
1017
  elem.isDisabled !== !disabled &&
1001
- disabledAncestor( elem ) === disabled;
1018
+ inDisabledFieldset( elem ) === disabled;
1002
1019
  }
1003
1020
 
1004
1021
  return elem.disabled === disabled;
@@ -1055,10 +1072,13 @@ support = Sizzle.support = {};
1055
1072
  * @returns {Boolean} True iff elem is a non-HTML XML node
1056
1073
  */
1057
1074
  isXML = Sizzle.isXML = function( elem ) {
1058
- // documentElement is verified for cases where it doesn't yet exist
1059
- // (such as loading iframes in IE - #4833)
1060
- var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1061
- return documentElement ? documentElement.nodeName !== "HTML" : false;
1075
+ var namespace = elem.namespaceURI,
1076
+ docElem = (elem.ownerDocument || elem).documentElement;
1077
+
1078
+ // Support: IE <=8
1079
+ // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
1080
+ // https://bugs.jquery.com/ticket/4833
1081
+ return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
1062
1082
  };
1063
1083
 
1064
1084
  /**
@@ -1480,11 +1500,8 @@ Sizzle.matchesSelector = function( elem, expr ) {
1480
1500
  setDocument( elem );
1481
1501
  }
1482
1502
 
1483
- // Make sure that attribute selectors are quoted
1484
- expr = expr.replace( rattributeQuotes, "='$1']" );
1485
-
1486
1503
  if ( support.matchesSelector && documentIsHTML &&
1487
- !compilerCache[ expr + " " ] &&
1504
+ !nonnativeSelectorCache[ expr + " " ] &&
1488
1505
  ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1489
1506
  ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1490
1507
 
@@ -1498,7 +1515,9 @@ Sizzle.matchesSelector = function( elem, expr ) {
1498
1515
  elem.document && elem.document.nodeType !== 11 ) {
1499
1516
  return ret;
1500
1517
  }
1501
- } catch (e) {}
1518
+ } catch (e) {
1519
+ nonnativeSelectorCache( expr, true );
1520
+ }
1502
1521
  }
1503
1522
 
1504
1523
  return Sizzle( expr, document, null, [ elem ] ).length > 0;
@@ -1957,7 +1976,7 @@ Expr = Sizzle.selectors = {
1957
1976
  "contains": markFunction(function( text ) {
1958
1977
  text = text.replace( runescape, funescape );
1959
1978
  return function( elem ) {
1960
- return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
1979
+ return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
1961
1980
  };
1962
1981
  }),
1963
1982
 
@@ -2096,7 +2115,11 @@ Expr = Sizzle.selectors = {
2096
2115
  }),
2097
2116
 
2098
2117
  "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2099
- var i = argument < 0 ? argument + length : argument;
2118
+ var i = argument < 0 ?
2119
+ argument + length :
2120
+ argument > length ?
2121
+ length :
2122
+ argument;
2100
2123
  for ( ; --i >= 0; ) {
2101
2124
  matchIndexes.push( i );
2102
2125
  }
@@ -3146,18 +3169,18 @@ jQuery.each( {
3146
3169
  return siblings( elem.firstChild );
3147
3170
  },
3148
3171
  contents: function( elem ) {
3149
- if ( nodeName( elem, "iframe" ) ) {
3150
- return elem.contentDocument;
3151
- }
3172
+ if ( typeof elem.contentDocument !== "undefined" ) {
3173
+ return elem.contentDocument;
3174
+ }
3152
3175
 
3153
- // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3154
- // Treat the template element as a regular one in browsers that
3155
- // don't support it.
3156
- if ( nodeName( elem, "template" ) ) {
3157
- elem = elem.content || elem;
3158
- }
3176
+ // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3177
+ // Treat the template element as a regular one in browsers that
3178
+ // don't support it.
3179
+ if ( nodeName( elem, "template" ) ) {
3180
+ elem = elem.content || elem;
3181
+ }
3159
3182
 
3160
- return jQuery.merge( [], elem.childNodes );
3183
+ return jQuery.merge( [], elem.childNodes );
3161
3184
  }
3162
3185
  }, function( name, fn ) {
3163
3186
  jQuery.fn[ name ] = function( until, selector ) {
@@ -4466,6 +4489,26 @@ var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4466
4489
 
4467
4490
  var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4468
4491
 
4492
+ var documentElement = document.documentElement;
4493
+
4494
+
4495
+
4496
+ var isAttached = function( elem ) {
4497
+ return jQuery.contains( elem.ownerDocument, elem );
4498
+ },
4499
+ composed = { composed: true };
4500
+
4501
+ // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
4502
+ // Check attachment across shadow DOM boundaries when possible (gh-3504)
4503
+ // Support: iOS 10.0-10.2 only
4504
+ // Early iOS 10 versions support `attachShadow` but not `getRootNode`,
4505
+ // leading to errors. We need to check for `getRootNode`.
4506
+ if ( documentElement.getRootNode ) {
4507
+ isAttached = function( elem ) {
4508
+ return jQuery.contains( elem.ownerDocument, elem ) ||
4509
+ elem.getRootNode( composed ) === elem.ownerDocument;
4510
+ };
4511
+ }
4469
4512
  var isHiddenWithinTree = function( elem, el ) {
4470
4513
 
4471
4514
  // isHiddenWithinTree might be called from jQuery#filter function;
@@ -4480,7 +4523,7 @@ var isHiddenWithinTree = function( elem, el ) {
4480
4523
  // Support: Firefox <=43 - 45
4481
4524
  // Disconnected elements can have computed display: none, so first confirm that elem is
4482
4525
  // in the document.
4483
- jQuery.contains( elem.ownerDocument, elem ) &&
4526
+ isAttached( elem ) &&
4484
4527
 
4485
4528
  jQuery.css( elem, "display" ) === "none";
4486
4529
  };
@@ -4522,7 +4565,8 @@ function adjustCSS( elem, prop, valueParts, tween ) {
4522
4565
  unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4523
4566
 
4524
4567
  // Starting value computation is required for potential unit mismatches
4525
- initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4568
+ initialInUnit = elem.nodeType &&
4569
+ ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4526
4570
  rcssNum.exec( jQuery.css( elem, prop ) );
4527
4571
 
4528
4572
  if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
@@ -4669,7 +4713,7 @@ jQuery.fn.extend( {
4669
4713
  } );
4670
4714
  var rcheckableType = ( /^(?:checkbox|radio)$/i );
4671
4715
 
4672
- var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
4716
+ var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
4673
4717
 
4674
4718
  var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4675
4719
 
@@ -4741,7 +4785,7 @@ function setGlobalEval( elems, refElements ) {
4741
4785
  var rhtml = /<|&#?\w+;/;
4742
4786
 
4743
4787
  function buildFragment( elems, context, scripts, selection, ignored ) {
4744
- var elem, tmp, tag, wrap, contains, j,
4788
+ var elem, tmp, tag, wrap, attached, j,
4745
4789
  fragment = context.createDocumentFragment(),
4746
4790
  nodes = [],
4747
4791
  i = 0,
@@ -4805,13 +4849,13 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
4805
4849
  continue;
4806
4850
  }
4807
4851
 
4808
- contains = jQuery.contains( elem.ownerDocument, elem );
4852
+ attached = isAttached( elem );
4809
4853
 
4810
4854
  // Append to fragment
4811
4855
  tmp = getAll( fragment.appendChild( elem ), "script" );
4812
4856
 
4813
4857
  // Preserve script evaluation history
4814
- if ( contains ) {
4858
+ if ( attached ) {
4815
4859
  setGlobalEval( tmp );
4816
4860
  }
4817
4861
 
@@ -4854,8 +4898,6 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
4854
4898
  div.innerHTML = "<textarea>x</textarea>";
4855
4899
  support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4856
4900
  } )();
4857
- var documentElement = document.documentElement;
4858
-
4859
4901
 
4860
4902
 
4861
4903
  var
@@ -4871,8 +4913,19 @@ function returnFalse() {
4871
4913
  return false;
4872
4914
  }
4873
4915
 
4916
+ // Support: IE <=9 - 11+
4917
+ // focus() and blur() are asynchronous, except when they are no-op.
4918
+ // So expect focus to be synchronous when the element is already active,
4919
+ // and blur to be synchronous when the element is not already active.
4920
+ // (focus and blur are always synchronous in other supported browsers,
4921
+ // this just defines when we can count on it).
4922
+ function expectSync( elem, type ) {
4923
+ return ( elem === safeActiveElement() ) === ( type === "focus" );
4924
+ }
4925
+
4874
4926
  // Support: IE <=9 only
4875
- // See #13393 for more info
4927
+ // Accessing document.activeElement can throw unexpectedly
4928
+ // https://bugs.jquery.com/ticket/13393
4876
4929
  function safeActiveElement() {
4877
4930
  try {
4878
4931
  return document.activeElement;
@@ -5172,9 +5225,10 @@ jQuery.event = {
5172
5225
  while ( ( handleObj = matched.handlers[ j++ ] ) &&
5173
5226
  !event.isImmediatePropagationStopped() ) {
5174
5227
 
5175
- // Triggered event must either 1) have no namespace, or 2) have namespace(s)
5176
- // a subset or equal to those in the bound event (both can have no namespace).
5177
- if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
5228
+ // If the event is namespaced, then each handler is only invoked if it is
5229
+ // specially universal or its namespaces are a superset of the event's.
5230
+ if ( !event.rnamespace || handleObj.namespace === false ||
5231
+ event.rnamespace.test( handleObj.namespace ) ) {
5178
5232
 
5179
5233
  event.handleObj = handleObj;
5180
5234
  event.data = handleObj.data;
@@ -5298,39 +5352,51 @@ jQuery.event = {
5298
5352
  // Prevent triggered image.load events from bubbling to window.load
5299
5353
  noBubble: true
5300
5354
  },
5301
- focus: {
5355
+ click: {
5302
5356
 
5303
- // Fire native event if possible so blur/focus sequence is correct
5304
- trigger: function() {
5305
- if ( this !== safeActiveElement() && this.focus ) {
5306
- this.focus();
5307
- return false;
5308
- }
5309
- },
5310
- delegateType: "focusin"
5311
- },
5312
- blur: {
5313
- trigger: function() {
5314
- if ( this === safeActiveElement() && this.blur ) {
5315
- this.blur();
5316
- return false;
5357
+ // Utilize native event to ensure correct state for checkable inputs
5358
+ setup: function( data ) {
5359
+
5360
+ // For mutual compressibility with _default, replace `this` access with a local var.
5361
+ // `|| data` is dead code meant only to preserve the variable through minification.
5362
+ var el = this || data;
5363
+
5364
+ // Claim the first handler
5365
+ if ( rcheckableType.test( el.type ) &&
5366
+ el.click && nodeName( el, "input" ) ) {
5367
+
5368
+ // dataPriv.set( el, "click", ... )
5369
+ leverageNative( el, "click", returnTrue );
5317
5370
  }
5371
+
5372
+ // Return false to allow normal processing in the caller
5373
+ return false;
5318
5374
  },
5319
- delegateType: "focusout"
5320
- },
5321
- click: {
5375
+ trigger: function( data ) {
5322
5376
 
5323
- // For checkbox, fire native event so checked state will be right
5324
- trigger: function() {
5325
- if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
5326
- this.click();
5327
- return false;
5377
+ // For mutual compressibility with _default, replace `this` access with a local var.
5378
+ // `|| data` is dead code meant only to preserve the variable through minification.
5379
+ var el = this || data;
5380
+
5381
+ // Force setup before triggering a click
5382
+ if ( rcheckableType.test( el.type ) &&
5383
+ el.click && nodeName( el, "input" ) ) {
5384
+
5385
+ leverageNative( el, "click" );
5328
5386
  }
5387
+
5388
+ // Return non-false to allow normal event-path propagation
5389
+ return true;
5329
5390
  },
5330
5391
 
5331
- // For cross-browser consistency, don't fire native .click() on links
5392
+ // For cross-browser consistency, suppress native .click() on links
5393
+ // Also prevent it if we're currently inside a leveraged native-event stack
5332
5394
  _default: function( event ) {
5333
- return nodeName( event.target, "a" );
5395
+ var target = event.target;
5396
+ return rcheckableType.test( target.type ) &&
5397
+ target.click && nodeName( target, "input" ) &&
5398
+ dataPriv.get( target, "click" ) ||
5399
+ nodeName( target, "a" );
5334
5400
  }
5335
5401
  },
5336
5402
 
@@ -5347,6 +5413,93 @@ jQuery.event = {
5347
5413
  }
5348
5414
  };
5349
5415
 
5416
+ // Ensure the presence of an event listener that handles manually-triggered
5417
+ // synthetic events by interrupting progress until reinvoked in response to
5418
+ // *native* events that it fires directly, ensuring that state changes have
5419
+ // already occurred before other listeners are invoked.
5420
+ function leverageNative( el, type, expectSync ) {
5421
+
5422
+ // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
5423
+ if ( !expectSync ) {
5424
+ if ( dataPriv.get( el, type ) === undefined ) {
5425
+ jQuery.event.add( el, type, returnTrue );
5426
+ }
5427
+ return;
5428
+ }
5429
+
5430
+ // Register the controller as a special universal handler for all event namespaces
5431
+ dataPriv.set( el, type, false );
5432
+ jQuery.event.add( el, type, {
5433
+ namespace: false,
5434
+ handler: function( event ) {
5435
+ var notAsync, result,
5436
+ saved = dataPriv.get( this, type );
5437
+
5438
+ if ( ( event.isTrigger & 1 ) && this[ type ] ) {
5439
+
5440
+ // Interrupt processing of the outer synthetic .trigger()ed event
5441
+ // Saved data should be false in such cases, but might be a leftover capture object
5442
+ // from an async native handler (gh-4350)
5443
+ if ( !saved.length ) {
5444
+
5445
+ // Store arguments for use when handling the inner native event
5446
+ // There will always be at least one argument (an event object), so this array
5447
+ // will not be confused with a leftover capture object.
5448
+ saved = slice.call( arguments );
5449
+ dataPriv.set( this, type, saved );
5450
+
5451
+ // Trigger the native event and capture its result
5452
+ // Support: IE <=9 - 11+
5453
+ // focus() and blur() are asynchronous
5454
+ notAsync = expectSync( this, type );
5455
+ this[ type ]();
5456
+ result = dataPriv.get( this, type );
5457
+ if ( saved !== result || notAsync ) {
5458
+ dataPriv.set( this, type, false );
5459
+ } else {
5460
+ result = {};
5461
+ }
5462
+ if ( saved !== result ) {
5463
+
5464
+ // Cancel the outer synthetic event
5465
+ event.stopImmediatePropagation();
5466
+ event.preventDefault();
5467
+ return result.value;
5468
+ }
5469
+
5470
+ // If this is an inner synthetic event for an event with a bubbling surrogate
5471
+ // (focus or blur), assume that the surrogate already propagated from triggering the
5472
+ // native event and prevent that from happening again here.
5473
+ // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
5474
+ // bubbling surrogate propagates *after* the non-bubbling base), but that seems
5475
+ // less bad than duplication.
5476
+ } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
5477
+ event.stopPropagation();
5478
+ }
5479
+
5480
+ // If this is a native event triggered above, everything is now in order
5481
+ // Fire an inner synthetic event with the original arguments
5482
+ } else if ( saved.length ) {
5483
+
5484
+ // ...and capture the result
5485
+ dataPriv.set( this, type, {
5486
+ value: jQuery.event.trigger(
5487
+
5488
+ // Support: IE <=9 - 11+
5489
+ // Extend with the prototype to reset the above stopImmediatePropagation()
5490
+ jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
5491
+ saved.slice( 1 ),
5492
+ this
5493
+ )
5494
+ } );
5495
+
5496
+ // Abort handling of the native event
5497
+ event.stopImmediatePropagation();
5498
+ }
5499
+ }
5500
+ } );
5501
+ }
5502
+
5350
5503
  jQuery.removeEvent = function( elem, type, handle ) {
5351
5504
 
5352
5505
  // This "if" is needed for plain objects
@@ -5459,6 +5612,7 @@ jQuery.each( {
5459
5612
  shiftKey: true,
5460
5613
  view: true,
5461
5614
  "char": true,
5615
+ code: true,
5462
5616
  charCode: true,
5463
5617
  key: true,
5464
5618
  keyCode: true,
@@ -5505,6 +5659,33 @@ jQuery.each( {
5505
5659
  }
5506
5660
  }, jQuery.event.addProp );
5507
5661
 
5662
+ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5663
+ jQuery.event.special[ type ] = {
5664
+
5665
+ // Utilize native event if possible so blur/focus sequence is correct
5666
+ setup: function() {
5667
+
5668
+ // Claim the first handler
5669
+ // dataPriv.set( this, "focus", ... )
5670
+ // dataPriv.set( this, "blur", ... )
5671
+ leverageNative( this, type, expectSync );
5672
+
5673
+ // Return false to allow normal processing in the caller
5674
+ return false;
5675
+ },
5676
+ trigger: function() {
5677
+
5678
+ // Force setup before trigger
5679
+ leverageNative( this, type );
5680
+
5681
+ // Return non-false to allow normal event-path propagation
5682
+ return true;
5683
+ },
5684
+
5685
+ delegateType: delegateType
5686
+ };
5687
+ } );
5688
+
5508
5689
  // Create mouseenter/leave events using mouseover/out and event-time checks
5509
5690
  // so that event delegation works in jQuery.
5510
5691
  // Do the same for pointerenter/pointerleave and pointerover/pointerout
@@ -5755,11 +5936,13 @@ function domManip( collection, args, callback, ignored ) {
5755
5936
  if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {
5756
5937
 
5757
5938
  // Optional AJAX dependency, but won't run scripts if not present
5758
- if ( jQuery._evalUrl ) {
5759
- jQuery._evalUrl( node.src );
5939
+ if ( jQuery._evalUrl && !node.noModule ) {
5940
+ jQuery._evalUrl( node.src, {
5941
+ nonce: node.nonce || node.getAttribute( "nonce" )
5942
+ } );
5760
5943
  }
5761
5944
  } else {
5762
- DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node );
5945
+ DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
5763
5946
  }
5764
5947
  }
5765
5948
  }
@@ -5781,7 +5964,7 @@ function remove( elem, selector, keepData ) {
5781
5964
  }
5782
5965
 
5783
5966
  if ( node.parentNode ) {
5784
- if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
5967
+ if ( keepData && isAttached( node ) ) {
5785
5968
  setGlobalEval( getAll( node, "script" ) );
5786
5969
  }
5787
5970
  node.parentNode.removeChild( node );
@@ -5799,7 +5982,7 @@ jQuery.extend( {
5799
5982
  clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5800
5983
  var i, l, srcElements, destElements,
5801
5984
  clone = elem.cloneNode( true ),
5802
- inPage = jQuery.contains( elem.ownerDocument, elem );
5985
+ inPage = isAttached( elem );
5803
5986
 
5804
5987
  // Fix IE cloning issues
5805
5988
  if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
@@ -6095,8 +6278,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6095
6278
 
6096
6279
  // Support: IE 9 only
6097
6280
  // Detect overflow:scroll screwiness (gh-3699)
6281
+ // Support: Chrome <=64
6282
+ // Don't get tricked when zoom affects offsetWidth (gh-4029)
6098
6283
  div.style.position = "absolute";
6099
- scrollboxSizeVal = div.offsetWidth === 36 || "absolute";
6284
+ scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
6100
6285
 
6101
6286
  documentElement.removeChild( container );
6102
6287
 
@@ -6167,7 +6352,7 @@ function curCSS( elem, name, computed ) {
6167
6352
  if ( computed ) {
6168
6353
  ret = computed.getPropertyValue( name ) || computed[ name ];
6169
6354
 
6170
- if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
6355
+ if ( ret === "" && !isAttached( elem ) ) {
6171
6356
  ret = jQuery.style( elem, name );
6172
6357
  }
6173
6358
 
@@ -6223,30 +6408,13 @@ function addGetHookIf( conditionFn, hookFn ) {
6223
6408
  }
6224
6409
 
6225
6410
 
6226
- var
6411
+ var cssPrefixes = [ "Webkit", "Moz", "ms" ],
6412
+ emptyStyle = document.createElement( "div" ).style,
6413
+ vendorProps = {};
6227
6414
 
6228
- // Swappable if display is none or starts with table
6229
- // except "table", "table-cell", or "table-caption"
6230
- // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6231
- rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6232
- rcustomProp = /^--/,
6233
- cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6234
- cssNormalTransform = {
6235
- letterSpacing: "0",
6236
- fontWeight: "400"
6237
- },
6238
-
6239
- cssPrefixes = [ "Webkit", "Moz", "ms" ],
6240
- emptyStyle = document.createElement( "div" ).style;
6241
-
6242
- // Return a css property mapped to a potentially vendor prefixed property
6415
+ // Return a vendor-prefixed property or undefined
6243
6416
  function vendorPropName( name ) {
6244
6417
 
6245
- // Shortcut for names that are not vendor prefixed
6246
- if ( name in emptyStyle ) {
6247
- return name;
6248
- }
6249
-
6250
6418
  // Check for vendor prefixed names
6251
6419
  var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6252
6420
  i = cssPrefixes.length;
@@ -6259,16 +6427,33 @@ function vendorPropName( name ) {
6259
6427
  }
6260
6428
  }
6261
6429
 
6262
- // Return a property mapped along what jQuery.cssProps suggests or to
6263
- // a vendor prefixed property.
6430
+ // Return a potentially-mapped jQuery.cssProps or vendor prefixed property
6264
6431
  function finalPropName( name ) {
6265
- var ret = jQuery.cssProps[ name ];
6266
- if ( !ret ) {
6267
- ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
6432
+ var final = jQuery.cssProps[ name ] || vendorProps[ name ];
6433
+
6434
+ if ( final ) {
6435
+ return final;
6268
6436
  }
6269
- return ret;
6437
+ if ( name in emptyStyle ) {
6438
+ return name;
6439
+ }
6440
+ return vendorProps[ name ] = vendorPropName( name ) || name;
6270
6441
  }
6271
6442
 
6443
+
6444
+ var
6445
+
6446
+ // Swappable if display is none or starts with table
6447
+ // except "table", "table-cell", or "table-caption"
6448
+ // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6449
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6450
+ rcustomProp = /^--/,
6451
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6452
+ cssNormalTransform = {
6453
+ letterSpacing: "0",
6454
+ fontWeight: "400"
6455
+ };
6456
+
6272
6457
  function setPositiveNumber( elem, value, subtract ) {
6273
6458
 
6274
6459
  // Any relative (+/-) values have already been
@@ -6340,7 +6525,10 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed
6340
6525
  delta -
6341
6526
  extra -
6342
6527
  0.5
6343
- ) );
6528
+
6529
+ // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
6530
+ // Use an explicit zero to avoid NaN (gh-3964)
6531
+ ) ) || 0;
6344
6532
  }
6345
6533
 
6346
6534
  return delta;
@@ -6350,9 +6538,16 @@ function getWidthOrHeight( elem, dimension, extra ) {
6350
6538
 
6351
6539
  // Start with computed style
6352
6540
  var styles = getStyles( elem ),
6541
+
6542
+ // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
6543
+ // Fake content-box until we know it's needed to know the true value.
6544
+ boxSizingNeeded = !support.boxSizingReliable() || extra,
6545
+ isBorderBox = boxSizingNeeded &&
6546
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6547
+ valueIsBorderBox = isBorderBox,
6548
+
6353
6549
  val = curCSS( elem, dimension, styles ),
6354
- isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6355
- valueIsBorderBox = isBorderBox;
6550
+ offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
6356
6551
 
6357
6552
  // Support: Firefox <=54
6358
6553
  // Return a confounding non-pixel value or feign ignorance, as appropriate.
@@ -6363,22 +6558,29 @@ function getWidthOrHeight( elem, dimension, extra ) {
6363
6558
  val = "auto";
6364
6559
  }
6365
6560
 
6366
- // Check for style in case a browser which returns unreliable values
6367
- // for getComputedStyle silently falls back to the reliable elem.style
6368
- valueIsBorderBox = valueIsBorderBox &&
6369
- ( support.boxSizingReliable() || val === elem.style[ dimension ] );
6370
6561
 
6371
6562
  // Fall back to offsetWidth/offsetHeight when value is "auto"
6372
6563
  // This happens for inline elements with no explicit setting (gh-3571)
6373
6564
  // Support: Android <=4.1 - 4.3 only
6374
6565
  // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6375
- if ( val === "auto" ||
6376
- !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) {
6566
+ // Support: IE 9-11 only
6567
+ // Also use offsetWidth/offsetHeight for when box sizing is unreliable
6568
+ // We use getClientRects() to check for hidden/disconnected.
6569
+ // In those cases, the computed value can be trusted to be border-box
6570
+ if ( ( !support.boxSizingReliable() && isBorderBox ||
6571
+ val === "auto" ||
6572
+ !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
6573
+ elem.getClientRects().length ) {
6377
6574
 
6378
- val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];
6575
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6379
6576
 
6380
- // offsetWidth/offsetHeight provide border-box values
6381
- valueIsBorderBox = true;
6577
+ // Where available, offsetWidth/offsetHeight approximate border box dimensions.
6578
+ // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
6579
+ // retrieved value as a content box dimension.
6580
+ valueIsBorderBox = offsetProp in elem;
6581
+ if ( valueIsBorderBox ) {
6582
+ val = elem[ offsetProp ];
6583
+ }
6382
6584
  }
6383
6585
 
6384
6586
  // Normalize "" and auto
@@ -6424,6 +6626,13 @@ jQuery.extend( {
6424
6626
  "flexGrow": true,
6425
6627
  "flexShrink": true,
6426
6628
  "fontWeight": true,
6629
+ "gridArea": true,
6630
+ "gridColumn": true,
6631
+ "gridColumnEnd": true,
6632
+ "gridColumnStart": true,
6633
+ "gridRow": true,
6634
+ "gridRowEnd": true,
6635
+ "gridRowStart": true,
6427
6636
  "lineHeight": true,
6428
6637
  "opacity": true,
6429
6638
  "order": true,
@@ -6479,7 +6688,9 @@ jQuery.extend( {
6479
6688
  }
6480
6689
 
6481
6690
  // If a number was passed in, add the unit (except for certain CSS properties)
6482
- if ( type === "number" ) {
6691
+ // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
6692
+ // "px" to a few hardcoded values.
6693
+ if ( type === "number" && !isCustomProp ) {
6483
6694
  value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6484
6695
  }
6485
6696
 
@@ -6579,18 +6790,29 @@ jQuery.each( [ "height", "width" ], function( i, dimension ) {
6579
6790
  set: function( elem, value, extra ) {
6580
6791
  var matches,
6581
6792
  styles = getStyles( elem ),
6582
- isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6583
- subtract = extra && boxModelAdjustment(
6584
- elem,
6585
- dimension,
6586
- extra,
6587
- isBorderBox,
6588
- styles
6589
- );
6793
+
6794
+ // Only read styles.position if the test has a chance to fail
6795
+ // to avoid forcing a reflow.
6796
+ scrollboxSizeBuggy = !support.scrollboxSize() &&
6797
+ styles.position === "absolute",
6798
+
6799
+ // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
6800
+ boxSizingNeeded = scrollboxSizeBuggy || extra,
6801
+ isBorderBox = boxSizingNeeded &&
6802
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6803
+ subtract = extra ?
6804
+ boxModelAdjustment(
6805
+ elem,
6806
+ dimension,
6807
+ extra,
6808
+ isBorderBox,
6809
+ styles
6810
+ ) :
6811
+ 0;
6590
6812
 
6591
6813
  // Account for unreliable border-box dimensions by comparing offset* to computed and
6592
6814
  // faking a content-box to get border and padding (gh-3699)
6593
- if ( isBorderBox && support.scrollboxSize() === styles.position ) {
6815
+ if ( isBorderBox && scrollboxSizeBuggy ) {
6594
6816
  subtract -= Math.ceil(
6595
6817
  elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6596
6818
  parseFloat( styles[ dimension ] ) -
@@ -6758,9 +6980,9 @@ Tween.propHooks = {
6758
6980
  // Use .style if available and use plain properties where available.
6759
6981
  if ( jQuery.fx.step[ tween.prop ] ) {
6760
6982
  jQuery.fx.step[ tween.prop ]( tween );
6761
- } else if ( tween.elem.nodeType === 1 &&
6762
- ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
6763
- jQuery.cssHooks[ tween.prop ] ) ) {
6983
+ } else if ( tween.elem.nodeType === 1 && (
6984
+ jQuery.cssHooks[ tween.prop ] ||
6985
+ tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
6764
6986
  jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
6765
6987
  } else {
6766
6988
  tween.elem[ tween.prop ] = tween.now;
@@ -8467,6 +8689,10 @@ jQuery.param = function( a, traditional ) {
8467
8689
  encodeURIComponent( value == null ? "" : value );
8468
8690
  };
8469
8691
 
8692
+ if ( a == null ) {
8693
+ return "";
8694
+ }
8695
+
8470
8696
  // If an array was passed in, assume that it is an array of form elements.
8471
8697
  if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8472
8698
 
@@ -8969,12 +9195,14 @@ jQuery.extend( {
8969
9195
  if ( !responseHeaders ) {
8970
9196
  responseHeaders = {};
8971
9197
  while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
8972
- responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
9198
+ responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
9199
+ ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
9200
+ .concat( match[ 2 ] );
8973
9201
  }
8974
9202
  }
8975
- match = responseHeaders[ key.toLowerCase() ];
9203
+ match = responseHeaders[ key.toLowerCase() + " " ];
8976
9204
  }
8977
- return match == null ? null : match;
9205
+ return match == null ? null : match.join( ", " );
8978
9206
  },
8979
9207
 
8980
9208
  // Raw string
@@ -9363,7 +9591,7 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
9363
9591
  } );
9364
9592
 
9365
9593
 
9366
- jQuery._evalUrl = function( url ) {
9594
+ jQuery._evalUrl = function( url, options ) {
9367
9595
  return jQuery.ajax( {
9368
9596
  url: url,
9369
9597
 
@@ -9373,7 +9601,16 @@ jQuery._evalUrl = function( url ) {
9373
9601
  cache: true,
9374
9602
  async: false,
9375
9603
  global: false,
9376
- "throws": true
9604
+
9605
+ // Only evaluate the response if it is successful (gh-4126)
9606
+ // dataFilter is not invoked for failure responses, so using it instead
9607
+ // of the default converter is kludgy but it works.
9608
+ converters: {
9609
+ "text script": function() {}
9610
+ },
9611
+ dataFilter: function( response ) {
9612
+ jQuery.globalEval( response, options );
9613
+ }
9377
9614
  } );
9378
9615
  };
9379
9616
 
@@ -9656,24 +9893,21 @@ jQuery.ajaxPrefilter( "script", function( s ) {
9656
9893
  // Bind script tag hack transport
9657
9894
  jQuery.ajaxTransport( "script", function( s ) {
9658
9895
 
9659
- // This transport only deals with cross domain requests
9660
- if ( s.crossDomain ) {
9896
+ // This transport only deals with cross domain or forced-by-attrs requests
9897
+ if ( s.crossDomain || s.scriptAttrs ) {
9661
9898
  var script, callback;
9662
9899
  return {
9663
9900
  send: function( _, complete ) {
9664
- script = jQuery( "<script>" ).prop( {
9665
- charset: s.scriptCharset,
9666
- src: s.url
9667
- } ).on(
9668
- "load error",
9669
- callback = function( evt ) {
9901
+ script = jQuery( "<script>" )
9902
+ .attr( s.scriptAttrs || {} )
9903
+ .prop( { charset: s.scriptCharset, src: s.url } )
9904
+ .on( "load error", callback = function( evt ) {
9670
9905
  script.remove();
9671
9906
  callback = null;
9672
9907
  if ( evt ) {
9673
9908
  complete( evt.type === "error" ? 404 : 200, evt.type );
9674
9909
  }
9675
- }
9676
- );
9910
+ } );
9677
9911
 
9678
9912
  // Use native DOM manipulation to avoid our domManip AJAX trickery
9679
9913
  document.head.appendChild( script[ 0 ] );