Ajax: Always use script injection in globalEval

Fixes #14757
Closes gh-1449
This commit is contained in:
Oleg Gaidarenko 2013-11-29 12:15:05 +04:00
parent e488d985cf
commit bbdfbb4ee8
6 changed files with 42 additions and 48 deletions

View File

@ -256,25 +256,10 @@ jQuery.extend({
// Evaluates a script in a global context // Evaluates a script in a global context
globalEval: function( code ) { globalEval: function( code ) {
var script, var script = document.createElement( "script" );
indirect = eval;
code = jQuery.trim( code );
if ( code ) {
// If the code includes a valid, prologue position
// strict mode pragma, execute code by injecting a
// script tag into the document.
if ( code.indexOf("use strict") === 1 ) {
script = document.createElement("script");
script.text = code; script.text = code;
document.head.appendChild( script ).parentNode.removeChild( script ); document.head.appendChild( script ).parentNode.removeChild( script );
} else {
// Otherwise, avoid the DOM node creation, insertion
// and removal by using an indirect global eval
indirect( code );
}
}
}, },
// Convert dashed to camelCase; used by the css and data modules // Convert dashed to camelCase; used by the css and data modules

View File

@ -17,7 +17,7 @@ jQuery( document ).ready(function () {
oldIE into thinking the dom is ready, but it's not... oldIE into thinking the dom is ready, but it's not...
leaving this check here for future trailblazers to attempt leaving this check here for future trailblazers to attempt
fixing this...--> 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> <div id="container" style="height: 300px"></div>
</body> </body>
</html> </html>

View File

@ -1433,15 +1433,7 @@ module( "ajax", {
jQuery.ajax({ jQuery.ajax({
url: "data/badjson.js", url: "data/badjson.js",
dataType: "script", dataType: "script",
throws: true, throws: true
// Global events get confused by the exception
global: false,
success: function() {
ok( false, "Success." );
},
error: function() {
ok( false, "Error." );
}
}); });
}); });

View File

@ -222,6 +222,19 @@ test( "globalEval with 'use strict'", function() {
equal( window.strictEvalTest, 1, "Test variable declarations are global (strict mode)" ); equal( window.strictEvalTest, 1, "Test variable declarations are global (strict mode)" );
}); });
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() { test("noConflict", function() {
expect(7); expect(7);

View File

@ -2194,28 +2194,32 @@ 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" ); 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() {
var onerror = window.onerror;
expect( 3 ); setTimeout(function() {
window.onerror = onerror;
throws(function() { start();
jQuery("#qunit-fixture").html("<script>undefined(); ok( false, 'Exception not thrown' );</script>"); }, 1000 );
ok( false, "Exception ignored" );
}, "Exception bubbled from inline script" ); window.onerror = function() {
ok( true, "Exception thrown" );
if ( jQuery.ajax ) { if ( jQuery.ajax ) {
var onerror = window.onerror;
window.onerror = function() { window.onerror = function() {
ok( true, "Exception thrown in remote script" ); ok( true, "Exception thrown in remote script" );
}; };
jQuery("#qunit-fixture").html("<script src='data/badcall.js'></script>"); jQuery( "#qunit-fixture" ).html( "<script src='data/badcall.js'></script>" );
ok( true, "Exception ignored" ); ok( true, "Exception ignored" );
window.onerror = onerror;
} else { } else {
ok( true, "No jQuery.ajax" ); ok( true, "No jQuery.ajax" );
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() { test( "checked state is cloned with clone()", function() {