From 6eb3911a67af581fa72805476af17fcb69374b34 Mon Sep 17 00:00:00 2001 From: Jeff Parsons Date: Sun, 16 Nov 2014 11:36:42 -0800 Subject: [PATCH] Added mobile browser detection to disable FileReader controls on mobile devices While support for local disk images and other local resources can work on some mobile devices, I don't think the use cases warrant the extra (largely wasted) screen space --- modules/c1pjs/lib/serial.js | 4 ++-- modules/pcjs/lib/fdc.js | 14 +++++--------- modules/pcjs/lib/keyboard.js | 4 ++-- modules/shared/lib/weblib.js | 14 ++++++++++++++ 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/modules/c1pjs/lib/serial.js b/modules/c1pjs/lib/serial.js index 02df5f8b2..d7fea809b 100644 --- a/modules/c1pjs/lib/serial.js +++ b/modules/c1pjs/lib/serial.js @@ -129,9 +129,9 @@ C1PSerialPort.prototype.setBinding = function(sHTMLType, sBinding, control) case "mountSerial": /* - * Check for availability of FileReader + * Check for non-mobile (desktop) browser and the availability of FileReader */ - if (window && 'FileReader' in window) { + if (!web.isMobile() && window && 'FileReader' in window) { this.bindings[sBinding] = control; /* diff --git a/modules/pcjs/lib/fdc.js b/modules/pcjs/lib/fdc.js index bf9dcbe90..d007caab3 100644 --- a/modules/pcjs/lib/fdc.js +++ b/modules/pcjs/lib/fdc.js @@ -173,10 +173,11 @@ function FDC(parmsFDC) { this.aDiskHistory = []; /* - * If setBinding() sees a binding for loading local disks, it will set this flag, and then initBus() - * can intelligently update the "listDisks" control accordingly. + * Support for local disk images is currently limited to desktop browsers with FileReader support; + * when this flag is set, setBinding() allows local disk bindings and informs initBus() to update the + * "listDisks" binding accordingly. */ - this.fLocalDisks = false; + this.fLocalDisks = (!web.isMobile() && window && 'FileReader' in window); /* * The remainder of FDC initialization now takes place in our initBus() handler, largely because we @@ -473,13 +474,8 @@ FDC.prototype.setBinding = function(sHTMLType, sBinding, control) return true; case "mountDrive": - /* - * Check for availability of FileReader - */ - if (window && 'FileReader' in window) { - this.fLocalDisks = true; + if (this.fLocalDisks) { this.bindings[sBinding] = control; - /* * Enable "Mount" button only if a file is actually selected */ diff --git a/modules/pcjs/lib/keyboard.js b/modules/pcjs/lib/keyboard.js index 3b1f68ae1..315689d17 100644 --- a/modules/pcjs/lib/keyboard.js +++ b/modules/pcjs/lib/keyboard.js @@ -949,10 +949,10 @@ Keyboard.prototype.setModel = function(nModel) Keyboard.prototype.setReady = function() { this.iOS = web.isUserAgent("iOS"); - this.fMobile = (this.iOS || web.isUserAgent("Android")); + this.fMobile = web.isMobile(); this.messageDebugger("mobile keyboard support: " + (this.fMobile? "true" : "false")); /* - * TODO: Determine how to declare this superclass method in order to avoid a type warning + * TODO: Determine how to declare this superclass method in order to avoid a type warning in WebStorm */ return Component.prototype.setReady.call(this); }; diff --git a/modules/shared/lib/weblib.js b/modules/shared/lib/weblib.js index 9b7b85f4c..ac36f3073 100644 --- a/modules/shared/lib/weblib.js +++ b/modules/shared/lib/weblib.js @@ -549,6 +549,20 @@ web.isUserAgent = function(s) return false; }; +/** + * isMobile() + * + * Check the browser's user-agent string for the substring "Mobi", as per Mozilla recommendation: + * + * https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent + * + * @return {boolean} is true if the browser appears to be a mobile (ie, non-desktop) web browser, false if not + */ +web.isMobile = function() +{ + return web.isUserAgent("Mobi"); +}; + /** * getURLParameters(sParms) *