aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimmy Willison <timmywillisn@gmail.com>2015-11-06 18:36:38 -0500
committerTimmy Willison <timmywillisn@gmail.com>2015-11-09 14:14:30 -0500
commit22449eb968622c2e14d6c8d8de2cf1e1ba4adccd (patch)
treea10fbbc33d0eb7799b67f1b441459a3e59419da2
parent67fa2eab6ef323b1d894e9e7f054c6e8c844d304 (diff)
downloadjquery-22449eb968622c2e14d6c8d8de2cf1e1ba4adccd.tar.gz
jquery-22449eb968622c2e14d6c8d8de2cf1e1ba4adccd.zip
Manipulation: execute scripts from iframe in the iframe's context
Fixes gh-1757 Close gh-2696
-rw-r--r--src/core.js7
-rw-r--r--src/manipulation.js2
-rw-r--r--test/data/manipulation/scripts-context.html18
-rw-r--r--test/unit/manipulation.js11
4 files changed, 34 insertions, 4 deletions
diff --git a/src/core.js b/src/core.js
index 8e43547ac..9095213eb 100644
--- a/src/core.js
+++ b/src/core.js
@@ -258,11 +258,12 @@ jQuery.extend( {
},
// Evaluates a script in a global context
- globalEval: function( code ) {
- var script = document.createElement( "script" );
+ globalEval: function( code, context ) {
+ context = context || document;
+ var script = context.createElement( "script" );
script.text = code;
- document.head.appendChild( script ).parentNode.removeChild( script );
+ context.head.appendChild( script ).parentNode.removeChild( script );
},
// Convert dashed to camelCase; used by the css and data modules
diff --git a/src/manipulation.js b/src/manipulation.js
index ceb970cbd..eaf2e0998 100644
--- a/src/manipulation.js
+++ b/src/manipulation.js
@@ -192,7 +192,7 @@ function domManip( collection, args, callback, ignored ) {
jQuery._evalUrl( node.src );
}
} else {
- jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
+ jQuery.globalEval( node.textContent.replace( rcleanScript, "" ), doc );
}
}
}
diff --git a/test/data/manipulation/scripts-context.html b/test/data/manipulation/scripts-context.html
new file mode 100644
index 000000000..6958453c5
--- /dev/null
+++ b/test/data/manipulation/scripts-context.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset=utf-8 />
+ <title>body</title>
+ </head>
+ <body>
+ <div id="qunit-fixture"></div>
+ <script src="../../jquery.js"></script>
+ <script>
+ window.parent.iframeCallback(
+ window,
+ document.body,
+ "<script>window.scriptTest = true;<\x2fscript>"
+ );
+ </script>
+ </body>
+</html>
diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js
index 37da12062..a56956fa1 100644
--- a/test/unit/manipulation.js
+++ b/test/unit/manipulation.js
@@ -2162,6 +2162,17 @@ testIframeWithCallback(
}
);
+testIframeWithCallback(
+ "domManip executes scripts in iframes in the iframes' context",
+ "manipulation/scripts-context.html",
+ function( frameWindow, bodyElement, html, assert ) {
+ assert.expect( 2 );
+ jQuery( bodyElement ).append( html );
+ assert.ok( !window.scriptTest, "script executed in iframe context" );
+ assert.ok( frameWindow.scriptTest, "script executed in iframe context" );
+ }
+);
+
QUnit.test( "jQuery.clone - no exceptions for object elements #9587", function( assert ) {
assert.expect( 1 );