Merge "Add invalidateUserSessions.php maintenance script"
[lhc/web/wiklou.git] / resources / src / mediawiki.action / mediawiki.action.edit.stash.js
1 /*!
2 * Scripts for pre-emptive edit preparing on action=edit
3 */
4 ( function ( mw, $ ) {
5 $( function () {
6 var idleTimeout = 3000,
7 api = new mw.Api(),
8 pending = null,
9 $form = $( '#editform' ),
10 $text = $form.find( '#wpTextbox1' ),
11 $summary = $form.find( '#wpSummary' ),
12 data = {},
13 timer = null;
14
15 // Send a request to stash the edit to the API.
16 // If a request is in progress, abort it since its payload is stale and the API
17 // may limit concurrent stash parses.
18 function stashEdit() {
19 if ( pending ) {
20 pending.abort();
21 }
22
23 api.getToken( 'csrf' ).then( function ( token ) {
24 data = $form.serializeObject();
25
26 pending = api.post( {
27 action: 'stashedit',
28 token: token,
29 title: mw.config.get( 'wgPageName' ),
30 section: data.wpSection,
31 sectiontitle: '',
32 text: data.wpTextbox1,
33 summary: data.wpSummary,
34 contentmodel: data.model,
35 contentformat: data.format,
36 baserevid: data.parentRevId
37 } );
38 } );
39 }
40
41 // Check if edit body text changed since the last stashEdit() call or if no edit
42 // stash calls have yet been made
43 function isChanged() {
44 // Normalize line endings to CRLF, like $.fn.serializeObject does.
45 var newText = $text.val().replace( /\r?\n/g, '\r\n' );
46 return newText !== data.wpTextbox1;
47 }
48
49 function onEditorIdle() {
50 if ( !isChanged() ) {
51 return;
52 }
53
54 stashEdit();
55 }
56
57 function onTextKeyUp( e ) {
58 // Ignore keystrokes that don't modify text, like cursor movements.
59 // See <http://www.javascripter.net/faq/keycodes.htm> and
60 // <http://www.quirksmode.org/js/keys.html>. We don't have to be
61 // exhaustive, because the cost of misfiring is low.
62 if ( ( e.which >= 33 && e.which <= 40 ) || ( e.which >= 16 && e.which <= 18 ) ) {
63 return;
64 }
65
66 clearTimeout( timer );
67 timer = setTimeout( onEditorIdle, idleTimeout );
68 }
69
70 function onFormLoaded() {
71 if (
72 // Reverts may involve use (undo) links; stash as they review the diff.
73 // Since the form has a pre-filled summary, stash the edit immediately.
74 mw.util.getParamValue( 'undo' ) !== null
75 // Pressing "show changes" and "preview" also signify that the user will
76 // probably save the page soon
77 || $.inArray( $form.find( '#mw-edit-mode' ).val(), [ 'preview', 'diff' ] ) > -1
78 ) {
79 stashEdit();
80 }
81 }
82
83 // We don't attempt to stash new section edits because in such cases
84 // the parser output varies on the edit summary (since it determines
85 // the new section's name).
86 if ( $form.find( 'input[name=wpSection]' ).val() === 'new' ) {
87 return;
88 }
89
90 $text.on( { change: onEditorIdle, keyup: onTextKeyUp } );
91 $summary.on( { focus: onEditorIdle } );
92 onFormLoaded();
93
94 } );
95 }( mediaWiki, jQuery ) );