summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/composer/composer/autoload_classmap.php1
-rw-r--r--lib/composer/composer/autoload_static.php1
-rw-r--r--lib/private/AppFramework/DependencyInjection/DIContainer.php3
-rw-r--r--lib/private/AppFramework/Middleware/AdditionalScriptsMiddleware.php56
-rw-r--r--lib/public/AppFramework/Http/TemplateResponse.php3
-rw-r--r--tests/lib/AppFramework/Middleware/AdditionalScriptsMiddlewareTest.php108
6 files changed, 172 insertions, 0 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index c75e8f95fe9..5f311d28c56 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -419,6 +419,7 @@ return array(
'OC\\AppFramework\\Http\\Output' => $baseDir . '/lib/private/AppFramework/Http/Output.php',
'OC\\AppFramework\\Http\\Request' => $baseDir . '/lib/private/AppFramework/Http/Request.php',
'OC\\AppFramework\\Logger' => $baseDir . '/lib/private/AppFramework/Logger.php',
+ 'OC\\AppFramework\\Middleware\\AdditionalScriptsMiddleware' => $baseDir . '/lib/private/AppFramework/Middleware/AdditionalScriptsMiddleware.php',
'OC\\AppFramework\\Middleware\\MiddlewareDispatcher' => $baseDir . '/lib/private/AppFramework/Middleware/MiddlewareDispatcher.php',
'OC\\AppFramework\\Middleware\\OCSMiddleware' => $baseDir . '/lib/private/AppFramework/Middleware/OCSMiddleware.php',
'OC\\AppFramework\\Middleware\\PublicShare\\Exceptions\\NeedAuthenticationException' => $baseDir . '/lib/private/AppFramework/Middleware/PublicShare/Exceptions/NeedAuthenticationException.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index 4e1c5f67c36..42631a293e3 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -449,6 +449,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\AppFramework\\Http\\Output' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Http/Output.php',
'OC\\AppFramework\\Http\\Request' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Http/Request.php',
'OC\\AppFramework\\Logger' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Logger.php',
+ 'OC\\AppFramework\\Middleware\\AdditionalScriptsMiddleware' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Middleware/AdditionalScriptsMiddleware.php',
'OC\\AppFramework\\Middleware\\MiddlewareDispatcher' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Middleware/MiddlewareDispatcher.php',
'OC\\AppFramework\\Middleware\\OCSMiddleware' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Middleware/OCSMiddleware.php',
'OC\\AppFramework\\Middleware\\PublicShare\\Exceptions\\NeedAuthenticationException' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Middleware/PublicShare/Exceptions/NeedAuthenticationException.php',
diff --git a/lib/private/AppFramework/DependencyInjection/DIContainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php
index 38857af0d39..de25f8fe4d3 100644
--- a/lib/private/AppFramework/DependencyInjection/DIContainer.php
+++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php
@@ -261,6 +261,9 @@ class DIContainer extends SimpleContainer implements IAppContainer {
$c->query(\OCP\IConfig::class)
)
);
+ $dispatcher->registerMiddleware(
+ $c->query(\OC\AppFramework\Middleware\AdditionalScriptsMiddleware::class)
+ );
foreach($this->middleWares as $middleWare) {
$dispatcher->registerMiddleware($c[$middleWare]);
diff --git a/lib/private/AppFramework/Middleware/AdditionalScriptsMiddleware.php b/lib/private/AppFramework/Middleware/AdditionalScriptsMiddleware.php
new file mode 100644
index 00000000000..de1a02026bf
--- /dev/null
+++ b/lib/private/AppFramework/Middleware/AdditionalScriptsMiddleware.php
@@ -0,0 +1,56 @@
+<?php
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2019, Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\AppFramework\Middleware;
+
+use OCP\AppFramework\Http\Response;
+use OCP\AppFramework\Http\TemplateResponse;
+use OCP\AppFramework\Middleware;
+use OCP\IUserSession;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+
+class AdditionalScriptsMiddleware extends Middleware {
+ /** @var EventDispatcherInterface */
+ private $dispatcher;
+ /** @var IUserSession */
+ private $userSession;
+
+ public function __construct(EventDispatcherInterface $dispatcher, IUserSession $userSession) {
+ $this->dispatcher = $dispatcher;
+ $this->userSession = $userSession;
+ }
+
+ public function afterController($controller, $methodName, Response $response): Response {
+ if ($response instanceof TemplateResponse) {
+ $this->dispatcher->dispatch(TemplateResponse::EVENT_LOAD_ADDITIONAL_SCRIPTS);
+
+ if ($this->userSession->isLoggedIn()) {
+ $this->dispatcher->dispatch(TemplateResponse::EVENT_LOAD_ADDITIONAL_SCRIPTS_LOGGEDIN);
+ }
+ }
+
+ return $response;
+ }
+
+}
diff --git a/lib/public/AppFramework/Http/TemplateResponse.php b/lib/public/AppFramework/Http/TemplateResponse.php
index 0e31f780d7a..f6436038cc3 100644
--- a/lib/public/AppFramework/Http/TemplateResponse.php
+++ b/lib/public/AppFramework/Http/TemplateResponse.php
@@ -37,6 +37,9 @@ namespace OCP\AppFramework\Http;
*/
class TemplateResponse extends Response {
+ const EVENT_LOAD_ADDITIONAL_SCRIPTS = self::class . '::loadAdditionalScripts';
+ const EVENT_LOAD_ADDITIONAL_SCRIPTS_LOGGEDIN = self::class . '::loadAdditionalScriptsLoggedIn';
+
/**
* name of the template
* @var string
diff --git a/tests/lib/AppFramework/Middleware/AdditionalScriptsMiddlewareTest.php b/tests/lib/AppFramework/Middleware/AdditionalScriptsMiddlewareTest.php
new file mode 100644
index 00000000000..27a6e70c641
--- /dev/null
+++ b/tests/lib/AppFramework/Middleware/AdditionalScriptsMiddlewareTest.php
@@ -0,0 +1,108 @@
+<?php
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2019, Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Test\AppFramework\Middleware;
+
+use OC\AppFramework\Middleware\AdditionalScriptsMiddleware;
+use OCP\AppFramework\Controller;
+use OCP\AppFramework\Http\Response;
+use OCP\AppFramework\Http\TemplateResponse;
+use OCP\IUserSession;
+use PHPUnit\Framework\MockObject\MockObject;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+
+class AdditionalScriptsMiddlewareTest extends \Test\TestCase {
+
+ /** @var EventDispatcherInterface|MockObject */
+ private $dispatcher;
+ /** @var IUserSession|MockObject */
+ private $userSession;
+
+ /** @var Controller */
+ private $controller;
+
+ /** @var AdditionalScriptsMiddleware */
+ private $middleWare;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->dispatcher = $this->createMock(EventDispatcherInterface::class);
+ $this->userSession = $this->createMock(IUserSession::class);
+ $this->middleWare = new AdditionalScriptsMiddleware(
+ $this->dispatcher,
+ $this->userSession
+ );
+
+ $this->controller = $this->createMock(Controller::class);
+ }
+
+ public function testNoTemplateResponse() {
+ $this->dispatcher->expects($this->never())
+ ->method($this->anything());
+ $this->userSession->expects($this->never())
+ ->method($this->anything());
+
+ $this->middleWare->afterController($this->controller, 'myMethod', $this->createMock(Response::class));
+ }
+
+ public function testTemplateResponseNotLoggedIn() {
+ $this->dispatcher->expects($this->once())
+ ->method('dispatch')
+ ->willReturnCallback(function($eventName) {
+ if ($eventName === TemplateResponse::EVENT_LOAD_ADDITIONAL_SCRIPTS) {
+ return;
+ }
+
+ $this->fail('Wrong event dispatched');
+ });
+ $this->userSession->method('isLoggedIn')
+ ->willReturn(false);
+
+ $this->middleWare->afterController($this->controller, 'myMethod', $this->createMock(TemplateResponse::class));
+ }
+
+ public function testTemplateResponseLoggedIn() {
+ $events = [];
+
+ $this->dispatcher->expects($this->exactly(2))
+ ->method('dispatch')
+ ->willReturnCallback(function($eventName) use (&$events) {
+ if ($eventName === TemplateResponse::EVENT_LOAD_ADDITIONAL_SCRIPTS ||
+ $eventName === TemplateResponse::EVENT_LOAD_ADDITIONAL_SCRIPTS_LOGGEDIN) {
+ $events[] = $eventName;
+ return;
+ }
+
+ $this->fail('Wrong event dispatched');
+ });
+ $this->userSession->method('isLoggedIn')
+ ->willReturn(true);
+
+ $this->middleWare->afterController($this->controller, 'myMethod', $this->createMock(TemplateResponse::class));
+
+ $this->assertContains(TemplateResponse::EVENT_LOAD_ADDITIONAL_SCRIPTS, $events);
+ $this->assertContains(TemplateResponse::EVENT_LOAD_ADDITIONAL_SCRIPTS_LOGGEDIN, $events);
+ }
+}