From 56c38a5515e421e5b7532b75c005c44bf735aed1 Mon Sep 17 00:00:00 2001 From: Abijeet Patro Date: Thu, 16 Apr 2020 12:26:10 +0000 Subject: [PATCH] Revert "Simplify ext.uls.preferences module" This reverts commit 61f1a9863a1f47cc953e9ca34a43562d5de1afc2. Reason: mw.storage.getObject was introduced in MW 1.34. Need to support MW 1.33 for MLEB 2020.04 release. Change-Id: If9cd8d1f9e1ab544eba280c8fa7b36db91b64573 --- extension.json | 3 +- resources/js/ext.uls.preferences.js | 85 +++++++++++++++++++++++------ 2 files changed, 70 insertions(+), 18 deletions(-) diff --git a/extension.json b/extension.json index 1c18a9a2..aa0735ed 100644 --- a/extension.json +++ b/extension.json @@ -323,9 +323,8 @@ "ext.uls.preferences": { "scripts": "js/ext.uls.preferences.js", "dependencies": [ - "mediawiki.api", "mediawiki.user", - "mediawiki.storage" + "mediawiki.api" ], "localBasePath": "resources", "remoteExtPath": "UniversalLanguageSelector/resources" diff --git a/resources/js/ext.uls.preferences.js b/resources/js/ext.uls.preferences.js index 7892161e..09123994 100644 --- a/resources/js/ext.uls.preferences.js +++ b/resources/js/ext.uls.preferences.js @@ -21,11 +21,51 @@ ( function () { 'use strict'; - var ULSPreferences, instance; + var ULSPreferences; + + /** + * Wrapper for localStorage, falls back to cookie + * when localStorage not supported by browser. + * + * @return {Object} + */ + function preferenceStore() { + + // If value is detected, set new or modify store + return { + /* + * Set the value to the given key + * @param {string} key + * @param {Object} value value to be set + */ + set: function ( key, value ) { + // Convert object values to JSON + if ( typeof value === 'object' ) { + value = JSON.stringify( value ); + } + + try { + localStorage.setItem( key, value ); + } catch ( e ) {} + }, + /* + * Returns the value of the given key + * @param {string} key + * @return {Object} value of the key + */ + get: function ( key ) { + var data; + + try { + data = JSON.parse( localStorage.getItem( key ) ); + } catch ( e ) {} + + return data; + } + }; + } ULSPreferences = function () { - // This violates coding conventions for localstorage: - // https://www.mediawiki.org/wiki/Manual:Coding_conventions/JavaScript#Keys this.preferenceName = 'uls-preferences'; this.username = mw.user.getName(); this.isAnon = mw.user.isAnon(); @@ -34,19 +74,28 @@ }; ULSPreferences.prototype = { + /** + * Initialize + */ init: function () { + var options; + if ( this.isAnon ) { - this.preferences = mw.storage.getObject( this.preferenceName ); + this.preferences = preferenceStore().get( this.preferenceName ); } else { + options = mw.user.options.get( this.preferenceName ); + if ( !options ) { + options = '{}'; + } + // Try to parse JSON try { - this.preferences = JSON.parse( mw.user.options.get( this.preferenceName ) ); + this.preferences = JSON.parse( options ); } catch ( e ) { + this.preferences = {}; } } - if ( !$.isPlainObject( this.preferences ) ) { - this.preferences = {}; - } + this.preferences = this.preferences || {}; }, /** @@ -75,22 +124,22 @@ * @param {Function} callback */ save: function ( callback ) { - var self = this; + var ulsPreferences = this; callback = callback || function () {}; if ( this.isAnon ) { // Anonymous user. Save preferences in local storage - mw.storage.setObject( this.preferenceName, this.preferences ); + preferenceStore().set( this.preferenceName, this.preferences ); callback.call( this, true ); } else { // Logged in user. Use MW APIs to change preferences new mw.Api().saveOption( - this.preferenceName, - JSON.stringify( this.preferences ) + ulsPreferences.preferenceName, + JSON.stringify( ulsPreferences.preferences ) ).done( function () { - callback.call( self, true ); + callback.call( this, true ); } ).fail( function () { - callback.call( self, false ); + callback.call( this, false ); } ); } } @@ -98,8 +147,12 @@ mw.uls = mw.uls || {}; mw.uls.preferences = function () { - instance = instance || new ULSPreferences(); - return instance; + var data = $( document.body ).data( 'preferences' ); + + if ( !data ) { + $( document.body ).data( 'preferences', ( data = new ULSPreferences() ) ); + } + return data; }; }() );