Skip to content
Permalink
Browse files

Manipulation: Respect script nomodule attribute in DOM manipulation

PR #3869 added support for `<script type="module">` & some support for
the `nomodule` attribute but with no tests for `nomodule` and with the
attribute only respected on inline scripts. This commit adds support for
source-based scripts as well. It also adds tests for `nomodule`, including
making sure legacy browsers execute such scripts as they'd natively do - that's
the whole point of `nomodule` scripts, after all.

Fixes gh-4281
Closes gh-4282
Ref gh-3871
Ref gh-3869
  • Loading branch information...
mgol committed Jan 21, 2019
1 parent 543d3d2 commit e4de8b4626f8872a4cb1ee241b60902653567503
Showing with 34 additions and 2 deletions.
  1. +1 −1 src/manipulation.js
  2. +1 −0 test/data/inner_nomodule.js
  3. +1 −0 test/data/nomodule.js
  4. +31 −1 test/unit/manipulation.js
@@ -198,7 +198,7 @@ function domManip( collection, args, callback, ignored ) {
if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {

// Optional AJAX dependency, but won't run scripts if not present
if ( jQuery._evalUrl ) {
if ( jQuery._evalUrl && !node.noModule ) {
jQuery._evalUrl( node.src );
}
} else {
@@ -0,0 +1 @@
window.ok( !QUnit.moduleTypeSupported, "evaluated: inner nomodule script with src" );
@@ -0,0 +1 @@
window.ok( !QUnit.moduleTypeSupported, "evaluated: nomodule script with src" );
@@ -1798,7 +1798,7 @@ QUnit.test( "html(Function)", function( assert ) {
} );

QUnit[
// Support: Edge 16-17
// Support: Edge 16-18+
// Edge sometimes doesn't execute module scripts so skip the test there.
( QUnit.moduleTypeSupported && !/edge\//i.test( navigator.userAgent ) ) ?
"test" :
@@ -1825,6 +1825,36 @@ QUnit[
}, 1000 );
} );

QUnit[
// Support: IE 9-11 only, Android 4.0-4.4 only, iOS 7-10 only
// `nomodule` scripts should be executed by legacy browsers only.
// iOS 10 supports `<script type="module">` but doesn't support the nomodule attribute
// so let's skip it here; sites supporting it must handle `nomodule` in a custom way anyway.
!/iphone os 10_/i.test( navigator.userAgent ) ?
"test" :
"skip"
]( "html(script nomodule)", function( assert ) {
assert.expect( QUnit.moduleTypeSupported ? 0 : 4 );
var done = assert.async(),
$fixture = jQuery( "#qunit-fixture" );

$fixture.html(
[
"<script nomodule>ok( !QUnit.moduleTypeSupported, 'evaluated: nomodule script' );</script>",
"<script nomodule src='" + url( "nomodule.js" ) + "'></script>",
"<div>",
"<script nomodule>ok( !QUnit.moduleTypeSupported, 'evaluated: inner nomodule script' );</script>",
"<script nomodule src='" + url( "inner_nomodule.js" ) + "'></script>",
"</div>"
].join( "" )
);

// Allow asynchronous script execution to generate assertions
setTimeout( function() {
done();
}, 1000 );
} );

QUnit.test( "html(Function) with incoming value -- direct selection", function( assert ) {

assert.expect( 4 );

0 comments on commit e4de8b4

Please sign in to comment.
You can’t perform that action at this time.