CSS: Restore the hack to get pixels for .css('width') etc.

This hack turns out to be needed by Android 4.0-4.3.

Add a support test so that the hack is invoked only where needed.

Refs gh-1815
Refs gh-1820
Closes gh-1842
This commit is contained in:
Michał Gołębiowski 2014-11-05 18:27:01 +01:00 committed by Michał Gołębiowski
parent 1ba45fcc15
commit 3747cc642a
3 changed files with 49 additions and 4 deletions

View File

@ -3,11 +3,13 @@ define([
"./var/rnumnonpx", "./var/rnumnonpx",
"./var/rmargin", "./var/rmargin",
"./var/getStyles", "./var/getStyles",
"./support",
"../selector" // contains "../selector" // contains
], function( jQuery, rnumnonpx, rmargin, getStyles ) { ], function( jQuery, rnumnonpx, rmargin, getStyles, support ) {
function curCSS( elem, name, computed ) { function curCSS( elem, name, computed ) {
var ret; var width, minWidth, maxWidth, ret,
style = elem.style;
computed = computed || getStyles( elem ); computed = computed || getStyles( elem );
@ -22,6 +24,29 @@ function curCSS( elem, name, computed ) {
if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
ret = jQuery.style( elem, name ); ret = jQuery.style( elem, name );
} }
// Support: Android 4.0-4.3
// A tribute to the "awesome hack by Dean Edwards"
// Android Browser returns percentage for some values,
// but width seems to be reliably pixels.
// This is against the CSSOM draft spec:
// http://dev.w3.org/csswg/cssom/#resolved-values
if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
// Remember the original values
width = style.width;
minWidth = style.minWidth;
maxWidth = style.maxWidth;
// Put in the new values to get a computed value out
style.minWidth = style.maxWidth = style.width = ret;
ret = computed.width;
// Revert the changed values
style.width = width;
style.minWidth = minWidth;
style.maxWidth = maxWidth;
}
} }
return ret !== undefined ? return ret !== undefined ?

View File

@ -6,7 +6,7 @@ define([
], function( jQuery, document, documentElement, support ) { ], function( jQuery, document, documentElement, support ) {
(function() { (function() {
var pixelPositionVal, boxSizingReliableVal, var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal,
container = document.createElement( "div" ), container = document.createElement( "div" ),
div = document.createElement( "div" ); div = document.createElement( "div" );
@ -20,7 +20,7 @@ define([
div.cloneNode( true ).style.backgroundClip = ""; div.cloneNode( true ).style.backgroundClip = "";
support.clearCloneStyle = div.style.backgroundClip === "content-box"; support.clearCloneStyle = div.style.backgroundClip === "content-box";
container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" + container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;margin-top:1px;" +
"position:absolute"; "position:absolute";
container.appendChild( div ); container.appendChild( div );
@ -61,6 +61,16 @@ define([
} }
return boxSizingReliableVal; return boxSizingReliableVal;
}, },
pixelMarginRight: function() {
if ( pixelMarginRightVal == null ) {
div.style.cssText = "display:block;width:50%;margin-right:50%";
documentElement.appendChild( container );
pixelMarginRightVal =
window.getComputedStyle( div, null ).marginRight === "4px";
documentElement.removeChild( container );
}
return pixelMarginRightVal;
},
reliableMarginRight: function() { reliableMarginRight: function() {
// Support: Android 2.3 // Support: Android 2.3

View File

@ -66,6 +66,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"noCloneChecked": true, "noCloneChecked": true,
"optDisabled": true, "optDisabled": true,
"optSelected": true, "optSelected": true,
"pixelMarginRight": true,
"pixelPosition": true, "pixelPosition": true,
"radioValue": true, "radioValue": true,
"reliableMarginRight": true "reliableMarginRight": true
@ -83,6 +84,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"noCloneChecked": false, "noCloneChecked": false,
"optDisabled": true, "optDisabled": true,
"optSelected": false, "optSelected": false,
"pixelMarginRight": true,
"pixelPosition": true, "pixelPosition": true,
"radioValue": false, "radioValue": false,
"reliableMarginRight": true "reliableMarginRight": true
@ -100,6 +102,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"noCloneChecked": false, "noCloneChecked": false,
"optDisabled": true, "optDisabled": true,
"optSelected": false, "optSelected": false,
"pixelMarginRight": true,
"pixelPosition": true, "pixelPosition": true,
"radioValue": false, "radioValue": false,
"reliableMarginRight": true "reliableMarginRight": true
@ -117,6 +120,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"noCloneChecked": true, "noCloneChecked": true,
"optDisabled": true, "optDisabled": true,
"optSelected": true, "optSelected": true,
"pixelMarginRight": true,
"pixelPosition": false, "pixelPosition": false,
"radioValue": true, "radioValue": true,
"reliableMarginRight": true "reliableMarginRight": true
@ -134,6 +138,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"noCloneChecked": true, "noCloneChecked": true,
"optDisabled": true, "optDisabled": true,
"optSelected": true, "optSelected": true,
"pixelMarginRight": true,
"pixelPosition": false, "pixelPosition": false,
"radioValue": true, "radioValue": true,
"reliableMarginRight": true "reliableMarginRight": true
@ -151,6 +156,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"noCloneChecked": true, "noCloneChecked": true,
"optDisabled": true, "optDisabled": true,
"optSelected": true, "optSelected": true,
"pixelMarginRight": true,
"pixelPosition": true, "pixelPosition": true,
"radioValue": true, "radioValue": true,
"reliableMarginRight": true "reliableMarginRight": true
@ -168,6 +174,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"noCloneChecked": true, "noCloneChecked": true,
"optDisabled": true, "optDisabled": true,
"optSelected": true, "optSelected": true,
"pixelMarginRight": true,
"pixelPosition": false, "pixelPosition": false,
"radioValue": true, "radioValue": true,
"reliableMarginRight": true "reliableMarginRight": true
@ -185,6 +192,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"noCloneChecked": true, "noCloneChecked": true,
"optDisabled": true, "optDisabled": true,
"optSelected": true, "optSelected": true,
"pixelMarginRight": true,
"pixelPosition": false, "pixelPosition": false,
"radioValue": true, "radioValue": true,
"reliableMarginRight": true "reliableMarginRight": true
@ -202,6 +210,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"noCloneChecked": true, "noCloneChecked": true,
"optDisabled": true, "optDisabled": true,
"optSelected": true, "optSelected": true,
"pixelMarginRight": false,
"pixelPosition": false, "pixelPosition": false,
"radioValue": true, "radioValue": true,
"reliableMarginRight": true "reliableMarginRight": true
@ -219,6 +228,7 @@ testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Sec
"noCloneChecked": true, "noCloneChecked": true,
"optDisabled": false, "optDisabled": false,
"optSelected": true, "optSelected": true,
"pixelMarginRight": true,
"pixelPosition": false, "pixelPosition": false,
"radioValue": true, "radioValue": true,
"reliableMarginRight": false "reliableMarginRight": false