From bef42d9a36bf465878e0edc19c9e154f73f12b13 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Fri, 5 May 2017 17:59:41 +0000 Subject: Fallback localstorage cases --- app/assets/javascripts/autosave.js | 44 +++---- .../behaviors/gl_emoji/unicode_support_map.js | 17 ++- .../components/recent_searches_dropdown_content.js | 12 +- .../filtered_search/filtered_search_manager.js | 11 +- .../filtered_search_visual_tokens.js | 3 + .../filtered_search/recent_searches_root.js | 7 +- .../services/recent_searches_service.js | 14 +++ .../services/recent_searches_service_error.js | 11 ++ app/assets/javascripts/lib/utils/accessor.js | 47 ++++++++ app/assets/javascripts/signin_tabs_memoizer.js | 12 +- spec/javascripts/autosave_spec.js | 134 +++++++++++++++++++++ .../behaviors/gl_emoji/unicode_support_map_spec.js | 47 ++++++++ .../recent_searches_dropdown_content_spec.js | 20 +++ .../filtered_search_manager_spec.js | 34 ++++++ .../filtered_search/recent_searches_root_spec.js | 31 +++++ .../services/recent_searches_service_error_spec.js | 18 +++ .../services/recent_searches_service_spec.js | 95 ++++++++++++++- spec/javascripts/lib/utils/accessor_spec.js | 78 ++++++++++++ spec/javascripts/signin_tabs_memoizer_spec.js | 90 ++++++++++++++ 19 files changed, 684 insertions(+), 41 deletions(-) create mode 100644 app/assets/javascripts/filtered_search/services/recent_searches_service_error.js create mode 100644 app/assets/javascripts/lib/utils/accessor.js create mode 100644 spec/javascripts/autosave_spec.js create mode 100644 spec/javascripts/behaviors/gl_emoji/unicode_support_map_spec.js create mode 100644 spec/javascripts/filtered_search/recent_searches_root_spec.js create mode 100644 spec/javascripts/filtered_search/services/recent_searches_service_error_spec.js create mode 100644 spec/javascripts/lib/utils/accessor_spec.js diff --git a/app/assets/javascripts/autosave.js b/app/assets/javascripts/autosave.js index 8630b18a73f..cfab6c40b34 100644 --- a/app/assets/javascripts/autosave.js +++ b/app/assets/javascripts/autosave.js @@ -1,8 +1,11 @@ /* eslint-disable func-names, space-before-function-paren, wrap-iife, no-param-reassign, quotes, prefer-template, no-var, one-var, no-unused-vars, one-var-declaration-per-line, no-void, consistent-return, no-empty, max-len */ +import AccessorUtilities from './lib/utils/accessor'; window.Autosave = (function() { function Autosave(field, key) { this.field = field; + this.isLocalStorageAvailable = AccessorUtilities.isLocalStorageAccessSafe(); + if (key.join != null) { key = key.join("/"); } @@ -17,16 +20,12 @@ window.Autosave = (function() { } Autosave.prototype.restore = function() { - var e, text; - if (window.localStorage == null) { - return; - } - try { - text = window.localStorage.getItem(this.key); - } catch (error) { - e = error; - return; - } + var text; + + if (!this.isLocalStorageAvailable) return; + + text = window.localStorage.getItem(this.key); + if ((text != null ? text.length : void 0) > 0) { this.field.val(text); } @@ -35,27 +34,22 @@ window.Autosave = (function() { Autosave.prototype.save = function() { var text; - if (window.localStorage == null) { - return; - } text = this.field.val(); - if ((text != null ? text.length : void 0) > 0) { - try { - return window.localStorage.setItem(this.key, text); - } catch (error) {} - } else { - return this.reset(); + + if (this.isLocalStorageAvailable && (text != null ? text.length : void 0) > 0) { + return window.localStorage.setItem(this.key, text); } + + return this.reset(); }; Autosave.prototype.reset = function() { - if (window.localStorage == null) { - return; - } - try { - return window.localStorage.removeItem(this.key); - } catch (error) {} + if (!this.isLocalStorageAvailable) return; + + return window.localStorage.removeItem(this.key); }; return Autosave; })(); + +export default window.Autosave; diff --git a/app/assets/javascripts/behaviors/gl_emoji/unicode_support_map.js b/app/assets/javascripts/behaviors/gl_emoji/unicode_support_map.js index aa522e20c36..257df55e54f 100644 --- a/app/assets/javascripts/behaviors/gl_emoji/unicode_support_map.js +++ b/app/assets/javascripts/behaviors/gl_emoji/unicode_support_map.js @@ -1,3 +1,5 @@ +import AccessorUtilities from '../../lib/utils/accessor'; + const unicodeSupportTestMap = { // man, student (emojione does not have any of these yet), http://emojipedia.org/emoji-zwj-sequences/ // occupationZwj: '\u{1F468}\u{200D}\u{1F393}', @@ -140,16 +142,25 @@ function generateUnicodeSupportMap(testMap) { function getUnicodeSupportMap() { let unicodeSupportMap; - const userAgentFromCache = window.localStorage.getItem('gl-emoji-user-agent'); + let userAgentFromCache; + + const isLocalStorageAvailable = AccessorUtilities.isLocalStorageAccessSafe(); + + if (isLocalStorageAvailable) userAgentFromCache = window.localStorage.getItem('gl-emoji-user-agent'); + try { unicodeSupportMap = JSON.parse(window.localStorage.getItem('gl-emoji-unicode-support-map')); } catch (err) { // swallow } + if (!unicodeSupportMap || userAgentFromCache !== navigator.userAgent) { unicodeSupportMap = generateUnicodeSupportMap(unicodeSupportTestMap); - window.localStorage.setItem('gl-emoji-user-agent', navigator.userAgent); - window.localStorage.setItem('gl-emoji-unicode-support-map', JSON.stringify(unicodeSupportMap)); + + if (isLocalStorageAvailable) { + window.localStorage.setItem('gl-emoji-user-agent', navigator.userAgent); + window.localStorage.setItem('gl-emoji-unicode-support-map', JSON.stringify(unicodeSupportMap)); + } } return unicodeSupportMap; diff --git a/app/assets/javascripts/filtered_search/components/recent_searches_dropdown_content.js b/app/assets/javascripts/filtered_search/components/recent_searches_dropdown_content.js index 9126422b335..15052dbd362 100644 --- a/app/assets/javascripts/filtered_search/components/recent_searches_dropdown_content.js +++ b/app/assets/javascripts/filtered_search/components/recent_searches_dropdown_content.js @@ -8,6 +8,11 @@ export default { type: Array, required: true, }, + isLocalStorageAvailable: { + type: Boolean, + required: false, + default: true, + }, }, computed: { @@ -47,7 +52,12 @@ export default { template: `
-