diff --git a/apps/theming/appinfo/app.php b/apps/theming/appinfo/app.php index 5ef506e5ac..051a2e279e 100644 --- a/apps/theming/appinfo/app.php +++ b/apps/theming/appinfo/app.php @@ -39,3 +39,15 @@ $linkToCSS = \OC::$server->getURLGenerator()->linkToRoute( ] ); +$linkToJs = \OC::$server->getURLGenerator()->linkToRoute( + 'theming.Theming.getJavascript', + [ + 'v' => \OC::$server->getConfig()->getAppValue('theming', 'cachebuster', '0'), + ] +); +\OCP\Util::addHeader( + 'script', + [ + 'src' => $linkToJs, + ], '' +); diff --git a/apps/theming/appinfo/routes.php b/apps/theming/appinfo/routes.php index e062a68d69..4a8d4bac5b 100644 --- a/apps/theming/appinfo/routes.php +++ b/apps/theming/appinfo/routes.php @@ -55,5 +55,10 @@ return ['routes' => [ 'url' => '/loginbackground', 'verb' => 'GET', ], + [ + 'name' => 'Theming#getJavascript', + 'url' => '/js/theming', + 'verb' => 'GET', + ], ]]; diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php index 07bbee4323..0db4dfe062 100644 --- a/apps/theming/lib/Controller/ThemingController.php +++ b/apps/theming/lib/Controller/ThemingController.php @@ -337,4 +337,26 @@ class ThemingController extends Controller { $response->cacheFor(3600); return $response; } + /** + * @NoCSRFRequired + * @PublicPage + * + * @return DataDownloadResponse + */ + public function getJavascript() { + $responseJS = '(function() { + OCA.Theming = { + name: ' . json_encode($this->template->getName()) . ', + url: ' . json_encode($this->template->getBaseUrl()) . ', + slogan: ' . json_encode($this->template->getSlogan()) . ', + color: ' . json_encode($this->template->getMailHeaderColor()) . ', + inverted: ' . json_encode($this->util->invertTextColor($this->template->getMailHeaderColor())) . ', + }; +})();'; + $response = new Http\DataDisplayResponse($responseJS); + $response->addHeader("Content-type","text/javascript"); + $response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime())); + $response->cacheFor(3600); + return $response; + } } diff --git a/apps/theming/tests/Controller/ThemingControllerTest.php b/apps/theming/tests/Controller/ThemingControllerTest.php index 1129baafe4..81b6b886c9 100644 --- a/apps/theming/tests/Controller/ThemingControllerTest.php +++ b/apps/theming/tests/Controller/ThemingControllerTest.php @@ -700,4 +700,72 @@ class ThemingControllerTest extends TestCase { $expected->addHeader('Expires', date(\DateTime::RFC2822, 123)); @$this->assertEquals($expected, $this->themingController->getStylesheet()); } + + public function testGetJavascript() { + $this->template + ->expects($this->at(0)) + ->method('getName') + ->willReturn(""); + $this->template + ->expects($this->at(1)) + ->method('getBaseUrl') + ->willReturn(""); + $this->template + ->expects($this->at(2)) + ->method('getSlogan') + ->willReturn(""); + $this->template + ->expects($this->at(3)) + ->method('getMailHeaderColor') + ->willReturn("#000"); + + + $expectedResponse = '(function() { + OCA.Theming = { + name: "", + url: "", + slogan: "", + color: "#000", + inverted: false, + }; +})();'; + $expected = new Http\DataDisplayResponse($expectedResponse); + $expected->addHeader("Content-type","text/javascript"); + $expected->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime())); + $expected->cacheFor(3600); + @$this->assertEquals($expected, $this->themingController->getJavascript()); + } + public function testGetJavascriptInverted() { + $this->template + ->expects($this->at(0)) + ->method('getName') + ->willReturn("Nextcloud"); + $this->template + ->expects($this->at(1)) + ->method('getBaseUrl') + ->willReturn("nextcloudurl"); + $this->template + ->expects($this->at(2)) + ->method('getSlogan') + ->willReturn("awesome"); + $this->template + ->expects($this->any()) + ->method('getMailHeaderColor') + ->willReturn("#ffffff"); + + $expectedResponse = '(function() { + OCA.Theming = { + name: "Nextcloud", + url: "nextcloudurl", + slogan: "awesome", + color: "#ffffff", + inverted: true, + }; +})();'; + $expected = new Http\DataDisplayResponse($expectedResponse); + $expected->addHeader("Content-type","text/javascript"); + $expected->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime())); + $expected->cacheFor(3600); + @$this->assertEquals($expected, $this->themingController->getJavascript()); + } }