aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjaubourg <j@ubourg.net>2011-05-13 17:43:32 +0200
committerjaubourg <j@ubourg.net>2011-05-13 17:43:53 +0200
commitceba855c010c792aad8fc15edc06b86285f71142 (patch)
treec72dbe6543fa3e081c399ea5df8652838dce76f6
parentb60c8560cedacce6c82504f15e9bb54c2b3af59f (diff)
downloadjquery-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.js32
-rw-r--r--test/unit/support.js23
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" );
+});