diff options
Diffstat (limited to 'modules/home-manager/personal/programs/firefox')
3 files changed, 213 insertions, 0 deletions
diff --git a/modules/home-manager/personal/programs/firefox/default.nix b/modules/home-manager/personal/programs/firefox/default.nix new file mode 100644 index 0000000..1e97c40 --- /dev/null +++ b/modules/home-manager/personal/programs/firefox/default.nix @@ -0,0 +1,139 @@ +{ config, lib, pkgs, ... }: + +with lib; +let + cfg = config.personal.firefox; + userjs = pkgs.callPackage ./userjs.nix { + inherit (pkgs.personal) arkenfoxUserJS; + inherit (pkgs.lib.personal) toUserJS; + }; + engines = import ./engines.nix; + userchrome-treestyletabs = '' + /* Hide main tabs toolbar */ + #TabsToolbar { + visibility: collapse; + } + /* Sidebar min and max width removal */ + #sidebar { + max-width: none !important; + min-width: 0px !important; + } + /* Hide sidebar header, when using Tree Style Tab. */ + #sidebar-box[sidebarcommand="treestyletab_piro_sakura_ne_jp-sidebar-action"] #sidebar-header { + visibility: collapse; + } + ''; + extensions = with pkgs.personal; [ + canvasblocker + clearurls + darkreader + neat-url + redirector + smart-referer + temporary-containers + tree-style-tab + ublock-origin + unpaywall + url-in-title + ]; + webappsWithIds = (builtins.foldl' ({ counter, value }: + { name, ... }@next: { + counter = counter + 1; + value = value ++ [ + (next // { + id = counter; + profileName = lib.toLower name; + }) + ]; + }) { + counter = 0; + value = [ ]; + } cfg.webapps).value; +in { + options.personal.firefox = { + webapps = lib.mkOption { + type = with lib.types; + listOf (submodule { + options = let mkTypedOption = type: lib.mkOption { inherit type; }; + in { + name = mkTypedOption str; + genericName = mkTypedOption str // { default = ""; }; + url = mkTypedOption str; + comment = mkTypedOption str // { default = ""; }; + extraUserJS = mkTypedOption lines // { default = ""; }; + categories = mkTypedOption (listOf str) // { default = [ ]; }; + icon = mkTypedOption path; + }; + }); + default = [ ]; + }; + }; + + config = lib.mkMerge [ + { + programs.firefox.profiles = builtins.foldl' (prev: + { name, id, profileName, extraUserJS, ... }: + prev // { + "${profileName}" = { + inherit extensions; + id = id + 2; + extraConfig = userjs.streaming + extraUserJS; + }; + }) { + default = { + inherit extensions; + id = 0; # isDefault = true + + extraConfig = userjs.default; + userChrome = userchrome-treestyletabs; + search = { + force = lib.mkDefault true; + engines = { + inherit (engines) Searx; + "Bing".metaData.hidden = true; + "Google".metaData.hidden = true; + "Amazon.fr".metaData.hidden = true; + }; + default = "Searx"; + order = [ "Searx" "Wikipedia" ]; + }; + }; + + videoconferencing = { + inherit extensions; + id = 1; + + extraConfig = userjs.videoconferencing; + userChrome = userchrome-treestyletabs; + }; + } webappsWithIds; + } + + (lib.mkIf config.programs.firefox.enable { + xdg.desktopEntries = let + firefoxProfilesDir = "${config.home.homeDirectory}/.mozilla/firefox"; + firefoxInProfile = profile: + '' + ${config.programs.firefox.package}/bin/firefox --profile "${firefoxProfilesDir}/${profile}"''; + in builtins.foldl' (prev: + { name, profileName, url, genericName, icon, comment, categories, ... }: + prev // { + "${profileName}" = { + inherit name genericName icon comment categories; + exec = "${firefoxInProfile profileName} ${url}"; + }; + }) { + videoconferences = { + name = "Video Conferences"; + genericName = "Video conference"; + comment = "Use video conferencing software in a browser."; + exec = "${firefoxInProfile "videoconferencing"}"; + categories = [ "Network" "VideoConference" ]; + }; + } webappsWithIds; + + home.shellAliases.fftmp = "firefox --profile $(mktemp -d)"; + home.sessionVariables.BROWSER = "firefox"; + }) + ]; +} diff --git a/modules/home-manager/personal/programs/firefox/engines.nix b/modules/home-manager/personal/programs/firefox/engines.nix new file mode 100644 index 0000000..7ea2830 --- /dev/null +++ b/modules/home-manager/personal/programs/firefox/engines.nix @@ -0,0 +1,8 @@ +{ + Searx = { + urls = [{ template = "https://searx.aristote.fr/search?q={searchTerms}"; }]; + iconUpdateURL = + "https://searx.aristote.fr/static/themes/oscar/img/favicon.png"; + updateInterval = 24 * 60 * 60 * 1000; # every day + }; +} diff --git a/modules/home-manager/personal/programs/firefox/userjs.nix b/modules/home-manager/personal/programs/firefox/userjs.nix new file mode 100644 index 0000000..ee105b3 --- /dev/null +++ b/modules/home-manager/personal/programs/firefox/userjs.nix @@ -0,0 +1,66 @@ +{ arkenfoxUserJS, toUserJS }: + +rec { + arkenfox = builtins.readFile "${arkenfoxUserJS}"; + default = arkenfox + toUserJS { + "keyword.enabled" = true; # 0801 + "signon.rememberSignons" = false; # 0901 + "security.nocertdb" = true; # 1222 + "media.peerconnection.enabled" = false; # 2001 + "media.peerconnection.ice.no_host" = true; # 2004 + "dom.allow_cut_copy" = true; # 2404 + "dom.battery.enabled" = false; # 2502 + "permissions.default.xr" = 2; # 2521 + "privacy.clearOnShutdown.siteSettings" = true; # 2811 + + # Personal + ## Warnings + "browser.tabs.warnOnClose" = false; + "browser.tabs.warnOnCloseOtherTabs" = false; + ## Updates + "app.update.auto" = false; + "browser.search.update" = false; + ## Appearance + "toolkit.legacyUserProfileCustomizations.stylesheets" = true; + ## Content behavior + "clipboard.autocopy" = false; + ## UX behavior + "browser.quitShortcut.disabled" = true; + "browser.tabs.closeWindowWithLastTab" = false; + ## UX features + "extensions.pocket.enabled" = false; + "identity.fxaccounts.enabled" = false; + }; + + streaming = default + toUserJS { + # Widevine (DRMs) + "media.gmp-widevinecdm.enabled" = true; + "media.eme.enabled" = true; + # Cache + "browser.cache.disk.enable" = true; + "browser.cache.offline.storage" = true; + # Privacy + "privacy.clearOnShutdown.cache" = false; + "privacy.clearOnShutdown.cookies" = false; + "privacy.clearOnShutdown.siteSettings" = false; + "privacy.clearOnShutdown.offlineApps" = false; + "privacy.resistFingerprinting" = false; # Netflix is whining + }; + + videoconferencing = default + toUserJS { + # IMPORTANT: uncheck "Prevent WebRTC from leaking local IP addresses" in uBlock Origin's settings + # NOTE: if using RFP (4501) + # some sites, e.g. Zoom, need a canvas site exception [Right Click>View Page Info>Permissions] + # Discord video does not work: it thinks you are FF78: use a separate profile or spoof the user agent + "media.peerconnection.enabled" = true; + "media.peerconnection.ice.no_host" = false; # may or may not be required + "webgl.disabled" = false; # required for Zoom + "webgl.min_capability_mode" = false; + "media.getusermedia.screensharing.enabled" = true; # optional + "media.autoplay.blocking_policy" = + 0; # optional (otherwise add site exceptions) + "javascript.options.wasm" = + true; # optional (some platforms may require this) + "dom.webaudio.enabled" = true; + }; +} |
