aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Appelman <robin@icewind.nl>2018-07-24 17:30:39 +0200
committerRobin Appelman <robin@icewind.nl>2018-07-24 17:30:39 +0200
commit6686ca9b2a222bc972252d86e39c7a0ced62f158 (patch)
tree8d90a043473b68b03e7aa3ab7a40238127a05544
parent7da815bb0403ebb072866b61779a84835b9a74b8 (diff)
downloadnextcloud-server-6686ca9b2a222bc972252d86e39c7a0ced62f158.tar.gz
nextcloud-server-6686ca9b2a222bc972252d86e39c7a0ced62f158.zip
cache isCached state for scss resources
Signed-off-by: Robin Appelman <robin@icewind.nl>
-rw-r--r--lib/private/Server.php3
-rw-r--r--lib/private/Template/SCSSCacher.php48
-rw-r--r--tests/lib/Template/CSSResourceLocatorTest.php7
-rw-r--r--tests/lib/Template/SCSSCacherTest.php7
4 files changed, 51 insertions, 14 deletions
diff --git a/lib/private/Server.php b/lib/private/Server.php
index 0f406ebe9b7..5962012604a 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -965,7 +965,8 @@ class Server extends ServerContainer implements IServerContainer {
$c->getThemingDefaults(),
\OC::$SERVERROOT,
$this->getMemCacheFactory(),
- $c->query(IconsCacher::class)
+ $c->query(IconsCacher::class),
+ new TimeFactory()
);
});
$this->registerService(JSCombiner::class, function (Server $c) {
diff --git a/lib/private/Template/SCSSCacher.php b/lib/private/Template/SCSSCacher.php
index 9dcedb94daf..6a41c4db8b9 100644
--- a/lib/private/Template/SCSSCacher.php
+++ b/lib/private/Template/SCSSCacher.php
@@ -32,6 +32,7 @@ use Leafo\ScssPhp\Compiler;
use Leafo\ScssPhp\Exception\ParserException;
use Leafo\ScssPhp\Formatter\Crunched;
use Leafo\ScssPhp\Formatter\Expanded;
+use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Files\IAppData;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
@@ -77,6 +78,12 @@ class SCSSCacher {
/** @var IconsCacher */
private $iconsCacher;
+ /** @var ICache */
+ private $isCachedCache;
+
+ /** @var ITimeFactory */
+ private $timeFactory;
+
/**
* @param ILogger $logger
* @param Factory $appDataFactory
@@ -86,6 +93,7 @@ class SCSSCacher {
* @param string $serverRoot
* @param ICacheFactory $cacheFactory
* @param IconsCacher $iconsCacher
+ * @param ITimeFactory $timeFactory
*/
public function __construct(ILogger $logger,
Factory $appDataFactory,
@@ -94,7 +102,8 @@ class SCSSCacher {
\OC_Defaults $defaults,
$serverRoot,
ICacheFactory $cacheFactory,
- IconsCacher $iconsCacher) {
+ IconsCacher $iconsCacher,
+ ITimeFactory $timeFactory) {
$this->logger = $logger;
$this->appData = $appDataFactory->get('css');
$this->urlGenerator = $urlGenerator;
@@ -103,7 +112,9 @@ class SCSSCacher {
$this->serverRoot = $serverRoot;
$this->cacheFactory = $cacheFactory;
$this->depsCache = $cacheFactory->createDistributed('SCSS-' . md5($this->urlGenerator->getBaseUrl()));
+ $this->isCachedCache = $cacheFactory->createLocal('SCSS-cached-' . md5($this->urlGenerator->getBaseUrl()));
$this->iconsCacher = $iconsCacher;
+ $this->timeFactory = $timeFactory;
}
/**
@@ -124,14 +135,7 @@ class SCSSCacher {
$path = implode('/', $path);
$webDir = $this->getWebDir($path, $app, $this->serverRoot, \OC::$WEBROOT);
- try {
- $folder = $this->appData->getFolder($app);
- } catch (NotFoundException $e) {
- // creating css appdata folder
- $folder = $this->appData->newFolder($app);
- }
-
- if (!$this->variablesChanged() && $this->isCached($fileNameCSS, $folder)) {
+ if (!$this->variablesChanged() && $this->isCached($fileNameCSS, $app)) {
// Inject icons vars css if any
if ($this->iconsCacher->getCachedCSS() && $this->iconsCacher->getCachedCSS()->getSize() > 0) {
$this->iconsCacher->injectCss();
@@ -139,6 +143,13 @@ class SCSSCacher {
return true;
}
+ try {
+ $folder = $this->appData->getFolder($app);
+ } catch (NotFoundException $e) {
+ // creating css appdata folder
+ $folder = $this->appData->newFolder($app);
+ }
+
$cached = $this->cache($path, $fileNameCSS, $fileNameSCSS, $folder, $webDir);
// Inject icons vars css if any
@@ -164,10 +175,24 @@ class SCSSCacher {
/**
* Check if the file is cached or not
* @param string $fileNameCSS
- * @param ISimpleFolder $folder
+ * @param string $app
* @return boolean
*/
- private function isCached(string $fileNameCSS, ISimpleFolder $folder) {
+ private function isCached(string $fileNameCSS, string $app) {
+ $key = $this->config->getSystemValue('version') . '/' . $app . '/' . $fileNameCSS;
+ if (!$this->config->getSystemValue('debug') && $cacheValue = $this->isCachedCache->get($key)) {
+ if ($cacheValue > $this->timeFactory->getTime()) {
+ return true;
+ }
+ }
+
+ try {
+ $folder = $this->appData->getFolder($app);
+ } catch (NotFoundException $e) {
+ // creating css appdata folder
+ $folder = $this->appData->newFolder($app);
+ }
+
try {
$cachedFile = $folder->getFile($fileNameCSS);
if ($cachedFile->getSize() > 0) {
@@ -187,6 +212,7 @@ class SCSSCacher {
}
}
+ $this->isCachedCache->set($key, $this->timeFactory->getTime() + 5 * 60);
return true;
}
diff --git a/tests/lib/Template/CSSResourceLocatorTest.php b/tests/lib/Template/CSSResourceLocatorTest.php
index 3fb7972b211..a928f043ed3 100644
--- a/tests/lib/Template/CSSResourceLocatorTest.php
+++ b/tests/lib/Template/CSSResourceLocatorTest.php
@@ -25,6 +25,7 @@ namespace Test\Template;
use OC\Files\AppData\AppData;
use OC\Files\AppData\Factory;
+use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Files\IAppData;
use OCP\ICacheFactory;
use OCP\ILogger;
@@ -50,6 +51,8 @@ class CSSResourceLocatorTest extends \Test\TestCase {
protected $logger;
/** @var IconsCacher|\PHPUnit_Framework_MockObject_MockObject */
protected $iconsCacher;
+ /** @var ITimeFactory|\PHPUnit_Framework_MockObject_MockObject */
+ private $timeFactory;
protected function setUp() {
parent::setUp();
@@ -61,6 +64,7 @@ class CSSResourceLocatorTest extends \Test\TestCase {
$this->cacheFactory = $this->createMock(ICacheFactory::class);
$this->themingDefaults = $this->createMock(ThemingDefaults::class);
$this->iconsCacher = $this->createMock(IconsCacher::class);
+ $this->timeFactory = $this->createMock(ITimeFactory::class);
}
private function cssResourceLocator() {
@@ -75,7 +79,8 @@ class CSSResourceLocatorTest extends \Test\TestCase {
$this->themingDefaults,
\OC::$SERVERROOT,
$this->cacheFactory,
- $this->iconsCacher
+ $this->iconsCacher,
+ $this->timeFactory
);
return new CSSResourceLocator(
$this->logger,
diff --git a/tests/lib/Template/SCSSCacherTest.php b/tests/lib/Template/SCSSCacherTest.php
index f32b87edcbb..149222f6b8e 100644
--- a/tests/lib/Template/SCSSCacherTest.php
+++ b/tests/lib/Template/SCSSCacherTest.php
@@ -28,6 +28,7 @@ use OC\Files\AppData\Factory;
use OC\Template\SCSSCacher;
use OC\Template\IconsCacher;
use OCA\Theming\ThemingDefaults;
+use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Files\IAppData;
use OCP\Files\NotFoundException;
use OCP\Files\SimpleFS\ISimpleFile;
@@ -58,12 +59,15 @@ class SCSSCacherTest extends \Test\TestCase {
protected $cacheFactory;
/** @var IconsCacher|\PHPUnit_Framework_MockObject_MockObject */
protected $iconsCacher;
+ /** @var ITimeFactory|\PHPUnit_Framework_MockObject_MockObject */
+ protected $timeFactory;
protected function setUp() {
parent::setUp();
$this->logger = $this->createMock(ILogger::class);
$this->appData = $this->createMock(AppData::class);
$this->iconsCacher = $this->createMock(IconsCacher::class);
+ $this->timeFactory = $this->createMock(ITimeFactory::class);
/** @var Factory|\PHPUnit_Framework_MockObject_MockObject $factory */
$factory = $this->createMock(Factory::class);
@@ -97,7 +101,8 @@ class SCSSCacherTest extends \Test\TestCase {
$this->themingDefaults,
\OC::$SERVERROOT,
$this->cacheFactory,
- $this->iconsCacher
+ $this->iconsCacher,
+ $this->timeFactory
);
}