"requireVarDeclFirst": null,
- "disallowQuotedKeysInObjects": "allButReserved",
"requireDotNotation": { "allExcept": [ "keywords" ] },
"jsDoc": {
"checkAnnotations": {
HHVM 3.1.
=== Configuration changes in 1.27 ===
+* $wgAllowMicrodataAttributes and $wgAllowRdfaAttributes were removed,
+ now always enabled. If you use RDFa on your wiki, you now have to explicitly
+ set $wgHtml5Version to 'HTML+RDFa 1.0' or 'XHTML+RDFa 1.0'.
* $wgUseLinkNamespaceDBFields was removed.
* Deprecated $wgResourceLoaderMinifierStatementsOnOwnLine and
$wgResourceLoaderMinifierMaxLineLength, because there was little value in
/**
* Defines the value of the version attribute in the <html> tag, if any.
- * If $wgAllowRdfaAttributes is true, and this evaluates to boolean false
- * (like if it's left at the default null value), it will be auto-initialized
- * to the correct value for RDFa+HTML5. As such, you should have no reason to
- * ever actually set this to anything.
+ *
+ * If your wiki uses RDFa, set it to the correct value for RDFa+HTML5.
+ * Correct current values are 'HTML+RDFa 1.0' or 'XHTML+RDFa 1.0'.
+ * See also http://www.w3.org/TR/rdfa-in-html/#document-conformance
+ * @since 1.16
*/
$wgHtml5Version = null;
*/
$wgUseMediaWikiUIEverywhere = false;
-/**
- * Enabled RDFa attributes for use in wikitext.
- * NOTE: Interaction with HTML5 is somewhat underspecified.
- */
-$wgAllowRdfaAttributes = false;
-
-/**
- * Enabled HTML5 microdata attributes for use in wikitext.
- */
-$wgAllowMicrodataAttributes = false;
-
/**
* Should we try to make our HTML output well-formed XML? If set to false,
* output will be a few bytes shorter, and the HTML will arguably be more
if ( $permErrors ) {
wfDebug( __METHOD__ . ": User can't edit\n" );
// Auto-block user's IP if the account was "hard" blocked
- $user = $wgUser;
- DeferredUpdates::addCallableUpdate( function() use ( $user ) {
- $user->spreadAnyEditBlock();
- } );
-
+ if ( !wfReadOnly() ) {
+ $user = $wgUser;
+ DeferredUpdates::addCallableUpdate( function () use ( $user ) {
+ $user->spreadAnyEditBlock();
+ } );
+ }
$this->displayPermissionsError( $permErrors );
return;
if ( $wgUser->isBlockedFrom( $this->mTitle, false ) ) {
// Auto-block user's IP if the account was "hard" blocked
- $wgUser->spreadAnyEditBlock();
+ if ( !wfReadOnly() ) {
+ $wgUser->spreadAnyEditBlock();
+ }
# Check block state against master, thus 'false'.
$status->setResult( false, self::AS_BLOCKED_PAGE_FOR_USER );
return $status;
* @return array
*/
public static function getRecognizedTagData( $extratags = [], $removetags = [] ) {
- global $wgAllowMicrodataAttributes, $wgAllowImageTag;
+ global $wgAllowImageTag;
static $htmlpairsStatic, $htmlsingle, $htmlsingleonly, $htmlnest, $tabletags,
$htmllist, $listtags, $htmlsingleallowed, $htmlelementsStatic, $staticInitialised;
// Base our staticInitialised variable off of the global config state so that if the globals
// are changed (like in the screwed up test system) we will re-initialise the settings.
- $globalContext = implode( '-', compact( 'wgAllowMicrodataAttributes', 'wgAllowImageTag' ) );
+ $globalContext = $wgAllowImageTag;
if ( !$staticInitialised || $staticInitialised != $globalContext ) {
$htmlpairsStatic = [ # Tags that must be closed
'b', 'bdi', 'del', 'i', 'ins', 'u', 'font', 'big', 'small', 'sub', 'sup', 'h1',
$htmlsingleonly = [ # Elements that cannot have close tags
'br', 'wbr', 'hr'
];
- if ( $wgAllowMicrodataAttributes ) {
- $htmlsingle[] = $htmlsingleonly[] = 'meta';
- $htmlsingle[] = $htmlsingleonly[] = 'link';
- }
+
+ $htmlsingle[] = $htmlsingleonly[] = 'meta';
+ $htmlsingle[] = $htmlsingleonly[] = 'link';
+
$htmlnest = [ # Tags that can be nested--??
'table', 'tr', 'td', 'th', 'div', 'blockquote', 'ol', 'ul',
'li', 'dl', 'dt', 'dd', 'font', 'big', 'small', 'sub', 'sup', 'span',
* @todo Check for unique id attribute :P
*/
static function validateAttributes( $attribs, $whitelist ) {
- global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
-
$whitelist = array_flip( $whitelist );
$hrefExp = '/^(' . wfUrlProtocols() . ')[^\s]+$/';
$out = [];
foreach ( $attribs as $attribute => $value ) {
- # allow XML namespace declaration if RDFa is enabled
- if ( $wgAllowRdfaAttributes && preg_match( self::XMLNS_ATTRIBUTE_PATTERN, $attribute ) ) {
+ # Allow XML namespace declaration to allow RDFa
+ if ( preg_match( self::XMLNS_ATTRIBUTE_PATTERN, $attribute ) ) {
if ( !preg_match( self::EVIL_URI_PATTERN, $value ) ) {
$out[$attribute] = $value;
}
$out[$attribute] = $value;
}
- if ( $wgAllowMicrodataAttributes ) {
- # itemtype, itemid, itemref don't make sense without itemscope
- if ( !array_key_exists( 'itemscope', $out ) ) {
- unset( $out['itemtype'] );
- unset( $out['itemid'] );
- unset( $out['itemref'] );
- }
- # TODO: Strip itemprop if we aren't descendants of an itemscope or pointed to by an itemref.
+ # itemtype, itemid, itemref don't make sense without itemscope
+ if ( !array_key_exists( 'itemscope', $out ) ) {
+ unset( $out['itemtype'] );
+ unset( $out['itemid'] );
+ unset( $out['itemref'] );
}
+ # TODO: Strip itemprop if we aren't descendants of an itemscope or pointed to by an itemref.
+
return $out;
}
* @return array
*/
static function setupAttributeWhitelist() {
- global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
- static $whitelist, $staticInitialised;
+ static $whitelist;
- $globalContext = implode( '-', compact( 'wgAllowRdfaAttributes', 'wgAllowMicrodataAttributes' ) );
-
- if ( $whitelist !== null && $staticInitialised == $globalContext ) {
+ if ( $whitelist !== null ) {
return $whitelist;
}
'aria-labelledby',
'aria-owns',
'role',
- ];
- if ( $wgAllowRdfaAttributes ) {
- # RDFa attributes as specified in section 9 of
+ # RDFa
+ # These attributes are specified in section 9 of
# http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014
- $common = array_merge( $common, [
- 'about', 'property', 'resource', 'datatype', 'typeof',
- ] );
- }
+ 'about',
+ 'property',
+ 'resource',
+ 'datatype',
+ 'typeof',
- if ( $wgAllowMicrodataAttributes ) {
- # add HTML5 microdata tags as specified by
+ # Microdata. These are specified by
# http://www.whatwg.org/html/microdata.html#the-microdata-model
- $common = array_merge( $common, [
- 'itemid', 'itemprop', 'itemref', 'itemscope', 'itemtype'
- ] );
- }
+ 'itemid',
+ 'itemprop',
+ 'itemref',
+ 'itemscope',
+ 'itemtype',
+ ];
$block = array_merge( $common, [ 'align' ] );
$tablealign = [ 'align', 'valign' ];
'link' => [ 'itemprop', 'href' ],
];
- $staticInitialised = $globalContext;
-
return $whitelist;
}
$wgXhtmlDefaultNamespace = 'http://www.w3.org/1999/xhtml';
$wgJsMimeType = 'text/javascript';
-if ( !$wgHtml5Version && $wgAllowRdfaAttributes ) {
- // see http://www.w3.org/TR/rdfa-in-html/#document-conformance
- if ( $wgMimeType == 'application/xhtml+xml' ) {
- $wgHtml5Version = 'XHTML+RDFa 1.0';
- } else {
- $wgHtml5Version = 'HTML+RDFa 1.0';
- }
-}
-
// Blacklisted file extensions shouldn't appear on the "allowed" list
$wgFileExtensions = array_values( array_diff( $wgFileExtensions, $wgFileBlacklist ) );
}
wfDebugLog( 'api', $msg, 'private' );
- // ApiRequest channel is for structured data consumers
- wfDebugLog( 'ApiRequest', '', 'private', $logCtx );
+ // ApiAction channel is for structured data consumers
+ wfDebugLog( 'ApiAction', '', 'private', $logCtx );
}
/**
$result = $this->textDiff( $otext, $ntext );
- $time = microtime( true ) - $time;
- $this->getStats()->timing( 'diff_time', $time * 1000 );
+ $time = intval( ( microtime( true ) - $time ) * 1000 );
+ $this->getStats()->timing( 'diff_time', $time );
+ // Log requests slower than 99th percentile
+ if ( $time > 100 && $this->mOldPage && $this->mNewPage ) {
+ wfDebugLog( 'diff',
+ "$time ms diff: {$this->mOldid} -> {$this->mNewid} {$this->mNewPage}" );
+ }
return $result;
}
$ms = intval( 1000 * $dbwSerial->pendingWriteQueryDuration() );
$msg = $job->toString() . " COMMIT ENQUEUED [{$ms}ms of writes]";
- $this->logger->warning( $msg );
+ $this->logger->info( $msg );
$this->debugCallback( $msg );
// Wait for an exclusive lock to commit
* @ingroup Cache
*/
-use Psr\Log\LoggerInterface;
-
/**
* Wrapper around a BagOStuff that caches data in memory
*
}
/**
- * @return string
+ * @return string HTML
*/
function getCategoryLinks() {
global $wgUseCategoryBrowser;
}
/**
- * @return string
+ * @return string HTML
*/
function getCategories() {
$out = $this->getOutput();
-
$catlinks = $this->getCategoryLinks();
- $classes = 'catlinks';
-
// Check what we're showing
$allCats = $out->getCategoryLinks();
$showHidden = $this->getUser()->getBoolOption( 'showhiddencats' ) ||
$this->getTitle()->getNamespace() == NS_CATEGORY;
+ $classes = [ 'catlinks' ];
if ( empty( $allCats['normal'] ) && !( !empty( $allCats['hidden'] ) && $showHidden ) ) {
- $classes .= ' catlinks-allhidden';
+ $classes[] = 'catlinks-allhidden';
}
- return "<div id='catlinks' class='$classes' data-mw='interface'>{$catlinks}</div>";
+ return Html::rawElement(
+ 'div',
+ [ 'id' => 'catlinks', 'class' => $classes, 'data-mw' => 'interface' ],
+ $catlinks
+ );
}
/**
$context = new DerivativeContext( $this->getContext() );
$context->setTitle( $this->getPageTitle() ); // Remove subpage
- $form = new HTMLForm( [
+ $form = HTMLForm::factory( 'ooui', [
'Clear' => [
'type' => 'hidden',
'default' => true,
'name' => 'clear',
]
], $context, 'clearStashedUploads' );
+ $form->setSubmitDestructive();
$form->setSubmitCallback( [ __CLASS__, 'tryClearStashedUploads' ] );
$form->setSubmitTextMsg( 'uploadstash-clear' );
*/
public function execute( $subPage ) {
// Make sure session is persisted
- $session = MediaWiki\Session\SessionManager::getGlobalSession();
+ $session = SessionManager::getGlobalSession();
$session->persist();
$this->load();
$wgCookieSecure = false;
}
- MediaWiki\Session\SessionManager::getGlobalSession()->resetId();
+ SessionManager::getGlobalSession()->resetId();
}
/**
*
* @since 1.27
*/
-class LoggedOutEditToken extends MediaWiki\Session\Token {
+class LoggedOutEditToken extends Token {
public function __construct() {
parent::__construct( '', '', false );
}
if ( $this->isLoggedIn() && $this->isBlocked() ) {
return $this->spreadBlock();
}
+
return false;
}
"recentchangeslinked-page": "Page name:",
"recentchangeslinked-to": "Show changes to pages linked to the given page instead",
"recentchanges-page-added-to-category": "[[:$1]] added to category",
- "recentchanges-page-added-to-category-bundled": "[[:$1]] and {{PLURAL:$2|one page|$2 pages}} added to category",
+ "recentchanges-page-added-to-category-bundled": "[[:$1]] and [[Special:WhatLinksHere/$1|{{PLURAL:$2|one page|$2 pages}}]] added to category",
"recentchanges-page-removed-from-category": "[[:$1]] removed from category",
- "recentchanges-page-removed-from-category-bundled": "[[:$1]] and {{PLURAL:$2|one page|$2 pages}} removed from category",
+ "recentchanges-page-removed-from-category-bundled": "[[:$1]] and [[Special:WhatLinksHere/$1|{{PLURAL:$2|one page|$2 pages}}]] removed from category",
"autochange-username": "MediaWiki automatic change",
"upload": "Upload file",
"uploadbtn": "Upload file",
'wgExternalLinkTarget' => false,
'wgHtml5' => true,
'wgWellFormedXml' => true,
- 'wgAllowMicrodataAttributes' => true,
'wgAdaptiveMessageCache' => true,
'wgDisableLangConversion' => false,
'wgDisableTitleConversion' => false,
!! wikitext
<span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">MediaWiki</span>
!! html/php
-<p><span>MediaWiki</span>
+<p><span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">MediaWiki</span>
</p>
!! html/parsoid
<p><span xmlns:dct="http://purl.org/dc/terms/" data-x-property="dct:title" data-parsoid='{"stx":"html"}'>MediaWiki</span></p>
$templateTitle,
$templatePage->getParserOutput( new ParserOptions() ),
Title::newFromText( 'Baz' ),
- [ [ 'Baz', '[[:Template:TestingTemplate]] and 2 pages added to category' ] ]
+ [ [
+ 'Baz',
+ '[[:Template:TestingTemplate]] and [[Special:WhatLinksHere/Template:TestingTemplate|2 pages]] '
+ . 'added to category'
+ ] ]
);
}
$tmpGlobals['wgAllowExternalImages'] = true;
$tmpGlobals['wgRawHtml'] = false;
$tmpGlobals['wgWellFormedXml'] = true;
- $tmpGlobals['wgAllowMicrodataAttributes'] = true;
$tmpGlobals['wgExperimentalHtmlIds'] = false;
$tmpGlobals['wgAdaptiveMessageCache'] = true;
$tmpGlobals['wgUseDatabaseMessages'] = true;