From e14d911195c238f009c9e9dfdacf0884e09b28cf Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 11 Aug 2018 13:08:00 +0100 Subject: [PATCH] Add try/catch to all localStorage methods Return null when attempting to get an item from localStorage REF: #2699 --- client/js/localStorage.js | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/client/js/localStorage.js b/client/js/localStorage.js index ebe07b7b..b2877b72 100644 --- a/client/js/localStorage.js +++ b/client/js/localStorage.js @@ -1,22 +1,43 @@ "use strict"; +// This is a simple localStorage wrapper because browser can throw errors +// in different situations, including: +// - Unable to store data if storage is full +// - Local storage is blocked if "third-party cookies and site data" is disabled +// +// For more details, see: +// https://stackoverflow.com/q/14555347/1935861 +// https://github.com/thelounge/thelounge/issues/2699 +// https://www.chromium.org/for-testers/bug-reporting-guidelines/uncaught-securityerror-failed-to-read-the-localstorage-property-from-window-access-is-denied-for-this-document + module.exports = { set(key, value) { try { window.localStorage.setItem(key, value); } catch (e) { - // Do nothing. If we end up here, web storage quota exceeded, or user is - // in Safari's private browsing where localStorage's setItem is not - // available. See http://stackoverflow.com/q/14555347/1935861. + // } }, get(key) { - return window.localStorage.getItem(key); + try { + return window.localStorage.getItem(key); + } catch (e) { + // Return null as if data is not set + return null; + } }, remove(key) { - window.localStorage.removeItem(key); + try { + window.localStorage.removeItem(key); + } catch (e) { + // + } }, clear() { - window.localStorage.clear(); + try { + window.localStorage.clear(); + } catch (e) { + // + } }, };