MediaWiki  master
Todo List
Member MediaWiki\Revision\RevisionStore::newNullRevision (IDatabase $dbw, PageIdentity $page, CommentStoreComment $comment, $minor, UserIdentity $user)
Introduce newFromParentRevision(). newNullRevision can then be based on that (or go away).
Member Sanitizer::mergeAttributes ( $a, $b)
implement merging for other attributes such as style
Member Sanitizer::escapeClass ( $class)
For extra validity, input should be validated UTF-8.
Class StripState

document, briefly. @newable

Member MediaWiki\Permissions\PermissionManager::getPermissionErrors ( $action, User $user, LinkTarget $page, $rigor=self::RIGOR_SECURE, $ignoreErrors=[])
FIXME: This does not check throttles (User::pingLimiter()).
Class MediaWiki\Permissions\PermissionStatus
Add compat code for PermissionManager::getPermissionErrors and additional info about user blocks.
Member MediaWiki\Preferences\DefaultPreferencesFactory::profilePreferences (User $user, IContextSource $context, &$defaultPreferences)
Inject user Language instead of using context.
Member ExtensionProcessor::extractConfig1 (array $info)
In the future, this should be done via Config interfaces
Member ExtensionProcessor::extractConfig2 (array $info, $dir)
In the future, this should be done via Config interfaces
Member MediaWiki\Rest\Handler\PageHistoryHandler::getBitmask ()
Factor out rev_deleted logic per T233222
Member MediaWiki\Revision\RevisionRenderer::combineSlotOutput (RenderedRevision $rrev, array $hints=[])
Use placement hints from SlotRoleHandlers instead of hard-coding the layout.
Member MediaWiki\Revision\RevisionStore::__construct (ILoadBalancer $loadBalancer, SqlBlobStore $blobStore, WANObjectCache $cache, CommentStore $commentStore, NameTableStore $contentModelStore, NameTableStore $slotRoleStore, SlotRoleRegistry $slotRoleRegistry, ActorMigration $actorMigration, ActorStore $actorStore, IContentHandlerFactory $contentHandlerFactory, PageStore $pageStore, TitleFactory $titleFactory, HookContainer $hookContainer, $wikiId=WikiAwareEntity::LOCAL)
$blobStore should be allowed to be any BlobStore!
Member Sanitizer::validateAttributes ( $attribs, $allowed)
Check for unique id attribute :P
Member MediaWiki\Revision\RevisionStore::getRcIdIfUnpatrolled (RevisionRecord $rev)
This is overly specific, so move or kill this method.
Member MediaWiki\Revision\RevisionStore::getRecentChange (RevisionRecord $rev, $flags=0)
move this somewhere else?
Member RevisionItem::getRevisionLink ()
Essentially a copy of RevDelRevisionItem::getRevisionLink. That class should inherit from this one, and implement an appropriate interface instead of extending RevDelItem
Member RevisionItem::getDiffLink ()
Essentially a copy of RevDelRevisionItem::getDiffLink. That class should inherit from this one, and implement an appropriate interface instead of extending RevDelItem
Member RevisionItem::getHTML ()
Essentially a copy of RevDelRevisionItem::getHTML. That class should inherit from this one, and implement an appropriate interface instead of extending RevDelItem
Member SearchEngine::getTextFromContent (Title $t, Content $c=null)
This isn't ideal, we'd really like to have content-specific handling here
Class SearchEngineDummy

FIXME: Dummy class should probably try something at least mildly useful, such as a LIKE search through titles.

