1= MediaWiki 1.35 =
2
3MediaWiki 1.35 should mostly work on the recently released PHP 8.0, however
4it is not currently actively supported. Testing (on a development wiki!) is
5appreciated, and bugs with PHP 8.0 on MediaWiki 1.35 will be accepted.
6
7It is anticipated that in a later MediaWiki 1.35 point release, we can
8declare 1.35 as supporting PHP 8.0.
9
10PHP 8.0 workboard: https://phabricator.wikimedia.org/tag/php_8.0_support/
11
12== MediaWiki 1.35.5 ==
13
14This is a security and maintenance release of the MediaWiki 1.35 branch.
15
16=== Changes since MediaWiki 1.35.4 ===
17* (T290697) Add symfony/polyfill-php80.
18* IcuCollation: Add some more icu to unicode version mappings.
19* ApiBase: Annotate deprecated constants individually.
20* PHPVersionCheck: Mark PHP 7.4.0 - 7.4.2 as buggy.
21* (T293044) installer: Fix 5th param to sourceFile() in DatabaseUpdater.
22* (T291127) Always encode spaces in cookie values as "%20".
23* Use LocalFile::getHookRunner instead of LocalFile::hookRunner.
24* HistoryBlobStub: add getLocation() to get $mOldId.
25* Fix checkStorage.php.
26* checkStorage: pass no parameters to WikiRevision::getContent().
27* (T292763, CVE-2021-44854) SECURITY: Do not cache private wiki completion results.
28* (T294316) Revert "Mark ApiClientLogin/ApiLogin as requiring write mode".
29* (T250068) resources: Upgrade jQuery from 3.4.1 to 3.6.0.
30* (T250068) resources: Upgrade jquery-migrate from 3.1.0 (patched) to 3.3.2
31  (patched).
32* (T294796) JobQueueRedis: Replace deprecated zSize with zCard.
33* (T212428, T267468) Allow populateContentTables to continue when there are
34  bad blobs.
35* (T295191) ApiQuerySiteinfo: Fix "rightsinfo"/"url" when $wgRightsPage is
36  set.
37* Update pear/mail_mime to 1.10.11.
38* Update deprecated Guzzle Psr7 function calls.
39* Tweak error message for missing composer dependencies.
40* (T296112) Allow inserting new sections named '0'.
41* nukeNS: don't run purgeRedundantText() after every change.
42* (T225888) RollbackAction: fix missing pagetitle.
43* (T297322, CVE-2021-44858, CVE-2021-44857) SECURITY: Fix permissions checks in
44  undo actions.
45* (T297574, CVE-2021-45038) SECURITY: Fix permissions check in action=rollback.
46* (T34716, T297416) SECURITY: Require 'read' right for most actions.
47* (T271037, CVE-2021-44856) SECURITY: Fix use of EditFilterMergedContent hook when
48  changing content model.
49
50== MediaWiki 1.35.4 ==
51
52This is a security and maintenance release of the MediaWiki 1.35 branch.
53
54=== Changes since MediaWiki 1.35.3 ===
55* (T283394) Mark ApiClientLogin/ApiLogin as requiring write mode.
56* (T283273) Make postgres IRC channel point to libera.chat.
57* (T289108) ExtensionProcessor: Remove loaderScripts from extension.json
58  schemas.
59* (T281549) Installer: Fix mediawiki-announce auto subscription code.
60* FormatJson: Optimize encode() for supported PHP versions.
61* (T290398) renameRestrictions.php: Update protected_titles as well.
62* $wgMimeTypeBlacklist - This configuration array now prohibits the RFC 4329
63  form of JavaScript, 'application/javascript', as well as previous MIME types.
64* (T51097, T290273) resourceloader: Call getStyleFiles from
65  FileModule::getFileHashes.
66* (T277788) parser: Avoid calling ParserOptions::getOption() too many times.
67* (T285515, CVE-2021-41798) SECURITY: XSS vulnerability in Special:Search.
68* (T290379, CVE-2021-41799) SECURITY: ApiQueryBacklinks can cause a full
69  table scan.
70* (T284419, CVE-2021-41800) SECURITY: fix PoolCounter protection of
71  Special:Contributions.
72
73== MediaWiki 1.35.3 ==
74
75This is a security and maintenance release of the MediaWiki 1.35 branch.
76
77=== Changes since MediaWiki 1.35.2 ===
78* (T259685) SQLite compatibility with ZeroConf VisualEditor was fixed in 1.35.2.
79* (T196906, T242751) Fix the test MonologSpiTest::testDefaultChannel.
80* (T279964) Parser: Trim trailing whitespace as the last step in pre-save
81  transform.
82* (T278026) rdbms: Add DB_PRIMARY to replace DB_MASTER.
83* (T252853) Update updateSearchIndex.php to 2006+ standards.
84* (T276945) Define a batch size in maintenance/manageJobs.php.
85* (T276945) Implement JobQueueDB::getAllAbandonedJobs.
86* (T269676) authevents: strval() variables passed to status when logging.
87* (T280944) $wgIncludejQueryMigrate - This setting allows the jQuery Migrate
88  plugin to be disabled. It has been enabled by default since MediaWiki 1.27.
89* (T281584) apihelp-query+iwlinks-param-prop: s/interlanguage/interwiki/.
90* (T281635) Delete maintenance/cleanupAncientTables.php.
91* (T282133) RedisConnectionPool: Suppress phan issue.
92* (T281549) WebInstaller: Don't show the announce-l subscribe
93  checkbox temporarily.
94* (T278266) Fix annoying E_NOTICE about undefined 'alt' index in
95  Skin#makeFooterIcon.
96* (T264214) UserRightsProxy::addGroup has to be allowed to update the
97  old group as well, which is used for granting interwiki rights.
98* (T269776, T278266) getFooterIcons should not return empty arrays.
99* (T274966) Skip AvroFormatterTest::testSchemaNotAvailable on PHP 8.0.
100* phpunit: fail on warnings.
101* (T283247) Freenode -> Libera per wikimedia moving from
102  freenode to libera.
103* (T243124) Make phpunit:unit accept extension*.json to populate the classes.
104* (T142663) Add extension.json merge strategy "provide_default".
105* (T283540) HookContainer: Fix normalization of callback for static handler.
106* (T283464) Fix array order for array_replace_recursive merge strategy.
107* (T247223) Optimise MessageCache::isMainCacheable() for the single-message
108  case.
109* (T278579) Don't send headers on ob_end_clean().
110* (T280226, CVE-2021-35197) SECURITY: Prevent blocked users from purging
111  pages.
112
113== MediaWiki 1.35.2 ==
114
115This is a security and maintenance release of the MediaWiki 1.35 branch.
116
117MediaWiki 1.35.2 supports Composer 2.0. It is recommended to make sure your
118libraries are up to date on Composer 1.x, before running Composer 2.x.
119
120While normally running update.php isn't required for point releases,
121it is recommended to run it for 1.35.2 so that iwlinks.iwl_prefix is
122updated to take 32 characters.
123
124=== Changes since MediaWiki 1.35.1 ===
125* (T270450) The confusingly-named User->isLoggedIn() method has been deprecated
126  in favour of the method it wraps, User->isRegistered().
127* Upgrade pimple/pimple from 3.3.0 to 3.3.1 for PHP 8.0 support.
128* Upgrade seld/jsonlint from 1.7.1 to 1.8.3 for PHP 8.0 support.
129* Upgrade doctrine/dbal from 2.10.4 to 3.0.0 for PHP 8.0 support.
130* (T270734) Fix display of Special:Preferences URL in password reset email.
131* (T252774, T271441) resourceloader: Give SkinModule 'features' option an
132  extensible default.
133* (T271441) Unknown features shouldn't break style output.
134* (T264986) Make use of CURLMOPT_MAX_HOST_CONNECTIONS conditional on having
135  curl >= 7.30.0.
136* DefaultSettings.php: Update $wgPingback documentation.
137* Fix docs for LanguageConverter::translate.
138* (T272250) Don't rely on implicit string->int cast in comparison.
139* (T272327) Exif::isSlong: Cast input to float so PHP 8.0 abs() doesn't whine.
140* (T272328) UploadBase: Don't call MimeAnalyzer if mTempPath is null.
141* Remove nonfunctional default sampling for WANObjectCache metrics.
142* (T258851) Prevent service injection to LoadExtensionSchemaUpdates hook.
143* (T270852) Hooks: Map dash character to underscore when generating hook names.
144* (T271551, T270145) Fix fetching ipblock-exempt within
145  BlockManager::getUserBlock.
146* PHPVersionCheck: The PHP Group only supports PHP >= 7.3.0.
147* (T248925) Set empty closures in DatabaseTest to fix PHP 8 tests.
148* (T34217) rdbms: Remove outdated MySQL 4 references and fix doc URLs.
149* (T248925) Special:Contributions reports negative namespace error on PHP 8.
150* (T248925) objectcache: Fix non-numeric string check in HashBagOStuff for
151  PHP 8.
152* (T248925) Fix CacheTime::getCacheExpiry for PHP 8.
153* (T259685) Allow REST API POST handlers to opt out of mandatory SQLite locking.
154* (T91820, T259685) MWLBFactory: rename magic HTTP header for opting out of
155  SQLite write lock.
156* (T272326) Fix DeprecationHelperTest on PHP 8.
157* Upgrade wikimedia/less.php from 3.0.0 to 3.1.0 for PHP 8.0 support.
158* (T236639) OutputPage: Make $wgDebugRedirects work again.
159* (T274648) registration: Allow reusing cached metadata between wikis.
160* CdnCacheUpdate: Send full URL instead of path to Curl for purge.
161* Upgrade monolog/monolog from 1.25.3 to 2.2.0 for PHP 8.0 support.
162* FileBackend: Do not use SOCKET_ENOENT on windows.
163* (T275441) ApiQueryUserInfo: Allow all uiprops to be requested at once.
164* (T275261) Escape wikitext in the title in invalid title error messages.
165* (T275242) Extend iwlinks.iwl_prefix to VARBINARY(32) on MySQL.
166* (T246594, T270228) PHPVersionCheck: Complain about known-bad versions above
167  minimum.
168* (T275824) Upgrade wikimedia/composer-merge-plugin from 1.4.1 to 2.0.1 for
169  Composer 2.0 support.
170* (T269293) Record all used options in metadata.
171* Allow usage of Composer 2.0 to install MediaWiki's dependencies.
172* (T259872) skins: Call headElement() after getTemplateData() in SkinMustache.
173* (T277009, CVE-2021-30158) SECURITY: Allow blocked users to access
174  Special:ResetTokens.
175* (T272412) Add "Account data" section to user preferences.
176* (T268310) Add list of thumbnail urls to LocalFilePurgeThumbnails hook.
177* (T277520) registration: Allow specifying immovable namespaces in
178  extension.json.
179* (T275619) Maintenance::hasOption and Maintenance::getOption now behave as
180  documented and are not altered by previous calls to these methods.
181* (T254688) Remove page inner join from subquery in SpecialWhatLinksHere.
182* (T122124) signup: added help message for security.
183* (T278014, CVE-2021-30154) SECURITY: Escape mediastatistics-header-* messages
184  on Special:NewFiles.
185* (T278058, CVE-2021-30157) SECURITY: Escape rcfilters-filter-* messages on
186  ChangesList pages.
187* (T277414) HTMLFormField: Use non namespaced class name rather than
188  static::class.
189* (T268673) maintenance: Don't create SearchUpdate in rebuildtextindex.php
190  for page_namespace below 0.
191* (T246594, T270228) Mark ParserOptionsTests skipped on PHP 7.4.0-7.4.8.
192* (T268230) Switch to new MediaWiki logo by Serhio Magpie.
193* (T271735) Expand config-pingback-help, link to privacy policy in
194  config-pingback.
195* Fix documentation of user-global in $wgRateLimits.
196* BackupDumper: Add -o as shortcode for --output.
197* (T235554) Disable DEFER_SET_LENGTH_AND_FLUSH headers to avoid HTTP errors.
198* (T270713, CVE-2021-30152) SECURITY: Allow user to only apply protection they
199  have right to do so via action=protect.
200* (T272386, CVE-2021-30159) SECURITY: Non-admin deleted enwiki page in fast
201  double move.
202* (T270988, CVE-2021-30155) SECURITY: ContentModelChange: Check that user can
203  create pages.
204* (T279451, CVE-2021-30458) SECURITY: Parsoid comment fostering allows for
205  inserting mostly arbitrary <meta> tags.
206
207== MediaWiki 1.35.1 ==
208
209This is a security and maintenance release of the MediaWiki 1.35 branch.
210
211While normally running update.php isn't required for point releases,
212it is recommended to run it for 1.35.1 so that sites.site_language is
213updated to take 35 characters.
214
215Watchlist Expiry is no longer considered experimental, but is off by default.
216To enable it, set $wgWatchlistExpiry = true; in your LocalSettings.php.
217
218=== Changes since MediaWiki 1.35.0 ===
219* (T263929) purgeList.php Fix all-namespaces option to match one used in code.
220* (T248719) ParserCache::get - fix wfDeprecated call.
221* (T261430) WatchlistExpiryWidget: Move focus to expiry dropdown after hitting
222  Tab.
223* Preload mediawiki.watchstar.widgets before api request.
224* (T261030) ApiEditPage: Show existing watchlist expiry if status is not being
225  changed.
226* (T264502) Fix PHP 8 compat with strcspn() $length parameter exceeding string.
227* (T248925) Remove final modifier on private function.
228* (T264683) Remove ipb_anon_only from ipb_address_unique index addition.
229* (T261415) Add days left messages to changes-lists' clock icons.
230* Fix order of wfDeprecated parameters in ExternalStoreDB::getSlave.
231* (T261260) Preload class used in HeaderCallback.
232* (T260868, T260009) Normalize WatchedItem expiry field.
233* (T264683) Remove doTable check from (Mysql|Sqlite)Updater::indexHasFields.
234* (T264534) ApiPageSet: Avoid infinite loop when merging redirects.
235* (T196906) Empty Monolog loggers are now real blackholes.
236* (T258649) WatchAction: avoid UPDATE when old and new watch period is
237  indefinite.
238* Parser: Adjust typehint to show that getTitle can return null.
239* (T263592) media: Fix case of FlashPixVersion in
240  FormatMetadata::makeFormattedData().
241* (T265223) BaseTemplate: Guard against passing zero arg to array_merge().
242* (T264965) Fix base path handling for MessagePosterModule registration.
243* (T252183) Fix Database::getTempTableWrites for multi table DDLs.
244* (T182546) Fix switch/case indentation per mediawiki coding conventions.
245* Flip Yoda conditionals.
246* (T263213) Move SkinTemplate::getFooterLinks() to Skin.
247* build: Updating mediawiki/mediawiki-codesniffer to 33.0.0.
248* (T267105) Make ImageBuilder::checkMissingImage public.
249* Updating guzzlehttp/guzzle (6.5.4 => 6.5.5).
250* (T266681) Support new style hook registration on install and update.
251* (T266980) Fix unsetting of copyright icon in FooterIcons.
252* upload.js: Don't assume that warnings array will include 'code' key.
253* upload.js:  Fix typo in upload API.
254* (T264333, T190988, T266903) Pass along ignorewarnings param to all
255  individual chunks being uploaded.
256* (T267558) importTextFiles.php: Replace deprecated WikiRevision:setText().
257* (T266418) composer.json: add requirement for composer-plugin-api ^1.1.
258* (T261431) Add ARIA attributes to watchlink and its notification.
259* (T258877) Change invalid 'Content-Encoding: none' header.
260* Fix trailing ; in patch-sites-site_language-35.sql.
261* (T248852) wfAssembleUrl: Handle empty query field in URL bits.
262* (T268846) Updating wikimedia/testing-access-wrapper (1.0.0 => 2.0.0).
263* (T268887) migrateComments: Cast array keys back to string before passing
264  to the DB.
265* (T266619) Introduce new $wgThumbPath config.
266* (T269178) MemcachedClient: Cast Resource to integer.
267* (T263925) Use the old HookContainer to set up the post-reset services.
268* Change "site cache" to just "cache" in the right-purge message.
269* [UploadedFileStreamTest] Skip test with chmod.
270* (T269710) Updating composer/semver (1.5.1 => 1.7.2).
271* (T269710) Updating mediawiki/mediawiki-codesniffer (33.0.0 => 34.0.0).
272* (T260631, T260633), BotPassword::save() now returns a Status object for the
273  result rather than a bool. The length of the bot password grants and
274  restriction fields are now validated, and an error will be thrown if it
275  would be truncated by the database.
276* (T265778) Fix English/*nix specific error messages in FSFileBackend.
277* (T267543) Split dropping of image.img_user_timestamp.
278* [FileTest] Do not assume /tmp exists on windows.
279* Clean up temp files correctly after unit tests.
280* Skip undo related phpunit tests when diff3 is missing.
281* (T269964) rdbms: Remove outer parentheses in insert query for Postgres.
282* (T263911) In MWExceptionHandler::report(), catch all throwables.
283* (T268894, CVE-2020-35474) SECURITY: Use Html::element in
284  ChangeListSpecialPage for sanity.
285* (T268917) Use Xml::element in SpecialUserrights for sanity.
286* (T268938, CVE-2020-35478, CVE-2020-35479) SECURITY: Pass escaped html
287  to LogFormatter::makePageLink for sanity.
288* (T268938) Fixed mixed escaping in Language::translateBlockExpiry.
289* (T263911) UserOptionsManager: don't differentiate anons caches.
290* (T261260) HeaderCallback: pre-cache request ID.
291* Parsoid updated to v0.12.1.
292* (T205908, CVE-2020-35477) SECURITY: Unable to change visibility of log
293  entries when MediaWiki:Mainpage uses Special:MyLanguage.
294* (T120883, CVE-2020-35480) SECURITY: Divergent behavior for contributions
295  and user pages of hidden users and missing users.
296* (T270145) Fix condition that can lead to using APCOND_BLOCKED in
297  $wgAutopromote to cause an OOM in PHP.
298
299== MediaWiki 1.35.0 ==
300
301=== Changes since MediaWiki 1.35.0-rc.3 ===
302* (T261258) Remove checks for ancient ImageMagick versions in BitmapHandler.
303* (T260232) Don't include null page ids in query list for category dumps.
304* (T260009) Check existing watchitem when saving action=watch.
305* (T259055) Correct success messages for action=watch.
306* mediawiki.page.ready: Simpler tablesorter/makeCollapsible call.
307* mediawiki.page.ready: Fix skin override config flags, wrong way round.
308* (T262175, T248512) Remove requirement for ApiWatchlistTrait to be in ApiBase.
309* (T259053, T260434) Watchlist: Fix updateWatchLink removing css class when
310  action=watch.
311* (T261901, T261476) mediawiki.notification: Don't close notif when clicking
312  <select> element.
313* (T251506) Sanitizer: Truncate IDs to a reasonable length.
314* (T259452) Parsoid updated to v0.12.0.
315* (T261970) watch.ajax: Add expiry support to watchpage.mw event.
316* (T262900) Fix failure of rebuildLocalisationCache.php due to ResourceLoader
317  hook.
318* (T263014) Hard deprecate File::userCan() with $user=null.
319* (T262547) Use localized success message after watching via action=watch.
320* (T201491) Fix typo 'Watchlst' in `apihelp-edit-param-watchlistexpiry`.
321* (T261081) Installer: consistently reset Language objects.
322* (T250449, T250450) Installer: consistently reset Language objects.
323* Explicitly wrap some XML calls in libxml_disable_entity_loader().
324* (T262934) Ensure dropdown label is always on its own line.
325* (T246855) resourceloader: Use a local HookRunner.
326* (T263604) Have findBadBlobs.php require Maintenance.php rather than
327  cleanupTable.inc.
328* (T263606) Set fake time, to avoid flaky tests.
329* (T261325) Add FindMissingActors script.
330* (T262364) shell: Don't blacklist /run/firejail.
331* (T263655) NewPagesPager: Ignore nonexistent namespaces.
332* Update specialPageAliases and magicWords for Egyptian Arabic (arz).
333* (T261347) ParserOutput: don't throw on bad editsection.
334* (T232568, CVE-2020-25813) SpecialUserrights: If a viewer lacks `hideuser`,
335  ignore hidden users.
336* (T255918, CVE-2020-25812) SECURITY: Unescaped message used in HTML on
337  Special:Contributions.
338* (T256171, CVE-2020-25815) SECURITY: Unescaped message used in HTML within
339  LogEventsList.
340* (T258763, CVE-2020-17367, CVE-2020-17368) SECURITY: Prevent invoking
341  firejail's --output functionality.
342* (T86738, CVE-2020-25814) SECURITY: mediawiki.jqueryMsg: Sanitize URLs and
343  'style' attribute.
344* (T115888, CVE-2020-25828) SECURITY: mediawiki.js: Escape HTML in
345  mw.message( ... ).parse().
346* (T260485, CVE-2020-25869) SECURITY: ActorMigration: Load user from the correct
347  database.
348* (T260485, CVE-2020-25869) SECURITY: ensure actor ID from correct wiki is used.
349* Add Finnish special page aliases.
350* Fix GuzzleHttpRequest request headers.
351* Fix description for pruneFileCache.php.
352* emptyUserGroup.php: handle more than 5000 users.
353* Make ApiSandbox copyable URL absolute.
354* (T261087) Add a link from a deleted page to that page's logs.
355
356== MediaWiki 1.35.0-rc.3 ==
357
358=== Changes since MediaWiki 1.35.0-rc.2 ===
359* (T258662) mediawiki.visibleTimeout: Update the nextVisibleTimeoutId value.
360* Ensure Parsoid doesn't throw when <ref> is used w/o Cite installed.
361* Remove maintenance/createCommonPasswordCdb.php.
362* (T260468) Increase "sites.site_global_key" to varbinary(64).
363* (T183759) Fix shell edge-cases in Windows.
364* (T257879) Drop PHP 7.2 support; require 7.3.19.
365* (T251661, CVE-2020-25827) SECURITY: User::pingLimiter: add user-global
366  rate limit type.
367* (T246991) User: enforce pingLimiter() expiry time.
368* (T256831) Rest: Handle Uri constructor exception.
369* (T259094) Fix RequestFromGlobalsTest failing in Travis CI.
370* (T256831, T261344) Rest: Use try/catch to handle URIs with embedded colon.
371
372== MediaWiki 1.35.0-rc.2 ==
373
374=== Changes since MediaWiki 1.35.0-rc.1 ===
375* (T259693) uuid: Fix filenames on Windows.
376* Remove Gruntfile.js and package-lock.json from the tarball.
377* firejail: Strengthen by copying from Wikimedia's profile.
378* (T260059) ResourceLoaderOOUIImageModule: loadOOUIDefinition() may return
379  false.
380* (T30162, T245387) The installer supports using a Postgres server running
381  on a custom port other than 5432.
382* (T260201) Support private wikis in Parsoid zero configuration mode.
383* Fix bad use of `|=` PHP bit operation where `= … ||` bool is intended.
384* (T259212) SpecialBlock: Show error if a block could not be inserted or found.
385* (T255842) UserOptionsManager: fix options reset.
386* (T258649) WatchAction: avoid unnecessary UPDATEs when expiry is unchanged.
387* (T250851) Allow skins to override mediawiki.page.ready initialisation.
388* (T250851) mediawiki.page.ready: Allow skins to disable search lazy load.
389* (T253135, T255632) Update language in watchlist expiry.
390* Use IPset in MWRestrictions::checkIP.
391* (T259564) Fix race condition on edit page.
392* (T260759) Hide watchlist expiry label in edit form.
393* mime: Fix docs of MIME_EXTENSIONS, they're arrays, not space-seperated.
394* (T260031) Add application/font-sfnt to MimeMap for ttf files.
395* (T259379) WatchedItemStore: Cache single WatchedItems with preexisting expiry.
396* Add a maintenance script to create bot passwords.
397* (T201269) Add Traditional Chinese zh-hant as fallback for Amis (ami).
398* Improve wfParseUrl docs.
399* (T251038) Add multi index fields in ImageListPager for unique paginate.
400* (T259916) Guard against 'Widget not found' error.
401
402== MediaWiki 1.35.0-rc.1 ==
403
404=== Changes since MediaWiki 1.35.0-rc.0 ===
405* (T252136) Fix RecentChanges watchlist filters when WatchlistExpiry is off.
406* (T258662) Update time period for watchlist expiry pop-up.
407* (T258443) Fix expiry dropdown not getting disabled on edit page.
408* (T259398) Add license information for promise-polyfill.
409* Remove executable bit from scripts without shebang.
410* (T256526) Fix bold of watched items on Special:RecentChangesLinked.
411* (T259060) Edit page expiry dropdown should keep state after
412  disabling/enabling.
413* (T259009) Translate expiry period in pop-up message for watchlist expiry.
414* (T258310) Add watchlist clock icon to RecentChanges.
415* (T259362) Permit temporary table writes on replica DB connections.
416* (T250214) Add UI support in Special:EditWatchlist for watchlist expiry.
417* (T72470) Disable wgLegacyJavaScriptGlobals by default.
418* (T130906) Add Edge to MediaWiki:Clearyourcache.
419* (T257279) Add mediawiki.ui Less variable deprecation note.
420* (T249521) Fixed reassignEdits.php to work with anonymous users.
421* (T259448) Fix Circular dependency when creating service in
422  DBLoadBalancerFactory.
423* (T257259) Default to using watchlist expiry of old page when moving pages.
424
425== MediaWiki 1.35.0-rc.0 ==
426
427== Upgrading notes for 1.35 ==
4281.35 requires PHP 7.3.19 or above (up from 7.2.9). (T257879)
429
4301.35 has several database changes since 1.34, and will not work without schema
431updates. Note that due to changes to some very large tables like the revision
432table, the schema update may take quite long (minutes on a medium sized site,
433many hours on a large site).
434
435Don't forget to always back up your database before upgrading!
436
437MediaWiki 1.35 is the next LTS after 1.31, and will be supported for around 3
438years.
439
440MediaWiki has a lot of both soft and hard deprecations, and code removed. As
441always, make sure your versions of extensions match the MediaWiki version,
442and updates may be required to any custom extensions.
443
444See the file UPGRADE for more detailed upgrade instructions, including
445important information when upgrading from versions prior to 1.11.
446
447Some specific notes for MediaWiki 1.35 upgrades are below:
448* (T259685) When using SQLite as the database backend for MediaWiki,
449  Zeroconf (zero-configuration) VisualEditor/Parsoid only works with
450  MediaWiki 1.35.2 and above.  It is still recommended to use
451  MySQL/MariaDB rather than SQLite when using VisualEditor.
452
453For notes on 1.34.x and older releases, see HISTORY.
454
455=== Configuration changes for system administrators in 1.35 ===
456
457* (T72470) $wgLegacyJavaScriptGlobals is now false by default. This feature
458  will be completely removed in a later MediaWiki release.
459
460==== New configuration ====
461* $wgDiffEngine — This can be used to specify the difference engine to use,
462  rather than MediaWiki choosing the first of $wgExternalDiffEngine, wikidiff2,
463  or php that is usable.
464* $wgSearchMatchRedirectPreference — This configuration setting controls whether
465  users can set a new preference, search-match-redirect, which decides if search
466  should redirect them to exact matches is available. By default, this is set to
467  false, which maintains the previous behaviour without preference bloat. Change
468  your site's default by setting $wgDefaultUserOptions['search-match-redirect'].
469* $wgPoolCounterConf['SpecialContributions'] — Per-user concurrency in the use
470  of SpecialContributions can now be limited by setting this appropriately.
471* $wgPasswordPolicy — PasswordCannotBeSubstringInUsername is a new password
472  policy check. Similar to the existing PasswordCannotMatchUsername check, this
473  check ensures that a user's (case-insensitive) password cannot be a part of
474  their username. e.g. password = MyPass, username = ThisUsersPasswordIsMyPass.
475* $wgLogos — This new configuration setting combines the now-deprecated $wgLogo
476  and $wgLogoHD settings into a single, associative array. It provides support
477  for a new key, 'wordmark', for setting a horizontal wordmark to show next to
478  the graphical logo. To do this, set 'wordmark' to an array with 'src' set to
479  the path of the wordmark image, and 'width' and 'height' for its dimensions
480  in pixels. $wgLogos inherits the existing support provided by its predecessor
481  settings: '1x' mapping to the path of the logo as a 135x135px raster image
482  (equivalent to $wgLogo), and '1.5x', '2x', and 'svg' operating as before for
483  $wgLogoHD. If $wgLogos is unset, $wgLogo and $wgLogoHD values are read for
484  temporary backwards compatibility. (T232140)
485* $wgWatchlistExpiry — (EXPERIMENTAL) This enables the new watchlist expiry
486  feature. The database table (watchlist_expiry) for this is created regardless
487  of this setting, but all other aspects of the expiry feature are controlled
488  by it. Enabling in production is discouraged for the time being. A future
489  MediaWiki 1.35 release will advertise this feature once it is stable.
490* $wgWatchlistPurgeRate — This sets the chance of expired watchlist items being
491  purged on each page edit. Only has effect if $wgWatchlistExpiry is true.
492* $wgWatchlistExpiryMaxDuration — This is the maximum definite relative duration
493  for watchlist expiries. Only has effect if $wgWatchlistExpiry is true.
494* $wgImgAuthPath – This can be used to override the path prefix used when
495  handling img_auth.php requests. (T235357)
496* $wgAllowedCorsHeaders — This is a list of headers which can be used in a
497  cross-site API request.
498* $wgHTTPMaxTimeout and $wgHTTPMaxConnectTimeout — These allow site
499  administrators to limit the timeouts used by the HTTP client libraries.
500  This only affects callers using HttpRequestFactory and the deprecated
501  wrappers in the Http class.
502* $wgCdnMaxageStale — This controls the Cache-Control s-maxage header for page
503  views when PoolCounter lock contention indicates that a stale cache entry
504  should be sent.
505* $wgForceHTTPS — This makes the HTTP to HTTPS redirect be unconditional and
506  suppresses various hacks needed to support mixed HTTP/HTTPS wikis. We
507  recommend this be set to true on pure HTTPS wikis.
508* $wgCookieSameSite — This setting allows login cookies to be sent with
509  SameSite=None. This is required for cross-site CentralAuth auto-login after
510  Chrome 84.
511* $wgUseSameSiteLegacyCookies — This adds a compatibility hack to
512  SameSite=None cookies for browsers which implemented an incompatible draft
513  version of the specification.
514
515==== Changed configuration ====
516* $wgResourceLoaderMaxage (T235314) — This configuration array controls the
517  max-age for HTTP caching through the Cache-Control header. It has uses the
518  "versioned" key for urls that do have a version parameter, and the
519  "unversioned" key for urls without a version parameter. The sub keys for
520  "client" and "server" are no longer supported in MediaWiki 1.35.
521* $wgEnableOpenSearchSuggest — This boolean variable is deprecated and no longer
522  used. The OpenSearch API is now always enabled.
523* $wgAuthManagerConfig and $wgAuthManagerAutoConfig — These can now use the
524  'services' option in provider specifications.
525* $wgVirtualRestConfig['modules']['parsoid'] —
526  - The defaults have been updated. If you were relying on the default values,
527    you may need to update your configuration.
528  - The 'URL' parameter, previously allowed for backwards-compatibility, has
529    been deprecated. Use 'url' instead.
530* $wgXmlDumpSchemaVersion — Default is now set to XML_DUMP_SCHEMA_VERSION_11, so
531  dumps use the new dump format per default. Consumers of XML dumps should not
532  be affected if they ignore any unknown tags they encounter. Also, the format
533  is effectively unchanged for revisions that only contain the main slot. The
534  --schema-version option can be used with the dumpBackup.php script to set the
535  dump format. (T238921)
536* $wgParserConf — This configuration is now deprecated. It has been
537  effectively constant since 2008, and is ignored by core code.
538  Configure the ParserFactory service in order to customize the Parser used.
539* $wgAutoloadAttemptLowercase — This has been deprecated, and the default value
540  changed to false.
541* $wgAllowImageMoving — This configuration setting is now deprecated. Instead,
542  use $wgGroupPermissions; e.g., to revoke sysops' ability to move images use
543  $wgGroupPermissions['sysop']['movefile'] = false.
544* $wgAllowImageTag — This configuration is now deprecated; future parsers will
545  not support direct use of the HTML <img> tag in wikitext.
546* $wgUseTwoButtonsSearchForm — This has been deprecated. If you maintain a skin
547  that relies on this and wishes to let system administrators change it, you
548  should convert it to a config variable specific to your skin. If you're using
549  it to configure your wiki, you should check individual skins to see whether
550  they have local skin config for the feature and use that.
551* $wgPasswordPolicy — The deprecated policy 'PasswordCannotBePopular' has been
552  removed. Use PasswordNotInCommonList instead which covers many more passwords.
553* Backwards compatibility for using an associative array
554  (e.g. [ '127.0.0.1' => 'bad-ip' ]) for $wgProxyList has been removed. This
555  was deprecated since 1.30. Please convert these arrays to indexed/sequential
556  ones (e.g. [ '127.0.0.1' ]).
557* $wgShellRestrictionMethod — This now defaults to 'autodetect', which will
558  enable sandboxing for shell commands using firejail, if it's installed. To
559  disable restrictions, set it to false.
560* $wgLegacyJavaScriptGlobals – This deprecated setting now default to false,
561  instead of true, ahead of its planned removal.
562
563==== Removed configuration ====
564* $wgSysopEmailBans — This setting, deprecated in 1.34, was removed. To let
565  sysops block email access, use $wgGroupPermissions['sysop']['blockemail'].
566* $wgDBWindowsAuthentication — This setting had no effect anymore after support
567  for SQL Server was removed in 1.34. (T230418)
568* $wgProfileOnly — This setting, deprecated in 1.23, was removed. The profiler
569  output should instead be configured via $wgProfiler['output'].
570* $wgProfileLimit — This setting, deprecated in 1.25, was removed.
571  Set $wgProfiler['threshold'] instead.
572* $wgDebugTimestamps — This setting was removed. It affected the text output
573  produced via $wgDebugComments, if enabled.
574* $wgSkipSkin — This setting, deprecated in 1.23, was removed. To disable a
575  skin from being shown, use $wgSkipSkins.
576* $wgUseSquid, $wgSquidServers, $wgSquidServersNoPurge, and $wgSquidMaxage —
577  These, deprecated in 1.34, have been removed. Use $wgUseCdn, $wgCdnServers,
578  $wgCdnServersNoPurge, or $wgCdnMaxAge instead.
579* $wgDisableCounters — This, deprecated in 1.25, was removed. The feature that
580  it controlled was already removed in 1.26, but the variable remained existent
581  with a value of `false` for backward-compatibility.
582* $wgMaxGeneratedPPNodeCount — This setting was removed. It only affected
583  Preprocessor_DOM, which was deprecated in 1.34 and removed in this release.
584* $wgFixArabicUnicode and $wgFixMalayalamUnicode — These, deprecated in 1.33,
585  were removed. The fixes are now always enabled for their respective languages.
586* $wgAllowTitlesInSVG — This, unused and deprecated since 1.34, was removed.
587* $wgEnablePartialBlocks — This setting, deprecated when it was added in 1.33,
588  was removed. Partial blocks are now always enabled.
589* $wgLocalInterwiki — This setting, deprecated in 1.23, has been removed.
590* $wgContentHandlerUseDB — This setting, deprecated in 1.34, has been removed.
591* $wgMultiContentRevisionSchemaMigrationStage — This setting must no longer
592  be set locally. If the migration stage was set to anything other than
593  SCHEMA_COMPAT_NEW locally, update.php must be run after removing the setting.
594  Usage of the setting in code is deprecated. The setting will be removed
595  completely in 1.36.
596* $wgEnableRestAPI — This setting is no longer obeyed by MediaWiki core, and
597  should not be set set locally. Usage of the setting in code is deprecated; it
598  is now set true by default. The setting will be removed completely in 1.36.
599* $wgObjectCaches — The 'slaveOnly' option for SqlBagOStuff, deprecated in 1.34,
600  was removed. Use 'replicaOnly' instead.
601
602=== New user-facing features in 1.35 ===
603* (T204618) Whitelisted the aria-hidden HTML attribute for all elements in
604  wikitext.
605* (T13456) Special:EditPage, Special:PageHistory, Special:PageInfo, and
606  Special:Purge have been created as shortcuts for each action.
607  Special:EditPage/Foo redirects to title=foo&action=edit, with PageHistory,
608  PageInfo, and Purge corresponding to action= history, info, and purge
609  respectively. When linked to, its subpage is used as the target. Otherwise,
610  it displays a basic interface to allow the end user to specify the target
611  manually.
612* (T139221) The generated table of contents is now a navigation landmark role
613  for assistive technologies.
614* (T245931) interwiki map API doesn't report foreign language if
615  $wgInterwikiMagic=false
616* The form at ?action=watch has a new dropdown list to support expiry dates for
617  watchlist items (if $wgWatchlistExpiry is true).
618
619=== New developer features in 1.35 ===
620* A Docker based local development develpoment environment configuration is
621  included (T238224) and DEVELOPERS.md has been added with usage documentation
622  and links to further help.
623* If CSP is enabled, extensions can now add additional sources using the
624  ContentSecurityPolicy::addDefaultSource, ::addStyleSrc and ::addScriptSrc
625  methods (e.g. $context->getOutput()->getCSP()->addDefaultSrc( 'example.com' ))
626* Extensions can now specify classes and namespaces to be autoloaded by the
627  test autoloader, by setting the "TestAutoloadNamespaces" and
628  "TestAutoloadClasses" properties in extension.json. (T196090)
629* (T250977) extension.json now allows "SearchMappings" which maps the canonical
630  name of the search engine (used in wgSearchType and wgSearchTypeAlternatives)
631  to a specification using the ObjectFactory specification. This allows
632  extensions to register Search Engines using namespaced classes.
633* Added getters for OutputPage's robot, index and follow policies;
634  getRobotPolicy() returns the entire policy as a string in the form
635  <index policy>,<follow policy> while getIndexPolicy() and getFollowPolicy()
636  return their respective policies as a string.
637* The ResourceLoaderSiteModulePages and ResourceLoaderSiteStylesModulePages
638  hooks were added to allow changing which wiki pages these modules contain.
639* The SkinFactory now allows skins to be specified as an ObjectFactory spec,
640  allowing the construction of skins with services injected.
641* ContentHandlerFactory for most ContentHandler static methods. It has been
642  added to the constructors for many classes to improve SOLID / GRASP.
643* FileDeleteForm's constructor now accepts a user as the second parameter.
644  Support for not passing a user has also been hard-deprecated and will be
645  removed in 1.36.
646* The ParserPreSaveTransformComplete hook was added.
647* The ParserBeforePreprocess hook was added.
648* The ResourceLoaderSkinModule class now has a "legacy" feature that loads
649  the stylesheets previously part of the "mediawiki.legacy.shared" and
650  "mediawiki.legacy.commonPrint" module.
651  Those modules are now deprecated and no longer loaded by skins.
652  For skins needing to retain these styles, you will need to load these
653  styles via a module using the ResourceLoaderSkinModule class.
654  See Vector and Monobook for examples.
655* ParserOutput now has methods addExtraCSPStyleSrc, addExtraCSPDefaultSrc
656  addExtraCSPScriptSrc for parser tags/functions to be able to add sources
657  to the Content Security Policy.
658* The HtmlCacheUpdater service was added to unify the logic of purging CDN cache
659  and HTML file cache to simplify callers and make them more consistent.
660* The MultiHttpClient code will fallover to non-curl if curl_multi* is blocked.
661* Preferences which use HTMLTitlesMultiselectField can make use of
662  MultiTitleFilter class for saving title text to/from article IDs in user
663  preferences.
664* OutputPage::addHtmlClasses() was added to allow injecting CSS classes on
665  to the <html> element on page load.
666* The SkinAddFooterLinks hook is added to allow extensions to add items to skin
667  footers. Previously this had to be done via SkinTemplateOutputPageBeforeExec.
668  Doing so using that hook is now hard deprecated.
669* A new BlockPermissionChecker service was introduced for checking
670  block-related permissions.
671* The support of 'database' type of extensions has been added to allow 3d party
672  databases like Percona be used as storage. See T226857, T253248.
673* Three new return parameters have been added to the
674  EditPageGetCheckboxesDefinition hook. Handlers of this hook are no longer
675  restricted to defining checkboxes. See the documentation of
676  EditPage::getCheckboxesDefinition() for more details.
677* New flag File::RENDER_TMP was added in order to allow
678  File::generateAndSaveThumb and File::trasform to render a thumbnail without
679  saving it to the storage.
680
681=== External library changes in 1.35 ===
682
683==== New external libraries ====
684* Added wikimedia/ip-utils 1.0.0.
685* Added wikimedia/parsoid 0.12.2.
686* Added wikimedia/services 2.0.1.
687* Added taylorhakes/promise-polyfill v8.1.3.
688* Added vuejs v2.6.11.
689* Added vuex v3.1.3.
690* Added symfony/symfony/polyfill-php80 1.23.1.
691
692===== New development-only external libraries =====
693* Added doctrine/dbal 3.0.0.
694* Added doctrine/sql-formatter 1.1.0.
695* Added pimple/pimple 3.3.1.
696
697==== Changed external libraries ====
698* pear/mail_mime was upgraded from 1.10.2 to 1.10.11.
699* wikimedia/less.php was upgraded from 1.8.0 to 3.1.0.
700* Updated oojs from 3.0.0 to 5.0.0.
701* Updated OOUI from 0.35.1 to 0.39.3.
702* zordius/lightncandy was upgraded from 0.23.0 to 1.2.5.
703* Updated jQuery from v3.3.1 to v3.6.0.
704* Updated jQuery Migrate from v3.0.1 to v3.3.2.
705* Updated wikimedia/assert from 0.2.2 to 0.5.0.
706* Updated pear/net_smtp from 1.8.1 from to 1.9.1.
707* Updated psr/log from 1.0.2 to 1.1.3.
708* Updated jquery.i18n from 1.0.5 to 1.0.7.
709* Updated guzzlehttp/guzzle from 6.3.3 to 6.5.5.
710* Updated wikimedia/xmp-reader from 0.6.3 to 0.7.0.
711  Fixes error log spam with too-large XMP data, and adds support for GPano tags.
712* Updated wikimedia/base-convert from v2.0.0 to v2.0.1.
713* Updated composer/semver from 1.5.0 to 1.7.2.
714* Updated wikimedia/remex-html from 2.1.0 to 2.2.0.
715* Replaced wikimedia/password-blacklist 0.1.4 with wikimedia/common-passwords
716  0.2.0.
717* Updated wikimedia/composer-merge-plugin from 1.4.1 to 2.0.1.
718
719===== Changed development-only external libraries =====
720* Updated symfony/yaml from 3.4.28 to 5.0.5.
721* Updated nikic/php-parser from 3.1.5 to 4.4.0.
722* Updated php-parallel-lint/php-console-highlighter from v0.3.2 to v0.5.
723* Updated php-parallel-lint/php-parallel-lint from v0.9.2 to v1.2.0.
724* Updated psy/psysh from 0.9.9 to 0.10.4.
725* Updated monolog/monolog from 1.24.0 to 2.2.0.
726* Upgrade mediawiki-codesniffer from 28.0.0 to 34.0.0.
727* Updated composer/spdx-licenses from 1.5.1 to 1.5.3.
728* Updated monolog/monolog from 1.25.2 to 1.25.3.
729* Updated qunit from 2.9.1 to 2.10.0.
730* Updating wikimedia/testing-access-wrapper from 1.0.0 to 2.0.0.
731* Updated seld/jsonlint from 1.7.1 to 1.8.3.
732
733==== Removed external libraries ====
734* phpunit/php-invoker (dev-only).
735  Removing this unbreaks development on Windows systems, in exchange for losing
736  time limits in running unit tests.
737* The jquery.getAttrs module was removed.
738
739=== Action API changes in 1.35 ===
740* The 'suggest' parameter of action=opensearch has been deprecated.
741  The API behaves the same with and without this parameter.
742  It was previously used by $wgEnableOpenSearchSuggest to partially
743  disable the API if set to false. Specifically, it would deny internal
744  frontend requests carrying this parameter, whilst accepting other requests.
745* Integer-type parameters are now validated for syntax rather than being
746  interpreted in surprising ways. For example, the following will now return a
747  badinteger error:
748  - "1.9" (formerly interpreted as "1")
749  - " 1" (formerly interpreted as "1")
750  - "1e1" (formerly interpreted as "1" or "10", depending on the PHP version)
751  - "1foobar" (formerly interpreted as "1")
752  - "foobar" (formerly intepreted as "0")
753  parameters. Ranges should be assumed to be enforced.
754* Many user-type parameters now accept a user ID, formatted like "#12345".
755* The 'assert' parameter used by all API modules now supports the value 'anon'.
756  When specified, the API will return the 'assertanonfailed' error if the user
757  is logged in.
758* action=edit now supports  the 'baserevid' parameter for edit conflict
759  detection, as an alternative to 'basetimestamp'. Note that self-conflicts
760  will continue to be ignored if 'basetimestamp' is set, but not if only
761  'baserevid' is set.
762* A new module was added to change the content model of existing pages.
763  Use action=changecontentmodel. Unlike Special:ChangeContentModel, the api
764  module does not work for pages that do not already exist.
765* If $wgWatchlistExpiry is true, the following API changes are made:
766  - action=watch accepts a new 'expiry' parameter analagous to the expiry
767    accepted by action=userrights, action=block, etc., except it must be no
768    greater than $wgWatchlistExpiryMaxDuration, or an infinity value.
769  - action=query&list=watchlistraw returns pages' watchlist expiry dates.
770* (T249526) action=login will now return Failed rather than NeedToken on
771  session loss.
772
773=== Action API internal changes in 1.35 ===
774* The Action API now uses the Wikimedia\ParamValidator library for parameter
775  validation, which brings some new features and changes. For the most part
776  existing module code should work as it did before, but see subsequent notes
777  for changes.
778  - The values for all ApiBase PARAM_* constants have changed. Code should have
779    been using the constants rather than hard-coding the values.
780  - Several ApiBase PARAM_* constants have been deprecated, see the in-class
781    documentation for details. Use the equivalent ParamValidator constants
782    instead.
783  - The value returned for 'upload'-type parameters has changed from
784    WebRequestUpload to Psr\Http\Message\UploadedFileInterface.
785* Validation of 'user'-type parameters is more flexible. PARAM constants exist
786  to specify the type of "user" allowed and to request UserIdentity objects
787  rather than name strings. The default is to accept all types (name, IP,
788  range, and interwiki) that were formerly accepted.
789* Maximum limits are no longer ignored in "internal mode".
790* The $paramName to ApiBase::handleParamNormalization() should now include the
791  prefix.
792* (T245931) meta=siteinfo&siprop=interwikimap no longer reports language or
793  extralanglink when $wgInterwikiMagic is false.
794
795=== Languages updated in 1.35 ===
796MediaWiki supports over 350 languages. Many localisations are updated regularly.
797Below only new and removed languages are listed, as well as changes to languages
798because of Phabricator reports.
799
800* The default targets for the ISBN search from Special:BookSources in English
801  have been updated for better international suppport. They will now be
802  BetterWorldBooks.com, OpenLibrary.org and Worldcat.org.
803* (T237672) Changed the Moroccan Arabic language (ary) to the Arabic script.
804* (T201269) Added language support for Amis (ami).
805* (T248299) Added language support for Inari Sami (smn).
806* (T251369) Added language support for Ladin (lld).
807* (T251369) Added language support for Seediq (trv), also known as Taroko.
808* (T254854) Added language support for Southern Altay (alt).
809
810=== Breaking changes in 1.35 ===
811* MediaWiki no longer supports PHP 7.2; use PHP 7.3.19+ (T228346, T257879).
812* ResourceLoader::getLessVars(), deprecated in 1.32, was removed.
813  Use ResourceLoaderModule::getLessVars() instead.
814* The jquery.tabIndex module, deprecated in 1.34, has been removed.
815* The mediawiki.RegExp module alias, deprecated in 1.34, was removed.
816  Use the mediawiki.util module instead.
817* The easy-deflate.inflate module, unused since 1.32, was removed.
818* The easy-deflate.deflate module was removed. Use the mediawiki.deflate
819  module instead.
820* The mediawiki.notify module was removed. The mw.notify() shortcut is now
821  available by default, without any dependency.
822* (T219604) The "jquery.ui.*" and "jquery.effects.*" module aliases,
823  deprecated in 1.34, have been removed. Use "jquery.ui" instead.
824* (T235457) The "user.tokens" module has been removed.
825  Use "user.options" instead.
826* (T251855) The mw.Map#exists method in JavaScript no longer supports checking
827  multiple keys. This affects mw.config.exists() and mw.user.tokens.exists().
828* The internal variable $constructorOptions for the Parser & SpecialPageFactory,
829  exposed only for integration purposes, are now each replaced by a const called
830  CONSTRUCTOR_OPTIONS. This was a breaking change made without deprecation.
831* ObjectCache::getWANInstance, deprecated in 1.34, was removed.
832  Use MediaWikiServices::getMainWANObjectCache instead.
833* ObjectCache::newWANCacheFromParams, deprecated in 1.34, was removed.
834  Construct WANObjectCache directly instead, or use MediaWikiServices.
835* (T231366) The ProfilerOutputDb class and profileinfo.php entry point,
836  deprecated in 1.34, was removed.
837* SiteConfiguration->localVHosts, deprecated in 1.25, was removed.
838  Use $wgLocalVirtualHosts instead.
839* The $wgContLanguageCode read-only variable was removed.
840  It has been a non-configurable copy of $wgLanguageCode since MW 1.8 (2006).
841  Use $wgLanguageCode directly instead.
842* ApiQueryUserInfo::getBlockInfo, deprecated in 1.34, was removed. Use
843  ApiBlockInfoTrait::getBlockDetails instead.
844* Password::equals(), deprecated in 1.33, was removed. Use Password::verify().
845* QuickTemplate::setRef(), deprecated in 1.31, was removed. Use set().
846* The mediawiki.ui.text module, deprecated in 1.28 and unused, was removed.
847* AbstractBlock::mReason, deprecated in 1.34, is no longer public.
848* The GetBlockedStatus and UserIsHidden, deprecated in 1.34, has been removed.
849  Instead, use the GetUserBlock hook.
850* As part of work to replace the Parser, a large number of breaking changes have
851  been made, principally in related methods and properties being removed or made
852  private:
853  - disableCache(), deprecated in 1.28.
854  - serializeHalfParsedText() and the helpers unserializeHalfParsedText(),
855    isValidHalfParsedText(), and StripState::getSubState() and
856    StripState::merge(), all deprecated in 1.31. The helper functions
857    LinkHolderArray::mergeForeign() and LinkHolderArray::getSubArray()
858    were also removed.
859  - getConverterLanguage(), deprecated in 1.32. Use getTargetLanguage() instead.
860  - A large set of methods exposed only for historical reasons, deprecated in
861    1.34, have now been removed or made private:
862    - areSubpagesAllowed()
863    - armorLinks()
864    - createAssocArgs()
865    - doAllQuotes()
866    - doDoubleUnderscore()
867    - doHeadings()
868    - doMagicLinks()
869    - formatHeadings()
870    - getImageParams()
871    - getVariableValue()
872    - initialiseVariables()
873    - makeKnownLinkHolder()
874    - maybeDoSubpageLink()
875    - parseLinkParameter()
876    - replaceExternalLinks()
877    - replaceInternalLinks()
878    - replaceInternalLinks2()
879    - replaceLinkHoldersText().
880    - splitWhitespace()
881    - stripAltText()
882    - testPreprocess()
883    - testPst()
884    - testSrvus()
885  - incrementIncludeSize(), setTransparentTagHook(), replaceTransparentTags(),
886    and $mTransparentTagHooks have been removed without deprecation.
887  - The following constants have been made private without deprecation:
888    - ::EXT_LINK_ADDR
889    - ::EXT_IMAGE_REGEX
890    - ::SPACE_NOT_NL
891  - The following properties have been removed without deprecation:
892    - ::$mDefaultStripList
893    - ::$mIncludeCount
894    - ::$mRevIdForTs
895  - The following properties have been made private without deprecation:
896    - ::$mFunctionSynonyms
897    - ::$mFunctionTagHooks
898    - ::$mStripList
899    - ::$mVarCache
900    - ::$mImageParams
901    - ::$mImageParamsMagicArray
902    - ::$mSubstWords
903    - ::$mVariables
904    - ::$mConf (deprecated in 1.34)
905    - ::$mExtLinkBracketedRegex
906    - ::$mUrlProtocols
907    - ::$mAutonumber
908    - ::$mLinkHolders
909    - ::$mDefaultSort
910    - ::$mTplRedirCache
911    - ::$mForceTocPosition
912    - ::$mTplDomCache
913    - ::$mOutputType
914    - ::$mLangLinkLanguages
915    - ::$currentRevisionCache
916    - ::$mProfiler
917    - ::$mLinkRenderer
918  - Parser::getTitle() will now throw a TypeError if $mTitle is uninitialized.
919    This use pattern was deprecated in 1.34.
920  - ContentHandler::makeParserOptions(), deprecated in 1.32, was removed. Use
921    WikiPage::makeParserOptions() or ParserOptions::newCanonical() instead.
922  - The ParserAfterUnstrip hook, believed to be unused, was removed without
923    deprecation.
924  - Preprocessor_DOM and related classes, deprecated in 1.34, have been removed.
925    Consequently, the related ParserOptions::getMaxGeneratedPPNodeCount() and
926    ::setMaxGeneratedPPNodeCount() have been removed without deprecation.
927  - The support for the old signature for ParserFactory::__construct, which was
928    deprecated in 1.34, has been removed.
929  - Parser::getDefaultPreprocessorClass(), deprecated in 1.34, has been removed.
930* MediaWikiTestCase::prepareServices(), deprecated in 1.32, has been removed
931* The method ContentHandler::getSlotDiffRendererInternal is replaced with
932  ContentHandler::getSlotDiffRendererWithOptions. This breaks consumers which
933  call parent::getSlotDiffRendererInternal (no instances of which are known).
934* TextContent::getHighlightHtml, deprecated since 1.24, has been removed. Use
935  TextContent::getHtml instead.
936* ExtensionRegistry::load(), deprecated in 1.34, was removed. Instead, use
937  ExtensionRegistry::queue().
938* MWMessagePack class, deprecated in 1.34, was removed.
939* The cdb.php maintenance script was removed. Use the 'cdb' command from the
940  wikimedia/cdb library instead.
941* User::addNewUserLogEntryAutoCreate, deprecated in 1.27, was removed.
942* FileBasedSiteLookup class, deprecated in 1.33, was removed.
943* The wfGlobalCacheKey global function, deprecated in 1.30, was removed.
944* The APCBagOStuff class was removed. MediaWiki requires PHP 7.2+ (support
945  for HHVM was dropped) and these versions of PHP only support apcu. The default
946  "apc" entry in $wgObjectCaches now refers to APCUBagOStuff.
947* Database::bufferResults(), deprecated in 1.34, has been removed.
948* CannotReplaceActiveServiceException, ContainerDisabledException,
949  DestructibleService, NoSuchServiceException, SalvageableService,
950  ServiceAlreadyDefinedException, ServiceContainer and ServiceDisabledException
951  in the global namespace, deprecated in 1.33, were removed. Use the classes in
952  the MediaWiki\\Services namespace instead.
953* The following methods in the Interwiki class were removed: ::fetch(),
954  ::isValidInterwiki(), ::invalidateCache(), and ::getAllPrefixes().
955* The UsersMultiselectWidget config 'allowArbitrary' is now false by default. To
956  accept arbitrary entries, pass in true for this config.
957* OutputPage::parse() and OutputPage::parseInline(), deprecated in 1.32, have
958  been removed. Use ::parseAsContent() or ::parseAsInterface(), as
959  appropriate.
960* WikiPage::selectFields, deprecated in 1.31, was removed. Use ::getQueryInfo.
961* The remaining static methods for MagicWord, deprecated in 1.32, were removed.
962  These were MagicWord::get(), ::getSubstIDs(), ::getDoubleUnderscoreArray(),
963  ::getVariableIDs(), and ::getCacheTTL(). Instead, use MagicWordFactory (via
964  MediaWikiServices).
965* ApiBase::checkTitleUserPermissions no longer accepts a User as the third
966  parameter. Passing a user was deprecated in 1.33.
967* Sanitizer::setupAttributeWhitelist() and Sanitizer::attributeWhitelist(),
968  deprecated in 1.34, have been removed. They should not have been public.
969* Passing a sequential array as the second parameter to
970  Sanitizer::validateAttributes() has been deprecated; use an associative
971  array where keys are the allowed attributes.
972* The $warnCallback parameter to Sanitizer::removeHTMLtags, deprecated since
973  its introduction in 1.28, has been removed.
974* SpecialRecentChanges::filterByCategories(), deprecated in 1.31, was removed.
975* The `ArticleContentViewCustom` hook, deprecated in 1.32, was removed.
976* AuthManager::callLegacyAuthPlugin, deprecated in 1.33, was removed.
977* wfGetMessageCacheStorage was removed without deprecation.
978* Title::moveSubpages, deprecated in 1.34, was removed. Use the MovePage class
979  and MovePage::moveSubpages instead.
980* Article::doEditContent, deprecated in 1.29, was removed. Instead, use
981  WikiPage::doEditContent.
982* CommentStore::newKey, deprecated in 1.31, was removed.
983* EditPage::$hookError was changed from public to private.
984* Title::isValidMoveOperation, ::moveTo, and ::isValidMoveTarget, deprecated
985  in 1.25, were removed. Use the MovePage class and its methods instead.
986* Title::getUserCaseDBKey(), deprecated in 1.33, was removed. Use ::getDBkey().
987* StringUtils::explodeMarkup() was removed without deprecation.
988* AjaxResponse methods that were unused have been removed without deprecation:
989  - checkLastModified
990  - loadFromMemcached
991  - storeInMemcached
992  - setCacheDuration
993  - setVary
994* ApiDelete::delete and ::deleteFile, both of which were protected methods,
995  have been made private to allow a signature change.
996* HistoryPager::revLink, ::curLink, ::lastLink, and ::diffButtons, which had
997  no visibilities defined, have been made private to allow signature changes.
998* SpecialNewpages::revisionFromRcResult, which previously was protected, has
999  been made private to allow a signature change.
1000* DifferenceEngine::$mOldRev and $mNewRev, deprecated for public access in
1001  1.32, have been removed.
1002* DifferenceEngine::revisionDeleteLink, which was previosuly protected, has
1003  been made private to allow a signature change.
1004* DifferenceEngine::getParserOutput, which is protected, has had a breaking
1005  signature change: the second parameter must be a RevisionRecord object,
1006  rather than a Revision object.
1007* WikiPage::setLastEdit, which was previously protected, has been made
1008  private to allow a signature change.
1009* Skin::getSkinNameMessages() deprecated in 1.34, has been removed.
1010* Skin::escapeSearchLink() deprecated in 1.34, has been removed, use
1011  Skin::getSearchLink() instead.
1012* Skin::shouldPreloadLogo() deprecated in  1.32, has been removed.
1013* Revision::loadFromId and RevisionStore::loadRevisionFromId have been
1014  removed.
1015* OutputPage::parserOptions doesn't accept an $options parameter anymore.
1016* MessageCache::getParserOptions previously did not have a visibility set.
1017  It has been made private.
1018* SpecialUndelete::showDiff previously did not have a visibilty set. It
1019  hav been made private to allow a signature change.
1020* The Skin no longer loads the "mediawiki.legacy.shared" or
1021  "mediawiki.legacy.commonPrint" modules. The legacy shared styles must now
1022  be loaded by the skin explicitly, either inherited via the
1023  "mediawiki.skinning.*" modules, or by making your skin's main styles
1024  module use the ResourceLoaderSkinModule class with the "legacy" attribute.
1025  See Vector and Monobook for examples.
1026* Passing an ApiMain to the constructor of ApiResult is no longer supported.
1027  This was deprecated in 1.25.
1028* ResourceLoaderWikiModule::invalidateModuleCache has been declared to
1029  be @internal as part of a signature change. No known uses exist outside
1030  of MediaWiki core.
1031* The ArticleAfterFetchContentObject hook, deprecated in 1.32, was removed.
1032  Use ArticleRevisionViewCustom to control output.
1033* DatabaseBlock::isValid, deprecated in 1.33, was removed.
1034* HTMLUserTextField and HTMLUsersMultiselectField previously implied
1035  required=true when exists=true. Form fields that use exists=true should also
1036  set required=true if they are required.
1037* In DatabaseUpdater, the following methods are no longer public: dropTable(),
1038  modifyTable(), modifyField(), runMaintenance(), copyFile(), appendLine().
1039  In PostgresUpdater, the following methods are no longer public:
1040  addPgEnumValue(), addPgIndex(), addPgExtIndex(). This change was made without
1041  deprecation due to immediate danger of data corruption and loss, see T157651.
1042  Extensions should instead use dropExtensionTable(),
1043  modifyExtensionExtensionTable(), modifyExtensionField(), addExtensionUpdate().
1044  The addExtensionUpdate() method can still be used to access any of the
1045  protected methods on DatabaseUpdater.
1046* ResourceLoader no longer provides the (always-true) variables for wgEnableAPI
1047  and wgEnableWriteAPI; they were deprecated in MediaWiki 1.31 and removed from
1048  the PHP environment in MediaWiki 1.32.
1049* The wfSetupSession global function, deprecated in 1.27, was removed. Use the
1050  persist() method of the right MediaWiki\Session\SessionManager object instead.
1051* The wfIsHHVM global function, deprecated in 1.34, was removed.
1052* GenderCache::doTitlesArray no longer accepts string values in its $titles
1053  array parameter. Use Title objects (or other LinkTarget) instead.
1054* Unused CommentStore::MAX_COMMENT_LENGTH has been removed.
1055* User::checkTemporaryPassword() and User::checkPassword(), deprecated in 1.27,
1056  were removed. Use AuthManager instead.
1057* All constants and class functions now have explicit visibility modifiers. This
1058  means, per [[mw:Stable interface policy]], that these should now be considered
1059  stable. This also helps MW align with PSR 2 and PSR 12. This was done based on
1060  audits of the corpus of skins and extensions hosted in Gerrit. If you find any
1061  that you need to be less restrictive (i.e. public or protected), please report
1062  these so that we can re-evaluate or suggest workarounds.
1063* BaseTemplate::msgWiki(), deprecated in 1.33, was removed. Use ->msg() or
1064  ->getMsg() instead.
1065* QuickTemplate::msgWiki(), deprecated in 1.33, was removed. Use ->msg()
1066  instead.
1067* WebInstaller::getErrorBox() and ::getWarningBox(), deprecated in 1.34,
1068  were removed. Use Html::errorBox() or ::warningBox() instead.
1069* SpecialVersion::getExtensionCredits() and SpecialVersion::getSkinCredits()
1070  have become private without deprecation.
1071* As part of the migration to a new hook system (T240307), the following classes
1072  now require an additional HookContainer constructor parameter:
1073    - AuthManager
1074    - BadFileLookup
1075    - BlockManager
1076    - ClassicInterwikiLookup
1077    - ContentHandlerFactory
1078    - ContentSecurityPolicy
1079    - DefaultOptionsManager
1080    - DerivedPageDataUpdater
1081    - FullSearchResultWidget
1082    - HtmlCacheUpdater
1083    - LanguageFactory
1084    - LanguageNameUtils
1085    - LinkRenderer
1086    - LinkRendererFactory
1087    - LocalisationCache
1088    - MagicWordFactory
1089    - MessageCache
1090    - NamespaceInfo
1091    - PageEditStash
1092    - PageHandlerFactory
1093    - PageUpdater
1094    - ParserFactory
1095    - PermissionManager
1096    - RevisionStore
1097    - RevisionStoreFactory
1098    - Router
1099    - SearchEngineConfig
1100    - SearchEngineFactory
1101    - SearchFormWidget
1102    - SearchNearMatcher
1103    - SessionBackend
1104    - SpecialPageFactory
1105    - UserNameUtils
1106    - UserOptionsManager
1107    - WatchedItemQueryService
1108    - WatchedItemStore
1109* The following classes now require setHookContainer() to be called after
1110  construction:
1111    - AuthenticationProvider
1112    - ResourceLoaderModule
1113    - SearchEngine
1114* The parameters to ChronologyProtector::getTouched() and
1115  ILBFactory::getChronologyProtectorTouched() were changed without backwards
1116  compatibility.
1117* The deprecated $blacklist parameter to wfIsBadImage() has been removed.
1118* SpecialBlock::checkUnblockSelf no longer accepts an integer representing
1119  an user ID as part of ongoing refactoring of SpecialBlock class.
1120* User::setInternalPassword() and User::setPassword(), deprecated in 1.27, have
1121  been removed. Use User::changeAuthenticationData() instead.
1122* User::selectFields(), deprecated in 1.31, has been removed. Use
1123  User::getQueryInfo() instead.
1124* The "legacy" serialization type in RESTBagOStuff, deprecated in 1.34,
1125  has been removed.
1126* The populateContentModel.php maintenance script was removed. It has
1127  been replaced by the populateContentTables.php script.
1128* The findHooks.php maintenance script, for the old hooks system, was removed.
1129* (T257278) Calling MediaWiki\Shell\Command::restrict() will now overwrite
1130  any previous restrictions rather than adding to them, making it possible to
1131  disable the default restrictions.
1132
1133=== Deprecations in 1.35 ===
1134* The PHPUnit4And6Compat class, used to provide compatibility with PHPUnit 4, is
1135  now deprecated. MediaWiki support for PHPUnit 4 ended with the removal of HHVM
1136  support.
1137* LockManagerGroup::getDefault() and LockManagerGroup::getAny() are deprecated.
1138  They seem to be unused. Just use get() directly, and catch any exception.
1139* AbstractBlock::getPermissionsError and AbstractBlock::getBlockErrorParams are
1140  deprecated. Use BlockErrorFormatter::getMessage instead.
1141* The IP class is deprecated. Please instead use the Wikimedia\IPUtils class
1142  from the new wikimedia/ip-utils library instead. Additionally, the RE_IP_*
1143  constants are also deprecated. RE_IP_BYTE can be replaced with a class
1144  constant on the IPUtils class, while the others will eventually be made
1145  private.
1146* The following Language methods are deprecated: getFallbackFor,
1147  getFallbacksFor, getFallbacksIncludingSiteLanguage. Use the corresponding new
1148  methods on the LanguageFallback class: getFirst, getAll, and
1149  getAllIncludingSiteLanguage.
1150* FileJournal::factory is deprecated. Use the constructor directly instead.
1151* AbstractBlock methods setBlocker(), getBlocker() are deprecated and will
1152  become internal implementation of DatabaseBlock.
1153* Title::countRevisionsBetween has been deprecated and moved into RevisionStore.
1154* FileBackendGroup::singleton() is deprecated. Use MediaWikiServices instead.
1155* FileBackendGroup::destroySingleton() is deprecated. Test frameworks should
1156  instead reset MediaWikiServices between test runs.
1157  (MediaWikiIntegrationTestCase does this automatically.)
1158* GenderCache::singleton(), deprecated in 1.28, is hard deprecated. Use
1159  MediaWikiServices::getGenderCache() instead.
1160* MediaWikiIntegrationTest::setContentLang() has been deprecated. Use
1161  setMwGlobals( 'wgLanguageCode', 'xxx' ) to set a different site language
1162  code, or setService( 'ContentLanguage', $myObj ) to set a specific Language
1163  object. Service resets and $wgContLang will be handled automatically.
1164* MediaWikiIntegrationTest::assertType() has been deprecated, as part of the
1165  work to move to PHPUnit 8; PHPUnit's assertInternalType() was deprecated, and
1166  will be removed in PHPUnit 9. MediaWikiIntegrationTest::assertTypeOrValue(),
1167  a wrapper for assertType(), has been removed immediately, without deprecation.
1168* AbstractBlock::getReason is deprecated, since reasons are actually stored as
1169  CommentStoreComments, and getReason returns a string with no caller control
1170  over language or formatting. Instead use AbstractBlock::getReasonComment,
1171  which returns the CommentStoreComment.
1172* The global function wfGetRusage() is deprecated and will now always call the
1173  getrusage() function without checking for its existence.
1174* The properties User::mBlock, User::mBlockedby and User::mHideName are
1175  deprecated. Instead, use User::getBlock to get the block, then use
1176  AbstractBlock::getByName or AbstractBlock::getHideName.Use the GetUserBlock
1177  hook to set, unset or modify a block, including hiding or unhiding a user.
1178* Directly calling the MergeHistory constructor is deprecated. Instead, use the
1179  new MergeHistoryFactory class.
1180* Language::factory() and Language::getParentLanguage() are deprecated, and so
1181  is directly calling the Language constructor. Use the new LanguageFactory
1182  class instead.
1183* Language::classFromCode() is deprecated. There is no reason it should be used
1184  outside the Language class itself.
1185* Language::clearCaches() is deprecated. Instead, reset all services and set
1186  Language::$mLangObjCache = [].
1187* The following functions from Language class are deprecated in favour of
1188  respective functions in LanguageConverter:
1189  - autoConvert
1190  - autoConvertToAllVariants
1191  - convert
1192  - convertTitle
1193  - convertNamespace
1194  - hasVariants
1195  - hasVariant
1196  - convertHtml
1197  - convertCategoryKey
1198  - getVariants
1199  - getPreferredVariant
1200  - getURLVariant
1201  - findVariantLink
1202  - getExtraHashOptions
1203  - updateConversionTable
1204* Language::classFromCode() is hard deprecated and should be removed in 1.36
1205* Language::getConverter() is deprecated and should be removed in 1.36
1206* Language::MESSAGES_FALLBACKS, Language::STRICT_FALLBACKS were deprecated.
1207  Use LanguageFallback::MESSAGES and LanguageFallback::STRICT respectively
1208* Language::$mLangObjCache is deprecated and should be removed in 1.36. Use
1209  MediaWikiServices instead to get a LanguageFactory.
1210* Language::getMessagesFor(), getMessageFor(), and getMessageKeysFor() are
1211  deprecated. Use LocalisationCache's getItem(), getSubitem(), and
1212  getSubitemList() methods directly.
1213* OutputPage::getCSPNonce() is deprecated, use OutputPage::getCSP()->getNonce()
1214  instead.
1215* DerivedPageDataUpdater::prepareUpdate accepted as its second parameter an
1216  optional array of options. Specifying the value of the `oldrevision` key of
1217  the array to be a Revision object, rather than a RevisionRecord object, is
1218  hard deprecated. The same applies to the options parameter in
1219  WikiPage::doEditUpdates.
1220* Skin::makeI18nUrl() and makeNSUrl() have been deprecated, no longer used.
1221* Title::countAuthorsBetween and Title::getAuthorsBetween were hard deprecated.
1222  Use respective methods in RevisionStore instead.
1223* Remove deprecated SkinCopyrightFooter &$forContent parameter
1224* The following Language class static variables have been replaced with
1225  constants and deprecated: $mWeekdayMsgs, $mWeekdayAbbrevMsgs, $mMonthMsgs,
1226  $mMonthGenMsgs, $mMonthAbbrevMsgs, $mIranianCalendarMonthMsgs,
1227  $mHebrewCalendarMonthMsgs, $mHebrewCalendarMonthGenMsgs,
1228  $mHijriCalendarMonthMsgs and $durationIntervals.
1229* As part of dropping security support for IE 6 and IE 7,
1230  WebRequest::checkUrlExtension() has been deprecated, and now always returns
1231  true.
1232* The following ApiBase::PARAM_* constants have been deprecated in favor of
1233  equivalent ParamValidator constants: PARAM_DFLT, PARAM_ISMULTI, PARAM_TYPE,
1234  PARAM_MAX, PARAM_MAX2, PARAM_MIN, PARAM_ALLOW_DUPLICATES, PARAM_DEPRECATED,
1235  PARAM_REQUIRED, PARAM_SUBMODULE_MAP, PARAM_SUBMODULE_PARAM_PREFIX, PARAM_ALL,
1236  PARAM_EXTRA_NAMESPACES, PARAM_SENSITIVE, PARAM_DEPRECATED_VALUES,
1237  PARAM_ISMULTI_LIMIT1, PARAM_ISMULTI_LIMIT2, PARAM_MAX_BYTES, PARAM_MAX_CHARS.
1238* ApiBase::explodeMultiValue() is deprecated. Use
1239  ParamValidator::explodeMultiValue() instead.
1240* ApiBase::parseMultiValue() is deprecated. No replacement is provided;
1241  generally this sort of thing should be handled by fully validating the
1242  parameter.
1243* ApiBase::validateLimit() and ApiBase::validateTimestamp() are deprecated.
1244  Use ApiParamValidator::validateValue() with an appropriate settings array
1245  instead.
1246* ContentHandler (use ContentHandlerFactory):
1247  - getForTitle
1248  - getForContent
1249  - getForModelID
1250  - getContentModels
1251  - getAllContentFormats
1252  - protected $handler (not need anymore)
1253  - cleanupHandlersCache (not need anymore)
1254* (T212738) The $wgVersion global is deprecated; instead, use MW_VERSION.
1255* $wgMemc is deprecated, use MediaWikiServices::getLocalServerObjectCache()
1256  instead.
1257* ObjectCache::detectLocalServerCache() is deprecated, instead use
1258  MediaWikiServices::getLocalServerObjectCache() or
1259  ObjectCache::makeLocalServerCache().
1260* ImagePage::getImageLimitsFromOptions() is deprecated. Use static function
1261  MediaFileTrait::getImageLimitsFromOptions() instead.
1262* As part of work to replace the Parser, alongside the breaking changes listed
1263  above, a large number of deprecations changes been made, to simplify the API
1264  or because they will not be supported in replacement:
1265  - Parser::doBlockLevels() (and BlockLevelPass class has been marked @internal)
1266  - Parser::setFunctionTagHook()
1267  - Parser::attributeStripCallback()
1268  - Parser::fetchTemplate() - use Parser::fetchTemplateAndTitle() instead.
1269  - Parser::enableOOUI() - use $parser->getOutput()->enableOOUI() instead.
1270  - LinkHolderArray has been deprecated for public usage and will be
1271    internal part of parser.
1272  - The following parser-related hooks have been deprecated:
1273    - InternalParseBeforeSanitize
1274        Use an alternative hook which doesn't expose internal half-parsed state,
1275        like ParserBeforeInternalParse or ParserAfterTidy
1276    - ParserFetchTemplate
1277        Use BeforeParserFetchTemplateAndTitle
1278    - ParserSectionCreate
1279        No replacement; <section> tag wrapping will be done by core in future.
1280    - BeforeParserrenderImageGallery
1281        No replacement; MediaHandler provides for customizable media rendering
1282    - ParserBeforeTidy
1283        Use ParserAfterTidy instead to avoid exposing internal half-parsed state
1284    - ParserBeforeStrip
1285        No replacement; stripping is no longer supported.
1286    - ParserAfterStrip
1287        No replacement; stripping is no longer supported.
1288  - The accessor/mutator methods Parser::Options(), Parser::OutputType(), and
1289    Parser::Title() have been deprecated; use the appropriate Parser::get* or
1290    Parser::set* methods instead.
1291  - Parser::firstCallInit() has been deprecated. The parser is initialized
1292    fully on construction and so ::firstCallInit() no longer has any effect
1293    when manually invoked.
1294  - ParserOptions::setAllowExternalImages(), ::setAllowExternalImagesFrom(),
1295    and ::setEnableImageWhitelist() have been deprecated.  Future parsers
1296    will not allow per-parser configuration of image filtering; use
1297    site configuration instead.
1298  - ParserOptions::getTidy() and ParserOptions::setTidy() have been deprecated.
1299    These options no longer have any effect.
1300  - Most methods of MWTidy, except for MWTidy::tidy(), have been deprecated;
1301    tidiness is always enabled and not configurable.
1302  - Version 1 of the parserTests file format has been deprecated. You'll need to
1303    update your parser tests to version 2, which uses Remex tidy on all test
1304    output by default. Support for parser tests with Remex tidy off will later
1305    be removed entirely.
1306  - $wgParser — This global variable, soft deprecated in 1.32, has now been hard
1307    deprecated. Use MediaWikiServices::getInstance()->getParser() instead.
1308    (T160811)
1309* The signature of DefaultPreferencesFactory::__construct has been changed:
1310  - LanguageConverter $languageConverter has been added.
1311  and its usage with old arguments is hard deprecated.
1312* The public usage of the following properties of LanguageConverter have been
1313  deprecated as there is no reason they should be used outside the
1314  LanguageConverter class and will be changed from public to private:
1315  - mLangObj
1316  - mUcfirst
1317  - mConvRuleTitle
1318  - mURLVariant
1319  - mUserVariant
1320  - mHeaderVariant
1321  - mMaxDepth
1322  - mVarSeparatorPattern
1323  changed from public to protected:
1324  - mTables
1325* The ArticleEditUpdatesDeleteFromRecentchanges hook has been deprecated. Please
1326  use the RecentChange_save hook or similar instead.
1327* The ArticleEditUpdates hook has been deprecated. Please
1328  use the RevisionDataUpdates hook or similar instead.
1329* The SkinTemplatePreventOtherActiveTabs and SkinTemplateTabAction hooks have
1330  been hard deprecated. Please use the SkinTemplateNavigation__Universal hook
1331  instead.
1332* ResourceLoaderFileModule::compileLessFile() has been deprecated, use
1333  ResourceLoaderFileModule::compileLessString() instead
1334* The SquidPurgeClient and SquidPurgeClientPool classes have been deprecated.
1335  Use MultiHttpClient or HtmlCacheUpdater instead.
1336* MimeAnalyzer::getExtensionsForType() and ::getTypesForExtensions() were
1337  deprecated in favor of MimeAnalyzer::getExtensionsFromMimeType() and
1338  ::getMimeTypesFromExtension(), respectively. The new methods return arrays
1339  rather than strings.
1340* Calling Action::factory and Action constructor with WikiPage has been
1341  hard deprecated. Caller must provide an Article instance.
1342* ApiTestCase::doLogin, soft deprecated in 1.31, was hard deprecated.
1343* WebRequest::getLimitOffset is hard deprecated. Instead, use
1344  ::getLimitOffsetForUser and pass a User object.
1345* PageArchive::getPreviousRevision is hard deprecated. Instead, use the new
1346  ::getPreviousRevisionRecord method.
1347* PageArchive::getArchivedRevision is hard deprecated. Instead, use the new
1348  ::getArchivedRevisionRecord method.
1349* PageArchive::undelete is hard deprecated. Instead, use ::undeleteAsUser
1350  and pass a User object.
1351* PageArchive::getRevision is hard deprecated.
1352* EditPage::getBaseRevision was hard deprecated. Instead, use the new
1353  ::getExpectedParentRevision method.
1354* The public variable EditPage::$mBaseRevision was hard deprecated.
1355* FileDeleteForm previously did not accept a user parameter in its constructor,
1356  instead relying on the global $wgUser. A user parameter has been added,
1357  and //not// providing a user is deprecated. There are no known callers
1358  outside of mediawiki core.
1359* AuthManager::singleton() has been deprecated. Use
1360  MediaWikiServices::getInstance()->getAuthManager() instead.
1361* ContribsPager::tryToCreateValidRevision is hard deprecated. Instead, use
1362  ContribsPager::tryCreatingRevisionRecord.
1363* The following functions all accept an optional user parameter. Not passing a
1364  user is hard deprecated, and support for calling them without passing a user
1365  will be removed in 1.36:
1366  - Title::getNotificationTimestamp (note however that the method is deprecated
1367      in its entirely in favor of the new WatchlistNotificationManager service)
1368  - PatrolLog::record
1369  - LogEventsList::userCan
1370  - LogEventsList::userCanBitfield
1371  - LogEventsList::userCanViewLogType
1372  - LogPage::addEntry
1373  - FileDeleteForm::doDelete
1374  - OldLocalFile::userCan
1375  - ArchivedFile::userCan
1376  - File::userCan
1377* The following functions all accept an optional audience parameter and
1378  an optional user parameter. If the audience is FOR_THIS_USER and no
1379  user is passed, they fallback to $wgUser. Not passing a user when
1380  one is needed is deprecated
1381  - LogEventsList::getExcludeClause
1382  - WikiPage::getComment
1383  - WikiPage::getCreator
1384  - WikiPage::getUser
1385  - WikiPage::getUserText
1386* UploadBase::checkWarnings now accepts a User parameter; not providing a
1387  user is soft deprecated.
1388* Article::insertProtectNullRevision and WikiPage::insertProtectNullRevision
1389  were hard deprecated. Instead, use WikiPage::insertNullProtectionRevision.
1390* Article::doDeleteArticle, Article::doDeleteArticleReal, and
1391  WikiPage::doDeleteArticle are all deprecated. Instead, use
1392  WikiPage::doDeleteArticleReal.
1393* Article::getComment is deprecated. Instead, use WikiPage::getComment.
1394* Article::getCreator is deprecated. Instead, use WikiPage::getCreator.
1395* Article::updateRevisionOn() and ::updateIfNewerOn(), and
1396  WikiPage::updateIfNewerOn() are deprecated. Instead, use
1397  WikiPage::updateRevisionOn().
1398* Article::getUser is deprecated. Instead, use WikiPage::getUser.
1399* Article::getUserText is deprecated. Instead, use WikiPage::getUserText.
1400* Article::prepareContentForEdit is hard deprecated. Instead, use
1401  WikiPage::prepareContentForEdit.
1402* WikiPage::prepareContentForEdit previously accepted either a Revision or a
1403  RevisionRecord object as its optional second parameter. Passing a Revision
1404  is now hard deprecated.
1405* Article::getUndoContent and WikiPage::getUndoContent are hard deprecated.
1406  Instead, use ContentHandler::getUndoContent.
1407* Passing Revision objects to ContentHandler::getUndoContent is hard deprecated.
1408  Instead, pass the associated Content objects, as well as whether the undo is
1409  from the current revision.
1410* Article::doDeleteUpdates and ::doEditUpdates are deprecated. Instead,
1411  use WikiPage::doDeleteUpdates and ::doEditUpdates.
1412* WikiPage::doEditUpdates previously accepted a Revision object as its first
1413  parameter. It now accepts RevisionRecord objects, and passing Revision
1414  objects is deprecated.
1415* Article::getRevisionFetched is deprecated. Instead, use the
1416  fetchRevisionRecord method, which has been converted from protected to
1417  public.
1418* LocalFileDeleteBatch was migrated to a new constructor signature with the
1419  user as the second parameter. Support for the old signature is hard
1420  deprecated, and once removed the user parameter will be required. At the
1421  same time, a number of file-deletion related methods were updated
1422  - File::delete is hard deprecated in favor of the new ::deleteFile
1423  - LocalFile::delete is hard deprecated in favor of the new ::deleteFile
1424  - LocalFile::deleteOld is hard deprecated in favor of the new ::deleteOldFile
1425  - ForeignDBFile::delete is hard deprecated in favor of the new ::deleteFile
1426* File::recordUpload (along with the respective methods in the LocalFile and
1427  ForeignDBFile classes) is hard deprecated, and LocalFile::recordUpload2 is
1428  soft deprecated. Use the new LocalFile::recordUpload3, which has a different
1429  signature and requires that a User parameter is passed.
1430* The SpecialPageFactory class was moved from the MediaWiki\Special namespace
1431  to the MediaWiki\SpecialPage namespace. The old location remains as a
1432  deprecated alias.
1433* Title::userCan, ::quickUserCan, and ::getUserPermissionsErrors, which
1434  were deprecated in 1.33, were hard deprecated. Instead, use
1435  PermissionManager::userCan, ::quickUserCan, and ::getPermissionErrors.
1436* All methods of the old SpecialPageFactory, deprecated in 1.32, were hard
1437  deprecated. Instead, get a SpecialPageFactory from MediaWikiServices and
1438  use its methods.
1439* User::updateNewtalk now accepts as its optional third parameter a
1440  RevisionRecord object; passing a Revision is hard deprecated.
1441* User::getNewMessageRevisionId and ::getNewMessageLinks were hard deprecated.
1442* DifferenceEngine::getRevisionHeader now accepts a RevisionRecord as its
1443  first parameter; passing a Revision is hard deprecated.
1444* WikiPage::doDeleteUpdates now accepts as its optional third parameter
1445  a RevisionRecord object; passing a Revision is hard deprecated.
1446* WikiPage::onArticleEdit now accepts as its optional second parameter
1447  a RevisionRecord object; passing a Revision is hard deprecated.
1448* Global $wgUser variable was soft deprecated.
1449* The Revision class was soft deprecated entirely in 1.31. All methods
1450  have now been individually hard deprecated:
1451  - ::__construct - create MutableRevisionRecord objects instead
1452  - ::newFromId - use RevisionLookup::getRevisionById instead
1453  - ::newFromTitle - use RevisionLookup::getRevisionByTitle instead
1454  - ::newFromPageId - use RevisionStore::getRevisionByPageId instead
1455  - ::newFromArchiveRow - use RevisionFactory::newRevisionFromArchiveRow
1456  - ::newFromRow - use RevisionStore::newRevisionFromRow instead
1457  - ::loadFromPageId - use RevisionStore::getRevisionByPageId instead
1458  - ::loadFromTitle - use RevisionStore::getRevisionByTitle instead
1459  - ::loadFromTimestamp - use RevisionStore::getRevisionByTimestamp instead
1460  - ::getQueryInfo - use RevisionStore::getQueryInfo instead
1461  - ::getArchiveQueryInfo - use RevisionStore::getArchiveQueryInfo instead
1462  - ::getParentLengths - use RevisionStore::getRevisionSizes instead
1463  - ::getRevisionRecord - no replacement
1464  - ::getId - use RevisionRecord::getId instead
1465  - ::setId - use MutableRevisionRecord::setId instead
1466  - ::setUserIdAndName - use MutableRevisionRecord::setUser instead
1467  - ::getTextId - use SlotRecord::getContentAddress for retrieving an actual
1468      content address, or RevisionRecord::hasSameContent to compare content
1469  - ::getParentId - use RevisionRecord::getParentId instead
1470  - ::getSize - use RevisionRecord::getSize instead
1471  - ::getSha1 - use RevisionRecord::getSha1 instead
1472  - ::getTitle - use RevisionRecord::getPageAsLinkTarget instead
1473  - ::setTitle - the method was previously a no-op
1474  - ::getPage - use RevisionRecord::getPageId instead
1475  - ::getUser - use RevisionRecord::getUser and then User::getId instead
1476  - ::getUserText - use RevisionRecord::getUser and then User::getName instead
1477  - ::getComment - use RevisionRecord::getComment instead
1478  - ::isMinor - use RevisionRecord::isMinor instead
1479  - ::isUnpatrolled - use RevisionStore::getRcIdIfUnpatrolled instead
1480  - ::getRecentChange - use RevisionStore::getRecentChange instead
1481  - ::isDeleted - use RevisionRecord::isDeleted instead
1482  - ::getVisibility - use RevisionRecord::getVisibility instead
1483  - ::getContent - use RevisionRecord::getContent instead
1484  - ::getSerializedData - use SlotRecord::getContent for retrieving a
1485      content object, and Content::serialize for the serialized form
1486  - ::getContentModel - use SlotRecord::getModel instead
1487  - ::getContentFormat - use SlotRecord::getFormat instead, with a fallback
1488       to ContentHandler::getDefaultFormat
1489  - ::getContentHandler - use ContentHandlerFactory::getContentHandler instead
1490  - ::getTimestamp - use RevisionRecord::getTimestamp instead
1491  - ::isCurrent - use RevisionRecord::isCurrent instead
1492  - ::getPrevious - use RevisionLookup::getPreviousRevision instead
1493  - ::getNext - use RevisionLookup::getNextRevision instead
1494  - ::getRevisionText - use RevisionRecord::getContent instead
1495  - ::compressRevisionText - use SqlBlobStore::compressData instead
1496  - ::decompressRevisionText - use SqlBlobStore::decompressData instead
1497  - ::insertOn - use RevisionStore::insertRevisionOn instead
1498  - ::base36Sha1 - use SlotRecord::base36Sha1 instead
1499  - ::newNullRevision - use RevisionStore::newNullRevision
1500  - ::userCan - use RevisionRecord::userCanBitfield instead
1501  - ::userCanBitfield - use RevisionRecord::userCanBitfield instead
1502  - ::getTimestampFromId - use RevisionStore::getTimestampFromId instead
1503  - ::countByPageId - use RevisionStore::countRevisionsByPageId instead
1504  - ::countByTitle - use RevisionStore::countRevisionsByTitle instead
1505  - ::userWasLastToEdit - use RevisionStore::userWasLastToEdit instead
1506  - ::newKnownCurrent - use RevisionStore::getKnownCurrentRevision instead
1507* The Revision method had a few methods that were previously protected and
1508  have been made private. They were:
1509  - ::getRevisionStore
1510  - ::getRevisionLookup
1511  - ::getRevisionFactory
1512  - ::getBlobStore
1513  The $mRecord variable was also changed from protected to private.
1514* Multiple hooks that include Revision objects were deprecated. The hooks, as
1515  well as suitable replacements, are noted below:
1516  - ArticleRevisionUndeleted (hard deprecated, use the RevisionUndeleted hook)
1517  - ArticleRollbackComplete (hard deprecated, use the RollbackComplete hook)
1518  - DiffRevisionTools (hard deprecated, use the DiffTools hook)
1519  - DiffViewHeader (hard deprecated, use the DifferenceEngineViewHeader hook)
1520  - HistoryRevisionTools (hard deprecated, use the HistoryTools hook)
1521  - NewRevisionFromEditComplete (hard deprecated, use the
1522      RevisionFromEditComplete hook).
1523  - PageContentInsertComplete (hard deprecated, use the PageSaveComplete hook)
1524  - PageContentSaveComplete (hard deprecated, use the PageSaveComplete hook)
1525  - RevisionInsertComplete (soft deprecated in 1.31, now hard deprecated)
1526  - TitleMoveCompleting (hard deprecated, use the PageMoveCompleting hook)
1527  - TitleMoveComplete (hard deprecated, use the PageMoveComplete hook)
1528  - UndeleteShowRevision (hard deprecated)
1529* The following RevisionStore methods were deprecated:
1530  - ::loadRevisionFromTitle
1531  - ::loadRevisionFromTimestamp
1532  - ::loadRevisionFromPageId
1533  - ::listRevisionSizes
1534* WikiPage::$mLastRevision was changed from protected to private.
1535* RecentChange::markPatrolled was deprecated. Use ::doMarkPatrolled instead.
1536* The JobRunner class has been converted to a service class.
1537  Direct construction is deprecated, use MediaWikiServices::getJobRunner.
1538* JobRunner::setLogger has been deprecated, thus using JobRunner as a
1539  LoggerAwareInterface is deprecated as well. Rely on the logger passed in the
1540  constructor instead.
1541* LogEventsList::typeAction accepts an optional right to check against as
1542  the fourth parameter. Specifying such a right is deprecated.
1543* SkinTemplate::makeArticleUrlDetails has been deprecated, no longer used.
1544* Passing a Revision object into CategoryMembershipChange constructor is
1545  deprecated. Pass a RevisionRecord instead.
1546* The "mediawiki.legacy.oldshared" module has been deprecated.
1547  Skins and extensions that are using this should copy its necessary CSS rules
1548  to their own styles module. CologneBlue and Nostalgia skins serve as examples.
1549* The "mediawiki.legacy.shared" module has been deprecated.
1550  Use the "mediawiki.skinning.*" modules, or ResourceLoaderSkinModule instead.
1551* The following hooks, soft deprecated in 1.24, have been hard deprecated:
1552  - APIQueryInfoTokens
1553  - APIQueryRecentChangesTokens
1554  - APIQueryRevisionsTokens
1555  - APIQueryUsersTokens
1556  - ApiTokensGetTokenTypes
1557* Calling Action::factory and Action constructor with any Page implementations
1558  other than Article is deprecated.
1559* Action::page property is deprecated for direct access.
1560  Use Action::getArticle or Action::getWikiPage instead.
1561* LESS `.background-image-svg()` mixin from 'mediawiki.mixins.less' is
1562  deprecated and should be removed in 1.36.
1563* LESS `.background-image-svg-quick()` mixin from 'mediawiki.mixins.less' is
1564  deprecated and should be removed in 1.36.
1565* The following methods were deprecated:
1566  - Title::getFirstRevision (hard deprecated)
1567  - Title::getEarliestRevTime
1568  - WikiPage::getOldestRevision (hard deprecated)
1569  - Article::getOldestRevision (hard deprecated)
1570  Use RevisionStore::getFirstRevision instead.
1571* WikiPage::commitRollback and ::doRollback are declared to be internal
1572  in preparation for breaking changes. Neither method has any known
1573  callers outside of MediaWiki core. Both methods modify an array passed
1574  by reference ($resultDetails) - accessing the Revision objects added to
1575  that array (using the keys `current` and `target`) is also deprecated.
1576* The following Linker methods previously accepted Revision objects as
1577  parameters. They now accept either Revision or RevisionRecord objects.
1578  Passing a Revision object is hard deprecated.
1579  - ::revUserLink
1580  - ::revUserTools
1581  - ::revComment
1582  - ::generateRollback
1583  - ::getRollbackEditCount
1584  - ::buildRollbackLink
1585  - ::getRevDeleteLink
1586* WikiPage::hasDifferencesOutsideMainSlot previously accepted Revision
1587  objects for its two parameters. It now accepts RevisionRecord objects,
1588  and passing Revision objects is hard deprecated.
1589* WikiPage::updateRevisionOn previously accepted Revision objects for its
1590  second parameter. It now accepts RevisionRecord objects, and passing
1591  Revision objects is hard deprecated.
1592* The ParserGetVariableValueVarCache hook has been deprecated.
1593* When using the ParserGetVariableValueSwitch hook, the following unusual
1594  uses have been deprecated: modifying the passed $magicWordId or failing to
1595  cache the returned value in $variableCache.  The related
1596  MagicWordwgVariableIDs hook has been deprecated and renamed; use
1597  the GetMagicVariableIDs hook instead.
1598* The following Parser properties have been deprecated:
1599  - ::$mTagHooks
1600  - ::$mFunctionHooks
1601  - ::$mMarkerIndex
1602  - ::$mFirstCall
1603  - ::$mPreprocessor
1604  - ::$mOutput
1605  - ::$mStripState
1606  - ::$mLinkID
1607  - ::$mIncludeSizes
1608  - ::$mPPNodeCount
1609  - ::$mGeneratedPPNodeCount
1610  - ::$mHighestExpansionDepth
1611  - ::$mDoubleUnderscores
1612  - ::$mExpensiveFunctionCount
1613  - ::$mShowToc
1614  - ::$mUser
1615  - ::$mOptions
1616  - ::$mTitle
1617  - ::$ot
1618  - ::$mRevisionObject
1619  - ::$mRevisionId
1620  - ::$mRevisionTimestamp
1621  - ::$mRevisionUser
1622  - ::$mRevisionSize
1623  - ::$mInputSize
1624  - ::$mInParse
1625* LinksUpdate::getRevision and ::setRevision are hard deprecated in favor
1626  of the new ::getRevisionRecord and ::setRevisionRecord methods.
1627* A large number of exposed variables and methods of Article were deprecated as
1628  part of its planned removal:
1629  - Article::$mContext is deprecated; use getContext()/setContext() instead.
1630  - Article::__get(), ::__set() are hard deprecated, use the WikiPage properties
1631    instead.
1632  - These Article methods were hard deprecated; use their WikiPage equivalents:
1633    - ::checkFlags,
1634    - ::checkTouched,
1635    - ::clearPreparedEdit,
1636    - ::commitRollback,
1637    - ::doDeleteArticleReal,
1638    - ::doEditContent,
1639    - ::doPurge,
1640    - ::doRollback,
1641    - ::doUpdateRestrictions,
1642    - ::doViewUpdates,
1643    - ::exists,
1644    - ::followRedirect,
1645    - ::getContentHandler,
1646    - ::getContentModel,
1647    - ::getContributors,
1648    - ::getDeletionUpdates,
1649    - ::getHiddenCategories,
1650    - ::getId,
1651    - ::getLatest,
1652    - ::getLinksTimestamp,
1653    - ::getMinorEdit,
1654    - ::getRedirectTarget,
1655    - ::getRedirectURL,
1656    - ::getTimestamp,
1657    - ::getTouched,
1658    - ::hasViewableContent,
1659    - ::insertOn,
1660    - ::insertRedirect,
1661    - ::insertRedirectEntry,
1662    - ::isCountable,
1663    - ::isRedirect,
1664    - ::loadFromRow,
1665    - ::loadPageData,
1666    - ::lockAndGetLatest,
1667    - ::makeParserOptions,
1668    - ::pageDataFromId,
1669    - ::pageDataFromTitle,
1670    - ::prepareContentForEdit,
1671    - ::protectDescription,
1672    - ::protectDescriptionLog,
1673    - ::replaceSectionAtRev,
1674    - ::setTimestamp,
1675    - ::shouldCheckParserCache,
1676    - ::supportsSections,
1677    - ::triggerOpportunisticLinksUpdate,
1678    - ::updateCategoryCounts, and
1679    - ::updateRedirectOn.
1680  - Article::generateReason() was hard deprecated; instead, please use
1681    WikiPage::getAutoDeleteReason().
1682  - Article::replaceSectionContent() was hard deprecated, use
1683    Article::replaceSectionAtRev() instead.
1684  - Article::getRevision and WikiPage::getRevision were hard deprecated in favor
1685    of the new WikiPage::getRevisionRecord method.
1686* A new UserNameUtils service was introduced. The following User methods
1687  were deprecated in favor of using the new service:
1688  - isIP
1689  - isIPRange
1690  - isValidUserName
1691  - isUsableName
1692  - isCreatableName
1693  - getCanonicalName
1694* The signature of WikiPage::doDeleteArticleReal was changed to make the user
1695  the second parameter, and the suppression option the third parameter.
1696  Previously, the third parameter was unused. Using the old signature is
1697  hard deprecated.
1698* ApiQueryRevisions::getRollbackToken, which has been soft deprecated since
1699  1.24, accepted as its third parameter a Revision object. It now accepts
1700  a RevisionRecord, and passing a Revision is hard deprecated.
1701* Passing Article to ParserCache::get() was deprecated
1702* ParserOptions::newCanonical() with no first parameter, or null as the first
1703  parameter, which falls back to using global $wgUser, is hard deprecated.
1704* Parser::fetchCurrentRevisionOfTitle, ::statelessFetchRevision, and
1705  ::getRevisionObject were hard deprecated in favor of the new
1706  ::fetchCurrentRevisionRecordOfTitle, ::statelessFetchRevisionRecord,
1707  and ::getRevisionRecordObject methods respectively.
1708* ParserOptions::getCurrentRevisionCallback and ::setCurrentRevisionCallback
1709  were hard deprecated in favor of the new ::getCurrentRevisionRecordCallback
1710  and ::setCurrentRevisionRecordCallback methods respectively.
1711* Parser::statelessFetchTemplate returns an array; accessing the Revision
1712  object returned (via the `revision` key to the array) is deprecated. Instead,
1713  use `revision-record` to retrieve the equivalent RevisionRecord.
1714* WikiPage::doEditContent returns an array, and PageUpdater::getStatus returns
1715  a Status object with an array value. For both of those arrays, accessing the
1716  Revision object returned (via the `revision` key to the array) is deprecated.
1717  Instead, use `revision-record` to retrieve the equivalent RevisionRecord.
1718* Page interface was deprecated. Use Article or WikiPage instead.
1719* The following DatabaseBlock methods are deprecated because they are no longer
1720  needed in core: chooseBlock, fromMaster, deleteIfExpired.
1721* wfGetScriptUrl() was deprecated. The script URL should be configured rather
1722  than detected. wfScript() can be used to get a configured script URL.
1723* Action::factory() with null $action argument is hard deprecated
1724* The following methods of the User class were deprecated: getDefaultOptions,
1725  getDefaultOption, getOptions, getOption, getBoolOption, getIntOption,
1726  setOption, listOptionKinds, getOptionKinds, resetOptions. Use corresponding
1727  methods in UserOptionsLookup or UserOptionsManager service classes instead.
1728* UserRetrieveNewTalks hook was deprecated without replacement.
1729* User::getNewtalk and ::setNewtalk were hard deprecated. Use service
1730  TalkPageNotificationManager instead.
1731* EditPage::matchSpamRegex and ::matchSummarySpamRegex were hard deprecated in
1732  favor of the new SpamChecker service.
1733* Title::getNotificationTimestamp, User::clearNotification, and
1734  User::clearAllNotifications were deprecated in favor of the new
1735  WatchlistNotificationManager service.
1736* SpecialPage::setListed() and SpecialPage::listed() were deprecated. Subclass
1737  UnlistedSpecialPage to set listed as false, and use SpecialPage::isListed()
1738  to get the value.
1739* CategoryPage::getCategoryViewerClass() and ::setCategoryViewerClass() were
1740  deprecated.
1741* MWHttpRequest and its subclasses PhpHttpRequest, CurlHttpRequest and
1742  GuzzleHttpRequest now require the timeout and connectTimeout options to
1743  always be specified, otherwise a deprecation warning will be raised. Most
1744  callers should use HttpRequestFactory which always sets these options.
1745* Linker::normaliseSpecialPage() has been deprecated, instead make use of
1746  LinkRenderer::normalizeTarget().
1747* SkinTemplate::getPersonalToolsList() was soft deprecated.
1748* ChangeTags::truncateTagDescription() has been deprecated.
1749* The following methods of the User class are deprecated: getGroups,
1750  getGroupMemberships, getEffectiveGroups, getAutomaticGroups,
1751  addGroup, removeGroup, getFormerGroups, getAllGroups, getImplicitGroups,
1752  addAutopromoteOnceGroups. Use the new UserGroupManager service instead.
1753* The following methods of the UserGroupMembership class were deprecated:
1754  selectFields, getMembershipsForUser, getMembership, insert, delete,
1755  newFromRow, initFromRow, purgeExpired.
1756  Use the new UserGroupManager service instead.
1757* wfWaitForSlaves() has been hard deprecated. Use LBFactory::waitForReplication
1758  instead. It was soft deprecated in 1.27.
1759* BaseTemplate::getAfterPortlet and ::renderAfterPortlet have been deprecated in
1760  favor of the Skin::getAfterPortlet method. Skin::getAfterPortlet does not wrap
1761  the result in a div, callers are responsible for that.
1762  The hook BaseTemplateAfterPortlet, called by both methods has been deprecated
1763  as well and is replaced by SkinAfterPortlet.
1764* Autopromote class has been soft deprecated and it's methods moved into
1765  UserGroupManager.
1766* SkinTemplateBuildNavUrlsNav_urlsAfterPermalink hook has been deprecated.
1767  Use SidebarBeforeOutput hook and get the revision id from the OutputPage
1768  object.
1769* BaseTemplate::getToolbox() method has been soft deprecated. The toolbox data
1770  is now available in a sidebar data array which you can get from any class
1771  that's extending QuickTemplate class. The hook associated with this method,
1772  BaseTemplateToolbox, has been hard deprecated. To add items to the toolbox,
1773  use SidebarBeforeOutput hook instead.
1774* The SkinTemplateOutputPageBeforeExec hook is deprecated.
1775  The page [[mw:Manual:Hooks/SkinTemplateOutputPageBeforeExec]] and T60137
1776  for recommendations for alternative approaches based on how developers
1777  previously used this hook.
1778* SkinTemplateToolboxEnd hook has been deprecated. Use SidebarBeforeOutput hook
1779  instead.
1780* Using Skin::addToBodyAttributes() method to add body attributes has been
1781  deprecated. Use OutputPageBodyAttributes hook instead.
1782* Installer::getDBTypes has been hard deprecated in favor of
1783  InstallerDBSupport::getDatabases
1784* The hooks BeforeHttpsRedirect, CanIPUseHTTPS and UserRequiresHTTPS were
1785  deprecated, as part of a long-term plan to remove support for mixed
1786  HTTP/HTTPS wikis.
1787* Skin::generateDebugHTML() has been hard deprecated. Call
1788  MWDebug::getHTMLDebugLog() directly.
1789* ExternalStoreDB::getSlave(), soft deprecated in 1.34, was hard deprecated.
1790  Use ExternalStoreDB::getReplica() instead.
1791* Less variables in mediawiki.ui/variables.less file that don't follow the
1792  standard variable naming scheme (compare WikimediaUI Base) including
1793  `@colorGray* variables have been deprecated. New variables are in place and
1794  aliases have been set. Replace occurrences and use the new variables instead.
1795
1796=== Other changes in 1.35 ===
1797* A new maintenance script is added (purgeExpiredWatchlistItems.php) with which
1798  to delete expired watchlist items. These items will also be deleted during
1799  wiki editing if $wgWatchlistPurgeRate is > 0. This maintenance script only
1800  has effect if $wgWatchlistExpiry is true. It is recommended that a cronjob or
1801  similar be set up to run it at least daily.
1802* Title::purgeSquid is deprecated. Use MediaWikiServices::getHtmlCacheUpdater.
1803* SpecialVersion::getExtLicenseFileName() has been deprecated, use
1804  MediaWiki\ExtensionInfo::getLicenseFileNames() instead.
1805* SpecialVersion::getExtAuthorsFileName() has been deprecated, use
1806  MediaWiki\ExtensionInfo::getAuthorsFileName() instead.
1807* Migration to the new content storage schema is complete, all backwards
1808  compatibility code and duplication in the database have been removed.
1809  The old schema was a 1:1 relationship modeled by
1810  revision.text_id -> text.old_id. The new schema is a n:m relationship,
1811  revision.rev_id <- slots.slot_revision_id|slots.slot_content_id ->
1812  content.content_id|content.content_address -> text.old_id. The same applies
1813  to the archive table.
1814  The following fields were removed:
1815  - revision.rev_text_id, replaced by content.content_address
1816  - revision.rev_content_model, replaced by content.content_model,
1817    referencing content_models.model_id
1818  - revision.rev_content_format, replaced by automatic detecting in
1819    ContentHandler
1820  - archive.ar_text_id, replaced by content.content_address
1821  - archive.ar_content_model, replaced by content.content_model,
1822    referencing content_models.model_id
1823  - archive.ar_content_format, replaced by automatic detecting in
1824    ContentHandler
1825* Migration to normalized storage of edit comments and user names is
1826  progressing. The following fields were unused and have been removed:
1827  - revision.rev_comment,
1828    replaced by rev_comment_id referencing comment.comment_id.
1829  - revision.rev_user and rev_user_text,
1830    replaced by rev_actor referencing actor.actor_id.
1831  Note that archive.ar_user, archive.ar_user_text, and archive.ar_comment
1832  had already been removed in previous releases.
1833* The printableversion has been marked as deprecated per T167956.
1834* (T30162, T245387) The installer supports using a Postgres server running
1835  on a custom port other than 5432.
1836
1837== Compatibility ==
1838MediaWiki 1.35 requires PHP 7.3.19 or later, and the following PHP extensions:
1839
1840* ctype
1841* dom
1842* fileinfo
1843* iconv
1844* json
1845* mbstring
1846* xml
1847
1848MySQL/MariaDB is the recommended DBMS. PostgreSQL or SQLite can also be used,
1849but support for them is somewhat less mature.
1850
1851The supported versions are:
1852
1853* MySQL 5.5.8 or later
1854* PostgreSQL 9.2 or later
1855* SQLite 3.8.0 or later
1856
1857== Online documentation ==
1858Documentation for both end-users and site administrators is available on
1859MediaWiki.org, and is covered under the GNU Free Documentation License (except
1860for pages that explicitly state that their contents are in the public domain):
1861
1862       https://www.mediawiki.org/wiki/Special:MyLanguage/Documentation
1863
1864== Mailing list ==
1865A mailing list is available for MediaWiki user support and discussion:
1866
1867       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
1868
1869A low-traffic announcements-only list is also available:
1870
1871       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
1872
1873It's highly recommended that you sign up for one of these lists if you're
1874going to run a public MediaWiki, so you can be notified of security fixes.
1875
1876== IRC help ==
1877There's usually someone online in #mediawiki on irc.libera.chat.
1878