mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
Ajax: Always use script injection in globalEval
Fixes #14757
Ref bbdfbb4ee8
This commit is contained in:
parent
76294e1e9e
commit
37f0f7f42c
21
src/core.js
21
src/core.js
@ -275,17 +275,18 @@ jQuery.extend({
|
||||
},
|
||||
|
||||
// Evaluates a script in a global context
|
||||
// Workarounds based on findings by Jim Driscoll
|
||||
// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
|
||||
globalEval: function( data ) {
|
||||
if ( data && jQuery.trim( data ) ) {
|
||||
// We use execScript on Internet Explorer
|
||||
// We use an anonymous function so that context is window
|
||||
// rather than jQuery in Firefox
|
||||
( window.execScript || function( data ) {
|
||||
window[ "eval" ].call( window, data );
|
||||
} )( data );
|
||||
}
|
||||
// Inspired by code by Andrea Giammarchi
|
||||
// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
|
||||
var head = document.head || jQuery( "head" )[ 0 ] || document.documentElement,
|
||||
script = document.createElement( "script" );
|
||||
|
||||
script.text = data;
|
||||
|
||||
// Support: IE6
|
||||
// Circumvent bugs with base elements (#2709 and #4378) by prepending
|
||||
head.insertBefore( script, head.firstChild );
|
||||
head.removeChild( script );
|
||||
},
|
||||
|
||||
// Convert dashed to camelCase; used by the css and data modules
|
||||
|
@ -8,7 +8,7 @@
|
||||
<body>
|
||||
|
||||
<script type="text/javascript">
|
||||
jQuery( document ).ready(function () {
|
||||
jQuery( document ).ready(function() {
|
||||
window.parent.iframeCallback( jQuery('#container').length === 1 );
|
||||
});
|
||||
</script>
|
||||
@ -17,7 +17,7 @@ jQuery( document ).ready(function () {
|
||||
oldIE into thinking the dom is ready, but it's not...
|
||||
leaving this check here for future trailblazers to attempt
|
||||
fixing this...-->
|
||||
<script type="text/javascript" src="longLoadScript.php?sleep=1"></script>
|
||||
<script type="text/javascript" src="../longLoadScript.php?sleep=1"></script>
|
||||
<div id="container" style="height: 300px"></div>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1468,24 +1468,18 @@ module( "ajax", {
|
||||
}
|
||||
});
|
||||
|
||||
test( "#11743 - jQuery.ajax() - script, throws exception", 1, function() {
|
||||
throws(function() {
|
||||
jQuery.ajax({
|
||||
url: "data/badjson.js",
|
||||
dataType: "script",
|
||||
"throws": true,
|
||||
// TODO find a way to test this asynchronously, too
|
||||
async: false,
|
||||
// Global events get confused by the exception
|
||||
global: false,
|
||||
success: function() {
|
||||
ok( false, "Success." );
|
||||
},
|
||||
error: function() {
|
||||
ok( false, "Error." );
|
||||
}
|
||||
});
|
||||
}, "exception bubbled" );
|
||||
asyncTest( "#11743 - jQuery.ajax() - script, throws exception", 1, function() {
|
||||
var onerror = window.onerror;
|
||||
window.onerror = function() {
|
||||
ok( true, "Exception thrown" );
|
||||
window.onerror = onerror;
|
||||
start();
|
||||
};
|
||||
jQuery.ajax({
|
||||
url: "data/badjson.js",
|
||||
dataType: "script",
|
||||
"throws": true
|
||||
});
|
||||
});
|
||||
|
||||
jQuery.each( [ "method", "type" ], function( _, globalOption ) {
|
||||
|
@ -214,6 +214,19 @@ test( "globalEval", function() {
|
||||
equal( window.globalEvalTest, 3, "Test context (this) is the window object" );
|
||||
});
|
||||
|
||||
test( "globalEval execution after script injection (#7862)", 1, function() {
|
||||
var now,
|
||||
script = document.createElement( "script" );
|
||||
|
||||
script.src = "data/longLoadScript.php?sleep=2";
|
||||
|
||||
now = jQuery.now();
|
||||
document.body.appendChild( script );
|
||||
|
||||
jQuery.globalEval( "var strictEvalTest = " + jQuery.now() + ";");
|
||||
ok( window.strictEvalTest - now < 500, "Code executed synchronously" );
|
||||
});
|
||||
|
||||
test("noConflict", function() {
|
||||
expect(7);
|
||||
|
||||
|
@ -2263,23 +2263,33 @@ test( "Ensure oldIE creates a new set on appendTo (#8894)", function() {
|
||||
strictEqual( jQuery("<p/>").appendTo("<div/>").end().length, jQuery("<p>test</p>").appendTo("<div/>").end().length, "Elements created with createElement and with createDocumentFragment should be treated alike" );
|
||||
});
|
||||
|
||||
test( "html() - script exceptions bubble (#11743)", function() {
|
||||
asyncTest( "html() - script exceptions bubble (#11743)", 2, function() {
|
||||
|
||||
expect( 2 );
|
||||
var onerror = window.onerror;
|
||||
|
||||
throws(function() {
|
||||
jQuery("#qunit-fixture").html("<script>undefined(); ok( false, 'Exception not thrown' );</script>");
|
||||
ok( false, "Exception ignored" );
|
||||
}, "Exception bubbled from inline script" );
|
||||
setTimeout(function() {
|
||||
window.onerror = onerror;
|
||||
|
||||
if ( jQuery.ajax ) {
|
||||
throws(function() {
|
||||
jQuery("#qunit-fixture").html("<script src='data/badcall.js'></script>");
|
||||
ok( false, "Exception ignored" );
|
||||
}, "Exception thrown in remote script" );
|
||||
} else {
|
||||
ok( true, "No jQuery.ajax" );
|
||||
}
|
||||
start();
|
||||
}, 1000 );
|
||||
|
||||
window.onerror = function() {
|
||||
ok( true, "Exception thrown" );
|
||||
|
||||
if ( jQuery.ajax ) {
|
||||
window.onerror = function() {
|
||||
ok( true, "Exception thrown in remote script" );
|
||||
};
|
||||
|
||||
jQuery( "#qunit-fixture" ).html( "<script src='data/badcall.js'></script>" );
|
||||
ok( true, "Exception ignored" );
|
||||
} else {
|
||||
ok( true, "No jQuery.ajax" );
|
||||
ok( true, "No jQuery.ajax" );
|
||||
}
|
||||
};
|
||||
|
||||
jQuery( "#qunit-fixture" ).html( "<script>undefined();</script>" );
|
||||
});
|
||||
|
||||
test( "checked state is cloned with clone()", function() {
|
||||
|
Loading…
Reference in New Issue
Block a user