ve.dm.MWTemplateModel: Don't add spurious empty parameters

Make ve.dm.MWTemplateModel#serialize ignore empty parameters if they were not
present in the transclusion before the edit. This avoids dirty diffs where an
user edits a template transclusion via VisualEditor, and the editor adds all
available template parameters to the edit wikitext, even if they were not
changed during the edit.

This logic was ported from the old Wikia-WMF VisualEditor project.[1]

Additionally, add tests for ve.dm.MWTemplateModel serialization.

---
[1] https://github.com/Wikia/app/pull/6450/commits/858eaa9

Bug: T101075
Change-Id: I35f8812724658904d30034db4e4684193a661c1e
This commit is contained in:
Máté Szabó 2020-11-16 19:43:00 +01:00
parent e38dd7188e
commit d127dc48b7
3 changed files with 89 additions and 0 deletions

View file

@ -2672,6 +2672,7 @@
"modules/ve-mw/tests/dm/ve.dm.mwExample.js",
"modules/ve-mw/tests/dm/ve.dm.Converter.test.js",
"modules/ve-mw/tests/dm/ve.dm.MWImageModel.test.js",
"modules/ve-mw/tests/dm/ve.dm.MWTemplateModel.test.js",
"modules/ve-mw/tests/dm/ve.dm.MWTransclusionModel.test.js",
"modules/ve-mw/tests/dm/ve.dm.MWInternalLinkAnnotation.test.js",
"lib/ve/tests/ce/ve.ce.test.js",

View file

@ -345,6 +345,12 @@ ve.dm.MWTemplateModel.prototype.serialize = function () {
if ( name === '' ) {
continue;
}
// Don't add empty parameters if they were not present before the edit (T101075)
if ( params[ name ].getValue() === '' && !Object.prototype.hasOwnProperty.call( origParams, name ) ) {
continue;
}
origName = params[ name ].getOriginalName();
template.params[ origName ] = ve.extendObject(
{},

View file

@ -0,0 +1,82 @@
/*!
* VisualEditor DataModel MWTemplateModel tests.
*
* @copyright 2011-2020 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
( function () {
var transclusionData = {
params: {
foo: { wt: 'Foo value' },
bar: { wt: 'Bar value' },
empty: { wt: '' }
},
target: {
href: './Template:Test',
wt: 'Test'
}
};
QUnit.module( 've.dm.MWTemplateModel', ve.test.utils.mwEnvironment );
/**
* Create a new MWTemplateModel initialized with a static transclusion data fixture.
*
* @return {ve.dm.MWTemplateModel}
*/
function newTemplateModel() {
var doc = ve.dm.Document.static.newBlankDocument(),
transclusion = new ve.dm.MWTransclusionModel( doc ),
clonedTransclusionData = ve.extendObject( {}, transclusionData );
return ve.dm.MWTemplateModel.newFromData( transclusion, clonedTransclusionData );
}
/* Tests */
QUnit.test( 'serialize input parameters', function ( assert ) {
var templateModel = newTemplateModel(),
serializedTransclusionData = templateModel.serialize();
assert.deepEqual( serializedTransclusionData, { template: transclusionData } );
} );
QUnit.test( 'serialize changed input parameters', function ( assert ) {
var templateModel = newTemplateModel(),
newParameterModel = new ve.dm.MWParameterModel( templateModel, 'baz', 'Baz value' ),
serializedTransclusionData;
templateModel.addParameter( newParameterModel );
serializedTransclusionData = templateModel.serialize();
assert.deepEqual( serializedTransclusionData.template.params.baz, { wt: 'Baz value' } );
} );
// T75134
QUnit.test( 'serialize after parameter was removed', function ( assert ) {
var templateModel = newTemplateModel(),
barParam = templateModel.getParameter( 'bar' ),
serializedTransclusionData;
templateModel.removeParameter( barParam );
serializedTransclusionData = templateModel.serialize();
assert.deepEqual( serializedTransclusionData.template.params, { foo: { wt: 'Foo value' }, empty: { wt: '' } } );
} );
// T101075
QUnit.test( 'serialize without empty parameter not present in original parameter set', function ( assert ) {
var templateModel = newTemplateModel(),
newEmptyParam = new ve.dm.MWParameterModel( templateModel, 'new_empty', '' ),
serializedTransclusionData;
templateModel.addParameter( newEmptyParam );
serializedTransclusionData = templateModel.serialize();
assert.deepEqual( serializedTransclusionData, { template: transclusionData } );
} );
}() );