jquery-rails 4.3.3 → 4.3.4

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: 8b52a193e419a4e8a0da353faf40d8d66705bdf64171fb6c800b637119541ac9
4
+ data.tar.gz: f44fd79c6c3ce8d0b40892f71bd9ec5f570ed56c01c9396281d4909f8ce48d60
5
5
  SHA512:
6
- metadata.gz: 8039284c3cfea4e800b89a6f97362b1a5614ba25ad7afce0175fb2330eb00d583bf3ad5b7ceb17d2447994953c7d472378459c4e1dc3775464f4b32723561247
7
- data.tar.gz: 802371ba0cef86bfa6273415a1be6216f16d37cdede192d172f8bb976bbe24073e8167271619d404bee08a5d9a583deab8de65ae52b71e974555e485153e2dd1
6
+ metadata.gz: b7c4027d93c8fba8669eadf6b469d83f85252e225b2d1d9ccbd6f254785b8c44fdc31bf67ad278305e776df0868149324bd2745df26396d48e74260992630493
7
+ data.tar.gz: ea65dae08a0209aa928eb0196768d7a8811b5be9757dda5289c9505420f6b7cfb8795f1e0da2090198c2bd0be54c3b019561ed775d0f9b6848cb43d8c8f6e835
@@ -1,3 +1,7 @@
1
+ ## 4.3.4
2
+
3
+ - update jquery to 3.4.0
4
+
1
5
  ## 4.3.3
2
6
 
3
7
  - 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.
@@ -2,6 +2,7 @@
2
2
 
3
3
  | Gem | jQuery | jQuery UJS | jQuery UI |
4
4
  |--------|--------|------------| ----------|
5
+ | 4.3.4 | 1.12.4 & 2.2.4 & 3.4.0 | 1.2.2 | - |
5
6
  | 4.3.3 | 1.12.4 & 2.2.4 & 3.3.1 | 1.2.2 | - |
6
7
  | 4.3.2 | 1.12.4 & 2.2.4 & 3.3.0 | 1.2.2 | - |
