diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php index 8957d30588309..ce6d9905e1d17 100644 --- a/apps/theming/lib/Controller/ThemingController.php +++ b/apps/theming/lib/Controller/ThemingController.php @@ -376,7 +376,11 @@ public function getManifest($app) { $cacheBusterValue = $this->config->getAppValue('theming', 'cachebuster', '0'); $responseJS = [ 'name' => $this->themingDefaults->getName(), - 'start_url' => $this->urlGenerator->getBaseUrl(), + 'start_url' => $this->urlGenerator->getBaseUrl() . '/', + 'short_name' => $this->themingDefaults->getName(), + 'description' => $this->themingDefaults->getName(), + 'theme_color' => $this->themingDefaults->getColorPrimary(), + 'background_color' => '#ffffff', 'icons' => [ [ diff --git a/core/Controller/JsController.php b/core/Controller/JsController.php index 2adb0ac374d27..f13ee379021d9 100644 --- a/core/Controller/JsController.php +++ b/core/Controller/JsController.php @@ -37,12 +37,14 @@ use OCP\AppFramework\Http\FileDisplayResponse; use OCP\AppFramework\Http\NotFoundResponse; use OCP\AppFramework\Http\Response; +use OCP\AppFramework\Http\StreamResponse; use OCP\AppFramework\Utility\ITimeFactory; use OCP\Files\IAppData; use OCP\Files\NotFoundException; use OCP\Files\SimpleFS\ISimpleFile; use OCP\Files\SimpleFS\ISimpleFolder; use OCP\IRequest; +use OCP\IURLGenerator; class JsController extends Controller { @@ -52,11 +54,15 @@ class JsController extends Controller { /** @var ITimeFactory */ protected $timeFactory; - public function __construct($appName, IRequest $request, Factory $appDataFactory, ITimeFactory $timeFactory) { + /** @var IURLGenerator */ + private $urlGenerator; + + public function __construct($appName, IRequest $request, Factory $appDataFactory, ITimeFactory $timeFactory, IURLGenerator $urlGenerator) { parent::__construct($appName, $request); $this->appData = $appDataFactory->get('js'); $this->timeFactory = $timeFactory; + $this->urlGenerator = $urlGenerator; } /** @@ -93,6 +99,29 @@ public function getJs(string $fileName, string $appName): Response { return $response; } + /** + * @PublicPage + * @NoCSRFRequired + * @NoSameSiteCookieRequired + * + * @return StreamResponse + */ + public function getServiceWorker(): Response { + $response = new StreamResponse(__DIR__ . '/../js/serviceworker_raw.js'); + + $ttl = 31536000; + $response->addHeader('Cache-Control', 'max-age='.$ttl.', immutable'); + $response->addHeader('Content-Type', 'application/javascript'); + $response->addHeader('Service-Worker-Allowed', $this->urlGenerator->getBaseUrl() . '/'); + + $expires = new \DateTime(); + $expires->setTimestamp($this->timeFactory->getTime()); + $expires->add(new \DateInterval('PT'.$ttl.'S')); + $response->addHeader('Expires', $expires->format(\DateTime::RFC1123)); + $response->addHeader('Pragma', 'cache'); + return $response; + } + /** * @param ISimpleFolder $folder * @param string $fileName diff --git a/core/js/serviceworker_loader.js b/core/js/serviceworker_loader.js new file mode 100644 index 0000000000000..ff06b0428014c --- /dev/null +++ b/core/js/serviceworker_loader.js @@ -0,0 +1,5 @@ +if ('serviceWorker' in navigator) { + window.addEventListener('load', function() { + navigator.serviceWorker.register(OC.getRootPath() + '/core/js/service-worker.js', {scope: OC.getRootPath() + '/'}); + }); +} diff --git a/core/js/serviceworker_raw.js b/core/js/serviceworker_raw.js new file mode 100644 index 0000000000000..639692516a846 --- /dev/null +++ b/core/js/serviceworker_raw.js @@ -0,0 +1,7 @@ +self.addEventListener('install', function(e) {}); + +self.addEventListener('fetch', + function(e) { + e.respondWith(fetch(e.request).then(function(response){ return response; })); + } +); diff --git a/core/routes.php b/core/routes.php index 9fa378dc1d8ed..63073fb36a597 100644 --- a/core/routes.php +++ b/core/routes.php @@ -72,6 +72,7 @@ ['name' => 'TwoFactorChallenge#setupProvider', 'url' => 'login/setupchallenge/{providerId}', 'verb' => 'GET'], ['name' => 'TwoFactorChallenge#confirmProviderSetup', 'url' => 'login/setupchallenge/{providerId}', 'verb' => 'POST'], ['name' => 'OCJS#getConfig', 'url' => '/core/js/oc.js', 'verb' => 'GET'], + ['name' => 'Js#getServiceWorker', 'url' => '/core/js/service-worker.js', 'verb' => 'GET'], ['name' => 'Preview#getPreviewByFileId', 'url' => '/core/preview', 'verb' => 'GET'], ['name' => 'Preview#getPreview', 'url' => '/core/preview.png', 'verb' => 'GET'], ['name' => 'RecommendedApps#index', 'url' => '/core/apps/recommended', 'verb' => 'GET'], diff --git a/lib/private/legacy/OC_Template.php b/lib/private/legacy/OC_Template.php index c14a43ea430a6..85002b752cbd6 100644 --- a/lib/private/legacy/OC_Template.php +++ b/lib/private/legacy/OC_Template.php @@ -118,6 +118,7 @@ public static function initTemplateEngine($renderAs) { OC_Util::addScript('merged-template-prepend', null, true); OC_Util::addScript('dist/files_client', null, true); OC_Util::addScript('dist/files_fileinfo', null, true); + OC_Util::addScript('serviceworker_loader', null, true); } OC_Util::addScript('core', 'dist/main', true);