Fixes #13714. jQuery.globalEval gotcha w/ strings that contain valid, prologue position strict mode pragma

Signed-off-by: Rick Waldron <waldron.rick@gmail.com>
This commit is contained in:
Rick Waldron 2013-04-03 11:26:07 -04:00
parent 05d55d08e7
commit feea9394b7
2 changed files with 27 additions and 4 deletions

View File

@ -515,10 +515,25 @@ jQuery.extend({
noop: function() {},
// Evaluates a script in a global context
globalEval: function( data ) {
var indirect = eval;
if ( jQuery.trim( data ) ) {
indirect( data + ";" );
globalEval: function( code ) {
var 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;
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 );
}
}
},

View File

@ -215,6 +215,14 @@ test( "globalEval", function() {
equal( window.globalEvalTest, 3, "Test context (this) is the window object" );
});
test( "globalEval with 'use strict'", function() {
expect( 1 );
Globals.register("strictEvalTest");
jQuery.globalEval("'use strict'; var strictEvalTest = 1;");
equal( window.strictEvalTest, 1, "Test variable declarations are global (strict mode)" );
});
test("noConflict", function() {
expect(7);