DOM Exception 22
a short story about why using native APIs directly is probably evil
by
@MichalZalecki
ReactJS Wrocław, April 2017
There are likable APIs
- ServiceWorker
There are vexing APIs
- IndexedDB
There are sneaky APIs
- localStorage
- sessionStorage
There are good and informative errors
Failed to register a ServiceWorker: The user denied permission to use Service Worker.
There are also errors you have to debug
TypeError: Cannot read property 'getItem' of null
DOMException: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.
meanwhile on Chrome
Probably it's Facebook's preview running in WebCromeClient with storage disabled
reason
QuotaExceededError: Dom exception 22: An attempt was made to add something to storage that exceeded the quota
It works on my machine!
(both iPhone and MacBook)
meanwhile on Safari
Apparently Safari decided to be confusing and this is an error you get when you try to access localStorage in private mode
reason
function storageFactory(source, prop) {
let inMemoryStorage = {};
function setItem(key, value) {
try {
getStorage().setItem(key, value);
} catch (e) {
inMemoryStorage[key] = value;
}
}
function getItem(key) {
try {
return getStorage().getItem(key);
} catch (e) {
return inMemoryStorage[key] || null;
}
}
return {
setItem,
getItem,
};
}
export const localStore = storageFactory(window, "localStorage");
export const sessionStore = storageFactory(window, "sessionStorage");
Thanks!
DOM Exception 22
By Michał Załęcki
DOM Exception 22
- 1,702