Currently special pages render a single "Special" tab. This appears in all skins, but position varies based on skin.
|{F35321980}|{F35321978}|
Going forward to support the work in T286466 we would like to add SpecialPage::getSubpages. This method returns an array of sub pages that can be rendered by the skin in the UI. It works similar to `getSubpagesForPrefixSearch` but will usually be a subset of the pages returned by `getSubpagesForPrefixSearch` and in many cases will be an empty list.
# Specification
[] The feature is opt in. Skins like Vector can continue to work as before
[] A new method SpecialPage::getSubpages will be added to describe subpages. A page with no sub page will be described by an empty string. eg. `return ['', 'raw'];` on Special:Watchlist would generate two tabs - one link to Special:Watchlist and one to Special:Watchlist/raw. An empty array will mean no sub pages should be rendered. By default, the return value must include `['']` to keep consistency with the status quo.
[] A new method SpecialPage::getShortDescription will be added - this will allow special pages to define a label to describe the page that will be rendered as the text of the associated tab. By default it will use `subpagetab-<special page name>-<subpage>`. For example Special:Watchlist/raw would be described by `subpagetab-watchlist-raw`. It will be stable to override this to change the label.
[] A new menu will be made available to skins in Skin:: buildContentNavigationUrlsInternal called "subpages". This can be used instead of the existing namespace key, but also contain definitions for subpages. This ensures the change is backwards compatible.
# Sign off steps
[] It's important at least one of the special pages in core use this feature. We're targetting the Special:Contributions page as the first consumer (see T286466)