From 0ee8bfdd04de611a93cf57dda01686b613cc587d Mon Sep 17 00:00:00 2001 From: Danil Suetin Date: Thu, 11 Jul 2024 14:27:27 +0200 Subject: [PATCH] firefox: add preConfig Add `preConfig`, which acts like `extraConfig`, but placed before `settings`. This will allow to overwrite settings in `preConfig`, using `settings` option. --- modules/misc/news.nix | 13 ++++++ modules/programs/firefox/mkFirefoxModule.nix | 27 +++++++++--- tests/modules/programs/firefox/common.nix | 1 + .../bookmarks/expected-bookmarks-user.js | 2 + .../firefox/profiles/overwrite/default.nix | 43 +++++++++++++++++++ .../profiles/overwrite/expected-user.js | 10 +++++ .../profiles/settings/expected-user.js | 2 + 7 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 tests/modules/programs/firefox/profiles/overwrite/default.nix create mode 100644 tests/modules/programs/firefox/profiles/overwrite/expected-user.js diff --git a/modules/misc/news.nix b/modules/misc/news.nix index c578d2378..bff39c119 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -1972,6 +1972,19 @@ in { 'yazi' alias. ''; } + + { + time = "2025-01-29T17:34:53+00:00"; + condition = config.programs.firefox.enable; + message = '' + The Firefox module now provides a + 'programs.firefox.profiles..preConfig' option. + + It allows extra preferences to be added to 'user.js' before the + options specified in 'programs.firefox.profiles..settings', so + that they can be overwritten. + ''; + } ]; }; } diff --git a/modules/programs/firefox/mkFirefoxModule.nix b/modules/programs/firefox/mkFirefoxModule.nix index 2a0c521fb..66f1729b2 100644 --- a/modules/programs/firefox/mkFirefoxModule.nix +++ b/modules/programs/firefox/mkFirefoxModule.nix @@ -75,7 +75,7 @@ let else builtins.toJSON pref); - mkUserJs = prefs: extraPrefs: bookmarks: + mkUserJs = prePrefs: prefs: extraPrefs: bookmarks: let prefs' = lib.optionalAttrs ([ ] != bookmarks) { "browser.bookmarks.file" = toString (browserBookmarksFile bookmarks); @@ -84,6 +84,8 @@ let in '' // Generated by Home Manager. + ${prePrefs} + ${concatStrings (mapAttrsToList (name: value: '' user_pref("${name}", ${userPrefValue value}); '') prefs')} @@ -369,6 +371,20 @@ in { ''; }; + preConfig = mkOption { + type = types.lines; + default = ""; + description = '' + Extra preferences to add to {file}`user.js`, before + [](#opt-programs.firefox.profiles._name_.settings). + + Use [](#opt-programs.firefox.profiles._name_.extraConfig), unless + you want to overwrite in + [](#opt-programs.firefox.profiles._name_.settings), then use this + option. + ''; + }; + settings = mkOption { type = types.attrsOf (jsonFormat.type // { description = @@ -768,10 +784,11 @@ in { "${profilesPath}/${profile.path}/chrome/userContent.css" = mkIf (profile.userContent != "") { text = profile.userContent; }; - "${profilesPath}/${profile.path}/user.js" = mkIf (profile.settings != { } - || profile.extraConfig != "" || profile.bookmarks != [ ]) { - text = - mkUserJs profile.settings profile.extraConfig profile.bookmarks; + "${profilesPath}/${profile.path}/user.js" = mkIf (profile.preConfig != "" + || profile.settings != { } || profile.extraConfig != "" + || profile.bookmarks != [ ]) { + text = mkUserJs profile.preConfig profile.settings profile.extraConfig + profile.bookmarks; }; "${profilesPath}/${profile.path}/containers.json" = diff --git a/tests/modules/programs/firefox/common.nix b/tests/modules/programs/firefox/common.nix index b0aef1931..c92db1e4c 100644 --- a/tests/modules/programs/firefox/common.nix +++ b/tests/modules/programs/firefox/common.nix @@ -10,6 +10,7 @@ builtins.mapAttrs (test: module: import module [ "programs" name ]) { "${name}-profiles-containers-id-out-of-range" = ./profiles/containers/id-out-of-range.nix; "${name}-profiles-duplicate-ids" = ./profiles/duplicate-ids.nix; + "${name}-profiles-overwrite" = ./profiles/overwrite; "${name}-profiles-search" = ./profiles/search; "${name}-profiles-settings" = ./profiles/settings; "${name}-state-version-19_09" = ./state-version-19_09.nix; diff --git a/tests/modules/programs/firefox/profiles/bookmarks/expected-bookmarks-user.js b/tests/modules/programs/firefox/profiles/bookmarks/expected-bookmarks-user.js index 47448a6e4..d36dccfdf 100644 --- a/tests/modules/programs/firefox/profiles/bookmarks/expected-bookmarks-user.js +++ b/tests/modules/programs/firefox/profiles/bookmarks/expected-bookmarks-user.js @@ -1,5 +1,7 @@ // Generated by Home Manager. + + user_pref("browser.bookmarks.file", "/nix/store/00000000000000000000000000000000-@name@-bookmarks.html"); user_pref("browser.places.importBookmarksHTML", true); user_pref("general.smoothScroll", false); diff --git a/tests/modules/programs/firefox/profiles/overwrite/default.nix b/tests/modules/programs/firefox/profiles/overwrite/default.nix new file mode 100644 index 000000000..a0881032a --- /dev/null +++ b/tests/modules/programs/firefox/profiles/overwrite/default.nix @@ -0,0 +1,43 @@ +modulePath: +{ config, lib, pkgs, ... }: + +with lib; + +let + + cfg = getAttrFromPath modulePath config; + + firefoxMockOverlay = import ../../setup-firefox-mock-overlay.nix modulePath; + +in { + imports = [ firefoxMockOverlay ]; + + config = mkIf config.test.enableBig (setAttrByPath modulePath { + enable = true; + profiles = { + basic.isDefault = true; + test = { + id = 6; + preConfig = '' + user_pref("browser.search.suggest.enabled", false); + ''; + settings = { "browser.search.suggest.enabled" = true; }; + extraConfig = '' + user_pref("findbar.highlightAll", true); + ''; + }; + }; + } // { + nmt.script = '' + assertFileRegex \ + home-path/bin/${cfg.wrappedPackageName} \ + MOZ_APP_LAUNCHER + + assertDirectoryExists home-files/${cfg.configPath}/basic + + assertFileContent \ + home-files/${cfg.configPath}/test/user.js \ + ${./expected-user.js} + ''; + }); +} diff --git a/tests/modules/programs/firefox/profiles/overwrite/expected-user.js b/tests/modules/programs/firefox/profiles/overwrite/expected-user.js new file mode 100644 index 000000000..cbcc5f262 --- /dev/null +++ b/tests/modules/programs/firefox/profiles/overwrite/expected-user.js @@ -0,0 +1,10 @@ +// Generated by Home Manager. + +user_pref("browser.search.suggest.enabled", false); + + +user_pref("browser.search.suggest.enabled", true); + + +user_pref("findbar.highlightAll", true); + diff --git a/tests/modules/programs/firefox/profiles/settings/expected-user.js b/tests/modules/programs/firefox/profiles/settings/expected-user.js index d929df2b3..8118d73bf 100644 --- a/tests/modules/programs/firefox/profiles/settings/expected-user.js +++ b/tests/modules/programs/firefox/profiles/settings/expected-user.js @@ -1,5 +1,7 @@ // Generated by Home Manager. + + user_pref("browser.newtabpage.pinned", "[{\"title\":\"NixOS\",\"url\":\"https://nixos.org\"}]"); user_pref("general.smoothScroll", false);