{ config, inputs, pkgs, lib, allHosts, ... }: let cfg = config.custom.programs.firefox; firefoxAddons = (import inputs.nixpkgs { inherit (pkgs.stdenv.hostPlatform) system; config.allowUnfree = true; overlays = [ inputs.firefox-addons.overlays.default ]; }).firefox-addons; mkExtension = { name, uuid, defaultArea, ... }: { name = uuid; value = { install_url = "file:///${firefoxAddons.${name}}/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/${uuid}.xpi"; installation_mode = "force_installed"; default_area = defaultArea; }; }; in { options.custom.programs.firefox = { enable = lib.mkEnableOption ""; homepage = lib.mkOption { type = lib.types.nullOr lib.types.nonEmptyStr; default = allHosts |> lib.attrValues |> lib.map (host: host.config.custom.web-services.glance) |> lib.filter (glance: glance.enable) |> lib.map (glance: glance.domain) |> (domains: if (lib.length domains != 0) then domains |> lib.head else null); }; searchEngine = lib.mkOption { type = lib.types.nullOr lib.types.nonEmptyStr; default = allHosts |> lib.attrValues |> lib.map (host: host.config.custom.web-services.searxng) |> lib.filter (searxng: searxng.enable) |> lib.map (searxng: searxng.domain) |> (domains: if (lib.length domains != 0) then domains |> lib.head else null); }; extensions = lib.mkOption { type = lib.types.attrsOf ( lib.types.submodule ( { name, ... }: { options = { enable = lib.mkEnableOption "" // { default = true; }; name = lib.mkOption { type = lib.types.nonEmptyStr; default = name; }; uuid = lib.mkOption { type = lib.types.nonEmptyStr; default = ""; }; defaultArea = lib.mkOption { type = lib.types.enum [ "menupanel" "navbar" ]; default = "menupanel"; }; }; } ) ); default = { }; }; }; config = lib.mkIf cfg.enable { custom.programs.firefox.extensions = { dictionary-german.uuid = "de-DE@dictionaries.addons.mozilla.org"; ublock-origin.uuid = "uBlock0@raymondhill.net"; bitwarden.uuid = "{446900e4-71c2-419f-a6a7-df9c091e268b}"; return-youtube-dislikes.uuid = "{762f9885-5a13-4abd-9c77-433dcd38b8fd}"; sponsorblock.uuid = "sponsorBlocker@ajay.app"; clearurls.uuid = "{74145f27-f039-47ce-a470-a662b129930a}"; languagetool.uuid = "languagetool-webextension@languagetool.org"; karakeep = { uuid = "addon@karakeep.app"; defaultArea = "navbar"; }; }; programs.firefox = { enable = true; profiles.default = { settings = let uiState = ''{"placements":{"widget-overflow-fixed-list":[],"unified-extensions-area":["sponsorblocker_ajay_app-browser-action","_762f9885-5a13-4abd-9c77-433dcd38b8fd_-browser-action","_446900e4-71c2-419f-a6a7-df9c091e268b_-browser-action","_74145f27-f039-47ce-a470-a662b129930a_-browser-action","ublock0_raymondhill_net-browser-action"],"nav-bar":["back-button","forward-button","stop-reload-button","customizableui-special-spring1","urlbar-container","customizableui-special-spring2","save-to-pocket-button","downloads-button","fxa-toolbar-menu-button","unified-extensions-button","sidebar-button"],"toolbar-menubar":["menubar-items"],"TabsToolbar":["firefox-view-button","tabbrowser-tabs","new-tab-button","alltabs-button"],"PersonalToolbar":["personal-bookmarks"]},"seen":["developer-button","sponsorblocker_ajay_app-browser-action","_762f9885-5a13-4abd-9c77-433dcd38b8fd_-browser-action","_446900e4-71c2-419f-a6a7-df9c091e268b_-browser-action","_74145f27-f039-47ce-a470-a662b129930a_-browser-action","ublock0_raymondhill_net-browser-action"],"dirtyAreaCache":["nav-bar","unified-extensions-area","PersonalToolbar","TabsToolbar","toolbar-menubar"],"currentVersion":20,"newElementCount":5}''; in { "intl.accept_languages" = "en-us,en,de-de,de"; "browser.uiCustomization.state" = uiState; "browser.startup.homepage" = lib.mkIf (cfg.homepage != null) cfg.homepage; "sidebar.position_start" = false; "browser.bookmarks.restore_default_bookmarks" = false; "browser.bookmarks.file" = ""; "media.videocontrols.picture-in-picture.video-toggle.enabled" = false; "general.autoScroll" = true; "middlemouse.paste" = false; "signon.rememberSignons" = false; "extensions.formautofill.creditCards.enabled" = false; "browser.tabs.loadBookmarksInBackground" = true; "browser.tabs.groups.enabled" = true; "browser.uidensity" = 1; "sidebar.revamp" = false; "media.eme.enabled" = true; }; extraConfig = lib.readFile "${inputs.betterfox}/user.js"; search = lib.mkIf (cfg.searchEngine != null) { force = true; default = "searxng"; privateDefault = "searxng"; engines.searxng = { name = "searxng"; urls = lib.singleton { template = "https://${cfg.searchEngine}/search?q={searchTerms}"; }; }; }; }; policies.ExtensionSettings = ( cfg.extensions |> lib.attrValues |> lib.filter ({ enable, ... }: enable) |> lib.map mkExtension |> lib.listToAttrs ) // { "*".installation_mode = "blocked"; }; }; }; }