Member DBSiteStore::__construct (ILoadBalancer $dbLoadBalancer)
inject some kind of connection manager that is aware of the target wiki, instead of injecting a LoadBalancer.
Class SiteConfiguration
Give examples for suffixes: $conf->suffixes = [ 'wiki' ];
Class BaseTemplate
Phase this class out and make it an alias for QuickTemplate. Move methods individually as-appropriate either down to QuickTemplate, or (with deprecation) up to SkinTemplate.
Class ChangesListSpecialPage
Way too many public functions, most of them should be protected
Member CacheTime::isDifferentRevision ( $id)
We always return false if $this->getCacheRevisionId() is null; this prevents invalidating the whole parser cache when this change is deployed. Someday that should probably be changed.
Member ImagePage::makeMetadataTable ( $metadata)
FIXME: Bad interface, see note on MediaHandler::formatMetadata().
Member PageArchive::listFiles ()
Does this belong in Image for fuller encapsulation?
Member WikiPage::$mTitle
make protected
Member WikiPage::$mDataLoaded
make protected
Member WikiPage::$mLatest
make protected
Member WikiPage::$mPreparedEdit
make protected
Member WikiPage::getActionOverrides ()
Move this UI stuff somewhere else
Member WikiPage::insertOn ( $dbw, $pageId=null)
Factor out into a PageStore service, to be used by PageUpdater.
Member WikiPage::updateRevisionOn ( $dbw, RevisionRecord $revision, $lastRevision=null, $lastRevIsRedirect=null)
Factor out into a PageStore service, or move into PageUpdater.
Member WikiPage::supportsSections ()

The skin should check this and not offer section functionality if sections are not supported.

The EditPage should check this and not offer section functionality if sections are not supported.

Member ChangesListSpecialPage::getExtraOptions ( $opts)
This should handle options returned by getDefaultOptions().
Member CoreTagHooks::gallery (?string $content, array $attributes, Parser $parser)
break Parser::renderImageGallery out here too.
Member Parser::$mUser
Please change to mUserIdentity when getUser will be removed
Member Parser\ParserCacheMetadata::getCacheTime ()
remove legacy -1
Member ParserOptions::$mUser
Track this for caching somehow without fragmenting the cache insanely
Member ParserOptions::$redirectTarget
Track this for caching somehow
Member ParserOutput::addTrackingCategory ( $msg, $title)
Migrate some code to TrackingCategories
Class Preprocessor_Hash
: Consider replacing descriptor arrays with objects of a new class. Benchmark and measure resulting memory impact.
Member Sanitizer::validateTagAttributes ( $attribs, $element)

Check for legal values where the DTD limits things.

Check for unique id attribute :P

Member Sanitizer::validateAttributes ( $attribs, $allowed)
Check for legal values where the DTD limits things.
File deleteOrphanedRevisions.php
More efficient cleanup of text records
Member MediaWikiTitleCodec::splitTitleString ( $text, $defaultNamespace=NS_MAIN)
This method should be split up and an appropriate interface defined for use by the Title class.
Member TitleFormatter::getNamespaceName ( $namespace, $text)
Move this to a separate interface
Member Title::getContentModel ( $flags=0)
Deprecate this in favor of SlotRecord::getModel()
Member Title::getBrokenLinksFrom ()
check if needed (used only in SpecialBrokenRedirects.php, and should use redirect table in this case).
Member UploadBase::checkSvgScriptCallback ( $element, $attribs, $data=null)
Replace this with a whitelist filter!
Member MediaWiki\User\ActorStore::attachActorId (UserIdentity $user, int $id, bool $assigned)
remove this method when no longer needed (T273974).
Member MediaWiki\User\ActorStore::detachActorId (UserIdentity $user)
remove this method when no longer needed (T273974).
Member User::saveSettings ()
Only rarely do all these fields need to be set!
Member WikiMap::getWikiName ( $wikiID)
We can give more info than just the wiki id!
Member WikiReference::getLocalUrl ( $page, $fragmentId=null)
FIXME: This may be generalized...
Member Xml::isWellFormed ( $text)
Error position reporting return
Member MediaWikiTitleCodec::splitTitleString ( $text, $defaultNamespace=NS_MAIN)
this method is only exposed as a temporary measure to ease refactoring. It was copied with minimal changes from Title::secureAndSplit().
Class EraseArchivedFile
Maybe add some simple logging
Member ImportImages::getFileCommentFromSourceWiki ( $wiki_host, $file)
FIXME: Access the api in a saner way and performing just one query (preferably batching files too).
Member BackupDumper::backupDb ()
Fixme: the –server parameter is currently not respected, as it doesn't seem terribly easy to ask the load balancer for a particular connection by name.
File dumpMessages.php
Make this more useful, right now just dumps content language
File mcc.php


