}
/**
- * Wrap status errors in an errorbox for increased visiblity
+ * Wrap status errors in an errorbox for increased visibility
*
* @param Status $status
* @return string Wikitext
if ( $namespace == NS_MEDIAWIKI ) {
# Show a warning if editing an interface message
$out->wrapWikiMsg( "<div class='mw-editinginterface'>\n$1\n</div>", 'editinginterface' );
- # If this is a default message (but not css or js),
+ # If this is a default message (but not css, json, or js),
# show a hint that it is translatable on translatewiki.net
- if ( !$this->mTitle->hasContentModel( CONTENT_MODEL_CSS )
+ if (
+ !$this->mTitle->hasContentModel( CONTENT_MODEL_CSS )
+ && !$this->mTitle->hasContentModel( CONTENT_MODEL_JSON )
&& !$this->mTitle->hasContentModel( CONTENT_MODEL_JAVASCRIPT )
) {
$defaultMessageText = $this->mTitle->getDefaultMessageText();
}
if ( $this->getTitle()->isSubpageOf( $user->getUserPage() ) ) {
$isUserCssConfig = $this->mTitle->isUserCssConfigPage();
+ $isUserJsonConfig = $this->mTitle->isUserJsonConfigPage();
+ $isUserJsConfig = $this->mTitle->isUserJsConfigPage();
$warning = $isUserCssConfig
? 'usercssispublic'
- : 'userjsispublic';
+ : ( $isUserJsonConfig ? 'userjsonispublic' : 'userjsispublic' );
$out->wrapWikiMsg( '<div class="mw-userconfigpublic">$1</div>', $warning );
"<div id='mw-usercssyoucanpreview'>\n$1\n</div>",
[ 'usercssyoucanpreview' ]
);
- }
-
- if ( $this->mTitle->isJsSubpage() && $config->get( 'AllowUserJs' ) ) {
+ } elseif ( $isUserJsonConfig /* No comparable 'AllowUserJson' */ ) {
+ $out->wrapWikiMsg(
+ "<div id='mw-userjsonyoucanpreview'>\n$1\n</div>",
+ [ 'userjsonyoucanpreview' ]
+ );
+ } elseif ( $isUserJsConfig && $config->get( 'AllowUserJs' ) ) {
$out->wrapWikiMsg(
"<div id='mw-userjsyoucanpreview'>\n$1\n</div>",
[ 'userjsyoucanpreview' ]
* @return array
*/
private function getSummaryInputAttributes( array $inputAttrs = null ) {
- // Note: the maxlength is overridden in JS to 255 and to make it use UTF-8 bytes, not characters.
+ $conf = $this->context->getConfig();
+ $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
+ // 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 255 UTF-8 bytes for old schema).
return ( is_array( $inputAttrs ) ? $inputAttrs : [] ) + [
'id' => 'wpSummary',
'name' => 'wpSummary',
- 'maxlength' => '200',
+ 'maxlength' => $oldCommentSchema ? 200 : CommentStore::COMMENT_CHARACTER_LIMIT,
'tabindex' => 1,
'size' => 60,
'spellcheck' => 'true',
];
}
- /**
- * Standard summary input and label (wgSummary), abstracted so EditPage
- * subclasses may reorganize the form.
- * Note that you do not need to worry about the label's for=, it will be
- * inferred by the id given to the input. You can remove them both by
- * passing [ 'id' => false ] to $userInputAttrs.
- *
- * @deprecated since 1.30 Use getSummaryInputWidget() instead
- * @param string $summary The value of the summary input
- * @param string $labelText The html to place inside the label
- * @param array $inputAttrs Array of attrs to use on the input
- * @param array $spanLabelAttrs Array of attrs to use on the span inside the label
- * @return array An array in the format [ $label, $input ]
- */
- public function getSummaryInput( $summary = "", $labelText = null,
- $inputAttrs = null, $spanLabelAttrs = null
- ) {
- wfDeprecated( __METHOD__, '1.30' );
- $inputAttrs = $this->getSummaryInputAttributes( $inputAttrs );
- $inputAttrs += Linker::tooltipAndAccesskeyAttribs( 'summary' );
-
- $spanLabelAttrs = ( is_array( $spanLabelAttrs ) ? $spanLabelAttrs : [] ) + [
- 'class' => $this->missingSummary ? 'mw-summarymissed' : 'mw-summary',
- 'id' => "wpSummaryLabel"
- ];
-
- $label = null;
- if ( $labelText ) {
- $label = Xml::tags(
- 'label',
- $inputAttrs['id'] ? [ 'for' => $inputAttrs['id'] ] : null,
- $labelText
- );
- $label = Xml::tags( 'span', $spanLabelAttrs, $label );
- }
-
- $input = Html::input( 'wpSummary', $summary, 'text', $inputAttrs );
-
- return [ $label, $input ];
- }
-
- /**
- * Builds a standard summary input with a label.
- *
- * @deprecated since 1.30 Use getSummaryInputWidget() instead
- * @param string $summary The value of the summary input
- * @param string $labelText The html to place inside the label
- * @param array $inputAttrs Array of attrs to use on the input
- *
- * @return OOUI\FieldLayout OOUI FieldLayout with Label and Input
- */
- function getSummaryInputOOUI( $summary = "", $labelText = null, $inputAttrs = null ) {
- wfDeprecated( __METHOD__, '1.30' );
- return $this->getSummaryInputWidget( $summary, $labelText, $inputAttrs );
- }
-
/**
* Builds a standard summary input with a label.
*
protected function getLastDelete() {
$dbr = wfGetDB( DB_REPLICA );
$commentQuery = CommentStore::getStore()->getJoin( 'log_comment' );
+ $actorQuery = ActorMigration::newMigration()->getJoin( 'log_user' );
$data = $dbr->selectRow(
- [ 'logging', 'user' ] + $commentQuery['tables'],
+ array_merge( [ 'logging' ], $commentQuery['tables'], $actorQuery['tables'], [ 'user' ] ),
[
'log_type',
'log_action',
'log_timestamp',
- 'log_user',
'log_namespace',
'log_title',
'log_params',
'log_deleted',
'user_name'
- ] + $commentQuery['fields'], [
+ ] + $commentQuery['fields'] + $actorQuery['fields'],
+ [
'log_namespace' => $this->mTitle->getNamespace(),
'log_title' => $this->mTitle->getDBkey(),
'log_type' => 'delete',
'log_action' => 'delete',
- 'user_id=log_user'
],
__METHOD__,
[ 'LIMIT' => 1, 'ORDER BY' => 'log_timestamp DESC' ],
[
- 'user' => [ 'JOIN', 'user_id=log_user' ],
- ] + $commentQuery['joins']
+ 'user' => [ 'JOIN', 'user_id=' . $actorQuery['fields']['log_user'] ],
+ ] + $commentQuery['joins'] + $actorQuery['joins']
);
// Quick paranoid permission checks...
if ( is_object( $data ) ) {
if ( $level === 'user' && !$config->get( 'AllowUserCss' ) ) {
$format = false;
}
+ } elseif ( $content->getModel() == CONTENT_MODEL_JSON ) {
+ $format = 'json';
+ if ( $level === 'user' /* No comparable 'AllowUserJson' */ ) {
+ $format = false;
+ }
} elseif ( $content->getModel() == CONTENT_MODEL_JAVASCRIPT ) {
$format = 'js';
if ( $level === 'user' && !$config->get( 'AllowUserJs' ) ) {
}
# Used messages to make sure grep find them:
- # Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
+ # Messages: usercsspreview, userjsonpreview, userjspreview,
+ # sitecsspreview, sitejsonpreview, sitejspreview
if ( $level && $format ) {
$note = "<div id='mw-{$level}{$format}preview'>" .
$this->context->msg( "{$level}{$format}preview" )->text() .
return $checkboxes;
}
- /**
- * Returns an array of html code of the following checkboxes old style:
- * minor and watch
- *
- * @deprecated since 1.30 Use getCheckboxesWidget() or getCheckboxesDefinition() instead
- * @param int &$tabindex Current tabindex
- * @param array $checked See getCheckboxesDefinition()
- * @return array
- */
- public function getCheckboxes( &$tabindex, $checked ) {
- wfDeprecated( __METHOD__, '1.30' );
- $checkboxes = [];
- $checkboxesDef = $this->getCheckboxesDefinition( $checked );
-
- // Backwards-compatibility for the EditPageBeforeEditChecks hook
- if ( !$this->isNew ) {
- $checkboxes['minor'] = '';
- }
- $checkboxes['watch'] = '';
-
- foreach ( $checkboxesDef as $name => $options ) {
- $legacyName = isset( $options['legacy-name'] ) ? $options['legacy-name'] : $name;
- $label = $this->context->msg( $options['label-message'] )->parse();
- $attribs = [
- 'tabindex' => ++$tabindex,
- 'id' => $options['id'],
- ];
- $labelAttribs = [
- 'for' => $options['id'],
- ];
- if ( isset( $options['tooltip'] ) ) {
- $attribs['accesskey'] = $this->context->msg( "accesskey-{$options['tooltip']}" )->text();
- $labelAttribs['title'] = Linker::titleAttrib( $options['tooltip'], 'withaccess' );
- }
- if ( isset( $options['title-message'] ) ) {
- $labelAttribs['title'] = $this->context->msg( $options['title-message'] )->text();
- }
- if ( isset( $options['label-id'] ) ) {
- $labelAttribs['id'] = $options['label-id'];
- }
- $checkboxHtml =
- Xml::check( $name, $options['default'], $attribs ) .
- ' ' .
- Xml::tags( 'label', $labelAttribs, $label );
-
- $checkboxes[ $legacyName ] = $checkboxHtml;
- }
-
- // Avoid PHP 7.1 warning of passing $this by reference
- $editPage = $this;
- Hooks::run( 'EditPageBeforeEditChecks', [ &$editPage, &$checkboxes, &$tabindex ], '1.29' );
- return $checkboxes;
- }
-
- /**
- * Returns an array of checkboxes for the edit form, including 'minor' and 'watch' checkboxes and
- * any other added by extensions.
- *
- * @deprecated since 1.30 Use getCheckboxesWidget() or getCheckboxesDefinition() instead
- * @param int &$tabindex Current tabindex
- * @param array $checked Array of checkbox => bool, where bool indicates the checked
- * status of the checkbox
- *
- * @return array Associative array of string keys to OOUI\FieldLayout instances
- */
- public function getCheckboxesOOUI( &$tabindex, $checked ) {
- wfDeprecated( __METHOD__, '1.30' );
- return $this->getCheckboxesWidget( $tabindex, $checked );
- }
-
/**
* Returns an array of checkboxes for the edit form, including 'minor' and 'watch' checkboxes and
* any other added by extensions.