171 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/** Report capabilities with guaranteed values.
 | 
						|
 */
 | 
						|
export class Capabilities {
 | 
						|
    /** Returns the browser userAgent.
 | 
						|
    @return {string}
 | 
						|
    */
 | 
						|
    static get userAgent() {
 | 
						|
        return navigator.userAgent || 'Unknown Agent'
 | 
						|
    }
 | 
						|
 | 
						|
    /** Tests whether the app is running on a mobile device.
 | 
						|
    Implemented as a readonly attribute.
 | 
						|
    @return {boolean}
 | 
						|
    */
 | 
						|
    static get isMobile() {
 | 
						|
        return /Mobi/.test(navigator.userAgent)
 | 
						|
    }
 | 
						|
 | 
						|
    /** Tests whether the app is running on a iOS device.
 | 
						|
    Implemented as a readonly attribute.
 | 
						|
    @return {boolean}
 | 
						|
    */
 | 
						|
    static get isIOS() {
 | 
						|
        return /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream
 | 
						|
    }
 | 
						|
 | 
						|
    /** Tests whether the app is running in a Safari environment.
 | 
						|
    See https://stackoverflow.com/questions/7944460/detect-safari-browser
 | 
						|
    Implemented as a readonly attribute.
 | 
						|
    @return {boolean}
 | 
						|
    */
 | 
						|
    static get isSafari() {
 | 
						|
        return (
 | 
						|
            navigator.vendor &&
 | 
						|
            navigator.vendor.indexOf('Apple') > -1 &&
 | 
						|
            navigator.userAgent &&
 | 
						|
            !navigator.userAgent.match('CriOS')
 | 
						|
        )
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Distincts if the app is running inside electron or not.
 | 
						|
     *
 | 
						|
     * source: https://github.com/cheton/is-electron
 | 
						|
     */
 | 
						|
    static get isElectron() {
 | 
						|
        // Renderer process
 | 
						|
        if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') {
 | 
						|
            return true
 | 
						|
        }
 | 
						|
 | 
						|
        // Main process
 | 
						|
        if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) {
 | 
						|
            return true
 | 
						|
        }
 | 
						|
 | 
						|
        // Detect the user agent when the `nodeIntegration` option is set to true
 | 
						|
        if (
 | 
						|
            typeof navigator === 'object' &&
 | 
						|
            typeof navigator.userAgent === 'string' &&
 | 
						|
            navigator.userAgent.indexOf('Electron') >= 0
 | 
						|
        ) {
 | 
						|
            return true
 | 
						|
        }
 | 
						|
 | 
						|
        return false
 | 
						|
    }
 | 
						|
 | 
						|
    /** Returns the display resolution. Necessary for retina displays.
 | 
						|
    @return {number}
 | 
						|
    */
 | 
						|
    static get devicePixelRatio() {
 | 
						|
        return window.devicePixelRatio || 1
 | 
						|
    }
 | 
						|
 | 
						|
    /** Returns true if the device is a multi-touch table. This method is currently not universal usable and not sure!
 | 
						|
    @return {boolean}
 | 
						|
    */
 | 
						|
    static get isMultiTouchTable() {
 | 
						|
        return (
 | 
						|
            Capabilities.devicePixelRatio > 2 &&
 | 
						|
            Capabilities.isMobile === false &&
 | 
						|
            /Windows/i.test(Capabilities.userAgent)
 | 
						|
        )
 | 
						|
    }
 | 
						|
 | 
						|
    /** Returns true if mouse events are supported
 | 
						|
    @return {boolean}
 | 
						|
    */
 | 
						|
    static supportsMouseEvents() {
 | 
						|
        return typeof window.MouseEvent != 'undefined'
 | 
						|
    }
 | 
						|
 | 
						|
    /** Returns true if touch events are supported
 | 
						|
    @return {boolean}
 | 
						|
    */
 | 
						|
    static supportsTouchEvents() {
 | 
						|
        return typeof window.TouchEvent != 'undefined'
 | 
						|
    }
 | 
						|
 | 
						|
    /** Returns true if pointer events are supported
 | 
						|
    @return {boolean}
 | 
						|
    */
 | 
						|
    static supportsPointerEvents() {
 | 
						|
        return typeof window.PointerEvent != 'undefined'
 | 
						|
    }
 | 
						|
 | 
						|
    /** Returns true if DOM templates are supported
 | 
						|
    @return {boolean}
 | 
						|
    */
 | 
						|
    static supportsTemplate() {
 | 
						|
        return 'content' in document.createElement('template')
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/** Basic tests for Capabilities.
 | 
						|
 */
 | 
						|
export class CapabilitiesTests {
 | 
						|
    static testConfirm() {
 | 
						|
        let bool = confirm('Please confirm')
 | 
						|
        document.getElementById('demo').innerHTML = bool ? 'Confirmed' : 'Not confirmed'
 | 
						|
    }
 | 
						|
 | 
						|
    static testPrompt() {
 | 
						|
        let person = prompt('Please enter your name', 'Harry Potter')
 | 
						|
        if (person != null) {
 | 
						|
            demo.innerHTML = 'Hello ' + person + '! How are you today?'
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    static testUserAgent() {
 | 
						|
        let agent = 'User-agent: ' + Capabilities.userAgent
 | 
						|
        user_agent.innerHTML = agent
 | 
						|
    }
 | 
						|
 | 
						|
    static testDevicePixelRatio() {
 | 
						|
        let value = 'Device Pixel Ratio: ' + Capabilities.devicePixelRatio
 | 
						|
        device_pixel_ratio.innerHTML = value
 | 
						|
    }
 | 
						|
 | 
						|
    static testMultiTouchTable() {
 | 
						|
        let value = 'Is the device a multi-touch table? ' + Capabilities.isMultiTouchTable
 | 
						|
        multi_touch_table.innerHTML = value
 | 
						|
    }
 | 
						|
 | 
						|
    static testSupportedEvents() {
 | 
						|
        let events = []
 | 
						|
        if (Capabilities.supportsMouseEvents()) {
 | 
						|
            events.push('MouseEvents')
 | 
						|
        }
 | 
						|
        if (Capabilities.supportsTouchEvents()) {
 | 
						|
            events.push('TouchEvents')
 | 
						|
        }
 | 
						|
        if (Capabilities.supportsPointerEvents()) {
 | 
						|
            events.push('PointerEvents')
 | 
						|
        }
 | 
						|
        supported_events.innerHTML = 'Supported Events: ' + events.join(', ')
 | 
						|
    }
 | 
						|
 | 
						|
    static testAll() {
 | 
						|
        this.testUserAgent()
 | 
						|
        this.testDevicePixelRatio()
 | 
						|
        this.testMultiTouchTable()
 | 
						|
        this.testSupportedEvents()
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/* Optional global variables, needed in DocTests. */
 | 
						|
window.Capabilities = Capabilities
 | 
						|
window.CapabilitiesTests = CapabilitiesTests
 |