From 29dda415f5b2178278283856c6f9f7b48a2a4353 Mon Sep 17 00:00:00 2001 From: octvs <42993892+octvs@users.noreply.github.com> Date: Tue, 20 May 2025 19:43:52 +0200 Subject: [PATCH] qutebrowser: add support for per domain settings (#7078) Add `programs.qutebrowser.perDomainSettings` which let's one to set configuration options for specific URLs [1]. It option doesn't check if the options passed to it are valid, it translates the config to python code to be written on the file as is. Mimicking the behaviour of `programs.qutebrowser.settings`. Added a new test case `test-qutebrowser-url-settings` for testing the implementation. [1]: https://github.com/qutebrowser/qutebrowser/blob/bb7bbb6ead5b7412fa5828249d56e51c1b35cb5a/doc/help/configuring.asciidoc#per-domain-settings --- modules/programs/qutebrowser.nix | 67 +++++++++++++------ .../modules/programs/qutebrowser/default.nix | 1 + .../modules/programs/qutebrowser/settings.nix | 10 +-- .../programs/qutebrowser/url-settings.nix | 58 ++++++++++++++++ 4 files changed, 111 insertions(+), 25 deletions(-) create mode 100644 tests/modules/programs/qutebrowser/url-settings.nix diff --git a/modules/programs/qutebrowser.nix b/modules/programs/qutebrowser.nix index f8dda815..6f843387 100644 --- a/modules/programs/qutebrowser.nix +++ b/modules/programs/qutebrowser.nix @@ -16,26 +16,18 @@ let cfg = config.programs.qutebrowser; - formatLine = - o: n: v: - let - formatValue = - v: - if v == null then - "None" - else if builtins.isBool v then - (if v then "True" else "False") - else if builtins.isString v then - ''"${v}"'' - else if builtins.isList v then - "[${concatStringsSep ", " (map formatValue v)}]" - else - builtins.toString v; - in - if builtins.isAttrs v then - concatStringsSep "\n" (mapAttrsToList (formatLine "${o}${n}.") v) + pythonize = + v: + if v == null then + "None" + else if builtins.isBool v then + (if v then "True" else "False") + else if builtins.isString v then + ''"${v}"'' + else if builtins.isList v then + "[${concatStringsSep ", " (map pythonize v)}]" else - "${o}${n} = ${formatValue v}"; + builtins.toString v; formatDictLine = o: n: v: @@ -55,6 +47,19 @@ let formatQuickmarks = n: s: "${n} ${s}"; + # flattenSettings attrset -> [ [ ] ] + flattenSettings = + x: + lib.collect (x: !builtins.isAttrs x) ( + lib.mapAttrsRecursive (path: value: [ + (lib.concatStringsSep "." path) + value + ]) x + ); + + configSet = l: "config.set(${lib.concatStringsSep ", " (map pythonize l)})"; + + setUrlConfig = url: conf: map (x: configSet (x ++ [ url ])) (flattenSettings conf); in { options.programs.qutebrowser = { @@ -285,6 +290,27 @@ in Extra lines added to qutebrowser {file}`config.py` file. ''; }; + + perDomainSettings = mkOption { + type = types.attrsOf types.anything; + default = { }; + description = '' + Options to set, as in `settings` but per domain. + Refer to {option}`settings` for details. + ''; + example = literalExpression '' + { + "zoom.us" = { + content = { + autoplay = true; + media.audio_capture = true; + media.video_capture = true; + }; + }; + "github.com".colors.webpage.darkmode.enabled = false; + }; + ''; + }; }; config = @@ -293,13 +319,14 @@ in [ (if cfg.loadAutoconfig then "config.load_autoconfig()" else "config.load_autoconfig(False)") ] - ++ mapAttrsToList (formatLine "c.") cfg.settings + ++ map configSet (flattenSettings cfg.settings) ++ mapAttrsToList (formatDictLine "c.aliases") cfg.aliases ++ mapAttrsToList (formatDictLine "c.url.searchengines") cfg.searchEngines ++ mapAttrsToList (formatDictLine "c.bindings.key_mappings") cfg.keyMappings ++ lib.optional (!cfg.enableDefaultBindings) "c.bindings.default = {}" ++ mapAttrsToList formatKeyBindings cfg.keyBindings ++ lib.optional (cfg.extraConfig != "") cfg.extraConfig + ++ lib.lists.flatten (mapAttrsToList setUrlConfig cfg.perDomainSettings) ); quickmarksFile = lib.optionals (cfg.quickmarks != { }) concatStringsSep "\n" ( diff --git a/tests/modules/programs/qutebrowser/default.nix b/tests/modules/programs/qutebrowser/default.nix index 20b76337..ec4105c1 100644 --- a/tests/modules/programs/qutebrowser/default.nix +++ b/tests/modules/programs/qutebrowser/default.nix @@ -3,4 +3,5 @@ qutebrowser-keybindings = ./keybindings.nix; qutebrowser-quickmarks = ./quickmarks.nix; qutebrowser-settings = ./settings.nix; + qutebrowser-url-settings = ./url-settings.nix; } diff --git a/tests/modules/programs/qutebrowser/settings.nix b/tests/modules/programs/qutebrowser/settings.nix index 86788b52..4e5968fb 100644 --- a/tests/modules/programs/qutebrowser/settings.nix +++ b/tests/modules/programs/qutebrowser/settings.nix @@ -37,11 +37,11 @@ home-files/${qutebrowserConfig} \ ${builtins.toFile "qutebrowser-expected-config.py" '' config.load_autoconfig(False) - c.colors.hints.bg = "#000000" - c.colors.hints.fg = "#ffffff" - c.colors.tabs.bar.bg = "#000000" - c.spellcheck.languages = ["en-US", "sv-SE"] - c.tabs.tabs_are_windows = True + config.set("colors.hints.bg", "#000000") + config.set("colors.hints.fg", "#ffffff") + config.set("colors.tabs.bar.bg", "#000000") + config.set("spellcheck.languages", ["en-US", "sv-SE"]) + config.set("tabs.tabs_are_windows", True) # Extra qutebrowser configuration. ''} ''; diff --git a/tests/modules/programs/qutebrowser/url-settings.nix b/tests/modules/programs/qutebrowser/url-settings.nix new file mode 100644 index 00000000..a4289276 --- /dev/null +++ b/tests/modules/programs/qutebrowser/url-settings.nix @@ -0,0 +1,58 @@ +{ pkgs, ... }: + +{ + programs.qutebrowser = { + enable = true; + + settings = { + colors = { + hints = { + bg = "#000000"; + fg = "#ffffff"; + }; + tabs.bar.bg = "#000000"; + webpage.darkmode.enabled = true; + }; + }; + + perDomainSettings = { + "zoom.us" = { + content = { + autoplay = true; + media.audio_capture = true; + media.video_capture = true; + }; + }; + "web.whatsapp.com".colors.webpage.darkmode.enabled = false; + }; + + extraConfig = '' + # Extra qutebrowser configuration. + ''; + }; + + nmt.script = + let + qutebrowserConfig = + if pkgs.stdenv.hostPlatform.isDarwin then + ".qutebrowser/config.py" + else + ".config/qutebrowser/config.py"; + in + '' + assertFileContent \ + home-files/${qutebrowserConfig} \ + ${builtins.toFile "qutebrowser-expected-config.py" '' + config.load_autoconfig(False) + config.set("colors.hints.bg", "#000000") + config.set("colors.hints.fg", "#ffffff") + config.set("colors.tabs.bar.bg", "#000000") + config.set("colors.webpage.darkmode.enabled", True) + # Extra qutebrowser configuration. + + config.set("colors.webpage.darkmode.enabled", False, "web.whatsapp.com") + config.set("content.autoplay", True, "zoom.us") + config.set("content.media.audio_capture", True, "zoom.us") + config.set("content.media.video_capture", True, "zoom.us")''} + ''; +}