1. Support passing custom document to jQuery.globalEval; the script will be
invoked in the context of this document.
2. Fire external scripts appended to iframe contents in that iframe context;
this was already supported & tested for inline scripts but not for external
ones.
Fixes gh-4518
Closes gh-4601
(cherry picked from commit
4592595b478be979141ce35c693dbc6b65647173)
return true;
},
- // Evaluates a script in a global context
- globalEval: function( code, options ) {
- DOMEval( code, { nonce: options && options.nonce } );
+ // Evaluates a script in a provided context; falls back to the global one
+ // if not specified.
+ globalEval: function( code, options, doc ) {
+ DOMEval( code, { nonce: options && options.nonce }, doc );
},
each: function( obj, callback ) {
if ( jQuery._evalUrl && !node.noModule ) {
jQuery._evalUrl( node.src, {
nonce: node.nonce || node.getAttribute( "nonce" )
- } );
+ }, doc );
}
} else {
DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
"use strict";
-jQuery._evalUrl = function( url, options ) {
+jQuery._evalUrl = function( url, options, doc ) {
return jQuery.ajax( {
url: url,
"text script": function() {}
},
dataFilter: function( response ) {
- jQuery.globalEval( response, options );
+ jQuery.globalEval( response, options, doc );
}
} );
};
--- /dev/null
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset=utf-8 />
+ <title>body</title>
+ </head>
+ <body>
+ <div id="qunit-fixture"></div>
+ <script src="../../jquery.js"></script>
+ <script src="../iframeTest.js"></script>
+ <script>
+ startIframeTest();
+ </script>
+ </body>
+</html>
--- /dev/null
+window.scriptTest = true;
+parent.finishTest();
args.unshift( assert );
setTimeout( function() {
+ var result;
+
this.iframeCallback = undefined;
- func.apply( this, args );
- func = function() {};
- $iframe.remove();
- done();
+ result = func.apply( this, args );
+
+ function finish() {
+ func = function() {};
+ $iframe.remove();
+ done();
+ }
+
+ // Wait for promises returned by `func`.
+ if ( result && result.then ) {
+ result.then( finish );
+ } else {
+ finish();
+ }
} );
};
assert.ok( window.strictEvalTest - now < 500, "Code executed synchronously" );
} );
+testIframe(
+ "globalEval with custom document context",
+ "core/globaleval-context.html",
+ function( assert, framejQuery, frameWindow, frameDocument ) {
+ assert.expect( 2 );
+
+ jQuery.globalEval( "window.scriptTest = true;", {}, frameDocument );
+ assert.ok( !window.scriptTest, "script executed in iframe context" );
+ assert.ok( frameWindow.scriptTest, "script executed in iframe context" );
+ }
+);
+
+
QUnit.test( "noConflict", function( assert ) {
assert.expect( 7 );
}
);
+testIframe(
+ "domManip executes external scripts in iframes in the iframes' context",
+ "manipulation/scripts-context.html",
+ function( assert, framejQuery, frameWindow, frameDocument ) {
+ assert.expect( 2 );
+
+ Globals.register( "finishTest" );
+
+ return new Promise( function( resolve ) {
+ window.finishTest = resolve;
+ jQuery( frameDocument.body ).append(
+ "<script src='" + url( "manipulation/set-global-scripttest.js" ) + "'></script>" );
+ assert.ok( !window.scriptTest, "script executed in iframe context" );
+ assert.ok( frameWindow.scriptTest, "script executed in iframe context" );
+ } );
+ },
+
+ // The AJAX module is needed for jQuery._evalUrl.
+ QUnit[ jQuery.ajax ? "test" : "skip" ]
+);
+
QUnit.test( "jQuery.clone - no exceptions for object elements #9587", function( assert ) {
assert.expect( 1 );