File mwdocgen.php
Member PurgeChangedPages::pageableSortedRows (IResultWrapper $res, $column, $limit)
move this elsewhere
File rebuildrecentchanges.php
File rebuildtextindex.php
Module TermColorer
Fixme: Make this more generic
File update.php


Member SpecialSearch::showGoogleSearch ( $term)
FIXME Maybe we should get rid of this raw html message at some future time
Member ChangesListSpecialPage::getExtraOptions ( $opts)
Not called by anything in this class (but is in subclasses), should be called by something… doHeader() maybe?
Member ContribsPager::formatRow ( $row)
This would probably look a lot nicer in a table.
Member DeletedContribsPager::formatRow ( $row)
This would probably look a lot nicer in a table.
Member DeletedContribsPager::formatRevisionRow ( $row)
This would probably look a lot nicer in a table.
Class SpecialAllPages
Rewrite using IndexPager
Member SpecialBlock::getSuggestedDurations (Language $lang=null, $includeOther=true)
FIXME: This uses a rather odd syntax for the options, should it be converted to the standard "**<duration>|<displayname>" format?
Member SpecialContributions::contributionsSub ( $userObj, $targetName)
FIXME: Almost the same as getSubTitle in SpecialDeletedContributions.php. Could be combined.
Member SpecialLinkSearch::getMaxResults ()
FIXME This special page should not use LIMIT for paging
Member SpecialMergeHistory::merge ()
if all versions of page A are moved to B and then a user tries to do a reverse-merge via the "unmerge" log link, then page A will still be a redirect (as it was after the original merge), though it will have the old revisions back from before (as expected). The user may have to "undo" the redirect manually to finish the "unmerge". Maybe this should delete redirects at the target page of merges?
Member SpecialRevisionDelete::tryShowFile ( $archiveName)
Mostly copied from Special:Undelete. Refactor.
Member SpecialRevisionDelete::addUsageText ()
FIXME: Wikimedia-specific policy text
Member Article::getRobotPolicy ( $action, ParserOutput $pOutput=null)
actions other than 'view'
Class SpecialUncategorizedImages
FIXME: Use an instance of UncategorizedPagesPage or something
Class SpecialUncategorizedPages
FIXME: Make $requestedNamespace selectable, unify all subclasses into one
Member SpecialUpload::rotationEnabled ()
What about non-BitmapHandler handled files?
Member SpecialUploadStash::outputFileHeaders ( $contentType, $size)
Unsure about encoding as binary; if we received from HTTP perhaps we should use that encoding, concatenated with semicolon to $contentType as it usually is. Side effect: preps PHP to write headers to STDOUT.
File SpecialWhatLinksHere.php
Use some variant of Pager or something; the pagination here is lousy.
Class MediaWiki\Storage\DerivedPageDataUpdater
Define interfaces for the different use cases of DerivedPageDataUpdater, particularly providing access to post-PST content and ParserOutput to callbacks during revision creation, which currently use WikiPage::prepareContentForEdit, and allowing updates to be triggered on purge, import, and undeletion, which currently use WikiPage::doEditUpdates() and Content::getSecondaryDataUpdates().
Member MediaWiki\Storage\DerivedPageDataUpdater::getRevision ()
This is currently used by PageUpdater::makeNewRevision() to construct an unsaved MutableRevisionRecord instance. Introduce something like an UnsavedRevisionFactory service for that purpose instead!
Member MediaWiki\Storage\SqlBlobStore::expandBlob ( $raw, $flags, $cacheKey=null)
make this private, there should be no need to use this method outside this class.
Member MediaWiki\Storage\SqlBlobStore::compressData (&$blob)
make this private, there should be no need to use this method outside this class.
Member MediaWiki\Storage\SqlBlobStore::decompressData (string $blob, array $blobFlags)
make this private, there should be no need to use this method outside this class.
Member wfLogProfilingData ()
Class DiffFormatter


