Handle session loss in the console

If the session data gets lost, the console forgets the content and
previous commands. Detect this situation and handle it.

Change-Id: I82fb5e111c09091d4f9a87d2e1b1c245eced1420
This commit is contained in:
Brad Jorsch 2013-02-08 17:32:28 -05:00
parent fddf05c056
commit e878314048
4 changed files with 23 additions and 3 deletions

View file

@ -32,6 +32,7 @@ $1',
'scribunto-console-previous-src' => 'previous console input', 'scribunto-console-previous-src' => 'previous console input',
'scribunto-console-clear' => 'Clear', 'scribunto-console-clear' => 'Clear',
'scribunto-console-cleared' => 'The console state was cleared because the module was updated.', 'scribunto-console-cleared' => 'The console state was cleared because the module was updated.',
'scribunto-console-cleared-session-lost' => 'The console state was cleared because the session data was lost.',
'scribunto-common-error-category' => 'Pages with script errors', 'scribunto-common-error-category' => 'Pages with script errors',
@ -89,6 +90,8 @@ $messages['qqq'] = array(
'scribunto-common-timeout' => 'Error message displayed when script execution has passed a threshold.', 'scribunto-common-timeout' => 'Error message displayed when script execution has passed a threshold.',
'scribunto-common-oom' => 'Error message displayed when the script requires more memory than the threshold.', 'scribunto-common-oom' => 'Error message displayed when the script requires more memory than the threshold.',
'scribunto-common-backtrace' => 'A backtrace is a list of the function calls that are currently active in a thread. This message is followed by a backtrace.', 'scribunto-common-backtrace' => 'A backtrace is a list of the function calls that are currently active in a thread. This message is followed by a backtrace.',
'scribunto-console-cleared' => 'Message displayed in the console when the module source has been changed.',
'scribunto-console-cleared-session-lost' => 'Message displayed in the console when the session has expired.',
'scribunto-lua-in-function' => 'Reference to a function name. Parameters: 'scribunto-lua-in-function' => 'Reference to a function name. Parameters:
* $1 is a function name.', * $1 is a function name.',
'scribunto-lua-in-main' => 'Part of the backtrace creation routines. Refers to the main part of the code.', 'scribunto-lua-in-main' => 'Part of the backtrace creation routines. Refers to the main part of the code.',

View file

@ -82,6 +82,7 @@ $wgResourceModules['ext.scribunto.edit'] = $sbtpl + array(
'scribunto-console-intro', 'scribunto-console-intro',
'scribunto-console-clear', 'scribunto-console-clear',
'scribunto-console-cleared', 'scribunto-console-cleared',
'scribunto-console-cleared-session-lost',
), ),
); );
$wgAPIModules['scribunto-console'] = 'ApiScribuntoConsole'; $wgAPIModules['scribunto-console'] = 'ApiScribuntoConsole';

View file

@ -26,11 +26,13 @@ class ApiScribuntoConsole extends ApiBase {
$sessionKey = wfMemcKey( 'scribunto-console', $wgUser->getId(), $sessionId ); $sessionKey = wfMemcKey( 'scribunto-console', $wgUser->getId(), $sessionId );
$cache = ObjectCache::getInstance( CACHE_ANYTHING ); $cache = ObjectCache::getInstance( CACHE_ANYTHING );
$session = null; $session = null;
$sessionIsNew = false;
if ( $params['session'] ) { if ( $params['session'] ) {
$session = $cache->get( $sessionKey ); $session = $cache->get( $sessionKey );
} }
if ( !isset( $session['version'] ) ) { if ( !isset( $session['version'] ) ) {
$session = $this->newSession(); $session = $this->newSession();
$sessionIsNew = true;
} }
// Create a variable holding the session which will be stored if there // Create a variable holding the session which will be stored if there
@ -73,6 +75,9 @@ class ApiScribuntoConsole extends ApiBase {
$result['session'] = $sessionId; $result['session'] = $sessionId;
$result['sessionSize'] = $newSession['size']; $result['sessionSize'] = $newSession['size'];
$result['sessionMaxSize'] = self::SC_MAX_SIZE; $result['sessionMaxSize'] = self::SC_MAX_SIZE;
if ( $sessionIsNew ) {
$result['sessionIsNew'] = '';
}
foreach ( $result as $key => $value ) { foreach ( $result as $key => $value ) {
$this->getResult()->addValue( null, $key, $value ); $this->getResult()->addValue( null, $key, $value );
} }

View file

@ -73,7 +73,7 @@
} }
if ( getContent() !== sessionContent ) { if ( getContent() !== sessionContent ) {
printClearBar(); printClearBar( 'scribunto-console-cleared' );
clearNextRequest = true; clearNextRequest = true;
} }
} }
@ -128,10 +128,10 @@
div.insertBefore( head, div.firstChild ); div.insertBefore( head, div.firstChild );
} }
function printClearBar() { function printClearBar( msg ) {
$( '<div/>' ) $( '<div/>' )
.attr( 'class', 'mw-scribunto-clear' ) .attr( 'class', 'mw-scribunto-clear' )
.text( mw.msg( 'scribunto-console-cleared' ) ) .text( mw.msg( msg ) )
.appendTo( _out ); .appendTo( _out );
} }
@ -251,9 +251,11 @@
}; };
var content = getContent(); var content = getContent();
var sentContent = false;
if ( !sessionKey || sessionContent !== content ) { if ( !sessionKey || sessionContent !== content ) {
params.clear = true; params.clear = true;
params.content = content; params.content = content;
sentContent = true;
} }
if ( sessionKey ) { if ( sessionKey ) {
params.session = sessionKey; params.session = sessionKey;
@ -268,6 +270,15 @@
api.post( params, { api.post( params, {
ok: function ( result ) { ok: function ( result ) {
if ( result.sessionIsNew === '' && !sentContent ) {
// Session was lost. Resend query, with content
printClearBar( 'scribunto-console-cleared-session-lost' );
sessionContent = null;
clearPending();
_in.value = params.question;
go();
return;
}
sessionKey = result.session; sessionKey = result.session;
sessionContent = content; sessionContent = content;
if ( result.type === 'error' ) { if ( result.type === 'error' ) {