]> source.dussan.org Git - jquery.git/commitdiff
Fixes #9239. If the body is already present in the DOM, use a div within it to perfor...
authorjaubourg <j@ubourg.net>
Fri, 13 May 2011 15:43:32 +0000 (17:43 +0200)
committerjaubourg <j@ubourg.net>
Fri, 13 May 2011 15:43:53 +0000 (17:43 +0200)
src/support.js
test/unit/support.js

index 9ffad2803115fccce45bc311dc47ebd84e1e0613..4420b7fcac8bcb68bdb68d42be2b59574abf9cf7 100644 (file)
@@ -13,7 +13,9 @@ jQuery.support = (function() {
                support,
                fragment,
                body,
-               bodyStyle,
+               testElementParent,
+               testElement,
+               testElementStyle,
                tds,
                events,
                eventName,
@@ -136,9 +138,11 @@ jQuery.support = (function() {
        // Figure out if the W3C box model works as expected
        div.style.width = div.style.paddingLeft = "1px";
 
-       // We use our own, invisible, body
-       body = document.createElement( "body" );
-       bodyStyle = {
+       body = document.getElementsByTagName( "body" )[ 0 ];
+       // We use our own, invisible, body unless the body is already present
+       // in which case we use a div (#9239)
+       testElement = document.createElement( body ? "div" : "body" );
+       testElementStyle = {
                visibility: "hidden",
                width: 0,
                height: 0,
@@ -147,11 +151,19 @@ jQuery.support = (function() {
                // Set background to avoid IE crashes when removing (#9028)
                background: "none"
        };
-       for ( i in bodyStyle ) {
-               body.style[ i ] = bodyStyle[ i ];
+       if ( body ) {
+               jQuery.extend( testElementStyle, {
+                       position: "absolute",
+                       left: -1000,
+                       top: -1000
+               });
+       }
+       for ( i in testElementStyle ) {
+               testElement.style[ i ] = testElementStyle[ i ];
        }
-       body.appendChild( div );
-       documentElement.insertBefore( body, documentElement.firstChild );
+       testElement.appendChild( div );
+       testElementParent = body || documentElement;
+       testElementParent.insertBefore( testElement, testElementParent.firstChild );
 
        // Check if a disconnected checkbox will retain its checked
        // value of true after appended to the DOM (IE6/7)
@@ -210,8 +222,8 @@ jQuery.support = (function() {
        }
 
        // Remove the body element we added
-       body.innerHTML = "";
-       documentElement.removeChild( body );
+       testElement.innerHTML = "";
+       testElementParent.removeChild( testElement );
 
        // Technique from Juriy Zaytsev
        // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
index 9d99529a14327b76955311d61bd895689b309e61..36dc3553e3ab39ac978bffc7cd106f576aeb122f 100644 (file)
@@ -30,3 +30,26 @@ function supportIFrameTest( title, url, noDisplay, func ) {
 supportIFrameTest( "proper boxModel in compatMode CSS1Compat (IE6 and IE7)", "boxModelIE", function( compatMode, boxModel ) {
        ok( compatMode !== "CSS1Compat" || boxModel, "boxModel properly detected" );
 });
+
+supportIFrameTest( "body background is not lost if set prior to loading jQuery (#9238)", "bodyBackground", function( color, support ) {
+       expect( 2 );
+       var okValue = {
+                       "#000000": true,
+                       "rgb(0, 0, 0)": true
+       };
+       ok( okValue[ color ], "color was not reset (" + color + ")" );
+       var i, passed = true;
+       for ( i in jQuery.support ) {
+               if ( jQuery.support[ i ] !== support[ i ] ) {
+                       passed = false;
+                       strictEquals( jQuery.support[ i ], support[ i ], "Support property " + i + " is different" );
+               }
+       }
+       for ( i in support ) {
+               if ( !( i in jQuery.support ) ) {
+                       ok = false;
+                       strictEquals( src[ i ], dest[ i ], "Unexpected property: " + i );
+               }
+       }
+       ok( passed, "Same support properties" );
+});