From a6ceae4045327797a6b1e59aeaa8989e1e9fe3e6 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 4 Dec 2015 13:53:45 -0800 Subject: [PATCH 1/4] [Common UI] Show warning at startup Show a warning about unsupported browsers at startup, https://github.com/nasa/openmctweb/issues/137 --- platform/commonUI/general/bundle.json | 4 ++ .../general/src/UnsupportedBrowserWarning.js | 57 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 platform/commonUI/general/src/UnsupportedBrowserWarning.js diff --git a/platform/commonUI/general/bundle.json b/platform/commonUI/general/bundle.json index 5976b912cc..dc4d844bc7 100644 --- a/platform/commonUI/general/bundle.json +++ b/platform/commonUI/general/bundle.json @@ -19,6 +19,10 @@ { "implementation": "StyleSheetLoader.js", "depends": [ "stylesheets[]", "$document", "THEME" ] + }, + { + "implementation": "UnsupportedBrowserWarning.js", + "depends": [ "notificationService" ] } ], "stylesheets": [ diff --git a/platform/commonUI/general/src/UnsupportedBrowserWarning.js b/platform/commonUI/general/src/UnsupportedBrowserWarning.js new file mode 100644 index 0000000000..a131f8c973 --- /dev/null +++ b/platform/commonUI/general/src/UnsupportedBrowserWarning.js @@ -0,0 +1,57 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define*/ + +/** + * This bundle provides various general-purpose UI elements, including + * platform styling. + * @namespace platform/commonUI/general + */ +define( + [], + function () { + "use strict"; + + var WARNING_TITLE = "Unsupported browser", + WARNING_DESCRIPTION = [ + "This software has been developed and tested", + "using the latest Google Chrome,", + "and may be unstable in other browsers." + ].join(" "); + + /** + * Shows a warning if a user's browser is unsupported. + * @memberof platform/commonUI/general + * @constructor + * @param {NotificationService} notificationService the notification + * service + */ + function UnsupportedBrowserWarning(notificationService) { + notificationService.alert({ + title: WARNING_TITLE, + actionText: WARNING_DESCRIPTION + }); + } + + return UnsupportedBrowserWarning; + } +); From 37890280aeb3d34106869c3cb15c017099af949a Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 4 Dec 2015 14:08:42 -0800 Subject: [PATCH 2/4] [Common UI] Only show warning for unsupported browsers --- platform/commonUI/general/bundle.json | 2 +- .../general/src/UnsupportedBrowserWarning.js | 19 +++++++++++++------ platform/commonUI/mobile/src/AgentService.js | 13 +++++++++++++ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/platform/commonUI/general/bundle.json b/platform/commonUI/general/bundle.json index dc4d844bc7..76814df12a 100644 --- a/platform/commonUI/general/bundle.json +++ b/platform/commonUI/general/bundle.json @@ -22,7 +22,7 @@ }, { "implementation": "UnsupportedBrowserWarning.js", - "depends": [ "notificationService" ] + "depends": [ "notificationService", "agentService" ] } ], "stylesheets": [ diff --git a/platform/commonUI/general/src/UnsupportedBrowserWarning.js b/platform/commonUI/general/src/UnsupportedBrowserWarning.js index a131f8c973..f2fa0c3f20 100644 --- a/platform/commonUI/general/src/UnsupportedBrowserWarning.js +++ b/platform/commonUI/general/src/UnsupportedBrowserWarning.js @@ -36,7 +36,9 @@ define( "This software has been developed and tested", "using the latest Google Chrome,", "and may be unstable in other browsers." - ].join(" "); + ].join(" "), + MOBILE_BROWSER = "Safari", + DESKTOP_BROWSER = "Chrome"; /** * Shows a warning if a user's browser is unsupported. @@ -45,11 +47,16 @@ define( * @param {NotificationService} notificationService the notification * service */ - function UnsupportedBrowserWarning(notificationService) { - notificationService.alert({ - title: WARNING_TITLE, - actionText: WARNING_DESCRIPTION - }); + function UnsupportedBrowserWarning(notificationService, agentService) { + var testToBrowser = agentService.isMobile() ? + MOBILE_BROWSER : DESKTOP_BROWSER; + + if (!agentService.isBrowser(testToBrowser)) { + notificationService.alert({ + title: WARNING_TITLE, + actionText: WARNING_DESCRIPTION + }); + } } return UnsupportedBrowserWarning; diff --git a/platform/commonUI/mobile/src/AgentService.js b/platform/commonUI/mobile/src/AgentService.js index 26bb173ee7..109520d8bd 100644 --- a/platform/commonUI/mobile/src/AgentService.js +++ b/platform/commonUI/mobile/src/AgentService.js @@ -43,6 +43,7 @@ define( var userAgent = $window.navigator.userAgent, matches = userAgent.match(/iPad|iPhone|Android/i) || []; + this.userAgent = userAgent; this.mobileName = matches[0]; this.$window = $window; } @@ -91,6 +92,18 @@ define( return !this.isPortrait(); }; + /** + * Check if the user agent matches a certain named device, + * as indicated by checking for a case-insensitive substring + * match. + * @param {string} name the name to check for + * @returns {boolean} true if the user agent includes that name + */ + AgentService.prototype.isBrowser = function (name) { + name = name.toLowerCase(); + return this.userAgent.toLowerCase().indexOf(name) !== -1; + }; + return AgentService; } ); From d2a4a85e04258ad40d7723d764d56d1ba391a15d Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 4 Dec 2015 14:12:00 -0800 Subject: [PATCH 3/4] [Common UI] Test agentService.isBrowser --- platform/commonUI/mobile/test/AgentServiceSpec.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/platform/commonUI/mobile/test/AgentServiceSpec.js b/platform/commonUI/mobile/test/AgentServiceSpec.js index c0735e3f4c..573e72ddfb 100644 --- a/platform/commonUI/mobile/test/AgentServiceSpec.js +++ b/platform/commonUI/mobile/test/AgentServiceSpec.js @@ -81,6 +81,13 @@ define( expect(agentService.isPortrait()).toBeTruthy(); expect(agentService.isLandscape()).toBeFalsy(); }); + + it("allows for checking browser type", function () { + testWindow.navigator.userAgent = "Chromezilla Safarifox"; + agentService = new AgentService(testWindow); + expect(agentService.isBrowser("Chrome")).toBe(true); + expect(agentService.isBrowser("Firefox")).toBe(false); + }); }); } ); From fc729279ec73f4ba6892f5155accf3f440369859 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 4 Dec 2015 15:11:40 -0800 Subject: [PATCH 4/4] [Common UI] Add spec for unsupported browser warning --- .../test/UnsupportedBrowserWarningSpec.js | 98 +++++++++++++++++++ platform/commonUI/general/test/suite.json | 3 +- 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 platform/commonUI/general/test/UnsupportedBrowserWarningSpec.js diff --git a/platform/commonUI/general/test/UnsupportedBrowserWarningSpec.js b/platform/commonUI/general/test/UnsupportedBrowserWarningSpec.js new file mode 100644 index 0000000000..507a92c62f --- /dev/null +++ b/platform/commonUI/general/test/UnsupportedBrowserWarningSpec.js @@ -0,0 +1,98 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +define( + ["../src/UnsupportedBrowserWarning"], + function (UnsupportedBrowserWarning) { + "use strict"; + + var MOBILE_BROWSER = "Safari", + DESKTOP_BROWSER = "Chrome", + UNSUPPORTED_BROWSERS = [ + "Firefox", + "IE", + "Opera", + "Iceweasel" + ]; + + describe("The unsupported browser warning", function () { + var mockNotificationService, + mockAgentService, + testAgent; + + function instantiateWith(browser) { + testAgent = "Mozilla/5.0 " + browser + "/12.34.56"; + return new UnsupportedBrowserWarning( + mockNotificationService, + mockAgentService + ); + } + + beforeEach(function () { + testAgent = "chrome"; + mockNotificationService = jasmine.createSpyObj( + "notificationService", + [ "alert" ] + ); + mockAgentService = jasmine.createSpyObj( + "agentService", + [ "isMobile", "isBrowser" ] + ); + mockAgentService.isBrowser.andCallFake(function (substr) { + substr = substr.toLowerCase(); + return testAgent.toLowerCase().indexOf(substr) !== -1; + }); + }); + + [ false, true ].forEach(function (isMobile) { + var deviceType = isMobile ? "mobile" : "desktop", + goodBrowser = isMobile ? MOBILE_BROWSER : DESKTOP_BROWSER, + badBrowsers = UNSUPPORTED_BROWSERS.concat([ + isMobile ? DESKTOP_BROWSER : MOBILE_BROWSER + ]); + + describe("on " + deviceType + " devices", function () { + beforeEach(function () { + mockAgentService.isMobile.andReturn(isMobile); + }); + + it("is not shown for " + goodBrowser, function () { + instantiateWith(goodBrowser); + expect(mockNotificationService.alert) + .not.toHaveBeenCalled(); + }); + + badBrowsers.forEach(function (badBrowser) { + it("is shown for " + badBrowser, function () { + instantiateWith(badBrowser); + expect(mockNotificationService.alert) + .toHaveBeenCalled(); + }); + }); + }); + }); + + }); + } +); + diff --git a/platform/commonUI/general/test/suite.json b/platform/commonUI/general/test/suite.json index 6b89f83d61..d942ef3170 100644 --- a/platform/commonUI/general/test/suite.json +++ b/platform/commonUI/general/test/suite.json @@ -22,5 +22,6 @@ "services/Popup", "services/PopupService", "services/UrlService", - "StyleSheetLoader" + "StyleSheetLoader", + "UnsupportedBrowserWarning" ]