From d343e6b9ed501052f1676694d5e53649c92e65a0 Mon Sep 17 00:00:00 2001 From: Richard Gibson Date: Sat, 8 Dec 2012 18:04:13 -0500 Subject: [PATCH] Fix #12904: Firefox defaultDisplay with body/iframe display:none. Report and solution by @maranomynet; test by @rwldrn. --- src/css.js | 64 ++++++++++++++++++++++-------------------------- test/unit/css.js | 48 +++++++++++++++++++++++------------- 2 files changed, 60 insertions(+), 52 deletions(-) diff --git a/src/css.js b/src/css.js index 334e31a92..c9a1ab433 100644 --- a/src/css.js +++ b/src/css.js @@ -1,4 +1,4 @@ -var curCSS, iframe, iframeDoc, +var curCSS, iframe, ralpha = /alpha\([^)]*\)/i, ropacity = /opacity\s*=\s*([^)]*)/, rposition = /^(top|right|bottom|left)$/, @@ -446,44 +446,38 @@ function getWidthOrHeight( elem, name, extra ) { // Try to determine the default display value of an element function css_defaultDisplay( nodeName ) { - if ( elemdisplay[ nodeName ] ) { - return elemdisplay[ nodeName ]; - } - - var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ), - display = elem.css("display"); - elem.remove(); - - // If the simple way fails, - // get element's real default display by attaching it to a temp iframe - if ( display === "none" || display === "" ) { - // Use the already-created iframe if possible - iframe = document.body.appendChild( - iframe || jQuery.extend( document.createElement("iframe"), { - frameBorder: 0, - width: 0, - height: 0 - }) - ); - - // Create a cacheable copy of the iframe document on first call. - // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML - // document to it; WebKit & Firefox won't allow reusing the iframe document. - if ( !iframeDoc || !iframe.createElement ) { - iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document; - iframeDoc.write(""); - iframeDoc.close(); + var elem, + doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + elem = jQuery( doc.createElement( nodeName ) ); + display = curCSS( elem.appendTo( doc.body )[0], "display" ); + elem.remove(); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + // Use the already-created iframe if possible + iframe = ( iframe || + jQuery("