Santhosh has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/52604


Change subject: Cache the options token for preferences system
......................................................................

Cache the options token for preferences system

Change-Id: I2e9a4326119db390aba36cc5bc6da20c5c16eed1
---
M resources/js/ext.uls.preferences.js
1 file changed, 92 insertions(+), 22 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/UniversalLanguageSelector 
refs/changes/04/52604/1

diff --git a/resources/js/ext.uls.preferences.js 
b/resources/js/ext.uls.preferences.js
index 8f7f076..913d539 100644
--- a/resources/js/ext.uls.preferences.js
+++ b/resources/js/ext.uls.preferences.js
@@ -21,7 +21,90 @@
 ( function ( $, mw, undefined ) {
        'use strict';
 
-       var ULSPreferences = function () {
+       var ULSPreferences,
+               cachedOptionsToken = null;
+
+       /**
+        * Post to options API with correct token.
+        * If we have no token, get one and try to post.
+        * If we have a cached token try using that, and if it fails, blank out 
the
+        * cached token and start over.
+        *
+        * @param params {Object} API parameters
+        * @param ok {Function} callback for success
+        * @param err {Function} [optional] error callback
+        * @return {jqXHR}
+        */
+       function saveOptionsWithToken ( params, ok, err ) {
+               var useTokenToPost, getTokenIfBad;
+               if ( cachedOptionsToken === null ) {
+                       // We don't have a valid cached token, so get a fresh 
one and try posting.
+                       // We do not trap any 'badtoken' or 'notoken' errors, 
because we don't want
+                       // an infinite loop. If this fresh token is bad, 
something else is very wrong.
+                       useTokenToPost = function ( token ) {
+                               params.token = token;
+                               new mw.Api().post( params, ok, err );
+                       };
+                       return getOptionToken( useTokenToPost, err );
+               } else {
+                       // We do have a token, but it might be expired. So if 
it is 'bad' then
+                       // start over with a new token.
+                       params.token = cachedOptionsToken;
+                       getTokenIfBad = function ( code, result ) {
+                               if ( code === 'badtoken' ) {
+                                       // force a new token, clear any old one
+                                       cachedOptionsToken = null;
+                                       saveOptionsWithToken( params, ok, err );
+                               } else {
+                                       err( code, result );
+                               }
+                       };
+                       return new mw.Api().post( params, { ok : ok, err : 
getTokenIfBad });
+               }
+       }
+
+       /**
+        * Api helper to grab an options token
+        *
+        * token callback has signature ( String token )
+        * error callback has signature ( String code, Object results, 
XmlHttpRequest xhr, Exception exception )
+        * Note that xhr and exception are only available for 'http_*' errors
+        * code may be any http_* error code (see mw.Api), or 'token_missing'
+        *
+        * @param tokenCallback {Function} received token callback
+        * @param err {Function} error callback
+        * @return {jqXHR}
+        */
+       function getOptionToken ( tokenCallback, err ) {
+               var parameters = {
+                               action: 'tokens',
+                               type: 'options'
+                       },
+                       ok = function ( data ) {
+                               var token;
+                               // If token type is not available for this user,
+                               // key 'translationreviewtoken' is missing or 
can contain Boolean false
+                               if ( data.tokens && data.tokens.optionstoken ) {
+                                       token = data.tokens.optionstoken;
+                                       cachedOptionsToken = token;
+                                       tokenCallback( token );
+                               } else {
+                                       err( 'token-missing', data );
+                               }
+                       },
+                       ajaxOptions = {
+                               ok: ok,
+                               err: err,
+                               // Due to the API assuming we're logged out if 
we pass the callback-parameter,
+                               // we have to disable jQuery's callback system, 
and instead parse JSON string,
+                               // by setting 'jsonp' to false.
+                               jsonp: false
+                       };
+
+               return new mw.Api().get( parameters, ajaxOptions );
+       }
+
+       ULSPreferences = function () {
                this.preferenceName = 'uls-preferences';
                this.username = mw.user.getName();
                this.isAnon = mw.user.isAnon();
@@ -68,8 +151,7 @@
                 * @param callback
                 */
                save: function ( callback ) {
-                       var ulsPreferences = this,
-                               api;
+                       var ulsPreferences = this;
 
                        callback = callback || $.noop;
                        if ( this.isAnon ) {
@@ -78,25 +160,13 @@
                                callback.call( this, true );
                        } else {
                                // Logged in user. Use MW apis to change 
preferences
-                               api = new mw.Api();
-
-                               api.post( {
-                                       action: 'tokens',
-                                       type: 'options'
-                               } ).done( function ( tokenresult ) {
-                                       var token = 
tokenresult.tokens.optionstoken;
-
-                                       api.post( {
-                                               action: 'options',
-                                               optionname: 
ulsPreferences.preferenceName,
-                                               optionvalue: $.toJSON( 
ulsPreferences.preferences ),
-                                               token: token
-                                       } ).done( function ( data ) {
-                                               callback.call( this, true );
-                                       } ).fail( function ( data ) {
-                                               callback.call( this, false );
-                                       } );
-                               } ).fail( function () {
+                               saveOptionsWithToken( {
+                                       action: 'options',
+                                       optionname: 
ulsPreferences.preferenceName,
+                                       optionvalue: $.toJSON( 
ulsPreferences.preferences )
+                               }, function () {
+                                       callback.call( this, true );
+                               }, function () {
                                        callback.call( this, false );
                                } );
                        }

-- 
To view, visit https://gerrit.wikimedia.org/r/52604
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I2e9a4326119db390aba36cc5bc6da20c5c16eed1
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/UniversalLanguageSelector
Gerrit-Branch: master
Gerrit-Owner: Santhosh <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to