]> source.dussan.org Git - jquery.git/commitdiff
Fix #12723 and simplification and optmization of defaultDisplay helper
authorOleg <markelog@gmail.com>
Tue, 17 Sep 2013 12:06:21 +0000 (16:06 +0400)
committerOleg <markelog@gmail.com>
Tue, 17 Sep 2013 12:16:47 +0000 (16:16 +0400)
(cherry picked from commit a25343001eea2436dcf8ea60deea3844f77e42e4)

src/css/defaultDisplay.js
test/unit/css.js

index 7f54d207a3f817ce114f8809c6ad369414ddf4d2..518c7d8ae6abfa20e6e66299e88ff4bf0ccc4d27 100644 (file)
@@ -4,17 +4,28 @@ define([
 ], function( jQuery ) {
 
 var iframe,
-       elemdisplay = { BODY: "block" };
+       elemdisplay = {};
 
 /**
  * Retrieve the actual display of a element
  * @param {String} name nodeName of the element
  * @param {Object} doc Document object
  */
+// Called only from within defaultDisplay
 function actualDisplay( name, doc ) {
        var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
-               display = jQuery.css( elem[0], "display" );
-       elem.remove();
+
+               // getDefaultComputedStyle might be reliably used only on attached element
+               display = window.getDefaultComputedStyle ?
+
+                       // Use of this method is a temporary fix (more like optmization) until something better comes along,
+                       // since it was removed from specification and supported only in FF
+                       window.getDefaultComputedStyle( elem[ 0 ] ).display : jQuery.css( elem[ 0 ], "display" );
+
+       // We don't have any data stored on the element,
+       // so use "detach" method as fast way to get rid of the element
+       elem.detach();
+
        return display;
 }
 
@@ -31,15 +42,15 @@ function defaultDisplay( nodeName ) {
 
                // If the simple way fails, read from inside an iframe
                if ( display === "none" || !display ) {
+
                        // Use the already-created iframe if possible
-                       iframe = ( iframe ||
-                               jQuery("<iframe frameborder='0' width='0' height='0'/>")
-                               .css( "cssText", "display:block !important" )
-                       ).appendTo( doc.documentElement );
+                       iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
 
                        // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
-                       doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
-                       doc.write("<!doctype html><html><body>");
+                       doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;
+
+                       // Support: IE
+                       doc.write();
                        doc.close();
 
                        display = actualDisplay( nodeName, doc );
index 23e52aca75e28e7afff246d8b3ecc31466d1e219..b4446bec34f56fc85be12a7e09fc2dc0ee117d73 100644 (file)
@@ -583,21 +583,25 @@ test( "show() resolves correct default display for detached nodes", function(){
        span.remove();
 });
 
-test("show() resolves correct default display #10227", function() {
-       expect(2);
+test("show() resolves correct default display #10227", 4, function() {
+       var html = jQuery( document.documentElement ),
+               body = jQuery( "body" );
 
-       var body = jQuery("body");
-       body.append(
-               "<p id='ddisplay'>a<style>body{display:none}</style></p>"
-       );
+       body.append( "<p class='ddisplay'>a<style>body{display:none}</style></p>" );
 
-       equal( body.css("display"), "none", "Initial display: none" );
+       equal( body.css("display"), "none", "Initial display for body element: none" );
 
        body.show();
-       equal( body.css("display"), "block", "Correct display: block" );
+       equal( body.css("display"), "block", "Correct display for body element: block" );
+
+       body.append( "<p class='ddisplay'>a<style>html{display:none}</style></p>" );
+
+       equal( html.css("display"), "none", "Initial display for html element: none" );
+
+       html.show();
+       equal( html.css( "display" ), "block", "Correct display for html element: block" );
 
-       jQuery("#ddisplay").remove();
-       QUnit.expectJqData( body[0], "olddisplay" );
+       jQuery( ".ddisplay" ).remove();
 });
 
 test("show() resolves correct default display when iframe display:none #12904", function() {