From 314c81b24eb9f9457ccdb5c682d718cf24f24a76 Mon Sep 17 00:00:00 2001 From: Ted Morse Date: Sat, 28 Nov 2020 21:27:11 -0800 Subject: Use blink-setting for colorscheme on Qt 5.15+ On Qt 5.15+, `--force-dark-mode` does not set the preferred colorscheme. A blink-setting is used instead to set the preferred colorscheme. The `--force-dark-mode` flag is only set for Qt 5.14. All later versions will use the blink-setting flag. --- qutebrowser/browser/webengine/darkmode.py | 4 ++++ qutebrowser/config/qtargs.py | 10 ++++++++-- tests/helpers/utils.py | 3 +++ tests/unit/browser/webengine/test_darkmode.py | 13 +++++++++++++ tests/unit/config/test_qtargs.py | 18 +++++++++--------- 5 files changed, 37 insertions(+), 11 deletions(-) diff --git a/qutebrowser/browser/webengine/darkmode.py b/qutebrowser/browser/webengine/darkmode.py index 630a7bf9e..5ae079392 100644 --- a/qutebrowser/browser/webengine/darkmode.py +++ b/qutebrowser/browser/webengine/darkmode.py @@ -264,6 +264,10 @@ def _variant() -> Variant: def settings() -> Iterator[Tuple[str, str]]: """Get necessary blink settings to configure dark mode for QtWebEngine.""" + if (qtutils.version_check('5.15', compiled=False) and + config.val.colors.webpage.prefers_color_scheme_dark): + yield "preferredColorScheme", "1" + if not config.val.colors.webpage.darkmode.enabled: return diff --git a/qutebrowser/config/qtargs.py b/qutebrowser/config/qtargs.py index 8ab93c904..663296bbc 100644 --- a/qutebrowser/config/qtargs.py +++ b/qutebrowser/config/qtargs.py @@ -203,12 +203,18 @@ def _qtwebengine_settings_args() -> Iterator[str]: } } - referrer_setting = settings['content.headers.referer'] - if qtutils.version_check('5.14', compiled=False): + if (qtutils.version_check('5.14', compiled=False) and + not qtutils.version_check('5.15', compiled=False)): + # In Qt 5.14, `--force-dark-mode` is used to set the preferred + # colorscheme. In Qt 5.15, this is handled by a blink-setting + # instead. settings['colors.webpage.prefers_color_scheme_dark'] = { True: '--force-dark-mode', False: None, } + + referrer_setting = settings['content.headers.referer'] + if qtutils.version_check('5.14', compiled=False): # Starting with Qt 5.14, this is handled via --enable-features referrer_setting['same-domain'] = None else: diff --git a/tests/helpers/utils.py b/tests/helpers/utils.py index 2c275bf15..3b5ee0ab6 100644 --- a/tests/helpers/utils.py +++ b/tests/helpers/utils.py @@ -44,6 +44,9 @@ ON_CI = 'CI' in os.environ qt514 = pytest.mark.skipif( not qtutils.version_check('5.14'), reason="Needs Qt 5.14 or newer") +qt515 = pytest.mark.skipif( + not qtutils.version_check('5.15'), reason="Needs Qt 5.15 or newer") + class PartialCompareOutcome: diff --git a/tests/unit/browser/webengine/test_darkmode.py b/tests/unit/browser/webengine/test_darkmode.py index 3e62000d2..0c39cf95c 100644 --- a/tests/unit/browser/webengine/test_darkmode.py +++ b/tests/unit/browser/webengine/test_darkmode.py @@ -32,6 +32,19 @@ def patch_backend(monkeypatch): monkeypatch.setattr(objects, 'backend', usertypes.Backend.QtWebEngine) +@pytest.mark.parametrize('enabled, expected', [ + # Disabled or nothing set + (False, []), + + # Enabled in configuration + (True, [("preferredColorScheme", "1")]), +]) +@utils.qt515 +def test_colorscheme(config_stub, monkeypatch, enabled, expected): + config_stub.set_obj('colors.webpage.prefers_color_scheme_dark', enabled) + assert list(darkmode.settings()) == expected + + @pytest.mark.parametrize('settings, expected', [ # Disabled ({}, []), diff --git a/tests/unit/config/test_qtargs.py b/tests/unit/config/test_qtargs.py index 051956a00..d26a8ab50 100644 --- a/tests/unit/config/test_qtargs.py +++ b/tests/unit/config/test_qtargs.py @@ -289,20 +289,20 @@ class TestQtArgs: else: assert arg in args - @pytest.mark.parametrize('dark, new_qt, added', [ - (True, True, True), - (True, False, False), - (False, True, False), - (False, False, False), + @pytest.mark.parametrize('dark, qt_version, added', [ + (True, "5.13", False), + (True, "5.14", True), + (True, "5.15", False), + (False, "5.13", False), + (False, "5.14", False), + (False, "5.15", False), ]) @utils.qt514 def test_prefers_color_scheme_dark(self, config_stub, monkeypatch, parser, - dark, new_qt, added): + dark, qt_version, added): monkeypatch.setattr(qtargs.objects, 'backend', usertypes.Backend.QtWebEngine) - monkeypatch.setattr(qtargs.qtutils, 'version_check', - lambda version, exact=False, compiled=True: - new_qt) + monkeypatch.setattr(qtargs.qtutils, 'qVersion', lambda: qt_version) config_stub.val.colors.webpage.prefers_color_scheme_dark = dark -- cgit v1.2.3-54-g00ecf From 6feaeb247921de22318a7cc18251260ad1adbb86 Mon Sep 17 00:00:00 2001 From: Ted Morse Date: Fri, 27 Nov 2020 21:06:45 -0800 Subject: Add invocation test for preferred colorscheme With the addition of blink-settings for ensuring the correct color scheme, this test makes sure the browser is obeying it via a media match query through javascript. Any HTML page will do, so `qute://version` is opened and tested against. --- tests/end2end/test_invocations.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/end2end/test_invocations.py b/tests/end2end/test_invocations.py index e34bd912d..74288fbc3 100644 --- a/tests/end2end/test_invocations.py +++ b/tests/end2end/test_invocations.py @@ -417,3 +417,23 @@ def test_referrer(quteproc_new, server, server2, request, value, expected): expected = expected.replace(key, str(val)) assert headers.get('Referer') == expected + + +@pytest.mark.qtwebkit_skip +@utils.qt514 +def test_preferred_colorscheme(request, quteproc_new): + """Make sure the the preferred colorscheme is set.""" + args = _base_args(request.config) + [ + '--temp-basedir', + '-s', 'colors.webpage.prefers_color_scheme_dark', 'true', + ] + quteproc_new.start(args) + + quteproc_new.open_path("qute://version") + quteproc_new.send_cmd(':jseval --world main ' + 'matchMedia("(prefers-color-scheme: dark)").matches') + line = quteproc_new.wait_for(message='True') + line.expected = True + + quteproc_new.send_cmd(':quit') + quteproc_new.wait_for_quit() -- cgit v1.2.3-54-g00ecf From 6d01062305e554f3d0e8989f0ba45c998c425ef1 Mon Sep 17 00:00:00 2001 From: Ted Morse Date: Sun, 29 Nov 2020 10:54:38 -0800 Subject: Cleanup invocation test for colorscheme Took @The-Compiler's suggestions and removed unnecessary cruft from the colorscheme invocation test. --- tests/end2end/test_invocations.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/tests/end2end/test_invocations.py b/tests/end2end/test_invocations.py index 74288fbc3..1680a838b 100644 --- a/tests/end2end/test_invocations.py +++ b/tests/end2end/test_invocations.py @@ -429,11 +429,6 @@ def test_preferred_colorscheme(request, quteproc_new): ] quteproc_new.start(args) - quteproc_new.open_path("qute://version") - quteproc_new.send_cmd(':jseval --world main ' + quteproc_new.send_cmd(':jseval ' 'matchMedia("(prefers-color-scheme: dark)").matches') - line = quteproc_new.wait_for(message='True') - line.expected = True - - quteproc_new.send_cmd(':quit') - quteproc_new.wait_for_quit() + quteproc_new.wait_for(message='True') -- cgit v1.2.3-54-g00ecf From 1f67527662a076aa0a3caf5348f9ba6b663f4a0e Mon Sep 17 00:00:00 2001 From: Ted Morse Date: Sun, 29 Nov 2020 10:58:27 -0800 Subject: Only apply blink-settings on Qt 15.5.2 Turns out Qt 5.15.{0,1} also needs `--force-dark-mode`. This commit fixes it to only use the blink-setting on Qt 5.15.2 and up. It also parameterizes the tests better to test that the settings work on their respective Qt versions. --- qutebrowser/browser/webengine/darkmode.py | 4 +++- qutebrowser/config/qtargs.py | 8 ++++---- tests/helpers/utils.py | 3 --- tests/unit/browser/webengine/test_darkmode.py | 19 +++++++++++++------ tests/unit/config/test_qtargs.py | 8 ++++++-- 5 files changed, 26 insertions(+), 16 deletions(-) diff --git a/qutebrowser/browser/webengine/darkmode.py b/qutebrowser/browser/webengine/darkmode.py index 5ae079392..86b7f8c59 100644 --- a/qutebrowser/browser/webengine/darkmode.py +++ b/qutebrowser/browser/webengine/darkmode.py @@ -264,8 +264,10 @@ def _variant() -> Variant: def settings() -> Iterator[Tuple[str, str]]: """Get necessary blink settings to configure dark mode for QtWebEngine.""" - if (qtutils.version_check('5.15', compiled=False) and + if (qtutils.version_check('5.15.2', compiled=False) and config.val.colors.webpage.prefers_color_scheme_dark): + # In future versions of 'blink', (> Qt 5.15.2) the enumeration has + # changed and this will need to be set to '0' instead. yield "preferredColorScheme", "1" if not config.val.colors.webpage.darkmode.enabled: diff --git a/qutebrowser/config/qtargs.py b/qutebrowser/config/qtargs.py index 663296bbc..2136f7e7f 100644 --- a/qutebrowser/config/qtargs.py +++ b/qutebrowser/config/qtargs.py @@ -204,10 +204,10 @@ def _qtwebengine_settings_args() -> Iterator[str]: } if (qtutils.version_check('5.14', compiled=False) and - not qtutils.version_check('5.15', compiled=False)): - # In Qt 5.14, `--force-dark-mode` is used to set the preferred - # colorscheme. In Qt 5.15, this is handled by a blink-setting - # instead. + not qtutils.version_check('5.15.2', compiled=False)): + # In Qt 5.14 to 5.15.1, `--force-dark-mode` is used to set the + # preferred colorscheme. In Qt 5.15.2, this is handled by a + # blink-setting instead. settings['colors.webpage.prefers_color_scheme_dark'] = { True: '--force-dark-mode', False: None, diff --git a/tests/helpers/utils.py b/tests/helpers/utils.py index 3b5ee0ab6..2c275bf15 100644 --- a/tests/helpers/utils.py +++ b/tests/helpers/utils.py @@ -44,9 +44,6 @@ ON_CI = 'CI' in os.environ qt514 = pytest.mark.skipif( not qtutils.version_check('5.14'), reason="Needs Qt 5.14 or newer") -qt515 = pytest.mark.skipif( - not qtutils.version_check('5.15'), reason="Needs Qt 5.15 or newer") - class PartialCompareOutcome: diff --git a/tests/unit/browser/webengine/test_darkmode.py b/tests/unit/browser/webengine/test_darkmode.py index 0c39cf95c..cd84526c3 100644 --- a/tests/unit/browser/webengine/test_darkmode.py +++ b/tests/unit/browser/webengine/test_darkmode.py @@ -32,16 +32,23 @@ def patch_backend(monkeypatch): monkeypatch.setattr(objects, 'backend', usertypes.Backend.QtWebEngine) -@pytest.mark.parametrize('enabled, expected', [ +@pytest.mark.parametrize('qversion, enabled, expected', [ # Disabled or nothing set - (False, []), + ("5.14", False, []), + ("5.15.0", False, []), + ("5.15.1", False, []), + ("5.15.2", False, []), # Enabled in configuration - (True, [("preferredColorScheme", "1")]), + ("5.14", True, []), + ("5.15.0", True, []), + ("5.15.1", True, []), + ("5.15.2", True, [("preferredColorScheme", "1")]), ]) -@utils.qt515 -def test_colorscheme(config_stub, monkeypatch, enabled, expected): - config_stub.set_obj('colors.webpage.prefers_color_scheme_dark', enabled) +@utils.qt514 +def test_colorscheme(config_stub, monkeypatch, qversion, enabled, expected): + monkeypatch.setattr(darkmode.qtutils, 'qVersion', lambda: qversion) + config_stub.val.colors.webpage.prefers_color_scheme_dark = enabled assert list(darkmode.settings()) == expected diff --git a/tests/unit/config/test_qtargs.py b/tests/unit/config/test_qtargs.py index d26a8ab50..8ff5b95d3 100644 --- a/tests/unit/config/test_qtargs.py +++ b/tests/unit/config/test_qtargs.py @@ -292,10 +292,14 @@ class TestQtArgs: @pytest.mark.parametrize('dark, qt_version, added', [ (True, "5.13", False), (True, "5.14", True), - (True, "5.15", False), + (True, "5.15.0", True), + (True, "5.15.1", True), + (True, "5.15.2", False), (False, "5.13", False), (False, "5.14", False), - (False, "5.15", False), + (False, "5.15.0", False), + (False, "5.15.1", False), + (False, "5.15.2", False), ]) @utils.qt514 def test_prefers_color_scheme_dark(self, config_stub, monkeypatch, parser, -- cgit v1.2.3-54-g00ecf