Introduction
Following is a collection of tweaks and fixes for the Mozilla Firefox web browser.
For the non-techies, here are brief descriptions of some of the Firefox configuration files which are in play in this article:
- prefs.js: This is the primary Firefox configuration file that controls much of how the browser works. This file exists in the root of your Firefox profile directory. The contents of this file can be viewed and edited by entering
about:config
in the address bar, however you should typically not edit this file unless it's only to test something. All of your custom preferences should be placed in a user.js file (or a user-overrides.js file if you're using the 'arkenfox' user.js). - user.js: This file does not exist until you create it in the root of your Firefox profile directory. Any preferences that you wish to change in prefs.js or
about:config
that are not available in the Firefox options interface, and which you want to preserve across Firefox updates or resets, should be entered in this file. - userChrome.css: This file does not exist until the you create it in the chrome folder of your Firefox profile. This file is used to modify the appearance of virtually any element of the Firefox user interface (UI).
- userContent.css: This file does not exist until the you create it in the chrome folder of your Firefox profile. This file can be used to modify the appearance and behavior of web pages, however i would recommend using the Stylus add-on instead because it makes working with CSS much easier.
Note that the userChrome.css and userContent.css files are ignored by default since Firefox version 69, thus you have to set the option...
toolkit.
...to true
in your user.js (or user-overrides.js if you're using the 'arkenfox' user.js) or about:config if you want to use either file.
If you need help with Cascading Style Sheets (CSS), CSS selectors and what parameters they can take, see the CSS Introduction and CSS Reference documents at w3schools.com.
Change how Firefox looks
CustomCSSforFx
Since Mozilla removed support for the older XUL/XPCOM add-ons in favor of WebExtensions, the much loved Classic Theme Restorer add-on won't work with Firefox version 57 or newer. The developer of CTR is still very active in maintaining the CSS code that was used in the add-on however and you can find it in the CustomCSSforFx GitHub repository. Using the new code, we can continue to tweak how Firefox looks, though it requires a bit more elbow grease. I've removed several of the CSS tweaks i had here in favor of the CustomCSSforFx code because it covers so much ground and saves a lot of time without adding too much overhead. You can also hide Firefox context menu items with CustomCSSforFx or you could roll your own styles and dump them in userChrome.css.
Instructions for implementing the CustomCSSforFx code is on the page i linked to, though i might recommend implementing it a little differently if you already have code in your userChrome.css or userContent.css that you want to keep. The method i use keeps my custom code separate from the CustomCSSforFx code which makes updating the CustomCSSforFx stuff easier. It also allows to quickly troubleshoot problems that might arise because you can just comment out a single @import
line to easily eliminate large chunks of code. Here's what my userChrome.css contains:
/* 3rd party */
/* Aris-t2/CustomCSSforFx (https://github.com/Aris-t2/CustomCSSforFx) */
@import "./custom/aris-customcssforfx/userChrome.css"; /**/
/* my stuff */
@import "./custom/status-panel.css"; /**/
@import "./custom/ff-chrome-fixes.css"; /**/
@import "./custom/context-menu.css"; /**/
Notice that the @namespace
line is missing. You need to do the same, else some of the tweaks in the CustomCSSforFx code might not work. To understand why you don't need the @namespace
line, even though you may have read that you do, and why it can cause styles to break, read Adding Style Recipes to userChrome.css.
As you saw above, the userChrome.css in my /chrome
folder is a rather bare-bones affair in which i use @import
to link to the CustomCSSforFx files and all my other CSS files that reside in sub-folders of /chrome
. Here's what the directory hierarchy looks like if you're confused:
/chrome
userChrome.css
userContent.css
/chrome/custom/aris-customcssforfx
/config
/css
/image
userChrome.css
userContent.css
/chrome/custom
context-menu.css
ff-chrome-fixes.css
status-panel.css
And here's what my userContent.css file looks like, which just points to the userContent.css file contained with the CustomCSSforFx package:
@import "./custom/aris-customcssforfx/userContent.css"; /**/
@import "./custom/addon/format-link.css"; /**/
@import "./custom/addon/mark-it.css"; /**/
Once you've got the files in place, it's just a matter of editing the userChrome.css and userContent.css files to suit your needs. The instructions are contained in the files. It will take a while to go through it all, but i suggest doing so because some tweaks are OS and Firefox version specific. Aris updates the CustomCSSforFx code quite often, so you might want to watch the repository for changes.
When it's time to update the styles, things get a little tricky if you want to avoid having to sift through the userChrome.css and userContent.css files all over again. One solution by 'petsam' called 'Pretty Firefox' attempts to automate the process as much as possible. I haven't used his script so i can't comment on it, suffice to say that any effort to automate the updating of CustomCSSforFx is appreciated i'm sure.
Dark Fox
Firefox ships with a few default themes and one of them is the 'Dark' theme. To activate it, right-click on an empty part of the tab bar or the navigation tool bar, or click the 'Customize' menu item in the Hamburger menu. At the bottom of the 'Customize Firefox' tab you'll see a 'Themes' button. Click it and select the 'Dark' option.
Adjust vertical space between the bookmark items
This will change the vertical space between your bookmarks in the sidebar. You can use CustomCSSforFx for this, or copy the following code to your userChrome.css or other custom CSS file. Change the -2
to whatever suits you.
/* bookmark panel item spacing */
.sidebar-placesTree treechildren::-moz-tree-row {
margin: -2px;
}
Styling the link target/network status tooltip
The hyperlink/network status tooltip is the text that appears in the lower left or right of the browser viewport when you hover over a hyperlink or when there is certain network activity. Some people (me!) find the link tooltip to be really annoying because it can cover part of a webpage and get in your way. This style will have the following effects:
- move the hyperlink tooltip to the top of the browser, overlaying the navigation tool bar (adjustable)
- make the hyperlink tooltip the full width of the browser
- make the hyperlink tooltip background transparent black and the text white
- center the hyperlink tooltip text
- leave the network status tooltip on the bottom of the viewport, but make the background transparent white and the text black
/* hyperlink hover */
#statuspanel[type="overLink"] {
position: fixed;
top: -80px; /* adjust as necessary */
z-index: 999;
left: 0 !important;
right: 100% !important;
text-align: center;
}
/* hyperlink label */
#statuspanel[type="overLink"] #statuspanel-label {
color: #fff !important;
background: rgba(0, 0, 0, .50) !important;
padding: 8px 0 !important;
width: 1920px !important; /* set to display width */
}
/* network label */
#statuspanel[type="status"] #statuspanel-label {
color: #fff !important;
background: rgba(0, 0, 0, .50) !important;
}
/* make sure the network tooltip is hidden when it's inactive */
#statuspanel[inactive] #statuspanel-label {
display: none !important
}
Change how Firefox acts
In addition to the smooth scrolling tweak below, see the articles, Firefox Configuration Guide for Privacy Freaks and Performance Buffs and The Firefox Privacy Guide For Dummies!.
Smooth scrolling
Smooth scrolling is now enabled by default in Firefox, but i don't care for the way it works. If you want to try my settings, they're in my user-overrides.js file. Here's the direct link to the raw text. Scroll down until you find the general.smoothScroll
preferences and copy the settings to your own user.js.
Enlarging the Developers Toolbox font size
If you use Firefox's developer tools you can enlarge the text using the devtools.toolbox.zoomValue
preference.
Cleaning up context menu clutter
You can use a userChrome.css file in the 'chrome' folder of your profile directory to hide items in any of Firefox's context menus, including those added by extensions. Each menu item has a CSS selector and you need to know what they are for the menu items you wish to hide.
There's more than one way to skin a cat so let's go with the easy way first which is to get a list of all the CSS selectors for all of the context menu items by searching the Firefox source code. The other way is a bit of a convoluted process, but it's also easy to do:
- Open the web developer toolbox from Firefox's hamburger menu, or by pressing F12, etc..
- From the 3-dot icon in the Developer Tools window, click the 'Settings' menu item and in the 'Advanced Settings' section, enable the two options, 'Enable browser chrome and add-on debugging toolboxes' and 'Enable remote debugging' after which you can close the toolbox.
- Again from the hamburger menu, click the 'Web Developer' menu item, then 'Browser Toolbox'. This will open the remote Developer Tools window along with a prompt asking whether to you want to allow the connection between Firefox and the remote debugger, which you will.
- In the new Developer Tools window, click the 3-dot icon, then the 'Disable Popup Auto-Hide' menu item.
Now in Firefox you can open whatever context menu you want to change and it will stay open (press Esc. to close it). Next, click the element picker icon on the Developer Tools window (it should be the left-most icon on the top row), or click Ctrl+Shift+C, and then click the Firefox context menu item you wish to hide. This will highlight the menu item in the Developer Tools window and if you double click the <menuitem id="context-some-menu-item"
part, you can then copy the CSS selector.
In this example we'll hide a single context menu item, the "Back" item in the main context menu for web pages:
menuitem#context-back { display: none !important; }
Here's another way to write the same code:
menuitem#context-back {
display: none !important;
}
In the next example we'll hide multiple context menu items, this time the "Back" and "Forward" items, but not the "Reload" item. There's also a couple of dummy-proof things happening here. Normally when you want to comment out a line you would prepend it with a forward slash followed by an asterisk, and append it with an asterisk followed by a forward slash, /* like this */
, but by adding the trailing /**/
to every line we only need to prepend the line with a /*
to have Firefox ignore it. The other feature is the #DUMMY
line. We could write this code all on one line but it's more readable if we break it up. The problem is that we need to remember to remove the comma in the last line and we might forget, or we might delete the last line, or comment it out, or we might add another line and forget to re-add the missing comma. The #DUMMY
line is simply a CSS selector that doesn't exist and is therefor ignored by the browser. By adding it, without a comma after it, we need not worry about keeping track of the rest of our commas.
menuitem#context-back, /**/
menuitem#context-forward, /**/
/*menuitem#context-reload, /**/
#DUMMY
{ display: none !important; }
Save the file and restart Firefox to see the changes.
Changing how websites look or work
The styles below can be used in a userChrome.css file, but i would recommend using the Stylus add-on mentioned earlier. If you dump them in userChrome.css you'll need to make some changes so that they affect only the websites you want to change.
If you're using an extension to modify how a website looks or works and you want it to work on Mozilla domains, you will need to set the preference...
extensions.webextensions.restrictedDomains
...to an empty value. You can access this preference by entering about:config
in the address bar.
Making the interwebs dark
Many of us who have been staring at computer monitors too damn long cannot tolerate bright displays. White web pages with dark text feels like looking at the sun, which is one reason why i use a dark theme for this website. A lot of people seem to have this problem and there are many solutions. In the case of Firefox, there are quite a few add-ons that can darken the web and they use various methods to do so. The simplest ones invert the colors which is a dumb way to go for a couple reasons, one of them being that this can make dark pages look bright. To see my preferred extension for darkening the web, see Firefox Extensions – My Picks.
Allow text selection/copying
In a silly effort to prevent copying text, some websites will try to prevent you from selecting it, or at least make it appear that you can't select the text by changing the selection color to the same color as the background. This tweak will often solve the problem.
Note that i've gotten reports of this CSS causing problems where one is unable to drag tabs to reorganize them and YouTube video full-screen not working with the 'F' key shortcut. I've experienced none of these problems personally.
Name: [global] allow text selection
Applies to: Everything
/* override CSS preventing text selection */
* {
-moz-user-select: text !important;
user-select: text !important
}
Copying/pasting text without formatting
Sometimes you may want to copy text from a website and paste it without the HTML markup. While i'm not aware of any way to accomplish this without an extension, you can to do the next best thing by using Ctrl+Shift+V to paste instead of Ctrl+V. This works for me on Windows and Linux, however i've had some feedback that indicates it does not work in all cases. If you have a problem, look for a global or application specific Ctrl+Shift+V hotkey setting for the program you're pasting to and consider deleting or changing it.
Copying text from hyperlinks
Copying the text of a hyperlink can be a hassle, that is until you press the Alt key. Press and hold your Alt key while dragging the cursor over the hyperlink to highlight the text you want to copy. You can even copy text from the middle of a hyperlink this way. No extension needed.
Display website content hidden by JavaScript
I'm noticing more and more website developers using JavaScript and DIV layers to hide page content until the page is fully loaded. While these CSS tweaks will not overcome this shear stupidity in every case, they will work in many. Note also that these styles may occasionally break how a website is displayed, though this seems to be fairly rare.
Name: [global] anti-JS - display html
Applies to: Everything
Click to expand...
/*
* display html hidden by JS
* note that some styles may break some websites
*/
body {
opacity: 1 !important;
visibility: visible !important;
}
body :is(.site, .body-fade-in, .use-preload #page) {
opacity: 1 !important;
visibility: visible;
}
body :is(.loading, #preloder, #evt-preloader, .ta-preloader, .lj-preloader, #blocker, .page-loader, .page-preloader-cover, .twp-preloader, #mask, .content-loader, .loader-wrapper, #loader-wrapper, #preloader, .preloader-bg, #load, #loading, .loading-overlay, #ht-loader, #qLoverlay, .preLoader, .preloader, #loftloader-wrapper, #wrapper > #loader-container, #before_preloader, .loading-screen, #loadingDiv, #af-preloader, .body-fade-in, #loadingImg, #fullpage-overlay, #astroid-preloader, .pix-page-loading-bg, .pix-loading-circ-path, .overlayloader, .load-screen, .page-preloader, .page-loader-wrapper, .page-loader-overlay, #zoom-preloader) {
display: none !important;
}
body:not(.ready) {
overflow: visible;
}
body #contents {
visibility: visible !important;
}
body::after {
content: unset;
}
#content #primary,
.thb-page-transition-on,
.wpb_animate_when_almost_visible {
opacity: 1;
}
.NoJs .bbCodeSpoilerContainer > .bbCodeSpoilerText,
#container {
visibility: visible;
}
.preLoader,
.hide-if-no-js,
#ajax-loading-screen,
#loader-container,
.loader,
#loader,
.loader-container,
.transition--fade-in,
.modal-simple--site-overlay,
.aerious-page-loader,
.video-fullpage-wrapper,
.so-loader,
.open_shop_overlayloader {
display: none !important;
}
.loading {
filter: none;
}
html {
display: unset;
}
html > .page {
visibility: visible;
}
The following will display images which are hidden by JavaScript in some cases:
Name: [global] anti-JS - display images
Applies to: Everything
img {
opacity: 1 !important;
filter: none;
}
/* ex: https://www.zdnet.com/article/this-is-what-googles-pixel-4-looks-like/ */
.loading-circle {
display: none !important;
}
Many websites will not display embedded YouTube videos unless you enable JavaScript. This will make the video display without having to enable it in some instances, however JS must still be enabled for youtube.com (see Firefox Extensions - My Picks if you want to bypass YouTube altogether whilst still being able to watch YouTube videos).
Name: [global] anti-JS - display YouTube player
Applies to: Everything
/* ex: https://healthnutnews.com/airbnb-wants-to-pay-you-to-move-to-italy-for-3-months-really/ */
div.player-unavailable {
display: none !important;
}
Normalizing fonts
For better readability i like font types and sizes to be uniform across all websites, plus there are privacy issues for websites that use 3rd party fonts, such as the "free" fonts that Google provides. Just be aware that forcing your own fonts can make fingerprinting the browser easier on websites where JavaScript is enabled. There are various ways to normalize fonts, but here's the method i use:
- in Firefox preferences, find the 'Fonts & Colors' options and click the 'Advanced' button
- if you read English, select 'Latin' in the combination control, else select your preferred language
- set the 'Proportional', 'Monospace' and 'Minimum' font styles and sizes and remember your choices. I set the 'Proportional' option to 'Serif' and leave the others at their default values
- in the combination control, select 'Other Writing Systems' and set the preferences to the same values as in the last step
- disable the option, 'Allow pages to choose their own fonts'
- optionally install a font toggle add-on like Enforce Browser Fonts or Toggle Fonts
Fonts should now look much more uniform across all websites and if you don't like the way a particular website looks, you can quickly toggle the 'Allow pages to choose their own fonts' setting with your add-on.
Lastly, if you use uBlock, read the 'My filters' section of the uBlock Origin Suggested Settings page which offers a way to allow all first-party fonts globally while disallowing all 3rd party fonts by default.
Fixing stuff that's busted
Firefox doesn't remember its window size after restart
If you maximize the Firefox window and then restart Firefox, it may not open in a maximized state as you might expect. This annoyance can be caused when the preference privacy.resistFingerprinting
is set to true
(as it should be). This preference does a number of things to make it harder for websites to fingerprint your browser and one of them is to set a generic window size. If this bothers you, try the Maximize All Windows (Minimalist Version) add-on by 'ericchase'. Note that forcing Firefox to start in a maximized window will make it easier to fingerprint the browser if JavaScript is enabled since the windows size is often quite unique.
Webpages don't fill the entire viewport (inner window)
When privacy.resistFingerprinting
is set to true
(as it should be), web content may not fill the entire viewport, also called the 'inner window'. The viewport is the part of the browser that displays webpages, not to be confused with the window described in the previous tweak which contains the entire browser. This behavior is controlled by a hidden preference, privacy.resistFingerprinting.letterboxing
, that does not exist by default and which can be set to true
or false
. While not utilizing the entire viewport may be an annoyance, understand that disabling this setting is likely to make the browser easier to fingerprint. If you still want to disable this protection, you can create the preference in about:config
(boolean) or add it to your user.js or user-overrides.js and set it to false
.
Troubleshooting problems with add-ons
If you notice a problem that you think may be related to an add-on, there are some simple steps you can take to troubleshoot the issue before contacting the developer. In my experience problems with add-ons are usually a result of a conflict with 1) a setting in prefs.js, 2) a setting in user.js, 3) another add-on, or 4) something in userchrome.css or usercontent.css. Whatever the case, the following information should help you to troubleshoot the issue.
If you suspect an add-on is giving you trouble...
- Backup your Firefox profile! Load
about:profiles
if you don't know where it's located, then exit Firefox and find your profile folder in your file manager and press Ctrl+C and Ctrl+V to make a copy. When you are prompted for a new name, just add-bak
to the existing name. - If you have any custom configuration files, such as a user.js, userChrome.css or userContent.css, rename them (add
.bak
to the existing name), then start Firefox and verify whether the problem still exists.- If the problem no longer exists, go to the Troubleshooting preferences section below.
- If the problem still exists, continue with the next step.
- Start Firefox and load
about:support
by entering that in the address bar, then click 'Restart with Add-ons Disabled'. - Open the
about:addons
page and, one by one, enable each add-on until the problem reappears, at which point you will know which add-on is causing the problem. - Go to addons.mozilla.org and install a fresh copy of the problematic add-on and verify that the problem is still exists.
- If the problem no longer exists, your finished.
- If the problem still exists, submit a bug report to the add-on developer (see below).
How to submit a bug report like a pro
If you have a problem with an add-on, or with Firefox itself, you need to be able provide the developer with enough pertinent information so they are able to reproduce it, else they may simply ignore you. Comments like "it don't work" are useless to a developer and you shouldn't be surprised if they ridicule you for submitting such non-descriptive tripe. When describing the problem, be as brief as possible while still including every necessary detail. Here's a template which you can use for bug reports:
Operating system [name] Firefox [version] Add-on (if relevant) [name] [version] [link] Affected webpage (if relevant) [URL] Brief but accurate description of the problem... What, if anything, you tried in order to solve the problem... Precise steps to reproduce the problem...
With that information in hand, you need to find where the developer wants you to submit bug reports. If it's a buggy add-on, load up about:addons
and see if there's a support link in the information for it by clicking the 'More' button. If there isn't, go to the add-on page at addons.mozilla.org and see if the developer provides a link to a support website (preferred!) or at least an email address. If they provide neither, then you're left with no other choice than to post your issue in the add-on comments, but do this only when no other option is available and don't down-vote the add-on. Lastly, make sure the title of your submission is descriptive of the problem. Titles like "bro its so borked LOL" are meaningless to a developer who is now more likely to disregard your issue since you just exposed yourself as a 12 year old slab-fondler.
Associating settings preferences with preference name
On occasion you may have a need to know what preference in the prefs.js file is being changed when you change a setting in the Firefox settings UI (about:preferences). One easy way to do this is to make a copy of the prefs.js file, then change the setting(s), then "diff" the files using file comparison software that can highlight the difference between the two files.
Troubleshooting problems with prefs.js / user.js
First of all you should never edit the prefs.js file. Custom preferences should always be placed in a user.js file (or a user-overrides.js file if you're using the 'arkenfox' user.js). That said, problems resulting from settings in prefs.js, user.js, etc., can manifest in different ways from breaking desired Firefox or extension functionality to causing web pages to not work properly or failing to load at all. Following is one method of troubleshooting preference issues for those who are not comfortable using the Firefox console, or where the console fails provide useful information. Though tedious, this method always works if the problem is a result of a preference. You should have a decent code editor with syntax highlighting for editing js files.
- Start Firefox and enter
about:profiles
in the address bar. - Create a new profile for testing, naming it something like '__TEST__' so it cannot be easily confused with your default profile. The new profile will become the default and we don't want that, so click the button below your original profile to make it the default.
- In the 'Root Directory' row, click the 'Open Directory' button for both your original and your testing profiles to open the folders in your file manager.
- Start Firefox using your testing profile. It may ask which profile to load since you now have more than one, but if it doesn't then load
about:profiles
again and select the option to open your testing profile in a new window. - Now verify that the problem still exists, then exit Firefox. If the problem no longer exists, continue with the next step. If it does, troubleshooting the problem is beyond the scope of this troubleshooter, suffice to say that it may due to an add-on or custom CSS in your Firefox
/chrome
folder if you have one, etc.. - With Firefox closed, copy (Ctrl+C) the prefs.js file in your original profile folder and paste it (Ctrl+V) in your testing profile folder, overwriting the existing one.
- Repeat step 5. If the problem reappears you have verified it is due to a preference in the prefs.js file. If it does not, and you're using a custom user.js file, such as the 'arkenfox' user.js, repeat step 6 with your user.js. If it the problem now reappears, you know the trouble lies in in user.js, not prefs.js. If the problem is not reproduced then it is beyond the scope of this troubleshooter.
- With Firefox closed, open the prefs.js file (or user.js if that's where the problem lies) from your testing profile in your code editor and select roughly half of the contents of the file, making sure your selection starts at the beginning of a line and ends at the end of a line in order to avoid further problems. Next, cut (Ctrl+X) the selection (don't just delete it) and save the file. If your editor complains it is important that you ignore the warning and force the save. If it automatically reloads the file, you will need to disable that behavior in its settings.
- Keep repeating steps 5 and 8 until the issue disappears, at which point you know the preference causing the problem is stored in your clipboard (the last section you cut from prefs.js or user.js). Move on to the next step.
- Select all of the contents in prefs.js (or user.js) (Ctrl+A) and delete (not cut) the selection, then paste (Ctrl+V) the contents of your clipboard and save the file, again being sure to force the save if your code editor complains.
- Again, continue repeating steps 5 and 8 until you have narrowed down the problem to the single preference responsible.
- Once the problematic preference is isolated you can copy it to your user.js file (or user-overrides.js file if you have one) in your default profile and change it's value there after which you can verify the problem was solved by running Firefox with your default profile.
Once you have solved the problem in your default profile, you can delete your testing profile from about:profiles
or from the profile loading prompt when Firefox starts.
More Firefox stuff
Other articles i've written about Firefox and its derivatives can be found on the Everything Firefox page.
For more CSS tweaks, see:
- Aris-t2/CustomCSSforFx
- search GitHub for the 'userchrome' tag
General Firefox stuff:
Recent changes
2023-01-23
- edited 'Display website content hidden by JavaScript' section to correct an issue