%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/extensions/MobileFrontend/src/mobile.startup/ |
| Current File : //www/varak.net/wiki.varak.net/extensions/MobileFrontend/src/mobile.startup/Browser.js |
var
util = require( './util' ),
browser;
/**
* Memoize a class method. Caches the result of the method based on the
* arguments. Instances do not share a cache.
* @param {Function} method Method to be memoized
* @return {Function}
*/
function memoize( method ) {
/**
* Memoized version of the method
* @return {Function}
*/
var memoized = function () {
var cache = this[ '__cache' + memoized.cacheId ] ||
( this[ '__cache' + memoized.cacheId ] = {} ),
key = [].join.call( arguments, '|' );
if ( Object.prototype.hasOwnProperty.call( cache, key ) ) {
return cache[ key ];
}
return ( cache[ key ] = method.apply( this, arguments ) );
};
memoized.cacheId = Date.now().toString() + Math.random().toString();
return memoized;
}
/**
* Representation of user's current browser
* @class Browser
* @param {string} ua the user agent of the current browser
* @param {jQuery.Object} $container an element to associate with the Browser object
*/
function Browser( ua, $container ) {
this.userAgent = ua;
this.$el = $container;
this._fixIosLandscapeBug();
}
Browser.prototype = {
/**
* When rotating to landscape stop page zooming on ios 4 and 5.
* @memberof Browser
* @instance
* @private
*/
_fixIosLandscapeBug: function () {
var self = this,
viewport = this.$el.find( 'meta[name="viewport"]' )[0];
// see http://adactio.com/journal/4470/ (fixed in ios 6)
if ( viewport && ( this.isIos( 4 ) || this.isIos( 5 ) ) ) {
this.lockViewport();
document.addEventListener( 'gesturestart', function () {
self.lockViewport();
}, false );
}
},
/**
* Returns whether the current browser is an ios device.
* FIXME: jquery.client does not support iPad detection so we cannot use it.
* @memberof Browser
* @instance
* @param {number} [version] integer describing a specific version you want to test against.
* @return {boolean}
*/
isIos: memoize( function ( version ) {
var ua = this.userAgent,
ios = /ipad|iphone|ipod/i.test( ua );
if ( ios && version ) {
switch ( version ) {
case 8:
// Test UA for iOS8. Or for simulator look for Version 8
// In the iOS simulator the OS is the host machine OS version
// This makes testing in iOS8 simulator work as expected
return /OS 8_/.test( ua ) || /Version\/8/.test( ua );
case 4:
return /OS 4_/.test( ua );
case 5:
return /OS 5_/.test( ua );
default:
return false;
}
} else {
return ios;
}
} ),
/**
* Locks the viewport so that pinch zooming is disabled
* @memberof Browser
* @instance
*/
lockViewport: function () {
if ( this.$el ) {
this.$el.find( 'meta[name="viewport"]' )
.attr( 'content', 'initial-scale=1.0, maximum-scale=1.0, user-scalable=no' );
}
},
/**
* Determine if a device has a widescreen.
* @memberof Browser
* @instance
* @return {boolean}
*/
isWideScreen: memoize( function () {
var val = parseInt( mw.config.get( 'wgMFDeviceWidthTablet' ), 10 );
// Check portrait and landscape mode to be consistent
return window.innerWidth >= val || window.innerHeight >= val;
} ),
/**
* Checks browser support for CSS transforms, transitions
* and CSS animation.
* Currently assumes support for the latter 2 in the case of the
* former.
* See http://stackoverflow.com/a/12621264/365238
* @memberof Browser
* @instance
* @return {boolean}
*/
supportsAnimations: memoize( function () {
var elemStyle = document.createElement( 'foo' ).style;
function supportsProperty( property ) {
// We only test "webkit-", because that's the only prefix needed for the relevant
// properties (in supportsAnimations) and supported browsers. If usage is expanded,
// other prefixes may need to be checked as well.
return property in elemStyle ||
( 'webkit' + property[ 0 ].toUpperCase() + property.slice( 1 ) ) in elemStyle;
}
return supportsProperty( 'animationName' ) &&
supportsProperty( 'transform' ) &&
supportsProperty( 'transition' );
} ),
/**
* Whether touchstart and other touch events are supported by the current browser.
* @memberof Browser
* @instance
* @return {boolean}
*/
supportsTouchEvents: memoize( function () {
return 'ontouchstart' in window;
} ),
/**
* Detect if browser supports geolocation
* @memberof Browser
* @instance
* @return {boolean}
*/
supportsGeoLocation: memoize( function () {
return 'geolocation' in window.navigator;
} )
};
/**
* @memberof Browser
* @return {Browser}
*/
Browser.getSingleton = function () {
var $html;
if ( !browser ) {
$html = util.getDocument();
browser = new Browser( window.navigator.userAgent, $html );
}
return browser;
};
module.exports = Browser;