]> source.dussan.org Git - jquery.git/commitdiff
Revert "Ajax: Always use script injection in globalEval"
authorOleg Gaidarenko <markelog@gmail.com>
Fri, 13 Nov 2015 16:48:45 +0000 (19:48 +0300)
committerOleg Gaidarenko <markelog@gmail.com>
Fri, 13 Nov 2015 17:04:54 +0000 (20:04 +0300)
This reverts commit bbdfbb4ee859fe9319b348d88120ddc2c9efbd63.

src/core.js
test/data/event/longLoadScript.php [new file with mode: 0644]
test/data/event/syncReady.html
test/data/longLoadScript.php [deleted file]
test/unit/ajax.js
test/unit/core.js
test/unit/manipulation.js

index 72f4de2a05c4c9913c1a8073da4af818c34ee044..d3c08c636adced8f709374ec99555f37a613351a 100644 (file)
@@ -262,12 +262,26 @@ jQuery.extend( {
        },
 
        // Evaluates a script in a global context
-       globalEval: function( code, context ) {
-               context = context || document;
-               var script = context.createElement( "script" );
-
-               script.text = code;
-               context.head.appendChild( script ).parentNode.removeChild( script );
+       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 );
+                       }
+               }
        },
 
        // Convert dashed to camelCase; used by the css and data modules
diff --git a/test/data/event/longLoadScript.php b/test/data/event/longLoadScript.php
new file mode 100644 (file)
index 0000000..ba47168
--- /dev/null
@@ -0,0 +1,4 @@
+<?php
+sleep((int)$_GET['sleep']);
+header('Content-type: text/javascript');
+?>
\ No newline at end of file
index dfa9ac33716d69a9488114ca655db9b6ca0b23e8..e0885707edab0acb6ea4853de1dabeda43c5bce3 100644 (file)
@@ -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>
diff --git a/test/data/longLoadScript.php b/test/data/longLoadScript.php
deleted file mode 100644 (file)
index ba47168..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?php
-sleep((int)$_GET['sleep']);
-header('Content-type: text/javascript');
-?>
\ No newline at end of file
index 5110a9795f36fdc2f2e07a0cb494024bd52bdccc..3d3bfb9aa80558268689f7f4691f7d269c3a62fe 100644 (file)
@@ -1624,9 +1624,17 @@ if ( typeof window.ArrayBuffer === "undefined" || typeof new XMLHttpRequest().re
                jQuery.ajax( {
                        url: "data/badjson.js",
                        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." );
+                       }
+               });
+       });
 
        jQuery.each( [ "method", "type" ], function( _, globalOption ) {
                function request( assert, option ) {
index 33a98cedcfd513265ebc6d75b0363c1bab9cbc1f..6aa2a3d63d67f6c0a8cbc2f4363071b849883c20 100644 (file)
@@ -170,21 +170,6 @@ QUnit.test( "globalEval with 'use strict'", function( assert ) {
        assert.equal( window.strictEvalTest, 1, "Test variable declarations are global (strict mode)" );
 } );
 
-QUnit.test( "globalEval execution after script injection (#7862)", function( assert ) {
-       assert.expect( 1 );
-
-       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() + ";" );
-       assert.ok( window.strictEvalTest - now < 500, "Code executed synchronously" );
-} );
-
 // This is not run in AMD mode
 if ( jQuery.noConflict ) {
        QUnit.test( "noConflict", function( assert ) {
index 2069ee5c50c8e7751f5513b40abcd222491cf3ec..e62eae16b268b28738a978c9b1c123dfcbe5408e 100644 (file)
@@ -2297,45 +2297,28 @@ QUnit.test( "Ensure oldIE creates a new set on appendTo (#8894)", function( asse
        assert.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" );
 } );
 
-QUnit.asyncTest( "html() - script exceptions bubble (#11743)", 2, function( assert ) {
+QUnit.test( "html() - script exceptions bubble (#11743)", function( assert ) {
+       assert.expect( 3 );
 
-       // Support: Android 2.3 only
-       // Android 2.3 doesn't fire the window.onerror handler, just accept the reality there.
-       if ( /android 2\.3/i.test( navigator.userAgent ) ) {
-               assert.ok( true, "Test skipped, Android 2.3 doesn't fire window.onerror for " +
-                       "errors in dynamically included scripts" );
-               assert.ok( true, "Test skipped, Android 2.3 doesn't fire window.onerror for " +
-                       "errors in dynamically included scripts" );
-               QUnit.start();
-               return;
-       }
+       assert.throws(function() {
+               jQuery("#qunit-fixture").html("<script>undefined(); ok( false, 'Exception not thrown' );</script>");
+               assert.ok( false, "Exception ignored" );
+       }, "Exception bubbled from inline script" );
 
-       var onerror = window.onerror;
+       if ( jQuery.ajax ) {
+               var onerror = window.onerror;
+               window.onerror = function() {
+                       ok( true, "Exception thrown in remote script" );
+               };
 
-       setTimeout( function() {
+               jQuery("#qunit-fixture").html("<script src='data/badcall.js'></script>");
+               assert.ok( true, "Exception ignored" );
                window.onerror = onerror;
-
-               QUnit.start();
-       }, 1000 );
-
-       window.onerror = function() {
-               assert.ok( true, "Exception thrown" );
-
-               if ( jQuery.ajax ) {
-                       window.onerror = function() {
-                               assert.ok( true, "Exception thrown in remote script" );
-                       };
-
-                       jQuery( "#qunit-fixture" ).html( "<script src='data/badcall.js'></script>" );
-                       assert.ok( true, "Exception ignored" );
-               } else {
-                       assert.ok( true, "No jQuery.ajax" );
-                       assert.ok( true, "No jQuery.ajax" );
-               }
-       };
-
-       jQuery( "#qunit-fixture" ).html( "<script>undefined();</script>" );
-} );
+       } else {
+               assert.ok( true, "No jQuery.ajax" );
+               assert.ok( true, "No jQuery.ajax" );
+       }
+});
 
 QUnit.test( "checked state is cloned with clone()", function( assert ) {