No ticket. Abstract conditional hook definition.

This commit is contained in:
Michał Gołębiowski 2013-09-11 02:51:48 +02:00
parent 5fbf4a4fe3
commit f7111fb0e5
2 changed files with 51 additions and 54 deletions

View File

@ -10,6 +10,7 @@ var
isHidden = require( "./css/var/isHidden" ),
support = require( "./css/support" ),
defaultDisplay = require( "./css/defaultDisplay" ),
addGetHookIf = require( "./css/addGetHookIf" ),
getStyles, curCSS,
ralpha = /alpha\([^)]*\)/i,
@ -512,57 +513,23 @@ if ( !support.opacity ) {
};
}
jQuery.cssHooks.marginRight = {
get: function( elem, computed ) {
var reliableMarginRight = support.reliableMarginRight();
if ( reliableMarginRight == null ) {
// The test was not ready at this point; screw the hook this time
// but check again when needed next time.
return;
}
if ( reliableMarginRight ) {
// Hook not needed, remove it.
// Since there are no other hooks for marginRight, remove the whole object.
delete jQuery.cssHooks.marginRight;
return;
}
jQuery.cssHooks.marginRight.get = function ( elem, computed ) {
addGetHookIf( jQuery.cssHooks.marginRight, support.reliableMarginRight,
function ( elem, computed ) {
if ( computed ) {
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
// Work around by temporarily setting element display to inline-block
return jQuery.swap( elem, { "display": "inline-block" },
curCSS, [ elem, "marginRight" ] );
}
};
return jQuery.cssHooks.marginRight.get( elem, computed );
}
};
);
// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
// getComputedStyle returns percent when specified for top/left/bottom/right
// rather than make the css module depend on the offset module, we just check for it here
jQuery.each( [ "top", "left" ], function( i, prop ) {
jQuery.cssHooks[ prop ] = {
get: function( elem, computed ) {
var pixelPosition = support.pixelPosition();
if ( pixelPosition == null ) {
// The test was not ready at this point; screw the hook this time
// but check again when needed next time.
return;
}
if ( pixelPosition || !jQuery.fn.position ) {
// Hook not needed or impossible to apply due to a missing module, remove it.
// Since there are no other hooks for prop, remove the whole object.
delete jQuery.cssHooks[ prop ];
return;
}
jQuery.cssHooks[ prop ].get = function ( elem, computed ) {
addGetHookIf( jQuery.cssHooks[ prop ], support.pixelPosition,
function ( elem, computed ) {
if ( computed ) {
computed = curCSS( elem, prop );
// if curCSS returns percentage, fallback to offset
@ -570,11 +537,8 @@ jQuery.each( [ "top", "left" ], function( i, prop ) {
jQuery( elem ).position()[ prop ] + "px" :
computed;
}
};
return jQuery.cssHooks[ prop ].get( elem, computed );
}
};
);
});

33
src/css/addGetHookIf.js Normal file
View File

@ -0,0 +1,33 @@
define(function() {
function addGetHookIf( hookVar, conditionFn, hookFn ) {
// Define the hook, we'll check on the first run if it's really needed.
hookVar = {
get: function() {
var condition = conditionFn();
if ( condition == null ) {
// The test was not ready at this point; screw the hook this time
// but check again when needed next time.
return;
}
if ( condition ) {
// Hook not needed (or it's not possible to use it due to missing dependency),
// remove it.
// Since there are no other hooks for marginRight, remove the whole object.
delete hookVar.get;
return;
}
// Hook needed; redefine it so that the support test is not executed again.
hookVar.get = hookFn;
return hookVar.get.apply( hookVar, arguments );
}
};
}
return addGetHookIf;
});