From f7111fb0e521b063250a09dd116d970a3d6556fd Mon Sep 17 00:00:00 2001 From: =?utf8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Wed, 11 Sep 2013 02:51:48 +0200 Subject: [PATCH] No ticket. Abstract conditional hook definition. --- src/css.js | 72 +++++++++++------------------------------ src/css/addGetHookIf.js | 33 +++++++++++++++++++ 2 files changed, 51 insertions(+), 54 deletions(-) create mode 100644 src/css/addGetHookIf.js diff --git a/src/css.js b/src/css.js index a7c9e1c6f..18815ca0d 100644 --- a/src/css.js +++ b/src/css.js @@ -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,69 +513,32 @@ 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; +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" ] ); } - - jQuery.cssHooks.marginRight.get = 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; + addGetHookIf( jQuery.cssHooks[ prop ], support.pixelPosition, + function ( elem, computed ) { + if ( computed ) { + computed = curCSS( elem, prop ); + // if curCSS returns percentage, fallback to offset + return rnumnonpx.test( computed ) ? + jQuery( elem ).position()[ prop ] + "px" : + computed; } - - jQuery.cssHooks[ prop ].get = function ( elem, computed ) { - if ( computed ) { - computed = curCSS( elem, prop ); - // if curCSS returns percentage, fallback to offset - return rnumnonpx.test( computed ) ? - jQuery( elem ).position()[ prop ] + "px" : - computed; - } - }; - - return jQuery.cssHooks[ prop ].get( elem, computed ); } - }; + ); }); diff --git a/src/css/addGetHookIf.js b/src/css/addGetHookIf.js new file mode 100644 index 000000000..2c2c47a68 --- /dev/null +++ b/src/css/addGetHookIf.js @@ -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; + +}); -- 2.39.5