diff --git a/apps/dav/lib/CalDAV/Activity/Filter/Calendar.php b/apps/dav/lib/CalDAV/Activity/Filter/Calendar.php index 7456074915b..f85ca1a7769 100644 --- a/apps/dav/lib/CalDAV/Activity/Filter/Calendar.php +++ b/apps/dav/lib/CalDAV/Activity/Filter/Calendar.php @@ -72,7 +72,7 @@ class Calendar implements IFilter { * @since 11.0.0 */ public function getIcon() { - return $this->url->getAbsoluteURL($this->url->imagePath('core', 'places/calendar-dark.svg')); + return $this->url->getAbsoluteURL($this->url->imagePath('core', 'places/calendar.svg')); } /** diff --git a/apps/dav/tests/unit/CalDAV/Activity/Filter/CalendarTest.php b/apps/dav/tests/unit/CalDAV/Activity/Filter/CalendarTest.php index 0fdd50b54c4..1c31508255a 100644 --- a/apps/dav/tests/unit/CalDAV/Activity/Filter/CalendarTest.php +++ b/apps/dav/tests/unit/CalDAV/Activity/Filter/CalendarTest.php @@ -55,7 +55,7 @@ class CalendarTest extends TestCase { public function testGetIcon() { $this->url->expects($this->once()) ->method('imagePath') - ->with('core', 'places/calendar-dark.svg') + ->with('core', 'places/calendar.svg') ->willReturn('path-to-icon'); $this->url->expects($this->once()) diff --git a/autotest-js.sh b/autotest-js.sh index 5f03132ee42..b5bb9965553 100755 --- a/autotest-js.sh +++ b/autotest-js.sh @@ -28,7 +28,7 @@ for SCSSFILE in core/css/*.scss do FILE=$(basename $SCSSFILE) FILENAME="${FILE%.*}" - printf "@import 'variables.scss'; @import '${FILE}';" | ./build/bin/node-sass --include-path core/css/ > tests/css/${FILE}.css + printf "\$webroot:''; @import 'functions.scss'; @import 'variables.scss'; @import '${FILE}';" | ./build/bin/node-sass --include-path core/css/ > tests/css/${FILE}.css done KARMA="$PREFIX/node_modules/karma/bin/karma" diff --git a/core/css/functions.scss b/core/css/functions.scss index 19792456edd..6cfad2c7ebb 100644 --- a/core/css/functions.scss +++ b/core/css/functions.scss @@ -32,9 +32,10 @@ */ @mixin icon-color($icon, $dir, $color, $core: false) { // remove # from color - $index: str-index($color, '#'); + // inspect cast int to string + $index: str-index(inspect($color), '#'); @if $index { - $color: str-slice($color, 2); + $color: str-slice(inspect($color), 2); } $varName: "--icon-#{$icon}-#{$color}"; @if $core { diff --git a/lib/private/Server.php b/lib/private/Server.php index c9f8001631e..0f406ebe9b7 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -116,6 +116,7 @@ use OC\Share20\ProviderFactory; use OC\Share20\ShareHelper; use OC\SystemTag\ManagerFactory as SystemTagManagerFactory; use OC\Tagging\TagMapper; +use OC\Template\IconsCacher; use OC\Template\JSCombiner; use OC\Template\SCSSCacher; use OCA\Theming\ImageManager; @@ -963,7 +964,8 @@ class Server extends ServerContainer implements IServerContainer { $c->getConfig(), $c->getThemingDefaults(), \OC::$SERVERROOT, - $this->getMemCacheFactory() + $this->getMemCacheFactory(), + $c->query(IconsCacher::class) ); }); $this->registerService(JSCombiner::class, function (Server $c) { diff --git a/lib/private/Template/IconsCacher.php b/lib/private/Template/IconsCacher.php index c4d073156f1..a8dacfcfbc0 100644 --- a/lib/private/Template/IconsCacher.php +++ b/lib/private/Template/IconsCacher.php @@ -26,6 +26,7 @@ namespace OC\Template; use OCP\Files\IAppData; use OCP\Files\NotFoundException; use OCP\Files\SimpleFS\ISimpleFolder; +use OCP\Files\SimpleFS\ISimpleFile; use OCP\ILogger; use OCP\IURLGenerator; use OC\Files\AppData\Factory; @@ -85,10 +86,11 @@ class IconsCacher { */ public function setIconsCss(string $css) { - try { - $currentData = $this->folder->getFile($this->fileName)->getContent(); - } catch (NotFoundException $e) { + $cachedFile = $this->getCachedCSS(); + if (!$cachedFile) { $currentData = ''; + } else { + $currentData = $cachedFile->getContent(); } // remove :root @@ -102,16 +104,14 @@ class IconsCacher { } if (strlen($data) > 0) { - try { - $cachedfile = $this->folder->getFile($this->fileName); - } catch (NotFoundException $e) { - $cachedfile = $this->folder->newFile($this->fileName); + if (!$cachedFile) { + $cachedFile = $this->folder->newFile($this->fileName); } $data = ":root { $data }"; - $cachedfile->putContent($data); + $cachedFile->putContent($data); } return preg_replace($this->iconVarRE, '', $css); diff --git a/lib/private/Template/SCSSCacher.php b/lib/private/Template/SCSSCacher.php index ed1383f8ea3..269daf5556d 100644 --- a/lib/private/Template/SCSSCacher.php +++ b/lib/private/Template/SCSSCacher.php @@ -85,6 +85,7 @@ class SCSSCacher { * @param \OC_Defaults $defaults * @param string $serverRoot * @param ICacheFactory $cacheFactory + * @param IconsCacher $iconsCacher */ public function __construct(ILogger $logger, Factory $appDataFactory, @@ -92,7 +93,8 @@ class SCSSCacher { IConfig $config, \OC_Defaults $defaults, $serverRoot, - ICacheFactory $cacheFactory) { + ICacheFactory $cacheFactory, + IconsCacher $iconsCacher) { $this->logger = $logger; $this->appData = $appDataFactory->get('css'); $this->urlGenerator = $urlGenerator; @@ -101,12 +103,7 @@ class SCSSCacher { $this->serverRoot = $serverRoot; $this->cacheFactory = $cacheFactory; $this->depsCache = $cacheFactory->createDistributed('SCSS-' . md5($this->urlGenerator->getBaseUrl())); - - $this->iconsCacher = new IconsCacher( - $this->logger, - $appDataFactory, - $this->urlGenerator - ); + $this->iconsCacher = $iconsCacher; } /** diff --git a/tests/lib/Settings/ManagerTest.php b/tests/lib/Settings/ManagerTest.php index 30a5b7bd103..76f6d867d3a 100644 --- a/tests/lib/Settings/ManagerTest.php +++ b/tests/lib/Settings/ManagerTest.php @@ -122,7 +122,7 @@ class ManagerTest extends TestCase { ['core', 'actions/settings-dark.svg', '1'], ['core', 'actions/share.svg', '2'], ['core', 'actions/password.svg', '3'], - ['core', 'places/contacts-dark.svg', '5'], + ['core', 'places/contacts.svg', '5'], ['settings', 'help.svg', '4'], ]); @@ -175,7 +175,7 @@ class ManagerTest extends TestCase { ['core', 'actions/settings-dark.svg', '1'], ['core', 'actions/share.svg', '2'], ['core', 'actions/password.svg', '3'], - ['core', 'places/contacts-dark.svg', '5'], + ['core', 'places/contacts.svg', '5'], ['settings', 'help.svg', '4'], ]); diff --git a/tests/lib/Template/CSSResourceLocatorTest.php b/tests/lib/Template/CSSResourceLocatorTest.php index a8b123b8d5b..3fb7972b211 100644 --- a/tests/lib/Template/CSSResourceLocatorTest.php +++ b/tests/lib/Template/CSSResourceLocatorTest.php @@ -31,6 +31,7 @@ use OCP\ILogger; use OCP\IURLGenerator; use OCP\IConfig; use OCA\Theming\ThemingDefaults; +use OC\Template\IconsCacher; use OC\Template\SCSSCacher; use OC\Template\CSSResourceLocator; @@ -47,6 +48,8 @@ class CSSResourceLocatorTest extends \Test\TestCase { protected $cacheFactory; /** @var ILogger|\PHPUnit_Framework_MockObject_MockObject */ protected $logger; + /** @var IconsCacher|\PHPUnit_Framework_MockObject_MockObject */ + protected $iconsCacher; protected function setUp() { parent::setUp(); @@ -57,6 +60,7 @@ class CSSResourceLocatorTest extends \Test\TestCase { $this->config = $this->createMock(IConfig::class); $this->cacheFactory = $this->createMock(ICacheFactory::class); $this->themingDefaults = $this->createMock(ThemingDefaults::class); + $this->iconsCacher = $this->createMock(IconsCacher::class); } private function cssResourceLocator() { @@ -70,7 +74,8 @@ class CSSResourceLocatorTest extends \Test\TestCase { $this->config, $this->themingDefaults, \OC::$SERVERROOT, - $this->cacheFactory + $this->cacheFactory, + $this->iconsCacher ); return new CSSResourceLocator( $this->logger, diff --git a/tests/lib/Template/IconsCacherTest.php b/tests/lib/Template/IconsCacherTest.php new file mode 100644 index 00000000000..769d7f1893d --- /dev/null +++ b/tests/lib/Template/IconsCacherTest.php @@ -0,0 +1,126 @@ + + * + * @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 . + * + */ + +namespace Test\Template; + +use OC\Files\AppData\AppData; +use OC\Files\AppData\Factory; +use OC\Template\IconsCacher; +use OCA\Theming\ThemingDefaults; +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use OCP\Files\SimpleFS\ISimpleFile; +use OCP\Files\SimpleFS\ISimpleFolder; +use OCP\ICache; +use OCP\ICacheFactory; +use OCP\IConfig; +use OCP\ILogger; +use OCP\IURLGenerator; +use OC_App; + +class IconsCacherTest extends \Test\TestCase { + /** @var ILogger|\PHPUnit_Framework_MockObject_MockObject */ + protected $logger; + /** @var IAppData|\PHPUnit_Framework_MockObject_MockObject */ + protected $appData; + /** @var IURLGenerator|\PHPUnit_Framework_MockObject_MockObject */ + protected $urlGenerator; + + protected function setUp() { + $this->logger = $this->createMock(ILogger::class); + $this->appData = $this->createMock(AppData::class); + + /** @var Factory|\PHPUnit_Framework_MockObject_MockObject $factory */ + $factory = $this->createMock(Factory::class); + $factory->method('get')->with('css')->willReturn($this->appData); + + $this->folder = $this->createMock(ISimpleFolder::class); + $this->appData->method('getFolder')->willReturn($this->folder); + + $this->urlGenerator = $this->createMock(IURLGenerator::class); + + $this->iconsCacher = new IconsCacher( + $this->logger, + $factory, + $this->urlGenerator + ); + } + + public function testGetIconsFromEmptyCss() { + $css = " + icon.test { + color: #aaa; + } + "; + $icons = self::invokePrivate($this->iconsCacher, 'getIconsFromCss', [$css]); + $this->assertTrue(empty($icons)); + } + + public function testGetIconsFromValidCss() { + $css = " + icon.test { + --icon-test: url('/svg/core/actions/add/000'); + background-image: var(--icon-test); + } + "; + $actual = self::invokePrivate($this->iconsCacher, 'getIconsFromCss', [$css]); + $expected = array( + 'icon-test' => '/svg/core/actions/add/000' + ); + $this->assertEquals($expected, $actual); + } + + public function testSetIconsFromEmptyCss() { + $expected = " + icon.test { + color: #aaa; + } + "; + $actual = $this->iconsCacher->setIconsCss($expected); + $this->assertEquals($expected, $actual); + } + + public function testSetIconsFromValidCss() { + $css = " + icon.test { + --icon-test: url('/svg/core/actions/add/000'); + background-image: var(--icon-test); + } + "; + $expected = " + icon.test { + + background-image: var(--icon-test); + } + "; + + $iconsFile = $this->createMock(ISimpleFile::class); + $this->folder->expects($this->once()) + ->method('getFile') + ->willReturn($iconsFile); + + $actual = $this->iconsCacher->setIconsCss($css); + $this->assertEquals($expected, $actual); + } + +} \ No newline at end of file diff --git a/tests/lib/Template/SCSSCacherTest.php b/tests/lib/Template/SCSSCacherTest.php index 5e3700477ff..3840f3727f9 100644 --- a/tests/lib/Template/SCSSCacherTest.php +++ b/tests/lib/Template/SCSSCacherTest.php @@ -26,6 +26,7 @@ namespace Test\Template; use OC\Files\AppData\AppData; use OC\Files\AppData\Factory; use OC\Template\SCSSCacher; +use OC\Template\IconsCacher; use OCA\Theming\ThemingDefaults; use OCP\Files\IAppData; use OCP\Files\NotFoundException; @@ -55,11 +56,14 @@ class SCSSCacherTest extends \Test\TestCase { protected $depsCache; /** @var ICacheFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $cacheFactory; + /** @var IconsCacher|\PHPUnit_Framework_MockObject_MockObject */ + protected $iconsCacher; protected function setUp() { parent::setUp(); $this->logger = $this->createMock(ILogger::class); $this->appData = $this->createMock(AppData::class); + $this->iconsCacher = $this->createMock(IconsCacher::class); /** @var Factory|\PHPUnit_Framework_MockObject_MockObject $factory */ $factory = $this->createMock(Factory::class); @@ -80,6 +84,11 @@ class SCSSCacherTest extends \Test\TestCase { $this->themingDefaults = $this->createMock(ThemingDefaults::class); $this->themingDefaults->expects($this->any())->method('getScssVariables')->willReturn([]); + $iconsFile = $this->createMock(ISimpleFile::class); + $this->iconsCacher->expects($this->any()) + ->method('getCachedCSS') + ->willReturn($iconsFile); + $this->scssCacher = new SCSSCacher( $this->logger, $factory, @@ -87,7 +96,8 @@ class SCSSCacherTest extends \Test\TestCase { $this->config, $this->themingDefaults, \OC::$SERVERROOT, - $this->cacheFactory + $this->cacheFactory, + $this->iconsCacher ); } @@ -126,6 +136,10 @@ class SCSSCacherTest extends \Test\TestCase { ->method('getBaseUrl') ->willReturn('http://localhost/nextcloud'); + $this->iconsCacher->expects($this->any()) + ->method('setIconsCss') + ->willReturn('scss {}'); + $actual = $this->scssCacher->process(\OC::$SERVERROOT, '/core/css/styles.scss', 'core'); $this->assertTrue($actual); } @@ -158,6 +172,10 @@ class SCSSCacherTest extends \Test\TestCase { ->with($filePrefix.'styles.css.deps') ->willReturn($fileDeps); + $this->iconsCacher->expects($this->any()) + ->method('setIconsCss') + ->willReturn('scss {}'); + $actual = $this->scssCacher->process(\OC::$SERVERROOT, '/core/css/styles.scss', 'core'); $this->assertTrue($actual); } @@ -185,6 +203,10 @@ class SCSSCacherTest extends \Test\TestCase { $this->fail(); })); + $this->iconsCacher->expects($this->any()) + ->method('setIconsCss') + ->willReturn('scss {}'); + $actual = $this->scssCacher->process(\OC::$SERVERROOT, '/core/css/styles.scss', 'core'); $this->assertTrue($actual); } @@ -220,6 +242,10 @@ class SCSSCacherTest extends \Test\TestCase { $this->fail(); })); + $this->iconsCacher->expects($this->any()) + ->method('setIconsCss') + ->willReturn('scss {}'); + $actual = $this->scssCacher->process(\OC::$SERVERROOT, '/core/css/styles.scss', 'core'); $this->assertTrue($actual); } @@ -276,6 +302,10 @@ class SCSSCacherTest extends \Test\TestCase { throw new \Exception(); })); + $this->iconsCacher->expects($this->any()) + ->method('setIconsCss') + ->willReturn('scss {}'); + $file->expects($this->once())->method('putContent'); $depsFile->expects($this->once())->method('putContent'); $gzipFile->expects($this->once())->method('putContent'); @@ -310,6 +340,10 @@ class SCSSCacherTest extends \Test\TestCase { $depsFile->expects($this->once())->method('putContent'); $gzipFile->expects($this->once())->method('putContent'); + $this->iconsCacher->expects($this->any()) + ->method('setIconsCss') + ->willReturn('scss {}'); + $actual = self::invokePrivate($this->scssCacher, 'cache', [$path, $fileNameCSS, $fileNameSCSS, $folder, $webDir]); $this->assertTrue($actual); } @@ -336,6 +370,10 @@ class SCSSCacherTest extends \Test\TestCase { throw new \Exception(); })); + $this->iconsCacher->expects($this->at(0)) + ->method('setIconsCss') + ->willReturn('body{background-color:#0082c9}'); + $file->expects($this->at(0))->method('putContent')->with($this->callback( function ($content){ return 'body{background-color:#0082c9}' === $content;