mirror of
https://github.com/jquery/jquery.git
synced 2025-01-10 18:24:24 +00:00
Ajax: Always use script injection in globalEval
Fixes #14757 Closes gh-1449
This commit is contained in:
parent
e488d985cf
commit
bbdfbb4ee8
17
src/core.js
17
src/core.js
@ -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
|
||||||
|
@ -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>
|
||||||
|
@ -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." );
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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() {
|
||||||
|
Loading…
Reference in New Issue
Block a user