mediawiki-extensions-Visual.../editcheck/modules/EditCheckFactory.js
David Lynch e947e53f98 Edit check: stop from appearing outside the main namespace
This was accidentally removed in d69d366469 during its refactor.

Because of the change to how checks are decided to be shown, I've made
AddReferenceEditCheck always be required -- later code in
hasAddedContentNeedingReference assumes that it's loaded anyway, so a
wiki deciding to configure it to not load at all for some account types
would have broken saving.

Bug: T373692
Change-Id: I007cd705451581ebacfa12e8ac5502bd1bc56a38
2024-09-04 10:33:22 -05:00

76 lines
2.3 KiB
JavaScript

mw.editcheck.EditCheckFactory = function MWEditEditCheckFactory() {
// Parent constructor
mw.editcheck.EditCheckFactory.super.call( this, this.arguments );
this.checksByListener = {
onDocumentChange: [],
onBeforeSave: []
};
};
/* Inheritance */
OO.inheritClass( mw.editcheck.EditCheckFactory, OO.Factory );
/* Methods */
mw.editcheck.EditCheckFactory.prototype.register = function ( constructor, name ) {
name = name || ( constructor.static && constructor.static.name );
if ( typeof name !== 'string' || name === '' ) {
throw new Error( 'Check names must be strings and must not be empty' );
}
if ( !( constructor.prototype instanceof mw.editcheck.BaseEditCheck ) ) {
throw new Error( 'Checks must be subclasses of mw.editcheck.BaseEditCheck' );
}
if ( this.lookup( name ) === constructor ) {
// Don't allow double registration as it would create duplicate
// entries in various caches.
return;
}
// Parent method
mw.editcheck.EditCheckFactory.super.prototype.register.call( this, constructor, name );
if ( constructor.prototype.onDocumentChange ) {
this.checksByListener.onDocumentChange.push( name );
}
if ( constructor.prototype.onBeforeSave ) {
this.checksByListener.onBeforeSave.push( name );
}
};
/**
* Get a list of registered command names.
*
* @param {string} listener Listener name, 'onDocumentChange', 'onBeforeSave'
* @return {string[]}
*/
mw.editcheck.EditCheckFactory.prototype.getNamesByListener = function ( listener ) {
if ( !this.checksByListener[ listener ] ) {
throw new Error( `Unknown listener '${ listener }'` );
}
return this.checksByListener[ listener ];
};
mw.editcheck.EditCheckFactory.prototype.createAllByListener = function ( listener, surface ) {
const diff = new mw.editcheck.Diff( surface );
const newChecks = [];
this.getNamesByListener( listener ).forEach( ( checkName ) => {
const check = this.create( checkName, mw.editcheck.config[ checkName ] );
if ( !check.canBeShown() ) {
return;
}
const actions = check[ listener ]( diff );
if ( actions.length > 0 ) {
ve.batchPush( newChecks, actions );
}
} );
newChecks.sort(
( a, b ) => a.highlight.getSelection().getCoveringRange().start - b.highlight.getSelection().getCoveringRange().start
);
return newChecks;
};
mw.editcheck.editCheckFactory = new mw.editcheck.EditCheckFactory();