Scorch the earth and retreat on readyState interactive! Close gh-907.

This commit is contained in:
Mike Sherov 2012-08-23 17:46:12 -04:00 committed by Dave Methvin
parent 10901f7d9f
commit a9c2a9bf61
6 changed files with 13 additions and 137 deletions

View File

@ -831,9 +831,9 @@ jQuery.ready.promise = function( obj ) {
readyList = jQuery.Deferred(); readyList = jQuery.Deferred();
// Catch cases where $(document).ready() is called after the browser event has already occurred. // Catch cases where $(document).ready() is called after the browser event has already occurred.
// IE10 and lower don't handle "interactive" properly... use a weak inference to detect it // we once tried to use readyState "interactive" here, but it caused issues like the one
// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
if ( document.attachEvent ? document.readyState === "complete" : document.readyState !== "loading" ) { if ( document.readyState === "complete" ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready // Handle it asynchronously to allow scripts the opportunity to delay ready
setTimeout( jQuery.ready, 1 ); setTimeout( jQuery.ready, 1 );

View File

@ -1,30 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Test case for jQuery ticket #10067</title>
<script type="text/javascript">
setTimeout(function() {
el = document.createElement("script");
el.type = "text/javascript";
el.onload = function() {
jQuery( document ).ready(function() {
window.parent.iframeCallback( jQuery('#container').length === 1 );
});
}
document.getElementsByTagName("head")[ 0 ].appendChild( el );
el.src = "../../../dist/jquery.js";
}, 1000 );
</script>
</head>
<body>
<!-- external resources that come before elements trick
oldIE into thinking the dom is ready, but it's not... -->
<script type="text/javascript" src="longLoadScript.php?sleep=1"></script>
<div id="container" style="height: 300px"></div>
<!-- long loading iframe -->
<iframe src="longLoad.php?sleep=15&return=false" style="width: 1px; height: 1px"></iframe>
</body>
</html>

View File

@ -1,6 +0,0 @@
<?php
sleep((int)$_GET['sleep']);
?>
<script type="text/javascript">
window.parent.parent.iframeCallback(<?php echo $_GET['return'];?>);
</script>

View File

@ -1,40 +0,0 @@
<?php
//try very hard to disable output buffering
//@ini_set("output_buffering", 0);
//@apache_setenv("no-gzip", 1);
//@ini_set("zlib.output_compression", 0);
ob_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Test case for jQuery ticket #12282</title>
</head>
<body>
<h1>TEST</h1>
<script type="text/javascript" src="../../../dist/jquery.js"></script>
<script type="text/javascript">
jQuery( document ).ready(function() {
window.parent.iframeCallback( jQuery('#container').length === 1 );
});
</script>
<?php
//send the top of the document without sending the bottom portion
echo str_repeat(" ", 1024 * 8), "\n";
ob_flush();
?>
<h2>Sleeping for 1 seconds (simulating server side process)</h2>
<?php
//sleep for a bit, simulating a server side process
sleep(1);
?>
<div id="container">ready</h2>
</body>
</html>

View File

@ -1,26 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Test case for jQuery ticket #10067</title>
<script type="text/javascript" src="../../../dist/jquery.js"></script>
</head>
<body>
<script type="text/javascript">
jQuery( document ).ready(function () {
window.parent.iframeCallback( jQuery('#container').length === 1 );
});
</script>
<!-- external resources that come before elements trick
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>
<div id="container" style="height: 300px"></div>
<!-- long loading iframe -->
<iframe src="longLoad.php?sleep=10&return=false" style="width: 1px; height: 1px"></iframe>
</body>
</html>

View File

@ -2882,39 +2882,17 @@ test("fixHooks extensions", function() {
jQuery.event.fixHooks.click = saved; jQuery.event.fixHooks.click = saved;
}); });
// async loaded tests expect jQuery to be loaded as a single file
// if we're not doing PHP concat, then we fall back to document.write
// which breaks order of execution on async loaded files
// also need PHP to make the incepted IFRAME hang
if ( hasPHP ) {
testIframeWithCallback( "jQuery.ready promise", "event/promiseReady.html", function( isOk ) { testIframeWithCallback( "jQuery.ready promise", "event/promiseReady.html", function( isOk ) {
expect(1); expect(1);
ok( isOk, "$.when( $.ready ) works" ); ok( isOk, "$.when( $.ready ) works" );
}); });
// need PHP here to make the incepted IFRAME hang
if ( hasPHP ) {
testIframeWithCallback( "jQuery.ready synchronous load with long loading subresources", "event/syncReady.html", function( isOk ) { testIframeWithCallback( "jQuery.ready synchronous load with long loading subresources", "event/syncReady.html", function( isOk ) {
expect(1); expect(1);
ok( isOk, "jQuery loaded synchronously fires ready when the DOM can truly be interacted with" ); ok( isOk, "jQuery loaded synchronously fires ready when the DOM can truly be interacted with" );
}); });
testIframeWithCallback( "jQuery.ready synchronous load with partially loaded page", "event/partialLoadReady.php", function( isOk ) {
expect(1);
ok( isOk, "jQuery loaded synchronously fires ready when the DOM can truly be interacted with" );
});
// allIE needs all subresources and full page to be loaded before it can gaurantee the document is truly ready to be interacted with
if( !document.attachEvent ) {
testIframeWithCallback( "jQuery.ready synchronous load with long loading iframe", "event/syncReadyLongLoad.html", function( isOk ) {
expect(1);
ok( isOk, "jQuery loaded synchronously fires ready before all sub-resources are loaded" );
});
testIframeWithCallback( "jQuery.ready asynchronous load with long loading iframe", "event/asyncReady.html", function( isOk ) {
expect(1);
ok( isOk, "jQuery loaded asynchronously fires ready before all sub-resources are loaded" );
});
}
} }
(function(){ (function(){