Refactored vendor methods to it's own module

This commit is contained in:
Gregers Gram Rygg
2012-06-25 13:44:35 +02:00
parent b394b93723
commit 58a83b0d17
7 changed files with 257 additions and 174 deletions
+1
View File
@@ -132,6 +132,7 @@
jsFiles = [
"OpenLayers/BaseTypes/Class.js",
"OpenLayers/Util.js",
"OpenLayers/Vendor.js",
"OpenLayers/Animation.js",
"OpenLayers/BaseTypes.js",
"OpenLayers/BaseTypes/Bounds.js",
+1 -1
View File
@@ -162,7 +162,7 @@ OpenLayers.Control.PinchZoom = OpenLayers.Class(OpenLayers.Control, {
*/
applyTransform: function(transform) {
var style = this.map.layerContainerDiv.style;
var transformProperty = OpenLayers.Util.getVendorPrefixedObj("transform");
var transformProperty = OpenLayers.Vendor.stylePrefix("transform");
if (transformProperty) {
style[transformProperty] = transform;
}
-92
View File
@@ -1501,98 +1501,6 @@ OpenLayers.Util.getBrowserName = function() {
return OpenLayers.BROWSER_NAME;
};
/**
* Constant: VENDOR_PREFIXES
* {Array} A list of prefixes to test support for vendor-prefixed properties
*/
OpenLayers.Util.VENDOR_PREFIXES = ["", "O", "ms", "Moz", "Webkit"];
/**
* Method: getVendorPrefixedCss
*
* Parameters:
* property - {String} The standard CSS property name
*
* Returns:
* {String} The CSS property name supported by the browser or null if
* unsupported
*/
OpenLayers.Util.getVendorPrefixedCss = (function() {
var cache = {};
function domToCss(prefixedDom) {
return prefixedDom.
replace(/([A-Z])/g, function(c) { return "-" + c.toLowerCase(); }).
replace(/^ms-/, "-ms-");
}
return function(property) {
// clear cache for tests
if (property === "clear cache") { cache = {}; return; }
if (cache[property] === undefined) {
var domProperty = property.
replace(/(-.)/g, function(c) { return c.charAt(1).toUpperCase(); });
var prefixedDom = OpenLayers.Util.getVendorPrefixedObj(domProperty);
cache[property] = domToCss(prefixedDom);
}
return cache[property];
};
})();
/**
* Method: getVendorPrefixedObj
*
* Parameters:
* object - {Object} Optional object to test for vendor-prefixed properties. Defaults to a DIV's style object.
* property - {String} The standard DOM style property name
*
* Returns:
* {String} The DOM style property name supported by the browser or null if
* unsupported
*/
OpenLayers.Util.getVendorPrefixedObj = (function() {
var cache = {};
return function getVendorPrefixedObj(obj, property) {
// emulate method overloading
if (typeof obj === "string") {
return getVendorPrefixedObj(document.createElement("div").style, obj);
}
// clear cache for tests
if (property === "clear cache") { cache = {}; return; }
if (cache[property] === undefined) {
var tmpProp,
i = 0,
l = OpenLayers.Util.VENDOR_PREFIXES.length,
prefix,
isStyleObj = (typeof obj.cssText !== "undefined");
cache[property] = null;
for(var i=0,l=OpenLayers.Util.VENDOR_PREFIXES.length; i<l; i++) {
prefix = OpenLayers.Util.VENDOR_PREFIXES[i];
if(prefix) {
if (!isStyleObj) {
// js properties should be lower-case
prefix = prefix.toLowerCase();
}
tmpProp = prefix + property.charAt(0).toUpperCase() + property.slice(1);
} else {
tmpProp = property;
}
if(obj[tmpProp] !== undefined) {
cache[property] = tmpProp;
break;
}
}
}
return cache[property];
};
})();
/**
* Method: getRenderedDimensions
* Renders the contentHTML offscreen to determine actual dimensions for
+136
View File
@@ -0,0 +1,136 @@
/**
* Copyright (c) 2006-2012 by OpenLayers Contributors (see authors.txt for
* full list of contributors). Published under the 2-clause BSD license.
* See license.txt in the OpenLayers distribution or repository for the
* full text of the license.
*
* @requires OpenLayers/SingleFile.js
*/
/**
* Namespace: OpenLayers.Vendor
* A collection of utility functions to detect vendor prefixed features
*/
var OpenLayers = OpenLayers || {};
OpenLayers.Vendor = (function() {
"use strict";
var VENDOR_PREFIXES = ["", "O", "ms", "Moz", "Webkit"],
divStyle = document.createElement("div").style,
cssCache = {},
jsCache = {};
/**
* Function: domToCss
* Converts a upper camel case DOM style property name to a CSS property
* i.e. transformOrigin -> transform-origin
* or WebkitTransformOrigin -> -webkit-transform-origin
*
* Parameters:
* prefixedDom - {String} The property to convert
*
* Returns:
* {String} The CSS property
*/
function domToCss(prefixedDom) {
if (!prefixedDom) { return null; }
return prefixedDom.
replace(/([A-Z])/g, function(c) { return "-" + c.toLowerCase(); }).
replace(/^ms-/, "-ms-");
}
/**
* APIMethod: cssPrefix
* Detect which property is used for a CSS property
*
* Parameters:
* property - {String} The standard (unprefixed) CSS property name
*
* Returns:
* {String} The standard CSS property, prefixed property or null if not
* supported
*/
function cssPrefix(property) {
if (cssCache[property] === undefined) {
var domProperty = property.
replace(/(-[\s\S])/g, function(c) { return c.charAt(1).toUpperCase(); });
var prefixedDom = stylePrefix(domProperty);
cssCache[property] = domToCss(prefixedDom);
}
return cssCache[property];
}
/**
* APIMethod: jsPrefix
* Detect which property is used for a JS property/method
*
* Parameters:
* obj - {Object} The object to test on
* property - {String} The standard (unprefixed) JS property name
*
* Returns:
* {String} The standard JS property, prefixed property or null if not
* supported
*/
function jsPrefix(obj, property) {
if (jsCache[property] === undefined) {
var tmpProp,
i = 0,
l = VENDOR_PREFIXES.length,
prefix,
isStyleObj = (typeof obj.cssText !== "undefined");
jsCache[property] = null;
for(var i=0,l=VENDOR_PREFIXES.length; i<l; i++) {
prefix = VENDOR_PREFIXES[i];
if(prefix) {
if (!isStyleObj) {
// js prefix should be lower-case, while style
// properties have upper case on first character
prefix = prefix.toLowerCase();
}
tmpProp = prefix + property.charAt(0).toUpperCase() + property.slice(1);
} else {
tmpProp = property;
}
if(obj[tmpProp] !== undefined) {
jsCache[property] = tmpProp;
break;
}
}
}
return jsCache[property];
}
/**
* APIMethod: stylePrefix
* Detect which property is used for a DOM style property
*
* Parameters:
* property - {String} The standard (unprefixed) style property name
*
* Returns:
* {String} The standard style property, prefixed property or null if not
* supported
*/
function stylePrefix(property) {
return jsPrefix(divStyle, property);
}
return {
cssPrefix: cssPrefix,
jsPrefix: jsPrefix,
stylePrefix: stylePrefix,
// used for testing
_clearCache: function() {
cssCache = {};
jsCache = {};
},
_mockStyle: function(mock) {
divStyle = mock;
}
};
}());