From afa843a7b40470076e6bde82caf117171f1ccb2c Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 31 May 2022 13:20:08 +0200 Subject: Add --include-hidden for :config-diff Needed it for debugging, so why not implement it properly. TODO: Changelog, pick to master? --- doc/help/commands.asciidoc | 5 +++++ qutebrowser/browser/qutescheme.py | 7 ++++--- qutebrowser/config/config.py | 7 +++++-- qutebrowser/config/configcommands.py | 15 ++++++++++--- tests/unit/browser/test_qutescheme.py | 36 +++++++++++++++++++++++++++++++- tests/unit/config/test_config.py | 16 ++++++++++---- tests/unit/config/test_configcommands.py | 13 ++++++++---- 7 files changed, 82 insertions(+), 17 deletions(-) diff --git a/doc/help/commands.asciidoc b/doc/help/commands.asciidoc index b1ba0b83c..5fea0b022 100644 --- a/doc/help/commands.asciidoc +++ b/doc/help/commands.asciidoc @@ -336,8 +336,13 @@ Remove a key from a dict. [[config-diff]] === config-diff +Syntax: +:config-diff [*--include-hidden*]+ + Show all customized options. +==== optional arguments +* +*-i*+, +*--include-hidden*+: Also include internal qutebrowser settings. + [[config-edit]] === config-edit Syntax: +:config-edit [*--no-source*]+ diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index aecb9a11a..402a096b2 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -500,10 +500,11 @@ def qute_back(url: QUrl) -> _HandlerRet: @add_handler('configdiff') -def qute_configdiff(_url: QUrl) -> _HandlerRet: +def qute_configdiff(url: QUrl) -> _HandlerRet: """Handler for qute://configdiff.""" - data = config.instance.dump_userconfig().encode('utf-8') - return 'text/plain', data + include_hidden = QUrlQuery(url).queryItemValue('include_hidden') == 'true' + dump = config.instance.dump_userconfig(include_hidden=include_hidden) + return 'text/plain', dump.encode('utf-8') @add_handler('pastebin-version') diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py index ac0204c12..278059820 100644 --- a/qutebrowser/config/config.py +++ b/qutebrowser/config/config.py @@ -559,15 +559,18 @@ class Config(QObject): self.set_obj(name, new_value, save_yaml=save_yaml) self._mutables = {} - def dump_userconfig(self) -> str: + def dump_userconfig(self, *, include_hidden: bool = False) -> str: """Get the part of the config which was changed by the user. + Args: + include_hidden: Include default scoped configs. + Return: The changed config part as string. """ lines: List[str] = [] for values in sorted(self, key=lambda v: v.opt.name): - lines += values.dump() + lines += values.dump(include_hidden=include_hidden) if not lines: return '' diff --git a/qutebrowser/config/configcommands.py b/qutebrowser/config/configcommands.py index da7e0512e..2f5682e96 100644 --- a/qutebrowser/config/configcommands.py +++ b/qutebrowser/config/configcommands.py @@ -23,7 +23,7 @@ import os.path import contextlib from typing import TYPE_CHECKING, Iterator, List, Optional, Any, Tuple -from qutebrowser.qt.core import QUrl +from qutebrowser.qt.core import QUrl, QUrlQuery from qutebrowser.api import cmdutils from qutebrowser.completion.models import configmodel @@ -281,9 +281,18 @@ class ConfigCommands: @cmdutils.register(instance='config-commands') @cmdutils.argument('win_id', value=cmdutils.Value.win_id) - def config_diff(self, win_id: int) -> None: - """Show all customized options.""" + def config_diff(self, win_id: int, include_hidden: bool = False) -> None: + """Show all customized options. + + Args: + include_hidden: Also include internal qutebrowser settings. + """ url = QUrl('qute://configdiff') + if include_hidden: + query = QUrlQuery() + query.addQueryItem("include_hidden", "true") + url.setQuery(query) + tabbed_browser = objreg.get('tabbed-browser', scope='window', window=win_id) tabbed_browser.load_url(url, newtab=False) diff --git a/tests/unit/browser/test_qutescheme.py b/tests/unit/browser/test_qutescheme.py index aa9958eff..499b2c584 100644 --- a/tests/unit/browser/test_qutescheme.py +++ b/tests/unit/browser/test_qutescheme.py @@ -28,7 +28,7 @@ from qutebrowser.qt.core import QUrl, QUrlQuery import pytest from qutebrowser.browser import qutescheme, pdfjs, downloads -from qutebrowser.utils import resources +from qutebrowser.utils import resources, urlmatch from qutebrowser.misc import guiprocess @@ -291,3 +291,37 @@ class TestPDFJSHandler: url.setQuery(query) with pytest.raises(qutescheme.RequestDeniedError): qutescheme.data_for_url(url) + + +class TestQuteConfigdiff: + + """Test the qute://configdiff handler.""" + + @pytest.fixture(autouse=True) + def prepare_config(self, config_stub): + config_stub.set_obj( + "content.javascript.enabled", + True, + pattern=urlmatch.UrlPattern("chrome-devtools://*"), + hide_userconfig=True, + ) + + @pytest.mark.parametrize("url, expected", [ + ( + "qute://configdiff/", + b"", + ), + ( + "qute://configdiff/?include_hidden=true", + b'chrome-devtools://*: content.javascript.enabled = true', + ) + ]) + def test_default_config(self, config_stub, url, expected): + _mimetype, data = qutescheme.data_for_url(QUrl(url)) + assert data == expected + + def test_changes(self, config_stub): + config_stub.set_obj("content.images", False) + url = QUrl('qute://configdiff/') + _mimetype, data = qutescheme.data_for_url(url) + assert data == b'content.images = false' diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py index f09124b2a..24d724a9d 100644 --- a/tests/unit/config/test_config.py +++ b/tests/unit/config/test_config.py @@ -715,12 +715,20 @@ class TestConfig: with qtbot.assert_not_emitted(conf.changed): meth('colors.statusbar.normal.bg', '#abcdef', pattern=pattern) - def test_dump_userconfig(self, conf): + @pytest.mark.parametrize("include_hidden", [True, False]) + def test_dump_userconfig(self, conf, include_hidden): conf.set_obj('content.plugins', True) conf.set_obj('content.headers.custom', {'X-Foo': 'bar'}) - lines = ['content.headers.custom = {"X-Foo": "bar"}', - 'content.plugins = true'] - assert conf.dump_userconfig().splitlines() == lines + conf.set_obj('content.webgl', False, hide_userconfig=True) + + lines = [ + 'content.headers.custom = {"X-Foo": "bar"}', + 'content.plugins = true', + ] + if include_hidden: + lines.append("content.webgl = false") + + assert conf.dump_userconfig(include_hidden=include_hidden).splitlines() == lines def test_dump_userconfig_default(self, conf): assert conf.dump_userconfig() == '' diff --git a/tests/unit/config/test_configcommands.py b/tests/unit/config/test_configcommands.py index ad0ed5d51..e80ab99ee 100644 --- a/tests/unit/config/test_configcommands.py +++ b/tests/unit/config/test_configcommands.py @@ -212,12 +212,17 @@ class TestSet: commands.set(win_id=0, option='foo?') -def test_diff(commands, tabbed_browser_stubs): +@pytest.mark.parametrize("include_hidden, url", [ + (True, "qute://configdiff?include_hidden=true"), + (False, "qute://configdiff"), +]) +def test_diff(commands, tabbed_browser_stubs, include_hidden, url): """Run ':config-diff'. - Should open qute://configdiff.""" - commands.config_diff(win_id=0) - assert tabbed_browser_stubs[0].loaded_url == QUrl('qute://configdiff') + Should open qute://configdiff. + """ + commands.config_diff(win_id=0, include_hidden=include_hidden) + assert tabbed_browser_stubs[0].loaded_url == QUrl(url) class TestCycle: -- cgit v1.2.3-54-g00ecf