. * * @file */ namespace MediaWiki\Skins\Citizen\Api; use ApiBase; use ApiFormatJson; use MediaWiki\MediaWikiServices; use Title; /** * Extract and modified from MobileFrontend extension * Return the webapp manifest for this wiki */ class ApiWebappManifest extends ApiBase { /** * Execute the requested Api actions. */ public function execute() { $services = MediaWikiServices::getInstance(); $config = $this->getConfig(); $resultObj = $this->getResult(); $resultObj->addValue( null, 'dir', $services->getContentLanguage()->getDir() ); $resultObj->addValue( null, 'lang', $config->get( 'LanguageCode' ) ); $resultObj->addValue( null, 'name', $config->get( 'Sitename' ) ); // Need to set it manually because the default from start_url does not include script namespace // E.g. index.php URLs will be thrown out of the PWA $resultObj->addValue( null, 'scope', $config->get( 'Server' ) . '/' ); $icons = []; $appleTouchIcon = $config->get( 'AppleTouchIcon' ); if ( $appleTouchIcon !== false ) { $appleTouchIconUrl = wfExpandUrl( $appleTouchIcon, PROTO_CURRENT ); $request = $services->getHttpRequestFactory()->create( $appleTouchIconUrl, [], __METHOD__ ); $request->execute(); $appleTouchIconContent = $request->getContent(); if ( !empty( $appleTouchIconContent ) ) { $appleTouchIconSize = getimagesizefromstring( $appleTouchIconContent ); } $icon = [ 'src' => $appleTouchIcon ]; if ( isset( $appleTouchIconSize ) && $appleTouchIconSize !== false ) { $icon['sizes'] = $appleTouchIconSize[0] . 'x' . $appleTouchIconSize[1]; $icon['type'] = $appleTouchIconSize['mime']; } $icons[] = $icon; } $resultObj->addValue( null, 'icons', $icons ); $resultObj->addValue( null, 'display', 'minimal-ui' ); $resultObj->addValue( null, 'orientation', 'portrait' ); $resultObj->addValue( null, 'start_url', Title::newMainPage()->getLocalURL() ); $resultObj->addValue( null, 'theme_color', $config->get( 'CitizenManifestThemeColor' ) ); $resultObj->addValue( null, 'background_color', $config->get( 'CitizenManifestBackgroundColor' ) ); $main = $this->getMain(); $main->setCacheControl( [ 's-maxage' => 86400, 'max-age' => 86400 ] ); $main->setCacheMode( 'public' ); } /** * Get the JSON printer * * @return ApiFormatJson */ public function getCustomPrinter() { return new ApiFormatJson( $this->getMain(), 'json' ); } }