7
8
  | 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.4"
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.0"
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.0
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-04-10T19:48Z
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.0",
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,22 @@ 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
+ // Check attachment across shadow DOM boundaries when possible (gh-3504)
4502
+ if ( documentElement.attachShadow ) {
4503
+ isAttached = function( elem ) {
4504
+ return jQuery.contains( elem.ownerDocument, elem ) ||
4505
+ elem.getRootNode( composed ) === elem.ownerDocument;
4506
+ };
4507
+ }
4469
4508
  var isHiddenWithinTree = function( elem, el ) {
4470
4509
 
4471
4510
  // isHiddenWithinTree might be called from jQuery#filter function;
@@ -4480,7 +4519,7 @@ var isHiddenWithinTree = function( elem, el ) {
4480
4519
  // Support: Firefox <=43 - 45
4481
4520
  // Disconnected elements can have computed display: none, so first confirm that elem is
4482
4521
  // in the document.
4483
- jQuery.contains( elem.ownerDocument, elem ) &&
4522
+ isAttached( elem ) &&
4484
4523
 
4485
4524
  jQuery.css( elem, "display" ) === "none";
4486
4525
  };
@@ -4522,7 +4561,8 @@ function adjustCSS( elem, prop, valueParts, tween ) {
4522
4561
  unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4523
4562
 
4524
4563
  // Starting value computation is required for potential unit mismatches
4525
- initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4564
+ initialInUnit = elem.nodeType &&
4565
+ ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4526
4566
  rcssNum.exec( jQuery.css( elem, prop ) );
4527
4567
 
4528
4568
  if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
@@ -4669,7 +4709,7 @@ jQuery.fn.extend( {
4669
4709
  } );
4670
4710
  var rcheckableType = ( /^(?:checkbox|radio)$/i );
4671
4711
 
4672
- var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
4712
+ var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
4673
4713
 
4674
4714
  var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4675
4715
 
@@ -4741,7 +4781,7 @@ function setGlobalEval( elems, refElements ) {
4741
4781
  var rhtml = /<|&#?\w+;/;
4742
4782
 
4743
4783
  function buildFragment( elems, context, scripts, selection, ignored ) {
4744
- var elem, tmp, tag, wrap, contains, j,
4784
+ var elem, tmp, tag, wrap, attached, j,
4745
4785
  fragment = context.createDocumentFragment(),
4746
4786
  nodes = [],
4747
4787
  i = 0,
@@ -4805,13 +4845,13 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
4805
4845
  continue;
4806
4846
  }
4807
4847
 
4808
- contains = jQuery.contains( elem.ownerDocument, elem );
4848
+ attached = isAttached( elem );
4809
4849
 
4810
4850
  // Append to fragment
4811
4851
  tmp = getAll( fragment.appendChild( elem ), "script" );
4812
4852
 
4813
4853
  // Preserve script evaluation history
4814
- if ( contains ) {
4854
+ if ( attached ) {
4815
4855
  setGlobalEval( tmp );
4816
4856
  }
4817
4857
 
@@ -4854,8 +4894,6 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
4854
4894
  div.innerHTML = "<textarea>x</textarea>";
4855
4895
  support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4856
4896
  } )();
4857
- var documentElement = document.documentElement;
4858
-
4859
4897
 
4860
4898
 
4861
4899
  var
@@ -4871,8 +4909,19 @@ function returnFalse() {
4871
4909
  return false;
4872
4910
  }
4873
4911
 
4912
+ // Support: IE <=9 - 11+
4913
+ // focus() and blur() are asynchronous, except when they are no-op.
4914
+ // So expect focus to be synchronous when the element is already active,
4915
+ // and blur to be synchronous when the element is not already active.
4916
+ // (focus and blur are always synchronous in other supported browsers,
4917
+ // this just defines when we can count on it).
4918
+ function expectSync( elem, type ) {
4919
+ return ( elem === safeActiveElement() ) === ( type === "focus" );
4920
+ }
4921
+
4874
4922
  // Support: IE <=9 only
4875
- // See #13393 for more info
4923
+ // Accessing document.activeElement can throw unexpectedly
4924
+ // https://bugs.jquery.com/ticket/13393
4876
4925
  function safeActiveElement() {
4877
4926
  try {
4878
4927
  return document.activeElement;
@@ -5172,9 +5221,10 @@ jQuery.event = {
5172
5221
  while ( ( handleObj = matched.handlers[ j++ ] ) &&
5173
5222
  !event.isImmediatePropagationStopped() ) {
5174
5223
 
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 ) ) {
5224
+ // If the event is namespaced, then each handler is only invoked if it is
5225
+ // specially universal or its namespaces are a superset of the event's.
5226
+ if ( !event.rnamespace || handleObj.namespace === false ||
5227
+ event.rnamespace.test( handleObj.namespace ) ) {
5178
5228
 
5179
5229
  event.handleObj = handleObj;
5180
5230
  event.data = handleObj.data;
@@ -5298,39 +5348,53 @@ jQuery.event = {
5298
5348
  // Prevent triggered image.load events from bubbling to window.load
5299
5349
  noBubble: true
5300
5350
  },
5301
- focus: {
5351
+ click: {
5302
5352
 
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;
5353
+ // Utilize native event to ensure correct state for checkable inputs
5354
+ setup: function( data ) {
5355
+
5356
+ // For mutual compressibility with _default, replace `this` access with a local var.
5357
+ // `|| data` is dead code meant only to preserve the variable through minification.
5358
+ var el = this || data;
5359
+
5360
+ // Claim the first handler
5361
+ if ( rcheckableType.test( el.type ) &&
5362
+ el.click && nodeName( el, "input" ) &&
5363
+ dataPriv.get( el, "click" ) === undefined ) {
5364
+
5365
+ // dataPriv.set( el, "click", ... )
5366
+ leverageNative( el, "click", returnTrue );
5317
5367
  }
5368
+
5369
+ // Return false to allow normal processing in the caller
5370
+ return false;
5318
5371
  },
5319
- delegateType: "focusout"
5320
- },
5321
- click: {
5372
+ trigger: function( data ) {
5322
5373
 
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;
5374
+ // For mutual compressibility with _default, replace `this` access with a local var.
5375
+ // `|| data` is dead code meant only to preserve the variable through minification.
5376
+ var el = this || data;
5377
+
5378
+ // Force setup before triggering a click
5379
+ if ( rcheckableType.test( el.type ) &&
5380
+ el.click && nodeName( el, "input" ) &&
5381
+ dataPriv.get( el, "click" ) === undefined ) {
5382
+
5383
+ leverageNative( el, "click" );
5328
5384
  }
5385
+
5386
+ // Return non-false to allow normal event-path propagation
5387
+ return true;
5329
5388
  },
5330
5389
 
5331
- // For cross-browser consistency, don't fire native .click() on links
5390
+ // For cross-browser consistency, suppress native .click() on links
5391
+ // Also prevent it if we're currently inside a leveraged native-event stack
5332
5392
  _default: function( event ) {
5333
- return nodeName( event.target, "a" );
5393
+ var target = event.target;
5394
+ return rcheckableType.test( target.type ) &&
5395
+ target.click && nodeName( target, "input" ) &&
5396
+ dataPriv.get( target, "click" ) ||
5397
+ nodeName( target, "a" );
5334
5398
  }
5335
5399
  },
5336
5400
 
@@ -5347,6 +5411,85 @@ jQuery.event = {
5347
5411
  }
5348
5412
  };
5349
5413
 
5414
+ // Ensure the presence of an event listener that handles manually-triggered
5415
+ // synthetic events by interrupting progress until reinvoked in response to
5416
+ // *native* events that it fires directly, ensuring that state changes have
5417
+ // already occurred before other listeners are invoked.
5418
+ function leverageNative( el, type, expectSync ) {
5419
+
5420
+ // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
5421
+ if ( !expectSync ) {
5422
+ jQuery.event.add( el, type, returnTrue );
5423
+ return;
5424
+ }
5425
+
5426
+ // Register the controller as a special universal handler for all event namespaces
5427
+ dataPriv.set( el, type, false );
5428
+ jQuery.event.add( el, type, {
5429
+ namespace: false,
5430
+ handler: function( event ) {
5431
+ var notAsync, result,
5432
+ saved = dataPriv.get( this, type );
5433
+
5434
+ if ( ( event.isTrigger & 1 ) && this[ type ] ) {
5435
+
5436
+ // Interrupt processing of the outer synthetic .trigger()ed event
5437
+ if ( !saved ) {
5438
+
5439
+ // Store arguments for use when handling the inner native event
5440
+ saved = slice.call( arguments );
5441
+ dataPriv.set( this, type, saved );
5442
+
5443
+ // Trigger the native event and capture its result
5444
+ // Support: IE <=9 - 11+
5445
+ // focus() and blur() are asynchronous
5446
+ notAsync = expectSync( this, type );
5447
+ this[ type ]();
5448
+ result = dataPriv.get( this, type );
5449
+ if ( saved !== result || notAsync ) {
5450
+ dataPriv.set( this, type, false );
5451
+ } else {
5452
+ result = undefined;
5453
+ }
5454
+ if ( saved !== result ) {
5455
+
5456
+ // Cancel the outer synthetic event
5457
+ event.stopImmediatePropagation();
5458
+ event.preventDefault();
5459
+ return result;
5460
+ }
5461
+
5462
+ // If this is an inner synthetic event for an event with a bubbling surrogate
5463
+ // (focus or blur), assume that the surrogate already propagated from triggering the
5464
+ // native event and prevent that from happening again here.
5465
+ // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
5466
+ // bubbling surrogate propagates *after* the non-bubbling base), but that seems
5467
+ // less bad than duplication.
5468
+ } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
5469
+ event.stopPropagation();
5470
+ }
5471
+
5472
+ // If this is a native event triggered above, everything is now in order
5473
+ // Fire an inner synthetic event with the original arguments
5474
+ } else if ( saved ) {
5475
+
5476
+ // ...and capture the result
5477
+ dataPriv.set( this, type, jQuery.event.trigger(
5478
+
5479
+ // Support: IE <=9 - 11+
5480
+ // Extend with the prototype to reset the above stopImmediatePropagation()
5481
+ jQuery.extend( saved.shift(), jQuery.Event.prototype ),
5482
+ saved,
5483
+ this
5484
+ ) );
5485
+
5486
+ // Abort handling of the native event
5487
+ event.stopImmediatePropagation();
5488
+ }
5489
+ }
5490
+ } );
5491
+ }
5492
+
5350
5493
  jQuery.removeEvent = function( elem, type, handle ) {
5351
5494
 
5352
5495
  // This "if" is needed for plain objects
@@ -5459,6 +5602,7 @@ jQuery.each( {
5459
5602
  shiftKey: true,
5460
5603
  view: true,
5461
5604
  "char": true,
5605
+ code: true,
5462
5606
  charCode: true,
5463
5607
  key: true,
5464
5608
  keyCode: true,
@@ -5505,6 +5649,33 @@ jQuery.each( {
5505
5649
  }
5506
5650
  }, jQuery.event.addProp );
5507
5651
 
5652
+ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5653
+ jQuery.event.special[ type ] = {
5654
+
5655
+ // Utilize native event if possible so blur/focus sequence is correct
5656
+ setup: function() {
5657
+
5658
+ // Claim the first handler
5659
+ // dataPriv.set( this, "focus", ... )
5660
+ // dataPriv.set( this, "blur", ... )
5661
+ leverageNative( this, type, expectSync );
5662
+
5663
+ // Return false to allow normal processing in the caller
5664
+ return false;
5665
+ },
5666
+ trigger: function() {
5667
+
5668
+ // Force setup before trigger
5669
+ leverageNative( this, type );
5670
+
5671
+ // Return non-false to allow normal event-path propagation
5672
+ return true;
5673
+ },
5674
+
5675
+ delegateType: delegateType
5676
+ };
5677
+ } );
5678
+
5508
5679
  // Create mouseenter/leave events using mouseover/out and event-time checks
5509
5680
  // so that event delegation works in jQuery.
5510
5681
  // Do the same for pointerenter/pointerleave and pointerover/pointerout
@@ -5755,11 +5926,13 @@ function domManip( collection, args, callback, ignored ) {
5755
5926
  if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {
5756
5927
 
5757
5928
  // Optional AJAX dependency, but won't run scripts if not present
5758
- if ( jQuery._evalUrl ) {
5759
- jQuery._evalUrl( node.src );
5929
+ if ( jQuery._evalUrl && !node.noModule ) {
5930
+ jQuery._evalUrl( node.src, {
5931
+ nonce: node.nonce || node.getAttribute( "nonce" )
5932
+ } );
5760
5933
  }
5761
5934
  } else {
5762
- DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node );
5935
+ DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
5763
5936
  }
5764
5937
  }
5765
5938
  }
@@ -5781,7 +5954,7 @@ function remove( elem, selector, keepData ) {
5781
5954
  }
5782
5955
 
5783
5956
  if ( node.parentNode ) {
5784
- if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
5957
+ if ( keepData && isAttached( node ) ) {
5785
5958
  setGlobalEval( getAll( node, "script" ) );
5786
5959
  }
5787
5960
  node.parentNode.removeChild( node );
@@ -5799,7 +5972,7 @@ jQuery.extend( {
5799
5972
  clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5800
5973
  var i, l, srcElements, destElements,
5801
5974
  clone = elem.cloneNode( true ),
5802
- inPage = jQuery.contains( elem.ownerDocument, elem );
5975
+ inPage = isAttached( elem );
5803
5976
 
5804
5977
  // Fix IE cloning issues
5805
5978
  if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
@@ -6095,8 +6268,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6095
6268
 
6096
6269
  // Support: IE 9 only
6097
6270
  // Detect overflow:scroll screwiness (gh-3699)
6271
+ // Support: Chrome <=64
6272
+ // Don't get tricked when zoom affects offsetWidth (gh-4029)
6098
6273
  div.style.position = "absolute";
6099
- scrollboxSizeVal = div.offsetWidth === 36 || "absolute";
6274
+ scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
6100
6275
 
6101
6276
  documentElement.removeChild( container );
6102
6277
 
@@ -6167,7 +6342,7 @@ function curCSS( elem, name, computed ) {
6167
6342
  if ( computed ) {
6168
6343
  ret = computed.getPropertyValue( name ) || computed[ name ];
6169
6344
 
6170
- if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
6345
+ if ( ret === "" && !isAttached( elem ) ) {
6171
6346
  ret = jQuery.style( elem, name );
6172
6347
  }
6173
6348
 
@@ -6223,30 +6398,13 @@ function addGetHookIf( conditionFn, hookFn ) {
6223
6398
  }
6224
6399
 
6225
6400
 
6226
- var
6401
+ var cssPrefixes = [ "Webkit", "Moz", "ms" ],
6402
+ emptyStyle = document.createElement( "div" ).style,
6403
+ vendorProps = {};
6227
6404
 
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
6405
+ // Return a vendor-prefixed property or undefined
6243
6406
  function vendorPropName( name ) {
6244
6407
 
6245
- // Shortcut for names that are not vendor prefixed
6246
- if ( name in emptyStyle ) {
6247
- return name;
6248
- }
6249
-
6250
6408
  // Check for vendor prefixed names
6251
6409
  var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6252
6410
  i = cssPrefixes.length;
@@ -6259,16 +6417,33 @@ function vendorPropName( name ) {
6259
6417
  }
6260
6418
  }
6261
6419
 
6262
- // Return a property mapped along what jQuery.cssProps suggests or to
6263
- // a vendor prefixed property.
6420
+ // Return a potentially-mapped jQuery.cssProps or vendor prefixed property
6264
6421
  function finalPropName( name ) {
6265
- var ret = jQuery.cssProps[ name ];
6266
- if ( !ret ) {
6267
- ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
6422
+ var final = jQuery.cssProps[ name ] || vendorProps[ name ];
6423
+
6424
+ if ( final ) {
6425
+ return final;
6268
6426
  }
6269
- return ret;
6427
+ if ( name in emptyStyle ) {
6428
+ return name;
6429
+ }
6430
+ return vendorProps[ name ] = vendorPropName( name ) || name;
6270
6431
  }
6271
6432
 
6433
+
6434
+ var
6435
+
6436
+ // Swappable if display is none or starts with table
6437
+ // except "table", "table-cell", or "table-caption"
6438
+ // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6439
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6440
+ rcustomProp = /^--/,
6441
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6442
+ cssNormalTransform = {
6443
+ letterSpacing: "0",
6444
+ fontWeight: "400"
6445
+ };
6446
+
6272
6447
  function setPositiveNumber( elem, value, subtract ) {
6273
6448
 
6274
6449
  // Any relative (+/-) values have already been
@@ -6340,7 +6515,10 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed
6340
6515
  delta -
6341
6516
  extra -
6342
6517
  0.5
6343
- ) );
6518
+
6519
+ // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
6520
+ // Use an explicit zero to avoid NaN (gh-3964)
6521
+ ) ) || 0;
6344
6522
  }
6345
6523
 
6346
6524
  return delta;
@@ -6350,9 +6528,16 @@ function getWidthOrHeight( elem, dimension, extra ) {
6350
6528
 
6351
6529
  // Start with computed style
6352
6530
  var styles = getStyles( elem ),
6531
+
6532
+ // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
6533
+ // Fake content-box until we know it's needed to know the true value.
6534
+ boxSizingNeeded = !support.boxSizingReliable() || extra,
6535
+ isBorderBox = boxSizingNeeded &&
6536
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6537
+ valueIsBorderBox = isBorderBox,
6538
+
6353
6539
  val = curCSS( elem, dimension, styles ),
6354
- isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6355
- valueIsBorderBox = isBorderBox;
6540
+ offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
6356
6541
 
6357
6542
  // Support: Firefox <=54
6358
6543
  // Return a confounding non-pixel value or feign ignorance, as appropriate.
@@ -6363,22 +6548,29 @@ function getWidthOrHeight( elem, dimension, extra ) {
6363
6548
  val = "auto";
6364
6549
  }
6365
6550
 
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
6551
 
6371
6552
  // Fall back to offsetWidth/offsetHeight when value is "auto"
6372
6553
  // This happens for inline elements with no explicit setting (gh-3571)
6373
6554
  // Support: Android <=4.1 - 4.3 only
6374
6555
  // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6375
- if ( val === "auto" ||
6376
- !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) {
6556
+ // Support: IE 9-11 only
6557
+ // Also use offsetWidth/offsetHeight for when box sizing is unreliable
6558
+ // We use getClientRects() to check for hidden/disconnected.
6559
+ // In those cases, the computed value can be trusted to be border-box
6560
+ if ( ( !support.boxSizingReliable() && isBorderBox ||
6561
+ val === "auto" ||
6562
+ !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
6563
+ elem.getClientRects().length ) {
6377
6564
 
6378
- val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];
6565
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6379
6566
 
6380
- // offsetWidth/offsetHeight provide border-box values
6381
- valueIsBorderBox = true;
6567
+ // Where available, offsetWidth/offsetHeight approximate border box dimensions.
6568
+ // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
6569
+ // retrieved value as a content box dimension.
6570
+ valueIsBorderBox = offsetProp in elem;
6571
+ if ( valueIsBorderBox ) {
6572
+ val = elem[ offsetProp ];
6573
+ }
6382
6574
  }
6383
6575
 
6384
6576
  // Normalize "" and auto
@@ -6424,6 +6616,13 @@ jQuery.extend( {
6424
6616
  "flexGrow": true,
6425
6617
  "flexShrink": true,
6426
6618
  "fontWeight": true,
6619
+ "gridArea": true,
6620
+ "gridColumn": true,
6621
+ "gridColumnEnd": true,
6622
+ "gridColumnStart": true,
6623
+ "gridRow": true,
6624
+ "gridRowEnd": true,
6625
+ "gridRowStart": true,
6427
6626
  "lineHeight": true,
6428
6627
  "opacity": true,
6429
6628
  "order": true,
@@ -6479,7 +6678,9 @@ jQuery.extend( {
6479
6678
  }
6480
6679
 
6481
6680
  // If a number was passed in, add the unit (except for certain CSS properties)
6482
- if ( type === "number" ) {
6681
+ // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
6682
+ // "px" to a few hardcoded values.
6683
+ if ( type === "number" && !isCustomProp ) {
6483
6684
  value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6484
6685
  }
6485
6686
 
@@ -6579,18 +6780,29 @@ jQuery.each( [ "height", "width" ], function( i, dimension ) {
6579
6780
  set: function( elem, value, extra ) {
6580
6781
  var matches,
6581
6782
  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
- );
6783
+
6784
+ // Only read styles.position if the test has a chance to fail
6785
+ // to avoid forcing a reflow.
6786
+ scrollboxSizeBuggy = !support.scrollboxSize() &&
6787
+ styles.position === "absolute",
6788
+
6789
+ // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
6790
+ boxSizingNeeded = scrollboxSizeBuggy || extra,
6791
+ isBorderBox = boxSizingNeeded &&
6792
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6793
+ subtract = extra ?
6794
+ boxModelAdjustment(
6795
+ elem,
6796
+ dimension,
6797
+ extra,
6798
+ isBorderBox,
6799
+ styles
6800
+ ) :
6801
+ 0;
6590
6802
 
6591
6803
  // Account for unreliable border-box dimensions by comparing offset* to computed and
6592
6804
  // faking a content-box to get border and padding (gh-3699)
6593
- if ( isBorderBox && support.scrollboxSize() === styles.position ) {
6805
+ if ( isBorderBox && scrollboxSizeBuggy ) {
6594
6806
  subtract -= Math.ceil(
6595
6807
  elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6596
6808
  parseFloat( styles[ dimension ] ) -
@@ -6758,9 +6970,9 @@ Tween.propHooks = {
6758
6970
  // Use .style if available and use plain properties where available.
6759
6971
  if ( jQuery.fx.step[ tween.prop ] ) {
6760
6972
  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 ] ) ) {
6973
+ } else if ( tween.elem.nodeType === 1 && (
6974
+ jQuery.cssHooks[ tween.prop ] ||
6975
+ tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
6764
6976
  jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
6765
6977
  } else {
6766
6978
  tween.elem[ tween.prop ] = tween.now;
@@ -8467,6 +8679,10 @@ jQuery.param = function( a, traditional ) {
8467
8679
  encodeURIComponent( value == null ? "" : value );
8468
8680
  };
8469
8681
 
8682
+ if ( a == null ) {
8683
+ return "";
8684
+ }
8685
+
8470
8686
  // If an array was passed in, assume that it is an array of form elements.
8471
8687
  if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8472
8688
 
@@ -8969,12 +9185,14 @@ jQuery.extend( {
8969
9185
  if ( !responseHeaders ) {
8970
9186
  responseHeaders = {};
8971
9187
  while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
8972
- responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
9188
+ responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
9189
+ ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
9190
+ .concat( match[ 2 ] );
8973
9191
  }
8974
9192
  }
8975
- match = responseHeaders[ key.toLowerCase() ];
9193
+ match = responseHeaders[ key.toLowerCase() + " " ];
8976
9194
  }
8977
- return match == null ? null : match;
9195
+ return match == null ? null : match.join( ", " );
8978
9196
  },
8979
9197
 
8980
9198
  // Raw string
@@ -9363,7 +9581,7 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
9363
9581
  } );
9364
9582
 
9365
9583
 
9366
- jQuery._evalUrl = function( url ) {
9584
+ jQuery._evalUrl = function( url, options ) {
9367
9585
  return jQuery.ajax( {
9368
9586
  url: url,
9369
9587
 
@@ -9373,7 +9591,16 @@ jQuery._evalUrl = function( url ) {
9373
9591
  cache: true,
9374
9592
  async: false,
9375
9593
  global: false,
9376
- "throws": true
9594
+
9595
+ // Only evaluate the response if it is successful (gh-4126)
9596
+ // dataFilter is not invoked for failure responses, so using it instead
9597
+ // of the default converter is kludgy but it works.
9598
+ converters: {
9599
+ "text script": function() {}
9600
+ },
9601
+ dataFilter: function( response ) {
9602
+ jQuery.globalEval( response, options );
9603
+ }
9377
9604
  } );
9378
9605
  };
9379
9606
 
@@ -9656,24 +9883,21 @@ jQuery.ajaxPrefilter( "script", function( s ) {
9656
9883
  // Bind script tag hack transport
9657
9884
  jQuery.ajaxTransport( "script", function( s ) {
9658
9885
 
9659
- // This transport only deals with cross domain requests
9660
- if ( s.crossDomain ) {
9886
+ // This transport only deals with cross domain or forced-by-attrs requests
9887
+ if ( s.crossDomain || s.scriptAttrs ) {
9661
9888
  var script, callback;
9662
9889
  return {
9663
9890
  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 ) {
9891
+ script = jQuery( "<script>" )
9892
+ .attr( s.scriptAttrs || {} )
9893
+ .prop( { charset: s.scriptCharset, src: s.url } )
9894
+ .on( "load error", callback = function( evt ) {
9670
9895
  script.remove();
9671
9896
  callback = null;
9672
9897
  if ( evt ) {
9673
9898
  complete( evt.type === "error" ? 404 : 200, evt.type );
9674
9899
  }
9675
- }
9676
- );
9900
+ } );
9677
9901
 
9678
9902
  // Use native DOM manipulation to avoid our domManip AJAX trickery
9679
9903
  document.head.appendChild( script[ 0 ] );