From 88f0045b94f1946dcc1c3bf068050ce3ad775583 Mon Sep 17 00:00:00 2001 From: Abijeet Date: Thu, 10 Aug 2023 19:44:25 +0530 Subject: [PATCH] ULS Frontend: Save preferences only for named users Add a new method isNamed in ext.uls.common to use the isNamed method if available else use the isAnon method as usual. mw.user.isNamed was added in MW 1.40 Bug: T337780 Change-Id: I747c042a95e8edc793a2265a15ed6ba8ae9f1997 --- resources/js/ext.uls.common.js | 11 ++++++++++- resources/js/ext.uls.displaysettings.js | 2 +- resources/js/ext.uls.interface.js | 2 +- resources/js/ext.uls.preferences.js | 22 ++++++++++++---------- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/resources/js/ext.uls.common.js b/resources/js/ext.uls.common.js index ad2fa633..da0255cd 100644 --- a/resources/js/ext.uls.common.js +++ b/resources/js/ext.uls.common.js @@ -63,7 +63,7 @@ // Track if event logging is enabled mw.hook( 'mw.uls.interface.language.change' ).fire( language ); - if ( mw.user.isAnon() ) { + if ( !mw.uls.isNamed() ) { return changeLanguageAnon(); } @@ -239,4 +239,13 @@ return ret; }; + /** + * Determine if a user is named. Wrapper method is needed since mw.user.isNamed() was added in MW 1.40 + * For MW < 1.40 + * @returns {boolean} + */ + mw.uls.isNamed = function () { + return typeof mw.user.isNamed === 'function' ? mw.user.isNamed() : !mw.user.isAnon(); + }; + }() ); diff --git a/resources/js/ext.uls.displaysettings.js b/resources/js/ext.uls.displaysettings.js index aded3ca9..9232c5cd 100644 --- a/resources/js/ext.uls.displaysettings.js +++ b/resources/js/ext.uls.displaysettings.js @@ -188,7 +188,7 @@ lang, i, language, $button, autonym; // Don't let anonymous users change interface language - if ( !anonsAllowed && mw.user.isAnon() ) { + if ( !anonsAllowed && !mw.uls.isNamed() ) { $loginCta = $( '

' ) .attr( 'id', 'uls-display-settings-anon-log-in-cta' ); autonym = $.uls.data.getAutonym( this.contentLanguage ); diff --git a/resources/js/ext.uls.interface.js b/resources/js/ext.uls.interface.js index e9b8a0ae..5ceb2d19 100644 --- a/resources/js/ext.uls.interface.js +++ b/resources/js/ext.uls.interface.js @@ -194,7 +194,7 @@ } function userCanChangeLanguage() { - return mw.config.get( 'wgULSAnonCanChangeLanguage' ) || !mw.user.isAnon(); + return mw.config.get( 'wgULSAnonCanChangeLanguage' ) || mw.uls.isNamed(); } /** diff --git a/resources/js/ext.uls.preferences.js b/resources/js/ext.uls.preferences.js index 41f08108..16ec90e5 100644 --- a/resources/js/ext.uls.preferences.js +++ b/resources/js/ext.uls.preferences.js @@ -28,20 +28,22 @@ // https://www.mediawiki.org/wiki/Manual:Coding_conventions/JavaScript#Keys this.preferenceName = 'uls-preferences'; this.username = mw.user.getName(); - this.isAnon = mw.user.isAnon(); + // For MW < 1.40. ext.uls.isNamed is inlined here to avoid dependency on ext.uls.common. + this.isNamed = typeof mw.user.isNamed === 'function' ? mw.user.isNamed() : !mw.user.isAnon(); this.preferences = null; this.init(); }; ULSPreferences.prototype = { init: function () { - if ( this.isAnon ) { - this.preferences = mw.storage.getObject( this.preferenceName ); - } else { + if ( this.isNamed ) { try { this.preferences = JSON.parse( mw.user.options.get( this.preferenceName ) ); } catch ( e ) { } + + } else { + this.preferences = mw.storage.getObject( this.preferenceName ); } if ( !$.isPlainObject( this.preferences ) ) { @@ -78,12 +80,8 @@ var self = this; callback = callback || function () {}; - if ( this.isAnon ) { - // Anonymous user. Save preferences in local storage - mw.storage.setObject( this.preferenceName, this.preferences ); - callback.call( this, true ); - } else { - // Logged in user. Use MW APIs to change preferences + if ( this.isNamed ) { + // Registered user. Use MW APIs to change preferences new mw.Api().saveOption( this.preferenceName, JSON.stringify( this.preferences ) @@ -92,6 +90,10 @@ } ).fail( function () { callback.call( self, false ); } ); + } else { + // Anonymous user. Save preferences in local storage + mw.storage.setObject( this.preferenceName, this.preferences ); + callback.call( this, true ); } } };