diff --git a/res/app/components/stf/guest-browser/guest-browser-service.js b/res/app/components/stf/guest-browser/guest-browser-service.js new file mode 100644 index 00000000..20cdadc4 --- /dev/null +++ b/res/app/components/stf/guest-browser/guest-browser-service.js @@ -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 +} diff --git a/res/app/components/stf/guest-browser/guest-browser-spec.js b/res/app/components/stf/guest-browser/guest-browser-spec.js new file mode 100644 index 00000000..84ae5fe1 --- /dev/null +++ b/res/app/components/stf/guest-browser/guest-browser-spec.js @@ -0,0 +1,11 @@ +describe('GuestBrowser', function() { + + beforeEach(module('stf.guest-browser')); + + it('should ...', inject(function(GuestDeviceService) { + + //expect(GuestDeviceService.doSomething()).toEqual('something'); + + })); + +}) diff --git a/res/app/components/stf/guest-browser/index.js b/res/app/components/stf/guest-browser/index.js new file mode 100644 index 00000000..b0c1c86c --- /dev/null +++ b/res/app/components/stf/guest-browser/index.js @@ -0,0 +1,4 @@ +module.exports = angular.module('stf.guest-browser', [ + +]) + .factory('GuestBrowser', require('./guest-browser-service')) diff --git a/res/app/layout/index.js b/res/app/layout/index.js index 9b167f6f..4b5f76a2 100644 --- a/res/app/layout/index.js +++ b/res/app/layout/index.js @@ -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({ diff --git a/res/app/layout/layout-controller.js b/res/app/layout/layout-controller.js index 59a15943..ea82f162 100644 --- a/res/app/layout/layout-controller.js +++ b/res/app/layout/layout-controller.js @@ -1,3 +1,3 @@ -module.exports = function LayoutCtrl(FatalMessageService) { - +module.exports = function LayoutCtrl(FatalMessageService, GuestBrowser, $scope) { + $scope.guestBrowser = GuestBrowser } diff --git a/res/app/views/index.jade b/res/app/views/index.jade index 9a0d5467..37edbb02 100644 --- a/res/app/views/index.jade +++ b/res/app/views/index.jade @@ -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