let profile = "default"; prf = ".mozilla/firefox/${profile}"; extstorage = "${prf}/browser-extension-data"; in { config, inputs, pkgs, lib, ... }: { home-manager.users.tzlil = let firefox-addons = pkgs.callPackage (pkgs.applyPatches { src = inputs.firefox-addons; patches = [./addons-passthru.patch]; name = "firefox-addons-patched"; }) {}; mozlz4 = n: x: pkgs.runCommand "${n}.lz4" {buildInputs = [pkgs.mozlz4a];} '' mozlz4a ${pkgs.writeTextFile { name = n; text = builtins.toJSON x; }} $out ''; cfg = config.home-manager.users.tzlil.programs; addons = cfg.firefox.profiles.${profile}.extensions; extensionPath = "extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"; firefoxData = pkgs.runCommand "firefox-default-profile" { buildInputs = [ pkgs.xvfb-run (pkgs.firefox.override { extraPolicies = { Extensions.Install = map (x: x.src.outPath) addons; ExtensionSettings = { "google@search.mozilla.org" = {installation_mode = "blocked";}; "amazondotcom@search.mozilla.org" = {installation_mode = "blocked";}; "wikipedia@search.mozilla.org" = {installation_mode = "blocked";}; "bing@search.mozilla.org" = {installation_mode = "blocked";}; }; }; }) ]; } '' HOME=$(mktemp -d) export FONTCONFIG_FILE=${pkgs.makeFontsConf {fontDirectories = [pkgs.roboto];}} mkdir -p $HOME/.mozilla/firefox/ mkdir $out ln -s $out $HOME/.mozilla/firefox/default cat >> $HOME/.mozilla/firefox/profiles.ini<< EOF [Profile0] Default=1 IsRelative=1 Name=default Path=default EOF echo user_pref\(\"browser.region.network.url\", \"\"\)\; > $HOME/.mozilla/firefox/default/user.js xvfb-run firefox --screenshot about:blank --headless # cat $HOME/.mozilla/firefox/default/extensions.json > $out # ''; extensionsData = "${firefoxData}/extensions.json"; # addonStartup = builtins.fromJSON (builtins.unsafeDiscardStringContext (builtins.readFile (pkgs.runCommand "addonStartup.json" { # buildInputs = [ # pkgs.mozlz4a # pkgs.jq # ]; # } # '' # mozlz4a -d ${firefoxData}/addonStartup.json.lz4 /dev/stdout | jq . > $out # ''))); # decrappedAddonStartup = lib.attrsets.updateManyAttrsByPath [ # { # path = ["app-builtin" "addons" "google@search.mozilla.org" "enable"]; # update = old: false; # } # ] addonStartup; extensionManifest = e: builtins.fromJSON (builtins.readFile (pkgs.runCommand "${e.addonId}-manifest.json" {buildInputs = [pkgs.p7zip];} '' 7z x -so ${e.src.outPath} manifest.json > $out '')); in { # these come from the HM module home.file."${prf}/extension-preferences.json".source = pkgs.emptyFile; home.file."${prf}/extension-preferences.json.tmp".source = pkgs.emptyFile; home.file."${prf}/extension-settings.json".source = pkgs.emptyFile; home.file."${prf}/extension-settings.json.tmp".source = pkgs.emptyFile; # home.file."${prf}/search.json.mozlz4".source = pkgs.emptyFile; home.file."${prf}/search.json.mozlz4.tmp".source = pkgs.emptyFile; home.file."${prf}/extensions".source = lib.mkForce "${pkgs.symlinkJoin { name = "extensions"; paths = addons; }}/share/mozilla/${extensionPath}"; home.file."${prf}/storage".source = pkgs.emptyDirectory; home.file."${prf}/crashes".source = pkgs.emptyDirectory; home.file."${prf}/datareporting".source = pkgs.emptyDirectory; home.file."${prf}/saved-telemetry-pings".source = pkgs.emptyDirectory; # home.file."${prf}/addonStartup.json.lz4".source = mozlz4 "addonStartup.json" (lib.attrsets.updateManyAttrsByPath [ # { # path = ["app-builtin" "addons" "google@search.mozilla.org" "enable"]; # update = old: false; # } # ] addonStartup); home.file."${prf}/addonStartup.json.lz4".source = pkgs.emptyFile; home.file."${prf}/addonStartup.json.lz4.tmp".source = pkgs.emptyFile; home.file."${prf}/addons.json".source = pkgs.emptyFile; home.file."${prf}/addons.json.tmp".source = pkgs.emptyFile; home.file."${prf}/extensions.json".source = extensionsData; # home.file."${prf}/extensions.json".text = builtins.toJSON { # schemaVersion = 35; # addons = # map (x: { # active = true; # appDisabled = false; # defaultLocale = {}; # embedderDisabled = false; # foreignInstall = true; # hidden = false; # id = x.addonId; # location = "app-profile"; # manifestVersion = (extensionManifest x).manifest_version; # optionalPermissions = { # permissions = (extensionManifest x).optional_permissions or []; # origins = (extensionManifest x).optional_permissions or []; # }; # path = x.src.outPath; # rootURI = "jar:file://${x.src.outPath}!/"; # softDisabled = false; # type = "extension"; # userDisabled = false; # userPermissions = { # permissions = (extensionManifest x).permissions or []; # origins = (extensionManifest x).permissions or []; # }; # version = (extensionManifest x).version; # }) # addons; # }; home.file."${prf}/extensions.json.tmp".source = pkgs.emptyFile; # tries to access W_OK it forever # home.file."${prf}/prefs.js".source = pkgs.emptyFile; # home.file."${prf}/prefs-1.js".source = pkgs.emptyFile; programs.firefox = { enable = true; package = pkgs.firefox-wayland.override { extraPolicies = { CaptivePortal = false; DisableFirefoxStudies = true; DisablePocket = true; DisableTelemetry = true; DisableFirefoxAccounts = true; FirefoxHome = { Pocket = false; Snippets = false; }; UserMessaging = { ExtensionRecommendations = false; SkipOnboarding = true; }; SearchEngines.Default = "DuckDuckGo"; ExtensionSettings = { "google@search.mozilla.org" = {installation_mode = "blocked";}; "amazondotcom@search.mozilla.org" = {installation_mode = "blocked";}; "wikipedia@search.mozilla.org" = {installation_mode = "blocked";}; "bing@search.mozilla.org" = {installation_mode = "blocked";}; }; }; }; profiles.${profile} = { userChrome = builtins.readFile ./userChrome.css; search = { default = "DuckDuckGo"; force = true; }; extensions = with firefox-addons; [ kristofferhagen-nord-theme ublock-origin clearurls privacy-possum skip-redirect canvasblocker sidebery ]; settings = { "extensions.activeThemeID" = "{e410fec2-1cbd-4098-9944-e21e708418af}"; # (try to) hide crap "browser.search.hiddenOneOffs" = "Google,Bing,Amazon.com,eBay,Twitter,Wikipedia (en)"; "browser.newtabpage.activity-stream.showSponsored" = false; "browser.newtabpage.activity-stream.showSponsoredTopSites" = false; "services.sync.prefs.sync.browser.newtabpage.activity-stream.showSponsored" = false; "services.sync.prefs.sync.browser.newtabpage.activity-stream.showSponsoredTopSites" = false; "browser.newtabpage.activity-stream.default.sites" = ""; "browser.urlbar.suggest.topsites" = false; "browser.newtabpage.activity-stream.feeds.topsites" = false; # disable welcome page "browser.aboutwelcome.enabled" = false; # disable privacy notice "datareporting.policy.firstRunURL" = ""; # "browser.newtabpage.activity-stream.aboutHome.enabled" = false; }; # extraConfig = { # }; }; }; }; }