@@ -96,7 +96,10 @@ class IconController extends Controller { | |||
} | |||
$response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/svg+xml']); | |||
$response->cacheFor(86400); | |||
$response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime())); | |||
$expires = new \DateTime(); | |||
$expires->setTimestamp($this->timeFactory->getTime()); | |||
$expires->add(new \DateInterval('PT24H')); | |||
$response->addHeader('Expires', $expires->format(\DateTime::RFC2822)); | |||
$response->addHeader('Pragma', 'cache'); | |||
return $response; | |||
} | |||
@@ -111,19 +114,24 @@ class IconController extends Controller { | |||
* @return FileDisplayResponse|DataDisplayResponse | |||
*/ | |||
public function getFavicon($app = "core") { | |||
$iconFile = $this->imageManager->getCachedImage('favIcon-' . $app); | |||
if($iconFile === null && $this->themingDefaults->shouldReplaceIcons()) { | |||
$icon = $this->iconBuilder->getFavicon($app); | |||
$iconFile = $this->imageManager->setCachedImage('favIcon-' . $app, $icon); | |||
} | |||
if ($this->themingDefaults->shouldReplaceIcons()) { | |||
$iconFile = $this->imageManager->getCachedImage('favIcon-' . $app); | |||
if($iconFile === null) { | |||
$icon = $this->iconBuilder->getFavicon($app); | |||
$iconFile = $this->imageManager->setCachedImage('favIcon-' . $app, $icon); | |||
} | |||
$response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']); | |||
$response->cacheFor(86400); | |||
$expires = new \DateTime(); | |||
$expires->setTimestamp($this->timeFactory->getTime()); | |||
$expires->add(new \DateInterval('PT24H')); | |||
$response->addHeader('Expires', $expires->format(\DateTime::RFC2822)); | |||
$response->addHeader('Pragma', 'cache'); | |||
} else { | |||
$response = new DataDisplayResponse(null, Http::STATUS_NOT_FOUND); | |||
$response->cacheFor(0); | |||
$response->setLastModified(new \DateTime('now', new \DateTimeZone('GMT'))); | |||
} | |||
$response->cacheFor(86400); | |||
$response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime())); | |||
$response->addHeader('Pragma', 'cache'); | |||
return $response; | |||
} | |||
@@ -137,19 +145,24 @@ class IconController extends Controller { | |||
* @return FileDisplayResponse|DataDisplayResponse | |||
*/ | |||
public function getTouchIcon($app = "core") { | |||
$iconFile = $this->imageManager->getCachedImage('touchIcon-' . $app); | |||
if ($iconFile === null && $this->themingDefaults->shouldReplaceIcons()) { | |||
$icon = $this->iconBuilder->getTouchIcon($app); | |||
$iconFile = $this->imageManager->setCachedImage('touchIcon-' . $app, $icon); | |||
} | |||
if ($this->themingDefaults->shouldReplaceIcons()) { | |||
$iconFile = $this->imageManager->getCachedImage('touchIcon-' . $app); | |||
if ($iconFile === null) { | |||
$icon = $this->iconBuilder->getTouchIcon($app); | |||
$iconFile = $this->imageManager->setCachedImage('touchIcon-' . $app, $icon); | |||
} | |||
$response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/png']); | |||
$response->cacheFor(86400); | |||
$expires = new \DateTime(); | |||
$expires->setTimestamp($this->timeFactory->getTime()); | |||
$expires->add(new \DateInterval('PT24H')); | |||
$response->addHeader('Expires', $expires->format(\DateTime::RFC2822)); | |||
$response->addHeader('Pragma', 'cache'); | |||
} else { | |||
$response = new DataDisplayResponse(null, Http::STATUS_NOT_FOUND); | |||
$response->cacheFor(0); | |||
$response->setLastModified(new \DateTime('now', new \DateTimeZone('GMT'))); | |||
} | |||
$response->cacheFor(86400); | |||
$response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime())); | |||
$response->addHeader('Pragma', 'cache'); | |||
return $response; | |||
} | |||
} |
@@ -94,6 +94,8 @@ class IconBuilder { | |||
if($mime === "image/svg+xml" || substr($appIconContent, 0, 4) === "<svg") { | |||
if(substr($appIconContent, 0, 5) !== "<?xml") { | |||
$svg = "<?xml version=\"1.0\"?>".$appIconContent; | |||
} else { | |||
$svg = $appIconContent; | |||
} | |||
$tmp = new Imagick(); | |||
$tmp->readImageBlob($svg); | |||
@@ -147,4 +149,4 @@ class IconBuilder { | |||
return $svg; | |||
} | |||
} | |||
} |
@@ -23,6 +23,7 @@ | |||
namespace OCA\Theming; | |||
use OCP\ICacheFactory; | |||
use OCP\IConfig; | |||
use OCP\IL10N; | |||
use OCP\IURLGenerator; | |||
@@ -38,6 +39,8 @@ class ThemingDefaults extends \OC_Defaults { | |||
private $urlGenerator; | |||
/** @var IRootFolder */ | |||
private $rootFolder; | |||
/** @var ICacheFactory */ | |||
private $cacheFactory; | |||
/** @var string */ | |||
private $name; | |||
/** @var string */ | |||
@@ -60,13 +63,15 @@ class ThemingDefaults extends \OC_Defaults { | |||
IL10N $l, | |||
IURLGenerator $urlGenerator, | |||
\OC_Defaults $defaults, | |||
IRootFolder $rootFolder | |||
IRootFolder $rootFolder, | |||
ICacheFactory $cacheFactory | |||
) { | |||
parent::__construct(); | |||
$this->config = $config; | |||
$this->l = $l; | |||
$this->urlGenerator = $urlGenerator; | |||
$this->rootFolder = $rootFolder; | |||
$this->cacheFactory = $cacheFactory; | |||
$this->name = $defaults->getName(); | |||
$this->url = $defaults->getBaseUrl(); | |||
@@ -151,14 +156,20 @@ class ThemingDefaults extends \OC_Defaults { | |||
* @return bool | |||
*/ | |||
public function shouldReplaceIcons() { | |||
$cache = $this->cacheFactory->create('theming'); | |||
if($cache->hasKey('shouldReplaceIcons')) { | |||
return (bool)$cache->get('shouldReplaceIcons'); | |||
} | |||
$value = false; | |||
if(extension_loaded('imagick')) { | |||
$checkImagick = new \Imagick(); | |||
if (count($checkImagick->queryFormats('SVG')) >= 1) { | |||
return true; | |||
$value = true; | |||
} | |||
$checkImagick->clear(); | |||
} | |||
return false; | |||
$cache->set('shouldReplaceIcons', $value); | |||
return $value; | |||
} | |||
/** |
@@ -103,7 +103,10 @@ class IconControllerTest extends TestCase { | |||
->willReturn($file); | |||
$expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'image/svg+xml']); | |||
$expected->cacheFor(86400); | |||
$expected->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime())); | |||
$expires = new \DateTime(); | |||
$expires->setTimestamp($this->timeFactory->getTime()); | |||
$expires->add(new \DateInterval('PT24H')); | |||
$expected->addHeader('Expires', $expires->format(\DateTime::RFC2822)); | |||
$expected->addHeader('Pragma', 'cache'); | |||
@$this->assertEquals($expected, $this->iconController->getThemedIcon('core', 'filetypes/folder.svg')); | |||
@@ -133,7 +136,10 @@ class IconControllerTest extends TestCase { | |||
$expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']); | |||
$expected->cacheFor(86400); | |||
$expected->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime())); | |||
$expires = new \DateTime(); | |||
$expires->setTimestamp($this->timeFactory->getTime()); | |||
$expires->add(new \DateInterval('PT24H')); | |||
$expected->addHeader('Expires', $expires->format(\DateTime::RFC2822)); | |||
$expected->addHeader('Pragma', 'cache'); | |||
$this->assertEquals($expected, $this->iconController->getFavicon()); | |||
} | |||
@@ -143,9 +149,8 @@ class IconControllerTest extends TestCase { | |||
->method('shouldReplaceIcons') | |||
->willReturn(false); | |||
$expected = new DataDisplayResponse(null, Http::STATUS_NOT_FOUND); | |||
$expected->cacheFor(86400); | |||
$expected->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime())); | |||
$expected->addHeader('Pragma', 'cache'); | |||
$expected->cacheFor(0); | |||
$expected->setLastModified(new \DateTime('now', new \DateTimeZone('GMT'))); | |||
$this->assertEquals($expected, $this->iconController->getFavicon()); | |||
} | |||
@@ -172,7 +177,10 @@ class IconControllerTest extends TestCase { | |||
$expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'image/png']); | |||
$expected->cacheFor(86400); | |||
$expected->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime())); | |||
$expires = new \DateTime(); | |||
$expires->setTimestamp($this->timeFactory->getTime()); | |||
$expires->add(new \DateInterval('PT24H')); | |||
$expected->addHeader('Expires', $expires->format(\DateTime::RFC2822)); | |||
$expected->addHeader('Pragma', 'cache'); | |||
$this->assertEquals($expected, $this->iconController->getTouchIcon()); | |||
} | |||
@@ -182,9 +190,8 @@ class IconControllerTest extends TestCase { | |||
->method('shouldReplaceIcons') | |||
->willReturn(false); | |||
$expected = new DataDisplayResponse(null, Http::STATUS_NOT_FOUND); | |||
$expected->cacheFor(86400); | |||
$expected->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime())); | |||
$expected->addHeader('Pragma', 'cache'); | |||
$expected->cacheFor(0); | |||
$expected->setLastModified(new \DateTime('now', new \DateTimeZone('GMT'))); | |||
$this->assertEquals($expected, $this->iconController->getTouchIcon()); | |||
} | |||
@@ -24,6 +24,7 @@ | |||
namespace OCA\Theming\Tests; | |||
use OCA\Theming\ThemingDefaults; | |||
use OCP\ICacheFactory; | |||
use OCP\IConfig; | |||
use OCP\IL10N; | |||
use OCP\IURLGenerator; | |||
@@ -43,6 +44,8 @@ class ThemingDefaultsTest extends TestCase { | |||
private $template; | |||
/** @var IRootFolder */ | |||
private $rootFolder; | |||
/** @var ICacheFactory */ | |||
private $cacheFactory; | |||
public function setUp() { | |||
parent::setUp(); | |||
@@ -52,6 +55,7 @@ class ThemingDefaultsTest extends TestCase { | |||
$this->rootFolder = $this->getMockBuilder(IRootFolder::class) | |||
->disableOriginalConstructor() | |||
->getMock(); | |||
$this->cacheFactory = $this->getMockBuilder(ICacheFactory::class)->getMock(); | |||
$this->defaults = $this->getMockBuilder(\OC_Defaults::class) | |||
->disableOriginalConstructor() | |||
->getMock(); | |||
@@ -76,7 +80,8 @@ class ThemingDefaultsTest extends TestCase { | |||
$this->l10n, | |||
$this->urlGenerator, | |||
$this->defaults, | |||
$this->rootFolder | |||
$this->rootFolder, | |||
$this->cacheFactory | |||
); | |||
} | |||
@@ -703,7 +703,8 @@ class Server extends ServerContainer implements IServerContainer { | |||
$c->getL10N('theming'), | |||
$c->getURLGenerator(), | |||
new \OC_Defaults(), | |||
$c->getLazyRootFolder() | |||
$c->getLazyRootFolder(), | |||
$c->getMemCacheFactory() | |||
); | |||
} | |||
return new \OC_Defaults(); |