From 3d076c0ff0f6245cbd20576fb777ca6a31be0d1a Mon Sep 17 00:00:00 2001 From: Geoffrey Mon Date: Thu, 26 Nov 2015 16:41:41 -0500 Subject: [PATCH] Check each Special:Preferences input for changes When checking for changes in the Special:Preferences form, instead of serializing original form data (which fails with asynchronous loading of JS, if the user changes something before JS is done loading), compare the value of each input to the default value. Bug: T119732 Change-Id: Ib48a9b334f639e417a0642c6c090ba18afc477ce --- .../mediawiki.special.preferences.js | 40 ++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/resources/src/mediawiki.special/mediawiki.special.preferences.js b/resources/src/mediawiki.special/mediawiki.special.preferences.js index f90f85914f..7f3de3899d 100644 --- a/resources/src/mediawiki.special/mediawiki.special.preferences.js +++ b/resources/src/mediawiki.special/mediawiki.special.preferences.js @@ -261,14 +261,44 @@ } ); } + // Check if all of the form values are unchanged + function isPrefsChanged() { + var inputs = $( '#mw-prefs-form :input' ), + input, $input, inputType, + index, optIndex, + opt; + + for ( index = 0; index < inputs.length; index++ ) { + input = inputs[ index ]; + $input = $( input ); + + // Different types of inputs have different methods for accessing defaults + if ( $input.is( 'select' ) ) { // has defaultValue or defaultChecked + inputType = input.type; + if ( inputType === 'radio' || inputType === 'checkbox' ) { + if ( input.checked !== input.defaultChecked ) { + return true; + } + } else if ( input.value !== input.defaultValue ) { + return true; + } + } + } + + return false; + } + // Set up a message to notify users if they try to leave the page without // saving. - $( '#mw-prefs-form' ).data( 'origdata', $( '#mw-prefs-form' ).serialize() ); allowCloseWindow = mw.confirmCloseWindow( { - test: function () { - return $( '#mw-prefs-form' ).serialize() !== $( '#mw-prefs-form' ).data( 'origdata' ); - }, - + test: isPrefsChanged, message: mw.msg( 'prefswarning-warning', mw.msg( 'saveprefs' ) ), namespace: 'prefswarning' } ); -- 2.20.1