Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
23.68% covered (danger)
23.68%
9 / 38
25.00% covered (danger)
25.00%
1 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
MobileFrontendSkinHooks
23.68% covered (danger)
23.68%
9 / 38
25.00% covered (danger)
25.00%
1 / 4
28.78
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
 getTermsLink
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
2
 getDesktopViewLink
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
6
 getMobileViewLink
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3use MediaWiki\Html\Html;
4use MediaWiki\Language\MessageLocalizer;
5use MediaWiki\Skin\Skin;
6use MediaWiki\Title\Title;
7use MediaWiki\Utils\UrlUtils;
8
9class MobileFrontendSkinHooks {
10    public function __construct(
11        private readonly UrlUtils $urlUtils,
12    ) {
13    }
14
15    /**
16     * Returns HTML of terms of use link or null if it shouldn't be displayed
17     * Note: This is called by a hook in the WikimediaMessages extension.
18     *
19     * @param MessageLocalizer $localizer
20     * @return null|string
21     */
22    public function getTermsLink( MessageLocalizer $localizer ) {
23        $urlMsg = $localizer->msg( 'mobile-frontend-terms-url' )->inContentLanguage();
24        if ( $urlMsg->isDisabled() ) {
25            return null;
26        }
27        $url = $urlMsg->plain();
28
29        return Html::element(
30            'a',
31            [ 'href' => Skin::makeInternalOrExternalUrl( $url ) ],
32            $localizer->msg( 'mobile-frontend-terms-text' )->text()
33        );
34    }
35
36    /**
37     * @param Skin $skin
38     * @param MobileContext $context
39     * @return string representing the desktop link.
40     */
41    public function getDesktopViewLink( Skin $skin, MobileContext $context ) {
42        $url = $skin->getOutput()->getProperty( 'desktopUrl' );
43        $req = $skin->getRequest();
44
45        if ( $url ) {
46            $url = wfAppendQuery( $url, 'mobileaction=toggle_view_desktop' );
47        } else {
48            $title = $skin->getTitle() ?? Title::newMainPage();
49            // Manipulate the query params array to remove mobile-specific
50            // params, and add one for toggle_view_desktop; also removes
51            // any redundant "title" param that may be present
52            $queryValues = $req->getQueryValues();
53            $queryValues['mobileaction'] = 'toggle_view_desktop';
54            unset( $queryValues['title'] );
55            unset( $queryValues['mfnotify'] );
56            $url = $title->getLocalURL( $queryValues );
57        }
58
59        $desktopUrl = $context->getDesktopUrl( $this->urlUtils->expand( $url, PROTO_RELATIVE ) ?? '' );
60        $desktop = $context->msg( 'mobile-frontend-view-desktop' )->text();
61
62        return Html::element( 'a',
63            [ 'id' => 'mw-mf-display-toggle', 'href' => $desktopUrl,
64                'data-event-name' => 'switch_to_desktop' ], $desktop );
65    }
66
67    /**
68     * @param Skin $skin
69     * @param MobileContext $context
70     * @return string representing the mobile link.
71     */
72    public function getMobileViewLink( Skin $skin, MobileContext $context ) {
73        $req = $skin->getRequest();
74        $args = $req->getQueryValues();
75        // avoid title being set twice
76        unset( $args['title'], $args['useformat'] );
77        $args['mobileaction'] = 'toggle_view_mobile';
78        $title = $skin->getTitle();
79        // Title could be null
80        // If no title, there is a problem with context. Possibly inside a test.
81        if ( !$title ) {
82            return '';
83        }
84        $mobileViewUrl = $title->getFullURL( $args );
85        $mobileViewUrl = $context->getMobileUrl( $mobileViewUrl );
86
87        return Html::element( 'a',
88            [ 'href' => $mobileViewUrl, 'class' => 'noprint stopMobileRedirectToggle' ],
89            $context->msg( 'mobile-frontend-view' )->text()
90        );
91    }
92}