Class TableDiffFormatter

document @newable

Member EditPage::internalAttemptSave (&$result, $markAsBot=false, $markAsMinor=false)
FIXME: This interface is TERRIBLE, but hard to get rid of due to various error display idiosyncrasies. There are also lots of cases where error metadata is set in the object and retrieved later instead of being returned, e.g. AS_CONTENT_TOO_BIG and AS_BLOCKED_PAGE_FOR_USER. All that stuff needs to be cleaned up some time.
Class UnregisteredLocalFile
Currently it doesn't really work in the repository role, there are lots of functions missing. It is used by the WebStore extension in the standalone role.
Member FileRepo::$name
make protected
Member ForeignResourceManager::parseBasicYaml ( $input)
Just ship symfony/yaml.
Class FormOptions
This badly needs some examples and tests :) The usage in SpecialRecentchanges class is a good ersatz in the meantime.
Member wfExpandUrl ( $url, $defaultProto=PROTO_CURRENT)
this won't work with current-path-relative URLs like "subdir/foo.html", etc.
Member wfAssembleUrl ( $urlParts)
Need to integrate this into wfExpandUrl (see T34168)
Member wfRemoveDotSegments ( $urlPath)
Need to integrate this into wfExpandUrl (see T34168)
Member wfExpandIRI ( $url)
handle punycode domains too
Class DifferenceEngine
This class is huge and poorly defined. It should be split into a controller responsible for interpreting query parameters, retrieving data and checking permissions; and a HTML renderer.
Member wfLogProfilingData ()
Move logic to MediaWiki.php
Member wfShowingResults ( $offset, $limit)
Member wfGetDB ( $db, $groups=[], $wiki=false)
Replace calls to wfGetDB with calls to LoadBalancer::getConnection() on an injected instance of LoadBalancer.
Class HTMLSelectAndOtherField
FIXME: If made 'required', only the text field should be compulsory.
Member HTMLForm::setSubmitID ( $t)
FIXME: Integrity of $t is not validated
Member HTMLForm::setMessagePrefix ( $p)
Currently only used for the "<fieldset>" legend on forms with multiple sections; should be used elsewhere?
Member HTMLForm::displaySection ( $fields, $sectionName='', $fieldsetIDPrefix='', &$hasUserVisibleFields=false)
Member Http::isValidURI ( $uri)
FIXME this is wildly inaccurate and fails to actually check most stuff
Member MWHttpRequest::setData (array $args)
overload the args param
Member MWHttpRequest::isValidURI ( $uri)
FIXME this is wildly inaccurate and fails to actually check most stuff
Member WikiRevision::$isTemp
Member Content::getWikitextForTransclusion ()
Allow native handling, bypassing wikitext representation, like for includable special pages.
Member WatchAction::getExpiryOptions (MessageLocalizer $msgLocalizer, $watchedItem)
Move this somewhere better when it's being used in more than just this action.
Member ApiUpload::handleStashException ( $e)
Internationalize the exceptions then get rid of this
Member MediaWiki\Block\AbstractBlock::getTargetAndType ()
FIXME: This should be an integral part of the block member variables
Member MediaWiki\Block\BlockUser::parseExpiryInput (string $expiry)
strtotime() only accepts English strings. This means the expiry input can only be specified in English.
Member EnhancedChangesList::makeCacheGroupingKey (RCCacheEntry $cacheEntry)
use rc_source to group, if set; fallback to rc_type
Class RecentChange
Deprecate access to mAttribs (direct or via getAttributes). Right now we're having to include both rc_comment and rc_comment_text/rc_comment_data so random crap works right.
Member ChangeTags::MAX_DELETE_USES
Use the job queue for tag deletion to avoid this restriction
Class ChangeTagsLogItem
Abstract out a base class for this and RevDelLogItem, similar to the RevisionItem class but specifically for log items.
Member CommentStore::$stage
Deprecate and remove once extensions seem unlikely to need to use it for migration anymore.
Member Content::getTextForSearchIndex ()

