X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/resources/src/mediawiki/mediawiki.storage.js diff --git a/resources/src/mediawiki/mediawiki.storage.js b/resources/src/mediawiki/mediawiki.storage.js new file mode 100644 index 00000000..84e146a7 --- /dev/null +++ b/resources/src/mediawiki/mediawiki.storage.js @@ -0,0 +1,94 @@ +( function ( mw ) { + 'use strict'; + + // Catch exceptions to avoid fatal in Chrome's "Block data storage" mode + // which throws when accessing the localStorage property itself, as opposed + // to the standard behaviour of throwing on getItem/setItem. (T148998) + var + localStorage = ( function () { + try { + return window.localStorage; + } catch ( e ) {} + }() ), + sessionStorage = ( function () { + try { + return window.sessionStorage; + } catch ( e ) {} + }() ); + + /** + * A wrapper for an HTML5 Storage interface (`localStorage` or `sessionStorage`) + * that is safe to call on all browsers. + * + * @class mw.SafeStorage + * @private + * @param {Object|undefined} store The Storage instance to wrap around + */ + function SafeStorage( store ) { + this.store = store; + } + + /** + * Retrieve value from device storage. + * + * @param {string} key Key of item to retrieve + * @return {string|null|boolean} String value, null if no value exists, or false + * if localStorage is not available. + */ + SafeStorage.prototype.get = function ( key ) { + try { + return this.store.getItem( key ); + } catch ( e ) {} + return false; + }; + + /** + * Set a value in device storage. + * + * @param {string} key Key name to store under + * @param {string} value Value to be stored + * @return {boolean} Whether the save succeeded or not + */ + SafeStorage.prototype.set = function ( key, value ) { + try { + this.store.setItem( key, value ); + return true; + } catch ( e ) {} + return false; + }; + + /** + * Remove a value from device storage. + * + * @param {string} key Key of item to remove + * @return {boolean} Whether the save succeeded or not + */ + SafeStorage.prototype.remove = function ( key ) { + try { + this.store.removeItem( key ); + return true; + } catch ( e ) {} + return false; + }; + + /** + * A wrapper for the HTML5 `localStorage` interface + * that is safe to call on all browsers. + * + * @class + * @singleton + * @extends mw.SafeStorage + */ + mw.storage = new SafeStorage( localStorage ); + + /** + * A wrapper for the HTML5 `sessionStorage` interface + * that is safe to call on all browsers. + * + * @class + * @singleton + * @extends mw.SafeStorage + */ + mw.storage.session = new SafeStorage( sessionStorage ); + +}( mediaWiki ) );