ShellboxClientFactory::getUrl(): Check if $this->key is null
[mediawiki.git] / RELEASE-NOTES-1.39
blobac2188d0a11fbca19b5c7d2afc0face3b9afa001
1 = MediaWiki 1.39 =
3 == MediaWiki 1.39.0-PRERELEASE ==
5 THIS IS NOT A RELEASE YET
7 MediaWiki 1.39 is an alpha-quality development branch, and is not recommended
8 for use in production.
10 == Upgrading notes for 1.39 ==
11 Don't forget to always back up your database before upgrading!
13 See the file UPGRADE for more detailed per-version upgrade instructions from the
14 oldest supported upgrading version, MediaWiki 1.31.
16 Some specific notes for MediaWiki 1.39 upgrades are below:
17 * …
19 For notes on 1.38.x and older releases, see HISTORY.
21 === Configuration changes for system administrators in 1.39 ===
22 * The default serialization method for file meta-data has been changed to JSON.
23   You can revert it to PHP by setting the 'useJsonMetadata' property to false in
24   $wgLocalFileRepo.
25 * The DBO_SSL flag in $wgDBservers and $wgLBFactoryConf has been deprecated in
26   favour of a boolean "ssl" parameter.
27 * …
29 ==== New configuration ====
30 * $wgAutoCreateTempUser – configures automatic user creation on page save.
31 * $wgCopyUploadAllowOnWikiDomainConfig – Configures if administrators can use
32   the MediaWiki:Copyupload-allowed-domains system message to define which
33   domains can be used with the upload-by-url tool.
34 * …
36 ==== Changed configuration ====
37 * $wgInvalidUsernameCharacters now contains the char '>',
38   reserved delimiter for external user names.
39 * …
41 ==== Removed configuration ====
42 * $wgMultiContentRevisionSchemaMigrationStage - Migration is over, was
43   deprecated since 1.35.
44 * $wgWikiFarmSiteDetector – experimental setting removed without replacement.
45   Use the MW_WIKI_NAME environment variable to specifiy the name of the site
46   to load configuration for. Using the WIKI_NAME environment variable for this
47   purpose is deprecated.
48 * $wgParserCacheUseJson - the ParserCache now always uses JSON serialization.
49   Reading old non-JSON cache entries is still supported. The setting had been
50   deprecated since 1.36.
51 * $wgAllowJavaUploads - To allow uploads of JAR files, remove application/java
52   from $wgMimeTypeExclusions.
53 * $wgMaxRedirects has been removed. This feature never worked as intended,
54   see T296430.
55 * $wgElementTiming has been removed. This feature was experimental,
56   and disabled by default.
57 * $wgPriorityHints and $wgPriorityHintsRatio have been removed.
58   This feature was experimental, and disabled by default.
59 * $wgActorTableSchemaMigrationStage has been removed. Migration is over.
60 * In $wgObjectCaches, globalKeyLB and localKeyLB are no longer supported.
61 * $wgLegacySchemaConversion - This global configuration has been
62   removed because it was unused.
63 * $wgInterwikiPrefixDisplayTypes - This global configuration has been
64   removed because it was unused.
65 * …
67 === New user-facing features in 1.39 ===
68 * Optional automatic user creation on page save ($wgAutoCreateTempUser)
69 * Administrators now have the option to delete/undelete the associated "Talk"
70   page when they are (un)deleting a given page. `deletetalk` and `undeletetalk`
71   options were added to the 'delete' and 'undelete' action APIs in MW 1.38.
72 * `{{=}}` is now a wikitext built-in magic word, expanding to `=`.  This is
73   conventionally used as an escape mechanism to allow the use of `=` in
74   unnamed template arguments.  Defining [[Template:=]] to expand to something
75   other than `=` has been deprecated since 1.36, with affected pages put into
76   a special tracking category for migration.
77 * …
79 === New developer features in 1.39 ===
80 * …
82 === External library changes in 1.39 ===
84 ==== New external libraries ====
85 * Added Codex v0.1.0-alpha.8
86 * …
88 ===== New development-only external libraries =====
89 * Updated QUnit from 2.18.0 to 2.18.2.
90 * …
92 ==== Changed external libraries ====
93 * Updated OOUI from v0.43.2 to v0.44.0.
94 * Updated composer/semver from 3.2.6 to 3.3.2.
95 * Updated vue/compat from 3.2.23 to 3.2.31.
96 * Updated wikimedia/minify from 2.2.6 to 2.3.0.
97 * Updated wikimedia/ip-set from 3.0.0 to 3.1.0.
98 * Updated wikimedia/xmp-reader from 0.8.1 to 0.8.2.
99 * Updated wikimedia/timestamp from 3.0.0 to 4.0.0.
100 * …
102 ===== Changed development-only external libraries =====
103 * Updated composer/spdx-licenses from 1.5.5 to 1.5.6.
104 * …
106 ==== Removed external libraries ====
107 * …
109 === Bug fixes in 1.39 ===
110 * …
112 === Action API changes in 1.39 ===
113 * New `undeletetalk` parameter on action=undelete that allows you to restore
114   all revisions of the associated talk page.
115 * …
117 === Action API internal changes in 1.39 ===
118 * …
120 === Languages updated in 1.39 ===
121 MediaWiki supports over 350 languages. Many localisations are updated regularly.
122 Below only new and removed languages are listed, as well as changes to languages
123 because of Phabricator reports.
125 * (T307080) Added language support for Okinawan (ryu).
126 * (T307887) Added language support for Mooré (mos).
127 * (T308813) Added language support for Nigerian Pidgin (pcm).
128 * (T309763) Added language support for Tai Nüa (tdd).
129 * (T310040) Added language support for Fante (fat).
130 * (T310976) Added language support for Tumbuka (tum). (Actually, it was
131   in Names.php and even used for a Wikipedia, but actualy localization
132   was added only now.)
133 * (T304920) In Swahili, The "Media" namespace is now "Media", as in English,
134   and the "File" namespace is now "Faili". The old name of the "File" namespace
135   was "Picha", and it's kept for backwards compatibility. If you manage a wiki
136   in Swahili, and you use "Faili:" as a namespace anywhere in wikitext, and
137   you mean to use it as "Media:", these need to be replaced to "Media:".
138 * (T309866) Some namespace translations were updated for Kyrgyz (ky). The old
139   ones are retained as aliases for backwards compatibility.
141 === Breaking changes in 1.39 ===
142 * Basic non-JavaScript (Grade C) support has been dropped for Internet Explorer
143   9-10, Firefox 27-38, and Android 4.3-4.4.
144 * The following methods, deprecated since 1.37, have been removed from IDatabase
145   - ::fetchObject()
146   - ::fetchRow()
147   - ::numRows()
148   - ::freeResult()
149 * Title::getDefaultNamespace(), deprecated since 1.37, has been removed.
150 * The DBPrimaryPos class alias 'DBMasterPos' has been removed.
151 * The global function wfGetLB(), deprecated since 1.27, has been removed.
152 * Passing a db to BlockRestrictionStore::loadByBlockId() is no longer supported.
153   BlockRestrictionStoreFactory should be used to fetch a correct
154   BlockRestrictionStore instead. This was deprecated since 1.38.
155 * The global function wfGetCache(), deprecated since 1.32, has been removed. You
156   can use ObjectCache::getInstance() instead.
157 * The global function wfGetMainCache(), deprecated since 1.32, has been removed.
158   You can use ObjectCache::getLocalClusterInstance() instead.
159 * MovePage::__construct() now requires that all parameters be passed. The
160   fallback to MediaWikiServices emitted deprecation notices since 1.37.
161 * WikiPage::doEditContent(), deprecated since 1.32, was removed.
162 * WikiPage::prepareContentForEdit() now requires a UserIdentity parameter to be
163   provided. Not providing one has been deprecated since 1.37.
164 * EventRelayerKafka, deprecated in 1.38, was removed.
165 * MediaWiki\Logger\Monolog\KafkaHandler, deprecated in 1.38, was removed.
166 * The "trace" option of SectionProfiler, deprecated in 1.38, was removed.
167 * The global function wfWikiID(), deprecated since 1.35, has been removed.
168 * Database::wasKnownStatementRollbackError() was removed. Subclasses should
169   override isKnownStatementRollbackError() instead.
170 * Database::wasQueryTimeoutError() was removed. Subclasses should
171   override isQueryTimeoutError() instead.
172 * Database::buildSuperlative() has been removed without deprecation.
173 * The following methods, deprecated in 1.37, have been removed:
174   - Linker::setStubThreshold(), ::getStubThreshold().
175   - LinkRendererFactory::createForUser().
176   - ParserOptions::getStubThreshold(), ::setStubThreshold().
177 * Changes to ResourceLoader modules:
178   - The mediawiki.viewport module, deprecated in 1.37 has been
179      removed. Use IntersectionObserver instead.
180 * If you manage a wiki in Swahili, and you use "Faili:" as a namespace anywhere,
181   and you mean to use it as "Media:", replace it with "Media:". See T304920.
182 * Changes to skins:
183   - Skin::getCopyrightIcon(), ::getPoweredBy(), deprecated in 1.37 have been
184     removed.
185   - Skin::bottomScripts soft deprecated in 1.37, was hard deprecated.
186     Skins using SkinTemplate must set bodyOnly as a skin option and
187     remove lines of code generating html, body and head elements.
188   - Skin::makeSearchButton and Skin::makeSearchInput were deprecated in 1.38.
189     Use SkinTemplate methods with the same name or Skin::getTemplateData
190     instead.
191   - Styles for the HTML classes `warningbox`, `errorbox` and `successbox` have
192     been removed in favor of Html class methods.
193   - The feature `legacy` used inside ResourceLoaderSkinModule,
194     deprecated in 1.37, will no longer ship any styles.
195   - Skin::getSkinStylePath, deprecated since 1.36, has been removed.
196   - Skin::getPortletData has been made private.
197   - SkinTemplate::getPersonalToolsList(), deprecated in 1.35 has been
198     removed.
199 * Experimental wiki farm support: Automatic detection of the requested site
200   within a wiki farm based on the requested domain has been removed.
201   Use the MW_WIKI_NAME environment variable to specify the name of the site
202   to load configuration for. Using the WIKI_NAME environment variable for this
203   purpose is deprecated. This is only relevant if you have been using
204   $wgWikiFarmSettingsDirectory to load wiki farm config.
205 * MWExceptionHandler::installHandler was marked @internal and had required
206   arguments added. This method is intended for use in bootstrap code and is
207   unused in known extensions.
208 * MWException::useOutputPage was made private without deprecation.
209   This method was apparently only public for testing and is unused in known
210   extensions.
211 * Calling getId() on a User or UserIdentityValue from the wrong wiki, deprecated
212   since 1.36, now throws an exception.
213 * The following methods have been removed from ExtensionRegistry without
214   deprecation and without replacement. They had been introduced in 1.35 for use
215   in the testing framework, and were not in use by any known extension:
216   - exportAutoloadClassesAndNamespaces
217   - exportTestAutoloadClassesAndNamespaces
218 * The MWNamespace class, deprecated since 1.34, has been removed. Use the
219   NamespaceInfo service instead.
220 * The UnknownContent and UnknownContentHandler class aliases have been removed,
221   use FallbackContent and FallbackContentHandler instead.
222 * IResultWrapper::next() now returns void, to match the Iterator interface that
223   it implements. fetchObject() has the same behavior as next() used to.
224 * In HTMLForm HTMLAutoCompleteSelectFields, the parameters 'autocomplete' and
225   'autocomplete-messages', which were deprecated in MediaWiki 1.29, were
226   removed. Instead, use 'autocomplete-data' and 'autocomplete-data-messages'.
227 * ParserOutput::setText will now set the ParserOutput's text to null if
228   given null. Previously it did nothing if given null.
229 * The default value for the first argument to the ParserOutput constructor
230   is now null instead of ''.
231 * IDatabase::lockTables() and IDatabase::unlockTables(), deprecated since 1.38,
232   have been removed.
233 * The $context parameter to `new HTMLForm( … )` and `HTMLForm::factory( … )`
234   is now required.
235 * The class alias for revision related classes in namespace MediaWiki\Storage
236   has been removed. Classes are IncompleteRevisionException,
237   MutableRevisionRecord, MutableRevisionSlots, RevisionAccessException,
238   RevisionArchiveRecord, RevisionFactory, RevisionLookup, RevisionRecord,
239   RevisionSlots, RevisionStore, RevisionStoreRecord, SlotRecord, and
240   SuppressedDataException.
241 * Calling getBy() on an AbstractBlock from the wrong wiki, deprecated since
242   1.38, now throws an exception.
243 * Passing a MediaWiki\Linker\LinkTarget to EditPage::makeTemplatesOnThisPageList
244   or TemplatesOnThisPageFormatter::format is no longer supported,
245   a MediaWiki\Page\PageIdentity is required.
246 * The deprecated class alias FakeConverter has been removed, use
247   TrivialLanguageConverter instead.
248 * The deprecated ApiQueryContributions class alias has been removed, use
249   ApiQueryUserContribs instead.
250 * The deprecated MediaWiki\Special\SpecialPageFactory class alias has been
251   removed, use MediaWiki\SpecialPage\SpecialPageFactory instead.
252 * The following skin modules, deprecated in 1.37, have been removed:
253         - mediawiki.skinning.elements
254         - mediawiki.skinning.content
255         - mediawiki.toc.styles
256         - mediawiki.legacy.config
257         - mediawiki.legacy.shared
258         - mediawiki.legacy.commonPrint
259 * FileModule::compileLessFile(), deprecated since 1.35, has been removed. Use
260   ::compileLessString() instead.
261 * LogFormatter::styleRestricedElement(), deprecated since 1.37, has been
262   removed. Use ::styleRestrictedElement() instead.
263 * Title::isNamespaceProtected(), deprecated in 1.34, has been removed.
264 * ApiStashEdit::parseAndStash(), deprecated in 1.34, has been removed.
265 * LinkCache::forUpdate(), deprecated in 1.34, has been removed.
266 * Passing null instead of a NamespaceInfo instance to LinkCache::__construct()
267   is not supported anymore. It is recommended to request an instance from the
268   service container.
269 * ApiQueryBase::showHiddenUsersAddBlockInfo(), deprecated in 1.34, has been
270   removed. Use ApiQueryBlockInfoTrait instead.
271 * ApiQueryBase::prefixedTitlePartToKey(), deprecated in 1.35, has been removed.
272   Use ::parsePrefixedTitlePart() instead.
273 * ExternalStoreDB::getSlave(), deprecated in 1.34, has been removed. Use
274   ExternalStoreDB::getReplica() instead.
275 * ChangesListSpecialPage::checkStructuredFilterUiEnabled() and
276   SpecialWatchlist::checkStructuredFilterUiEnabled() now support UserIdentity
277   as the only argument. Passing Config argument was deprecated in 1.34.
278 * DatabaseUpdater::ifNoActorTable(), deprecated in 1.35, has been removed. Use
279   ::ifTableNotExists() instead.
280 * MediaWiki\Revision\RevisionStoreFactory::getRevisionStore was documented
281   to allow passing bool true as a dbDomain, this is no longer possible,
282   because that is an invalid value for a dbDomain.
283 * LinkHolderArray::__construct() had its signature changed. The class was marked
284   internal in 1.35.
285 * SpecialMute::isTargetBlacklisted(), deprecated in 1.35, has been removed. Use
286   ::isTargetMuted() instead.
287 * WebRequest::checkUrlExtension(), deprecated in 1.35, has been removed.
288 * ContentHandler::cleanupHandlersCache(), deprecated in 1.35, has been removed.
289 * SpecialVersion::getExtAuthorsFileName, deprecated in 1.35, has been removed.
290   Use MediaWiki\ExtensionInfo::getAuthorsFileName.
291 * SpecialVersion::getExtLicenseFileName, deprecated in 1.35, has been removed.
292   Use MediaWiki\ExtensionInfo::getLicenseFileNames.
293 * CategoryPage::getCategoryViewerClass and ::setCategoryViewerClass, deprecated
294   in 1.35, have been removed.
295 * SqlBlobStore::getLegacyEncodingConversionLang(), deprecated in 1.34, has been
296   removed.
297 * wfCanIPUseHTTPS(), deprecated in 1.37, has been removed.
298 * The following methods of Database class, are no longer stable to override:
299   - ::implicitOrderby()
300   - ::selectSQLText()
301   - ::bitNot()
302   - ::bitAnd()
303   - ::bitOr()
304   - ::buildConcat()
305   - ::buildGreatest()
306   - ::buildLeast()
307   - ::buildSubstring()
308   - ::buildStringCast()
309   - ::buildIntegerCast()
310   - ::tableName()
311   - ::addIdentifierQuotes()
312   - ::buildLike()
313   - ::limitResult()
314   - ::unionSupportsOrderAndLimit()
315   - ::unionQueries()
316   - ::conditional()
317   - ::strreplace()
318   - ::timestamp()
319   - ::getInfinity()
320   - ::setTableAliases()
321   - ::setIndexAliases()
322   - ::buildGroupConcatField()
323 * …
325 === Deprecations in 1.39 ===
326 * PageProps::getInstance(), deprecated since 1.38, emits deprecations warnings.
327 * The global function wfGetDB() has been deprecated. Use
328   LoadBalancer::getConnection() instead.
329 * SpecialRedirectWithAction::__construct without SearchEngineFactory argument
330   is hard deprecated.
331 * Use of the SiteStatsUpdate constructor has been deprecated in favor of
332   the ::factory() method.
333 * AuthManager::checkAccountCreatePermissions has been deprecated. Use
334   AuthManager::authorizeCreateAccount or AuthManager::probablyCanCreateAccount
335   instead.
336 * Title::getSelectFields() has been deprecated in favor of
337   PageStore::newSelectQueryBuilder()
338 * Title::newFromTitleValue(), deprecated since in 1.34, now emits deprecation
339   warnings. Use ::newFromLinkTarget() instead.
340 * ExtensionRegistry::readFromQueue() has been marked @internal. Extensions
341   should use ExtensionProcessor instead.
342 * Processor::getExtraAutoloaderPaths() and
343   ExtensionProcessor::getExtraAutoloaderPaths() have been deprecated, use get
344   getExtractedAutoloadInfo() instead.
345 * The following global functions are deprecated in favor of the listed UrlUtils
346   methods.
347   - wfExpandUrl -> UrlUtils::expand
348   - wfGetServerUrl -> UrlUtils::getServer
349   - wfAssembleUrl -> UrlUtils::assemble
350   - wfRemoveDotSegments -> UrlUtils::removeDotSegments
351   - wfUrlProtocols -> UrlUtils::validProtocols
352   - wfUrlProtocolsWithoutProtRel -> UrlUtils::validAbsoluteProtocols
353   - wfParseUrl -> UrlUtils::parse
354   - wfExpandIRI -> UrlUtils::expandIRI
355   - wfMatchesDomainList -> UrlUtils::matchesDomainList
356   These methods are exact replacements except that
357   1) they return null instead of false or empty string on error (where
358      applicable);
359   2) UrlUtils::validProtocols does not take a parameter (documentation said not
360      to pass one to wfUrlProtocols anyway);
361   3) they use type hints (don't try passing null instead of string, etc.).
362 * MaintainableDBConnRef is deprecated, use DBConnRef instead.
363 * Loading DefaultSettings.php is deprecated. To get default values of main
364   config settings, use MainConfigSchema::listDefaultValues() or
365   MainConfigSchema::getDefaultValue().
366 * AbstractContent::getRedirectChain() and
367   AbstractContent::getUltimateRedirectTarget() are now emitting deprecation
368   warnings (T296430).
369 * (T244138) QueryPage::getSQL() is deprecated. Instead QueryPage::getQueryInfo()
370   should be overridden.
371 * Calling new JobRunner() directly without $serviceOptions now emits
372   deprecation warnings. Use MediaWikiServices::getInstance()->getJobRunner()
373   instead.
374 * Passing an array of targets to Article::getRedirectHeaderHtml() is
375   deprecated. Supply a single redirect target instead (T296430).
376 * The following Less mediawiki.mixins have been deprecated:
377   - .animation()
378   - .animation-delay()
379   - .transform-rotate()
380 * Skin::getAction is deprecated. Use IContextSource::getActionName instead.
381 * ILBFactory::forEachLB() is deprecated. Use ::getAllLBs().
382 * LoadBalancer::forEachOpenConnection() and ::forEachOpenPrimaryConnection()
383   are deprecated without replacement.
384 * The following classes were moved from the root namespace to the
385   MediaWiki\ResourceLoader namespace, the old names becoming deprecated aliases:
386   ResourceLoader, MessageBlobStore, VueComponentParser.
387 * The following classes had the "ResourceLoader" prefix stripped while being
388   moved to the MediaWiki\ResourceLoader namespace, the old names becoming
389   deprecated aliases: DerivativeResourceLoaderContext,
390   ResourceLoaderCircularDependencyError, ResourceLoaderClientHtml,
391   ResourceLoaderCodexModule, ResourceLoaderContext, ResourceLoaderFileModule,
392   ResourceLoaderFilePath, ResourceLoaderForeignApiModule, ResourceLoaderImage,
393   ResourceLoaderImageModule, ResourceLoaderLanguageDataModule,
394   ResourceLoaderLessVarFileModule, ResourceLoaderModule,
395   ResourceLoaderMwUrlModule, ResourceLoaderOOUIFileModule,
396   ResourceLoaderOOUIIconPackModule, ResourceLoaderOOUIImageModule,
397   ResourceLoaderOOUIModule, ResourceLoaderSiteModule,
398   ResourceLoaderSiteStylesModule, ResourceLoaderSkinModule,
399   ResourceLoaderStartUpModule, ResourceLoaderUserModule,
400   ResourceLoaderUserOptionsModule, ResourceLoaderUserStylesModule,
401   ResourceLoaderWikiModule.
402 * The following methods in WikiRevision and their interfaces
403   ImportableUploadRevision and ImportableOldRevision are deprecated:
404   - ::getUserObj() → ::getUser()
405   - ::setUserObj() → ::setUsername()
406   - ::setUserIP() → ::setUsername()
407 * ObjectCache::addBusyCallback() is deprecated and non-functional.
408 * MWTimestamp::getHumanTimestamp(), deprecated in 1.26, now emits deprecation
409   warnings.
410 * Article::viewRedirect(), deprecated in 1.30, now emits deprecation warnings.
411 * User::blockedFor(), deprecated in 1.35, now emits deprecation warnings.
412 * Access to previously public properties AbstractBlock::$mExpiry,
413   AbstractBlock::$mHideName, AbstractBlock::$mTimestamp, DatabaseBlock::$mAuto,
414   and DatabaseBlock::$mParentBlockId, deprecated in 1.34, now emits deprecation
415   warnings.
416 * Access to previously public properties User::$mBlock, User::$mBlockedby, and
417   User::$mHideName, deprecated in 1.35, now emits deprecation warnings.
418 * JobQueueGroup::singleton() and ::destroySingletons(), deprecated in 1.37, now
419   emit deprecation warnings.
420 * Title::getNotificationTimestamp(), deprecated in 1.35, now emits deprecation
421   warnings.
422 * …
424 === Other changes in 1.39 ===
425 * …
427 == Compatibility ==
429 MediaWiki 1.39 requires PHP 7.3.19 or later and the following PHP extensions:
431 * ctype
432 * dom
433 * fileinfo
434 * iconv
435 * intl
436 * json
437 * mbstring
438 * xml
440 MariaDB is the recommended database software. MySQL, PostgreSQL, or SQLite can
441 be used instead, but support for them is somewhat less mature.
443 The supported versions are:
445 * MariaDB 10.3 or higher
446 * MySQL 5.7.0 or higher
447 * PostgreSQL 9.4 or later
448 * SQLite 3.8.0 or later
450 == Online documentation ==
451 Documentation for both end-users and site administrators is available on
452 MediaWiki.org, and is covered under the GNU Free Documentation License (except
453 for pages that explicitly state that their contents are in the public domain):
455        https://www.mediawiki.org/wiki/Special:MyLanguage/Documentation
457 == Mailing list ==
458 A mailing list is available for MediaWiki user support and discussion:
460        https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
462 A low-traffic announcements-only list is also available:
464        https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
466 It's highly recommended that you sign up for one of these lists if you're
467 going to run a public MediaWiki, so you can be notified of security fixes.
469 == IRC help ==
470 There's usually someone online in #mediawiki on irc.libera.chat.