Test that this actually works

Make sure this also works with LuceneSearch / WikiSearch

Member Language::sprintfDate ( $format, $ts, DateTimeZone $zone=null, &$ttl='unused')
handling of "o" format character for Iranian, Hebrew, Hijri & Thai?
Member Content::getWikitextForTransclusion ()

Allow transclusion into other content models than Wikitext!

Used in WikiPage and MessageCache to get message text. Not so nice. What should we use instead?!

Member ContentHandler::createDifferenceEngine (IContextSource $context, $old=0, $new=0, $rcid=0, $refreshCache=false, $unhide=false)
This is page-level functionality so it should not belong to ContentHandler. Move it to a better place once one exists (e.g. PageTypeHandler).
Member ContentHandler::getAutoDeleteReason (Title $title, &$hasHistory)
&$hasHistory is extremely ugly, it's here because WikiPage::getAutoDeleteReason() have it / want it.
Member ContentHandler::getFieldsForSearchIndex (SearchEngine $engine)
Expose title, redirect, namespace, text, source_text, text_bytes field mappings here. (see T142670 and T143409)
Class JavaScriptContentHandler
Create a ScriptContentHandler base class, do highlighting stuff there?
Member $wgTextModelsToParse
On the long run, it would be nice to put categories etc into a separate structure, or at least parse only the contents of comments in the scripts.
Member $wgFooterIcons
Reformat documentation.
Member $wgExtraNamespaces
Add a note about maintenance/namespaceDupes.php
Member Diff::__construct ( $from_lines, $to_lines)
Don't do work in the constructor, use a service to create diffs instead (T257472).
Member MediaHandler::formatMetadata ( $image, $context=false)
FIXME: This interface is not very flexible. The media handler should generate HTML instead. It can do all the formatting according to some standard. That makes it possible to do things like visual indication of grouped and chained streams in ogg container files.
Member Linker::formatLinksInComment ( $comment, $title=null, $local=false, $wikiId=null)
FIXME: Doesn't handle sub-links as in image thumb texts like the main parser
Member Linker::getRollbackEditCount (RevisionRecord $revRecord, $verify)
Unused outside of this file - should it be made private?
Member Linker::buildRollbackLink (RevisionRecord $revRecord, IContextSource $context=null, $editCount=false)
Unused outside of this file - should it be made private?
Class LinkFilter
implement the filter. Currently these are just some functions to help maintenance/cleanupSpam.php remove links to a single specified domain. The next thing is to implement functions for checking a given page against a big list of domains.
Member LinkFilter::makeRegex ( $filterEntry, $protocol)
This doesn't match the rest of the functionality here.
Class BitmapMetadataHandler
Other image formats. @newable
Member BitmapMetadataHandler::Tiff ( $filename)
Add XMP support, so this function actually makes sense to put here.
Member Exif::__construct ( $file, $byteOrder='')
FIXME: The following are broke: SubjectArea. Need to test the more obscure tags. DigitalZoomRatio = 0/0 is rejected. need to determine if that's valid. Possibly should treat 0/0 = 0. need to read exif spec on that.
Member ExifBitmapHandler::getRotationForExifFromOrientation ( $orientation)
FIXME: Orientation can include flipping as well; see if this is an issue!
Member GIFHandler::getImageArea ( $image)
Add unit tests
Member IPTC::timeHelper ( $date, $time, $charset)
Potentially this should also capture the timezone offset.
Member Linker::makeMediaLinkFile (LinkTarget $title, $file, $html='')
Handle invalid or missing images better.
Member TransformationalImageHandler::getClientScalingThumbnailImage ( $image, $scalerParams)
FIXME: No rotation support
Member MergeHistory::merge (Authority $performer, $reason='')
if all versions of page A are moved to B and then a user tries to do a reverse-merge via the "unmerge" log link, then page A will still be a redirect (as it was after the original merge), though it will have the old revisions back from before (as expected). The user may have to "undo" the redirect manually to finish the "unmerge". Maybe this should delete redirects at the source page of merges?
Member MovePage::moveToInternal (UserIdentity $user, &$nt, $reason='', $createRedirect=true, array $changeTags=[])
This was basically directly moved from Title, it should be split into smaller functions
Class MediaWiki\Navigation\PrevNextNavigationRenderer
Use LinkTarget instead of Title
Member MediaWiki\OutputHandler::findUriExtension ()
As of 2018, this actually runs after autoloader in Setup.php, so WebRequest seems like a good place for this.
Class OutputPage

