aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbasil.belokon <basil.belokon@gmail.com>2017-12-03 15:58:09 +0600
committerTimmy Willison <4timmywil@gmail.com>2018-01-16 11:39:16 -0500
commit5d3a968e031ab8dff5c07e1d6bb4f196fb82bfa0 (patch)
tree8cb0c8082469f637c38ca90b5dc4c60b9c54f57f
parent428ee4a62488457a1bc568e7475cbf65b1feaf93 (diff)
downloadjquery-5d3a968e031ab8dff5c07e1d6bb4f196fb82bfa0.tar.gz
jquery-5d3a968e031ab8dff5c07e1d6bb4f196fb82bfa0.zip
Manipulation: Add support for scripts with module type
Fixes gh-3871 Close gh-3869
-rw-r--r--src/core/DOMEval.js18
-rw-r--r--src/manipulation.js4
-rw-r--r--src/manipulation/var/rscriptType.js2
-rw-r--r--test/data/inner_module.js1
-rw-r--r--test/data/module.js1
-rw-r--r--test/unit/manipulation.js16
6 files changed, 37 insertions, 5 deletions
diff --git a/src/core/DOMEval.js b/src/core/DOMEval.js
index c49c12e5e..199ec9518 100644
--- a/src/core/DOMEval.js
+++ b/src/core/DOMEval.js
@@ -3,12 +3,26 @@ define( [
], function( document ) {
"use strict";
- function DOMEval( code, doc ) {
+ var preservedScriptAttributes = {
+ type: true,
+ src: true,
+ noModule: true
+ };
+
+ function DOMEval( code, doc, node ) {
doc = doc || document;
- var script = doc.createElement( "script" );
+ var i,
+ script = doc.createElement( "script" );
script.text = code;
+ if ( node ) {
+ for ( i in preservedScriptAttributes ) {
+ if ( node[ i ] ) {
+ script[ i ] = node[ i ];
+ }
+ }
+ }
doc.head.appendChild( script ).parentNode.removeChild( script );
}
diff --git a/src/manipulation.js b/src/manipulation.js
index ae713fe29..142e296ad 100644
--- a/src/manipulation.js
+++ b/src/manipulation.js
@@ -194,14 +194,14 @@ function domManip( collection, args, callback, ignored ) {
!dataPriv.access( node, "globalEval" ) &&
jQuery.contains( doc, node ) ) {
- if ( node.src ) {
+ if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {
// Optional AJAX dependency, but won't run scripts if not present
if ( jQuery._evalUrl ) {
jQuery._evalUrl( node.src );
}
} else {
- DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
+ DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node );
}
}
}
diff --git a/src/manipulation/var/rscriptType.js b/src/manipulation/var/rscriptType.js
index 7237c8a31..cd1430a7e 100644
--- a/src/manipulation/var/rscriptType.js
+++ b/src/manipulation/var/rscriptType.js
@@ -1,5 +1,5 @@
define( function() {
"use strict";
- return ( /^$|\/(?:java|ecma)script/i );
+ return ( /^$|^module$|\/(?:java|ecma)script/i );
} );
diff --git a/test/data/inner_module.js b/test/data/inner_module.js
new file mode 100644
index 000000000..a89a39d27
--- /dev/null
+++ b/test/data/inner_module.js
@@ -0,0 +1 @@
+window.ok( true, "evaluated: innert module with src" );
diff --git a/test/data/module.js b/test/data/module.js
new file mode 100644
index 000000000..b0a8a21fd
--- /dev/null
+++ b/test/data/module.js
@@ -0,0 +1 @@
+window.ok( true, "evaluated: module with src" );
diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js
index 07ab43419..bfe41ed4e 100644
--- a/test/unit/manipulation.js
+++ b/test/unit/manipulation.js
@@ -1797,6 +1797,22 @@ QUnit.test( "html(Function)", function( assert ) {
testHtml( manipulationFunctionReturningObj, assert );
} );
+QUnit.test( "html(script type module)", function( assert ) {
+ assert.expect( 1 );
+ var fixture = jQuery( "#qunit-fixture" ),
+ tmp = fixture.html(
+ [
+ "<script type='module'>ok( true, 'evaluated: module' );</script>",
+ "<script type='module' src='./data/module.js'></script>",
+ "<div>",
+ "<script type='module'>ok( true, 'evaluated: inner module' );</script>",
+ "<script type='module' src='./data/inner_module.js'></script>",
+ "</div>"
+ ].join( "" )
+ ).find( "script" );
+ assert.equal( tmp.length, 4, "All script tags remain." );
+} );
+
QUnit.test( "html(Function) with incoming value -- direct selection", function( assert ) {
assert.expect( 4 );