fix(theming): Conitionally disable blur filter for performance

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
This commit is contained in:
Ferdinand Thiessen 2024-05-17 14:39:04 +02:00
parent 290ccdb684
commit 931a7ce282
No known key found for this signature in database
GPG key ID: 45FAE7268762B400
8 changed files with 48 additions and 31 deletions

View file

@ -25,6 +25,7 @@ declare(strict_types=1);
*/
namespace OCA\Theming\Themes;
use OC\AppFramework\Http\Request;
use OCA\Theming\ImageManager;
use OCA\Theming\ITheme;
use OCA\Theming\Service\BackgroundService;
@ -33,41 +34,27 @@ use OCA\Theming\Util;
use OCP\App\IAppManager;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\IUserSession;
class DefaultTheme implements ITheme {
use CommonThemeTrait;
public Util $util;
public ThemingDefaults $themingDefaults;
public IUserSession $userSession;
public IURLGenerator $urlGenerator;
public ImageManager $imageManager;
public IConfig $config;
public IL10N $l;
public IAppManager $appManager;
public string $defaultPrimaryColor;
public string $primaryColor;
public function __construct(Util $util,
ThemingDefaults $themingDefaults,
IUserSession $userSession,
IURLGenerator $urlGenerator,
ImageManager $imageManager,
IConfig $config,
IL10N $l,
IAppManager $appManager) {
$this->util = $util;
$this->themingDefaults = $themingDefaults;
$this->userSession = $userSession;
$this->urlGenerator = $urlGenerator;
$this->imageManager = $imageManager;
$this->config = $config;
$this->l = $l;
$this->appManager = $appManager;
public function __construct(
public Util $util,
public ThemingDefaults $themingDefaults,
public IUserSession $userSession,
public IURLGenerator $urlGenerator,
public ImageManager $imageManager,
public IConfig $config,
public IL10N $l,
public IAppManager $appManager,
private ?IRequest $request,
) {
$this->defaultPrimaryColor = $this->themingDefaults->getDefaultColorPrimary();
$this->primaryColor = $this->themingDefaults->getColorPrimary();
@ -116,12 +103,29 @@ class DefaultTheme implements ITheme {
$colorSuccess = '#2d7b41';
$colorInfo = '#0071ad';
$user = $this->userSession->getUser();
// Chromium based browsers currently (2024) have huge performance issues with blur filters
$isChromium = $this->request !== null && $this->request->isUserAgent([Request::USER_AGENT_CHROME, Request::USER_AGENT_MS_EDGE]);
// Ignore MacOS because they always have hardware accelartion
$isChromium = $isChromium && !$this->request->isUserAgent(['/Macintosh/']);
// Allow to force the blur filter
$forceEnableBlur = $user === null ? false : $this->config->getUserValue(
$user->getUID(),
'theming',
'force_enable_blur_filter',
);
$workingBlur = match($forceEnableBlur) {
'yes' => true,
'no' => false,
default => !$isChromium
};
$variables = [
'--color-main-background' => $colorMainBackground,
'--color-main-background-rgb' => $colorMainBackgroundRGB,
'--color-main-background-translucent' => 'rgba(var(--color-main-background-rgb), .97)',
'--color-main-background-blur' => 'rgba(var(--color-main-background-rgb), .8)',
'--filter-background-blur' => 'blur(25px)',
'--filter-background-blur' => $workingBlur ? 'blur(25px)' : 'none',
// to use like this: background-image: linear-gradient(0, var('--gradient-main-background));
'--gradient-main-background' => 'var(--color-main-background) 0%, var(--color-main-background-translucent) 85%, transparent 100%',

View file

@ -332,6 +332,7 @@ class ThemesServiceTest extends TestCase {
$this->config,
$l10n,
$appManager,
null,
),
'light' => new LightTheme(
$util,
@ -342,6 +343,7 @@ class ThemesServiceTest extends TestCase {
$this->config,
$l10n,
$appManager,
null,
),
'dark' => new DarkTheme(
$util,
@ -352,6 +354,7 @@ class ThemesServiceTest extends TestCase {
$this->config,
$l10n,
$appManager,
null,
),
'light-highcontrast' => new HighContrastTheme(
$util,
@ -362,6 +365,7 @@ class ThemesServiceTest extends TestCase {
$this->config,
$l10n,
$appManager,
null,
),
'dark-highcontrast' => new DarkHighContrastTheme(
$util,
@ -372,6 +376,7 @@ class ThemesServiceTest extends TestCase {
$this->config,
$l10n,
$appManager,
null,
),
'opendyslexic' => new DyslexiaFont(
$util,
@ -382,6 +387,7 @@ class ThemesServiceTest extends TestCase {
$this->config,
$l10n,
$appManager,
null,
),
];
}

View file

@ -116,16 +116,18 @@ class PersonalTest extends TestCase {
->with('enforce_theme', '')
->willReturn($enforcedTheme);
$this->config->expects($this->once())
$this->config->expects($this->exactly(2))
->method('getUserValue')
->with('admin', 'core', 'apporder')
->willReturn('[]');
->willReturnMap([
['admin', 'core', 'apporder', '[]', '[]'],
['admin', 'theming', 'force_enable_blur_filter', '', ''],
]);
$this->appManager->expects($this->once())
->method('getDefaultAppForUser')
->willReturn('forcedapp');
$this->initialStateService->expects($this->exactly(4))
$this->initialStateService->expects($this->exactly(5))
->method('provideInitialState')
->withConsecutive(
['themes', $themesState],

View file

@ -110,6 +110,7 @@ class DarkHighContrastThemeTest extends AccessibleThemeTestCase {
$this->config,
$this->l10n,
$this->appManager,
null,
);
parent::setUp();

View file

@ -107,6 +107,7 @@ class DarkThemeTest extends AccessibleThemeTestCase {
$this->config,
$this->l10n,
$this->appManager,
null,
);
parent::setUp();

View file

@ -107,6 +107,7 @@ class DefaultThemeTest extends AccessibleThemeTestCase {
$this->config,
$this->l10n,
$this->appManager,
null,
);
parent::setUp();

View file

@ -110,6 +110,7 @@ class DyslexiaFontTest extends TestCase {
$this->config,
$this->l10n,
$this->appManager,
null,
);
parent::setUp();

View file

@ -110,6 +110,7 @@ class HighContrastThemeTest extends AccessibleThemeTestCase {
$this->config,
$this->l10n,
$this->appManager,
null,
);
parent::setUp();