From f3db084f7cc73379b0d6f5341c987e2a801ea032 Mon Sep 17 00:00:00 2001 From: Oleg Date: Fri, 1 Feb 2013 17:22:08 +0400 Subject: [PATCH] Fix #13310. Get the right display value for disconnected nodes. Close gh-1156. --- src/css.js | 17 +++++++++++++---- test/data/testsuite.css | 2 ++ test/index.html | 1 + test/unit/css.js | 23 +++++++++++++++++++++++ 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/css.js b/src/css.js index 9cd38b287..e8edd9f73 100644 --- a/src/css.js +++ b/src/css.js @@ -54,7 +54,7 @@ function getStyles( elem ) { } function showHide( elements, show ) { - var elem, + var display, elem, hidden, values = [], index = 0, length = elements.length; @@ -64,11 +64,13 @@ function showHide( elements, show ) { if ( !elem.style ) { continue; } + values[ index ] = jQuery._data( elem, "olddisplay" ); + display = elem.style.display; if ( show ) { // Reset the inline display of this element to learn if it is // being hidden by cascaded rules or not - if ( !values[ index ] && elem.style.display === "none" ) { + if ( !values[ index ] && display === "none" ) { elem.style.display = ""; } @@ -78,8 +80,15 @@ function showHide( elements, show ) { if ( elem.style.display === "" && isHidden( elem ) ) { values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); } - } else if ( !values[ index ] && !isHidden( elem ) ) { - jQuery._data( elem, "olddisplay", jQuery.css( elem, "display" ) ); + } else { + + if ( !values[ index ] ) { + hidden = isHidden( elem ); + + if ( display && display !== "none" || !hidden ) { + jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) ); + } + } } } diff --git a/test/data/testsuite.css b/test/data/testsuite.css index 6bb3a5ded..1dfa7cd34 100644 --- a/test/data/testsuite.css +++ b/test/data/testsuite.css @@ -151,3 +151,5 @@ section { background:#f0f; display:block; } /* #11971 */ #foo { background: url(1x1.jpg) right bottom no-repeat; } + +#display { display: list-item !important; } diff --git a/test/index.html b/test/index.html index 918d7d2d7..f073054d8 100644 --- a/test/index.html +++ b/test/index.html @@ -318,6 +318,7 @@ Z
+ diff --git a/test/unit/css.js b/test/unit/css.js index 5ce12c73f..27069f8a3 100644 --- a/test/unit/css.js +++ b/test/unit/css.js @@ -970,4 +970,27 @@ asyncTest( "Clearing a Cloned Element's Style Shouldn't Clear the Original Eleme window.setTimeout( start, 1000 ); }); +asyncTest( "Make sure initialized display value for disconnected nodes is correct (#13310)", 4, function() { + var display = jQuery("#display").css("display"), + div = jQuery("
"); + + equal( div.css( "display", "inline" ).hide().show().appendTo("body").css( "display" ), "inline", "Initialized display value has returned" ); + div.remove(); + + div.css( "display", "none" ).hide(); + equal( jQuery._data( div[ 0 ], "olddisplay" ), undefined, "olddisplay is undefined after hiding a detached and hidden element" ); + div.remove(); + + div.css( "display", "inline-block" ).hide().appendTo("body").fadeIn(function() { + equal( div.css( "display" ), "inline-block", "Initialized display value has returned" ); + div.remove(); + + start(); + }); + + equal( jQuery._data( jQuery("#display").css( "display", "inline" ).hide()[ 0 ], "olddisplay" ), display, + "display: * !Important value should used as initialized display" ); + jQuery._removeData( jQuery("#display")[ 0 ] ); +}); + }