summaryrefslogtreecommitdiff
path: root/modules/home-manager/personal/programs/firefox
diff options
context:
space:
mode:
Diffstat (limited to 'modules/home-manager/personal/programs/firefox')
-rw-r--r--modules/home-manager/personal/programs/firefox/default.nix139
-rw-r--r--modules/home-manager/personal/programs/firefox/engines.nix8
-rw-r--r--modules/home-manager/personal/programs/firefox/userjs.nix66
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;
+ };
+}