diff --git a/modules/programs/firefox/mkFirefoxModule.nix b/modules/programs/firefox/mkFirefoxModule.nix index f95faec41..307d39305 100644 --- a/modules/programs/firefox/mkFirefoxModule.nix +++ b/modules/programs/firefox/mkFirefoxModule.nix @@ -84,6 +84,10 @@ let extensionSettingsNeedForce = extensionSettings: builtins.any (ext: ext.settings != { }) (attrValues extensionSettings); + extensionSettingsMissingForce = + extensionSettings: + builtins.any (ext: ext.settings != { } && !ext.force) (attrValues extensionSettings); + mkUserJs = prePrefs: prefs: extraPrefs: bookmarksFile: extensions: let @@ -836,11 +840,13 @@ in assertions = [ (mkNoDuplicateAssertion config.containers "container") { - assertion = !(extensionSettingsNeedForce config.extensions.settings) || config.extensions.force; + assertion = !(extensionSettingsMissingForce config.extensions.settings) || config.extensions.force; message = '' Using '${lib.showOption profilePath}.extensions.settings' will override all - previous extensions settings. Enable - '${lib.showOption profilePath}.extensions.force' to acknowledge this. + previous extensions settings. Enable either + '${lib.showOption profilePath}.extensions.force' or the corresponding + '${lib.showOption profilePath}.extensions.settings..force' + to acknowledge this. ''; } ] diff --git a/tests/modules/programs/firefox/common.nix b/tests/modules/programs/firefox/common.nix index 46663547d..0952eb483 100644 --- a/tests/modules/programs/firefox/common.nix +++ b/tests/modules/programs/firefox/common.nix @@ -33,6 +33,9 @@ builtins.mapAttrs "${name}-profiles-extensions" = ./profiles/extensions; "${name}-profiles-extensions-assertions" = ./profiles/extensions/assertions.nix; "${name}-profiles-extensions-extensible" = ./profiles/extensions/extensible.nix; + "${name}-profiles-extensions-per-extension-force" = ./profiles/extensions/per-extension-force.nix; + "${name}-profiles-extensions-per-extension-force-assertions" = + ./profiles/extensions/per-extension-force-assertions.nix; "${name}-profiles-extensions-exhaustive" = ./profiles/extensions/exhaustive.nix; "${name}-profiles-extensions-exact" = ./profiles/extensions/exact.nix; "${name}-profiles-handlers" = ./profiles/handlers; diff --git a/tests/modules/programs/firefox/profiles/extensions/assertions.nix b/tests/modules/programs/firefox/profiles/extensions/assertions.nix index fe5aab78c..5485837d5 100644 --- a/tests/modules/programs/firefox/profiles/extensions/assertions.nix +++ b/tests/modules/programs/firefox/profiles/extensions/assertions.nix @@ -55,8 +55,10 @@ in test.asserts.assertions.expected = [ '' Using '${lib.showOption modulePath}.profiles.extensions.extensions.settings' will override all - previous extensions settings. Enable - '${lib.showOption modulePath}.profiles.extensions.extensions.force' to acknowledge this. + previous extensions settings. Enable either + '${lib.showOption modulePath}.profiles.extensions.extensions.force' or the corresponding + '${lib.showOption modulePath}.profiles.extensions.extensions.settings..force' + to acknowledge this. '' '' Extension uBlock0@raymondhill.net requests permissions that weren't diff --git a/tests/modules/programs/firefox/profiles/extensions/per-extension-force-assertions.nix b/tests/modules/programs/firefox/profiles/extensions/per-extension-force-assertions.nix new file mode 100644 index 000000000..9e8c5e4ad --- /dev/null +++ b/tests/modules/programs/firefox/profiles/extensions/per-extension-force-assertions.nix @@ -0,0 +1,35 @@ +modulePath: +{ config, lib, ... }: + +let + firefoxMockOverlay = import ../../setup-firefox-mock-overlay.nix modulePath; +in +{ + imports = [ firefoxMockOverlay ]; + + config = lib.mkIf config.test.enableBig ( + lib.setAttrByPath modulePath { + enable = true; + profiles.extensions = { + extensions.settings = { + "forced@example.com" = { + force = true; + settings.enabled = true; + }; + "unforced@example.com".settings.enabled = true; + }; + }; + } + // { + test.asserts.assertions.expected = [ + '' + Using '${lib.showOption modulePath}.profiles.extensions.extensions.settings' will override all + previous extensions settings. Enable either + '${lib.showOption modulePath}.profiles.extensions.extensions.force' or the corresponding + '${lib.showOption modulePath}.profiles.extensions.extensions.settings..force' + to acknowledge this. + '' + ]; + } + ); +} diff --git a/tests/modules/programs/firefox/profiles/extensions/per-extension-force.nix b/tests/modules/programs/firefox/profiles/extensions/per-extension-force.nix new file mode 100644 index 000000000..fd05b26b1 --- /dev/null +++ b/tests/modules/programs/firefox/profiles/extensions/per-extension-force.nix @@ -0,0 +1,42 @@ +modulePath: +{ config, lib, ... }: + +let + cfg = lib.getAttrFromPath modulePath config; + + firefoxMockOverlay = import ../../setup-firefox-mock-overlay.nix modulePath; +in +{ + imports = [ firefoxMockOverlay ]; + + config = lib.mkIf config.test.enableBig ( + lib.setAttrByPath modulePath { + enable = true; + profiles.extensions = { + extensions.settings."uBlock0@raymondhill.net" = { + force = true; + settings = { + selectedFilterLists = [ + "ublock-filters" + "ublock-badware" + "ublock-privacy" + "ublock-unbreak" + "ublock-quick-fixes" + ]; + }; + }; + }; + } + // { + nmt.script = '' + assertFileContent \ + "home-files/${cfg.profilesPath}/extensions/browser-extension-data/uBlock0@raymondhill.net/storage.js" \ + ${./expected-storage.js} + + assertFileContent \ + "home-files/${cfg.profilesPath}/extensions/user.js" \ + ${./expected-user.js} + ''; + } + ); +}