FIXME: Another class handles sending the whole page to the client.


Member OutputPage::$mScripts
We should split JS / CSS. mScripts content is inserted as is in "<head>" by Skin. This might contain either a link to a stylesheet or inline CSS.
Member OutputPage::disallowUserJs ()
this should be given a more accurate name
Class Article
Move and rewrite code to an Action class
Member DBLockManager::getLocksOnServer ( $lockSrv, array $pathsByType)
change this code to work in one batch
Member Language::translateBlockExpiry ( $str, UserIdentity $user=null, $now=0)
Maybe translate block durations. Note that this function is somewhat misnamed: it deals with translating the duration ("1 week", "4 days", etc), not the expiry time (which is an absolute timestamp). Please note: do NOT add this blindly, as it is used on old expiry lengths recorded in log entries. You'd need to provide the start date to match up with it.
Member Language::convertHtml ( $text)
this should get integrated somewhere sane
Class Message
  • test, can we have tests?
  • this documentation needs to be extended
Member Message::isBlank ()
FIXME: Merge with isDisabled()?
Member LanguageYue::segmentByWord ( $string)
FIXME: Only do this for Han characters...
Member LanguageZh_hans::segmentByWord ( $string)
FIXME: Only do this for Han characters...
Member Cookie::validateCookieDomain ( $domain, $originDomain=null)

fixme fails to detect 3-letter top-level domains

fixme fails to detect 2-letter top-level domains for single-domain use (probably not a big problem in practice, but there are test cases)

Member TempFSFile::getUsableTempDirectory ()
Is there any useful way to test this? Would it be useful to make this non-static on TempFSFileFactory?
Member MultiHttpClient::runMultiHttp (array $reqs, array $opts=[])
Remove dependency on MediaWikiServices: use a separate HTTP client library or copy code from PhpHttpRequest
Class HttpStatus
Member HistoryPager::historyLine ( $row, $next, $notificationtimestamp=false, $dummy=false, $firstInList=false)
document some more, and maybe clean up the code (some params redundant?)
File IEContentAnalyzer.php
Define the exact license of this file.
Member MimeAnalyzer::isRecognizableExtension (string $extension)
Be more accurate when using fancy MIME detector plugins; right now this is the bare minimum getimagesize() list.
Member MimeAnalyzer::doGuessMimeType (string $file, $ext)
Remove $ext param
Member MimeAnalyzer::getMediaType (string $path=null, string $mime=null)

analyse file if need be

look at multiple extension, separately and together.

Member Wikimedia\Rdbms\DatabasePostgres::doInsertSelectNative ( $destTable, $srcTable, array $varMap, $conds, $fname, array $insertOptions, array $selectOptions, $selectJoinConds)
FIXME: Implement this a little better (separate select/insert)?
Member Wikimedia\Rdbms\IDatabase::makeWhereFrom2d ( $data, $baseKey, $subKey)
Does this actually belong in the library? It seems overly MW-specific.
Class BufferingStatsdDataFactory
Evaluate upstream's StatsdService class, which implements similar buffering logic and was released in statsd-php-client 1.0.13, shortly after we implemented this here for statsd-php-client 1.0.12 at the time.
Class SwiftVirtualRESTService
caching support (APC/memcached)
Class Linker
turn this into a legacy interface for HtmlPageLinkRenderer and similar services.