Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 45
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
SpecialReadingLists
0.00% covered (danger)
0.00%
0 / 45
0.00% covered (danger)
0.00%
0 / 4
342
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 executeReadingList
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
2
 execute
0.00% covered (danger)
0.00%
0 / 30
0.00% covered (danger)
0.00%
0 / 1
240
 getGroupName
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace MediaWiki\Extension\ReadingLists;
4
5use MediaWiki\Exception\PermissionsError;
6use MediaWiki\Html\Html;
7use MediaWiki\Message\Message;
8use MediaWiki\SpecialPage\SpecialPage;
9use MediaWiki\SpecialPage\UnlistedSpecialPage;
10use MediaWiki\User\User;
11
12class SpecialReadingLists extends UnlistedSpecialPage {
13    /**
14     * Construct function
15     */
16    public function __construct() {
17        parent::__construct( 'ReadingLists' );
18    }
19
20    /**
21     * Render readinglist(s) app shell
22     *
23     * @param Message $pageTitle
24     */
25    private function executeReadingList( Message $pageTitle ) {
26        $out = $this->getOutput();
27        $out->addModuleStyles( [ 'special.readinglist.styles' ] );
28        $out->addModules( [ 'special.readinglist.scripts' ] );
29        $out->setPageTitleMsg( $pageTitle );
30        $html = Html::errorBox(
31            $this->msg( 'readinglists-error' )->parse(),
32            '',
33            'reading-list__errorbox'
34        );
35        $html .= Html::element( 'div', [ 'id' => 'reading-list-container' ],
36            $this->msg( 'readinglists-loading' )->text()
37        );
38        $out->addHTML( $html );
39    }
40
41    /**
42     * Render Special Page ReadingLists
43     * @param string $par Parameter submitted as subpage
44     */
45    public function execute( $par = '' ) {
46        $out = $this->getOutput();
47        $config = $out->getConfig();
48        // If the feature isn't ready, redirect to Special:SpecialPages
49        $params = $par ? explode( '/', $par ) : [];
50        $listOwner = $params[0] ?? null;
51        $listId = $params[1] ?? null;
52        $req = $this->getRequest();
53        $exportFeature = $req->getText( 'limport' ) !== '' || $req->getText( 'lexport' ) !== '';
54        $user = $this->getUser();
55        $this->setHeaders();
56        $this->outputHeader();
57
58        if ( !$user->isNamed() && !$exportFeature ) {
59            // Uses the following message keys: reading-list-purpose and reading-list-purpose-for-temp-user
60            $this->requireNamedUser( 'reading-list-purpose' );
61        } else {
62            if ( $listOwner || $exportFeature ) {
63                $owner = !$listOwner ? null : User::newFromName( $listOwner );
64                $privateEnabled = $config->get( 'ReadingListsWebAuthenticatedPreviews' );
65                $isWatchlist = $listId === '-10';
66                $canDisplayPrivateLists = $privateEnabled && $owner &&
67                    $owner->getId() === $user->getId();
68                $pageTitle = $this->msg( 'readinglists-special-title' );
69                if ( !$privateEnabled ) {
70                    $out->addHtmlClasses( 'mw-special-readinglist-watchlist-only' );
71                }
72                if ( $exportFeature ) {
73                    $pageTitle = $this->msg( 'readinglists-special-title-imported' );
74                    $out->addHtmlClasses( 'mw-special-readinglist-export-only' );
75                }
76                if ( $exportFeature || $isWatchlist || $privateEnabled ) {
77                    $this->executeReadingList( $pageTitle );
78                } else {
79                    throw new PermissionsError( 'action-readinglist-private' );
80                }
81            } else {
82                $out = $this->getOutput();
83                $out->redirect( SpecialPage::getTitleFor( 'ReadingLists',
84                    $user->getName() )->getLocalURL() );
85            }
86        }
87    }
88
89    /**
90     * @return string
91     */
92    protected function getGroupName() {
93        return 'pages';
94    }
95}