diff options
author | jaubourg <j@ubourg.net> | 2011-05-13 17:43:32 +0200 |
---|---|---|
committer | jaubourg <j@ubourg.net> | 2011-05-13 17:43:53 +0200 |
commit | ceba855c010c792aad8fc15edc06b86285f71142 (patch) | |
tree | c72dbe6543fa3e081c399ea5df8652838dce76f6 | |
parent | b60c8560cedacce6c82504f15e9bb54c2b3af59f (diff) | |
download | jquery-ceba855c010c792aad8fc15edc06b86285f71142.tar.gz jquery-ceba855c010c792aad8fc15edc06b86285f71142.zip |
Fixes #9239. If the body is already present in the DOM, use a div within it to perform boxModel-related support tests. Unit test added.
-rw-r--r-- | src/support.js | 32 | ||||
-rw-r--r-- | test/unit/support.js | 23 |
2 files changed, 45 insertions, 10 deletions
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 + }); + } + 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/ 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" ); +}); |