From f3c6077da02f080f09d73ec4d8a8029f76654c2b Mon Sep 17 00:00:00 2001 From: jaubourg Date: Thu, 7 Apr 2011 06:47:15 +0200 Subject: [PATCH] Rewrite of globalEval. Uses window.execScript or window.eval with a trick to ensure proper context. Unit tests added. --- src/core.js | 27 ++++++++++----------------- test/unit/core.js | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/core.js b/src/core.js index a893fc9b..7f63012a 100644 --- a/src/core.js +++ b/src/core.js @@ -561,24 +561,17 @@ jQuery.extend({ noop: function() {}, - // Evalulates a script in a global context + // 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 && rnotwhite.test(data) ) { - // Inspired by code by Andrea Giammarchi - // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html - var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement, - script = document.createElement( "script" ); - - if ( jQuery.support.scriptEval() ) { - script.appendChild( document.createTextNode( data ) ); - } else { - script.text = data; - } - - // Use insertBefore instead of appendChild to circumvent an IE6 bug. - // This arises when a base node is used (#2709). - head.insertBefore( script, head.firstChild ); - head.removeChild( script ); + if ( data && rnotwhite.test( 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 ); } }, diff --git a/test/unit/core.js b/test/unit/core.js index 03325ab7..79710025 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -172,6 +172,26 @@ test("selector state", function() { ); }); +test( "globalEval", function() { + + expect( 3 ); + + jQuery.globalEval( "var globalEvalTest = true;" ); + ok( window.globalEvalTest, "Test variable declarations are global" ); + + window.globalEvalTest = false; + + jQuery.globalEval( "globalEvalTest = true;" ); + ok( window.globalEvalTest, "Test variable assignments are global" ); + + window.globalEvalTest = false; + + jQuery.globalEval( "this.globalEvalTest = true;" ); + ok( window.globalEvalTest, "Test context (this) is the window object" ); + + window.globalEvalTest = undefined; +}); + if ( !isLocal ) { test("browser", function() { stop();