Merge branch 'abstraction_for_detection' of https://github.com/samhed/noVNC

This commit is contained in:
Pierre Ossman 2020-01-14 09:45:28 +01:00
commit 2d53a785d5
2 changed files with 38 additions and 7 deletions

View File

@ -8,7 +8,7 @@
import * as Log from '../core/util/logging.js'; import * as Log from '../core/util/logging.js';
import _, { l10n } from './localization.js'; import _, { l10n } from './localization.js';
import { isTouchDevice, isSafari, isIOS, isAndroid, dragThreshold } import { isTouchDevice, isSafari, hasScrollbarGutter, dragThreshold }
from '../core/util/browser.js'; from '../core/util/browser.js';
import { setCapture, getPointerEvent } from '../core/util/events.js'; import { setCapture, getPointerEvent } from '../core/util/events.js';
import KeyTable from "../core/input/keysym.js"; import KeyTable from "../core/input/keysym.js";
@ -1269,8 +1269,9 @@ const UI = {
// Can't be clipping if viewport is scaled to fit // Can't be clipping if viewport is scaled to fit
UI.forceSetting('view_clip', false); UI.forceSetting('view_clip', false);
UI.rfb.clipViewport = false; UI.rfb.clipViewport = false;
} else if (isIOS() || isAndroid()) { } else if (!hasScrollbarGutter) {
// iOS and Android usually have shit scrollbars // Some platforms have scrollbars that are difficult
// to use in our case, so we always use our own panning
UI.forceSetting('view_clip', true); UI.forceSetting('view_clip', true);
UI.rfb.clipViewport = true; UI.rfb.clipViewport = true;
} else { } else {

View File

@ -4,6 +4,8 @@
* Licensed under MPL 2.0 (see LICENSE.txt) * Licensed under MPL 2.0 (see LICENSE.txt)
* *
* See README.md for usage and integration instructions. * See README.md for usage and integration instructions.
*
* Browser feature support detection
*/ */
import * as Log from './logging.js'; import * as Log from './logging.js';
@ -52,6 +54,38 @@ try {
} }
export const supportsImageMetadata = _supportsImageMetadata; export const supportsImageMetadata = _supportsImageMetadata;
let _hasScrollbarGutter = true;
try {
// Create invisible container
const container = document.createElement('div');
container.style.visibility = 'hidden';
container.style.overflow = 'scroll'; // forcing scrollbars
document.body.appendChild(container);
// Create a div and place it in the container
const child = document.createElement('div');
container.appendChild(child);
// Calculate the difference between the container's full width
// and the child's width - the difference is the scrollbars
const scrollbarWidth = (container.offsetWidth - child.offsetWidth);
// Clean up
container.parentNode.removeChild(container);
_hasScrollbarGutter = scrollbarWidth != 0;
} catch (exc) {
Log.Error("Scrollbar test exception: " + exc);
}
export const hasScrollbarGutter = _hasScrollbarGutter;
/*
* The functions for detection of platforms and browsers below are exported
* but the use of these should be minimized as much as possible.
*
* It's better to use feature detection than platform detection.
*/
export function isMac() { export function isMac() {
return navigator && !!(/mac/i).exec(navigator.platform); return navigator && !!(/mac/i).exec(navigator.platform);
} }
@ -67,10 +101,6 @@ export function isIOS() {
!!(/ipod/i).exec(navigator.platform)); !!(/ipod/i).exec(navigator.platform));
} }
export function isAndroid() {
return navigator && !!(/android/i).exec(navigator.userAgent);
}
export function isSafari() { export function isSafari() {
return navigator && (navigator.userAgent.indexOf('Safari') !== -1 && return navigator && (navigator.userAgent.indexOf('Safari') !== -1 &&
navigator.userAgent.indexOf('Chrome') === -1); navigator.userAgent.indexOf('Chrome') === -1);