aboutsummaryrefslogtreecommitdiffstats
path: root/home-manager/soispha/config/firefox
diff options
context:
space:
mode:
authorSoispha <soispha@vhack.eu>2023-08-01 15:31:42 +0200
committerSoispha <soispha@vhack.eu>2023-08-01 15:42:54 +0200
commit0a608bd781dcda40144097b007fac0a0c60a8ee1 (patch)
treee69fbc1fd0e15e3b86f31f47b776df21f6f0170d /home-manager/soispha/config/firefox
parentFix(hm/conf/gammastep): Use lighter settings on laptops (diff)
downloadnixos-config-0a608bd781dcda40144097b007fac0a0c60a8ee1.zip
Refactor(treewide): Move module configuration in separate files
Diffstat (limited to 'home-manager/soispha/config/firefox')
-rw-r--r--home-manager/soispha/config/firefox/config/bookmarks/default.nix26
-rw-r--r--home-manager/soispha/config/firefox/config/chrome/userChrome.css41
-rw-r--r--home-manager/soispha/config/firefox/config/extensions/extensions.json51
-rw-r--r--home-manager/soispha/config/firefox/config/prefs/default.nix23
-rw-r--r--home-manager/soispha/config/firefox/config/prefs/override.js191
-rw-r--r--home-manager/soispha/config/firefox/config/search/engines/default.nix59
-rw-r--r--home-manager/soispha/config/firefox/default.nix65
-rw-r--r--home-manager/soispha/config/firefox/functions/bookmarks/default.nix49
-rw-r--r--home-manager/soispha/config/firefox/functions/extensions/default.nix25
-rw-r--r--home-manager/soispha/config/firefox/functions/extensions/video-pauser.nix30
-rwxr-xr-xhome-manager/soispha/config/firefox/scripts/unzip_mozlz4.py43
-rwxr-xr-xhome-manager/soispha/config/firefox/scripts/update_extensions22
12 files changed, 625 insertions, 0 deletions
diff --git a/home-manager/soispha/config/firefox/config/bookmarks/default.nix b/home-manager/soispha/config/firefox/config/bookmarks/default.nix
new file mode 100644
index 00000000..4de83ac9
--- /dev/null
+++ b/home-manager/soispha/config/firefox/config/bookmarks/default.nix
@@ -0,0 +1,26 @@
+[
+ {
+ name = "Feed - Piped";
+ url = "https://piped.video/feed";
+ }
+
+ {
+ name = "DeepL Translate";
+ url = "https://www.deepl.com/translator";
+ }
+
+ {
+ name = "HM Options";
+ url = "https://mipmip.github.io/home-manager-option-search/";
+ }
+
+ {
+ name = "Nix lib";
+ url = "https://teu5us.github.io/nix-lib.html";
+ }
+
+ {
+ name = "Nixpkgs manual";
+ url = "https://ryantm.github.io/nixpkgs/";
+ }
+]
diff --git a/home-manager/soispha/config/firefox/config/chrome/userChrome.css b/home-manager/soispha/config/firefox/config/chrome/userChrome.css
new file mode 100644
index 00000000..0b3aff77
--- /dev/null
+++ b/home-manager/soispha/config/firefox/config/chrome/userChrome.css
@@ -0,0 +1,41 @@
+/* thickness of tab when you have too many open tabs */
+.tabbrowser-tab:not([pinned="true"]) {
+ min-width: 10px !important;
+ min-height: 10px !important;
+}
+
+/* tab height
+#TabsToolbar .tabbrowser-tabs {
+min-height: 10px !important;
+}
+*/
+
+/*
+.tabbrowser-tab {min-width: 016px !important;}
+.tabbrowser-tab {clip-width: 016px !important;}
+*/
+
+/* the + button that opens new tabs */
+#TabsToolbar .tabs-newtab-button {
+ margin-left: 10px !important;
+ height: Auto !important;
+}
+
+#main-window[privatebrowsingmode="temporary"] #navigator-toolbox {
+ background-color: #c40944 !important;
+}
+
+/* close button inside a tab */
+.tab-close-button * {
+ width: 10px !important;
+ height: 10px !important;
+}
+
+/* bookmark toolbar */
+#personal-bookmarks .bookmark-item > .toolbarbutton-text {
+ font-size: 10pt !important;
+}
+#personal-bookmarks .bookmark-item > .toolbarbutton-icon {
+ height: 12px !important;
+ width: 12px !important;
+}
diff --git a/home-manager/soispha/config/firefox/config/extensions/extensions.json b/home-manager/soispha/config/firefox/config/extensions/extensions.json
new file mode 100644
index 00000000..735ef932
--- /dev/null
+++ b/home-manager/soispha/config/firefox/config/extensions/extensions.json
@@ -0,0 +1,51 @@
+{
+ "darkreader": {
+ "addonId": "addon@darkreader.org",
+ "pname": "darkreader",
+ "sha256": "sha256:c09ed43a96dccab1de3445aac263de0569e3333da330d645094e3f938f13b30e",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/4128489/darkreader-4.9.64.xpi",
+ "version": "4.9.64"
+ },
+ "keepassxc-browser": {
+ "addonId": "keepassxc-browser@keepassxc.org",
+ "pname": "keepassxc-browser",
+ "sha256": "sha256:deb1c3c29fabe90dd811536d434d64c200caab9a9f7febc3428aa170eefec5f2",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/4134768/keepassxc_browser-1.8.7.xpi",
+ "version": "1.8.7"
+ },
+ "libredirect": {
+ "addonId": "7esoorv3@alefvanoon.anonaddy.me",
+ "pname": "libredirect",
+ "sha256": "sha256:564e56e1ccccf2f445b6cb9485c602609589a23052d2a53ab491cbce51c6b42f",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/4144580/libredirect-2.7.1.xpi",
+ "version": "2.7.1"
+ },
+ "simple-tab-groups": {
+ "addonId": "simple-tab-groups@drive4ik",
+ "pname": "simple-tab-groups",
+ "sha256": "sha256:b56f30cea753a9c4d1c0e078c0e5e635f1885ea7e40305cee59b9e145fad0a6c",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/4103800/simple_tab_groups-5.2.xpi",
+ "version": "5.2"
+ },
+ "tridactyl-vim": {
+ "addonId": "tridactyl.vim@cmcaine.co.uk",
+ "pname": "tridactyl-vim",
+ "sha256": "sha256:08b7af97bef05300ab3ac3ad721322ff00505631233482568fc4489c16d51b71",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/4036604/tridactyl_vim-1.23.0.xpi",
+ "version": "1.23.0"
+ },
+ "ublock-origin": {
+ "addonId": "uBlock0@raymondhill.net",
+ "pname": "ublock-origin",
+ "sha256": "sha256:8b73468bc233a11dd2895219466381783d19123857dd0b6fd16a01820fca4834",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/4141256/ublock_origin-1.51.0.xpi",
+ "version": "1.51.0"
+ },
+ "video-pauser": {
+ "addonId": "video-pauser@addons.vhack.eu",
+ "pname": "video-pauser",
+ "sha256": "sha256:da02e29f1d50d3a6db8a28bb7972afaeaa788bb8d38a2e9ebbfcd73d65d84841",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/4098103/video_pauser-0.1.0.xpi",
+ "version": "0.1.0"
+ }
+}
diff --git a/home-manager/soispha/config/firefox/config/prefs/default.nix b/home-manager/soispha/config/firefox/config/prefs/default.nix
new file mode 100644
index 00000000..e0e72cf9
--- /dev/null
+++ b/home-manager/soispha/config/firefox/config/prefs/default.nix
@@ -0,0 +1,23 @@
+{
+ pkgs,
+ config,
+ user_js,
+ lib,
+ ...
+}: let
+ bookmarks = import ../bookmarks;
+ firefoxBookmarksFile = (import ../../functions/bookmarks) {inherit lib pkgs;};
+ user_js_override = pkgs.writeText "user.override.js" (builtins.readFile ./override.js);
+in
+ pkgs.runCommand "user.js" {} ''
+ mkdir $out;
+ cat "${user_js}/user.js" > $out/user.js;
+ cat "${user_js_override}" >> $out/user.js;
+
+ cat << EOF >> $out/user.js;
+ // My bookmarks
+ user_pref("browser.bookmarks.file", "${toString (firefoxBookmarksFile bookmarks)}");
+ user_pref("browser.startup.homepage", "file:///home/dt/home.html"); // 0103 // TODO add this from a flake
+ user_pref("browser.download.dir", "${config.home.homeDirectory}/media/downloads");
+ EOF
+ ''
diff --git a/home-manager/soispha/config/firefox/config/prefs/override.js b/home-manager/soispha/config/firefox/config/prefs/override.js
new file mode 100644
index 00000000..7e63e532
--- /dev/null
+++ b/home-manager/soispha/config/firefox/config/prefs/override.js
@@ -0,0 +1,191 @@
+/*
+ 0100: STARTUP
+ 0200: GEOLOCATION / LANGUAGE / LOCALE
+ 0300: QUIETER FOX
+ 0400: SAFE BROWSING
+ 0600: BLOCK IMPLICIT OUTBOUND
+ 0700: DNS / DoH / PROXY / SOCKS / IPv6
+ 0800: LOCATION BAR / SEARCH BAR / SUGGESTIONS / HISTORY / FORMS
+ 0900: PASSWORDS
+ 1000: DISK AVOIDANCE
+ 1200: HTTPS (SSL/TLS / OCSP / CERTS / HPKP)
+ 1400: FONTS
+ 1600: HEADERS / REFERERS
+ 1700: CONTAINERS
+ 2000: PLUGINS / MEDIA / WEBRTC
+ 2400: DOM (DOCUMENT OBJECT MODEL)
+ 2600: MISCELLANEOUS
+ 2700: ETP (ENHANCED TRACKING PROTECTION)
+ 2800: SHUTDOWN & SANITIZING
+ 4500: RFP (RESIST FINGERPRINTING)
+ 5000: OPTIONAL OPSEC
+ 5500: OPTIONAL HARDENING
+ 6000: DON'T TOUCH
+ 7000: DON'T BOTHER
+ 8000: DON'T BOTHER: FINGERPRINTING
+ 9000: NON-PROJECT RELATED
+ 9999: DEPRECATED / REMOVED / LEGACY / RENAMED
+*/
+
+
+// restore session
+user_pref("browser.startup.page", 3); // 0102
+
+user_pref("browser.newtabpage.enabled", true); // 0104
+
+// disable the geoservice, TODO don't know if I want this
+//user_pref("geo.provider.use_geoclue", false); // 0202
+
+// TODO is this something useful?
+user_pref("datareporting.policy.dataSubmissionEnabled", true); // 0330
+
+// enable health reports
+user_pref("datareporting.healthreport.uploadEnabled", true); // 0331
+
+// Do I want to opt-out?
+user_pref("toolkit.telemetry.coverage.opt-out", false); // 0333
+
+// enables studies
+user_pref("app.shield.optoutstudies.enabled", true); // 0340
+
+// I guess that browsing protection is useful
+user_pref("browser.safebrowsing.downloads.remote.enabled", true); // 0403
+
+// TODO does this (-> set to false) make things slower?
+user_pref("network.prefetch-next", true); // 0601
+
+// enable ipv6 because the rest of the system uses it
+user_pref("network.dns.disableIPv6", false); // 0701
+
+// TRR only
+user_pref("network.trr.mode", 3); // 0710
+
+// I trust my search engine
+user_pref("keyword.enabled", true); // 801
+user_pref("browser.search.suggest.enabled", true); // 0804
+user_pref("browser.urlbar.suggest.searches", true); // 0804
+// TODO no idea what this does, enabling it
+user_pref("browser.urlbar.showSearchTerms.enabled", true); // 9004
+
+// prefetch urls, if the get auto completed
+user_pref("browser.urlbar.speculativeConnect.enabled", true); // 0805
+
+// Disable autoScrolling (clicking with the mouse wheel)
+user_pref("general.autoScroll", false);
+
+// add new tabs after the current one
+user_pref("browser.tabs.insertAfterCurrent", true);
+
+// TODO I might want to enable this
+//user_pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false); // 0807
+
+// TODO enable form and search history?
+//user_pref("browser.formfill.enable", false); // 0810
+
+// disk cache should help performance
+user_pref("browser.cache.disk.enable", true); // 1001
+
+// store extra session data (form content, cookies and POST data) 0: everywhere
+user_pref("browser.sessionstore.privacy_level", 0); // 1003
+
+// Disable unsafe passive content (images) on https sites
+user_pref("security.mixed_content.block_display_content", true); // 1241
+
+// Disable the eme banner
+user_pref("browser.eme.ui.enabled", false); // 2022
+
+// Don't delete my precious temp files
+user_pref("browser.helperApps.deleteTempFileOnExit", false); // 2603
+
+// Download to the download dir
+user_pref("browser.download.useDownloadDir", true); // 2651
+
+// Open the download panel
+user_pref("browser.download.alwaysOpenPanel", true); // 2652
+
+// Block after custom ruleset
+user_pref("browser.contentblocking.category", "custom"); // 2701
+
+// set the custom settings // 7016
+user_pref("network.cookie.cookieBehavior", 1);
+user_pref("network.http.referer.disallowCrossSiteRelaxingDefault", true);
+user_pref("network.http.referer.disallowCrossSiteRelaxingDefault.top_navigation", true);
+user_pref("privacy.partition.network_state.ocsp_cache", true);
+user_pref("privacy.query_stripping.enabled", true);
+user_pref("privacy.trackingprotection.enabled", true);
+user_pref("privacy.trackingprotection.socialtracking.enabled", true);
+user_pref("privacy.trackingprotection.cryptomining.enabled", true);
+user_pref("privacy.trackingprotection.fingerprinting.enabled", true);
+
+
+// I might want to change that, when it hinders session restore
+//user_pref("privacy.partition.always_partition_third_party_non_cookie_storage.exempt_sessionstorage", false); // 2720
+
+// I like my history very much!
+user_pref("privacy.sanitize.sanitizeOnShutdown", false); // 2810
+
+// The downsides (light theme + potential breakages):
+//user_pref("privacy.resistFingerprinting", true); // 4501
+user_pref("privacy.resistFingerprinting.letterboxing", false); // 4504
+
+// I would like to keep my gl, even in the web
+user_pref("webgl.disabled", false); // 4520
+
+// I like my service workers and am using a service using them.
+user_pref("dom.serviceWorkers.enabled", true); // 7017
+
+// I've got a password manager already
+user_pref("signon.rememberSignons", false); // 5003
+
+// Do not track header
+user_pref("privacy.donottrackheader.enabled", true); // 7015
+
+// Allow my custom css
+user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true);
+
+// might improve performance TODO
+user_pref("gfx.webrender.all", true);
+
+// disable updates (pretty pointless with nix)
+user_pref("extensions.update.autoUpdateDefault", false);
+user_pref("extensions.update.enabled", false);
+user_pref("app.update.channel", "default");
+
+user_pref("browser.ctrlTab.recentlyUsedOrder", false);
+
+user_pref("browser.download.useDownloadDir", true);
+user_pref("browser.download.folderList", 2); # TODO
+user_pref("browser.download.viewableInternally.typeWasRegistered.svg", true);
+user_pref("browser.download.viewableInternally.typeWasRegistered.webp", true);
+user_pref("browser.download.viewableInternally.typeWasRegistered.xml", true);
+
+// TODO what does this do?
+user_pref("browser.search.widget.inNavBar", true);
+
+user_pref("browser.shell.checkDefaultBrowser", false);
+user_pref("browser.tabs.loadInBackground", true);
+user_pref("browser.urlbar.placeholderName", "Brave");
+
+// Set the tabs and bookmarks
+user_pref("browser.tabs.inTitlebar", 1);
+user_pref("browser.toolbars.bookmarks.visibility", "always");
+user_pref("browser.places.importBookmarksHTML", true);
+
+// Theme
+user_pref("extensions.activeThemeID", "firefox-alpenglow@mozilla.org");
+user_pref("extensions.extensions.activeThemeID", "firefox-alpenglow@mozilla.org");
+
+// highlight all entries when searching
+user_pref("findbar.highlightAll", true);
+
+// TODO
+//user_pref("extensions.webcompat.enable_picture_in_picture_overrides", true);
+//user_pref("extensions.webcompat.enable_shims", true);
+//user_pref("extensions.webcompat.perform_injections", true);
+//user_pref("extensions.webcompat.perform_ua_overrides", true);
+
+// onlykey / copied from a yubikey config
+//user_pref("security.webauth.u2f", true);
+//user_pref("security.webauth.webauthn", true);
+//user_pref("security.webauth.webauthn_enable_softtoken", true);
+//user_pref("security.webauth.webauthn_enable_usbtoken", true);
diff --git a/home-manager/soispha/config/firefox/config/search/engines/default.nix b/home-manager/soispha/config/firefox/config/search/engines/default.nix
new file mode 100644
index 00000000..286d7247
--- /dev/null
+++ b/home-manager/soispha/config/firefox/config/search/engines/default.nix
@@ -0,0 +1,59 @@
+{pkgs, ...}: {
+ "Brave Search" = {
+ urls = [{template = "https://search.brave.com/search?q={searchTerms}";}];
+ IconUpdateURL = "https://raw.githubusercontent.com/brave/brave-core/master/components/brave_welcome_ui/components/images/lion_logo.svg";
+ updateInterval = 24; # every day
+ definedAliases = ["@bs"];
+ };
+
+ # NIX
+ "Nix Packages" = {
+ urls = [{template = "https://search.nixos.org/packages?type=packages&query={searchTerms}";}];
+ icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
+ definedAliases = ["@np"];
+ };
+ "Nix Options" = {
+ urls = [{template = "https://search.nixos.org/options?type=options&query={searchTerms}";}];
+ icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
+ definedAliases = ["@no"];
+ };
+ "NixOS Wiki" = {
+ urls = [{template = "https://nixos.wiki/index.php?search={searchTerms}";}];
+ icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
+ definedAliases = ["@nw"];
+ };
+
+ "Arch Wiki" = {
+ urls = [{template = "https://wiki.archlinux.org/index.php?search={searchTerms}";}];
+ iconUpdateURL = "https://upload.wikimedia.org/wikipedia/commons/a/a5/Archlinux-icon-crystal-64.svg";
+ updateInterval = 24;
+ definedAliases = ["@aw"];
+ };
+
+ # RUST
+ "Rust std" = {
+ urls = [{template = "https://doc.rust-lang.org/std/?search={searchTerms}";}];
+ iconUpdateURL = "https://rustacean.net/assets/rustacean-orig-noshadow.svg";
+ updateInterval = 24;
+ definedAliases = ["@rs"];
+ };
+
+ "Google Scholar" = {
+ urls = [{template = "https://scholar.google.com/scholar?hl=en&q={searchTerms}";}];
+ iconUpdateURL = "https://scholar.google.com/favicon.ico";
+ updateInterval = 24;
+ definedAliases = ["@gs"];
+ };
+ "Wikipedia" = {
+ urls = [{template = "https://en.wikipedia.org/wiki/{searchTerms}";}];
+ iconUpdateURL = "https://upload.wikimedia.org/wikipedia/en/8/80/Wikipedia-logo-v2.svg";
+ updateInterval = 24;
+ definedAliases = ["@wp"];
+ };
+
+ "Wikipedia (en)".metaData.hidden = true;
+ "DuckDuckGo".metaData.hidden = true;
+ "Bing".metaData.hidden = true;
+ "Google".metaData.hidden = true;
+ "Amazon.de".metaData.hidden = true;
+}
diff --git a/home-manager/soispha/config/firefox/default.nix b/home-manager/soispha/config/firefox/default.nix
new file mode 100644
index 00000000..3c792045
--- /dev/null
+++ b/home-manager/soispha/config/firefox/default.nix
@@ -0,0 +1,65 @@
+{
+ config,
+ pkgs,
+ lib,
+ user_js,
+ video_pause,
+ ...
+}: let
+ userChrome = builtins.readFile ./config/chrome/userChrome.css;
+
+ user_js_nix = (import ./config/prefs) {inherit pkgs lib config user_js;};
+
+ extensions = builtins.map buildFirefoxXpiAddon (
+ lib.attrValues (
+ lib.importJSON ./config/extensions/extensions.json
+ )
+ );
+ engines = (import ./config/search/engines) {inherit pkgs;};
+
+ # source: https://gitlab.com/rycee/nur-expressions/-/blob/master/pkgs/firefox-addons/default.nix
+ buildFirefoxXpiAddon = (import ./functions/extensions) {inherit pkgs;};
+
+ video-pauser = (import ./functions/extensions/video-pauser.nix) {inherit pkgs video_pause;};
+in {
+ home.sessionVariables = {
+ # improve touch input & make scrolling smother
+ MOZ_USE_XINPUT2 = "1";
+ # improve wayland support
+ MOZ_ENABLE_WAYLAND = 1;
+ };
+ xdg.mimeApps = {
+ enable = true;
+ defaultApplications = {
+ "text/html" = ["firefox.desktop"];
+ "x-scheme-handler/http" = ["firefox.desktop"];
+ "x-scheme-handler/https" = ["firefox.desktop"];
+ "x-scheme-handler/about" = ["firefox.desktop"];
+ "x-scheme-handler/unknown" = ["firefox.desktop"];
+ };
+ };
+ programs.firefox = {
+ enable = true;
+ package = pkgs.firefox-wayland.override {
+ extraNativeMessagingHosts = [video-pauser];
+ };
+ profiles."default" = {
+ inherit extensions;
+ isDefault = true;
+ id = 0;
+ name = "default";
+
+ inherit userChrome;
+
+ search = {
+ default = "Brave Search";
+ force = true;
+
+ inherit engines;
+ };
+
+ bookmarks = [];
+ extraConfig = builtins.readFile "${user_js_nix}/user.js";
+ };
+ };
+}
diff --git a/home-manager/soispha/config/firefox/functions/bookmarks/default.nix b/home-manager/soispha/config/firefox/functions/bookmarks/default.nix
new file mode 100644
index 00000000..d1d89dd2
--- /dev/null
+++ b/home-manager/soispha/config/firefox/functions/bookmarks/default.nix
@@ -0,0 +1,49 @@
+{
+ lib,
+ pkgs,
+}: bookmarks: let
+ indent = level:
+ lib.concatStringsSep "" (map (lib.const " ") (lib.range 1 level));
+
+ bookmarkToHTML = indentLevel: bookmark: ''
+ ${indent indentLevel}<DT><A HREF="${
+ lib.escapeXML bookmark.url
+ }" ADD_DATE="0" LAST_MODIFIED="0">${lib.escapeXML bookmark.name}</A>'';
+
+ directoryToHTML = indentLevel: directory: ''
+ ${indent indentLevel}<DT>${
+ if directory.toolbar
+ then ''<H3 PERSONAL_TOOLBAR_FOLDER="true">Bookmarks Toolbar''
+ else "<H3>${lib.escapeXML directory.name}"
+ }</H3>
+ ${indent indentLevel}<DL><p>
+ ${allItemsToHTML (indentLevel + 1) directory.bookmarks}
+ ${indent indentLevel}</p></DL>'';
+
+ itemToHTMLOrRecurse = indentLevel: item:
+ if item ? "url"
+ then bookmarkToHTML indentLevel item
+ else directoryToHTML indentLevel item;
+
+ allItemsToHTML = indentLevel: bookmarks:
+ lib.concatStringsSep "\n"
+ (map (itemToHTMLOrRecurse indentLevel) bookmarks);
+
+ bookmarkEntries = allItemsToHTML 1 bookmarks;
+in
+ pkgs.writeText "firefox-bookmarks.html" ''
+ <!DOCTYPE NETSCAPE-Bookmark-file-1>
+ <!-- This is an automatically generated file.
+ It will be read and overwritten.
+ DO NOT EDIT! -->
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
+ <TITLE>Bookmarks</TITLE>
+ <H1>Bookmarks Menu</H1>
+
+ <DL><p>
+ <DT><H3 ADD_DATE="0" LAST_MODIFIED="0" PERSONAL_TOOLBAR_FOLDER="true">Bookmarks Toolbar</H3>
+ <DL><p>
+ ${bookmarkEntries}
+ </DL><p>
+ </p></DL>
+ ''
diff --git a/home-manager/soispha/config/firefox/functions/extensions/default.nix b/home-manager/soispha/config/firefox/functions/extensions/default.nix
new file mode 100644
index 00000000..b84461c7
--- /dev/null
+++ b/home-manager/soispha/config/firefox/functions/extensions/default.nix
@@ -0,0 +1,25 @@
+{pkgs, ...}: {
+ pname,
+ version,
+ addonId,
+ url,
+ sha256,
+ #meta,
+ ...
+}:
+pkgs.stdenv.mkDerivation {
+ name = "${pname}-${version}";
+
+ #inherit meta;
+
+ src = builtins.fetchurl {inherit url sha256;};
+
+ preferLocalBuild = true;
+ allowSubstitutes = true;
+
+ buildCommand = ''
+ dst="$out/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
+ mkdir -p "$dst"
+ install -v -m644 "$src" "$dst/${addonId}.xpi"
+ '';
+}
diff --git a/home-manager/soispha/config/firefox/functions/extensions/video-pauser.nix b/home-manager/soispha/config/firefox/functions/extensions/video-pauser.nix
new file mode 100644
index 00000000..c4c5238f
--- /dev/null
+++ b/home-manager/soispha/config/firefox/functions/extensions/video-pauser.nix
@@ -0,0 +1,30 @@
+{
+ pkgs,
+ video_pause,
+ ...
+}:
+pkgs.runCommand "video_pause_native_messaging" {} ''
+ install -d $out/share/
+ cat << EOF > $out/share/video_pauser.json
+ {
+ "name": "video_pauser",
+ "description": "Pause your Videos with a single key stroke!",
+ "path": "${video_pause}/bin/video_pause",
+ "type": "stdio",
+ "allowed_extensions": ["video-pauser@addons.vhack.eu"]
+ }
+ EOF
+
+ nativeMessagingPaths=(
+ /lib/mozilla/native-messaging-hosts
+ /etc/opt/chrome/native-messaging-hosts
+ /etc/chromium/native-messaging-hosts
+ /etc/vivaldi/native-messaging-hosts
+ /lib/librewolf/native-messaging-hosts
+ )
+
+ for manifestDir in "''${nativeMessagingPaths[@]}"; do
+ install -d $out$manifestDir
+ ln -s $out/share/video_pauser.json $out$manifestDir/
+ done
+''
diff --git a/home-manager/soispha/config/firefox/scripts/unzip_mozlz4.py b/home-manager/soispha/config/firefox/scripts/unzip_mozlz4.py
new file mode 100755
index 00000000..311fd214
--- /dev/null
+++ b/home-manager/soispha/config/firefox/scripts/unzip_mozlz4.py
@@ -0,0 +1,43 @@
+#!/usr/bin/python
+# source: https://unix.stackexchange.com/a/497861
+# Command-line tool to decompress mozLz4 files used for example by Firefox to store various kinds of session backup information.
+# Works in both Python 2.7.15 and 3.6.7, as of version 2.1.6 of the LZ4 Python bindings at pypi.org/project/lz4.
+# To use in another script, simply cut and paste the import statement and the mozlz4_to_text() function (lines 8 to 17).
+
+import lz4.block # pip install lz4 --user
+
+
+def mozlz4_to_text(filepath):
+ # Given the path to a "mozlz4", "jsonlz4", "baklz4" etc. file,
+ # return the uncompressed text.
+ bytestream = open(filepath, "rb")
+ bytestream.read(8) # skip past the b"mozLz40\0" header
+ valid_bytes = bytestream.read()
+ text = lz4.block.decompress(valid_bytes)
+ return text
+
+
+def main(args):
+ # Given command-line arguments of an input filepath for a ".mozlz4" file
+ # and optionally an output filepath, write the decompressed text to the
+ # output filepath.
+ # Default output filepath is the input filepath minus the last three characters
+ # (e.g. "foo.jsonlz4" becomes "foo.json")
+ filepath_in = args[0]
+ if len(args) < 2:
+ filepath_out = filepath_in[:-3]
+ else:
+ filepath_out = args[1]
+ text = mozlz4_to_text(filepath_in)
+ with open(filepath_out, "wb") as outfile:
+ outfile.write(text)
+ print("Wrote decompressed text to {}".format(filepath_out))
+
+
+if __name__ == "__main__":
+ import sys
+ args = sys.argv[1:]
+ if args and not args[0] in ("--help", "-h"):
+ main(args)
+ else:
+ print("Usage: mozlz4.py <mozlz4 file to read> <location to write>")
diff --git a/home-manager/soispha/config/firefox/scripts/update_extensions b/home-manager/soispha/config/firefox/scripts/update_extensions
new file mode 100755
index 00000000..05f47aad
--- /dev/null
+++ b/home-manager/soispha/config/firefox/scripts/update_extensions
@@ -0,0 +1,22 @@
+#!/bin/sh
+# shellcheck disable=SC2086
+# shellcheck source=/dev/null
+#. ~/.local/lib/shell/lib
+
+tmp=$(mktemp)
+cat << EOF > $tmp
+ darkreader
+ keepassxc-browser
+ simple-tab-groups
+ ublock-origin
+ tridactyl-vim
+ video-pauser
+ libredirect
+EOF
+
+# The bin is provided in the devshell. The cat execution should be unquoted
+generate_extensions $(cat "$tmp") > "$(dirname $0)"/../config/extensions/extensions.json
+
+
+
+rm "$tmp";