$user = $context->getUser();
$output = $context->getOutput();
$lang = $context->getLanguage();
- $cascadingRestrictionLevels = $context->getConfig()->get( 'CascadingRestrictionLevels' );
+ $conf = $context->getConfig();
+ $cascadingRestrictionLevels = $conf->get( 'CascadingRestrictionLevels' );
+ $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
$out = '';
if ( !$this->disabled ) {
$output->addModules( 'mediawiki.legacy.protect' );
$this->mReasonSelection,
'mwProtect-reason', 4 );
+ // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
+ // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
+ // Unicode codepoints (or 180 UTF-8 bytes for old schema).
+ // Subtract arbitrary 75 to leave some space for the autogenerated null edit's summary
+ // and other texts chosen by dropdown menus on this page.
+ $maxlength = $oldCommentSchema ? 180 : CommentStore::COMMENT_CHARACTER_LIMIT - 75;
+
$out .= Xml::openElement( 'table', [ 'id' => 'mw-protect-table3' ] ) .
Xml::openElement( 'tbody' );
$out .= "
</td>
<td class='mw-input'>" .
Xml::input( 'mwProtect-reason', 60, $this->mReason, [ 'type' => 'text',
- 'id' => 'mwProtect-reason', 'maxlength' => 180 ] ) .
- // Limited maxlength as the database trims at 255 bytes and other texts
- // chosen by dropdown menus on this page are also included in this database field.
- // The byte limit of 180 bytes is enforced in javascript
+ 'id' => 'mwProtect-reason', 'maxlength' => $maxlength ] ) .
"</td>
</tr>";
# Disallow watching is user is not logged in
/**
* Show protection long extracts for this page
*
- * @param OutputPage $out
+ * @param OutputPage &$out
* @access private
*/
function showLogExtract( &$out ) {