| /* |
| * noVNC: HTML5 VNC client |
| * Copyright (C) 2018 The noVNC Authors |
| * Licensed under MPL 2.0 (see LICENSE.txt) |
| * |
| * See README.md for usage and integration instructions. |
| */ |
| |
| import * as Log from './logging.js'; |
| |
| // Touch detection |
| export let isTouchDevice = ('ontouchstart' in document.documentElement) || |
| // requried for Chrome debugger |
| (document.ontouchstart !== undefined) || |
| // required for MS Surface |
| (navigator.maxTouchPoints > 0) || |
| (navigator.msMaxTouchPoints > 0); |
| window.addEventListener('touchstart', function onFirstTouch() { |
| isTouchDevice = true; |
| window.removeEventListener('touchstart', onFirstTouch, false); |
| }, false); |
| |
| |
| // The goal is to find a certain physical width, the devicePixelRatio |
| // brings us a bit closer but is not optimal. |
| export let dragThreshold = 10 * (window.devicePixelRatio || 1); |
| |
| let _supportsCursorURIs = false; |
| |
| try { |
| const target = document.createElement('canvas'); |
| target.style.cursor = 'url("data:image/x-icon;base64,AAACAAEACAgAAAIAAgA4AQAAFgAAACgAAAAIAAAAEAAAAAEAIAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAA==") 2 2, default'; |
| |
| if (target.style.cursor) { |
| Log.Info("Data URI scheme cursor supported"); |
| _supportsCursorURIs = true; |
| } else { |
| Log.Warn("Data URI scheme cursor not supported"); |
| } |
| } catch (exc) { |
| Log.Error("Data URI scheme cursor test exception: " + exc); |
| } |
| |
| export const supportsCursorURIs = _supportsCursorURIs; |
| |
| let _supportsImageMetadata = false; |
| try { |
| new ImageData(new Uint8ClampedArray(4), 1, 1); |
| _supportsImageMetadata = true; |
| } catch (ex) { |
| // ignore failure |
| } |
| export const supportsImageMetadata = _supportsImageMetadata; |
| |
| export function isMac() { |
| return navigator && !!(/mac/i).exec(navigator.platform); |
| } |
| |
| export function isWindows() { |
| return navigator && !!(/win/i).exec(navigator.platform); |
| } |
| |
| export function isIOS() { |
| return navigator && |
| (!!(/ipad/i).exec(navigator.platform) || |
| !!(/iphone/i).exec(navigator.platform) || |
| !!(/ipod/i).exec(navigator.platform)); |
| } |
| |
| export function isAndroid() { |
| return navigator && !!(/android/i).exec(navigator.userAgent); |
| } |
| |
| export function isSafari() { |
| return navigator && (navigator.userAgent.indexOf('Safari') !== -1 && |
| navigator.userAgent.indexOf('Chrome') === -1); |
| } |
| |
| export function isIE() { |
| return navigator && !!(/trident/i).exec(navigator.userAgent); |
| } |
| |
| export function isEdge() { |
| return navigator && !!(/edge/i).exec(navigator.userAgent); |
| } |
| |
| export function isFirefox() { |
| return navigator && !!(/firefox/i).exec(navigator.userAgent); |
| } |
| |