Fix #11767. Modularize build and unit tests for exluding effects.

Closes gh-785. To build a version of jQuery without effects, use `grunt build:*:*:-effects`. The unit tests feature-check for the interfaces and skip the unit tests for effects if they don't detect it.
This commit is contained in:
Richard Gibson 2012-05-28 22:25:04 -04:00 committed by Dave Methvin
parent 82d4c72fb1
commit 7f2cc46955
9 changed files with 435 additions and 321 deletions

1
.gitignore vendored
View File

@ -7,6 +7,5 @@ dist
*.patch *.patch
/*.html /*.html
.DS_Store .DS_Store
dist/.sizecache.json
build/.sizecache.json build/.sizecache.json
node_modules node_modules

View File

@ -50,7 +50,7 @@ module.exports = function( grunt ) {
"src/ajax/jsonp.js", "src/ajax/jsonp.js",
"src/ajax/script.js", "src/ajax/script.js",
"src/ajax/xhr.js", "src/ajax/xhr.js",
"src/effects.js", { flag: "effects", src: "src/effects.js" },
"src/offset.js", "src/offset.js",
"src/dimensions.js", "src/dimensions.js",
"src/exports.js", "src/exports.js",
@ -103,7 +103,7 @@ module.exports = function( grunt ) {
}); });
// Default grunt. // Default grunt.
grunt.registerTask( "default", "selector build lint min compare_size" ); grunt.registerTask( "default", "selector build:*:* lint min compare_size" );
grunt.loadNpmTasks("grunt-compare-size"); grunt.loadNpmTasks("grunt-compare-size");
@ -159,29 +159,48 @@ module.exports = function( grunt ) {
// Special concat/build task to handle various jQuery build requirements // Special concat/build task to handle various jQuery build requirements
grunt.registerMultiTask( "build", "Concatenate source, embed date/version", function() { grunt.registerMultiTask(
// Concat specified files. "build",
var compiled = "", "Concatenate source (include/exclude modules with +/- flags), embed date/version",
name = this.file.dest; function() {
// Concat specified files.
var compiled = "",
modules = this.flags,
optIn = !modules["*"],
name = this.file.dest;
this.file.src.forEach(function( filepath ) { this.file.src.forEach(function( filepath ) {
compiled += file.read( filepath ).replace( /.function..jQuery...\{/g, "" ).replace( /\}...jQuery..;/g, "" ); // Include optional modules per build flags; exclusion trumps inclusion
var flag = filepath.flag;
if ( flag ) {
if ( modules[ "-" + flag ] ||
optIn && !modules[ flag ] && !modules[ "+" + flag ] ) {
log.writeln( "Excluding " + filepath.flag + ": '" + filepath.src + "'." );
return;
}
log.writeln( "Including " + filepath.flag + ": '" + filepath.src + "'." );
filepath = filepath.src;
}
// Unwrap redundant IIFEs
compiled += file.read( filepath ).replace( /^\(function\( jQuery \) \{|\}\)\( jQuery \);\s*$/g, "" );
});
// Embed Date
// Embed Version
compiled = compiled.replace( "@DATE", new Date() )
.replace( "@VERSION", config("pkg.version") );
// Write concatenated source to file
file.write( name, compiled );
// Fail task if errors were logged.
if ( this.errorCount ) {
return false;
}
// Otherwise, print a success message.
log.writeln( "File '" + name + "' created." );
}); });
// Embed Date
// Embed Version
compiled = compiled.replace( "@DATE", new Date() )
.replace( "@VERSION", config("pkg.version") );
// Write concatenated source to file
file.write( name, compiled );
// Fail task if errors were logged.
if ( this.errorCount ) {
return false;
}
// Otherwise, print a success message.
log.writeln( "File '" + name + "' created." );
});
}; };

View File

@ -3,7 +3,8 @@
// order is important! // order is important!
jQuery.cssExpand = [ "Top", "Right", "Bottom", "Left" ]; jQuery.cssExpand = [ "Top", "Right", "Bottom", "Left" ];
var ralpha = /alpha\([^)]*\)/i, var curCSS, iframe, iframeDoc,
ralpha = /alpha\([^)]*\)/i,
ropacity = /opacity=([^)]*)/, ropacity = /opacity=([^)]*)/,
// fixed for IE9, see #8346 // fixed for IE9, see #8346
rupper = /([A-Z]|^ms)/g, rupper = /([A-Z]|^ms)/g,
@ -11,14 +12,14 @@ var ralpha = /alpha\([^)]*\)/i,
rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i, rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,
rrelNum = /^([\-+])=([\-+.\de]+)/, rrelNum = /^([\-+])=([\-+.\de]+)/,
rmargin = /^margin/, rmargin = /^margin/,
elemdisplay = {},
cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssShow = { position: "absolute", visibility: "hidden", display: "block" },
cssExpand = jQuery.cssExpand, cssExpand = jQuery.cssExpand,
cssPrefixes = [ "Webkit", "O", "Moz", "ms" ], cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
rposition = /^(top|right|bottom|left)$/, rposition = /^(top|right|bottom|left)$/,
curCSS; eventsToggle = jQuery.fn.toggle;
// return a css property mapped to a potentially vendor prefixed property // return a css property mapped to a potentially vendor prefixed property
function vendorPropName( style, name ) { function vendorPropName( style, name ) {
@ -43,13 +44,83 @@ function vendorPropName( style, name ) {
return origName; return origName;
} }
jQuery.fn.css = function( name, value ) { function showHide( elements, show ) {
return jQuery.access( this, function( elem, name, value ) { var elem, display,
return value !== undefined ? values = [],
jQuery.style( elem, name, value ) : index = 0,
jQuery.css( elem, name ); length = elements.length;
}, name, value, arguments.length > 1 );
}; for ( ; index < length; index++ ) {
elem = elements[ index ];
if ( !elem.style ) {
continue;
}
values[ index ] = jQuery._data( elem, "olddisplay" );
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" ) {
elem.style.display = "";
}
// Set elements which have been overridden with display: none
// in a stylesheet to whatever the default browser style is
// for such an element
if ( (elem.style.display === "" && curCSS( elem, "display" ) === "none") ||
!jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
values[ index ] = jQuery._data( elem, "olddisplay", jQuery.defaultDisplay(elem.nodeName) );
}
} else {
display = curCSS( elem, "display" );
if ( !values[ index ] && display !== "none" ) {
jQuery._data( elem, "olddisplay", display );
}
}
}
// Set the display of most of the elements in a second loop
// to avoid the constant reflow
for ( index = 0; index < length; index++ ) {
elem = elements[ index ];
if ( !elem.style ) {
continue;
}
if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
elem.style.display = show ? values[ index ] || "" : "none";
}
}
return elements;
}
jQuery.fn.extend({
css: function( name, value ) {
return jQuery.access( this, function( elem, name, value ) {
return value !== undefined ?
jQuery.style( elem, name, value ) :
jQuery.css( elem, name );
}, name, value, arguments.length > 1 );
},
show: function() {
return showHide( this, true );
},
hide: function() {
return showHide( this );
},
toggle: function( fn, fn2 ) {
var bool = typeof fn === "boolean";
if ( jQuery.isFunction( fn ) && jQuery.isFunction( fn2 ) ) {
return eventsToggle.apply( this, arguments );
}
return this.each(function() {
var state = bool ? fn : jQuery( this ).is(":hidden");
showHide([ this ], state );
});
}
});
jQuery.extend({ jQuery.extend({
// Add in style property hooks for overriding the default // Add in style property hooks for overriding the default
@ -200,6 +271,49 @@ jQuery.extend({
} }
return ret; return ret;
},
// Try to determine the default display value of an element
defaultDisplay: function( 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("<!doctype html><html><body>");
iframeDoc.close();
}
elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
display = curCSS( elem, "display" );
document.body.removeChild( iframe );
}
// Store the correct default display
elemdisplay[ nodeName ] = display;
return display;
} }
}); });

141
src/effects.js vendored
View File

@ -1,7 +1,6 @@
(function( jQuery ) { (function( jQuery ) {
var fxNow, timerId, iframe, iframeDoc, var fxNow, timerId,
elemdisplay = {},
rfxtypes = /^(?:toggle|show|hide)$/, rfxtypes = /^(?:toggle|show|hide)$/,
rfxnum = /^([\-+]=)?((?:\d*\.)?\d+)([a-z%]*)$/i, rfxnum = /^([\-+]=)?((?:\d*\.)?\d+)([a-z%]*)$/i,
rrun = /queueHooks$/, rrun = /queueHooks$/,
@ -31,8 +30,7 @@ var fxNow, timerId, iframe, iframeDoc,
} }
return tween; return tween;
}] }]
}, };
oldToggle = jQuery.fn.toggle;
// Animations created synchronously will run synchronously // Animations created synchronously will run synchronously
function createFxNow() { function createFxNow() {
@ -255,7 +253,7 @@ function defaultPrefilter( elem, props, opts ) {
// inline-level elements accept inline-block; // inline-level elements accept inline-block;
// block-level elements need to be inline with layout // block-level elements need to be inline with layout
if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) { if ( !jQuery.support.inlineBlockNeedsLayout || jQuery.defaultDisplay( elem.nodeName ) === "inline" ) {
style.display = "inline-block"; style.display = "inline-block";
} else { } else {
@ -290,10 +288,10 @@ function defaultPrefilter( elem, props, opts ) {
if ( length ) { if ( length ) {
dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} ); dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
if ( hidden ) { if ( hidden ) {
showHide([ elem ], true ); jQuery( elem ).show();
} else { } else {
anim.finish(function() { anim.finish(function() {
showHide([ elem ]); jQuery( elem ).hide();
}); });
} }
anim.finish(function() { anim.finish(function() {
@ -400,84 +398,18 @@ function isHidden( elem, el ) {
return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument.documentElement, elem ); return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument.documentElement, elem );
} }
function showHide( elements, show ) { jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
var elem, display, var cssFn = jQuery.fn[ name ];
values = [], jQuery.fn[ name ] = function( speed, easing, callback ) {
index = 0, return speed == null || typeof speed === "boolean" ||
length = elements.length; // special check for .toggle( handler, handler, ... )
( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
for ( ; index < length; index++ ) { cssFn.apply( this, arguments ) :
elem = elements[ index ]; this.animate( genFx( name, true ), speed, easing, callback );
if ( !elem.style ) { };
continue; });
}
values[ index ] = jQuery._data( elem, "olddisplay" );
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" ) {
elem.style.display = "";
}
// Set elements which have been overridden with display: none
// in a stylesheet to whatever the default browser style is
// for such an element
if ( elem.style.display === "" && isHidden( elem ) ) {
values[ index ] = jQuery._data( elem, "olddisplay", defaultDisplay( elem.nodeName ) );
}
} else {
display = jQuery.css( elem, "display" );
if ( !values[ index ] && display !== "none" ) {
jQuery._data( elem, "olddisplay", display );
}
}
}
// Set the display of most of the elements in a second loop
// to avoid the constant reflow
for ( index = 0; index < length; index++ ) {
elem = elements[ index ];
if ( !elem.style ) {
continue;
}
if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
elem.style.display = show ? values[ index ] || "" : "none";
}
}
return elements;
}
jQuery.fn.extend({ jQuery.fn.extend({
show: function( speed, easing, callback ) {
return speed || speed === 0 ?
this.animate( genFx( "show", true ), speed, easing, callback ) :
showHide( this, true );
},
hide: function( speed, easing, callback ) {
return speed || speed === 0 ?
this.animate( genFx( "hide", true ), speed, easing, callback ) :
showHide( this );
},
toggle: function( fn, fn2, callback ) {
var bool = typeof fn === "boolean";
if ( jQuery.isFunction( fn ) && jQuery.isFunction( fn2 ) ) {
oldToggle.apply( this, arguments );
} else if ( fn == null || bool ) {
this.each(function() {
var state = bool ? fn : isHidden( this );
showHide([ this ], state );
});
} else {
this.animate( genFx( "toggle", true ), fn, fn2, callback );
}
return this;
},
fadeTo: function( speed, to, easing, callback ) { fadeTo: function( speed, to, easing, callback ) {
// show any hidden elements after setting opacity to 0 // show any hidden elements after setting opacity to 0
@ -681,47 +613,4 @@ if ( jQuery.expr && jQuery.expr.filters ) {
}; };
} }
// Try to restore the default display value of an element
function 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("<!doctype html><html><body>");
iframeDoc.close();
}
elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
display = jQuery.css( elem, "display" );
document.body.removeChild( iframe );
}
// Store the correct default display
elemdisplay[ nodeName ] = display;
return display;
}
})( jQuery ); })( jQuery );

@ -1 +1 @@
Subproject commit e844a8c04235cec865dff32af88bc3d498c3cd23 Subproject commit feebbd7e053bff426444c7b348c776c99c7490ee

View File

@ -163,7 +163,7 @@ function url(value) {
equal( fragmentsLength, oldFragmentsLength, "No unit tests leak memory in jQuery.fragments" ); equal( fragmentsLength, oldFragmentsLength, "No unit tests leak memory in jQuery.fragments" );
oldFragmentsLength = fragmentsLength; oldFragmentsLength = fragmentsLength;
} }
if ( jQuery.timers.length !== oldTimersLength ) { if ( jQuery.timers && jQuery.timers.length !== oldTimersLength ) {
equal( jQuery.timers.length, oldTimersLength, "No timers are still running" ); equal( jQuery.timers.length, oldTimersLength, "No timers are still running" );
oldTimersLength = jQuery.timers.length; oldTimersLength = jQuery.timers.length;
} }

View File

@ -411,6 +411,179 @@ test("css(Object) where values are Functions with incoming values", function() {
jQuery("#cssFunctionTest").remove(); jQuery("#cssFunctionTest").remove();
}); });
test("show(); hide()", function() {
expect(22);
var hiddendiv = jQuery("div.hidden");
hiddendiv.hide();
equal( hiddendiv.css("display"), "none", "Non-detached div hidden" );
hiddendiv.show();
equal( hiddendiv.css("display"), "block", "Pre-hidden div shown" );
var div = jQuery("<div>").hide();
equal( div.css("display"), "none", "Detached div hidden" );
div.appendTo("#qunit-fixture").show();
equal( div.css("display"), "block", "Pre-hidden div shown" );
QUnit.reset();
hiddendiv = jQuery("div.hidden");
equal(jQuery.css( hiddendiv[0], "display"), "none", "hiddendiv is display: none");
hiddendiv.css("display", "block");
equal(jQuery.css( hiddendiv[0], "display"), "block", "hiddendiv is display: block");
hiddendiv.show();
equal(jQuery.css( hiddendiv[0], "display"), "block", "hiddendiv is display: block");
hiddendiv.css("display","");
var pass = true;
div = jQuery("#qunit-fixture div");
div.show().each(function(){
if ( this.style.display == "none" ) pass = false;
});
ok( pass, "Show" );
// #show-tests * is set display: none in CSS
jQuery("#qunit-fixture").append("<div id='show-tests'><div><p><a href='#'></a></p><code></code><pre></pre><span></span></div><table><thead><tr><th></th></tr></thead><tbody><tr><td></td></tr></tbody></table><ul><li></li></ul></div><table id='test-table'></table>");
var old = jQuery("#test-table").show().css("display") !== "table";
jQuery("#test-table").remove();
var test = {
"div" : "block",
"p" : "block",
"a" : "inline",
"code" : "inline",
"pre" : "block",
"span" : "inline",
"table" : old ? "block" : "table",
"thead" : old ? "block" : "table-header-group",
"tbody" : old ? "block" : "table-row-group",
"tr" : old ? "block" : "table-row",
"th" : old ? "block" : "table-cell",
"td" : old ? "block" : "table-cell",
"ul" : "block",
"li" : old ? "block" : "list-item"
};
jQuery.each(test, function(selector, expected) {
var elem = jQuery(selector, "#show-tests").show();
equal( elem.css("display"), expected, "Show using correct display type for " + selector );
});
// Make sure that showing or hiding a text node doesn't cause an error
jQuery("<div>test</div> text <span>test</span>").show().remove();
jQuery("<div>test</div> text <span>test</span>").hide().remove();
});
test("show() resolves correct default display #8099", function() {
expect(7);
var tt8099 = jQuery("<tt/>").appendTo("body"),
dfn8099 = jQuery("<dfn/>", { html: "foo"}).appendTo("body");
equal( tt8099.css("display"), "none", "default display override for all tt" );
equal( tt8099.show().css("display"), "inline", "Correctly resolves display:inline" );
equal( jQuery("#foo").hide().show().css("display"), "block", "Correctly resolves display:block after hide/show" );
equal( tt8099.hide().css("display"), "none", "default display override for all tt" );
equal( tt8099.show().css("display"), "inline", "Correctly resolves display:inline" );
equal( dfn8099.css("display"), "none", "default display override for all dfn" );
equal( dfn8099.show().css("display"), "inline", "Correctly resolves display:inline" );
tt8099.remove();
dfn8099.remove();
});
test( "show() resolves correct default display, detached nodes (#10006)", function(){
// Tests originally contributed by Orkel in
// https://github.com/jquery/jquery/pull/458
expect( 11 );
var div, span;
div = jQuery("<div class='hidden'>");
div.show().appendTo("#qunit-fixture");
equal( div.css("display"), "block", "Make sure a detached, pre-hidden( through stylesheets ) div is visible." );
div = jQuery("<div style='display: none'>");
div.show().appendTo("#qunit-fixture");
equal( div.css("display"), "block", "Make sure a detached, pre-hidden( through inline style ) div is visible." );
span = jQuery("<span class='hidden'/>");
span.show().appendTo("#qunit-fixture");
equal( span.css("display"), "inline", "Make sure a detached, pre-hidden( through stylesheets ) span has default display." );
span = jQuery("<span style='display: inline'/>");
span.show().appendTo("#qunit-fixture");
equal( span.css("display"), "inline", "Make sure a detached, pre-hidden( through inline style ) span has default display." );
div = jQuery("<div><div class='hidden'></div></div>").children("div");
div.show().appendTo("#qunit-fixture");
equal( div.css("display"), "block", "Make sure a detached, pre-hidden( through stylesheets ) div inside another visible div is visible." );
div = jQuery("<div><div style='display: none'></div></div>").children("div");
div.show().appendTo("#qunit-fixture");
equal( div.css("display"), "block", "Make sure a detached, pre-hidden( through inline style ) div inside another visible div is visible." );
div = jQuery("div.hidden");
div.detach().show();
equal( div.css("display"), "block", "Make sure a detached( through detach() ), pre-hidden div is visible." );
div.remove();
span = jQuery("<span>");
span.appendTo("#qunit-fixture").detach().show().appendTo("#qunit-fixture" );
equal( span.css("display"), "inline", "Make sure a detached( through detach() ), pre-hidden span has default display." );
span.remove();
div = jQuery("<div>");
div.show().appendTo("#qunit-fixture");
ok( !!div.get( 0 ).style.display, "Make sure not hidden div has a inline style." );
div = jQuery( document.createElement("div") );
div.show().appendTo("#qunit-fixture");
equal( div.css("display"), "block", "Make sure a pre-created element has default display." );
div = jQuery("<div style='display: inline'/>");
div.show().appendTo("#qunit-fixture");
equal( div.css("display"), "inline", "Make sure that element has same display when it was created." );
});
test("toggle()", function() {
expect(6);
var x = jQuery("#foo");
ok( x.is(":visible"), "is visible" );
x.toggle();
ok( x.is(":hidden"), "is hidden" );
x.toggle();
ok( x.is(":visible"), "is visible again" );
x.toggle(true);
ok( x.is(":visible"), "is visible" );
x.toggle(false);
ok( x.is(":hidden"), "is hidden" );
x.toggle(true);
ok( x.is(":visible"), "is visible again" );
});
test("hide hidden elements (bug #7141)", function() {
expect(3);
QUnit.reset();
var div = jQuery("<div style='display:none'></div>").appendTo("#qunit-fixture");
equal( div.css("display"), "none", "Element is hidden by default" );
div.hide();
ok( !jQuery._data(div, "olddisplay"), "olddisplay is undefined after hiding an already-hidden element" );
div.show();
equal( div.css("display"), "block", "Show a double-hidden element" );
div.remove();
});
test("jQuery.css(elem, 'height') doesn't clear radio buttons (bug #1095)", function () { test("jQuery.css(elem, 'height') doesn't clear radio buttons (bug #1095)", function () {
expect(4); expect(4);
@ -545,13 +718,8 @@ test("percentage position properties in IE<9 should not be incorrectly transform
}); });
test("Do not append px to 'fill-opacity' #9548", 1, function() { test("Do not append px to 'fill-opacity' #9548", 1, function() {
var $div = jQuery("<div>").appendTo("#qunit-fixture").css("fill-opacity", 1);
var $div = jQuery("<div>").appendTo("#qunit-fixture"); equal( $div.css("fill-opacity"), 1, "Do not append px to 'fill-opacity'");
$div.css("fill-opacity", 0).animate({ "fill-opacity": 1.0 }, 0, function () {
equal( jQuery(this).css("fill-opacity"), 1, "Do not append px to 'fill-opacity'");
});
}); });
test("outerWidth(true) and css('margin') returning % instead of px in Webkit, see #10639", function() { test("outerWidth(true) and css('margin') returning % instead of px in Webkit, see #10639", function() {
@ -609,4 +777,4 @@ test( "cssHooks - expand", function() {
}); });
}); });

108
test/unit/effects.js vendored
View File

@ -1,3 +1,5 @@
if ( jQuery.fx ) {
module("effects", { teardown: moduleTeardown }); module("effects", { teardown: moduleTeardown });
test("sanity check", function() { test("sanity check", function() {
@ -6,7 +8,7 @@ test("sanity check", function() {
}); });
test("show()", function() { test("show()", function() {
expect(28); expect(26);
var hiddendiv = jQuery("div.hidden"); var hiddendiv = jQuery("div.hidden");
@ -42,7 +44,6 @@ test("show()", function() {
var speeds = { var speeds = {
"null speed": null, "null speed": null,
"undefined speed": undefined, "undefined speed": undefined,
"empty string speed": "",
"false speed": false "false speed": false
}; };
@ -167,82 +168,6 @@ test("Persist correct display value", function() {
}); });
}); });
test("show() resolves correct default display #8099", function() {
expect(7);
var tt8099 = jQuery("<tt/>").appendTo("body"),
dfn8099 = jQuery("<dfn/>", { html: "foo"}).appendTo("body");
equal( tt8099.css("display"), "none", "default display override for all tt" );
equal( tt8099.show().css("display"), "inline", "Correctly resolves display:inline" );
equal( jQuery("#foo").hide().show().css("display"), "block", "Correctly resolves display:block after hide/show" );
equal( tt8099.hide().css("display"), "none", "default display override for all tt" );
equal( tt8099.show().css("display"), "inline", "Correctly resolves display:inline" );
equal( dfn8099.css("display"), "none", "default display override for all dfn" );
equal( dfn8099.show().css("display"), "inline", "Correctly resolves display:inline" );
tt8099.remove();
dfn8099.remove();
});
test( "show() resolves correct default display, detached nodes (#10006)", function(){
// Tests originally contributed by Orkel in
// https://github.com/jquery/jquery/pull/458
expect( 11 );
var div, span;
div = jQuery("<div class='hidden'>");
div.show().appendTo("#qunit-fixture");
equal( div.css("display"), "block", "Make sure a detached, pre-hidden( through stylesheets ) div is visible." );
div = jQuery("<div style='display: none'>");
div.show().appendTo("#qunit-fixture");
equal( div.css("display"), "block", "Make sure a detached, pre-hidden( through inline style ) div is visible." );
span = jQuery("<span class='hidden'/>");
span.show().appendTo("#qunit-fixture");
equal( span.css("display"), "inline", "Make sure a detached, pre-hidden( through stylesheets ) span has default display." );
span = jQuery("<span style='display: inline'/>");
span.show().appendTo("#qunit-fixture");
equal( span.css("display"), "inline", "Make sure a detached, pre-hidden( through inline style ) span has default display." );
div = jQuery("<div><div class='hidden'></div></div>").children("div");
div.show().appendTo("#qunit-fixture");
equal( div.css("display"), "block", "Make sure a detached, pre-hidden( through stylesheets ) div inside another visible div is visible." );
div = jQuery("<div><div style='display: none'></div></div>").children("div");
div.show().appendTo("#qunit-fixture");
equal( div.css("display"), "block", "Make sure a detached, pre-hidden( through inline style ) div inside another visible div is visible." );
div = jQuery("div.hidden");
div.detach().show();
equal( div.css("display"), "block", "Make sure a detached( through detach() ), pre-hidden div is visible." );
div.remove();
span = jQuery("<span>");
span.appendTo("#qunit-fixture").detach().show().appendTo("#qunit-fixture" );
equal( span.css("display"), "inline", "Make sure a detached( through detach() ), pre-hidden span has default display." );
span.remove();
div = jQuery("<div>");
div.show().appendTo("#qunit-fixture");
ok( !!div.get( 0 ).style.display, "Make sure not hidden div has a inline style." );
div = jQuery( document.createElement("div") );
div.show().appendTo("#qunit-fixture");
equal( div.css("display"), "block", "Make sure a pre-created element has default display." );
div = jQuery("<div style='display: inline'/>");
div.show().appendTo("#qunit-fixture");
equal( div.css("display"), "inline", "Make sure that element has same display when it was created." );
});
test("animate(Hash, Object, Function)", function() { test("animate(Hash, Object, Function)", function() {
expect(1); expect(1);
stop(); stop();
@ -480,7 +405,6 @@ asyncTest( "animate option { queue: true }", function() {
notEqual( foo.queue().length, 0, "Default queue is not empty" ); notEqual( foo.queue().length, 0, "Default queue is not empty" );
}); });
asyncTest( "animate option { queue: 'name' }", function() { asyncTest( "animate option { queue: 'name' }", function() {
expect( 5 ); expect( 5 );
var foo = jQuery( "#foo" ), var foo = jQuery( "#foo" ),
@ -1295,20 +1219,6 @@ test("animate with CSS shorthand properties", function(){
}); });
}); });
test("hide hidden elements (bug #7141)", function() {
expect(3);
QUnit.reset();
var div = jQuery("<div style='display:none'></div>").appendTo("#qunit-fixture");
equal( div.css("display"), "none", "Element is hidden by default" );
div.hide();
ok( !jQuery._data(div, "olddisplay"), "olddisplay is undefined after hiding an already-hidden element" );
div.show();
equal( div.css("display"), "block", "Show a double-hidden element" );
div.remove();
});
test("hide hidden elements, with animation (bug #7141)", function() { test("hide hidden elements, with animation (bug #7141)", function() {
expect(3); expect(3);
QUnit.reset(); QUnit.reset();
@ -1437,6 +1347,14 @@ test("animate will scale margin properties individually", function() {
start(); start();
}); });
test("Do not append px to 'fill-opacity' #9548", 1, function() {
var $div = jQuery("<div>").appendTo("#qunit-fixture");
$div.css("fill-opacity", 0).animate({ "fill-opacity": 1.0 }, 0, function () {
equal( jQuery(this).css("fill-opacity"), 1, "Do not append px to 'fill-opacity'");
});
});
// Start 1.8 Animation tests // Start 1.8 Animation tests
asyncTest( "jQuery.Animation( object, props, opts )", 1, function() { asyncTest( "jQuery.Animation( object, props, opts )", 1, function() {
var testObject = { var testObject = {
@ -1708,4 +1626,6 @@ asyncTest( "multiple unqueued and promise", 4, function() {
strictEqual( step++, 4, "Step 4" ); strictEqual( step++, 4, "Step 4" );
start(); start();
}); });
}); });
} // if ( jQuery.fx )

View File

@ -101,11 +101,13 @@ test("callbacks keep their place in the queue", function() {
div.queue(function( next ) { div.queue(function( next ) {
equal( ++counter, 1, "Queue/callback order: first called" ); equal( ++counter, 1, "Queue/callback order: first called" );
setTimeout( next, 200 ); setTimeout( next, 200 );
}).show(100, function() { }).delay( 100 ).queue(function( next ) {
equal( ++counter, 2, "Queue/callback order: second called" ); equal( ++counter, 2, "Queue/callback order: second called" );
jQuery(this).hide(100, function() { jQuery( this ).delay( 100 ).queue(function( next ) {
equal( ++counter, 4, "Queue/callback order: fourth called" ); equal( ++counter, 4, "Queue/callback order: fourth called" );
next();
}); });
next();
}).queue(function( next ) { }).queue(function( next ) {
equal( ++counter, 3, "Queue/callback order: third called" ); equal( ++counter, 3, "Queue/callback order: third called" );
next(); next();
@ -133,44 +135,6 @@ test("delay()", function() {
equal( run, 0, "The delay delayed the next function from running." ); equal( run, 0, "The delay delayed the next function from running." );
}); });
test("delay() can be stopped", function() {
expect( 3 );
stop();
var foo = jQuery({}), run = 0;
foo
.queue( "alternate", function( next ) {
run++;
ok( true, "This first function was dequeued" );
next();
})
.delay( 1000, "alternate" )
.queue( "alternate", function() {
run++;
ok( true, "The function was dequeued immediately, the delay was stopped" );
})
.dequeue( "alternate" )
// stop( "alternate", false ) will NOT clear the queue, so it should automatically dequeue the next
.stop( "alternate", false, false )
// this test
.delay( 1000 )
.queue(function() {
run++;
ok( false, "This queue should never run" );
})
// stop( clearQueue ) should clear the queue
.stop( true, false );
equal( run, 2, "Queue ran the proper functions" );
setTimeout( start, 2000 );
});
test("clearQueue(name) clears the queue", function() { test("clearQueue(name) clears the queue", function() {
expect(2); expect(2);
@ -265,22 +229,63 @@ test( ".promise(obj)", function() {
strictEqual( promise, obj, ".promise(type, obj) returns obj" ); strictEqual( promise, obj, ".promise(type, obj) returns obj" );
}); });
asyncTest( "queue stop hooks", 2, function() {
var foo = jQuery( "#foo" );
foo.queue( function( next, hooks ) { if ( jQuery.fn.stop ) {
hooks.stop = function( gotoEnd ) { test("delay() can be stopped", function() {
equal( !!gotoEnd, false, "Stopped without gotoEnd" ); expect( 3 );
}; stop();
});
foo.stop();
foo.queue( function( next, hooks ) { var foo = jQuery({}), run = 0;
hooks.stop = function( gotoEnd ) {
equal( gotoEnd, true, "Stopped with gotoEnd" ); foo
start(); .queue( "alternate", function( next ) {
}; run++;
ok( true, "This first function was dequeued" );
next();
})
.delay( 1000, "alternate" )
.queue( "alternate", function() {
run++;
ok( true, "The function was dequeued immediately, the delay was stopped" );
})
.dequeue( "alternate" )
// stop( "alternate", false ) will NOT clear the queue, so it should automatically dequeue the next
.stop( "alternate", false, false )
// this test
.delay( 1000 )
.queue(function() {
run++;
ok( false, "This queue should never run" );
})
// stop( clearQueue ) should clear the queue
.stop( true, false );
equal( run, 2, "Queue ran the proper functions" );
setTimeout( start, 2000 );
}); });
foo.stop( false, true ); asyncTest( "queue stop hooks", 2, function() {
}); var foo = jQuery( "#foo" );
foo.queue( function( next, hooks ) {
hooks.stop = function( gotoEnd ) {
equal( !!gotoEnd, false, "Stopped without gotoEnd" );
};
});
foo.stop();
foo.queue( function( next, hooks ) {
hooks.stop = function( gotoEnd ) {
equal( gotoEnd, true, "Stopped with gotoEnd" );
start();
};
});
foo.stop( false, true );
});
} // if ( jQuery.fn.stop )