aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core.js7
-rw-r--r--src/manipulation.js2
-rw-r--r--src/manipulation/_evalUrl.js4
-rw-r--r--test/data/core/globaleval-context.html15
-rw-r--r--test/data/manipulation/set-global-scripttest.js2
-rw-r--r--test/data/testinit.js20
-rw-r--r--test/unit/core.js13
-rw-r--r--test/unit/manipulation.js21
8 files changed, 74 insertions, 10 deletions
diff --git a/src/core.js b/src/core.js
index 7ea77c4f0..0baffb6bc 100644
--- a/src/core.js
+++ b/src/core.js
@@ -231,9 +231,10 @@ jQuery.extend( {
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 ) {
diff --git a/src/manipulation.js b/src/manipulation.js
index 7140748ed..08b17a5bb 100644
--- a/src/manipulation.js
+++ b/src/manipulation.js
@@ -163,7 +163,7 @@ function domManip( collection, args, callback, ignored ) {
if ( jQuery._evalUrl && !node.noModule ) {
jQuery._evalUrl( node.src, {
nonce: node.nonce || node.getAttribute( "nonce" )
- } );
+ }, doc );
}
} else {
DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
diff --git a/src/manipulation/_evalUrl.js b/src/manipulation/_evalUrl.js
index 54133fc9b..f88b747cc 100644
--- a/src/manipulation/_evalUrl.js
+++ b/src/manipulation/_evalUrl.js
@@ -1,6 +1,6 @@
import jQuery from "../ajax.js";
-jQuery._evalUrl = function( url, options ) {
+jQuery._evalUrl = function( url, options, doc ) {
return jQuery.ajax( {
url: url,
@@ -18,7 +18,7 @@ jQuery._evalUrl = function( url, options ) {
"text script": function() {}
},
dataFilter: function( response ) {
- jQuery.globalEval( response, options );
+ jQuery.globalEval( response, options, doc );
}
} );
};
diff --git a/test/data/core/globaleval-context.html b/test/data/core/globaleval-context.html
new file mode 100644
index 000000000..1b75e3a0a
--- /dev/null
+++ b/test/data/core/globaleval-context.html
@@ -0,0 +1,15 @@
+<!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>
diff --git a/test/data/manipulation/set-global-scripttest.js b/test/data/manipulation/set-global-scripttest.js
new file mode 100644
index 000000000..7fdbf9d72
--- /dev/null
+++ b/test/data/manipulation/set-global-scripttest.js
@@ -0,0 +1,2 @@
+window.scriptTest = true;
+parent.finishTest();
diff --git a/test/data/testinit.js b/test/data/testinit.js
index 61ffcbc8f..29a8a9f9a 100644
--- a/test/data/testinit.js
+++ b/test/data/testinit.js
@@ -254,12 +254,24 @@ this.testIframe = function( title, fileName, func, wrapper ) {
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();
+ }
} );
};
diff --git a/test/unit/core.js b/test/unit/core.js
index bc5d2fc25..9ea4702b3 100644
--- a/test/unit/core.js
+++ b/test/unit/core.js
@@ -197,6 +197,19 @@ QUnit.test( "globalEval execution after script injection (#7862)", function( ass
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 );
diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js
index b71a54799..b347fe59c 100644
--- a/test/unit/manipulation.js
+++ b/test/unit/manipulation.js
@@ -2274,6 +2274,27 @@ testIframe(
}
);
+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 );