1
0
Fork 0
mirror of https://github.com/openstf/stf synced 2025-10-05 19:42:01 +02:00

Added Guest Browser properties detection (Touch, Mobile, Retina, WebGL, Websockets Binary, ...)

This commit is contained in:
Gunther Brunner 2014-05-15 16:17:43 +09:00
parent 1c480ab801
commit 7e45141a4e
6 changed files with 147 additions and 3 deletions

View file

@ -0,0 +1,127 @@
// NOTE: Most of the detections stuff from Modernizr 3.0
module.exports = function GuestBrowserServiceFactory() {
var service = {
}
var domPrefixes = 'Webkit Moz O ms'.toLowerCase().split(' ')
function createElement() {
return document.createElement.apply(document, arguments)
}
function hasEvent() {
return (function (undefined) {
function isEventSupportedInner(eventName, element) {
var isSupported
if (!eventName) {
return false
}
if (!element || typeof element === 'string') {
element = createElement(element || 'div')
}
eventName = 'on' + eventName
isSupported = eventName in element
return isSupported
}
return isEventSupportedInner
})()
}
function addTest(key, test) {
service[key] = (typeof test == 'function') ? test() : test
}
addTest('touch', function () {
return ('ontouchstart' in window) || window.DocumentTouch &&
document instanceof DocumentTouch
})
addTest('retina', function () {
var mediaQuery = '(-webkit-min-device-pixel-ratio: 1.5), ' +
'(min--moz-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3/2), ' +
'(min-resolution: 1.5dppx)'
if (window.devicePixelRatio > 1) {
return true
}
return !!(window.matchMedia && window.matchMedia(mediaQuery).matches)
})
addTest('small', function () {
var windowWidth = window.screen.width < window.outerWidth ?
window.screen.width : window.outerWidth
return windowWidth < 500
// return !!(window.matchMedia &&
// window.matchMedia('only screen and (max-width: 760px)').matches)
})
addTest('mobile', function () {
return !!(service.small && service.touch)
})
addTest('os', function () {
var ua = navigator.userAgent
if (ua.match(/Android/i)) {
return 'android'
} else if (ua.match(/iPhone|iPad|iPod/i)) {
return 'ios'
} else {
return 'pc'
}
})
addTest('webgl', function () {
var canvas = createElement('canvas')
if ('supportsContext' in canvas) {
return canvas.supportsContext('webgl') ||
canvas.supportsContext('experimental-webgl')
}
return !!window.WebGLRenderingContext
})
addTest('generators', function () {
try {
/* jshint evil: true */
new Function('function* test() {}')()
} catch (e) {
return false
}
return true
})
addTest('ua', navigator.userAgent)
addTest('websocketsbinary', function () {
var protocol = 'https:' == location.protocol ? 'wss' : 'ws',
protoBin
if ('WebSocket' in window) {
if (protoBin = 'binaryType' in WebSocket.prototype) {
return protoBin
}
try {
return !!(new WebSocket(protocol + '://.').binaryType)
} catch (e) {
}
}
return false
})
// addTest('pointerevents', function () {
// var bool = false
// var i = domPrefixes.length
// bool = hasEvent('pointerdown')
// while (i-- && !bool) {
// if (hasEvent(domPrefixes[i] + 'pointerdown')) {
// bool = true
// }
// }
// return bool
// })
addTest('devicemotion', 'DeviceMotionEvent' in window)
addTest('deviceorientation', 'DeviceOrientationEvent' in window)
return service
}

View file

@ -0,0 +1,11 @@
describe('GuestBrowser', function() {
beforeEach(module('stf.guest-browser'));
it('should ...', inject(function(GuestDeviceService) {
//expect(GuestDeviceService.doSomething()).toEqual('something');
}));
})

View file

@ -0,0 +1,4 @@
module.exports = angular.module('stf.guest-browser', [
])
.factory('GuestBrowser', require('./guest-browser-service'))

View file

@ -22,7 +22,8 @@ module.exports = angular.module('layout', [
'fa.directive.borderLayout',
'angular-loading-bar',
require('stf/common-ui').name,
require('stf/socket/socket-state').name
require('stf/socket/socket-state').name,
require('stf/guest-browser').name
])
.config(['$tooltipProvider', function ($tooltipProvider) {
$tooltipProvider.options({

View file

@ -1,3 +1,3 @@
module.exports = function LayoutCtrl(FatalMessageService) {
module.exports = function LayoutCtrl(FatalMessageService, GuestBrowser, $scope) {
$scope.guestBrowser = GuestBrowser
}

View file

@ -10,6 +10,7 @@ html
div(ng-include='"menu.jade"')
socket-state
div(growl)
div(pane, pane-anchor='center').fill-height
div(ng-view).fill-height