diff --git a/src/support.js b/src/support.js index 9ffad2803..4420b7fca 100644 --- a/src/support.js +++ b/src/support.js @@ -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 + }); } - body.appendChild( div ); - documentElement.insertBefore( body, documentElement.firstChild ); + for ( i in testElementStyle ) { + testElement.style[ i ] = testElementStyle[ i ]; + } + 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/ diff --git a/test/unit/support.js b/test/unit/support.js index 9d99529a1..36dc3553e 100644 --- a/test/unit/support.js +++ b/test/unit/support.js @@ -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" ); +});