From 46921fbaee7e18f28e7371f28e9129da6f2de5e0 Mon Sep 17 00:00:00 2001 From: Shane Tomlinson Date: Wed, 25 Oct 2017 12:49:47 +0100 Subject: [PATCH] fix(logo): Use the new Firefox logo in Fx Desktop/Android >= 57, iOS >= 10. (#5643) r=@vbudhram, @ryanfeeley Do some UA sniffing on startup to add the "fx-57" class to the HTML element. If "fx-57" exists, display the new logo. fixes #5588 --- app/favicon-pre57.ico | Bin 0 -> 15086 bytes app/favicon.ico | Bin 15086 -> 67751 bytes app/images/firefox-logo.svg | 1 + app/scripts/head/startup-styles.js | 10 ++ app/scripts/lib/environment.js | 34 ++++++ app/styles/modules/_branding.scss | 8 ++ app/styles/modules/_settings.scss | 9 +- app/tests/spec/head/startup-styles.js | 34 ++++++ app/tests/spec/lib/environment.js | 34 ++++++ server/lib/routes.js | 1 + server/lib/routes/get-favicon.js | 30 +++++ tests/functional/lib/ua-strings.js | 4 + tests/intern_server.js | 1 + tests/server/routes/get-favicon.js | 164 ++++++++++++++++++++++++++ 14 files changed, 329 insertions(+), 1 deletion(-) create mode 100644 app/favicon-pre57.ico create mode 100644 app/images/firefox-logo.svg create mode 100644 server/lib/routes/get-favicon.js create mode 100644 tests/server/routes/get-favicon.js diff --git a/app/favicon-pre57.ico b/app/favicon-pre57.ico new file mode 100644 index 0000000000000000000000000000000000000000..ae5084bc03888f4e21da00633b349507248780ac GIT binary patch literal 15086 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 BA8G&q literal 0 HcmV?d00001 diff --git a/app/favicon.ico b/app/favicon.ico index ae5084bc03888f4e21da00633b349507248780ac..3d7ffcd86a8d09c1adc94e351788abd4c546c869 100644 GIT binary patch literal 67751 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

3X+orei`$@;AIlhAhXcin40k)>%LL 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 LNkvXXu0mjfU8~6= literal 15086 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 BA8G&q diff --git a/app/images/firefox-logo.svg b/app/images/firefox-logo.svg new file mode 100644 index 000000000..d494a8717 --- /dev/null +++ b/app/images/firefox-logo.svg @@ -0,0 +1 @@ +firefox-logo \ No newline at end of file diff --git a/app/scripts/head/startup-styles.js b/app/scripts/head/startup-styles.js index 38b4203b4..5e0d0aba9 100644 --- a/app/scripts/head/startup-styles.js +++ b/app/scripts/head/startup-styles.js @@ -83,6 +83,7 @@ this.addSearchParamStyles(); this.addFxiOSSyncStyles(); this.addGetUserMediaStyles(); + this.addFx57Styles(); }, addJSStyle: function () { @@ -142,6 +143,15 @@ } else { this._addClass('no-getusermedia'); } + }, + + /** + * Add the `fx-57` class to the body if in Fx >= 57. + */ + addFx57Styles: function () { + if (this.environment.isFx57OrAbove() || this.environment.isFxiOS10OrAbove()) { + this._addClass('fx-57'); + } } }; diff --git a/app/scripts/lib/environment.js b/app/scripts/lib/environment.js index b85e593d2..0a2bf1765 100644 --- a/app/scripts/lib/environment.js +++ b/app/scripts/lib/environment.js @@ -108,6 +108,40 @@ return /FxiOS/.test(this.window.navigator.userAgent); }, + /** + * Is the user in Firefox for iOS 10 or above? + * + * @param {String} [userAgent=navigator.userAgent] UA string + * @returns {Boolean} + */ + isFxiOS10OrAbove: function (userAgent) { + var fxRegExp = /FxiOS\/(\d{2,}\.\d{1,})/; + var matches = fxRegExp.exec(userAgent || this.window.navigator.userAgent); + + if (matches && matches[1]) { + return parseFloat(matches[1]) >= 10; + } + + return false; + }, + + /** + * Is the user in Firefox (Desktop or Android) 57 or above? + * + * @param {String} [userAgent=navigator.userAgent] UA string + * @returns {Boolean} + */ + isFx57OrAbove: function (userAgent) { + var fxRegExp = /Firefox\/(\d{2,}\.\d{1,})$/; + var matches = fxRegExp.exec(userAgent || this.window.navigator.userAgent); + + if (matches && matches[1]) { + return parseFloat(matches[1]) >= 57; + } + + return false; + }, + hasSendBeacon: function () { return typeof this.window.navigator.sendBeacon === 'function'; } diff --git a/app/styles/modules/_branding.scss b/app/styles/modules/_branding.scss index 68e15d63c..9a4fbf6cd 100644 --- a/app/styles/modules/_branding.scss +++ b/app/styles/modules/_branding.scss @@ -26,6 +26,14 @@ display: none; } + html.fx-57 & { + background-image: image-url('firefox-logo.svg'); + background-position-y: -5px; + @include respond-to('small') { + background-position-y: -4px; + } + } + .static & { opacity: 1; } diff --git a/app/styles/modules/_settings.scss b/app/styles/modules/_settings.scss index 7ac19f599..3d954d081 100644 --- a/app/styles/modules/_settings.scss +++ b/app/styles/modules/_settings.scss @@ -40,6 +40,14 @@ body.settings #main-content.card { background-repeat: no-repeat; margin: 0; + html.fx-57 & { + background-image: image-url('firefox-logo.svg'); + background-position-y: -5px; + @include respond-to('small') { + background-position-y: -4px; + } + } + html[dir='ltr'] & { float: left; } @@ -78,7 +86,6 @@ body.settings #main-content.card { background-position: right 8px; padding-right: 36px; } - } } diff --git a/app/tests/spec/head/startup-styles.js b/app/tests/spec/head/startup-styles.js index 39f990b25..ec24cf058 100644 --- a/app/tests/spec/head/startup-styles.js +++ b/app/tests/spec/head/startup-styles.js @@ -178,6 +178,40 @@ define(function (require, exports, module) { }); }); + describe('addFx57Styles', () => { + it('adds `fx-57` if UA is Fx >= 57', () => { + sinon.stub(environment, 'isFx57OrAbove').callsFake(() => true); + sinon.stub(environment, 'isFxiOS10OrAbove').callsFake(() => false); + + startupStyles.addFx57Styles(); + assert.isTrue(/fx-57/.test(startupStyles.getClassName())); + }); + + it('does not add `fx-57` if UA is Fx <= 56', () => { + sinon.stub(environment, 'isFx57OrAbove').callsFake(() => false); + sinon.stub(environment, 'isFxiOS10OrAbove').callsFake(() => false); + + startupStyles.addFx57Styles(); + assert.isFalse(/fx-57/.test(startupStyles.getClassName())); + }); + + it('adds `fx-57` if UA is FxiOS >= 10', () => { + sinon.stub(environment, 'isFx57OrAbove').callsFake(() => false); + sinon.stub(environment, 'isFxiOS10OrAbove').callsFake(() => true); + + startupStyles.addFx57Styles(); + assert.isTrue(/fx-57/.test(startupStyles.getClassName())); + }); + + it('does not add `fx-57` if UA is FxiOS <= 9', () => { + sinon.stub(environment, 'isFx57OrAbove').callsFake(() => false); + sinon.stub(environment, 'isFxiOS10OrAbove').callsFake(() => false); + + startupStyles.addFx57Styles(); + assert.isFalse(/fx-57/.test(startupStyles.getClassName())); + }); + + }); describe('initialize', function () { it('runs all the tests', function () { diff --git a/app/tests/spec/lib/environment.js b/app/tests/spec/lib/environment.js index 97d8c75b0..574134f28 100644 --- a/app/tests/spec/lib/environment.js +++ b/app/tests/spec/lib/environment.js @@ -159,6 +159,40 @@ define(function (require, exports, module) { }); }); + describe('isFxiOS10OrAbove', function () { + it('returns `false` if on Fx 10 or above, false otw', function () { + assert.isFalse(environment.isFxiOS10OrAbove('FxiOS/9.0')); + assert.isTrue(environment.isFxiOS10OrAbove('FxiOS/10.0')); + assert.isTrue(environment.isFxiOS10OrAbove('FxiOS/11.0')); + assert.isFalse(environment.isFxiOS('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:40.0) Gecko/20100101 Firefox/40.0')); + }); + }); + + describe('isFx57OrAbove', () => { + it('returns `true` if Fx Desktop 57 or above', () => { + assert.isTrue(environment.isFx57OrAbove('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:57.0) Gecko/20100101 Firefox/57.0')); + assert.isTrue(environment.isFx57OrAbove('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:58.0) Gecko/20100101 Firefox/58.0')); + assert.isTrue(environment.isFx57OrAbove('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:101.0) Gecko/20100101 Firefox/101.0')); + assert.isTrue(environment.isFx57OrAbove('Mozilla/5.0 (Windows NT x.y; WOW64; rv:101.0) Gecko/20100101 Firefox/101.0')); + }); + + it('returns `true` if Fx for Android 57 or above', () => { + assert.isTrue(environment.isFx57OrAbove('Mozilla/5.0 (Android 4.4; Mobile; rv:57.0) Gecko/57.0 Firefox/57.0')); + assert.isTrue(environment.isFx57OrAbove('Mozilla/5.0 (Android 4.4; Mobile; rv:57.0) Gecko/58.0 Firefox/58.0')); + assert.isTrue(environment.isFx57OrAbove('Mozilla/5.0 (Android 4.4; Mobile; rv:57.0) Gecko/999.0 Firefox/999.0')); + }); + + it('returns `false` otw', () => { + assert.isFalse(environment.isFx57OrAbove('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:40.0) Gecko/20100101 Firefox/40.0')); + assert.isFalse(environment.isFx57OrAbove('Mozilla/5.0 (Windows NT x.y; WOW64; rv:10.0) Gecko/20100101 Firefox/10.0')); + assert.isFalse(environment.isFx57OrAbove('Mozilla/5.0 (Android; Mobile; rv:40.0) Gecko/40.0 Firefox/40.0')); + assert.isFalse(environment.isFx57OrAbove('Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0')); + assert.isFalse(environment.isFx57OrAbove('Mozilla/5.0 (Android 4.4; Mobile; rv:56.0) Gecko/56.0 Firefox/56.0')); + assert.isFalse(environment.isFx57OrAbove( + 'Mozilla/5.0 (iPod touch; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/1.0 Mobile/12F69 Safari/600.1.4')); + }); + }); + describe('hasSendBeacon', function () { it('returns `true` if sendBeacon function exists', function () { windowMock.navigator.sendBeacon = function () {}; diff --git a/server/lib/routes.js b/server/lib/routes.js index 1e4f55566..ef426e63a 100644 --- a/server/lib/routes.js +++ b/server/lib/routes.js @@ -32,6 +32,7 @@ module.exports = function (config, i18n) { // Disable server verification for now due to issues with customs //require('./routes/get-verify-email')(), require('./routes/get-apple-app-site-association')(), + require('./routes/get-favicon')(), require('./routes/get-frontend')(), require('./routes/get-terms-privacy')(i18n), require('./routes/get-index')(config), diff --git a/server/lib/routes/get-favicon.js b/server/lib/routes/get-favicon.js new file mode 100644 index 000000000..df96745b7 --- /dev/null +++ b/server/lib/routes/get-favicon.js @@ -0,0 +1,30 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Serve up the favicon. A temporary route to serve the Fx 57 logo to + * only Fx >= 57 until the logo is publicly released. + */ + +const uaParser = require('node-uap'); + +function shouldSee57Icon(uaHeader) { + const agent = uaParser.parse(uaHeader); + return (agent.ua.family === 'Firefox' && parseInt(agent.ua.major, 10) >= 57) || + (agent.ua.family === 'Firefox Mobile' && parseInt(agent.ua.major, 10) >= 57) || + (agent.ua.family === 'Firefox iOS' && parseInt(agent.ua.major, 10) >= 10); +} + +module.exports = function () { + return { + method: 'get', + path: '/favicon.ico', + process: (req, res, next) => { + if (! shouldSee57Icon(req.headers['user-agent'] || '')) { + req.url = 'favicon-pre57.ico'; + } + next(); + } + }; +}; diff --git a/tests/functional/lib/ua-strings.js b/tests/functional/lib/ua-strings.js index f7dfadc5d..f5a89f546 100644 --- a/tests/functional/lib/ua-strings.js +++ b/tests/functional/lib/ua-strings.js @@ -7,6 +7,8 @@ define([], function () { return { 'android_chrome': 'Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19', 'android_firefox': 'Mozilla/5.0 (Android 4.4; Mobile; rv:43.0) Gecko/41.0 Firefox/43.0', + 'android_firefox_56': 'Mozilla/5.0 (Android 4.4; Mobile; rv:56.0) Gecko/56.0 Firefox/56.0', + 'android_firefox_57': 'Mozilla/5.0 (Android 4.4; Mobile; rv:57.0) Gecko/57.0 Firefox/57.0', 'desktop_chrome': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.59 Safari/537.36', 'desktop_firefox': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:50.0) Gecko/20100101 Firefox/50.0', 'desktop_firefox_55': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0', @@ -16,6 +18,8 @@ define([], function () { 'ios_firefox': 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/1.0 Mobile/12F69 Safari/600.1.4', 'ios_firefox_6_0': 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/6.0 Mobile/12F69 Safari/600.1.4', 'ios_firefox_6_1': 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/6.1 Mobile/12F69 Safari/600.1.4', + 'ios_firefox_9': 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/9.0 Mobile/12F69 Safari/600.1.4', + 'ios_firefox_10': 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/10.0 Mobile/12F69 Safari/600.1.4', // eslint-disable-line 'ios_safari': 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3' }; /*eslint-enable max-len*/ diff --git a/tests/intern_server.js b/tests/intern_server.js index bdfaca103..5e6c782fc 100644 --- a/tests/intern_server.js +++ b/tests/intern_server.js @@ -33,6 +33,7 @@ define([ 'tests/server/statsd-collector', 'tests/server/raven', 'tests/server/routes/get-apple-app-site-association', + 'tests/server/routes/get-favicon', 'tests/server/routes/get-config', 'tests/server/routes/get-verify-email', 'tests/server/routes/get-fxa-client-configuration', diff --git a/tests/server/routes/get-favicon.js b/tests/server/routes/get-favicon.js new file mode 100644 index 000000000..c3961a534 --- /dev/null +++ b/tests/server/routes/get-favicon.js @@ -0,0 +1,164 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +define([ + 'intern!object', + 'intern/chai!assert', + 'intern/dojo/node!../../../server/lib/routes/get-favicon', + '../../functional/lib/ua-strings', +], function (registerSuite, assert, route, uaStrings) { + let instance, request, response; + + /*eslint-disable sorting/sort-object-props*/ + registerSuite({ + name: 'routes/get-favicon', + + 'route interface is correct': function () { + assert.isFunction(route); + assert.lengthOf(route, 0); + }, + + 'initialise route': { + setup: function () { + instance = route(); + }, + + 'instance interface is correct': function () { + assert.isObject(instance); + assert.lengthOf(Object.keys(instance), 3); + assert.equal(instance.method, 'get'); + assert.equal(instance.path, '/favicon.ico'); + assert.isFunction(instance.process); + assert.lengthOf(instance.process, 3); + }, + + 'route.process': { + 'no user-agent header': { + setup: function () { + request = { + headers: {}, + url: 'favicon.ico' + }; + return new Promise((resolve) => { + instance.process(request, response, resolve); + }); + }, + + 'should see old icon': function () { + assert.equal(request.url, 'favicon-pre57.ico'); + } + }, + + 'Firefox desktop 56': { + setup: function () { + request = { + headers: { + 'user-agent': uaStrings.desktop_firefox_56 + }, + url: 'favicon.ico' + }; + return new Promise((resolve) => { + instance.process(request, response, resolve); + }); + }, + + 'should see old icon': function () { + assert.equal(request.url, 'favicon-pre57.ico'); + } + }, + + 'Firefox desktop 57': { + setup: function () { + request = { + headers: { + 'user-agent': uaStrings.desktop_firefox_57 + }, + url: 'favicon.ico' + }; + return new Promise((resolve) => { + instance.process(request, response, resolve); + }); + }, + + 'should see new icon': function () { + assert.equal(request.url, 'favicon.ico'); + } + }, + + 'Firefox android 56': { + setup: function () { + request = { + headers: { + 'user-agent': uaStrings.android_firefox_56 + }, + url: 'favicon.ico' + }; + return new Promise((resolve) => { + instance.process(request, response, resolve); + }); + }, + + 'should see old icon': function () { + assert.equal(request.url, 'favicon-pre57.ico'); + } + }, + + 'Firefox android 57': { + setup: function () { + request = { + headers: { + 'user-agent': uaStrings.android_firefox_57 + }, + url: 'favicon.ico' + }; + return new Promise((resolve) => { + instance.process(request, response, resolve); + }); + }, + + 'should see new icon': function () { + assert.equal(request.url, 'favicon.ico'); + } + }, + + 'Firefox iOS 9': { + setup: function () { + request = { + headers: { + 'user-agent': uaStrings.ios_firefox_9 + }, + url: 'favicon.ico' + }; + return new Promise((resolve) => { + instance.process(request, response, resolve); + }); + }, + + 'should see old icon': function () { + assert.equal(request.url, 'favicon-pre57.ico'); + } + }, + + 'Firefox iOS 10': { + setup: function () { + request = { + headers: { + 'user-agent': uaStrings.ios_firefox_10 + }, + url: 'favicon.ico' + }; + return new Promise((resolve) => { + instance.process(request, response, resolve); + }); + }, + + 'should see new icon': function () { + assert.equal(request.url, 'favicon.ico'); + } + }, + } + } + }); + /*eslint-enable sorting/sort-object-props*/ +});