Skip to content

Instantly share code, notes, and snippets.

@philfreo
Last active November 20, 2019 22:49
Show Gist options
  • Star 41 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save philfreo/68ea3cd980d72383c951 to your computer and use it in GitHub Desktop.
Save philfreo/68ea3cd980d72383c951 to your computer and use it in GitHub Desktop.
Don't let localStorage/sessionStorage setItem throw errors in Safari Private Browsing Mode
// Safari, in Private Browsing Mode, looks like it supports localStorage but all calls to setItem
// throw QuotaExceededError. We're going to detect this and just silently drop any calls to setItem
// to avoid the entire page breaking, without having to do a check at each usage of Storage.
if (typeof localStorage === 'object') {
try {
localStorage.setItem('localStorage', 1);
localStorage.removeItem('localStorage');
} catch (e) {
Storage.prototype._setItem = Storage.prototype.setItem;
Storage.prototype.setItem = function() {};
alert('Your web browser does not support storing settings locally. In Safari, the most common cause of this is using "Private Browsing Mode". Some settings may not save or some features may not work properly for you.');
}
}
@hazratgs
Copy link

hazratgs commented Apr 3, 2018

And you can also replace the standard methods:

  try {
      localStorage.setItem('localStorage', 1);
      localStorage.removeItem('localStorage');
  } catch (e) {
      const memorystorage = new MemoryStorage('localStorage')
      Storage.prototype.setItem = memorystorage.setItem.bind(memorystorage)
      Storage.prototype.getItem = memorystorage.getItem.bind(memorystorage)
      Storage.prototype.removeItem = memorystorage.removeItem.bind(memorystorage)
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment