diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 926d40433..3cd1ae85d 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -34,6 +34,8 @@ Added * Opening PDFs on https:// sites now works properly. - New `qt.process_model` setting which can be used to change Chromium's process model. +- New `qt.low_end_device_mode` setting which turns on Chromium's low-end device + mode. This mode uses less RAM, but the expense of performance. Changed ~~~~~~~ diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc index 45262dd09..b5c4492f6 100644 --- a/doc/help/settings.asciidoc +++ b/doc/help/settings.asciidoc @@ -229,6 +229,7 @@ |<>|Force a Qt platform to use. |<>|Force software rendering for QtWebEngine. |<>|Turn on Qt HighDPI scaling. +|<>|Use Chromium's low-end device mode. |<>|Which Chromium process model to use. |<>|Show a scrollbar. |<>|Enable smooth scrolling for web pages. @@ -2758,6 +2759,24 @@ Type: <> Default: +pass:[false]+ +[[qt.low_end_device_mode]] +=== qt.low_end_device_mode +Use Chromium's low-end device mode. +This improves the RAM usage of renderer processes, at the expense of performance. +This setting requires a restart. + +Type: <> + +Valid values: + + * +force-on+: Always use low-end device mode. + * +auto+: Decide automatically (uses low-end mode with < 1 GB available RAM). + * +force-off+: Never use low-end device mode. + +Default: +pass:[auto]+ + +This setting is only available with the QtWebEngine backend. + [[qt.process_model]] === qt.process_model Which Chromium process model to use. diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index 81be51cee..5793ece8e 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -210,6 +210,23 @@ qt.process_model: - https://www.chromium.org/developers/design-documents/process-models - https://doc.qt.io/qt-5/qtwebengine-features.html#process-models +qt.low_end_device_mode: + type: + name: String + valid_values: + - force-on: Always use low-end device mode. + - auto: Decide automatically (uses low-end mode with < 1 GB available + RAM). + - force-off: Never use low-end device mode. + default: auto + backend: QtWebEngine + restart: true + desc: >- + Use Chromium's low-end device mode. + + This improves the RAM usage of renderer processes, at the expense of + performance. + qt.highdpi: type: Bool default: false diff --git a/qutebrowser/config/configinit.py b/qutebrowser/config/configinit.py index bd912e325..8e5b912e2 100644 --- a/qutebrowser/config/configinit.py +++ b/qutebrowser/config/configinit.py @@ -202,4 +202,15 @@ def qt_args(namespace): raise utils.Unreachable("Unknown process model {}" .format(process_model)) + low_end_device_mode = config.val.qt.low_end_device_mode + if low_end_device_mode == 'auto': + pass + elif low_end_device_mode == 'force-on': + argv.append('--enable-low-end-device-mode') + elif low_end_device_mode == 'force-off': + argv.append('--disable-low-end-device-mode') + else: + raise utils.Unreachable("Unknown low-end device mode {}" + .format(low_end_device_mode)) + return argv diff --git a/tests/unit/config/test_configinit.py b/tests/unit/config/test_configinit.py index 7c4f7b59e..fed658823 100644 --- a/tests/unit/config/test_configinit.py +++ b/tests/unit/config/test_configinit.py @@ -492,6 +492,26 @@ class TestQtArgs: assert '--process-per-site-instance' not in args assert '--process-per-tab' not in args + @pytest.mark.parametrize('low_end_device_mode, arg', [ + ('auto', None), + ('force-on', '--enable-low-end-device-mode'), + ('force-off', '--disable-low-end-device-mode'), + ]) + def test_low_end_device_mode(self, config_stub, monkeypatch, parser, + low_end_device_mode, arg): + monkeypatch.setattr(configinit.objects, 'backend', + usertypes.Backend.QtWebEngine) + + config_stub.val.qt.low_end_device_mode = low_end_device_mode + parsed = parser.parse_args([]) + args = configinit.qt_args(parsed) + + if arg is None: + assert '--enable-low-end-device-mode' not in args + assert '--disable-low-end-device-mode' not in args + else: + assert arg in args + @pytest.mark.parametrize('arg, confval, used', [ # overridden by commandline arg