diff --git a/README.md b/README.md
index 217590d..a59fa7b 100644
--- a/README.md
+++ b/README.md
@@ -1,36 +1,64 @@
# MSFX
+
Fork of [the MSFX Firefox userChrome](https://github.com/WinClassic/MSFX).
![Screenshot of MSFX](.assets/screenshot.png)
## Changes
-* Uses normal [firefox-scripts](https://github.com/xiaoxiaoflood/firefox-scripts) instead of a stripped down version for greater userscript compatibility
-* More accurate styles in some places
- * Bookmarks bar folder menus
- * All tabs button
- * Replaced with overflow arrows icon
- * Scrollbars forced to light theme
- * Selected address bar forced to light theme
- * Resize grabber no longer appears when maximized
- * Autoplay Pending indicator icon replaced
-* Pinned tabs no longer have extra padding
-* Internet status bar widget is its own component
- * Empty boxes have been removed in favor of putting extensions on the status bar
-* Address bar is no longer forced to the Address toolbar when opening a new window
+
+- Uses normal [firefox-scripts](https://github.com/xiaoxiaoflood/firefox-scripts) instead of a stripped down version for greater userscript compatibility
+ - Fixed up for 117+ and now bundled with again, as the upstream repo's maintainer is MIA.
+- More accurate styles in some places
+ - Bookmarks bar folder menus
+ - All tabs button
+ - Replaced with overflow arrows icon
+ - Scrollbars forced to light theme
+ - Selected address bar forced to light theme
+ - Resize grabber no longer appears when maximized
+ - Autoplay Pending indicator icon replaced
+ - Accurate menus (117+)
+ - Unlocked toolbar style has proper bottom resizer (visual only)
+ - Properly styled address bar dropdown
+ - Proper hover/active states for menu bar items
+ - Scrollbar dithering
+- Internet status bar widget is its own component
+ - Empty boxes have been removed in favor of putting extensions on the status bar
+- Address bar is no longer forced to the Address toolbar (configurable, enabled by default)
+- Works with Firefox 117+ (fixes developed for on 122.0b3)
+ - A lot of legacy styling was removed to where the `appearance` property does nothing, everything that used this to achieve the classic style has been accurately recreated as best as possible.
+
+## What's missing?
+
+- The stock extensions menu, the main menu and the overflow tabs menu are not styled, as I do not personally use them.
+- More configuration options probably. There might've been some things I commented out for my own liking that you may not agree with in terms of accuracy to IE5.
+- Default favicons for bookmark items, as these cannot be changed in pure CSS. (needs investigation)
+- Extension button tooltips don't seem to be standard tooltips.
+
+## Known issues
+
+- Opening "Customize Toolbar" resets the access key for the Favorites (bookmarks) menu item back to "B", resulting in "Favorites (B)"
+
+## What can be improved?
+
+- Stop using base64 URLs everywhere.
+- More configuration.
+- [Nested rulesets](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_nesting), since Firefox itself uses them everywhere. (117+)
+ - Some of the 117+ fixes have been using them (e.g. context menus)
+- Multiple files.
## Installation
-* Set the following keys in `about:config`:
- * `svg.context-properties.content.enabled` to `true`
- * `ui.prefersReducedMotion` to `1`
- * `browser.display.windows.non_native_menus` to `0`
-* Follow [firefox-scripts](https://github.com/xiaoxiaoflood/firefox-scripts) installation.
-* Install [Status Bar userscript](https://raw.githubusercontent.com/xiaoxiaoflood/firefox-scripts/master/chrome/status-bar.uc.js).
-* Merge `chrome` folder from the repo into your profile's `chrome` folder.
+
+- Set the following keys in `about:config`:
+ - `toolkit.legacyUserProfileCustomizations.stylesheets` to `true`
+ - `svg.context-properties.content.enabled` to `true`
+ - `ui.prefersReducedMotion` to `1`
+ - ~~`browser.display.windows.non_native_menus` to `0`~~ (removed in 117+)
+- Copy the contents of `ffroot` into your Firefox install folder (typically `C:\Program Files\Mozilla Firefox`)
+ - There is an extra set of folders added (`browser\chrome\icons\default`) to change the main window icon. The default is the IE5 page icon, but the 2001-2003 Mozilla icon is included as well, just needs to be renamed from `_main-window.ico` to `main-window.ico`.
+- Merge `chrome` folder from the repo into your profile's `chrome` folder. (path can be found via `about:profiles` or `about:support`)
## Recommendations
-* [Extensions Options Menu](https://raw.githubusercontent.com/xiaoxiaoflood/firefox-scripts/master/chrome/extensionOptionsMenu.uc.js)
- * More lightweight than the stock extensions menu, which is disabled by the theme anyways
-* [userChromeJS Manager](https://raw.githubusercontent.com/xiaoxiaoflood/firefox-scripts/master/chrome/rebuild_userChrome.uc.js)
-* [Save File to](https://raw.githubusercontent.com/xiaoxiaoflood/firefox-scripts/master/extensions/savefileto/savefileto.xpi)
- * **Requires extensions support in firefox-scripts**
- * "Replaces" save dialog for hybrid classic theme setup with Windhawk until investigation is done to fix the save dialog on classic enabled programs.
+
+- [Extensions Options Menu](https://raw.githubusercontent.com/xiaoxiaoflood/firefox-scripts/master/chrome/extensionOptionsMenu.uc.js)
+ - More lightweight than the stock extensions menu, which is "hidden" by the theme anyways
+- [userChromeJS Manager](https://raw.githubusercontent.com/xiaoxiaoflood/firefox-scripts/master/chrome/rebuild_userChrome.uc.js)
diff --git a/chrome/activity_throbber.uc.js b/chrome/activity_throbber.uc.js
index b540e5c..644ae77 100644
--- a/chrome/activity_throbber.uc.js
+++ b/chrome/activity_throbber.uc.js
@@ -1,52 +1,53 @@
// 'Activity throbber' script for Firefox 60+ by Aris
+(function () {
+ Components.utils.import("resource:///modules/CustomizableUI.jsm");
+ var Services =
+ globalThis.Services ||
+ ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
+ var sss = Components.classes[
+ "@mozilla.org/content/style-sheet-service;1"
+ ].getService(Components.interfaces.nsIStyleSheetService);
-Components.utils.import("resource:///modules/CustomizableUI.jsm");
-var { Services } = Components.utils.import(
- "resource://gre/modules/Services.jsm",
- {}
-);
-var sss = Components.classes[
- "@mozilla.org/content/style-sheet-service;1"
-].getService(Components.interfaces.nsIStyleSheetService);
+ var at_label = "Activity Throbber";
-var at_label = "Activity Throbber";
+ var ActivityThrobber = {
+ init: function () {
+ try {
+ document.addEventListener("TabAttrModified", _ActivityThrobber, false);
+ document.addEventListener("TabSelect", _ActivityThrobber, false);
+ document.addEventListener("TabOpen", _ActivityThrobber, false);
+ document.addEventListener("TabClose", _ActivityThrobber, false);
+ document.addEventListener("load", _ActivityThrobber, false);
-var ActivityThrobber = {
- init: function () {
- try {
- document.addEventListener("TabAttrModified", _ActivityThrobber, false);
- document.addEventListener("TabSelect", _ActivityThrobber, false);
- document.addEventListener("TabOpen", _ActivityThrobber, false);
- document.addEventListener("TabClose", _ActivityThrobber, false);
- document.addEventListener("load", _ActivityThrobber, false);
+ // add or remove 'busy' tab from activity item
+ function _ActivityThrobber() {
+ if (gBrowser.selectedTab.hasAttribute("busy")) {
+ document
+ .querySelector("#activity_throbber")
+ .setAttribute("busy", "true");
+ } else
+ document
+ .querySelector("#activity_throbber")
+ .removeAttribute("busy");
+ }
- // add or remove 'busy' tab from activity item
- function _ActivityThrobber() {
- if (gBrowser.selectedTab.hasAttribute("busy")) {
- document
- .querySelector("#activity_throbber")
- .setAttribute("busy", "true");
- } else
- document.querySelector("#activity_throbber").removeAttribute("busy");
- }
+ // create a default toolbar button
+ CustomizableUI.createWidget({
+ id: "activity_throbber", // button id
+ defaultArea: CustomizableUI.AREA_NAVBAR,
+ removable: true,
+ label: at_label, // button title
+ tooltiptext: at_label, // tooltip title
+ onCreated: function (button) {
+ return button;
+ },
+ });
- // create a default toolbar button
- CustomizableUI.createWidget({
- id: "activity_throbber", // button id
- defaultArea: CustomizableUI.AREA_NAVBAR,
- removable: true,
- label: at_label, // button title
- tooltiptext: at_label, // tooltip title
- onCreated: function (button) {
- return button;
- },
- });
-
- // style button icon / embedded non-animated icon, because there is no image for then inside Fx anymore
- var uri = Services.io.newURI(
- "data:text/css;charset=utf-8," +
- encodeURIComponent(
- `#activity_throbber {
+ // style button icon / embedded non-animated icon, because there is no image for then inside Fx anymore
+ var uri = Services.io.newURI(
+ "data:text/css;charset=utf-8," +
+ encodeURIComponent(
+ `#activity_throbber {
-moz-appearance: none !important;
list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJ1BMVEUAAAC0tLS0tLSysrK0tLS0tLS0tLS1tbW0tLS6urq0tLS3t7eurq4SF2bYAAAADXRSTlMA2oILm3RnVEEF0y4TZ0HrPwAAAE5JREFUCNdjAAIjZQYISBQDU1uUA0WNvIEMR/FDOoUiQIbiCgaGLiEgY3oDAwNHJQPDtGCQQtNMBkWQKJCEM+BSMMVw7XAD4VYgLIU7AwA5fBJ3rMaMkwAAAABJRU5ErkJggg==);
width: 16px !important;
@@ -63,20 +64,21 @@ var ActivityThrobber = {
list-style-image: url("chrome://global/skin/media/throbber.png");
}
`
- ),
- null,
- null
- );
+ ),
+ null,
+ null
+ );
- // remove old style sheet, before registering the new one
- if (sss.sheetRegistered(uri, sss.AGENT_SHEET)) {
- sss.unregisterSheet(uri, sss.AGENT_SHEET);
+ // remove old style sheet, before registering the new one
+ if (sss.sheetRegistered(uri, sss.AGENT_SHEET)) {
+ sss.unregisterSheet(uri, sss.AGENT_SHEET);
+ }
+ sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
+ } catch (e) {
+ Components.utils.reportError(e);
}
- sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
- } catch (e) {
- Components.utils.reportError(e);
- }
- },
-};
+ },
+ };
-document.addEventListener("DOMContentLoaded", ActivityThrobber.init(), false);
+ document.addEventListener("DOMContentLoaded", ActivityThrobber.init(), false);
+})();
diff --git a/chrome/additional_top_toolbars.uc.js b/chrome/additional_top_toolbars.uc.js
index 5440047..8557e12 100644
--- a/chrome/additional_top_toolbars.uc.js
+++ b/chrome/additional_top_toolbars.uc.js
@@ -7,212 +7,223 @@
//
// workaround on Fx 71 to save/restore toolbar visibility
// creating an observer array always fails, so observers are created manually atm.
+(function () {
+ Components.utils.import("resource:///modules/CustomizableUI.jsm");
+ var Services =
+ globalThis.Services ||
+ ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
+ var appversion = parseInt(Services.appinfo.version);
-Components.utils.import("resource:///modules/CustomizableUI.jsm");
-var { Services } = Components.utils.import(
- "resource://gre/modules/Services.jsm",
- {}
-);
-var appversion = parseInt(Services.appinfo.version);
+ var AdditionalTopToolbars = {
+ init: function () {
+ /* blank tab workaround */
+ try {
+ if (gBrowser.selectedBrowser.getAttribute("blank"))
+ gBrowser.selectedBrowser.removeAttribute("blank");
+ } catch (e) {}
-var AdditionalTopToolbars = {
- init: function () {
- /* blank tab workaround */
- try {
- if (gBrowser.selectedBrowser.getAttribute("blank"))
- gBrowser.selectedBrowser.removeAttribute("blank");
- } catch (e) {}
+ var number_of_additional_top_toolbars = 1; // max 5 to save toolbar state on Fx 71+ (add additional code at the bottom for more)
+ var tb_label = "Address";
- var number_of_additional_top_toolbars = 1; // max 5 to save toolbar state on Fx 71+ (add additional code at the bottom for more)
- var tb_label = "Address";
+ try {
+ if (document.getElementById("additional_top_toolbar1") == null) {
+ if (
+ number_of_additional_top_toolbars > 0 &&
+ number_of_additional_top_toolbars < 6
+ ) {
+ var i = 1;
- try {
- if (document.getElementById("additional_top_toolbar1") == null) {
- if (
- number_of_additional_top_toolbars > 0 &&
- number_of_additional_top_toolbars < 6
- ) {
- var i = 1;
+ while (i <= number_of_additional_top_toolbars) {
+ if (appversion <= 62)
+ var toptoolbar = document.createElement("toolbar");
+ else var toptoolbar = document.createXULElement("toolbar");
- while (i <= number_of_additional_top_toolbars) {
- if (appversion <= 62)
- var toptoolbar = document.createElement("toolbar");
- else var toptoolbar = document.createXULElement("toolbar");
-
- toptoolbar.setAttribute("id", "additional_top_toolbar" + i + "");
- toptoolbar.setAttribute("toolbarname", tb_label + "");
- toptoolbar.setAttribute("toolbarname", tb_label + "");
- toptoolbar.setAttribute("customizable", "true");
- toptoolbar.setAttribute(
- "class",
- "toolbar-primary chromeclass-toolbar browser-toolbar customization-target"
- );
- toptoolbar.setAttribute("mode", "icons");
- toptoolbar.setAttribute("iconsize", "small");
- toptoolbar.setAttribute("toolboxid", "navigator-toolbox");
- toptoolbar.setAttribute("context", "toolbar-context-menu");
- toptoolbar.setAttribute("lockiconsize", "true");
- toptoolbar.setAttribute("defaultset", "spring");
-
- document
- .querySelector("#navigator-toolbox")
- .appendChild(toptoolbar);
-
- CustomizableUI.registerArea("additional_top_toolbar" + i + "", {
- legacy: true,
- });
- if (appversion >= 65)
- CustomizableUI.registerToolbarNode(toptoolbar);
-
- // top toolbars 'collapsed' on startup
- //setToolbarVisibility(toptoolbar, false);
-
- try {
- Services.prefs
- .getDefaultBranch("browser.additional_top_toolbar" + i + ".")
- .setBoolPref("enabled", true);
- setToolbarVisibility(
- document.getElementById("additional_top_toolbar" + i + ""),
- Services.prefs
- .getBranch("browser.additional_top_toolbar" + i + ".")
- .getBoolPref("enabled")
+ toptoolbar.setAttribute("id", "additional_top_toolbar" + i + "");
+ toptoolbar.setAttribute("toolbarname", tb_label + "");
+ toptoolbar.setAttribute("toolbarname", tb_label + "");
+ toptoolbar.setAttribute("customizable", "true");
+ toptoolbar.setAttribute(
+ "class",
+ "toolbar-primary chromeclass-toolbar browser-toolbar customization-target"
);
- } catch (e) {}
+ toptoolbar.setAttribute("mode", "icons");
+ toptoolbar.setAttribute("iconsize", "small");
+ toptoolbar.setAttribute("toolboxid", "navigator-toolbox");
+ toptoolbar.setAttribute("context", "toolbar-context-menu");
+ toptoolbar.setAttribute("lockiconsize", "true");
+ toptoolbar.setAttribute("defaultset", "spring");
- i++;
+ document
+ .querySelector("#navigator-toolbox")
+ .appendChild(toptoolbar);
+
+ CustomizableUI.registerArea("additional_top_toolbar" + i + "", {
+ legacy: true,
+ });
+ if (appversion >= 65)
+ CustomizableUI.registerToolbarNode(toptoolbar);
+
+ // top toolbars 'collapsed' on startup
+ //setToolbarVisibility(toptoolbar, false);
+
+ try {
+ Services.prefs
+ .getDefaultBranch("browser.additional_top_toolbar" + i + ".")
+ .setBoolPref("enabled", true);
+ setToolbarVisibility(
+ document.getElementById("additional_top_toolbar" + i + ""),
+ Services.prefs
+ .getBranch("browser.additional_top_toolbar" + i + ".")
+ .getBoolPref("enabled")
+ );
+ } catch (e) {}
+
+ i++;
+ }
}
+
+ // CSS
+ var sss = Components.classes[
+ "@mozilla.org/content/style-sheet-service;1"
+ ].getService(Components.interfaces.nsIStyleSheetService);
+
+ var uri = Services.io.newURI(
+ "data:text/css;charset=utf-8," +
+ encodeURIComponent(
+ `toolbar[id^="additional_top_toolbar"] {
+ -moz-appearance: none !important;
+ background-color: var(--toolbar-bgcolor);
+ background-image: var(--toolbar-bgimage);
+ background-clip: padding-box;
+ color: var(--toolbar-color, inherit);
+}
+#main-window[customizing] toolbar[id^="additional_top_toolbar"] {
+ outline: 1px dashed !important;
+ outline-offset: -2px !important;
+}`
+ ),
+ null,
+ null
+ );
+
+ sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
}
- // CSS
- var sss = Components.classes[
- "@mozilla.org/content/style-sheet-service;1"
- ].getService(Components.interfaces.nsIStyleSheetService);
-
- var uri = Services.io.newURI(
- "data:text/css;charset=utf-8," +
- encodeURIComponent(
- '\
- \
- toolbar[id^="additional_top_toolbar"] { \
- -moz-appearance: none !important; \
- background-color: var(--toolbar-bgcolor); \
- background-image: var(--toolbar-bgimage); \
- background-clip: padding-box; \
- color: var(--toolbar-color, inherit); \
- } \
- #main-window[customizing] toolbar[id^="additional_top_toolbar"] { \
- outline: 1px dashed !important; \
- outline-offset: -2px !important; \
- } \
- \
- '
- ),
- null,
- null
- );
-
- sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
- }
-
- if (number_of_additional_top_toolbars >= 1) {
- var observer1 = new MutationObserver(function (mutations) {
- mutations.forEach(function (mutation) {
- Services.prefs
- .getBranch("browser.additional_top_toolbar1.")
- .setBoolPref(
- "enabled",
- !document.querySelector("#additional_top_toolbar1").collapsed
- );
+ if (number_of_additional_top_toolbars >= 1) {
+ var observer1 = new MutationObserver(function (mutations) {
+ mutations.forEach(function (mutation) {
+ Services.prefs
+ .getBranch("browser.additional_top_toolbar1.")
+ .setBoolPref(
+ "enabled",
+ !document.querySelector("#additional_top_toolbar1").collapsed
+ );
+ });
});
- });
- observer1.observe(document.querySelector("#additional_top_toolbar1"), {
- attributes: true,
- childList: true,
- characterData: true,
- });
- }
- if (number_of_additional_top_toolbars >= 2) {
- var observer2 = new MutationObserver(function (mutations) {
- mutations.forEach(function (mutation) {
- Services.prefs
- .getBranch("browser.additional_top_toolbar2.")
- .setBoolPref(
- "enabled",
- !document.querySelector("#additional_top_toolbar2").collapsed
- );
+ observer1.observe(
+ document.querySelector("#additional_top_toolbar1"),
+ {
+ attributes: true,
+ childList: true,
+ characterData: true,
+ }
+ );
+ }
+ if (number_of_additional_top_toolbars >= 2) {
+ var observer2 = new MutationObserver(function (mutations) {
+ mutations.forEach(function (mutation) {
+ Services.prefs
+ .getBranch("browser.additional_top_toolbar2.")
+ .setBoolPref(
+ "enabled",
+ !document.querySelector("#additional_top_toolbar2").collapsed
+ );
+ });
});
- });
- observer2.observe(document.querySelector("#additional_top_toolbar2"), {
- attributes: true,
- childList: true,
- characterData: true,
- });
- }
- if (number_of_additional_top_toolbars >= 3) {
- var observer3 = new MutationObserver(function (mutations) {
- mutations.forEach(function (mutation) {
- Services.prefs
- .getBranch("browser.additional_top_toolbar3.")
- .setBoolPref(
- "enabled",
- !document.querySelector("#additional_top_toolbar3").collapsed
- );
+ observer2.observe(
+ document.querySelector("#additional_top_toolbar2"),
+ {
+ attributes: true,
+ childList: true,
+ characterData: true,
+ }
+ );
+ }
+ if (number_of_additional_top_toolbars >= 3) {
+ var observer3 = new MutationObserver(function (mutations) {
+ mutations.forEach(function (mutation) {
+ Services.prefs
+ .getBranch("browser.additional_top_toolbar3.")
+ .setBoolPref(
+ "enabled",
+ !document.querySelector("#additional_top_toolbar3").collapsed
+ );
+ });
});
- });
- observer3.observe(document.querySelector("#additional_top_toolbar3"), {
- attributes: true,
- childList: true,
- characterData: true,
- });
- }
- if (number_of_additional_top_toolbars >= 4) {
- var observer4 = new MutationObserver(function (mutations) {
- mutations.forEach(function (mutation) {
- Services.prefs
- .getBranch("browser.additional_top_toolbar4.")
- .setBoolPref(
- "enabled",
- !document.querySelector("#additional_top_toolbar4").collapsed
- );
+ observer3.observe(
+ document.querySelector("#additional_top_toolbar3"),
+ {
+ attributes: true,
+ childList: true,
+ characterData: true,
+ }
+ );
+ }
+ if (number_of_additional_top_toolbars >= 4) {
+ var observer4 = new MutationObserver(function (mutations) {
+ mutations.forEach(function (mutation) {
+ Services.prefs
+ .getBranch("browser.additional_top_toolbar4.")
+ .setBoolPref(
+ "enabled",
+ !document.querySelector("#additional_top_toolbar4").collapsed
+ );
+ });
});
- });
- observer4.observe(document.querySelector("#additional_top_toolbar4"), {
- attributes: true,
- childList: true,
- characterData: true,
- });
- }
- if (number_of_additional_top_toolbars >= 5) {
- var observer5 = new MutationObserver(function (mutations) {
- mutations.forEach(function (mutation) {
- Services.prefs
- .getBranch("browser.additional_top_toolbar5.")
- .setBoolPref(
- "enabled",
- !document.querySelector("#additional_top_toolbar5").collapsed
- );
+ observer4.observe(
+ document.querySelector("#additional_top_toolbar4"),
+ {
+ attributes: true,
+ childList: true,
+ characterData: true,
+ }
+ );
+ }
+ if (number_of_additional_top_toolbars >= 5) {
+ var observer5 = new MutationObserver(function (mutations) {
+ mutations.forEach(function (mutation) {
+ Services.prefs
+ .getBranch("browser.additional_top_toolbar5.")
+ .setBoolPref(
+ "enabled",
+ !document.querySelector("#additional_top_toolbar5").collapsed
+ );
+ });
});
- });
- observer5.observe(document.querySelector("#additional_top_toolbar5"), {
- attributes: true,
- childList: true,
- characterData: true,
- });
- }
- } catch (e) {}
- },
-};
+ observer5.observe(
+ document.querySelector("#additional_top_toolbar5"),
+ {
+ attributes: true,
+ childList: true,
+ characterData: true,
+ }
+ );
+ }
+ } catch (e) {}
+ },
+ };
-/* initialization delay workaround */
-document.addEventListener(
- "DOMContentLoaded",
- AdditionalTopToolbars.init(),
- false
-);
+ /* initialization delay workaround */
+ document.addEventListener(
+ "DOMContentLoaded",
+ AdditionalTopToolbars.init(),
+ false
+ );
-// not needed anymore, but just in case someone prefers initialization that way
-/*
+ // not needed anymore, but just in case someone prefers initialization that way
+ /*
setTimeout(function(){
AdditionalTopToolbars.init();
},500);
*/
+})();
diff --git a/chrome/change-toolbar-icon-values.uc.js b/chrome/change-toolbar-icon-values.uc.js
index 25c6439..69cedf9 100644
--- a/chrome/change-toolbar-icon-values.uc.js
+++ b/chrome/change-toolbar-icon-values.uc.js
@@ -1,42 +1,52 @@
-function waitForElm(selector) {
- return new Promise(resolve => {
+(function () {
+ function waitForElm(selector) {
+ return new Promise((resolve) => {
+ if (document.querySelector(selector)) {
+ return resolve(document.querySelector(selector));
+ }
+
+ const observer = new MutationObserver((mutations) => {
if (document.querySelector(selector)) {
- return resolve(document.querySelector(selector));
+ resolve(document.querySelector(selector));
+ observer.disconnect();
}
+ });
- const observer = new MutationObserver(mutations => {
- if (document.querySelector(selector)) {
- resolve(document.querySelector(selector));
- observer.disconnect();
- }
- });
-
- observer.observe(document.body, {
- childList: true,
- subtree: true
- });
+ observer.observe(document.body, {
+ childList: true,
+ subtree: true,
+ });
});
-}
+ }
-waitForElm('#find-button').then((elm) => {
- var find = document.querySelector("#find-button label.toolbarbutton-text");
- find.setAttribute("value", "Search");
-});
+ waitForElm("#find-button").then((elm) => {
+ var find = document.querySelector("#find-button label.toolbarbutton-text");
+ if (find)
+ find.setAttribute("value", "Search");
+ });
-setTimeout(function () {
- waitForElm('#nav-bar').then((elm) => {
- var library = document.querySelector("#bookmarks-menu-button label.toolbarbutton-text");
- library.setAttribute("value", "Favorites");
- });
-}, 0);
+ setTimeout(function () {
+ waitForElm("#nav-bar").then((elm) => {
+ var library = document.querySelector(
+ "#bookmarks-menu-button label.toolbarbutton-text"
+ );
+ if (library)
+ library.setAttribute("value", "Favorites");
+ });
+ }, 0);
-waitForElm('#bookmarksMenu').then((elm) => {
- var bookmarksmenu = document.querySelector("#bookmarksMenu label.menubar-text");
- bookmarksmenu.setAttribute("value", "Favorites");
- bookmarksmenu.setAttribute("accesskey", "a");
-});
+ waitForElm("#bookmarksMenu").then((elm) => {
+ var bookmarksmenu = document.querySelector(
+ "#bookmarksMenu label.menubar-text"
+ );
+ if (bookmarksmenu)
+ bookmarksmenu.setAttribute("value", "Favorites");
+ //bookmarksmenu.setAttribute("accesskey", "a");
+ });
-waitForElm('#bookmarksMenu').then((elm) => {
- var bookmarksmenu = document.querySelector("#bookmarksMenu");
- bookmarksmenu.setAttribute("accesskey", "a");
-});
\ No newline at end of file
+ waitForElm("#bookmarksMenu").then((elm) => {
+ var bookmarksmenu = document.querySelector("#bookmarksMenu");
+ if (bookmarksmenu)
+ bookmarksmenu.removeAttribute("accesskey");
+ });
+})();
diff --git a/chrome/create_internet_on_status_bar.uc.js b/chrome/create_internet_on_status_bar.uc.js
index c6865f3..20267f6 100644
--- a/chrome/create_internet_on_status_bar.uc.js
+++ b/chrome/create_internet_on_status_bar.uc.js
@@ -1,32 +1,32 @@
-Components.utils.import("resource:///modules/CustomizableUI.jsm");
-var { Services } = Components.utils.import(
- "resource://gre/modules/Services.jsm",
- {}
-);
-var sss = Components.classes[
- "@mozilla.org/content/style-sheet-service;1"
-].getService(Components.interfaces.nsIStyleSheetService);
+(function () {
+ Components.utils.import("resource:///modules/CustomizableUI.jsm");
+ var Services =
+ globalThis.Services ||
+ ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
+ var sss = Components.classes[
+ "@mozilla.org/content/style-sheet-service;1"
+ ].getService(Components.interfaces.nsIStyleSheetService);
-var IE6StatusBar = {
- init: function () {
- try {
- // create a default toolbar button
- CustomizableUI.createWidget({
- id: "ie6_statusbar", // button id
- defaultArea: CustomizableUI.AREA_NAVBAR,
- removable: true,
- label: "Internet", // button title
- tooltiptext: "", // tooltip title
- onCreated: function (button) {
- return button;
- },
- });
+ var IE6StatusBar = {
+ init: function () {
+ try {
+ // create a default toolbar button
+ CustomizableUI.createWidget({
+ id: "ie6_statusbar", // button id
+ defaultArea: CustomizableUI.AREA_NAVBAR,
+ removable: true,
+ label: "Internet", // button title
+ tooltiptext: "", // tooltip title
+ onCreated: function (button) {
+ return button;
+ },
+ });
- // style button icon / embedded non-animated icon, because there is no image for then inside Fx anymore
- var uri = Services.io.newURI(
- "data:text/css;charset=utf-8," +
- encodeURIComponent(
- `#ie6_statusbar {
+ // style button icon / embedded non-animated icon, because there is no image for then inside Fx anymore
+ var uri = Services.io.newURI(
+ "data:text/css;charset=utf-8," +
+ encodeURIComponent(
+ `#ie6_statusbar {
display: flex;
width: 151px;
height: 18px;
@@ -51,20 +51,21 @@ var IE6StatusBar = {
#ie6_statusbar > .toolbarbutton-icon {
display: none;
}`
- ),
- null,
- null
- );
+ ),
+ null,
+ null
+ );
- // remove old style sheet, before registering the new one
- if (sss.sheetRegistered(uri, sss.AGENT_SHEET)) {
- sss.unregisterSheet(uri, sss.AGENT_SHEET);
+ // remove old style sheet, before registering the new one
+ if (sss.sheetRegistered(uri, sss.AGENT_SHEET)) {
+ sss.unregisterSheet(uri, sss.AGENT_SHEET);
+ }
+ sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
+ } catch (e) {
+ Components.utils.reportError(e);
}
- sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
- } catch (e) {
- Components.utils.reportError(e);
- }
- },
-};
+ },
+ };
-document.addEventListener("DOMContentLoaded", IE6StatusBar.init(), false);
+ document.addEventListener("DOMContentLoaded", IE6StatusBar.init(), false);
+})();
diff --git a/chrome/go_button.uc.js b/chrome/go_button.uc.js
index ecd6ad1..4a3e0bd 100644
--- a/chrome/go_button.uc.js
+++ b/chrome/go_button.uc.js
@@ -1,10 +1,9 @@
(function () {
try {
Components.utils.import("resource:///modules/CustomizableUI.jsm");
- var { Services } = Components.utils.import(
- "resource://gre/modules/Services.jsm",
- {}
- );
+ var Services =
+ globalThis.Services ||
+ ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
var sss = Components.classes[
"@mozilla.org/content/style-sheet-service;1"
].getService(Components.interfaces.nsIStyleSheetService);
diff --git a/chrome/move_bars.uc.js b/chrome/move_bars.uc.js
index 178877f..a73bfa0 100644
--- a/chrome/move_bars.uc.js
+++ b/chrome/move_bars.uc.js
@@ -2,82 +2,114 @@
// option: place urlbar on a different toolbar
// option: place back button on a different toolbar
// option: place back button on a different toolbar
+(function () {
+ var {CustomizableUI} = Components.utils.import(
+ "resource:///modules/CustomizableUI.jsm",
+ {}
+ );
-var { CustomizableUI } = Components.utils.import(
- "resource:///modules/CustomizableUI.jsm",
- {}
-);
+ var navigation = CustomizableUI.AREA_NAVBAR;
+ var tabs = CustomizableUI.AREA_TABSTRIP;
+ var menu = CustomizableUI.AREA_MENUBAR;
+ var bookmarks = CustomizableUI.AREA_BOOKMARKS;
-var navigation = CustomizableUI.AREA_NAVBAR;
-var tabs = CustomizableUI.AREA_TABSTRIP;
-var menu = CustomizableUI.AREA_MENUBAR;
-var bookmarks = CustomizableUI.AREA_BOOKMARKS;
+ /* [target toolbar of item]
+ menu = 'menubar'
+ tabs = 'tabs toolbar'
+ bookmarks = 'bookmarks toolbar'
+ navigation='navigation toolbar' */
+ var backbutton_on_toolbar = navigation;
+ var forwardbutton_on_toolbar = navigation;
+ var urlbar_on_toolbar = navigation;
-/* [target toolbar of item]
- menu = 'menubar'
- tabs = 'tabs toolbar'
- bookmarks = 'bookmarks toolbar'
- navigation='navigation toolbar' */
-var backbutton_on_toolbar = navigation;
-var forwardbutton_on_toolbar = navigation;
-var urlbar_on_toolbar = navigation;
+ /* [target position of item]
+ 0 = 1st
+ 1 = 2nd
+ 2 = 3rd
+ ...
+ x = xth */
+ var backbutton_on_toolbar_position = 0;
+ var forwardbutton_on_toolbar_position = 1;
+ var urlbar_on_toolbar_position = 0;
-/* [target position of item]
- 0 = 1st
- 1 = 2nd
- 2 = 3rd
- ...
- x = xth */
-var backbutton_on_toolbar_position = 0;
-var forwardbutton_on_toolbar_position = 1;
-var urlbar_on_toolbar_position = 0;
+ const separateAddressBar = true;
+ const moveNavigation = true;
+ const bottomTabs = true;
+ const menuToTop = true;
-var MoveUrlbar = {
- init: function () {
- try {
- document.getElementById("back-button").setAttribute("removable", "true");
- document
- .getElementById("forward-button")
- .setAttribute("removable", "true");
- document
- .getElementById("urlbar-container")
- .setAttribute("removable", "true");
- document
- .getElementById("additional_top_toolbar1")
- .setAttribute("fullscreentoolbar", "true");
- } catch (e) {}
+ var MoveUrlbar = {
+ init: function () {
+ try {
+ document
+ .getElementById("back-button")
+ .setAttribute("removable", "true");
+ document
+ .getElementById("forward-button")
+ .setAttribute("removable", "true");
+ document
+ .getElementById("urlbar-container")
+ .setAttribute("removable", "true");
+ document
+ .getElementById("unified-extensions-button")
+ .setAttribute("removable", "true");
+ } catch (e) {}
- /*CustomizableUI.addWidgetToArea("back-button", backbutton_on_toolbar);
- CustomizableUI.moveWidgetWithinArea(
- "back-button",
- backbutton_on_toolbar_position
- );
- CustomizableUI.addWidgetToArea("forward-button", forwardbutton_on_toolbar);
- CustomizableUI.moveWidgetWithinArea(
- "forward-button",
- forwardbutton_on_toolbar_position
- );
- CustomizableUI.addWidgetToArea(
- "urlbar-container",
- "additional_top_toolbar1"
- );
- CustomizableUI.moveWidgetWithinArea(
- "urlbar-container",
- urlbar_on_toolbar_position
- );*/
+ // Forces back/forward to navigation bar
+ if (moveNavigation) {
+ CustomizableUI.addWidgetToArea("back-button", backbutton_on_toolbar);
+ CustomizableUI.moveWidgetWithinArea(
+ "back-button",
+ backbutton_on_toolbar_position
+ );
+ CustomizableUI.addWidgetToArea(
+ "forward-button",
+ forwardbutton_on_toolbar
+ );
+ CustomizableUI.moveWidgetWithinArea(
+ "forward-button",
+ forwardbutton_on_toolbar_position
+ );
+ }
- document
- .getElementById("navigator-toolbox")
- .appendChild(document.getElementById("TabsToolbar"));
+ // Forces address bar to additional_top_toolbar1 (Address)
+ // THIS WILL SOFTBRICK YOUR FIREFOX IF ADDITIONAL TOP TOOLBARS AREN'T
+ // ENABLED BUT THIS IS
+ if (separateAddressBar) {
+ CustomizableUI.addWidgetToArea(
+ "urlbar-container",
+ "additional_top_toolbar1"
+ );
+ CustomizableUI.moveWidgetWithinArea(
+ "urlbar-container",
+ urlbar_on_toolbar_position
+ );
+ }
- /*
- try {
- document.getElementById('back-button').setAttribute('removable','false');
- document.getElementById('forward-button').setAttribute('removable','false');
- document.getElementById('urlbar-container').setAttribute('removable','false');
- } catch(e){}
- */
- },
-};
+ // Moves tabs to the bottom of the toolbar stack
+ if (bottomTabs) {
+ document
+ .getElementById("navigator-toolbox")
+ .appendChild(document.getElementById("TabsToolbar"));
+ }
-document.addEventListener("DOMContentLoaded", MoveUrlbar.init(), false);
+ // Moves the main menu button to the top row, before the last item
+ // (activity throbber). This is because the icon is hidden but not the
+ // button and creates bad padding if you're using the navigation bar as
+ // an address bar
+ if (menuToTop) {
+ setTimeout(() => {
+ document
+ .getElementById("PanelUI-button")
+ .setAttribute("removable", "true");
+ const menubar = document.getElementById(menu);
+ menubar.insertBefore(
+ document.getElementById("PanelUI-button"),
+ menubar.lastChild
+ );
+ }, 0);
+ }
+ },
+ };
+
+ document.addEventListener("DOMContentLoaded", MoveUrlbar.init(), false);
+})();
diff --git a/chrome/go.png b/chrome/msfx/go.png
similarity index 100%
rename from chrome/go.png
rename to chrome/msfx/go.png
diff --git a/chrome/msfx/msfx.css b/chrome/msfx/msfx.css
new file mode 100644
index 0000000..636a3c8
--- /dev/null
+++ b/chrome/msfx/msfx.css
@@ -0,0 +1,2503 @@
+@import url("toolbar-label-under-icon.css");
+
+menupopup,
+panel {
+ --windows-panel-box-shadow: none !important;
+ --panel-shadow-margin: 0 !important;
+ --panel-border-radius: 0 !important;
+ --panel-padding-block: 0 !important;
+ --panel-background: Window !important;
+ --panel-color: -moz-DialogText !important;
+}
+
+#urlbar-container {
+ --urlbar-container-height: 22px !important;
+}
+
+#urlbar {
+ --urlbar-height: 22px !important;
+ --urlbar-toolbar-height: 22px !important;
+ color: WindowText !important;
+}
+
+#urlbar-scheme {
+ color: WindowText !important;
+}
+
+/* Add 3D Borders back to context menus. */
+menupopup {
+ appearance: none !important;
+ border: none !important;
+ padding: 2px !important;
+ box-shadow: inset -1px -1px 0 ThreeDDarkShadow, inset 1px 1px 0 ThreeDFace,
+ inset -2px -2px 0 ThreeDShadow, inset 2px 2px 0 ThreeDHighlight !important;
+ border: 0px solid transparent !important;
+}
+
+menuseparator:not([hidden="true"])::before {
+ height: 1px;
+ background-color: ThreeDHighlight;
+}
+
+/* Fix Menubar Selection. */
+#main-menubar > menu[_moz-menuactive="true"] {
+ color: inherit !important;
+}
+
+#main-menubar > menu {
+ appearance: menuitem !important;
+ min-height: 19px !important;
+}
+
+/* Status Bar */
+
+#browser-bottombox {
+ margin-top: 2px;
+ height: 18px;
+ /*display: var(--show-status-bar);
+ gap: 2px;
+ box-shadow: inset -1px -1px 0 ThreeDHighlight, inset 1px 1px 0 ThreeDShadow;*/
+}
+
+#main-window:not([sizemode="maximized"]) #browser-bottombox::after {
+ content: "";
+ display: inline-block;
+ width: 13px;
+ height: 13px;
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTMiIGhlaWdodD0iMTMiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDMuNDM5NiAzLjQzOTYiIHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGc+PGc+PHJlY3QgeD0iMi45MTA0IiB5PSIwLjAwMDAiIHdpZHRoPSIuMjY0NTgiIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURIaWdobGlnaHQiLz48cmVjdCB4PSIyLjY0NTgiIHk9Ii4yNjQ1OCIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlREhpZ2hsaWdodCIvPjxyZWN0IHg9IjIuMzgxMiIgeT0iLjUyOTE3IiB3aWR0aD0iLjI2NDU4IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVESGlnaGxpZ2h0Ii8+PHJlY3QgeD0iMi4xMTY3IiB5PSIuNzkzNzUiIHdpZHRoPSIuMjY0NTgiIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURIaWdobGlnaHQiLz48cmVjdCB4PSIxLjg1MjEiIHk9IjEuMDU4MyIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlREhpZ2hsaWdodCIvPjxyZWN0IHg9IjEuNTg3NSIgeT0iMS4zMjI5IiB3aWR0aD0iLjI2NDU4IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVESGlnaGxpZ2h0Ii8+PHJlY3QgeD0iMS4zMjI5IiB5PSIxLjU4NzUiIHdpZHRoPSIuMjY0NTgiIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURIaWdobGlnaHQiLz48cmVjdCB4PSIxLjA1ODMiIHk9IjEuODUyMSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlREhpZ2hsaWdodCIvPjxyZWN0IHg9Ii43OTM3NSIgeT0iMi4xMTY3IiB3aWR0aD0iLjI2NDU4IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVESGlnaGxpZ2h0Ii8+PHJlY3QgeD0iLjUyOTE3IiB5PSIyLjM4MTIiIHdpZHRoPSIuMjY0NTgiIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURIaWdobGlnaHQiLz48cmVjdCB4PSIuMjY0NTgiIHk9IjIuNjQ1OCIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlREhpZ2hsaWdodCIvPjxyZWN0IHg9IjAuMDAwMCIgeT0iMi45MTA0IiB3aWR0aD0iLjI2NDU4IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVESGlnaGxpZ2h0Ii8+PHJlY3QgeD0iMi45MTA0IiB5PSIuMjY0NTgiIHdpZHRoPSIuMjY0NTgiIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURTaGFkb3ciLz48cmVjdCB4PSIyLjY0NTgiIHk9Ii41MjkxNyIgd2lkdGg9Ii41MjkxNyIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlRFNoYWRvdyIvPjxyZWN0IHg9IjIuMzgxMiIgeT0iLjc5Mzc1IiB3aWR0aD0iLjUyOTE3IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVEU2hhZG93Ii8+PHJlY3QgeD0iMi4xMTY3IiB5PSIxLjA1ODMiIHdpZHRoPSIuNTI5MTciIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURTaGFkb3ciLz48cmVjdCB4PSIxLjg1MjEiIHk9IjEuMzIyOSIgd2lkdGg9Ii41MjkxNyIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlRFNoYWRvdyIvPjxyZWN0IHg9IjEuNTg3NSIgeT0iMS41ODc1IiB3aWR0aD0iLjUyOTE3IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVEU2hhZG93Ii8+PHJlY3QgeD0iMS4zMjI5IiB5PSIxLjg1MjEiIHdpZHRoPSIuNTI5MTciIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURTaGFkb3ciLz48cmVjdCB4PSIxLjA1ODMiIHk9IjIuMTE2NyIgd2lkdGg9Ii41MjkxNyIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlRFNoYWRvdyIvPjxyZWN0IHg9Ii43OTM3NSIgeT0iMi4zODEyIiB3aWR0aD0iLjUyOTE3IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVEU2hhZG93Ii8+PHJlY3QgeD0iLjUyOTE3IiB5PSIyLjY0NTgiIHdpZHRoPSIuNTI5MTciIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURTaGFkb3ciLz48cmVjdCB4PSIuMjY0NTgiIHk9IjIuOTEwNCIgd2lkdGg9Ii41MjkxNyIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlRFNoYWRvdyIvPjxyZWN0IHg9IjIuOTEwNCIgeT0iMS4wNTgzIiB3aWR0aD0iLjI2NDU4IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVESGlnaGxpZ2h0Ii8+PHJlY3QgeD0iMi42NDU4IiB5PSIxLjMyMjkiIHdpZHRoPSIuMjY0NTgiIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURIaWdobGlnaHQiLz48cmVjdCB4PSIyLjM4MTIiIHk9IjEuNTg3NSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlREhpZ2hsaWdodCIvPjxyZWN0IHg9IjIuMTE2NyIgeT0iMS44NTIxIiB3aWR0aD0iLjI2NDU4IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVESGlnaGxpZ2h0Ii8+PHJlY3QgeD0iMS44NTIxIiB5PSIyLjExNjciIHdpZHRoPSIuMjY0NTgiIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURIaWdobGlnaHQiLz48cmVjdCB4PSIxLjU4NzUiIHk9IjIuMzgxMiIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlREhpZ2hsaWdodCIvPjxyZWN0IHg9IjEuMzIyOSIgeT0iMi42NDU4IiB3aWR0aD0iLjI2NDU4IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVESGlnaGxpZ2h0Ii8+PHJlY3QgeD0iMS4wNTgzIiB5PSIyLjkxMDQiIHdpZHRoPSIuMjY0NTgiIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURIaWdobGlnaHQiLz48cmVjdCB4PSIyLjkxMDQiIHk9IjEuMzIyOSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlRFNoYWRvdyIvPjxyZWN0IHg9IjIuNjQ1OCIgeT0iMS41ODc1IiB3aWR0aD0iLjUyOTE3IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVEU2hhZG93Ii8+PHJlY3QgeD0iMi4zODEyIiB5PSIxLjg1MjEiIHdpZHRoPSIuNTI5MTciIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURTaGFkb3ciLz48cmVjdCB4PSIyLjExNjciIHk9IjIuMTE2NyIgd2lkdGg9Ii41MjkxNyIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlRFNoYWRvdyIvPjxyZWN0IHg9IjEuODUyMSIgeT0iMi4zODEyIiB3aWR0aD0iLjUyOTE3IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVEU2hhZG93Ii8+PHJlY3QgeD0iMS41ODc1IiB5PSIyLjY0NTgiIHdpZHRoPSIuNTI5MTciIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURTaGFkb3ciLz48cmVjdCB4PSIxLjMyMjkiIHk9IjIuOTEwNCIgd2lkdGg9Ii41MjkxNyIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlRFNoYWRvdyIvPjxyZWN0IHg9IjIuOTEwNCIgeT0iMi4xMTY3IiB3aWR0aD0iLjI2NDU4IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVESGlnaGxpZ2h0Ii8+PHJlY3QgeD0iMi42NDU4IiB5PSIyLjM4MTIiIHdpZHRoPSIuMjY0NTgiIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURIaWdobGlnaHQiLz48cmVjdCB4PSIyLjM4MTIiIHk9IjIuNjQ1OCIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlREhpZ2hsaWdodCIvPjxyZWN0IHg9IjIuMTE2NyIgeT0iMi45MTA0IiB3aWR0aD0iLjI2NDU4IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVESGlnaGxpZ2h0Ii8+PHJlY3QgeD0iMi45MTA0IiB5PSIyLjM4MTIiIHdpZHRoPSIuMjY0NTgiIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURTaGFkb3ciLz48cmVjdCB4PSIyLjY0NTgiIHk9IjIuNjQ1OCIgd2lkdGg9Ii41MjkxNyIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlRFNoYWRvdyIvPjxyZWN0IHg9IjIuMzgxMiIgeT0iMi45MTA0IiB3aWR0aD0iLjUyOTE3IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVEU2hhZG93Ii8+PHJlY3QgeD0iMy4xNzUwIiB5PSIwLjAwMDAiIHdpZHRoPSIuMjY0NTgiIGhlaWdodD0iMy40Mzk2IiBmaWxsPSItbW96LURpYWxvZyIvPjxyZWN0IHg9IjAuMDAwMCIgeT0iMy4xNzUwIiB3aWR0aD0iMy4xNzUwIiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iLW1vei1EaWFsb2ciLz48L2c+PC9nPjwvc3ZnPg==");
+}
+
+#status-text::before {
+ content: "";
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ position: fixed;
+ left: 2px;
+ bottom: 1px;
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABgUExURYaGhv///5mZmVVVVf/78ABmzDMzMwAAgDNm//Hx8czMzHd3d2aZmZnMzDMzzGb//+rq6pmZZv//mQDM/+fn1v/MmcyZZjNmzF9fXwAzmcDAwABmmYCAADMzZgQEBAAAANSdJEsAAAAgdFJOU/////////////////////////////////////////8AXFwb7QAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAIpJREFUKFNNjFsWgyAMREUIRGhTbOlLW7P/XRoD2t6Tj8w9k3TM3O3IzipMpbeHcEpvxOwCwDnrvVcRQHA4xD7ZTYTTmegCg8tRvnQcxqvU6QZDLnET6Y7bCUAuKtLjidKQg1Ibr/GNOE2Ec2t86EsoSG4/iJdlnjVXwZRMliDTBKd40IT9oeIP5hU1fA8vue4FsgAAAABJRU5ErkJggg==");
+}
+#status-text {
+ height: 18px;
+ padding-left: 16px;
+ box-shadow: inset -1px -1px 0 ThreeDHighlight, inset 1px 1px 0 ThreeDShadow;
+}
+
+#statuspanel-label {
+ color-scheme: light !important;
+ background-color: transparent !important;
+ color: -moz-DialogText !important;
+ border: 0 !important;
+ /*padding-top: unset !important;
+ padding-bottom: unset !important;
+ padding-left: 2px !important;*/
+ padding-bottom: 4px !important;
+}
+
+#statuspanel {
+ display: flex !important;
+ align-items: center !important;
+ margin-top: unset !important;
+ bottom: 1px !important;
+ left: 1px !important;
+ transition: none !important;
+ min-height: 16px !important;
+ position: fixed !important;
+ padding-top: 0 !important;
+ background-color: transparent; !important;
+}
+
+#statuspanel-inner {
+ height: 100% !important;
+ display: flex;
+ align-items: center;
+}
+
+/* I give up making comments. */
+#navigator-toolbox {
+ border-bottom: 0 !important;
+ appearance: groupbox !important;
+ box-shadow: inset 1px 1px 0 ThreeDShadow, inset 2px 2px 0 ThreeDHighlight,
+ inset -1px -1px 0 ThreeDHighlight, inset -2px -2px 0 ThreeDShadow !important;
+ padding: 2px;
+ margin-bottom: 2px !important;
+}
+
+.browserStack,
+#customization-container {
+ -moz-default-appearance: listbox !important;
+ -moz-appearance: listbox !important;
+}
+
+.browser-toolbar:not(#TabsToolbar) {
+ box-shadow: inset 0px -1px 0 ThreeDHighlight, inset 0px 0px 0 ThreeDShadow !important;
+ padding-bottom: 2px !important;
+}
+
+#PersonalToolbar {
+ padding-inline: 0 !important;
+}
+
+.tabbrowser-tab {
+ appearance: tab !important;
+ padding: 0 5px !important;
+}
+
+.tabbrowser-tab:not([pinned]):not([fadein]) {
+ max-width: 176px !important;
+}
+
+.tab-background {
+ display: none !important;
+}
+
+.tab-close-button {
+ display: var(--hide-tab-close-button) !important;
+ padding: 0 !important;
+ width: 10px !important;
+ height: 10px !important;
+ transform: translate(-1px, -1px);
+ margin-inline-end: calc(var(--inline-tab-padding) + 2px) !important;
+ list-style-image: none !important;
+ background-color: -moz-DialogText !important;
+ mask-repeat: no-repeat !important;
+ mask-position: center center !important;
+ mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA4SURBVBhXY2RgYPgPxCAAYiMDmDgYgDjIAnA+si4UHUCAbiIYoJtEvAnoOuF8kCqYBLqdQHEGBgAx7A/5GaSbcgAAAABJRU5ErkJggg==") !important;
+}
+
+.tab-close-button[pinned] {
+ display: none !important;
+}
+
+.tab-label {
+ line-height: unset !important;
+}
+
+.tab-content {
+ display: flex !important;
+ align-items: center;
+}
+
+.tab-close-button:hover {
+ background-color: WindowText;
+ opacity: 0.5 !important;
+}
+
+#urlbar-background,
+#searchbar {
+ border: 0 !important;
+ border-radius: 0 !important;
+ -moz-default-appearance: listbox !important;
+ -moz-appearance: listbox !important;
+ box-shadow: none !important;
+}
+
+#urlbar[breakout][breakout-extend] #urlbar-background {
+ height: var(--urlbar-height) !important;
+}
+
+#urlbar[breakout][breakout-extend] #favimginurlbar {
+ margin: 3px !important;
+ margin-right: 2px !important;
+}
+
+#urlbar[breakout][breakout-extend] .urlbar-input-box::after {
+ display: none !important;
+}
+
+#tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs])
+ > #tabbrowser-arrowscrollbox
+ > .tabbrowser-tab[first-visible-unpinned-tab] {
+ margin-inline-start: 0 !important;
+}
+
+#context-navigation {
+ display: flex;
+ flex-direction: column;
+ padding-bottom: 0 !important;
+}
+
+#context-navigation::after {
+ content: "";
+ display: block;
+ appearance: menuseparator;
+}
+
+#context-sep-navigation {
+ display: none !important;
+}
+
+#context-navigation > .menuitem-iconic {
+ list-style-image: none !important;
+ position: relative !important;
+ align-items: center !important;
+ justify-content: flex-start !important;
+}
+
+#context-navigation .menuitem-iconic::before {
+ display: block;
+ content: attr(aria-label);
+ /*margin-left: 16px;*/
+ padding-bottom: 0 !important;
+ height: 18px;
+ line-height: 18px;
+}
+
+#context-sep-navigation {
+ margin-top: 0 !important;
+}
+
+toolbarseparator {
+ border-left: 1px solid ThreeDShadow;
+ border-right: 1px solid ThreeDHighlight;
+ margin: 2px;
+}
+
+toolbarpaletteitem[place="toolbar"][id^="wrapper-customizableui-special-spring"],
+toolbarspring {
+ -moz-box-flex: 10000 !important;
+}
+
+#activity_throbber {
+ background-color: #000 !important;
+ height: 22px !important;
+ list-style-image: none !important;
+ background-repeat: no-repeat;
+ background-position: center center;
+ min-width: 39px !important;
+ min-height: 22px !important;
+ padding: 0 !important;
+ position: relative !important;
+ left: 0px;
+ background-image: url("data:image/bmp;base64,Qk0uCgAAAAAAADYAAAAoAAAAJgAAABYAAAABABgAAAAAAPgJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAERERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAzAAAzMwAzMwAzAAAzMwAzAAAREREAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMAAAAAADMzADMzM2YzM2YzM5lmZmZmM01NTWYzABEREQAzMxEREREREREREQAAMwAzMxEREQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzMAMzMzZjMzM2YzVVVVKSkpAAAAQkJCMzMzOTk5MzMzADMzADMzHBwcM2ZmADMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAREREzMwBmMzOZZjPMmWbMmWaZmWYcHBxmMzMREREAAAAAAAAAAAAAAAAAAAAzM2YAMzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzAGYzM2ZmM5lmZpmZZsyZmZmZZikpKZlmM5lmM2YzMwBmMwCZzACZzAAAADNmZhEREQAAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAKSkpmWYzmWZmmZlmzJmZmZlmAAAAmWYzzGYzZmYzADNmAMz/AJnMAAAAADMzERERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcHBw5OTlfX19mZjNCQkJCQkJCQkIcHBxmZjOZZjNmZjMAM2YAzP8AmcwAAAAzZmYAMzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwcHDMzM0JCQmZmmWZmmZmZzGZmmSkpKTk5ORERETMAAAAzMwBmZgAzMwAAADNmZgAzMxEREQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzMzNmM2aZZmaZZmbMmZnMZpnMERERM2bMMzPMADNmHBwcM2YzM2YzAAAAVVVVADMAADMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMAADMzM2ZmZsxmmcxmmcxmZswzAAAzZswAZswzM5kAZjNmmWYzmWYAAABmmWYzZjMcHBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzMwAzZjMzmXd3d2ZmZmZmZnd3dyIiIjNmzDMz/wAzmTMzAGbMZjOZMwAAAF9fXwBmMxwcHAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAzKSkpTU1NMzNmMzNmM2aZTU1NHBwcKSkpAAAzADMzADMzM2YzKSkpAAAAZplmMzMzADMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMAMzMAADMAMzMAADMzM2YAM2YzM2ZfX19CQkIcHBwAAAAREREpKSkzZmYzmTMzMzMAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAAAAAMwAAAAAAAAAAMwAAMwAzZjMzZjNmZjNmZl9fXzOZZjNmMzNmMwAzAAAzMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAzADMzIiIiADMzMzMAADMzADMAADMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMAAAAAMwAAMwAREREAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=");
+}
+
+#activity_throbber::before {
+ content: "";
+ position: absolute !important;
+ width: 1px !important;
+ border-left: 1px solid ThreeDShadow !important;
+ box-shadow: inset 1px 0 0 ThreeDHighlight !important;
+ height: calc(100% + 1px) !important;
+ top: 0 !important;
+ left: 0 !important;
+ z-index: 1 !important;
+}
+
+#activity_throbber[busy] {
+ background-image: url("data:image/gif;base64,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");
+}
+
+#activity_throbber .toolbarbutton-icon {
+ display: none !important;
+}
+
+#menubar-items {
+ justify-content: center !important;
+}
+
+.tab-secondary-label {
+ display: none !important;
+}
+
+#tabbrowser-tabs {
+ padding-left: 2px !important;
+}
+
+:root:not([uidensity="compact"]) .tab-content[pinned] {
+ padding: 0 !important;
+}
+
+#tabbrowser-tabs:not([secondarytext-unsupported]) .tab-label-container {
+ padding: 0 !important;
+ height: unset !important;
+ margin-top: 1px !important;
+}
+#tabbrowser-tabs:not([secondarytext-unsupported])
+ .tab-label-container:not([pinned]) {
+ width: 100% !important;
+}
+
+.tabbrowser-tab {
+ min-height: calc(var(--tab-min-height) - 3px) !important;
+ padding: 0 1px !important;
+ margin-top: 2px !important;
+ margin-bottom: -1px !important;
+}
+
+.tabbrowser-tab[pinned] {
+ padding: 0 4px !important;
+}
+
+.tabbrowser-tab[visuallyselected="true"] {
+ position: unset !important;
+ font-weight: var(--selected-tab-font-weight) !important;
+}
+
+.tabbrowser-tab:not([selected="true"]) {
+ min-height: calc(var(--tab-min-height) - 5px) !important;
+ margin-top: 4px !important;
+}
+
+.tabbrowser-tab:not([pinned]) .tab-icon-image {
+ display: var(--show-tab-icons) !important;
+ margin-bottom: 1px !important;
+}
+
+.tabbrowser-tab[pinned]
+ .tab-icon-stack[soundplaying="true"]
+ .tab-icon-image {
+ display: none !important;
+}
+
+.tabbrowser-tab[pinned] .tab-icon-overlay {
+ display: inline-block !important;
+}
+
+.tabbrowser-tab[label="New Tab"][image]:not([busy]) .tab-icon-image {
+ opacity: 0;
+}
+
+.tabbrowser-tab[label="New Tab"][image]:not([busy])
+ .tab-label-container:not([selected="true"])::before {
+ top: 1px;
+}
+
+.tabbrowser-tab[label="New Tab"][image]:not([busy])
+ .tab-label-container::before {
+ content: "";
+ display: var(--show-tab-icons) !important;
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABgUExURYaGhv///5mZmVVVVf/78ABmzDMzMwAAgDNm//Hx8czMzHd3d2aZmZnMzDMzzGb//+rq6pmZZv//mQDM/+fn1v/MmcyZZjNmzF9fXwAzmcDAwABmmYCAADMzZgQEBAAAANSdJEsAAAAgdFJOU/////////////////////////////////////////8AXFwb7QAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAIpJREFUKFNNjFsWgyAMREUIRGhTbOlLW7P/XRoD2t6Tj8w9k3TM3O3IzipMpbeHcEpvxOwCwDnrvVcRQHA4xD7ZTYTTmegCg8tRvnQcxqvU6QZDLnET6Y7bCUAuKtLjidKQg1Ibr/GNOE2Ec2t86EsoSG4/iJdlnjVXwZRMliDTBKd40IT9oeIP5hU1fA8vue4FsgAAAABJRU5ErkJggg==") !important;
+ background-size: 100%;
+ width: 16px;
+ height: 16px;
+ position: absolute;
+ top: 2px;
+ left: 0px;
+ pointer-events: none;
+ opacity: 1;
+}
+
+.tab-throbber:not([pinned]),
+.tab-icon-pending:not([pinned]),
+.tab-icon-image:not([pinned]),
+.tab-sharing-icon-overlay:not([pinned]),
+.tab-icon-overlay:not([pinned]) {
+ margin-inline-end: 3px !important;
+}
+
+:root[uidensity="compact"]
+ .tab-icon-stack[indicator-replaces-favicon]
+ > :not(.tab-icon-overlay),
+#tabbrowser-tabs[secondarytext-unsupported]
+ .tab-icon-stack[indicator-replaces-favicon]
+ > :not(.tab-icon-overlay),
+:root:not([uidensity="compact"])
+ #tabbrowser-tabs:not([secondarytext-unsupported])
+ .tabbrowser-tab:not(:hover)
+ .tab-icon-overlay[indicator-replaces-favicon],
+:root:not([uidensity="compact"])
+ #tabbrowser-tabs:not([secondarytext-unsupported])
+ .tabbrowser-tab:hover
+ .tab-icon-stack[indicator-replaces-favicon]
+ > :not(.tab-icon-overlay) {
+ opacity: 1 !important;
+}
+
+.tab-icon-stack {
+ display: flex !important;
+}
+
+.tab-icon-stack[indicator-replaces-favicon="true"] .tab-icon-image {
+ margin-inline-end: 0 !important;
+}
+
+/*#tabbrowser-tabs tab:first-of-type:last-of-type,
+#tabbrowser-tabs tab:first-of-type:last-of-type ~ #tabs-newtab-button,
+#tabbrowser-tabs
+ tab:first-of-type:last-of-type
+ ~ #tabbrowser-arrowscrollbox-periphery
+ #tabs-newtab-button,
+#tabbrowser-tabs tab:first-of-type:last-of-type {
+ display: none !important;
+}*/
+
+#reload-button,
+#stop-button,
+#reload-button:not([displaystop]) + #stop-button,
+#reload-button[displaystop] {
+ display: inherit !important;
+}
+
+#stop-reload-button {
+ flex-direction: var(--stop-reload-order) !important;
+}
+
+#urlbar[breakout-extend] {
+ top: calc(
+ var((--urlbar-toolbar-height) - var(--urlbar-height)) / 2
+ ) !important;
+ left: 0 !important;
+ width: 100% !important;
+}
+
+#urlbar[breakout-extend] #urlbar-input-container {
+ height: var(--urlbar-height) !important;
+ padding-block: 0px !important;
+ padding-inline: 0px !important;
+}
+
+:root[inFullscreen] #browser-bottombox {
+ display: none !important;
+}
+
+:root[inFullscreen] .browserStack {
+ -moz-default-appearance: none !important;
+ -moz-appearance: none !important;
+}
+
+.bookmark-item {
+ border: 1px solid transparent;
+ border-radius: 0 !important;
+ margin: 0 !important;
+ background: transparent !important;
+ padding: 0 !important;
+ padding-inline: 4px !important;
+}
+
+.bookmark-item[label=""],
+#tabs-newtab-button,
+.toolbarbutton-1:not(#activity_throbber):not(#back-button):not(#go-button):not(
+ #find-button
+ ):not(#bookmarks-menu-button):not(#history-panelmenu):not(#sidebar-button):not(#ie6_statusbar),
+#PlacesChevron,
+#sidebar-close,
+#placesToolbar > toolbarbutton:not([disabled]) {
+ width: 22px;
+ height: 22px;
+}
+
+#status-bar {
+ color: -moz-DialogText;
+ gap: 2px;
+}
+
+#status-bar .toolbaritem-combined-buttons {
+ height: 18px !important;
+ min-height: 18px !important;
+}
+
+#status-bar
+ .toolbarbutton-1:not(#activity_throbber):not(#back-button):not(
+ #ie6_statusbar
+ ) {
+ width: 22px;
+ height: 18px !important;
+ min-height: 18px !important;
+ box-shadow: inset -1px -1px 0 ThreeDHighlight, inset 1px 1px 0 ThreeDShadow;
+}
+
+.bookmark-item:not(.menuitem-iconic):hover,
+#tabs-newtab-button:hover,
+.toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar):not(
+ [disabled]
+ ):hover,
+#PlacesChevron:hover,
+#sidebar-close:hover,
+#placesToolbar > toolbarbutton:not([disabled]):hover,
+#main-menubar > menu[_moz-menuactive],
+#stop-button:hover {
+ border-top-color: ThreeDHighlight !important;
+ border-left-color: ThreeDHighlight !important;
+ border-right-color: ThreeDShadow !important;
+ border-bottom-color: ThreeDShadow !important;
+ background-color: transparent !important;
+ border-radius: 0 !important;
+}
+
+#main-menubar > menu {
+ border: 1px solid transparent;
+}
+
+.bookmark-item:active,
+.bookmark-item[open="true"],
+#sidebar-close:active,
+#tabs-newtab-button:active,
+.toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar):not(
+ [disabled]
+ ):active,
+.toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar)[open="true"],
+#PlacesChevron[open="true"],
+#PlacesChevron:active,
+#placesToolbar > toolbarbutton:not([disabled]):active,
+#main-menubar > menu[_moz-menuactive][open],
+#stop-button:active {
+ border-top-color: ThreeDShadow !important;
+ border-left-color: ThreeDShadow !important;
+ border-right-color: ThreeDHighlight !important;
+ border-bottom-color: ThreeDHighlight !important;
+ background-color: transparent !important;
+ border-radius: 0 !important;
+}
+
+#PlacesChevron[open="true"] .toolbarbutton-icon,
+#PlacesChevron:active .toolbarbutton-icon,
+#PlacesToolbar .bookmark-item:active > *,
+#PlacesToolbar .bookmark-item[open="true"] > *,
+.toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar):active > *,
+.toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar)[open="true"] > *,
+#viewButton[open="true"] .button-box,
+#viewButton:active .button-box,
+#sidebar-close:active .toolbarbutton-icon,
+.close-icon.findbar-closebutton:active,
+.findbar-find-previous:not([disabled="true"]):active .toolbarbutton-icon,
+.findbar-find-next:not([disabled="true"]):active .toolbarbutton-icon,
+#tabs-newtab-button:active .toolbarbutton-icon,
+#placesToolbar > toolbarbutton:not([disabled]):active,
+.infobar.container .notification-close:active {
+ transform: translate(1px, 1px);
+}
+
+#PlacesToolbarItems > toolbarseparator {
+ padding-inline: 0 !important;
+ margin: 2px !important;
+}
+
+#PlacesToolbarItems > toolbarseparator::before {
+ display: none !important;
+}
+
+.bookmark-item[container],
+.bookmark-item[container] > .menu-iconic-left > .menu-iconic-icon {
+ list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAYUExURZmZAAAAAPHx8f//zP//mczMZv/MmQAAAHwygQUAAAAIdFJOU/////////8A3oO9WQAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAFBJREFUKFNdz0kSwCAIBVEICPe/cT5DkWC74slCya8AFHHPAHpEVEeITpV7uS9fejhAJ1tgOHsD8oO43xspA3VvDT1hLuiHVQDnVXxud4H7C0+1BHuF0oyhAAAAAElFTkSuQmCC") !important;
+}
+
+.bookmark-item[open="true"][container] {
+ list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAVUExURZmZAPj4+P//mczMZgAAAP/MmQAAAICpg0sAAAAHdFJOU////////wAaSwNGAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAWElEQVQoU13PWw7AIAwDwdA87n/k2oagiG1/PKJItXoiGNtTYIu1GPbHls5hNoCQxwAGmLngHMgvPfxC8t3Qd+BEWuARYGHjGwLk7HQLwUhQMetfuD1Q9QOj9wNL8v7HsAAAAABJRU5ErkJggg==") !important;
+}
+
+.bookmark-item .toolbarbutton-text {
+ margin-right: 1px !important;
+}
+
+/*#PlacesToolbar menupopup {
+ background: transparent !important;
+ padding: 0 !important;
+ box-shadow: none !important;
+}*/
+
+.tab-throbber {
+ display: none !important;
+}
+
+#PlacesToolbarItems::before {
+ content: "Links";
+ display: inline-block;
+ height: 100%;
+ line-height: 22px;
+ padding-left: 4px;
+ padding-right: 4px;
+}
+
+#additional_top_toolbar1::before {
+ content: "Address";
+ display: block;
+ height: 100%;
+ line-height: 22px;
+ padding-left: 4px;
+ padding-right: 4px;
+ -moz-box-ordinal-group: 1 !important;
+}
+
+#additional_top_toolbar1::after,
+.browser-toolbar::after,
+#additional_top_toolbar1 #personal-bookmarks::after,
+#PersonalToolbar::after {
+ content: "";
+ display: var(--lock-toolbars);
+ width: 1px;
+ box-shadow: inset -1px -1px 0 ThreeDShadow, inset 1px 1px 0 ThreeDHighlight;
+ padding: 1px;
+ margin-top: 2px;
+ margin-right: 0px;
+ margin-left: 2px;
+ margin-bottom: 2px;
+ cursor: ew-resize;
+ order: -1 !important;
+}
+
+#navigator-toolbox::after {
+ content: "";
+ display: var(--lock-toolbars);
+ height: 1px;
+ box-shadow: inset -1px -1px 0 ThreeDShadow, inset 1px 1px 0 ThreeDHighlight;
+ padding: 1px;
+ cursor: ns-resize;
+ order: 1 !important;
+}
+
+#urlbar-container {
+ display: flex !important;
+}
+
+#PersonalToolbar {
+ padding-left: 0 !important;
+ -moz-box-ordinal-group: 10 !important;
+}
+
+#TabsToolbar {
+ -moz-box-ordinal-group: 11 !important;
+}
+
+.tab-icon-overlay[soundplaying] {
+ list-style-image: none !important;
+ mask-position: center center;
+ mask-repeat: no-repeat;
+ mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAMAAABFNRROAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAGUExURQAAAAAAAKVnuc8AAAACdFJOU/8A5bcwSgAAAAlwSFlzAAAOwwAADsMBx2+oZAAAADFJREFUGFdjYEQGWHkoFAOQArHAPAYQD8QEIRAAMgjzwHy4PjAXwoLw0CgoQOYxMgIAL5wAhbFaK4UAAAAASUVORK5CYII=") !important;
+ background: -moz-DialogText !important;
+}
+
+.tab-icon-overlay[muted] {
+ list-style-image: none !important;
+ mask-position: center center;
+ mask-repeat: no-repeat;
+ mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAMAAABFNRROAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAGUExURQAAAAAAAKVnuc8AAAACdFJOU/8A5bcwSgAAAAlwSFlzAAAOwwAADsMBx2+oZAAAADNJREFUGFdtigEKADAIAvX/n17OhBoTSa8Cp36U3U1MQlFbXTePkL+em0u7SGk5N0WTyAMtxwCAzRsJ1wAAAABJRU5ErkJggg==") !important;
+ background: -moz-DialogText !important;
+}
+
+.tab-icon-overlay[activemedia-blocked] {
+ list-style-image: none !important;
+ mask-position: center center;
+ mask-repeat: no-repeat;
+ mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAdSURBVChTYxhQ8B+KQQCZjReMaoKCQa6JFoCBAQARRSPdHMGSFgAAAABJRU5ErkJgggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==") !important;
+ background: -moz-DialogText !important;
+}
+
+.tab-icon-overlay[indicator-replaces-favicon] {
+ padding: 0 !important;
+ border-radius: 0 !important;
+ margin-inline-end: 3px !important;
+}
+
+.tab-icon-overlay[pinned]:not([soundplaying]):not([muted]):not(
+ [activemedia-blocked]
+ ) {
+ display: none !important;
+}
+
+.tabbrowser-tab:not([fadein])::before {
+ content: "";
+ display: block;
+ width: calc(100% - 1px);
+ height: 2px;
+ margin-top: -8px;
+ left: 0;
+ appearance: menuseparator;
+ position: absolute;
+ z-index: 2;
+ pointer-events: none !important;
+}
+
+.tabbrowser-tab:not([selected="true"])::before {
+ margin-top: -10px !important;
+}
+
+#tabs-newtab-button {
+ min-height: 22px !important;
+ min-width: 24px !important;
+ border: 1px solid transparent;
+ padding: 0 !important;
+ background: transparent !important;
+}
+
+toolbar:not(#TabsToolbar) #new-tab-button {
+ width: 24px !important;
+}
+
+#tabs-newtab-button .toolbarbutton-icon,
+toolbar:not(#TabsToolbar) #new-tab-button .toolbarbutton-icon,
+#TabsToolbar #wrapper-new-tab-button #new-tab-button,
+#tabs-newtab-button,
+#TabsToolbar #new-tab-button {
+ padding: 0 !important;
+ width: 16px !important;
+ height: 16px !important;
+ list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAA2UExURYCAgP///+Pj40JCQsDAwDOZADPMMzNmAACAgDNm/8z//zPM/zP//wBmAAAAAACAAAAA/wAAAD6tG54AAAASdFJOU///////////////////////AOK/vxIAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABmSURBVChTXc7REoUgCEVR04NWBLf+/2cvpBbTfnKWDEMKXV5KyyiXmxxARDCAkwGoUlvhgOKw7a0xbwGOg1k0wE9YagCpH4DIeWpYukBVc37Anr0B5a2DHYvZhDFgdQgjE8a/Va4/5y0FqgTh7iIAAAAASUVORK5CYII=") !important;
+}
+
+#TabsToolbar #new-tab-button {
+ padding-inline: 3px !important;
+}
+
+toolbar #new-tab-button.toolbarbutton-1 > .toolbarbutton-icon {
+ padding: 0 !important;
+}
+
+.tab-icon-pending {
+ display: none !important;
+}
+
+#urlbar-container {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ margin-inline: 0 !important;
+}
+
+#urlbar[breakout] {
+ min-height: var(--urlbar-height) !important;
+ font: menu !important;
+ display: -moz-box !important;
+}
+
+#urlbar[breakout][breakout-extend] {
+ display: block !important;
+}
+
+#urlbar[breakout][breakout-extend] #identity-box {
+ margin-inline-end: 1px !important;
+}
+
+#PersonalToolbar {
+ overflow: unset !important;
+}
+
+#urlbar-input-container {
+ border: 0 !important;
+}
+
+#tracking-protection-icon-container,
+#star-button-box,
+#identity-icon-box,
+#identity-permission-box {
+ display: none !important;
+}
+
+#favimginurlbar {
+ margin: 3px !important;
+}
+
+#urlbar[focused="true"]:not([suppress-focus-border]) > #urlbar-background,
+#searchbar:focus-within {
+ outline: 0 !important;
+ box-shadow: none !important;
+}
+
+#identity-box {
+ margin-inline-end: 2px !important;
+}
+
+#urlbar[breakout][breakout-extend] #identity-box {
+ margin-inline-end: 0 !important;
+}
+
+#urlbar-go-button,
+.urlbarView-row[label]::before {
+ display: none !important;
+}
+
+.urlbarView-row[label] {
+ margin-block-start: 0 !important;
+}
+
+.urlbarView-row:not([type="tip"], [type="dynamic"])[selected]
+ > .urlbarView-row-inner,
+.urlbarView-row-inner[selected] {
+ background-color: Highlight !important;
+ color: HighlightText !important;
+}
+
+.urlbarView-row {
+ padding-block: 0 !important;
+ border-radius: 0 !important;
+ padding: 0 !important;
+}
+
+:root:not([uidensity="compact"]) .urlbarView-row-inner {
+ min-height: 100% !important;
+ padding-block: 0 !important;
+ padding-inline: 3px !important;
+ padding-top: 1px !important;
+}
+
+:root:not([uidensity="compact"])
+ .urlbarView-row:not([type="tip"], [type="dynamic"]) {
+ min-height: unset !important;
+}
+
+.urlbarView-row-inner {
+ padding-block: 3px !important;
+ border-radius: 0 !important;
+ padding-inline: 2px !important;
+}
+
+.urlbarView-row:not([type="tip"], [type="dynamic"], [has-buttons]):hover
+ > .urlbarView-row-inner,
+.urlbarView-row[has-buttons] > .urlbarView-row-inner:not([selected]):hover {
+ background-color: Highlight !important;
+ color: HighlightText !important;
+}
+
+#back-button,
+#forward-button,
+#stop-button,
+#reload-button,
+#home-button,
+#downloads-button,
+#history-panelmenu,
+#bookmarks-menu-button,
+#print-button,
+#new-window-button,
+#cut-button,
+#copy-button,
+#paste-button,
+#fullscreen-button,
+#find-button,
+#email-link-button,
+#sidebar-button,
+#library-button,
+#characterencoding-button,
+#preferences-button {
+ list-style-image: none !important;
+ -moz-context-properties: unset !important;
+ fill: unset !important;
+ opacity: unset !important;
+}
+
+#back-button > .toolbarbutton-icon,
+#forward-button > .toolbarbutton-icon,
+#stop-button > .toolbarbutton-icon,
+#reload-button > .toolbarbutton-icon,
+#home-button > .toolbarbutton-icon,
+#downloads-button #downloads-indicator-anchor,
+/*#downloads-button > .toolbarbutton-icon,
+#downloads-button > .toolbarbutton-badge-stack,*/
+#history-panelmenu > .toolbarbutton-icon,
+#bookmarks-menu-button > .toolbarbutton-icon,
+#print-button > .toolbarbutton-icon,
+#new-window-button > .toolbarbutton-icon,
+#cut-button > .toolbarbutton-icon,
+#copy-button > .toolbarbutton-icon,
+#paste-button > .toolbarbutton-icon,
+#fullscreen-button > .toolbarbutton-icon,
+#find-button > .toolbarbutton-icon,
+#email-link-button > .toolbarbutton-icon,
+#sidebar-button > .toolbarbutton-icon,
+#library-button > .toolbarbutton-icon,
+#characterencoding-button > .toolbarbutton-icon,
+#preferences-button > .toolbarbutton-icon {
+ padding: 0 !important;
+ opacity: unset !important;
+ width: 16px !important;
+ background-image: url("toolbar.png") !important;
+ list-style-image: none !important;
+ height: 16px !important;
+}
+
+#nav-bar
+ toolbarbutton:not(#tabs-newtab-button):not(:hover):not(
+ #forward-button[disabled="true"]
+ ):not(#back-button[disabled="true"])
+ .toolbarbutton-icon {
+ mix-blend-mode: var(--toolbar-tinting);
+}
+
+#nav-bar .toolbarbutton-1 {
+ min-height: 12px !important;
+}
+
+.toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar):not(#status-text) {
+ border: 1px solid transparent;
+}
+#status-bar
+ .toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar):not(
+ #status-text
+ ),
+#status-bar
+ .toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar):not(
+ #status-text
+ ):hover {
+ border: none !important;
+ border-radius: 0 !important;
+}
+
+toolbarbutton:where([disabled="true"]) {
+ color: ThreeDShadow !important;
+ text-shadow: 1px 1px 0 ThreeDHighlight;
+}
+
+#nav-bar #back-button:where([disabled="true"]),
+#nav-bar #forward-button:where([disabled="true"]) {
+ border-color: transparent !important;
+}
+
+toolbar:not(#nav-bar) .webextension-browser-action {
+ padding: 0 4px !important;
+}
+
+#PersonalToolbar
+ .toolbarbutton-1:not([disabled="true"]):is([open], [checked], :hover:active),
+#tabbrowser-arrowscrollbox:not([scrolledtostart="true"])::part(
+ scrollbutton-up
+ ):hover:active,
+#tabbrowser-arrowscrollbox:not([scrolledtoend="true"])::part(
+ scrollbutton-down
+ ):hover:active,
+toolbarbutton.bookmark-item:hover:active:not(.subviewbutton, [disabled="true"]),
+toolbarbutton.bookmark-item[open="true"],
+toolbar
+ .toolbarbutton-1:not([disabled="true"]):is([open], [checked], :hover:active)
+ > .toolbarbutton-icon,
+toolbar
+ .toolbarbutton-1:not([disabled="true"]):is([open], [checked], :hover:active)
+ > .toolbarbutton-text,
+toolbar
+ .toolbarbutton-1:not([disabled="true"]):is([open], [checked], :hover:active)
+ > .toolbarbutton-badge-stack {
+ background: transparent !important;
+}
+
+#nav-bar .toolbarbutton-icon {
+ margin-left: 1px !important;
+ margin-right: 1px !important;
+}
+
+#back-button[disabled="true"] .toolbarbutton-icon,
+#forward-button[disabled="true"] .toolbarbutton-icon {
+ fill: currentColor;
+ color: ThreeDShadow;
+ filter: drop-shadow(1px 1px 0 ThreeDHighlight) !important;
+ -moz-context-properties: fill, fill-opacity;
+}
+
+#forward-button[disabled="true"],
+#forward-button:hover[disabled="true"],
+#back-button[disabled="true"],
+#back-button:hover[disabled="true"] {
+ -moz-image-region: unset !important;
+}
+
+#nav-bar #back-button[disabled="true"] > *,
+#nav-bar #forward-button[disabled="true"] {
+ transform: none !important;
+}
+
+#back-button[disabled="true"] .toolbarbutton-icon,
+#forward-button[disabled="true"] .toolbarbutton-icon {
+ background-image: none !important;
+ list-style-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZlcnNpb249IjEuMSIgZmlsbD0iY29udGV4dC1maWxsIiBmaWxsLW9wYWNpdHk9ImNvbnRleHQtZmlsbC1vcGFjaXR5IiB2aWV3Qm94PSIwIDAgNC4yMzMzIDQuMjMzMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBzdHJva2Utd2lkdGg9Ii4yNjQ1OCI+PHJlY3QgeD0iLjUyOTE3IiB5PSIxLjg1MjEiIHdpZHRoPSIzLjE3NSIgaGVpZ2h0PSIuNTI5MTciLz48cmVjdCB4PSIuNzkzNzUiIHk9IjEuNTg3NSIgd2lkdGg9IjIuOTEwNCIgaGVpZ2h0PSIxLjA1ODMiLz48cmVjdCB4PSIxLjMyMjkiIHk9IjEuMDU4MyIgd2lkdGg9Ii41MjkxNyIgaGVpZ2h0PSIyLjExNjciLz48cmVjdCB4PSIxLjU4NzUiIHk9Ii43OTM3NSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIyLjY0NTgiLz48cmVjdCB4PSIxLjA1ODMiIHk9IjEuMzIyOSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIxLjU4NzUiLz48L2c+PC9zdmc+Cg==") !important;
+}
+
+#forward-button[disabled="true"] .toolbarbutton-icon,
+#forward-button[disabled="true"]:active .toolbarbutton-icon,
+#forward-button[disabled="true"] .toolbarbutton-icon:active {
+ transform: scaleX(-1) !important;
+}
+
+#nav-bar
+ .toolbarbutton-1:not(#back-button[disabled="true"]):not(
+ #forward-button[disabled="true"]
+ ):hover
+ .toolbarbutton-icon,
+#nav-bar
+ .toolbarbutton-1:not(#back-button[disabled="true"]):not(
+ #forward-button[disabled="true"]
+ ):active
+ .toolbarbutton-icon,
+#nav-bar
+ .toolbarbutton-1:not(#back-button[disabled="true"]):not(
+ #forward-button[disabled="true"]
+ )[open="true"]
+ .toolbarbutton-icon {
+ filter: none !important;
+}
+
+#nav-bar-customization-target > :is(toolbarbutton, toolbaritem):first-child,
+#nav-bar-customization-target
+ > toolbarpaletteitem:first-child
+ > :is(toolbarbutton, toolbaritem) {
+ padding-inline-start: 0 !important;
+}
+
+#nav-bar {
+ height: 24px;
+}
+
+#nav-bar .toolbarbutton-1 .toolbarbutton-text,
+#toolbar-menubar .toolbarbutton-1 .toolbarbutton-text {
+ padding-left: 1px !important;
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ min-height: unset !important;
+}
+
+#back-button .toolbarbutton-text {
+ display: var(--hide-back-button-text) !important;
+}
+
+#find-button .toolbarbutton-text {
+ display: var(--hide-find-button-text) !important;
+}
+
+#bookmarks-menu-button .toolbarbutton-text,
+#library-button .toolbarbutton-text {
+ display: var(--hide-bookmarks-menu-button-text) !important;
+}
+
+#history-panelmenu .toolbarbutton-text {
+ display: var(--hide-history-button-text) !important;
+}
+#sidebar-button .toolbarbutton-text {
+ display: var(--hide-history-button-text) !important;
+}
+
+#back-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 0) !important;
+}
+#back-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#forward-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 1) !important;
+}
+#forward-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#reload-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 2) !important;
+}
+#reload-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#stop-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 3) !important;
+}
+#stop-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#home-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 4) !important;
+}
+#home-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#find-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 5) !important;
+}
+#find-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#bookmarks-menu-button .toolbarbutton-icon,
+#library-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 6) !important;
+}
+#bookmarks-menu-button:hover .toolbarbutton-icon,
+#library-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#history-panelmenu .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 7) !important;
+}
+#history-panelmenu:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#downloads-button {
+ width: 24px !important;
+}
+
+#downloads-button #downloads-indicator-anchor {
+ background-position-x: calc(var(--toolbar-size) * 12) !important;
+}
+
+#downloads-button:hover #downloads-indicator-anchor {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#print-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 8) !important;
+}
+#print-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#email-link-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 14) !important;
+}
+#email-link-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#cut-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 10) !important;
+}
+#cut-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#copy-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 9) !important;
+}
+#copy-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#paste-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 11) !important;
+}
+#paste-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#sidebar-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 13) !important;
+}
+#sidebar-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#fullscreen-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 15) !important;
+}
+#fullscreen-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#new-window-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 16) !important;
+}
+#new-window-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#characterencoding-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 17) !important;
+}
+#characterencoding-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#preferences-button .toolbarbutton-icon {
+ background-position-x: calc(var(--toolbar-size) * 18) !important;
+}
+#preferences-button:hover .toolbarbutton-icon {
+ background-position-y: calc(var(--toolbar-size) * -1) !important;
+}
+
+#edit-controls {
+ margin: 0 !important;
+ display: flex;
+}
+
+#edit-controls separator {
+ display: none !important;
+}
+
+#edit-controls .toolbarbutton-1 {
+ width: 24px !important;
+ height: 100% !important;
+}
+
+#downloads-button .toolbarbutton-animatable-box {
+ display: none !important;
+}
+
+#downloads-button[indicator]
+ > .toolbarbutton-badge-stack
+ > image.toolbarbutton-icon {
+ display: unset !important;
+}
+
+toolbarpaletteitem[mousedown] > toolbarbutton > .toolbarbutton-icon,
+toolbarpaletteitem[mousedown]
+ > toolbarbutton
+ > .toolbarbutton-badge-stack
+ > .toolbarbutton-icon {
+ transform: none !important;
+}
+
+.urlbarView-favicon {
+ margin-inline-start: 3px !important;
+ margin-inline-end: 5px !important;
+}
+
+#urlbar[open] > #urlbar-background {
+ box-shadow: none !important;
+}
+
+/*.urlbarView {
+ border-inline: 0 !important;
+ margin-inline: 0 !important;
+ width: calc(100% + 16px) !important;
+ padding: 0 !important;
+ border-inline: 1px solid red;
+}
+
+.urlbarView-body-outer {
+ border: 1px solid #000;
+ background-color: Window !important;
+}*/
+
+.urlbarView-results {
+ padding-block: 0 !important;
+}
+
+.webextension-browser-action .toolbarbutton-badge-stack {
+ padding: 0 !important;
+}
+
+#PanelUI-menu-button {
+ list-style-image: none !important;
+}
+
+#PersonalToolbar
+ .toolbarbutton-1:not([disabled="true"], [checked], [open], :active):hover,
+#tabbrowser-arrowscrollbox:not([scrolledtostart="true"])::part(
+ scrollbutton-up
+ ):hover,
+#tabbrowser-arrowscrollbox:not([scrolledtoend="true"])::part(
+ scrollbutton-down
+ ):hover,
+toolbarbutton.bookmark-item:not(
+ .subviewbutton,
+ [disabled="true"],
+ [open]
+ ):hover,
+toolbar
+ .toolbarbutton-1:not([disabled="true"], [checked], [open], :active):hover
+ > .toolbarbutton-icon,
+toolbar
+ .toolbarbutton-1:not([disabled="true"], [checked], [open], :active):hover
+ > .toolbarbutton-text,
+toolbar
+ .toolbarbutton-1:not([disabled="true"], [checked], [open], :active):hover
+ > .toolbarbutton-badge-stack {
+ background: transparent !important;
+}
+
+#BMB_bookmarksPopup {
+ box-shadow: none !important;
+ padding: 0 !important;
+}
+
+#tabbrowser-tabs,
+#tabbrowser-arrowscrollbox,
+#tabbrowser-tabs[positionpinnedtabs]
+ > #tabbrowser-arrowscrollbox
+ > .tabbrowser-tab[pinned] {
+ min-height: 0 !important;
+}
+
+#favimginurlbar[style='width: 16px; height: 16px; margin: 3px; list-style-image: url("chrome://branding/content/icon32.png");']
+{
+ list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABgUExURYaGhv///5mZmVVVVf/78ABmzDMzMwAAgDNm//Hx8czMzHd3d2aZmZnMzDMzzGb//+rq6pmZZv//mQDM/+fn1v/MmcyZZjNmzF9fXwAzmcDAwABmmYCAADMzZgQEBAAAANSdJEsAAAAgdFJOU/////////////////////////////////////////8AXFwb7QAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAIpJREFUKFNNjFsWgyAMREUIRGhTbOlLW7P/XRoD2t6Tj8w9k3TM3O3IzipMpbeHcEpvxOwCwDnrvVcRQHA4xD7ZTYTTmegCg8tRvnQcxqvU6QZDLnET6Y7bCUAuKtLjidKQg1Ibr/GNOE2Ec2t86EsoSG4/iJdlnjVXwZRMliDTBKd40IT9oeIP5hU1fA8vue4FsgAAAABJRU5ErkJggg==") !important;
+}
+
+#PlacesChevron,
+#nav-bar-overflow-button {
+ width: 16px !important;
+ height: 100% !important;
+ border: 1px solid transparent;
+ list-style-image: none !important;
+ padding: 0 !important;
+}
+
+#personal-toolbar-empty-description,
+#PersonalToolbar .toolbarbutton-1,
+toolbarbutton.bookmark-item:not(.subviewbutton) {
+ margin: 0 !important;
+}
+
+#PlacesChevron .toolbarbutton-icon,
+#nav-bar-overflow-button .toolbarbutton-icon {
+ mask-position: center 4px;
+ width: 8px !important;
+ height: 100% !important;
+ padding: 6px !important;
+ margin: 0 !important;
+ background-color: WindowText !important;
+ mask-repeat: no-repeat;
+ mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAoSURBVBhXYwCC/1AMA+h8MMCpiBFEQAFMAUwMWQNCBxSg8PFIMjAAAMnUEfGcoUqiAAAAAElFTkSuQmCC") !important;
+}
+
+findbar {
+ background-color: ThreeDFace !important;
+ color: WindowText !important;
+ transition: none !important;
+ border-top: 0 !important;
+ padding-block-start: 4px !important;
+ padding-block-end: 4px !important;
+}
+
+.findbar-textbox {
+ border-radius: 0 !important;
+ border: 0 !important;
+ -moz-default-appearance: listbox !important;
+ -moz-appearance: listbox !important;
+ background-color: unset !important;
+ padding: 0px 3px !important;
+ height: 22px !important;
+}
+
+.findbar-find-previous,
+.findbar-find-next {
+ padding: 0 !important;
+ width: 22px !important;
+ min-height: 22px !important;
+ border-radius: 0 !important;
+ mask-repeat: no-repeat !important;
+ mask-position: center center !important;
+ border: 1px solid transparent;
+ background-color: -moz-Dialog !important;
+}
+
+.findbar-find-previous {
+ margin-inline: 4px 0 !important;
+}
+
+.findbar-find-next {
+ margin-inline-end: 4px !important;
+}
+
+hbox[anonid="findbar-textbox-wrapper"]::after {
+ content: "" !important;
+ height: 20px !important;
+ display: inline-block !important;
+ border-left: 1px solid ThreeDShadow !important;
+ border-right: 1px solid ThreeDHighlight !important;
+}
+
+.findbar-find-previous:not([disabled="true"]):hover,
+.findbar-find-next:not([disabled="true"]):hover {
+ box-shadow: inset -1px -1px 0 ThreeDShadow, inset 1px 1px 0 ThreeDHighlight;
+}
+
+.findbar-find-previous:not([disabled="true"]):active,
+.findbar-find-next:not([disabled="true"]):active {
+ box-shadow: inset -1px -1px 0 ThreeDHighlight, inset 1px 1px 0 ThreeDShadow;
+}
+
+.findbar-find-previous .toolbarbutton-icon,
+.findbar-find-next .toolbarbutton-icon {
+ list-style-image: none !important;
+ mask-repeat: no-repeat !important;
+ mask-position: center center !important;
+ background-color: WindowText !important;
+ padding: 0 !important;
+ min-width: 20px;
+ min-height: 20px;
+}
+
+.findbar-find-next .toolbarbutton-icon {
+ mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAECAYAAABCxiV9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAkSURBVBhXY2RgYPgPxFgBSBIEsClghEmCALICZHE4QFLAwAAA+twEAr6ulF8AAAAASUVORK5CYII=") !important;
+}
+
+.findbar-find-previous .toolbarbutton-icon {
+ mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAECAYAAABCxiV9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAlSURBVBhXY0AD/6E0GDBCaRBAlgCLwyRRdEABI0gSmwQQMDAAAPqFBAIR7Pg5AAAAAElFTkSuQmCC") !important;
+}
+
+.findbar-container {
+ height: 22px !important;
+ margin-inline-start: 0 !important;
+ overflow-inline: unset !important;
+}
+
+.findbar-container::before {
+ content: "Find:" !important;
+ display: inline-block !important;
+ margin-inline-start: 4px !important;
+ margin-inline-end: 4px !important;
+}
+
+.findbar-textbox:focus {
+ outline: 0 !important;
+}
+
+.toolbarbutton.tabbable {
+ padding: 0 !important;
+}
+
+.browserContainer > findbar,
+.close-icon.findbar-closebutton {
+ order: -1;
+}
+
+.close-icon.findbar-closebutton,
+.infobar.container .notification-close {
+ list-style-image: none !important;
+ height: 22px !important;
+ width: 22px !important;
+ border-radius: 0 !important;
+ padding: 0 !important;
+ margin: 0 !important;
+ margin-inline-start: 4px !important;
+ margin-inline-end: 4px !important;
+ background-color: WindowText !important;
+ fill: WindowText !important;
+ mask-repeat: no-repeat !important;
+ mask-position: center center !important;
+ mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAGUExURQAAAAAAAKVnuc8AAAACdFJOU/8A5bcwSgAAAAlwSFlzAAAOwwAADsMBx2+oZAAAACRJREFUGFdjYGBgBAIgBWaBSTAbSEG5yAwQDVUBEQTRjIwMDAADqAAZRZMazAAAAABJRU5ErkJggg==") !important;
+}
+
+#sidebar-box {
+ margin-right: 4px;
+ appearance: groupbox !important;
+ background-color: ThreeDFace !important;
+}
+
+#historyTree,
+#bookmarks-view,
+#template-container {
+ background-color: Window !important;
+}
+
+treecol,
+treecolpicker {
+ border: 0 !important;
+}
+
+#sidebar-search-container,
+#sidebar-header {
+ font: Menu !important;
+ box-shadow: inset 0 -1px ThreeDShadow !important;
+ border-bottom: 1px solid ThreeDHighlight !important;
+}
+
+#sidebar-icon {
+ list-style-image: none !important;
+ width: 0 !important;
+ height: 0 !important;
+}
+
+#sidebar-header {
+ padding: 1px !important;
+ padding-bottom: 2px !important;
+}
+
+#sidebar-close {
+ width: 20px !important;
+ height: 17px !important;
+ border: 1px solid transparent;
+ background-color: transparent !important;
+ padding: 0 !important;
+ list-style-image: none !important;
+ border-radius: 0 !important;
+}
+
+#sidebar-close .toolbarbutton-icon {
+ background-color: WindowText !important;
+ width: 8px !important;
+ height: 7px !important;
+ mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA4SURBVBhXY2RgYPgPxCAAYiMDmDgYgDjIAnA+si4UHUCAbiIYoJtEvAnoOuF8kCqYBLqdQHEGBgAx7A/5GaSbcgAAAABJRU5ErkJggg==") !important;
+}
+
+#sidebar-title {
+ padding-inline: 0 !important;
+}
+
+#sidebar-switcher-arrow {
+ display: none !important;
+}
+
+#sidebar-switcher-target {
+ padding: 3px 5px !important;
+ border: 0 !important;
+ border-radius: 0 !important;
+ background-color: transparent !important;
+}
+
+#sidebar-switcher-target:hover {
+ box-shadow: inset -1px -1px 0 ThreeDShadow, inset 1px 1px 0 ThreeDHighlight;
+}
+
+#sidebar-switcher-target:hover {
+ box-shadow: inset -1px -1px 0 ThreeDShadow, inset 1px 1px 0 ThreeDHighlight;
+}
+
+#sidebar-switcher-target[open="true"] {
+ box-shadow: inset -1px -1px 0 ThreeDHighlight, inset 1px 1px 0 ThreeDShadow;
+}
+
+#sidebar-switcher-target[open="true"] #sidebar-title {
+ transform: translate(1px, 1px);
+}
+
+#sidebar-search-container {
+ padding: 2px !important;
+}
+
+.textbox-search-sign {
+ display: none !important;
+}
+
+#viewButton {
+ appearance: button !important;
+}
+
+#search-box {
+ padding: 2px !important;
+}
+
+.content-header {
+ background-color: ThreeDFace !important;
+}
+
+.sidebar-search-container {
+ padding: 2px !important;
+}
+
+.tabsFilter {
+ margin: 0 !important;
+}
+
+#main-window:-moz-window-inactive .menubar-text,
+#wrapper-menubar-items .menubar-text {
+ color: ThreeDShadow;
+}
+
+.menu-text,
+.menu-iconic-text {
+ margin-inline-start: 0 !important;
+}
+
+.menu-iconic-icon {
+ margin-left: -2px !important;
+}
+
+#main-menubar {
+ display: flex !important;
+}
+
+treechildren::-moz-tree-row {
+ height: 40% !important;
+ min-height: 40% !important;
+}
+
+treechildren::-moz-tree-image(title, query, dayContainer),
+treechildren::-moz-tree-image(query, OrganizerQuery_history____v) {
+ list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAeUExURWOczjExnDFjzmNjAJycY////87OnAAAAJwxYwAAAAggbzMAAAAKdFJOU////////////wCyzCzPAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAATElEQVQoU23PUQpAIQhEUX2Z5v433CCPGKNDX5cmSDKFqeTHFEHZQLA5/RyLV3Bf4OW/serQ5AqPyfUohxGCxWGGMJqaNAjR4fsscwNQNAUR4NgQXAAAAABJRU5ErkJggg==") !important;
+}
+
+.titlebar-button {
+ list-style-image: none !important;
+ height: 20px !important;
+ min-width: 20px !important;
+ padding: 0 !important;
+ margin-top: 2px !important;
+}
+
+.titlebar-min {
+ appearance: -moz-window-button-minimize !important;
+}
+
+.titlebar-restore {
+ appearance: -moz-window-button-restore !important;
+}
+
+.titlebar-max {
+ appearance: -moz-window-button-maximize !important;
+}
+
+.titlebar-close {
+ appearance: -moz-window-button-close !important;
+}
+
+.notification-anchor-icon {
+ padding: 0 !important;
+ margin-inline-start: 2px !important;
+}
+
+.bookmark-item,
+.bookmark-item > label::before,
+.bookmark-item .menu-iconic-icon {
+ list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABgUExURYaGhv///5mZmVVVVf/78ABmzDMzMwAAgDNm//Hx8czMzHd3d2aZmZnMzDMzzGb//+rq6pmZZv//mQDM/+fn1v/MmcyZZjNmzF9fXwAzmcDAwABmmYCAADMzZgQEBAAAANSdJEsAAAAgdFJOU/////////////////////////////////////////8AXFwb7QAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAIpJREFUKFNNjFsWgyAMREUIRGhTbOlLW7P/XRoD2t6Tj8w9k3TM3O3IzipMpbeHcEpvxOwCwDnrvVcRQHA4xD7ZTYTTmegCg8tRvnQcxqvU6QZDLnET6Y7bCUAuKtLjidKQg1Ibr/GNOE2Ec2t86EsoSG4/iJdlnjVXwZRMliDTBKd40IT9oeIP5hU1fA8vue4FsgAAAABJRU5ErkJggg==") !important;
+}
+
+.tab-icon-image:not([src]),
+.tab-icon-image:-moz-broken {
+ content: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABgUExURYaGhv///5mZmVVVVf/78ABmzDMzMwAAgDNm//Hx8czMzHd3d2aZmZnMzDMzzGb//+rq6pmZZv//mQDM/+fn1v/MmcyZZjNmzF9fXwAzmcDAwABmmYCAADMzZgQEBAAAANSdJEsAAAAgdFJOU/////////////////////////////////////////8AXFwb7QAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAIpJREFUKFNNjFsWgyAMREUIRGhTbOlLW7P/XRoD2t6Tj8w9k3TM3O3IzipMpbeHcEpvxOwCwDnrvVcRQHA4xD7ZTYTTmegCg8tRvnQcxqvU6QZDLnET6Y7bCUAuKtLjidKQg1Ibr/GNOE2Ec2t86EsoSG4/iJdlnjVXwZRMliDTBKd40IT9oeIP5hU1fA8vue4FsgAAAABJRU5ErkJggg==") !important;
+}
+
+.desktop-notification-icon {
+ list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAPUExURYCAgP///wAAAMDAwAAAAGFF8HEAAAAFdFJOU/////8A+7YOUwAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAFlJREFUKFNdjkESwDAIAhPk/28uYG2b7sEJO4xxUazGT2qutRsgYqIomUNsKCpDeKTyLGig3d0IIz5Y1N1wLonzW0US9eYIIqrgHNEqcYSUrzQjVPoJ3axBXuvmAgsbIC+oAAAAAElFTkSuQmCC") !important;
+}
+
+:root[sizemode="maximized"] .browserStack {
+ margin-left: -2px !important;
+ margin-right: -2px !important;
+}
+
+#PanelUI-menu-button .toolbarbutton-icon {
+ display: none !important;
+}
+
+#PanelUI-menu-button {
+ padding: 0 !important;
+ border: 0 !important;
+}
+
+#PanelUI-menu-button .toolbarbutton-badge-stack {
+ padding: 0 !important;
+}
+
+.checkbox-check {
+ background-color: Window !important;
+ border: 0 !important;
+ border-radius: 0 !important;
+ box-shadow: inset -1px -1px 0 ThreeDHighlight, inset 1px 1px 0 ThreeDShadow,
+ inset -2px -2px 0 ThreeDFace, inset 2px 2px 0 ThreeDDarkShadow;
+}
+
+.checkbox-check:not([native]) {
+ width: 13px !important;
+ height: 13px !important;
+}
+
+.checkbox-check[checked] {
+ color: WindowText !important;
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTMiIGhlaWdodD0iMTMiIHZlcnNpb249IjEuMSIgZmlsbD0iY29udGV4dC1maWxsIiBmaWxsLW9wYWNpdHk9ImNvbnRleHQtZmlsbC1vcGFjaXR5IiB2aWV3Qm94PSIwIDAgMy40Mzk2IDMuNDM5NiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48Zz48Zz48cmVjdCB4PSIuNzkzNzUiIHk9IjEuMzIyOSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuNzkzNzUiLz48cmVjdCB4PSIyLjM4MTIiIHk9Ii43OTM3NSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuNzkzNzUiLz48cmVjdCB4PSIyLjExNjciIHk9IjEuMDU4MyIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuNzkzNzUiLz48cmVjdCB4PSIxLjg1MjEiIHk9IjEuMzIyOSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuNzkzNzUiLz48cmVjdCB4PSIxLjA1ODMiIHk9IjEuODUyMSIgd2lkdGg9Ii43OTM3NSIgaGVpZ2h0PSIuNTI5MTciLz48cmVjdCB4PSIxLjMyMjkiIHk9IjIuMzgxMiIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiLz48cmVjdCB4PSIxLjA1ODMiIHk9IjEuNTg3NSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiLz48cmVjdCB4PSIxLjU4NzUiIHk9IjEuNTg3NSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiLz48L2c+PC9nPjwvc3ZnPgo=") !important;
+}
+
+#urlbar-zoom-button {
+ margin: 0 !important;
+ font: menu !important;
+ border-radius: 0 !important;
+ background-color: transparent !important;
+}
+
+#configuration_toolbar {
+ -moz-box-ordinal-group: 12;
+}
+
+#customization-panelWrapper > .panel-arrowbox > .panel-arrow[side="top"] {
+ display: none !important;
+}
+
+.customizationmode-button {
+ appearance: button !important;
+ color: WindowText !important;
+ font-weight: 500 !important;
+}
+
+:root[inFullscreen] #TabsToolbar {
+ -moz-box-ordinal-group: 0 !important;
+}
+
+:root[inFullscreen] .tabbrowser-tab::before {
+ display: none !important;
+}
+
+:root[inFullscreen] #tabbrowser-tabs tab:first-of-type:last-of-type,
+:root[inFullscreen]
+ #tabbrowser-tabs
+ tab:first-of-type:last-of-type
+ ~ #tabs-newtab-button,
+:root[inFullscreen]
+ #tabbrowser-tabs
+ tab:first-of-type:last-of-type
+ ~ #tabbrowser-arrowscrollbox-periphery
+ #tabs-newtab-button {
+ display: flex !important;
+}
+
+#placesToolbar {
+ padding: 1px !important;
+ appearance: groupbox !important;
+ background-color: -moz-Dialog !important;
+ margin-bottom: 2px !important;
+}
+
+#placesToolbar .toolbarbutton-text {
+ display: none !important;
+}
+
+#placesToolbar .menu-iconic:hover .menubar-left,
+#placesToolbar .menu-iconic[open="true"] .menubar-left,
+#placesToolbar #back-button:not([disabled="true"]):hover .toolbarbutton-icon,
+#placesToolbar
+ #forward-button:not([disabled="true"]):hover
+ .toolbarbutton-icon {
+ filter: none !important;
+}
+
+#searchFilter {
+ min-height: 22px !important;
+}
+
+#placesList,
+#downloadsListBox,
+tree {
+ background-color: Window !important;
+ color: -moz-DialogText !important;
+}
+
+#detailsPane {
+ background-color: -moz-Dialog !important;
+ color: -moz-dialogText !important;
+}
+
+#placeContent,
+#placesViewsBox #downloadsListBox,
+#placesList,
+#searchFilter,
+#editBMPanel_tagsSelector {
+ -moz-default-appearance: listbox !important;
+ -moz-appearance: listbox !important;
+ color: -moz-DialogText !important;
+}
+
+#places input {
+ background-color: Field !important;
+ color: -moz-DialogText !important;
+ border: 0 !important;
+ border-radius: 0 !important;
+}
+
+#searchFilter[focused],
+#places input:focus {
+ outline: 0 !important;
+}
+
+#searchFilter[focused] {
+ box-shadow: none !important;
+}
+
+#editBookmarkPanelRows .expander-up,
+#editBookmarkPanelRows .expander-down {
+ appearance: spinner-downbutton !important;
+ list-style-image: none !important;
+ padding: 2px !important;
+ height: 22px !important;
+}
+
+#editBookmarkPanelRows .expander-up {
+ appearance: spinner-upbutton !important;
+}
+
+#placesList {
+ border-right: unset !important;
+ margin-right: 4px !important;
+}
+
+treecol {
+ color: -moz-fieldtext !important;
+ padding: 0 7px !important;
+ box-shadow: inset -1px -1px 0 ThreeDDarkShadow,
+ inset 1px 1px 0 ThreeDHighlight, inset -2px -2px 0 ThreeDShadow !important;
+}
+
+treechildren::-moz-tree-row,
+treecol:not([hideheader="true"]),
+treecolpicker {
+ min-height: 17px !important;
+}
+
+.caption-label {
+ margin-inline-start: 6px !important;
+ color: GrayText !important;
+ font: -moz-window !important;
+}
+
+#editBMPanel_tagsSelectorRow > richlistbox > richlistitem[selected] {
+ color: HighlightText !important;
+ background-color: Highlight !important;
+}
+
+richlistbox[seltype="multiple"]:focus > richlistitem[current="true"],
+richlistbox.theme-listbox:focus > richlistitem[current="true"] {
+ outline: 0 !important;
+}
+
+#placesMenu > menu {
+ appearance: button !important;
+ color: -moz-DialogText !important;
+}
+
+#organizeButton {
+ list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAzUExURZmZmf/78Ofn1k1NTcDAwBwcHOrq6mZmAK2pkDMzAP//mZmZAMzMZgAAADMAAGZmZgAAAIQzlaMAAAARdFJOU/////////////////////8AJa2ZYgAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAHxJREFUKFNVzgEOAyEIBECw1T0Blf+/tnD2GktCjJN1Ix3jOURcvvN64F1rpdJOYKb/RAJwQBSCGT+4er8gCle9oRQ0TdAMbVAkxLGhiwgsQhKRBHSIAZahDWAVFlMeN7S4Y7LNaB1Oay3EG2DMaI3S/Ax67Ih9ICfR3f0DrmQINMNg/hUAAAAASUVORK5CYII=") !important;
+}
+
+#viewMenu {
+ list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAB4SURBVDhP7ZLNCcAgDIVfulIzg6t0DU/uUGfSmWziT+lJUKH00A8CiZGXPBGrEJBSzSegIrCfksdyNEL0WcAubGAB51yaIYSgg9NWlAA+xBH7nBPJahKNXu8WiLFcUGRAjkav91v4ggVSC8aYWo7BzPqV8XiR1wEuUzD3/j0F1pEAAAAASUVORK5CYII=") !important;
+}
+
+#maintenanceButton {
+ list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAVUExURQAAADPM/zNm/5n//8z//zOZ/wAAAACTM88AAAAHdFJOU////////wAaSwNGAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAT0lEQVQoU62PiQ3AIAwDnXf/kWsXChmgJ2GFk4gFmuDNhUaYX8MJFsOA98yqY+AkCwsJHglmKaeIf4W7Oil2tfCIKBV/Qsb05oi5Y6PvdD8/ggRHRlWf0AAAAABJRU5ErkJggg==") !important;
+}
+
+#placesToolbar > toolbarbutton[disabled] {
+ opacity: 1 !important;
+}
+
+#placesToolbar > toolbarbutton {
+ border-radius: 0 !important;
+ appearance: button !important;
+ background-color: -moz-Dialog !important;
+ border: 1px solid transparent;
+ padding: 4px !important;
+}
+
+.tabbrowser-tab[pinned] .tab-label-container {
+ display: none !important;
+}
+
+.tabbrowser-tab[pinned]:not([selected="true"]) .tab-icon-overlay {
+ pointer-events: none !important;
+}
+
+.tab-icon-overlay:not([crashed]):is([pinned], [sharing]) {
+ top: unset !important;
+ inset-inline-end: unset !important;
+ padding: 0 !important;
+ background-color: transparent !important;
+}
+
+#context-navigation .menu-iconic-left {
+ padding-top: 0 !important;
+}
+
+.urlbarView-results[wrap]
+ > .urlbarView-row[has-url]
+ > .urlbarView-row-inner
+ > .urlbarView-url:-moz-locale-dir(ltr) {
+ padding-left: 19px !important;
+}
+
+#TabsToolbar .toolbarbutton-1 {
+ margin: 2px 0 0 !important;
+}
+
+#alltabs-button {
+ list-style-image: none !important;
+ padding: 0 5px !important;
+ min-height: 0 !important;
+ display: var(--show-alltabs-button) !important;
+}
+
+#alltabs-button .toolbarbutton-icon {
+ mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAdSURBVDhPYxiB4D8UwwA6Hy+gv2b6aRoFKICBAQA7tRPtf9lgfQAAAABJRU5ErkJgggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==") !important;
+ background-color: -moz-DialogText !important;
+ min-height: 0 !important;
+ width: 14px !important;
+ height: 14px !important;
+}
+
+#alltabs-button .toolbarbutton-badge-stack {
+ padding: 0 !important;
+}
+
+toolbar .toolbarbutton-1 > .toolbarbutton-icon {
+ height: 16px !important;
+ width: 16px !important;
+}
+
+#wrapper-new-tab-button .toolbarbutton-icon {
+ padding: 0 !important;
+}
+
+#wrapper-new-tab-button #new-tab-button {
+ min-width: 26px !important;
+}
+
+#urlbar-background::after {
+ content: "";
+ display: inline-block;
+ z-index: 99999;
+ width: 16px !important;
+ height: 18px !important;
+ top: 0px;
+ position: absolute !important;
+ right: 0 !important;
+ background-color: -moz-Dialog !important;
+ box-shadow: inset -1px -1px 0 ThreeDDarkShadow, inset 1px 1px 0 ThreeDLightShadow, inset -2px -2px 0 ThreeDShadow, inset 2px 2px 0 ThreeDHighlight !important;
+ background-repeat: no-repeat !important;
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTUiIHdpZHRoPSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4KICA8cmVjdCBoZWlnaHQ9IjEiIHdpZHRoPSI3IiB4PSIzIiB5PSI1IiBmaWxsPSJDYW52YXNUZXh0Ii8+PHJlY3QgaGVpZ2h0PSIxIiB3aWR0aD0iNSIgeT0iNiIgeD0iNCIgZmlsbD0iQ2FudmFzVGV4dCIvPjxyZWN0IGhlaWdodD0iMSIgd2lkdGg9IjMiIHg9IjUiIHk9IjciIGZpbGw9IkNhbnZhc1RleHQiLz48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4PSI2IiB5PSI4IiBmaWxsPSJDYW52YXNUZXh0Ii8+CiAgCiAgCjwvc3ZnPg==") !important;
+ background-position: center center !important;
+ pointer-events: none;
+}
+
+#wrapper-menubar-items {
+ opacity: 1 !important;
+}
+
+#history-menu {
+ display: var(--show-history-menu-item) !important;
+}
+
+#go-button {
+ padding: 0 5px !important;
+ margin-inline-end: 3px !important;
+ margin-inline-start: 2px !important;
+}
+
+#go-button .toolbarbutton-text {
+ display: block;
+ min-height: 0 !important;
+ padding: 0 0 0 1px !important;
+}
+
+#go-button .toolbarbutton-icon {
+ padding: 0 !important;
+ filter: grayscale(1);
+ list-style-image: url("go.png") !important;
+}
+
+#go-button:hover .toolbarbutton-icon,
+#go-button:active .toolbarbutton-icon {
+ filter: none;
+}
+
+:root[uidensity="touch"] #back-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #forward-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #stop-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #reload-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #home-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #history-panelmenu > .toolbarbutton-icon,
+:root[uidensity="touch"] #bookmarks-menu-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #print-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #new-window-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #cut-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #copy-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #paste-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #fullscreen-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #find-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #email-link-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #sidebar-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #library-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #downloads-button #downloads-indicator-anchor,
+:root[uidensity="touch"] #characterencoding-button > .toolbarbutton-icon,
+:root[uidensity="touch"] #preferences-button > .toolbarbutton-icon {
+ width: 20px !important;
+ height: 20px !important;
+ background-image: url("toolbar_large.png") !important;
+}
+
+:root[uidensity="touch"] #nav-bar {
+ height: 28px;
+}
+
+:root[uidensity="touch"] {
+ --toolbar-size: -20px !important;
+}
+
+:root[uidensity="touch"] #downloads-button {
+ width: 28px !important;
+}
+
+:root[uidensity="touch"] #edit-controls .toolbarbutton-1 {
+ width: 28px !important;
+}
+
+:root[uidensity="touch"] #back-button[disabled="true"] .toolbarbutton-icon,
+:root[uidensity="touch"] #forward-button[disabled="true"] .toolbarbutton-icon {
+ list-style-image: none !important;
+ background-color: ThreeDShadow !important;
+ background-image: none !important;
+ mask-image: url("toolbar_large.png") !important;
+ filter: drop-shadow(1px 1px 0 ThreeDHighlight) !important;
+}
+
+:root[uidensity="touch"] #back-button[disabled="true"],
+:root[uidensity="touch"] #forward-button[disabled="true"] {
+ filter: drop-shadow(1px 1px 0 ThreeDHighlight) !important;
+}
+
+:root[uidensity="touch"] #back-button[disabled="true"] .toolbarbutton-text,
+:root[uidensity="touch"] #forward-button[disabled="true"] .toolbarbutton-text {
+ text-shadow: none !important;
+}
+
+:root[uidensity="touch"] #search-box,
+:root[uidensity="touch"] .sidebar-placesTreechildren::-moz-tree-row {
+ min-height: 20px !important;
+}
+
+toolbar .toolbaritem-combined-buttons {
+ margin-inline: 0 !important;
+}
+
+.unified-extensions-item-action.subviewbutton {
+ border-radius: 0 !important;
+ height: 100% !important;
+ width: 24px !important;
+ background-color: -moz-Dialog !important;
+}
+
+toolbarbutton:where([disabled="true"]) {
+ text-shadow: none !important;
+ color: -moz-DialogText !important;
+}
+
+#back-button:where([disabled="true"]),
+#forward-button:where([disabled="true"]) {
+ color: ThreeDShadow !important;
+ text-shadow: 1px 1px 0 ThreeDHighlight !important;
+}
+
+:root[uidensity="touch"] .unified-extensions-item-action.subviewbutton {
+ width: 28px !important;
+}
+
+#unified-extensions-button {
+ padding: 0 !important;
+ border: 0 !important;
+}
+
+#unified-extensions-button .toolbarbutton-icon,
+#unified-extensions-button .toolbarbutton-text {
+ display: none !important;
+}
+
+.urlbarView-dynamic-quickactions-buttons,
+.urlbarView-button-help {
+ display: none !important;
+}
+
+/*.urlbarView:not([noresults]) > .search-one-offs:not([hidden]) {
+ border: 1px solid #000000 !important;
+ margin-top: -1px !important;
+ background-color: Window !important;
+}*/
+
+#urlbar .search-one-offs:not([hidden]) {
+ padding-block: 0 !important;
+}
+
+#urlbar .searchbar-engine-one-off-item {
+ border-radius: 0 !important;
+ margin-inline: 0 !important;
+}
+
+.searchbar-engine-one-off-item:not([selected]):hover {
+ background-color: Highlight !important;
+ color: HighlightText !important;
+}
+
+#urlbar .search-panel-one-offs-header-label {
+ padding-inline: 10px !important;
+}
+
+#personal-toolbar-empty-description {
+ min-height: unset !important;
+ display: none !important;
+}
+
+.urlbarView {
+ width: 100% !important;
+ background-color: Window !important;
+ border: 1px solid ThreeDShadow !important;
+ margin-inline: 0 !important;
+ position: relative !important;
+ max-width: 100% !important;
+ position: absolute !important;
+}
+
+.urlbarView::after {
+ content: "";
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ background-image: url("resizer.png") !important;
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ z-index: 999999;
+}
+
+#urlbar[breakout][breakout-extend] > #urlbar-input-container {
+ height: 22px !important;
+}
+
+#urlbar[open] > .urlbarView > .urlbarView-body-outer > .urlbarView-body-inner {
+ border: 0 !important;
+}
+
+#urlbar .search-one-offs:not([hidden]) {
+ display: none !important;
+}
+
+#urlbar-input-container {
+ padding: 0 !important;
+ border: 0 !important;
+}
+
+#urlbar[breakout] {
+ top: 0 !important;
+}
+
+.urlbarView-row[label][dynamicType="quickactions"] {
+ display: none !important;
+}
+
+.urlbarView-results,
+.urlbarView-row {
+ padding-block: 0 !important;
+ min-height: 14px !important;
+ border-radius: 0 !important;
+ border: 0 !important;
+}
+
+.urlbarView-row[type="search"] .urlbarView-action {
+ display: none !important;
+}
+
+.urlbarView-row[type="search"] .urlbarView-title::before {
+ content: 'Search for "';
+}
+
+.urlbarView-row[type="search"] .urlbarView-title::after {
+ content: '"';
+}
+
+.urlbarView-title strong,
+.urlbarView-url strong {
+ font-weight: 500 !important;
+}
+
+.urlbarView-row-inner {
+ border-radius: 0 !important;
+ padding-block: 0 !important;
+ min-height: 14px !important;
+ padding-inline: 0 !important;
+ margin: 0 !important;
+ padding: 0 !important;
+ padding-left: 3px !important;
+}
+
+.urlbarView-row[row-selectable]:not([selected]):hover {
+ background-color: Highlight !important;
+ color: HighlightText !important;
+}
+
+.urlbarView-row[label] {
+ margin-block-start: 0 !important;
+}
+
+.urlbarView-row[label]::before {
+ display: none !important;
+}
+
+.urlbarView-row[selectable]:hover > .urlbarView-row-inner {
+ background-color: var(--autocomplete-popup-highlight-background) !important;
+ color: var(--autocomplete-popup-highlight-color) !important;
+}
+
+.urlbarView-tags,
+.urlbarView-url,
+.urlbarView-title:not(:empty) ~ .urlbarView-action {
+ font-size: unset !important;
+}
+
+.urlbarView-title-separator::before,
+.urlbarView-type-icon {
+ display: none !important;
+}
+
+.urlbarView-title-separator {
+ margin-inline: 2px !important;
+}
+
+.urlbarView-row[selectable]:hover > .urlbarView-row-inner .urlbarView-url,
+.urlbarView-row-inner[selectable]:hover .urlbarView-url {
+ color: HighlightText !important;
+}
+
+.urlbarView-row:not([selected]) .urlbarView-url {
+ color: LinkText !important;
+}
+
+.urlbarView-row[selected] {
+ background-color: Highlight !important;
+ color: HighlightText !important;
+}
+
+.urlbarView-overflowable {
+ mask-image: none !important;
+}
+
+#page-action-buttons {
+ display: none !important;
+}
+
+#tab-notification-deck {
+ -moz-box-ordinal-group: 100 !important;
+}
+
+notification-message {
+ margin: 0 !important;
+ border-radius: 0 !important;
+ border-top: 1px solid ThreeDShadow !important;
+ box-shadow: inset 0 1px 0 ThreeDHighlight !important;
+}
+
+.container.infobar {
+ align-items: center !important;
+ box-shadow: none !important;
+ border-radius: 0 !important;
+ background: #fffedf !important;
+}
+
+.container.infobar::before {
+ display: none !important;
+}
+
+.infobar > .icon {
+ margin: 0 !important;
+ display: none !important;
+}
+
+.notification-message {
+ padding-block: 0 !important;
+ min-height: unset !important;
+ position: absolute !important;
+}
+
+.notification-button {
+ position: absolute !important;
+ left: 0 !important;
+ top: 0 !important;
+ width: calc(100% - 30px) !important;
+ margin: 0 !important;
+ border-radius: 0 !important;
+ border: 0 !important;
+ font-size: 0 !important;
+ height: 100% !important;
+ background: none !important;
+}
+
+toolbarspring {
+ max-width: 100% !important;
+ width: 100% !important;
+}
+
+toolbarpaletteitem[place="toolbar"][id^="wrapper-customizableui-special-spring"],
+toolbarspring {
+ max-width: 100% !important;
+}
+
+toolbarpaletteitem[place="toolbar"] > toolbarspring {
+ outline: 1px dotted !important;
+}
+
+#additional_top_toolbar1 #PlacesToolbarItems {
+ width: 0 !important;
+ max-width: 0 !important;
+}
+
+#additional_top_toolbar1 #PlacesChevron {
+ visibility: visible !important;
+ width: 12px !important;
+}
+
+#additional_top_toolbar1 #PlacesToolbar::before {
+ content: "Links" !important;
+ line-height: 21px !important;
+ margin-inline: 4px !important;
+}
+
+#additional_top_toolbar1 #personal-bookmarks {
+ padding-left: 1px !important;
+ border-left: 1px solid ThreeDShadow !important;
+ box-shadow: inset 1px 0 0 ThreeDHighlight !important;
+ margin-right: -1px !important;
+}
+
+#customization-content-container .toolbarbutton-text {
+ display: none !important;
+}
+
+.statusBarInner {
+ display: flex;
+ align-items: center;
+}
+
+.statusBarIcon {
+ width: 16px;
+ height: 16px;
+ background-image: url("page.png");
+ margin-left: 2px;
+}
+
+.statusBarDone {
+ margin-left: 5px;
+}
+
+.urlbarView-button-menu {
+ display: none !important;
+}
+
+/* ff 113 */
+#personal-bookmarks {
+ flex-grow: 0 !important;
+}
+#titlebar > #toolbar-menubar > spacer[style="order: 1000;"] {
+ display: none;
+}
+
+#context-navigation > .menuitem-iconic {
+ justify-content: left !important;
+}
+
+/* ff 117 */
+toolbar[brighttext],
+&[lwt-popup="dark"] panel {
+ color-scheme: light !important;
+}
+
+#navigator-toolbox {
+ &:-moz-lwtheme {
+ background-image: unset !important;
+ background-color: unset !important;
+
+ &:-moz-window-inactive {
+ background-color: unset !important;
+ }
+ }
+}
+
+menubar > menu:-moz-window-inactive {
+ color: ThreeDShadow !important;
+}
+
+#TabsToolbar #firefox-view-button[open] > .toolbarbutton-icon,
+.tabbrowser-tab:is([visuallyselected], [multiselected]) {
+ color: -moz-DialogText !important;
+ color-scheme: light !important;
+ font-weight: var(--selected-tab-font-weight);
+}
+
+toolbar .toolbarbutton-1 {
+ & > .toolbarbutton-icon,
+ & > .toolbarbutton-text,
+ & > .toolbarbutton-badge-stack {
+ padding: 0 !important;
+ }
+}
+
+:is(label, description)[value][crop] {
+ min-width: auto !important;
+}
+
+toolbar .toolbarbutton-1 {
+ & > .toolbarbutton-text {
+ min-height: 16px !important;
+ }
+}
+
+menupopup > menu,
+menupopup > menuitem,
+#context-navigation > menuitem,
+.toolbar-menupopup :is(menu, menuitem),
+#uc-menugroup > menuitem {
+ height: 18px !important;
+ min-height: 18px !important;
+ border: none !important;
+ border-radius: 0 !important;
+ margin: 0 !important;
+ padding: 0 !important;
+ padding-block: 0 !important;
+ padding-inline-start: 20px !important;
+
+ &:has(> .menu-iconic-left[checked="true"]),
+ &.menuitem-with-favicon,
+ &.privatetab-icon,
+ &.context-menu-add-engine,
+ &[id="userChromejs_openChromeFolder"],
+ &[id="userChromejs_restartApp"],
+ &[data-usercontextid]:not([data-usercontextid="0"]),
+ &[image^="moz-extension://"],
+ &[image^="jar:file://"],
+ &[image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABaUlEQVQ4y6WTW0sCQRiG/SEpVBDUVVfphbAEhWAlqYhrLWUlER2IIgrqYkEp6SBmudWiFf0SiSCwpAI7bJnprq6H/sTbGhJiEyt28fAN7zfz8DHDaABo/oPqBpovX7j4T1gOS6dNCcYiZbhOSrCHi2hugqNCwskVYNmXbxoSuPkCN3NWhCdahLLGKCfDcSBjOJiHeTeHPr8EyifCwGb9RMF0RIaHl+E+zoMJ5+AM5WALSBjaEWHayqLXm4GR/YB+Iw2iYIKTMB6WwIRE0EER9r0s+r1pGNZT6F55ReeigPb5F7TOPpMFTDCDkUAGA753GFYFdC08QedJEvkR2DbfzuntFBz+1K2ZFdCz9Ii2qQfo3Pck2MoZpVI/AqtXQAXjchIdk3fQMok/Ib6CaS0Z1c8pdlc8pqXjUOF7AqVSxDvQOq7RKERBi/UKdbDVnK3vkQWWS9Si1vstGIyxCqiBquZUXc429BfU+AL9Tqy8Q2Za8AAAAABJRU5ErkJggg=="] {
+ padding-inline-start: 0px !important;
+ }
+ & > .menu-iconic-left {
+ margin-inline-end: 0 !important;
+ &[checked="true"] {
+ margin-inline-start: 2px !important;
+ margin-inline-end: 2px !important;
+ list-style-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZlcnNpb249IjEuMSIgZmlsbD0iY29udGV4dC1maWxsIiBmaWxsLW9wYWNpdHk9ImNvbnRleHQtZmlsbC1vcGFjaXR5IiB2aWV3Qm94PSIwIDAgNC4yMzMzNTM1IDQuMjMzMzUzNSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48Zz48Zz48cmVjdCB4PSIxLjMyMjkiIHk9IjEuODUyMSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuNzkzNzUiLz48cmVjdCB4PSIyLjkxMDQiIHk9IjEuMzIyOSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuNzkzNzUiLz48cmVjdCB4PSIyLjY0NTkiIHk9IjEuNTg3NSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuNzkzNzUiLz48cmVjdCB4PSIyLjM4MTIiIHk9IjEuODUyMSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuNzkzNzUiLz48cmVjdCB4PSIxLjU4NzUiIHk9IjIuMzgxMiIgd2lkdGg9Ii43OTM3NSIgaGVpZ2h0PSIuNTI5MTciLz48cmVjdCB4PSIxLjg1MjEiIHk9IjIuOTEwNCIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiLz48cmVjdCB4PSIxLjU4NzUiIHk9IjIuMTE2NyIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiLz48cmVjdCB4PSIyLjExNjciIHk9IjIuMTE2NyIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiLz48L2c+PC9nPjwvc3ZnPgo=") !important;
+ fill-opacity: 1 !important;
+ }
+ }
+ &.menuitem-with-favicon,
+ &.privatetab-icon,
+ &.context-menu-add-engine,
+ &[id="userChromejs_openChromeFolder"],
+ &[id="userChromejs_restartApp"],
+ &[data-usercontextid]:not([data-usercontextid="0"]),
+ &[image^="moz-extension://"],
+ &[image^="jar:file://"],
+ &[image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABaUlEQVQ4y6WTW0sCQRiG/SEpVBDUVVfphbAEhWAlqYhrLWUlER2IIgrqYkEp6SBmudWiFf0SiSCwpAI7bJnprq6H/sTbGhJiEyt28fAN7zfz8DHDaABo/oPqBpovX7j4T1gOS6dNCcYiZbhOSrCHi2hugqNCwskVYNmXbxoSuPkCN3NWhCdahLLGKCfDcSBjOJiHeTeHPr8EyifCwGb9RMF0RIaHl+E+zoMJ5+AM5WALSBjaEWHayqLXm4GR/YB+Iw2iYIKTMB6WwIRE0EER9r0s+r1pGNZT6F55ReeigPb5F7TOPpMFTDCDkUAGA753GFYFdC08QedJEvkR2DbfzuntFBz+1K2ZFdCz9Ii2qQfo3Pck2MoZpVI/AqtXQAXjchIdk3fQMok/Ib6CaS0Z1c8pdlc8pqXjUOF7AqVSxDvQOq7RKERBi/UKdbDVnK3vkQWWS9Si1vstGIyxCqiBquZUXc429BfU+AL9Tqy8Q2Za8AAAAABJRU5ErkJggg=="] {
+ & > .menu-iconic-left {
+ width: 16px !important;
+ margin-inline-start: 2px !important;
+ margin-inline-end: 2px !important;
+ }
+ }
+ &[_moz-menuactive] {
+ background-color: Highlight !important;
+ color: HighlightText !important;
+ }
+ & > .menu-right {
+ margin-inline-end: 0 !important;
+ list-style-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSI3IiB5PSIzIiB4PSI2IiBmaWxsPSJjdXJyZW50Q29sb3IiLz48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSI1IiB5PSI0IiB4PSI3IiBmaWxsPSJjdXJyZW50Q29sb3IiLz48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIzIiB5PSI1IiB4PSI4IiBmaWxsPSJjdXJyZW50Q29sb3IiLz48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB5PSI2IiB4PSI5IiBmaWxsPSJjdXJyZW50Q29sb3IiLz48L3N2Zz4=") !important;
+ fill-opacity: 1 !important;
+ }
+ &[disabled="true"],
+ &.disabled,
+ &.noOptions {
+ color: ThreeDShadow !important;
+ text-shadow: 1px 1px 0 ThreeDHighlight !important;
+
+ &[_moz-menuactive="true"] {
+ text-shadow: none !important;
+ }
+ }
+
+ &[restartless="true"] {
+ color: LinkText !important;
+ }
+
+ &:not([disabled]) > .menu-accel-container > :is(.menu-accel, .menu-iconic-accel) {
+ color: -moz-DialogText !important;
+ }
+}
+
+menuseparator {
+ padding-inline: 1px !important;
+
+ &[hidden="true"] {
+ padding: 0 !important;
+ padding-block: 0 !important;
+ padding-inline: 0 !important;
+
+ &::before {
+ display: none;
+ }
+ }
+}
+
+tooltip {
+ background-color: Window !important;
+ color: -moz-DialogText !important;
+ border-color: -moz-DialogText !important;
+ border-radius: 0 !important;
+}
+
+#userChromejs_openChromeFolder {
+ list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAYUExURZmZAAAAAPHx8f//zP//mczMZv/MmQAAAHwygQUAAAAIdFJOU/////////8A3oO9WQAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAFBJREFUKFNdz0kSwCAIBVEICPe/cT5DkWC74slCya8AFHHPAHpEVEeITpV7uS9fejhAJ1tgOHsD8oO43xspA3VvDT1hLuiHVQDnVXxud4H7C0+1BHuF0oyhAAAAAElFTkSuQmCC") !important;
+}
+
+#userChromejs_restartApp {
+ list-style-image: url("go.png") !important;
+ width: 18px !important;
+}
diff --git a/chrome/toolbar-label-under-icon.css b/chrome/msfx/toolbar-label-under-icon.css
similarity index 100%
rename from chrome/toolbar-label-under-icon.css
rename to chrome/msfx/toolbar-label-under-icon.css
diff --git a/chrome/msfx/toolbar.png b/chrome/msfx/toolbar.png
new file mode 100644
index 0000000..9e1fc01
Binary files /dev/null and b/chrome/msfx/toolbar.png differ
diff --git a/chrome/msfx/toolbar_large.png b/chrome/msfx/toolbar_large.png
new file mode 100644
index 0000000..5e421a5
Binary files /dev/null and b/chrome/msfx/toolbar_large.png differ
diff --git a/chrome/scrollbar.uc.js b/chrome/scrollbar.uc.js
index 783df67..f8a9c70 100644
--- a/chrome/scrollbar.uc.js
+++ b/chrome/scrollbar.uc.js
@@ -1,146 +1,149 @@
(function () {
var css = `@media all and (-moz-overlay-scrollbars) {
- scrollbar[root="true"] {
- position: relative;
- z-index: 2147483647;
- }
-
- scrollbar:not([active="true"]),
- scrollbar[disabled="true"] {
- visibility: hidden;
- }
-}
-
-scrollbar
-{
- color-scheme: light !important;
- -moz-default-appearance: none;
- -moz-binding: url("chrome://global/content/bindings/scrollbar.xml#scrollbar");
- cursor: default;
- min-width: 16px !important;
- background-repeat: repeat !important;
- background-color: ThreeDHighlight !important;
- background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdib3g9IjAgMCAyIDIiIHdpZHRoPSIyIiBoZWlnaHQ9IjIiPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9Ii1tb3otZGlhbG9nIi8+PHJlY3QgZmlsbD0iVGhyZWVESGlnaGxpZ2h0IiB4PSIxIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIi8+PHJlY3QgeD0iMSIgeT0iMSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0iLW1vei1kaWFsb2ciLz48cmVjdCBmaWxsPSJUaHJlZURIaWdobGlnaHQiIHg9IjAiIHk9IjEiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiLz48L3N2Zz4=") !important;
- opacity: 1 !important;
-}
-
-thumb
-{
- color-scheme: light !important;
- -moz-default-appearance: none !important;
- position: relative !important;
- background-color: -moz-Dialog !important;
- min-height: 8px !important;
- pointer-events: auto !important;
- border: 0 !important;
- box-shadow: inset -1px -1px 0 WindowFrame, inset 1px 1px 0 -moz-Dialog, inset -2px -2px 0 ThreeDShadow, inset 2px 2px 0 ThreeDHighlight !important;
-}
-
-thumb[orient="horizontal"] {
- -moz-default-appearance: none;
- min-height: 16px !important;
- min-width: 8px !important;
- max-width: 100% !important;
- background-repeat: no-repeat !important;
-}
-
-scrollbarbutton
-{
- color-scheme: light !important;
- min-width: 16px !important;
- min-height: 16px !important;
- -moz-default-appearance: none !important;
- background-color: -moz-Dialog !important;
- box-shadow: inset -1px -1px 0 WindowFrame, inset 1px 1px 0 -moz-Dialog, inset -2px -2px 0 ThreeDShadow, inset 2px 2px 0 ThreeDHighlight !important;
-}
-
-scrollbarbutton:not(.disabled):hover:active
-{
- background-color: -moz-dialog !important;
- border: 1px solid ThreeDShadow !important;
- box-shadow: none !important;
-}
-
-slider,
-slider[orient="vertical"]
-{
- color-scheme: light !important;
- -moz-default-appearance: none;
-}
-
-scrollcorner
-{
- color-scheme: light !important;
- -moz-default-appearance: none !important;
- -moz-binding: url(chrome://global/content/bindings/scrollbar.xml#scrollbar-base);
- width: 16px;
- cursor: default;
- background-color: -moz-dialog; !important;
-}
-
-scrollbarbutton[type="increment"]
-{
- -moz-default-appearance: none;
- background-repeat: no-repeat !important;
- background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4NCgk8cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSI3IiB5PSI0IiB4PSI1IiBmaWxsPSJtZW51dGV4dCIvPjxyZWN0IHdpZHRoPSIxIiBoZWlnaHQ9IjUiIHk9IjUiIHg9IjYiIGZpbGw9Im1lbnV0ZXh0Ii8+PHJlY3Qgd2lkdGg9IjEiIGhlaWdodD0iMyIgeT0iNiIgeD0iNyIgZmlsbD0ibWVudXRleHQiLz48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB5PSI3IiB4PSI4IiBmaWxsPSJtZW51dGV4dCIvPg0KCQ0KCQ0KPC9zdmc+") !important;
- background-position: center center !important;
-}
-
-scrollbar[orient="vertical"] > scrollbarbutton[type="increment"]
-{
- -moz-default-appearance: none;
- background-repeat: no-repeat !important;
- background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTUiIHdpZHRoPSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4NCgk8cmVjdCBoZWlnaHQ9IjEiIHdpZHRoPSI3IiB4PSIzIiB5PSI1IiBmaWxsPSJtZW51dGV4dCIvPjxyZWN0IGhlaWdodD0iMSIgd2lkdGg9IjUiIHk9IjYiIHg9IjQiIGZpbGw9Im1lbnV0ZXh0Ii8+PHJlY3QgaGVpZ2h0PSIxIiB3aWR0aD0iMyIgeD0iNSIgeT0iNyIgZmlsbD0ibWVudXRleHQiLz48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4PSI2IiB5PSI4IiBmaWxsPSJtZW51dGV4dCIvPg0KCQ0KCQ0KPC9zdmc+") !important;
- background-position: center center !important;
-}
-
-scrollbarbutton[type="decrement"]
-{
- -moz-default-appearance: none;
- background-repeat: no-repeat !important;
- background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTUiIHdpZHRoPSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4NCgk8cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSI3IiB5PSI0IiB4PSI4IiBmaWxsPSJtZW51dGV4dCIvPjxyZWN0IHdpZHRoPSIxIiBoZWlnaHQ9IjUiIHk9IjUiIHg9IjciIGZpbGw9Im1lbnV0ZXh0Ii8+PHJlY3Qgd2lkdGg9IjEiIGhlaWdodD0iMyIgeT0iNiIgeD0iNiIgZmlsbD0ibWVudXRleHQiLz48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB5PSI3IiB4PSI1IiBmaWxsPSJtZW51dGV4dCIvPg0KCQ0KCQ0KPC9zdmc+") !important;
- background-position: center center !important;
-}
-
-scrollbar[orient="vertical"] > scrollbarbutton[type="decrement"]
-{
- -moz-default-appearance: none;
- background-repeat: no-repeat !important;
- background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4NCgk8cmVjdCBoZWlnaHQ9IjEiIHdpZHRoPSI3IiB5PSI4IiB4PSIzIiBmaWxsPSJtZW51dGV4dCIvPjxyZWN0IGhlaWdodD0iMSIgd2lkdGg9IjUiIHg9IjQiIHk9IjciIGZpbGw9Im1lbnV0ZXh0Ii8+PHJlY3QgaGVpZ2h0PSIxIiB3aWR0aD0iMyIgeT0iNiIgeD0iNSIgZmlsbD0ibWVudXRleHQiLz48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB5PSI1IiB4PSI2IiBmaWxsPSJtZW51dGV4dCIvPg0KCQ0KCQ0KPC9zdmc+") !important;
- background-position: center center !important;
-}
-
-scrollbarbutton[type="increment"][disabled="true"]
-{
- background-repeat: no-repeat !important;
- background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4NCgk8cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIHdpZHRoPSIxIiBoZWlnaHQ9IjciIHk9IjQiIHg9IjUiLz48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIyIiBmaWxsPSJUaHJlZURIaWdobGlnaHQiIHg9IjYiIHk9IjEwIi8+PHJlY3Qgd2lkdGg9IjEiIGhlaWdodD0iMiIgZmlsbD0iVGhyZWVESGlnaGxpZ2h0IiB4PSI3IiB5PSI5Ii8+PHJlY3Qgd2lkdGg9IjEiIGhlaWdodD0iMiIgZmlsbD0iVGhyZWVESGlnaGxpZ2h0IiB4PSI4IiB5PSI4Ii8+PHJlY3Qgd2lkdGg9IjEiIGZpbGw9IlRocmVlREhpZ2hsaWdodCIgaGVpZ2h0PSIxIiB5PSI4IiB4PSI5Ii8+PHJlY3QgZmlsbD0iVGhyZWVEU2hhZG93IiB3aWR0aD0iMSIgaGVpZ2h0PSI1IiB5PSI1IiB4PSI2Ii8+PHJlY3QgZmlsbD0iVGhyZWVEU2hhZG93IiB3aWR0aD0iMSIgaGVpZ2h0PSIzIiB5PSI2IiB4PSI3Ii8+PHJlY3QgZmlsbD0iVGhyZWVEU2hhZG93IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB5PSI3IiB4PSI4Ii8+DQoJDQoJDQo8L3N2Zz4=");
- background-position: center center !important;
-}
-
-scrollbar[orient="vertical"] > scrollbarbutton[type="increment"][disabled="true"]
-{
- background-repeat: no-repeat !important;
- background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTUiIHdpZHRoPSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4NCgk8cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIGhlaWdodD0iMSIgd2lkdGg9IjciIHg9IjMiIHk9IjUiLz48cmVjdCBmaWxsPSJUaHJlZURIaWdobGlnaHQiIGhlaWdodD0iMSIgd2lkdGg9IjIiIHk9IjYiIHg9IjkiLz48cmVjdCBmaWxsPSJUaHJlZURIaWdobGlnaHQiIGhlaWdodD0iMSIgd2lkdGg9IjIiIHk9IjciIHg9IjgiLz48cmVjdCBmaWxsPSJUaHJlZURIaWdobGlnaHQiIGhlaWdodD0iMSIgd2lkdGg9IjIiIHg9IjciIHk9IjgiLz48cmVjdCBmaWxsPSJUaHJlZURIaWdobGlnaHQiIGhlaWdodD0iMSIgd2lkdGg9IjEiIHg9IjciIHk9IjkiLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIGhlaWdodD0iMSIgd2lkdGg9IjUiIHk9IjYiIHg9IjQiLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIGhlaWdodD0iMSIgd2lkdGg9IjMiIHg9IjUiIHk9IjciLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHg9IjYiIHk9IjgiLz4NCgkNCgkNCjwvc3ZnPg==");
- background-position: center center !important;
-}
-
-scrollbarbutton[type="decrement"][disabled="true"]
-{
- background-repeat: no-repeat !important;
- background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTUiIHdpZHRoPSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4NCgk8cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIHdpZHRoPSIxIiBoZWlnaHQ9IjciIHk9IjQiIHg9IjgiLz48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSI3IiBmaWxsPSJUaHJlZURIaWdobGlnaHQiIHk9IjUiIHg9IjkiLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIHdpZHRoPSIxIiBoZWlnaHQ9IjUiIHk9IjUiIHg9IjciLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIHdpZHRoPSIxIiBoZWlnaHQ9IjMiIHk9IjYiIHg9IjYiLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHk9IjciIHg9IjUiLz4NCgkNCgkNCjwvc3ZnPg==");
- background-position: center center !important;
-}
-
-scrollbar[orient="vertical"] > scrollbarbutton[type="decrement"][disabled="true"]
-{
- background-repeat: no-repeat !important;
- background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4NCgk8cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIGhlaWdodD0iMSIgd2lkdGg9IjciIHk9IjgiIHg9IjMiLz48cmVjdCBmaWxsPSJUaHJlZURIaWdobGlnaHQiIHdpZHRoPSI3IiBoZWlnaHQ9IjEiIHk9IjkiIHg9IjQiLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIGhlaWdodD0iMSIgd2lkdGg9IjUiIHg9IjQiIHk9IjciLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIGhlaWdodD0iMSIgd2lkdGg9IjMiIHk9IjYiIHg9IjUiLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHk9IjUiIHg9IjYiLz4NCgkNCgkNCjwvc3ZnPg==") !important;
- background-position: center !important;
-}`;
+ scrollbar[root="true"] {
+ position: relative;
+ z-index: 2147483647;
+ }
+
+ scrollbar:not([active="true"]),
+ scrollbar[disabled="true"] {
+ visibility: hidden;
+ }
+ }
+
+ scrollbar
+ {
+ color-scheme: light !important;
+ -moz-default-appearance: none;
+ -moz-binding: url("chrome://global/content/bindings/scrollbar.xml#scrollbar");
+ cursor: default;
+ min-width: 16px !important;
+ background-color: ThreeDHighlight !important;
+ opacity: 1 !important;
+ }
+
+ thumb
+ {
+ color-scheme: light !important;
+ -moz-default-appearance: none !important;
+ position: relative !important;
+ background-color: -moz-Dialog !important;
+ min-height: 8px !important;
+ pointer-events: auto !important;
+ border: 0 !important;
+ box-shadow: inset -1px -1px 0 WindowFrame, inset 1px 1px 0 -moz-Dialog, inset -2px -2px 0 ThreeDShadow, inset 2px 2px 0 ThreeDHighlight !important;
+ }
+
+ thumb[orient="horizontal"] {
+ -moz-default-appearance: none;
+ min-height: 16px !important;
+ min-width: 8px !important;
+ max-width: 100% !important;
+ background-repeat: no-repeat !important;
+ }
+
+ scrollbarbutton
+ {
+ color-scheme: light !important;
+ min-width: 16px !important;
+ min-height: 16px !important;
+ -moz-default-appearance: none !important;
+ background-color: -moz-Dialog !important;
+ box-shadow: inset -1px -1px 0 WindowFrame, inset 1px 1px 0 -moz-Dialog, inset -2px -2px 0 ThreeDShadow, inset 2px 2px 0 ThreeDHighlight !important;
+ }
+
+ scrollbarbutton:not(.disabled):hover:active
+ {
+ background-color: -moz-dialog !important;
+ border: 1px solid ThreeDShadow !important;
+ box-shadow: none !important;
+ }
+
+ slider,
+ slider[orient="vertical"]
+ {
+ color-scheme: light !important;
+ -moz-default-appearance: none;
+ background-color: ThreeDHighlight !important;
+ background-repeat: repeat !important;
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMiIgaGVpZ2h0PSIyIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAuNTI5MTcgLjUyOTE3IiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnPjxnPjxyZWN0IHg9Ii4yNjQ1OCIgeT0iMC4wMDAwIiB3aWR0aD0iLjI2NDU4IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVEU2hhZG93Ii8+PHJlY3QgeD0iMC4wMDAwIiB5PSIuMjY0NTgiIHdpZHRoPSIuMjY0NTgiIGhlaWdodD0iLjI2NDU4IiBmaWxsPSJUaHJlZURTaGFkb3ciLz48cmVjdCB4PSIwLjAwMDAiIHk9IjAuMDAwMCIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiIGZpbGw9IlRocmVlREhpZ2hsaWdodCIvPjxyZWN0IHg9Ii4yNjQ1OCIgeT0iLjI2NDU4IiB3aWR0aD0iLjI2NDU4IiBoZWlnaHQ9Ii4yNjQ1OCIgZmlsbD0iVGhyZWVESGlnaGxpZ2h0Ii8+PC9nPjwvZz48L3N2Zz4=") !important;
+ }
+
+ scrollcorner
+ {
+ color-scheme: light !important;
+ -moz-default-appearance: none !important;
+ -moz-binding: url(chrome://global/content/bindings/scrollbar.xml#scrollbar-base);
+ width: 16px;
+ cursor: default;
+ background-color: -moz-dialog; !important;
+ }
+
+ scrollbarbutton[type="increment"]
+ {
+ -moz-default-appearance: none;
+ background-repeat: no-repeat !important;
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4KICA8cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSI3IiB5PSI0IiB4PSI1IiBmaWxsPSJDYW52YXNUZXh0Ii8+PHJlY3Qgd2lkdGg9IjEiIGhlaWdodD0iNSIgeT0iNSIgeD0iNiIgZmlsbD0iQ2FudmFzVGV4dCIvPjxyZWN0IHdpZHRoPSIxIiBoZWlnaHQ9IjMiIHk9IjYiIHg9IjciIGZpbGw9IkNhbnZhc1RleHQiLz48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB5PSI3IiB4PSI4IiBmaWxsPSJDYW52YXNUZXh0Ii8+CiAgCiAgCjwvc3ZnPg==") !important;
+ background-position: center center !important;
+ }
+
+ scrollbar[orient="vertical"] > scrollbarbutton[type="increment"]
+ {
+ -moz-default-appearance: none;
+ background-repeat: no-repeat !important;
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTUiIHdpZHRoPSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4KICA8cmVjdCBoZWlnaHQ9IjEiIHdpZHRoPSI3IiB4PSIzIiB5PSI1IiBmaWxsPSJDYW52YXNUZXh0Ii8+PHJlY3QgaGVpZ2h0PSIxIiB3aWR0aD0iNSIgeT0iNiIgeD0iNCIgZmlsbD0iQ2FudmFzVGV4dCIvPjxyZWN0IGhlaWdodD0iMSIgd2lkdGg9IjMiIHg9IjUiIHk9IjciIGZpbGw9IkNhbnZhc1RleHQiLz48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4PSI2IiB5PSI4IiBmaWxsPSJDYW52YXNUZXh0Ii8+CiAgCiAgCjwvc3ZnPg==") !important;
+ background-position: center center !important;
+ }
+
+ scrollbarbutton[type="decrement"]
+ {
+ -moz-default-appearance: none;
+ background-repeat: no-repeat !important;
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTUiIHdpZHRoPSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4KICA8cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSI3IiB5PSI0IiB4PSI4IiBmaWxsPSJDYW52YXNUZXh0Ii8+PHJlY3Qgd2lkdGg9IjEiIGhlaWdodD0iNSIgeT0iNSIgeD0iNyIgZmlsbD0iQ2FudmFzVGV4dCIvPjxyZWN0IHdpZHRoPSIxIiBoZWlnaHQ9IjMiIHk9IjYiIHg9IjYiIGZpbGw9IkNhbnZhc1RleHQiLz48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB5PSI3IiB4PSI1IiBmaWxsPSJDYW52YXNUZXh0Ii8+CiAgCiAgCjwvc3ZnPg==") !important;
+ background-position: center center !important;
+ }
+
+ scrollbar[orient="vertical"] > scrollbarbutton[type="decrement"]
+ {
+ -moz-default-appearance: none;
+ background-repeat: no-repeat !important;
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4KCTxyZWN0IGhlaWdodD0iMSIgd2lkdGg9IjciIHk9IjgiIHg9IjMiIGZpbGw9IkNhbnZhc1RleHQiLz48cmVjdCBoZWlnaHQ9IjEiIHdpZHRoPSI1IiB4PSI0IiB5PSI3IiBmaWxsPSJDYW52YXNUZXh0Ii8+PHJlY3QgaGVpZ2h0PSIxIiB3aWR0aD0iMyIgeT0iNiIgeD0iNSIgZmlsbD0iQ2FudmFzVGV4dCIvPjxyZWN0IHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHk9IjUiIHg9IjYiIGZpbGw9IkNhbnZhc1RleHQiLz4KCQoJCjwvc3ZnPg==") !important;
+ background-position: center center !important;
+ }
+
+ scrollbarbutton[type="increment"][disabled="true"]
+ {
+ background-repeat: no-repeat !important;
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4NCgk8cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIHdpZHRoPSIxIiBoZWlnaHQ9IjciIHk9IjQiIHg9IjUiLz48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIyIiBmaWxsPSJUaHJlZURIaWdobGlnaHQiIHg9IjYiIHk9IjEwIi8+PHJlY3Qgd2lkdGg9IjEiIGhlaWdodD0iMiIgZmlsbD0iVGhyZWVESGlnaGxpZ2h0IiB4PSI3IiB5PSI5Ii8+PHJlY3Qgd2lkdGg9IjEiIGhlaWdodD0iMiIgZmlsbD0iVGhyZWVESGlnaGxpZ2h0IiB4PSI4IiB5PSI4Ii8+PHJlY3Qgd2lkdGg9IjEiIGZpbGw9IlRocmVlREhpZ2hsaWdodCIgaGVpZ2h0PSIxIiB5PSI4IiB4PSI5Ii8+PHJlY3QgZmlsbD0iVGhyZWVEU2hhZG93IiB3aWR0aD0iMSIgaGVpZ2h0PSI1IiB5PSI1IiB4PSI2Ii8+PHJlY3QgZmlsbD0iVGhyZWVEU2hhZG93IiB3aWR0aD0iMSIgaGVpZ2h0PSIzIiB5PSI2IiB4PSI3Ii8+PHJlY3QgZmlsbD0iVGhyZWVEU2hhZG93IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB5PSI3IiB4PSI4Ii8+DQoJDQoJDQo8L3N2Zz4=");
+ background-position: center center !important;
+ }
+
+ scrollbar[orient="vertical"] > scrollbarbutton[type="increment"][disabled="true"]
+ {
+ background-repeat: no-repeat !important;
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTUiIHdpZHRoPSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4NCgk8cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIGhlaWdodD0iMSIgd2lkdGg9IjciIHg9IjMiIHk9IjUiLz48cmVjdCBmaWxsPSJUaHJlZURIaWdobGlnaHQiIGhlaWdodD0iMSIgd2lkdGg9IjIiIHk9IjYiIHg9IjkiLz48cmVjdCBmaWxsPSJUaHJlZURIaWdobGlnaHQiIGhlaWdodD0iMSIgd2lkdGg9IjIiIHk9IjciIHg9IjgiLz48cmVjdCBmaWxsPSJUaHJlZURIaWdobGlnaHQiIGhlaWdodD0iMSIgd2lkdGg9IjIiIHg9IjciIHk9IjgiLz48cmVjdCBmaWxsPSJUaHJlZURIaWdobGlnaHQiIGhlaWdodD0iMSIgd2lkdGg9IjEiIHg9IjciIHk9IjkiLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIGhlaWdodD0iMSIgd2lkdGg9IjUiIHk9IjYiIHg9IjQiLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIGhlaWdodD0iMSIgd2lkdGg9IjMiIHg9IjUiIHk9IjciLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHg9IjYiIHk9IjgiLz4NCgkNCgkNCjwvc3ZnPg==");
+ background-position: center center !important;
+ }
+
+ scrollbarbutton[type="decrement"][disabled="true"]
+ {
+ background-repeat: no-repeat !important;
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTUiIHdpZHRoPSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4NCgk8cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIHdpZHRoPSIxIiBoZWlnaHQ9IjciIHk9IjQiIHg9IjgiLz48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSI3IiBmaWxsPSJUaHJlZURIaWdobGlnaHQiIHk9IjUiIHg9IjkiLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIHdpZHRoPSIxIiBoZWlnaHQ9IjUiIHk9IjUiIHg9IjciLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIHdpZHRoPSIxIiBoZWlnaHQ9IjMiIHk9IjYiIHg9IjYiLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHk9IjciIHg9IjUiLz4NCgkNCgkNCjwvc3ZnPg==");
+ background-position: center center !important;
+ }
+
+ scrollbar[orient="vertical"] > scrollbarbutton[type="decrement"][disabled="true"]
+ {
+ background-repeat: no-repeat !important;
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgdmlld0JveD0iMCAwIDE1IDE1Ij4NCgk8cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIGhlaWdodD0iMSIgd2lkdGg9IjciIHk9IjgiIHg9IjMiLz48cmVjdCBmaWxsPSJUaHJlZURIaWdobGlnaHQiIHdpZHRoPSI3IiBoZWlnaHQ9IjEiIHk9IjkiIHg9IjQiLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIGhlaWdodD0iMSIgd2lkdGg9IjUiIHg9IjQiIHk9IjciLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIGhlaWdodD0iMSIgd2lkdGg9IjMiIHk9IjYiIHg9IjUiLz48cmVjdCBmaWxsPSJUaHJlZURTaGFkb3ciIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHk9IjUiIHg9IjYiLz4NCgkNCgkNCjwvc3ZnPg==") !important;
+ background-position: center !important;
+ }`;
var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(
Ci.nsIStyleSheetService
);
- var uri = makeURI("data:text/css;charset=UTF=8," + encodeURIComponent(css));
+ var uri = Services.io.newURI(
+ "data:text/css;charset=UTF=8," + encodeURIComponent(css)
+ );
sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
})();
diff --git a/chrome/space_and_separator_restorer.uc.js b/chrome/space_and_separator_restorer.uc.js
index 058bf41..0d94ae9 100644
--- a/chrome/space_and_separator_restorer.uc.js
+++ b/chrome/space_and_separator_restorer.uc.js
@@ -12,95 +12,118 @@
// [!] BUG: do not move main 'space'-item to palette or it will be hidden until customizing mode gets reopened
// [!] Fix for WebExtensions with own windows by 黒仪大螃蟹 (for 1-N scripts)
+(function () {
+ Components.utils.import("resource:///modules/CustomizableUI.jsm");
+ var appversion = parseInt(Services.appinfo.version);
+ var AddSeparator = {
+ init: function () {
+ if (
+ appversion >= 76 &&
+ location != "chrome://browser/content/browser.xhtml"
+ )
+ return;
-Components.utils.import("resource:///modules/CustomizableUI.jsm");
-var {Services} = Components.utils.import("resource://gre/modules/Services.jsm", {});
-var appversion = parseInt(Services.appinfo.version);
+ try {
+ document
+ .getElementById("back-button")
+ .setAttribute("removable", "true");
+ document
+ .getElementById("forward-button")
+ .setAttribute("removable", "true");
+ } catch (e) {}
-var AddSeparator = {
- init: function() {
+ /* blank tab workaround */
+ try {
+ if (gBrowser.selectedBrowser.getAttribute("blank"))
+ gBrowser.selectedBrowser.removeAttribute("blank");
+ } catch (e) {}
- if (appversion >= 76 && location != 'chrome://browser/content/browser.xhtml')
- return;
+ var tb_config_label = "Configuration Toolbar";
+ var tb_spacer_label = "Space";
+ var tb_sep_label = "Separator";
+ var tb_spring_label = "Flexible Space";
- /* blank tab workaround */
- try {
- if(gBrowser.selectedBrowser.getAttribute('blank')) gBrowser.selectedBrowser.removeAttribute('blank');
- } catch(e) {}
-
- var tb_config_label = "Configuration Toolbar";
- var tb_spacer_label = "Space";
- var tb_sep_label = "Separator";
- var tb_spring_label = "Flexible Space";
-
- try {
- if(document.getElementById('configuration_toolbar') == null) {
-
- if(appversion <= 62) var tb_config = document.createElement("toolbar");
- else var tb_config = document.createXULElement("toolbar");
- tb_config.setAttribute("id","configuration_toolbar");
- tb_config.setAttribute("customizable","true");
- tb_config.setAttribute("class","toolbar-primary chromeclass-toolbar browser-toolbar customization-target");
- tb_config.setAttribute("mode","icons");
- tb_config.setAttribute("iconsize","small");
- tb_config.setAttribute("toolboxid","navigator-toolbox");
- tb_config.setAttribute("lockiconsize","true");
- tb_config.setAttribute("ordinal","1005");
- tb_config.setAttribute("defaultset","toolbarspacer,toolbarseparator");
-
- document.querySelector('#navigator-toolbox').appendChild(tb_config);
-
- CustomizableUI.registerArea("configuration_toolbar", {legacy: true});
- if(appversion >= 65) CustomizableUI.registerToolbarNode(tb_config);
-
- if(appversion <= 62) var tb_label = document.createElement("label");
- else var tb_label = document.createXULElement("label");
- tb_label.setAttribute("label", tb_config_label+": ");
- tb_label.setAttribute("value", tb_config_label+": ");
- tb_label.setAttribute("id","tb_config_tb_label");
- tb_label.setAttribute("removable","false");
-
- tb_config.appendChild(tb_label);
-
-
- if(appversion <= 62) var tb_spacer = document.createElement("toolbarspacer");
- else var tb_spacer = document.createXULElement("toolbarspacer");
- tb_spacer.setAttribute("id","spacer");
- tb_spacer.setAttribute("class","chromeclass-toolbar-additional");
- tb_spacer.setAttribute("customizableui-areatype","toolbar");
- tb_spacer.setAttribute("removable","false");
- tb_spacer.setAttribute("label", tb_spacer_label);
-
- tb_config.appendChild(tb_spacer);
-
-
- if(appversion <= 62) var tb_sep = document.createElement("toolbarseparator");
- else var tb_sep = document.createXULElement("toolbarseparator");
- tb_sep.setAttribute("id","separator");
- tb_sep.setAttribute("class","chromeclass-toolbar-additional");
- tb_sep.setAttribute("customizableui-areatype","toolbar");
- tb_sep.setAttribute("removable","false");
- tb_sep.setAttribute("label", tb_sep_label);
-
- tb_config.appendChild(tb_sep);
-
-
- if(appversion <= 62) var tb_spring = document.createElement("toolbarspring");
- else var tb_spring = document.createXULElement("toolbarspring");
- tb_spring.setAttribute("id","spring");
- tb_spring.setAttribute("class","chromeclass-toolbar-additional");
- tb_spring.setAttribute("customizableui-areatype","toolbar");
- tb_spring.setAttribute("removable","false");
- tb_spring.setAttribute("flex","1");
- tb_spring.setAttribute("label", tb_spring_label);
-
- tb_config.appendChild(tb_spring);
-
- // CSS
- var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
+ try {
+ if (document.getElementById("configuration_toolbar") == null) {
+ if (appversion <= 62)
+ var tb_config = document.createElement("toolbar");
+ else var tb_config = document.createXULElement("toolbar");
+ tb_config.setAttribute("id", "configuration_toolbar");
+ tb_config.setAttribute("customizable", "true");
+ tb_config.setAttribute(
+ "class",
+ "toolbar-primary chromeclass-toolbar browser-toolbar customization-target"
+ );
+ tb_config.setAttribute("mode", "icons");
+ tb_config.setAttribute("iconsize", "small");
+ tb_config.setAttribute("toolboxid", "navigator-toolbox");
+ tb_config.setAttribute("lockiconsize", "true");
+ tb_config.setAttribute("ordinal", "1005");
+ tb_config.setAttribute(
+ "defaultset",
+ "toolbarspacer,toolbarseparator"
+ );
- var uri = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent('\
+ document.querySelector("#navigator-toolbox").appendChild(tb_config);
+
+ CustomizableUI.registerArea("configuration_toolbar", {
+ legacy: true,
+ });
+ if (appversion >= 65) CustomizableUI.registerToolbarNode(tb_config);
+
+ if (appversion <= 62) var tb_label = document.createElement("label");
+ else var tb_label = document.createXULElement("label");
+ tb_label.setAttribute("label", tb_config_label + ": ");
+ tb_label.setAttribute("value", tb_config_label + ": ");
+ tb_label.setAttribute("id", "tb_config_tb_label");
+ tb_label.setAttribute("removable", "false");
+
+ tb_config.appendChild(tb_label);
+
+ if (appversion <= 62)
+ var tb_spacer = document.createElement("toolbarspacer");
+ else var tb_spacer = document.createXULElement("toolbarspacer");
+ tb_spacer.setAttribute("id", "spacer");
+ tb_spacer.setAttribute("class", "chromeclass-toolbar-additional");
+ tb_spacer.setAttribute("customizableui-areatype", "toolbar");
+ tb_spacer.setAttribute("removable", "false");
+ tb_spacer.setAttribute("label", tb_spacer_label);
+
+ tb_config.appendChild(tb_spacer);
+
+ if (appversion <= 62)
+ var tb_sep = document.createElement("toolbarseparator");
+ else var tb_sep = document.createXULElement("toolbarseparator");
+ tb_sep.setAttribute("id", "separator");
+ tb_sep.setAttribute("class", "chromeclass-toolbar-additional");
+ tb_sep.setAttribute("customizableui-areatype", "toolbar");
+ tb_sep.setAttribute("removable", "false");
+ tb_sep.setAttribute("label", tb_sep_label);
+
+ tb_config.appendChild(tb_sep);
+
+ if (appversion <= 62)
+ var tb_spring = document.createElement("toolbarspring");
+ else var tb_spring = document.createXULElement("toolbarspring");
+ tb_spring.setAttribute("id", "spring");
+ tb_spring.setAttribute("class", "chromeclass-toolbar-additional");
+ tb_spring.setAttribute("customizableui-areatype", "toolbar");
+ tb_spring.setAttribute("removable", "false");
+ tb_spring.setAttribute("flex", "1");
+ tb_spring.setAttribute("label", tb_spring_label);
+
+ tb_config.appendChild(tb_spring);
+
+ // CSS
+ var sss = Components.classes[
+ "@mozilla.org/content/style-sheet-service;1"
+ ].getService(Components.interfaces.nsIStyleSheetService);
+
+ var uri = Services.io.newURI(
+ "data:text/css;charset=utf-8," +
+ encodeURIComponent(
+ '\
\
#configuration_toolbar { \
-moz-appearance: none !important; \
@@ -161,21 +184,24 @@ var AddSeparator = {
max-width: 100% !important; \
}\
\
- '), null, null);
+ '
+ ),
+ null,
+ null
+ );
- sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
- }
- } catch(e){}
+ sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
+ }
+ } catch (e) {}
+ },
+ };
- }
-
-}
-
-/* initialization delay workaround */
-document.addEventListener("DOMContentLoaded", AddSeparator.init(), false);
-/* Use the below code instead of the one above this line, if issues occur */
-/*
+ /* initialization delay workaround */
+ document.addEventListener("DOMContentLoaded", AddSeparator.init(), false);
+ /* Use the below code instead of the one above this line, if issues occur */
+ /*
setTimeout(function(){
AddSeparator.init();
},2000);
*/
+})();
diff --git a/chrome/status-bar.uc.js b/chrome/status-bar.uc.js
new file mode 100644
index 0000000..9bb355a
--- /dev/null
+++ b/chrome/status-bar.uc.js
@@ -0,0 +1,207 @@
+// ==UserScript==
+// @name Status Bar
+// @author xiaoxiaoflood
+// @include main
+// @startup UC.statusBar.exec(win);
+// @shutdown UC.statusBar.destroy();
+// @onlyonce
+// ==/UserScript==
+
+const { CustomizableUI, StatusPanel } = window;
+
+UC.statusBar = {
+ PREF_ENABLED: "userChromeJS.statusbar.enabled",
+ PREF_STATUSTEXT: "userChromeJS.statusbar.appendStatusText",
+
+ get enabled() {
+ return xPref.get(this.PREF_ENABLED);
+ },
+
+ get textInBar() {
+ return this.enabled && xPref.get(this.PREF_STATUSTEXT);
+ },
+
+ init: function () {
+ xPref.set(this.PREF_ENABLED, true, true);
+ xPref.set(this.PREF_STATUSTEXT, true, true);
+ this.enabledListener = xPref.addListener(this.PREF_ENABLED, (isEnabled) => {
+ CustomizableUI.getWidget("status-dummybar").instances.forEach(
+ (dummyBar) => {
+ dummyBar.node.setAttribute("collapsed", !isEnabled);
+ }
+ );
+ });
+ this.textListener = xPref.addListener(this.PREF_STATUSTEXT, (isEnabled) => {
+ if (!UC.statusBar.enabled) return;
+
+ _uc.windows((doc, win) => {
+ let StatusPanel = win.StatusPanel;
+ if (isEnabled)
+ win.statusbar.textNode.appendChild(StatusPanel._labelElement);
+ else StatusPanel.panel.appendChild(StatusPanel._labelElement);
+ });
+ });
+
+ this.setStyle();
+ _uc.sss.loadAndRegisterSheet(this.STYLE.url, this.STYLE.type);
+
+ CustomizableUI.registerArea("status-bar", {});
+
+ Services.obs.addObserver(this, "browser-delayed-startup-finished");
+ },
+
+ exec: function (win) {
+ let document = win.document;
+ let StatusPanel = win.StatusPanel;
+
+ let dummystatusbar = _uc.createElement(document, "toolbar", {
+ id: "status-dummybar",
+ toolbarname: "Status Bar",
+ hidden: "true",
+ });
+ dummystatusbar.collapsed = !this.enabled;
+ dummystatusbar.setAttribute = function (att, value) {
+ let result = Element.prototype.setAttribute.apply(this, arguments);
+
+ if (att == "collapsed") {
+ let StatusPanel = win.StatusPanel;
+ if (value === true) {
+ xPref.set(UC.statusBar.PREF_ENABLED, false);
+ win.statusbar.node.setAttribute("collapsed", true);
+ StatusPanel.panel.appendChild(StatusPanel._labelElement);
+ win.statusbar.node.parentNode.collapsed = true;
+ } else {
+ xPref.set(UC.statusBar.PREF_ENABLED, true);
+ win.statusbar.node.setAttribute("collapsed", false);
+ if (UC.statusBar.textInBar)
+ win.statusbar.textNode.appendChild(StatusPanel._labelElement);
+ win.statusbar.node.parentNode.collapsed = false;
+ }
+ }
+
+ return result;
+ };
+ win.gNavToolbox.appendChild(dummystatusbar);
+
+ win.statusbar.node = _uc.createElement(document, "toolbar", {
+ id: "status-bar",
+ customizable: "true",
+ context: "toolbar-context-menu",
+ mode: "icons",
+ });
+
+ win.statusbar.textNode = _uc.createElement(document, "toolbaritem", {
+ id: "status-text",
+ flex: "1",
+ width: "100",
+ });
+ if (this.textInBar)
+ win.statusbar.textNode.appendChild(StatusPanel._labelElement);
+ win.statusbar.node.appendChild(win.statusbar.textNode);
+
+ win.eval(
+ 'Object.defineProperty(StatusPanel, "_label", {' +
+ Object.getOwnPropertyDescriptor(StatusPanel, "_label")
+ .set.toString()
+ .replace(/^set _label/, "set")
+ .replace(
+ /((\s+)this\.panel\.setAttribute\("inactive", "true"\);)/,
+ "$2this._labelElement.value = val;$1"
+ ) +
+ ", enumerable: true, configurable: true});"
+ );
+
+ let bottomBox = document.createElement("vbox");
+ bottomBox.id = "browser-bottombox";
+ bottomBox.append(win.statusbar.node);
+
+ if (!this.enabled) bottomBox.collapsed = true;
+
+ document
+ .getElementById("fullscreen-and-pointerlock-wrapper")
+ .insertAdjacentElement("afterend", bottomBox);
+
+ win.addEventListener("fullscreen", this.fsEvent);
+
+ if (document.readyState === "complete") this.observe(win);
+ },
+
+ fsEvent: function (ev) {
+ const { StatusPanel, fullScreen, statusbar } = ev.target;
+ if (fullScreen) StatusPanel.panel.appendChild(StatusPanel._labelElement);
+ else statusbar.textNode.appendChild(StatusPanel._labelElement);
+ },
+
+ observe: function (win) {
+ CustomizableUI.registerToolbarNode(win.statusbar.node);
+ },
+
+ orig: Object.getOwnPropertyDescriptor(StatusPanel, "_label").set.toString(),
+
+ setStyle: function () {
+ this.STYLE = {
+ url: Services.io.newURI(
+ "data:text/css;charset=UTF-8," +
+ encodeURIComponent(`
+ @-moz-document url('${_uc.BROWSERCHROME}') {
+ #status-bar {
+ color: initial !important;
+ /*background-color: var(--toolbar-non-lwt-bgcolor);*/
+ }
+ #status-text > #statuspanel-label {
+ border-top: 0 !important;
+ /*background-color: unset !important;
+ color: #444;*/
+ }
+ #status-bar > #status-text {
+ display: flex !important;
+ justify-content: center !important;
+ align-content: center !important;
+ flex-direction: column !important;
+ -moz-window-dragging: drag;
+ }
+ toolbarpaletteitem #status-text:before {
+ content: "Status text";
+ color: red;
+ border: 1px #aaa solid;
+ border-radius: 3px;
+ font-weight: bold;
+ }
+ /*#browser-bottombox:not([collapsed]) {
+ border-top: 1px solid #BCBEBF !important;
+ }*/
+ :root[inFullscreen]:not([macOSNativeFullscreen]) #browser-bottombox {
+ visibility: collapse !important;
+ }
+ }
+ `)
+ ),
+ type: _uc.sss.USER_SHEET,
+ };
+ },
+
+ destroy: function () {
+ const { CustomizableUI } = Services.wm.getMostRecentBrowserWindow();
+
+ xPref.removeListener(this.enabledListener);
+ xPref.removeListener(this.textListener);
+ CustomizableUI.unregisterArea("status-bar");
+ _uc.sss.unregisterSheet(this.STYLE.url, this.STYLE.type);
+ _uc.windows((doc, win) => {
+ const { eval, statusbar, StatusPanel } = win;
+ eval(
+ 'Object.defineProperty(StatusPanel, "_label", {' +
+ this.orig.replace(/^set _label/, "set") +
+ ", enumerable: true, configurable: true});"
+ );
+ StatusPanel.panel.appendChild(StatusPanel._labelElement);
+ doc.getElementById("status-dummybar").remove();
+ statusbar.node.remove();
+ win.removeEventListener("fullscreen", this.fsEvent);
+ });
+ Services.obs.removeObserver(this, "browser-delayed-startup-finished");
+ delete UC.statusBar;
+ },
+};
+
+UC.statusBar.init();
diff --git a/chrome/toolbar.png b/chrome/toolbar.png
deleted file mode 100644
index df62a97..0000000
Binary files a/chrome/toolbar.png and /dev/null differ
diff --git a/chrome/toolbar/back.png b/chrome/toolbar/back.png
deleted file mode 100644
index 549fe89..0000000
Binary files a/chrome/toolbar/back.png and /dev/null differ
diff --git a/chrome/toolbar/bookmarks.png b/chrome/toolbar/bookmarks.png
deleted file mode 100644
index 7d715b8..0000000
Binary files a/chrome/toolbar/bookmarks.png and /dev/null differ
diff --git a/chrome/toolbar/copy.png b/chrome/toolbar/copy.png
deleted file mode 100644
index f0f9340..0000000
Binary files a/chrome/toolbar/copy.png and /dev/null differ
diff --git a/chrome/toolbar/cut.png b/chrome/toolbar/cut.png
deleted file mode 100644
index 9f4b388..0000000
Binary files a/chrome/toolbar/cut.png and /dev/null differ
diff --git a/chrome/toolbar/downloads.png b/chrome/toolbar/downloads.png
deleted file mode 100644
index a830ddd..0000000
Binary files a/chrome/toolbar/downloads.png and /dev/null differ
diff --git a/chrome/toolbar/email.png b/chrome/toolbar/email.png
deleted file mode 100644
index 78a7f87..0000000
Binary files a/chrome/toolbar/email.png and /dev/null differ
diff --git a/chrome/toolbar/find.png b/chrome/toolbar/find.png
deleted file mode 100644
index b61ebb8..0000000
Binary files a/chrome/toolbar/find.png and /dev/null differ
diff --git a/chrome/toolbar/forward.png b/chrome/toolbar/forward.png
deleted file mode 100644
index ff6f18f..0000000
Binary files a/chrome/toolbar/forward.png and /dev/null differ
diff --git a/chrome/toolbar/fullscreen.png b/chrome/toolbar/fullscreen.png
deleted file mode 100644
index 46dd9c0..0000000
Binary files a/chrome/toolbar/fullscreen.png and /dev/null differ
diff --git a/chrome/toolbar/history.png b/chrome/toolbar/history.png
deleted file mode 100644
index f0bcae8..0000000
Binary files a/chrome/toolbar/history.png and /dev/null differ
diff --git a/chrome/toolbar/home.png b/chrome/toolbar/home.png
deleted file mode 100644
index ad99d31..0000000
Binary files a/chrome/toolbar/home.png and /dev/null differ
diff --git a/chrome/toolbar/hover/back.png b/chrome/toolbar/hover/back.png
deleted file mode 100644
index 6af7669..0000000
Binary files a/chrome/toolbar/hover/back.png and /dev/null differ
diff --git a/chrome/toolbar/hover/bookmarks.png b/chrome/toolbar/hover/bookmarks.png
deleted file mode 100644
index 77339ac..0000000
Binary files a/chrome/toolbar/hover/bookmarks.png and /dev/null differ
diff --git a/chrome/toolbar/hover/copy.png b/chrome/toolbar/hover/copy.png
deleted file mode 100644
index d404435..0000000
Binary files a/chrome/toolbar/hover/copy.png and /dev/null differ
diff --git a/chrome/toolbar/hover/cut.png b/chrome/toolbar/hover/cut.png
deleted file mode 100644
index 64477b5..0000000
Binary files a/chrome/toolbar/hover/cut.png and /dev/null differ
diff --git a/chrome/toolbar/hover/downloads.png b/chrome/toolbar/hover/downloads.png
deleted file mode 100644
index 894e3ac..0000000
Binary files a/chrome/toolbar/hover/downloads.png and /dev/null differ
diff --git a/chrome/toolbar/hover/emaill.png b/chrome/toolbar/hover/emaill.png
deleted file mode 100644
index 3c51946..0000000
Binary files a/chrome/toolbar/hover/emaill.png and /dev/null differ
diff --git a/chrome/toolbar/hover/find.png b/chrome/toolbar/hover/find.png
deleted file mode 100644
index 21b0026..0000000
Binary files a/chrome/toolbar/hover/find.png and /dev/null differ
diff --git a/chrome/toolbar/hover/forward.png b/chrome/toolbar/hover/forward.png
deleted file mode 100644
index cbda16f..0000000
Binary files a/chrome/toolbar/hover/forward.png and /dev/null differ
diff --git a/chrome/toolbar/hover/fullscreen.png b/chrome/toolbar/hover/fullscreen.png
deleted file mode 100644
index 06b4f04..0000000
Binary files a/chrome/toolbar/hover/fullscreen.png and /dev/null differ
diff --git a/chrome/toolbar/hover/history.png b/chrome/toolbar/hover/history.png
deleted file mode 100644
index 08084d4..0000000
Binary files a/chrome/toolbar/hover/history.png and /dev/null differ
diff --git a/chrome/toolbar/hover/home.png b/chrome/toolbar/hover/home.png
deleted file mode 100644
index 62f1542..0000000
Binary files a/chrome/toolbar/hover/home.png and /dev/null differ
diff --git a/chrome/toolbar/hover/new.png b/chrome/toolbar/hover/new.png
deleted file mode 100644
index f5cb69e..0000000
Binary files a/chrome/toolbar/hover/new.png and /dev/null differ
diff --git a/chrome/toolbar/hover/paste.png b/chrome/toolbar/hover/paste.png
deleted file mode 100644
index 88c5881..0000000
Binary files a/chrome/toolbar/hover/paste.png and /dev/null differ
diff --git a/chrome/toolbar/hover/print.png b/chrome/toolbar/hover/print.png
deleted file mode 100644
index 027347e..0000000
Binary files a/chrome/toolbar/hover/print.png and /dev/null differ
diff --git a/chrome/toolbar/hover/refresh.png b/chrome/toolbar/hover/refresh.png
deleted file mode 100644
index b03802f..0000000
Binary files a/chrome/toolbar/hover/refresh.png and /dev/null differ
diff --git a/chrome/toolbar/hover/sidebar.png b/chrome/toolbar/hover/sidebar.png
deleted file mode 100644
index 1fb4a6b..0000000
Binary files a/chrome/toolbar/hover/sidebar.png and /dev/null differ
diff --git a/chrome/toolbar/hover/stop.png b/chrome/toolbar/hover/stop.png
deleted file mode 100644
index 34f02b2..0000000
Binary files a/chrome/toolbar/hover/stop.png and /dev/null differ
diff --git a/chrome/toolbar/large/back.png b/chrome/toolbar/large/back.png
deleted file mode 100644
index 5d691bb..0000000
Binary files a/chrome/toolbar/large/back.png and /dev/null differ
diff --git a/chrome/toolbar/large/bookmarks.png b/chrome/toolbar/large/bookmarks.png
deleted file mode 100644
index c11c2b6..0000000
Binary files a/chrome/toolbar/large/bookmarks.png and /dev/null differ
diff --git a/chrome/toolbar/large/copy.png b/chrome/toolbar/large/copy.png
deleted file mode 100644
index 2b76841..0000000
Binary files a/chrome/toolbar/large/copy.png and /dev/null differ
diff --git a/chrome/toolbar/large/cut.png b/chrome/toolbar/large/cut.png
deleted file mode 100644
index 7d1a9d0..0000000
Binary files a/chrome/toolbar/large/cut.png and /dev/null differ
diff --git a/chrome/toolbar/large/downloads.png b/chrome/toolbar/large/downloads.png
deleted file mode 100644
index a7072d0..0000000
Binary files a/chrome/toolbar/large/downloads.png and /dev/null differ
diff --git a/chrome/toolbar/large/email.png b/chrome/toolbar/large/email.png
deleted file mode 100644
index bcf72ad..0000000
Binary files a/chrome/toolbar/large/email.png and /dev/null differ
diff --git a/chrome/toolbar/large/find.png b/chrome/toolbar/large/find.png
deleted file mode 100644
index 0ee2984..0000000
Binary files a/chrome/toolbar/large/find.png and /dev/null differ
diff --git a/chrome/toolbar/large/forward.png b/chrome/toolbar/large/forward.png
deleted file mode 100644
index 69e5ee9..0000000
Binary files a/chrome/toolbar/large/forward.png and /dev/null differ
diff --git a/chrome/toolbar/large/fullscreen.png b/chrome/toolbar/large/fullscreen.png
deleted file mode 100644
index 9638e57..0000000
Binary files a/chrome/toolbar/large/fullscreen.png and /dev/null differ
diff --git a/chrome/toolbar/large/history.png b/chrome/toolbar/large/history.png
deleted file mode 100644
index bdad395..0000000
Binary files a/chrome/toolbar/large/history.png and /dev/null differ
diff --git a/chrome/toolbar/large/home.png b/chrome/toolbar/large/home.png
deleted file mode 100644
index 18bc2c9..0000000
Binary files a/chrome/toolbar/large/home.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/back.png b/chrome/toolbar/large/hover/back.png
deleted file mode 100644
index b370ed4..0000000
Binary files a/chrome/toolbar/large/hover/back.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/bookmarks.png b/chrome/toolbar/large/hover/bookmarks.png
deleted file mode 100644
index 01b2b1e..0000000
Binary files a/chrome/toolbar/large/hover/bookmarks.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/copy.png b/chrome/toolbar/large/hover/copy.png
deleted file mode 100644
index f46fe8c..0000000
Binary files a/chrome/toolbar/large/hover/copy.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/cut.png b/chrome/toolbar/large/hover/cut.png
deleted file mode 100644
index 9de73c6..0000000
Binary files a/chrome/toolbar/large/hover/cut.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/downloads.png b/chrome/toolbar/large/hover/downloads.png
deleted file mode 100644
index 153dd84..0000000
Binary files a/chrome/toolbar/large/hover/downloads.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/email.png b/chrome/toolbar/large/hover/email.png
deleted file mode 100644
index 5440214..0000000
Binary files a/chrome/toolbar/large/hover/email.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/find.png b/chrome/toolbar/large/hover/find.png
deleted file mode 100644
index def6fb1..0000000
Binary files a/chrome/toolbar/large/hover/find.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/forward.png b/chrome/toolbar/large/hover/forward.png
deleted file mode 100644
index d2a833c..0000000
Binary files a/chrome/toolbar/large/hover/forward.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/fullscreen.png b/chrome/toolbar/large/hover/fullscreen.png
deleted file mode 100644
index 76ea064..0000000
Binary files a/chrome/toolbar/large/hover/fullscreen.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/history.png b/chrome/toolbar/large/hover/history.png
deleted file mode 100644
index 9e8ba11..0000000
Binary files a/chrome/toolbar/large/hover/history.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/home.png b/chrome/toolbar/large/hover/home.png
deleted file mode 100644
index c23095f..0000000
Binary files a/chrome/toolbar/large/hover/home.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/new.png b/chrome/toolbar/large/hover/new.png
deleted file mode 100644
index 0b6cb9b..0000000
Binary files a/chrome/toolbar/large/hover/new.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/paste.png b/chrome/toolbar/large/hover/paste.png
deleted file mode 100644
index ae59cfa..0000000
Binary files a/chrome/toolbar/large/hover/paste.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/print.png b/chrome/toolbar/large/hover/print.png
deleted file mode 100644
index c4d30de..0000000
Binary files a/chrome/toolbar/large/hover/print.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/refresh.png b/chrome/toolbar/large/hover/refresh.png
deleted file mode 100644
index ab4114f..0000000
Binary files a/chrome/toolbar/large/hover/refresh.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/sidebar.png b/chrome/toolbar/large/hover/sidebar.png
deleted file mode 100644
index 69a1ed7..0000000
Binary files a/chrome/toolbar/large/hover/sidebar.png and /dev/null differ
diff --git a/chrome/toolbar/large/hover/stop.png b/chrome/toolbar/large/hover/stop.png
deleted file mode 100644
index a0fd6ca..0000000
Binary files a/chrome/toolbar/large/hover/stop.png and /dev/null differ
diff --git a/chrome/toolbar/large/new.png b/chrome/toolbar/large/new.png
deleted file mode 100644
index 6ad8382..0000000
Binary files a/chrome/toolbar/large/new.png and /dev/null differ
diff --git a/chrome/toolbar/large/paste.png b/chrome/toolbar/large/paste.png
deleted file mode 100644
index 5ffefb7..0000000
Binary files a/chrome/toolbar/large/paste.png and /dev/null differ
diff --git a/chrome/toolbar/large/print.png b/chrome/toolbar/large/print.png
deleted file mode 100644
index 16f6fa3..0000000
Binary files a/chrome/toolbar/large/print.png and /dev/null differ
diff --git a/chrome/toolbar/large/refresh.png b/chrome/toolbar/large/refresh.png
deleted file mode 100644
index 4af2539..0000000
Binary files a/chrome/toolbar/large/refresh.png and /dev/null differ
diff --git a/chrome/toolbar/large/sidebar.png b/chrome/toolbar/large/sidebar.png
deleted file mode 100644
index aba01c6..0000000
Binary files a/chrome/toolbar/large/sidebar.png and /dev/null differ
diff --git a/chrome/toolbar/large/stop.png b/chrome/toolbar/large/stop.png
deleted file mode 100644
index 7465d6e..0000000
Binary files a/chrome/toolbar/large/stop.png and /dev/null differ
diff --git a/chrome/toolbar/new.png b/chrome/toolbar/new.png
deleted file mode 100644
index 050658d..0000000
Binary files a/chrome/toolbar/new.png and /dev/null differ
diff --git a/chrome/toolbar/paste.png b/chrome/toolbar/paste.png
deleted file mode 100644
index 1e88a1f..0000000
Binary files a/chrome/toolbar/paste.png and /dev/null differ
diff --git a/chrome/toolbar/print.png b/chrome/toolbar/print.png
deleted file mode 100644
index b4be5b3..0000000
Binary files a/chrome/toolbar/print.png and /dev/null differ
diff --git a/chrome/toolbar/refresh.png b/chrome/toolbar/refresh.png
deleted file mode 100644
index ad471c9..0000000
Binary files a/chrome/toolbar/refresh.png and /dev/null differ
diff --git a/chrome/toolbar/sidebar.png b/chrome/toolbar/sidebar.png
deleted file mode 100644
index bb709bc..0000000
Binary files a/chrome/toolbar/sidebar.png and /dev/null differ
diff --git a/chrome/toolbar/stop.png b/chrome/toolbar/stop.png
deleted file mode 100644
index dfb93e5..0000000
Binary files a/chrome/toolbar/stop.png and /dev/null differ
diff --git a/chrome/toolbar_large.png b/chrome/toolbar_large.png
deleted file mode 100644
index 38c4694..0000000
Binary files a/chrome/toolbar_large.png and /dev/null differ
diff --git a/chrome/userChrome.css b/chrome/userChrome.css
index 9587fb8..bbf4008 100644
--- a/chrome/userChrome.css
+++ b/chrome/userChrome.css
@@ -1,4 +1,4 @@
-@import url("toolbar-label-under-icon.css");
+@import url("msfx/msfx.css");
:root {
--toolbar-bgcolor: -moz-Dialog !important;
@@ -17,14 +17,14 @@
) !important;
--toolbarbutton-border-radius: 2px !important;
--toolbarbutton-icon-fill-opacity: 1 !important;
- --panel-separator-color: ThreeDLightShadow !important;
+ --panel-separator-color: ThreeDShadow !important;
--arrowpanel-background: -moz-field !important;
--arrowpanel-color: -moz-FieldText !important;
--arrowpanel-border-color: ThreeDShadow !important;
--arrowpanel-dimmed: hsla(0, 0%, 80%, 0.35) !important;
--arrowpanel-dimmed-further: hsla(0, 0%, 80%, 0.5) !important;
--arrowpanel-dimmed-even-further: hsla(0, 0%, 80%, 0.8) !important;
- --urlbar-separator-color: ThreeDLightShadow !important;
+ --urlbar-separator-color: ThreeDShadow !important;
--chrome-content-separator-color: ThreeDShadow !important;
--toolbarbutton-hover-transition-duration: 0 !important;
--toolbarbutton-outer-padding: 2px !important;
@@ -38,6 +38,7 @@
--tab-block-margin: 0px !important;
--tab-min-height: 18px !important;
--arrowpanel-border-radius: 0px !important;
+ --toolbar-size: -16px !important;
/** MSFX CONFIGURATION **/
--hide-tab-close-button: none; /* none = hide | unset = show */
@@ -49,578 +50,14 @@
--show-alltabs-button: unset; /* none = hide | unset = show */ /* THIS BREAKS HIDING TABS WHEN THERES ONLY ONE!!! */
--show-status-bar: flex; /* none = hide | flex = show */
--lock-toolbars: none; /* none = hide | block = show */
- --navigator-toolbox-gap: 0px; /* 2px = Unlocked | 0px = Locked */ /* This variable is for the gap between the browser content and the Toolbars. */
--show-history-menu-item: none; /* none = hide | unset = show */
--selected-tab-font-weight: 600 !important; /* 600 = bold | 500 = normal */
--toolbar-tinting: luminosity !important; /* luminosity = tinted | normal = disabled */
--stop-reload-order: row-reverse; /* row-reverse = stop first, row = reload first */
}
-menupopup,
-panel {
- --windows-panel-box-shadow: none !important;
-}
-
-#urlbar-container {
- --urlbar-container-height: 22px !important;
-}
-
-#urlbar {
- --urlbar-height: 22px !important;
- --urlbar-toolbar-height: 22px !important;
- color: WindowText !important;
- padding-right: 16px !important;
-}
-
-#urlbar-scheme {
- color: WindowText !important;
-}
-
-/* Add 3D Borders back to context menus. */
-menupopup {
- appearance: none !important;
- border: none !important;
- padding: 2px !important;
- box-shadow: inset -1px -1px 0 ThreeDDarkShadow, inset 1px 1px 0 ThreeDFace,
- inset -2px -2px 0 ThreeDShadow, inset 2px 2px 0 ThreeDHighlight !important;
-}
-
-/* Fix Menubar Selection. */
-#main-menubar > menu[_moz-menuactive="true"] {
- color: inherit !important;
-}
-
-#main-menubar > menu {
- appearance: menuitem !important;
- min-height: 19px !important;
-}
-
-/* Status Bar */
-
-#browser-bottombox {
- margin-top: 2px;
- height: 18px;
- /*display: var(--show-status-bar);
- gap: 2px;
- box-shadow: inset -1px -1px 0 ThreeDHighlight, inset 1px 1px 0 ThreeDShadow;*/
-}
-
-#main-window:not([sizemode="maximized"]) #browser-bottombox::after {
- content: "";
- display: inline-block;
- width: 12px;
- height: 12px;
- appearance: resizer;
- position: fixed;
- right: 1px;
- bottom: 1px;
-}
-
-#status-text::before {
- content: "";
- display: inline-block;
- width: 16px;
- height: 16px;
- position: fixed;
- left: 2px;
- bottom: 1px;
- background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABgUExURYaGhv///5mZmVVVVf/78ABmzDMzMwAAgDNm//Hx8czMzHd3d2aZmZnMzDMzzGb//+rq6pmZZv//mQDM/+fn1v/MmcyZZjNmzF9fXwAzmcDAwABmmYCAADMzZgQEBAAAANSdJEsAAAAgdFJOU/////////////////////////////////////////8AXFwb7QAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAIpJREFUKFNNjFsWgyAMREUIRGhTbOlLW7P/XRoD2t6Tj8w9k3TM3O3IzipMpbeHcEpvxOwCwDnrvVcRQHA4xD7ZTYTTmegCg8tRvnQcxqvU6QZDLnET6Y7bCUAuKtLjidKQg1Ibr/GNOE2Ec2t86EsoSG4/iJdlnjVXwZRMliDTBKd40IT9oeIP5hU1fA8vue4FsgAAAABJRU5ErkJggg==");
-}
-#status-text {
- height: 18px;
- padding-left: 16px;
- box-shadow: inset -1px -1px 0 ThreeDHighlight, inset 1px 1px 0 ThreeDShadow;
-}
-
-#statuspanel-label {
- background-color: unset !important;
- border: 0 !important;
- /*padding-top: unset !important;
- padding-bottom: unset !important;
- padding-left: 2px !important;*/
- padding-bottom: 4px !important;
-}
-
-#statuspanel {
- display: flex !important;
- align-items: center !important;
- margin-top: unset !important;
- bottom: 1px !important;
- left: 1px !important;
- transition: none !important;
- min-height: 16px !important;
- position: fixed !important;
- padding-top: 0 !important;
- background-color: -moz-Dialog !important;
-}
-
-#statuspanel-inner {
- height: 100% !important;
- display: flex;
- align-items: center;
-}
-
-/* I give up making comments. */
-#navigator-toolbox {
- border-bottom: 0 !important;
- appearance: groupbox !important;
- margin-bottom: var(--navigator-toolbox-gap) !important;
-}
-
-.browserStack,
-#customization-container {
- -moz-default-appearance: listbox !important;
- -moz-appearance: listbox !important;
-}
-
-.browser-toolbar:not(#TabsToolbar):not(#toolbar-menubar) {
- border-top: 1px solid ThreeDShadow !important;
- box-shadow: inset 0 1px 0 ThreeDHighlight !important;
- padding-top: 1px !important;
-}
-
-#PersonalToolbar {
- padding-inline: 0 !important;
-}
-
-.tabbrowser-tab {
- appearance: tab !important;
- padding: 0 5px !important;
-}
-
-.tabbrowser-tab:not([pinned]) {
- max-width: 176px !important;
-}
-
-.tab-background {
- display: none !important;
-}
-
-.tab-close-button {
- display: var(--hide-tab-close-button) !important;
- padding: 0 !important;
- width: 10px !important;
- height: 10px !important;
- transform: translate(-1px, -1px);
- margin-inline-end: calc(var(--inline-tab-padding) + 2px) !important;
- list-style-image: none !important;
- background-color: -moz-DialogText !important;
- mask-repeat: no-repeat !important;
- mask-position: center center !important;
- mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA4SURBVBhXY2RgYPgPxCAAYiMDmDgYgDjIAnA+si4UHUCAbiIYoJtEvAnoOuF8kCqYBLqdQHEGBgAx7A/5GaSbcgAAAABJRU5ErkJggg==") !important;
-}
-
-.tab-close-button[pinned] {
- display: none !important;
-}
-
-.tab-label {
- line-height: unset !important;
-}
-
-.tab-content {
- display: flex !important;
- align-items: center;
-}
-
-.tab-close-button:hover {
- background-color: WindowText;
- opacity: 0.5 !important;
-}
-
-#urlbar-background,
-#searchbar {
- border: 0 !important;
- border-radius: 0 !important;
- -moz-default-appearance: listbox !important;
- -moz-appearance: listbox !important;
- box-shadow: none !important;
-}
-
-#urlbar[breakout][breakout-extend] #urlbar-background {
- height: var(--urlbar-height) !important;
-}
-
-#urlbar[breakout][breakout-extend] #favimginurlbar {
- margin: 3px !important;
-}
-
-#urlbar[breakout][breakout-extend] .urlbar-input-box::after {
- display: none !important;
-}
-
-#tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs])
- > #tabbrowser-arrowscrollbox
- > .tabbrowser-tab[first-visible-unpinned-tab] {
- margin-inline-start: 0 !important;
-}
-
-#context-navigation {
- display: flex;
- flex-direction: column;
- padding-bottom: 0 !important;
-}
-
-#context-navigation::after {
- content: "";
- display: block;
- appearance: menuseparator;
-}
-
-#context-sep-navigation {
- display: none !important;
-}
-
-#context-navigation > .menuitem-iconic {
- list-style-image: none !important;
- position: relative !important;
- -moz-box-pack: unset !important;
-}
-
-#context-navigation .menuitem-iconic::before {
- display: block;
- content: attr(aria-label);
- margin-left: 18px;
- padding-bottom: 0 !important;
-}
-
-#context-sep-navigation {
- margin-top: 0 !important;
-}
-
-toolbarseparator {
- border-left: 1px solid ThreeDShadow;
- border-right: 1px solid ThreeDHighlight;
- margin: 2px;
-}
-
-toolbarpaletteitem[place="toolbar"][id^="wrapper-customizableui-special-spring"],
-toolbarspring {
- -moz-box-flex: 1000 !important;
-}
-
-#activity_throbber {
- background-color: #000;
- border-left: 1px solid ThreeDHighlight;
- box-shadow: -1px 0 0 ThreeDShadow;
- height: 22px !important;
- list-style-image: none !important;
- background-repeat: no-repeat;
- background-position: center center;
- min-width: 39px !important;
- min-height: 22px !important;
- padding: 0 !important;
- position: relative !important;
- left: 1px;
- background-image: url("data:image/bmp;base64,Qk0uCgAAAAAAADYAAAAoAAAAJgAAABYAAAABABgAAAAAAPgJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAERERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAzAAAzMwAzMwAzAAAzMwAzAAAREREAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMAAAAAADMzADMzM2YzM2YzM5lmZmZmM01NTWYzABEREQAzMxEREREREREREQAAMwAzMxEREQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzMAMzMzZjMzM2YzVVVVKSkpAAAAQkJCMzMzOTk5MzMzADMzADMzHBwcM2ZmADMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAREREzMwBmMzOZZjPMmWbMmWaZmWYcHBxmMzMREREAAAAAAAAAAAAAAAAAAAAzM2YAMzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzAGYzM2ZmM5lmZpmZZsyZmZmZZikpKZlmM5lmM2YzMwBmMwCZzACZzAAAADNmZhEREQAAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAKSkpmWYzmWZmmZlmzJmZmZlmAAAAmWYzzGYzZmYzADNmAMz/AJnMAAAAADMzERERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcHBw5OTlfX19mZjNCQkJCQkJCQkIcHBxmZjOZZjNmZjMAM2YAzP8AmcwAAAAzZmYAMzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwcHDMzM0JCQmZmmWZmmZmZzGZmmSkpKTk5ORERETMAAAAzMwBmZgAzMwAAADNmZgAzMxEREQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzMzNmM2aZZmaZZmbMmZnMZpnMERERM2bMMzPMADNmHBwcM2YzM2YzAAAAVVVVADMAADMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMAADMzM2ZmZsxmmcxmmcxmZswzAAAzZswAZswzM5kAZjNmmWYzmWYAAABmmWYzZjMcHBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzMwAzZjMzmXd3d2ZmZmZmZnd3dyIiIjNmzDMz/wAzmTMzAGbMZjOZMwAAAF9fXwBmMxwcHAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAzKSkpTU1NMzNmMzNmM2aZTU1NHBwcKSkpAAAzADMzADMzM2YzKSkpAAAAZplmMzMzADMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMAMzMAADMAMzMAADMzM2YAM2YzM2ZfX19CQkIcHBwAAAAREREpKSkzZmYzmTMzMzMAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAAAAAMwAAAAAAAAAAMwAAMwAzZjMzZjNmZjNmZl9fXzOZZjNmMzNmMwAzAAAzMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAzADMzIiIiADMzMzMAADMzADMAADMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMAAAAAMwAAMwAREREAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=");
-}
-
-#activity_throbber[busy] {
- background-image: url("data:image/gif;base64,R0lGODlhFgAWAPYAAAAAAAAAMwAAZgAzAAAzMwAzZgAzmQBmAABmMwBmZgBmmQBmzACAgACZmQCZzBERERwcHCIiIikpKTMAADMAMzMzADMzMzMzZjMzmTNmADNmMzNmZjNmmTNmzDOZMzOZZjOZmTOZzDOZ/zPMzDPM/zk5OUJCQk1NTVVVVV9fX2YAAGYzAGYzM2YzZmZmAGZmM2ZmZmZmmWZmzGaZM2aZZmaZmWaZzGaZ/2bMM2bMZmbMmWbMzGbM/3d3d4CAAIaGhpaWlpkzAJkzM5lmAJlmM5lmZplmmZmZAJmZM5mZZpmZzJmZ/5nMZpnMmZnMzJnM/6CgpKbK8K2pkLKyssDAwMDcwMwzAMwzM8xmAMxmM8xmZsyZAMyZM8yZZsyZmczMAMzMM8zMZszMmczMzMzs/8z/Zsz/mcz/zNfX193d3efn1u/Wxv8zAP8zM/9mAP9mM/98gP+ZAP+Zmf/MAP/MZv/Mmf/MzP//Zv//mf//zAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBAACACwAAAAAFgAWAAAH/4AAgoOEhYaHiImKghMAAwMPA4uDExMVERUEFQMVho2NAJUrLC8vKTMaGpyElq0soykmEAAPEi8eFpKMExInLCxEJxASlhUaEgA0uYQVK0I9MDA9EVltQQQ5HgApGRC6oRMsWl1dWgFZWEIZNDPJGrOUwEVaXl0PWVcrEKkAKI+EECyYKFLESxEJJR4EqOCi04sKDwCWSLHBhEUIGzhsWDFnC4CHhQJI4BCjhpIaADh02NgRAMRCBC5sKHlyJIcLGbZ4fPEAlKAHMTnYsFEDwoWIhFh0gmnhggYUyExYKGGhQgUIIAkFAECg6YUYG04UeADxQc+XIQMQIKA2ANJJgwrewp1Lt65dAIEAACH5BAUEAAIALAIAAgAUABEAAAe1gAKCAg+DgwAPAAKKhoKFhooTFRESBw8DgxWCjAAVKoInMxoCGRGYAhWSgiuDJYYoGgcAA4UWLIIphIMSqIK8ugIsMAIvw0SDOB+QhZoCWl6LAm9Bo4IzFqeCQsddWhACVo0nhg8SFoYRFgSNjREXKCnnhhcu5I0bHAI1Mez9EQWCbAj61g8AI0M1+jV6VEhCCRMCXEWUJ8jFBHIQCozbIODCukKKQC4MICBCAAIHFQ4KkFJlIAAh+QQFBAACACwBAAEAFQARAAAHvoACgoMPg4aHiIWIAgCLhBOKhoUDEQMQhw8SlwITgyssLy+DA40ChRWdAhWCKAIRjAIaAhKkghWggiyCrwIDswIzhBUSgykoKQJZghI5HoIDqw+dmwJdpkRuQhmDHhWKD6u6hAJXpobUApcsyEmEBJG9pQMPBCknAhYWjiariDExNmoYcuFIAAECFzjUABKDl6pBLHydK2joxYRSDxpFuFDihL4S+lZJePACHqODFwS0EkQNACpHhQIQCGDSUCAAIfkEBQQAAgAsAgABABMAEgAAB8SAAoKDD4OGh4YVEIgCAwACj4MQERKFhhOFFY2HFRGQDxMTgxqCmgITEgIsgiuiLxaLiQIQKyWDJ6uDBIMwA4IWAkQpKCezV28CFjiCGhUDDyupRIdvQYYoEL6CL4NFglYssQLNAA8VFsAC3rEBpoYPEBIXgiaDHRsrX4IshfC7gjUGcRCwglGsDQJsGCrgYpAJSwICAIsREKIhF5YKEShxwUQqQxI05RLw4EEAASVMbJg3KBLJQQEenRTkkhFMADNtCgoEACH5BAUEAAIALAEAAQAUABEAAAe2gAKCgwIRD4SIiRACFYuIAImDEgIWjoKQhAADgosWLBUTmIgVm5yUKy8sEysCLCWRABMRAi8oL7QmhLOCt4MsqUgpKCgCRG0Ck4InA5AVJahFRVoCAFlZAhqDGhUCh4JEAkVJ0wJXrIMmpcgrJic9iN6JABEWGheD3hcug6+CmxIXOAiIgWhfJGSCYtQY1EHAOYf4ChHYIFAAhH6EMEKCQM/CII8FJwgKQIjAhRP4MD2IB+8gokAAIfkEBQQAAgAsAQABABQAEQAAB8aAAoKDEBISg4iJiSYVEYqPghYWAhWHiQMAgpmCBAQCLxYQgyslggOIESsmJ58sgiaTgyYCpw8VrkQCRESsiRUCGgKbgkQwSTAvEVkCK5MfghUDExIVL7sCSUUPQm5CGYiYAJWDXUVFopACARAVty8wPTCmAYguD4L3JS+zFpYCGyvmRBqUyYKJDRw4ILqAyMImegJmyRMgisOGX9AwbipxYUMMDg8YpguwydOFSYcMVWC34p4wfJxKzHqJaFiiAAQCPLCJKBAAIfkEBQQAAgAsAQABABQAEwAAB9GAAoKDgiUQhIiJEhYmFRGJkAIlJhomLxICABMAAIKdgxEWAhYoRCwVg6KJECwvLykCRC9EJYSPmQOfAkhEKbwWmAKYmCaChy+CScm1V0GYHgIauQ8VLIJcWoKYb0Eag8WC1K67XUm3Ag+DtZkPwbFFAgQSAASEJgOCAaMCL5QFEhw4XHBBqJO+dCdeCeAAYUOHDSsGofJUT8CJFDFgVLyQQd0EAfoEMRKwYUOEApA+PQipCh0wQhMqfKQoTBCBCy096RqUDp2+nZGCCiWULmTQQAAh+QQFBAACACwBAAEAFAATAAAH1YACgoMEghaDiImCBIcvGisQiooRjScnLxITAJKLAhoFGyhELywVg6YCmwIBJUREgj1IAkUCD4MlGamCLwJESF0CSUQnhwOKD4e+Al1JsV1vAhY5g6oCvIJdzClaWUK5iQ8QEivWRFxdL0VZApGKAYyISCYWBAGJmwEAhSfWLycFgjas+CII1SYCEkykeEEDBgEOHAq4GCRhUIAHhXjBSDFI4ClBtlaV0JCCY4lVnEASgFCiZaFBESJQAxlgQABxFQW8TBmSAIB3tVIiekA0pFB3RwUFAgAh+QQFBAACACwBAAEAEwATAAAH3IACgoMCFiYmEISKhAUaJi8vLBWLhASCJy8pGi8WD5SDKCcJGylFSJGTEgIAgg8EL0hdRUk0XVwwFoKqEgMClkQCSUhhXUnCLKqTGgAAqi8CXQJhYT9edMAzHwIlA5YrREmDYVxiXS8aOYLLgyaDSFxFXV0sEYO5ngIF7c8CpxcFAlYIKrHKE4ELgohAEpTAxRxFBAIQKIBCQI+Fnx48CODrBAwiNExsEJBAEasHAAgQeASD0wUJ+BZFdPXIgiWAAhLFFICSgKsSFnB+IhTAk8aiQysJ4piUkMamgQAAIfkEBQQAAgAsAQABABMAEwAAB9mAAoKDAgUnKCYPhIuLJykCLy6KjIMFAhspMzApL4kCAIyGLykcGxtJXS8WAhWMFwKoAl1STF1IqxACA6ABFi+2YV1hYVJdSS8CEgIlAwIEJkiLYtPGOR4CFgABBJBEwoJhdXVJNB+L3INIREnRdF0bhKCCBAWvMALrSCi+gquTBQUSdCNCo4eCF1sEKRPw4B88IgKQxEhw4ougCIMIBCi04cUxGPdMUBK07RWkFwUsTMI2KMADbs86iXTGcBEAAg82Pisxb2TNlThd+hQQANTNnEMHKXK5klEgACH5BAUEAAYALAEAAQATABMAAAfpgAaCgxEXCQYoFoOLjAYJGwYwMy8rD42LBSiRNESSio0BBgUbST8cHCBJXUUGEI2jSAZhYbJSYUgmERauggSkXLIGZWJisjOKGgCWBJqDdAZreU2yNIMPAQUmBsB1gmsGdUk5HwYlgwSfMIO0Bl1JghIGA4IFjhyQMEQGSUga8YMADBAQVYDDCyRJEqLgZw0AgVCOEuTbR2TDjFi8DDwYKOqCpCJJXmwgcsRAvAkDAjgUlSCFASIvCpTg+E/jQ0ECSrx4cUJRBAgBBSmzZEmgiRO9ijIKkFKjoAAPlV56oLTppaXXDEBsFAgAIfkEBQQAAgAsAQABABIAFAAAB+mAAoKDBBuGGycPg4uCEQIFChsCMEgvFYyLCQoCND00STBFl4sEgpFJPzUcNT9hMBkAjAUcSXQCeE1huV0vJQOCBQUJSQK2dGZ1ZVJhLw8lsY+SYcd1eWt5YkxhjtAFKEhcYHVieGsCYWE0BBaDwgJEPQLE6FxhSesPiqUGCRwM8km6CODyopSAB44GKTCQAslAYikIXMpn8JGCYUiKOIw4aJSgBO4EICEyA4aiBxAABGhX4AINkicKSBgE4SCBlQQKEEhB5MUFAhEezMQkaN0JdhWJClhZlKnSQQAIPHD69GCAfFUZKSIaCAAh+QQFBAACACwBAAEAEgATAAAH5YACgoOCHAopKBKEixAXgoc9NEQvFYsCEQmPMDQ1Akk0KRGWAgYKDFJJNSEgQF0vA4sJpj90ZnhiYk1hYSiVD4IFCj8Cd3h1eALIriaECgpJhHlreGZJSBoPvwIFCUlctXlqeHh0YTDM2tscREhAYoJIAlxJGgIQi84KIJ7QXC8FgipYEJBJgAIDHAQg4aJww0AAAiQMHORsgzdrBQgMqqSRWzAY0JAQAQgxWwBCBQqkQJLknyJB9ywV2DDpBAFRMAUAIPDgZEYCJ0oI0EgIQoBfPAkROLkom8ZshNKNEnRUkFQBgQAAIfkEBQQAAgAsAQABABMAEwAAB/SAAoKDEYIcCikWg4uEJwaGAj9JSIyDEosKIEk1Akk9GowQmAtNTVAhIU1dJoMAggoCCgsgdAJ4ZmJNAmGKAgQEAgkGmbV4tnd4YV0vggEFgwo1eMYCebZ4SUkCAL/BBQobXWXV1nd3YDTAA5ffCgo0XQJiYmFIXVxdEQAPEhYJ34MWhOCEBEmSF8AAQKhgwoSwWO442OOC5IK6CQJWaCjwEGIRg0QSBNg2IEKFXoMMcNCG5AUrAQ9EVZAATNC/BCALlGgmAMKDRc8KFDh4ouYgn4uAFSCAgtXPVhGeCgjwgMDIAASkQh25LauvSpWsPuDKdVEgACH5BAUEAAIALAEAAQATABQAAAfzgAKCgxIXNYIbJhCDjIMoG4IKHDU/Ai+NghEaBYILCiBJh0kwD4wVJQIKgg0LNVJNAiBASKWMCZELIWICeHhisJcCD5ycqQuwgnh3eGFJiw8EArepIVWNy5aNBsZNvckCdGEnwhUmF9MKIVKDSUhIXEQPABEVGgLbgh0OIQtJ7UjjBFSIUOKFBkiDFCho1wUJpwcPKkhY8QJFsUgc3L0gEKDUIhYZBBRIYEBBSRhJiGwU9CCCQAvRbMFAQqTYgwACICzCVADGDBMuBRF4AOEmR6EFopWIOShABAAsOTLFiQlCzJsDcHbEhAnATWFcuQaAGjYQACH5BAUEAAIALAEAAQAUABQAAAfwgAKCgwIbHDUcCoSLgw8vLxyCC4dJAg+MgyiDCw0cSTU/SRGLDysCBoIKCgshAk01IEkWhBIJiw4hNncCeAJSSIMBBIwOIoN4d3dhJpiCuDxqhHdiwIMmBQWDDjy8gr10SQ8AAREVLxuEITsCXVKVwBKWAhYZJhfEDjDvEQAPAxWzXLxIsUgBByREXhAIIAgCwBIC7wkyoCoJkhfi+gmyIJCZAooCFGwoIoCZgGEMLawwUUJAgQTZCmy4CKHRpXInF8l8MSuYJQiXBhUgMNRCT0IEAEAI8GDhwpPCmhEIakmcJYbNCD1gypBqVkFeMQUCACH5BAUEAAIALAEAAQAUABMAAAf/gAKCgxAnGzYgAheDjIwAAik0HAsKCyA1AhCNghUlLxscCgIKDhxJggSbngmDCw6uUjo1PSWNGgWNCyEhgnhNSRWCDwK1ooMhJE4Cd3h0dy+DEoIJBoMiJGd5AngCdEnDAhIFFwkMgsg8UXRlzAJh0g8EFisvKByDJCJNXQKnSCsBBBCQoKHCixf3dAlasIDDDCK1AAQU4MKEgIMfGCm4h0QCgFSDLEAjAm2UIAUzMgkYRgBCsBIuPimoJsBAgiIlHwSIJ4HFC58CCiQQWmCDAAuCHq3UZEECyEEFNFgcpBPAgwjxUBUgsFUlo3hXBQQgMFYsWXCNdAoYEIAtWwJoBzcJUCq3USAAIfkEBQQAAgAsAQABABQAEwAAB/yAAoKDDxYCIDYcCRKDjY0WL0k0HAIKCiAwFY6CDxkCLxshAgsLDhxJPYaNAJovlJWDCzVNNY4VJhqvgw68YndiUowCABIFFwmbIjZmd3h0SIIAAoYFlAoOAjwkPI1hEAIBBCUFAhscCgIi2SRhdHeCL4MFBJ8vNdgiJCEh0ElEFQCkEbDAwtOLHhywDbL0Ip4gehUcCkCCcKECIibACSBAz0WJTxNTNEKnKWA4CRFXCHDxAp0BBQXQPRhGDwABRvFenCiQgGcBDRkHhQvAiEUJVfJKfIv2YCaEChIibKLnCEAAAA8gPBi6cdMqeg8I2AwbQMBMr4ICnDWLNhAAIfkEBQQAAgAsAgABABMAFAAAB++AAoKCAAIpHDWCBIOMgxUCMEk/IAsCHBuNhI8CMzENgwsgNCaNEAJEMxyfCw6VDkACFoMPGS8omAKsAiK5TXhisyYFCgmNISIOYnd3swIaCQocAiECJNUhvgJ0EYUFAicKG9LUuyI1YIMAAQQFCSYuSEk2JCLWCjQCRS6DBQUvgi+S1HDQwcEgd/wsaNgn4AWRJDQqCeLwAkAhAQVYZGABEMkLXBgFPVBU4F1DIj5QKDCgoJ2pAAJgEpAF8B+/EoQePCCwriELnIwWDYIpYKeFCjQZjVT6IMADCKaGErjYaKmpB1QzKZVJVKvXpV4DAQAh+QQFBAACACwDAAEAEgAUAAAH74ACgoISGzAgNQWDi4MAJi80ST8KCwocEYwCDy6CkBwOCqEgjAAWL0hENIIKg6wnggAQLC8CH6yCIYIOP2EaAgASLwkCHJQCIoMLTXRdhCYnG5YgITwiuQ41AmErAAQCCSccAiA2OwIkIQ4hXIIPAhcFChunXVA7yJU0LycBAgQJBTZwmpEkSYgGrTQJKlDAl6AiNIgk2SAowQUB/QQEFMBJwAsfSFIM8uZtocMXL4i84DCsAAEA/voxPEGkkwZF/gb1I1nixayLOmFhxEjAgoASJDP90vRSQAQCOwO4Y5TxAQSFShfBxDg1K6mtWQMBACH5BAUIAAIALAMAAQASABMAAAfdgAKCghAnGzEcG4OLixICLzBINQoCCgSMAgAQLi8zSDAggwonjACPSEQ0CgsKDqsMiwASLJAfHAILDrmrSSaCDxYvGwwclCECIccKTVwCExACiimCNjY8IoIKNQIlAhAEFxuKAjVOOyOCCxzNzwIXCYkbSWFSUMiVGy+mjhcKCjAvkAhIMmlQgQDfBCW4IGhGkRlEkIwrIOABQwEJCmgY9EIAkY6YFFIU9CIiI4QjBRS4+AjkIgIPDAYTwKIbJlOXBOS04ChkpooEEEqA5jNTgF8QTAlSGhJAgJhFAwEAIfkEBQQAAgAsAwABABIAEwAAB+uAAoKCABEvGykCEYOMgwAPFS8wM0UbCY2OABIvLzMvNByCBZgAAJxISEQgCgIKCqOOExEsRDQ9Hx2uC64EghMSEiYoSAIgNjWCDbsbFQITKyYXGzAwQAI7yCGtCSbOtNQCoWI2OzogHK4b3kKJ4RzHSfExAgmjEAImKRscCQocG6hmgLr0gEAJCxIKFOjHgQaRVJxM9Fq0b18Bf+p8IEHBaVQAaRa3GRAA8YUFQQQIXPh3gYDCBBcEvWDBKAKwmAIUEjDB6WQvQQEISPiZkoAFhJgICQhQMKiEe0kFAAgAYOmDq1WjEsoqFVMgACH5BAUEAAIALAMAAQATABMAAAfsgAKCgwAVKBsmEoOLjAAQFi8pMzCMlQKFAi8zkRuCA5YCDywvREhINKATEwATECxIST09HAIKIAIFixYCLBcpLz0hILcKtAkPiygnAhsbUlJQITogC7S5ghZCWUU9CjFQQAIgNbcJ1wJCREUwPQU1giGCNJShi9wbFxsKHRwzSD0vOiETYMKEgF2DFFBCIujFrgAQBM0SQACDAgUbGL4QUAIhAUExanRihnGjoBWCAgzIF4MDrQvmCiRIkUlRyoMXDH7ERcDECQ0IF0kg0PEcAQkWIoASEABZAAIQIwwEBSAAgEtXpy4VBKAqqEAAIfkEBQQAAgAsAwABABMAEwAAB+CAAoKDAg8mJ4SJigARFS8pLxuKixECL5YvCZODAAAsg0gfHAwCA4QAEwITEi9FSDQwHAKjiZ8CJiYWMEkcISAgChwFBIOfKCcoAj1eUk0gAsACxAIVLEQCXVoFRkA13iA1spNFRco/NtA1loiClclFMBaCsiA9SZYIghKEJQXiHDQEBPz0AAAxDjViqAsmiMYMGC6oCQgQQZKgGAI2MNwAI4WAEhUEGLQgKyGhBBcSIAo5aJ+FDfsuCJBZwMKJFw8SEZC5QeYgAhL2TQrwIICgnARybuIUAIDRTksnOZ0UCAAh+QQFBAACACwDAAEAEwATAAAH5oACgoMCABImJRCEi4sAAhUvGi+MlIaEJwmUhBUsREQCSB+ZgxMAE4IVEywpL0kpNByCBIQSLAK2EhcpSTUCHCAbowIrAikCKCkSRV0/QDm+saSCWgJFylo/IQI0IRsbgxWDWl3KRb0CITUpGhYCDxTtAj9FBCiDNSC9LiWOBCcC8eL92lbDRYUS7iJsiBHDhqBY0WBweBFPAIELAs6V4MBBgQAYNDacWCFhEEIZAmxY2FCAZYILCew9IIRQQE2MAi4QKGEiHCMTF04UIEQgQgRGDx7MIgAgQFJNhAIUKiRVKtRKlAIBACH5BAUEAAIALAMAAQATABIAAAflgAKCg4IPFhIPhIqLAAIaJhoSA4uLExUsgi8EgpOUExOYgjMbCYMAE4QqJygoKUUCNBsbApOooSgnAhYmMDQ0AhwgBYMVAi8pAjAWWllFNbAgs7SDrwJaAkRvPTUgIDUcGpsCK4JaUloWWVlGNgIgHRsv0xECyEU/JinBzzU2GxoVEklgJeCECROCOvxyt2GFBAEBHnIQ0M+CgA6wkPy6UOGhuBgClNS44I5DLxgCNlQoJiACyX4jBZBMKciERYgQCFxAeMHCrBIWdIojJO7CiQ0zBz2AkIiSoACNnBKCSggAVUWBAAAh+QQFBAACACwDAAEAEwASAAAH2YACgoOCABACh4SKiw8VFhYVAIuLABMVghoaAg+SihMClysvMIIvggOKFRMrLCknJik9STQCFp2OgygWF60bArQbCagCKwKkKYJZb0QCHwI9Ar6EWl3UF1kCRb8CIBvSi10XhDoCHBwIg4kCXkUbPTE1TbQgg4YWyOIbJwIhAlJcSTgIkBCJUA0g0WJwqJFEABJBBC4tsoFCQAcBP5DMEJToAQFBNgTYOMFhwwVfGwqUiFAoggQBJ2CYRLHBRAkBJQpoUBdAEEpCDx4M+kSoJ9BOApBOUqR0UCAAIfkEBQQAAQAsAwABABMAEQAAB9mAAYKDgwAQhIiJggATFRKCA4qKFgEvAQ+RiQCCKiyVNAEzGoMTARWcASipJxcoMEkBo5ESngEpKQEnLSgoH7YgCBGEPTAwPRdabgE0NB8pMKSnWVpeqYJaATkfHB+jhEVdXl4b2F01NaAbF48BwkUBUkA9QDY2UEw/HAEI7K24xRxicLDBJA6SDQEICBsUI4ANJQFCOAzwJQBCCYcCSNBnw4mSDQJjJNmC5IIGAhkFgQgAESQHhIJMZnxAgBJMW7ks6CRg4gGhRxdAWgwwE8KDU5LYBQDAFFEgACH5BAUEAAIALAMAAQATABIAAAfagAKCg4QPD4SIiYIAAhURiokTAhMSFi6NAgOKExMrhDSCFomeLAIwKSgnJyk0MxYDjBUmgjACJygoLRseGyc0G5qCQoI9PxuINBcfGqKDWl11XjBagjQ0vDWEpYTZb0kCoBcCBM0Sg15TNTVKAkBJL8caBKEpMRsxPzU2gklzXBcaJMx7UECAPic2asToAELAnC8mTBA4JEAUB3ZPYjQcxIUAigiHIAS4J8hJohISTgwKIOhYDBSCUgiqgFIDhEEACIgTxEFAgQcVBFGkKCDAA5bzICkCQFSpgEAAIfkEBQQAAgAsAgABABQAEgAAB96AAoKDhAIAAIWJioIRDxWLihUWFRoCEYMThJmWgjCELxoQhSoVKwJEAp4mJhs9AhoSA4IWLAIpqRspKbU0GheviT89P0AxAm+pOB8WAieEpkVwYnKubAIfAjMWrs9EWl5iYzZdWUU0AhvMCBKCooJSAlRQSlACPUgoBNqXgr+pNUps1OhQQ9AWCy8IDArAzIagKAIFcEAiYItCd4IKCIjhREDHEBINRniB8YGFCyAEPBFQcEMzCxJEPSJUYqMtXAJqCqjw4sGDhYouYAQwk9CDAAoFEIgQAJKin04FBAIAIfkEBQQAAgAsAgACABQAEQAAB96AAoKDhAITDw8VD4IDhY4CFhUaghUCEAIAE4MAlCwvRCmFjYMqFSosAkWCJ4Q0ji8CMEU9sS0pGhsnBJSLKoM/grRuAigCMxE9GhqLkAJdXnZiNQJtWYI0BK6PAmsCSoMbMxoSMBqXghaoAlRjSlA1MTBEJue7gzACNUpOTjYcHEi+WBKgSECACAQ4CHCC5tGXBywecBIQ4UI+G1Gi1LAhCJaARRUmBiCwQcYOJ08GmbAgAQIAWBMXWRQEY4PKZgQ1GXwgocAGGBxiXNgQIdHHRyMhFCDEbNugpk4FBQIAIfkEBQQAAgAsAgACABQAEQAAB9yAAoKDhIMRAhICAwCFhYwVFhmCEhIDA4MTghMPgkUCPYI0MwIVhBUTLCuCoAIlFic0jSwCQgI/Aii4JicfGhC3kqSzAkBAUDFdbAIpMx4PPx4WlwKqAnICa7dvQh6Ch4iDLFlFYgJoNVoCRCcazoWHJwJeYwJOQDEbJz7SMBkQAgEO9aihxIkAJYOIzBHASQAjAAEsDDpDZtCGFwK2PGpIYNCSQTUcCeIo0YaAJwYFWZAQoSFDQQEI1YhhIoYpCT4IcSJw4cIGQRsKJNLUaFBHCwUE/CvK9GVTAYEAACH5BAUEAAIALAIAAgAUABEAAAfQgAKCg4SCAxARFRCFjBMCFRYrGoKThQCODxASAkRFgjmDm4MrFCssgj+CFgImgh6rjgIsL54/KYIsGpMATY+Lgp2DKVpuQho0MwI0NBoPsQJegzFdbUQnOTMBSY8PAhErWl1UAmmpspOV3gAPmyiCa2k1PxsXKy8VAEkaAwIAqFBOBAEZ9EKQPwHdAkQoMSiKgBoyOHBwwaiQjYCCQAjY0GjQhYc8BDyBIeCCBAgP/FFkxKGHABgbOApg+GhIxY0cPFasUPECAUERblYMIJRQIAAh+QQFBAACACwCAAEAFAARAAAHzoACgoOEhQOFiIMTDxAVEhIDD4mDABMSAiWCLwIaghOVAgACExUWgklJAkwCNIUVEysshSaPnTkzl4NCKQJFAhsosqamTCgZhVo/gjACb4IzH6KTdWsCMFpuQp2hgtsSsgJeAmvMgqahNCYChxQmm4JVMT0XFhIugkgCFYISGz1KgpTUqCHoHiIABCzE2BFF0AZBCd5REhCA0I4n1mp0ELBikEFBkgTYcOKQgwQID6T50CeIgKAYHARlEqDOU6GKiGJG2AdgX6GQhE4mkhQIACH5BAUEAAIALAIAAgAUABAAAAfPgAKCg4QAEw8QFRARA4SOgxEVJgInGgIVgoYAAhMCiJgCRYI5M48rAhKngygWiyUCNAIWgxYsRII9JyeyAh6DGqACQgI/QIIpAm6DvoONqEJdAnZUKAJvQbCEEoIRQkReAnUC1VeogzDAm9swgmNUMDAWEhGDSQLOAheDUDUwHCEbHm0KIKBEDRtOBES5UENAAReDTj0QsGlQQicpODx6sWKiAAiDdgi6kILAg4oCIHokGFBADAEE8gnIICiYII+CWgaUMPFBJ0coIdETKCAQACH5BAUEAAIALAIAAQAUABIAAAfRgAKCg4SFAIWIhAADDxIDiYUTABMsFQIaAhaKApKcD4IvgzQCMwIRnAIVFSqWgj2DEIMelocsAimDJiapEhoSAkACEp8rLEJJP8AoAlgCGaOCHgIPnxVEXnJrXidZbUKJh5RFXQJrdRdZWSungjSaAwCag2JTKCgRBBODPRmxAexQavyIsasDJAGH5EVx8kTeBUK2Bv0SpCRKlF2CWmXUJ4CAoBo8BNgwsQHCoUGhCGnisEEAiliC5A36JCiAoAu4OAiKoFEQzUIF5ME8SOgn0UAAIfkEBQQAAgAsAgACABQAEAAAB7OAAoKDhAITDwIPEAOFjQCCFo2ShUREPQI5Lx6FExMrE4MwJxIPD5ECGoOIJ0QwgiWnhEmCjCoCREaCPyaCQRozH4KpAgAVAkJdXnUCFwJvAhI5gjQCxo11XpFX0KEaiIMpAlJeUiYnAgEVK4IzEtaDQD8xKSUCIM2ThDZRThIcHRvyDarhRIASQRzwEXokIIIgGzcKRvo2iEghAhcCMhNwbpggF4YEAaAoQKMgkgIFQRAYCAAh+QQFBAACACwCAAIAFAARAAAHvYACgoOEgwAQAw+FiwITFRUlGYIVggCNApaYlyxFLwI0HhoCA5qTK4JEAiylKYIRghMCKEKtMBYCEgKvhBWKsQI/Aj0CJQJZjBakEyurcoK5bUGLpLqnWl1euMYCEIOemA8SFigCQIIWJoqEMBWkmcAwMCi3HBuMgyUcAkpONt2Cpwi9G2TDiYBbgiQNmqCOQIkLAmw8Y/Rt0QUYmExoLCZoSClC9gTEEFBAQC8B6hgFEECAQISV9wplGsgoEAAh+QQFBAACACwCAAIAFAAQAAAHpoACgoOEgw8DEAMAhYwCExIVFhkCiIITi4QTFSsCRIMaghCFKxOcLQInooMzlJiCLCgCKRKOhTSCroQ9FlmEHoO0hFpdcl2ib42ELJ6DEQJXhSkWrYImAl0CSQLThS+FJjAxJygmwcmhFxsCNkqUghcug9yCBIzOIAIVyREEGzHr784RsnZCmoASFhBaikcogIQCJzCk4CDggioBuQwFIFBvUMZBgQAAIfkEBQQAAgAsAgACABQAEQAAB7aAAoKDhAIAgw+FioKHFRERGgMVA4eHghODmIQzgwOFFSoVAkQoLBGDKAIWAg+YEi8CsCgREoIEAqKCnoNCPT0wAhJaV6o4HwIwGaeCuQJeWoluQhk0i5qDXYTLthWWAizAAkUSJoMuhIkCARfIFycCERuCK4uCFhw1NYyCCStfzOkGbYghYEqNWhwEnFuULqGgbfUelrigQUAJASYuEnpxzdaFCygwyCsQcZC3WgEClhQUwFvEQAA7");
-}
-
-#activity_throbber .toolbarbutton-icon {
- display: none !important;
-}
-
-#menubar-items {
- -moz-box-pack: center !important;
-}
-
-.tab-secondary-label {
- display: none !important;
-}
-
-#tabbrowser-tabs {
- padding-left: 2px !important;
-}
-
-:root:not([uidensity="compact"]) .tab-content[pinned] {
- padding: 0 !important;
-}
-
-#tabbrowser-tabs:not([secondarytext-unsupported]) .tab-label-container {
- height: unset !important;
- padding: 0 !important;
- width: 100% !important;
- margin-top: 1px !important;
-}
-
-.tabbrowser-tab {
- min-height: calc(var(--tab-min-height) - 3px) !important;
- padding: 0 1px !important;
- margin-top: 2px !important;
-}
-
-.tabbrowser-tab[pinned="true"] {
- padding: 0 4px !important;
-}
-
-.tabbrowser-tab[visuallyselected="true"] {
- position: unset !important;
- font-weight: var(--selected-tab-font-weight) !important;
-}
-
-.tabbrowser-tab:not([selected="true"]) {
- min-height: calc(var(--tab-min-height) - 5px) !important;
- margin-top: 4px !important;
- margin-bottom: -1px !important;
-}
-
-.tabbrowser-tab:not([pinned="true"]) .tab-icon-image {
- display: var(--show-tab-icons) !important;
-}
-
-.tabbrowser-tab .tab-icon-image {
- margin-top: 1px !important;
-}
-
-.tabbrowser-tab[selected="true"]:not([pinned="true"]) .tab-icon-overlay {
- margin-top: 1px !important;
-}
-
-.tabbrowser-tab[pinned="true"]
- .tab-icon-stack[soundplaying="true"]
- .tab-icon-image {
- display: none !important;
-}
-
-.tabbrowser-tab[pinned="true"] .tab-icon-overlay {
- display: inline-block !important;
-}
-
-.tabbrowser-tab[label="New Tab"][image]:not([busy]) .tab-icon-image {
- opacity: 0;
-}
-
-.tabbrowser-tab[label="New Tab"][image]:not([busy])
- .tab-label-container:not([selected="true"])::before {
- top: 1px;
-}
-
-.tabbrowser-tab[label="New Tab"][image]:not([busy])
- .tab-label-container::before {
- content: "";
- display: var(--show-tab-icons) !important;
- background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABgUExURYaGhv///5mZmVVVVf/78ABmzDMzMwAAgDNm//Hx8czMzHd3d2aZmZnMzDMzzGb//+rq6pmZZv//mQDM/+fn1v/MmcyZZjNmzF9fXwAzmcDAwABmmYCAADMzZgQEBAAAANSdJEsAAAAgdFJOU/////////////////////////////////////////8AXFwb7QAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAIpJREFUKFNNjFsWgyAMREUIRGhTbOlLW7P/XRoD2t6Tj8w9k3TM3O3IzipMpbeHcEpvxOwCwDnrvVcRQHA4xD7ZTYTTmegCg8tRvnQcxqvU6QZDLnET6Y7bCUAuKtLjidKQg1Ibr/GNOE2Ec2t86EsoSG4/iJdlnjVXwZRMliDTBKd40IT9oeIP5hU1fA8vue4FsgAAAABJRU5ErkJggg==") !important;
- background-size: 100%;
- width: 16px;
- height: 16px;
- position: absolute;
- top: 2px;
- left: 0px;
- pointer-events: none;
- opacity: 1;
-}
-
-.tab-throbber:not([pinned]),
-.tab-icon-pending:not([pinned]),
-.tab-icon-image:not([pinned]),
-.tab-sharing-icon-overlay:not([pinned]),
-.tab-icon-overlay:not([pinned]) {
- margin-inline-end: 3px !important;
-}
-
-:root[uidensity="compact"]
- .tab-icon-stack[indicator-replaces-favicon]
- > :not(.tab-icon-overlay),
-#tabbrowser-tabs[secondarytext-unsupported]
- .tab-icon-stack[indicator-replaces-favicon]
- > :not(.tab-icon-overlay),
-:root:not([uidensity="compact"])
- #tabbrowser-tabs:not([secondarytext-unsupported])
- .tabbrowser-tab:not(:hover)
- .tab-icon-overlay[indicator-replaces-favicon],
-:root:not([uidensity="compact"])
- #tabbrowser-tabs:not([secondarytext-unsupported])
- .tabbrowser-tab:hover
- .tab-icon-stack[indicator-replaces-favicon]
- > :not(.tab-icon-overlay) {
- opacity: 1 !important;
-}
-
-.tab-icon-stack {
- display: flex !important;
-}
-
-.tab-icon-stack[indicator-replaces-favicon="true"] .tab-icon-image {
- margin-inline-end: 0 !important;
-}
-
-/*#tabbrowser-tabs tab:first-of-type:last-of-type,
-#tabbrowser-tabs tab:first-of-type:last-of-type ~ #tabs-newtab-button,
-#tabbrowser-tabs
- tab:first-of-type:last-of-type
- ~ #tabbrowser-arrowscrollbox-periphery
- #tabs-newtab-button,
-#tabbrowser-tabs tab:first-of-type:last-of-type {
- display: none !important;
-}*/
-
-#reload-button,
-#stop-button,
-#reload-button:not([displaystop]) + #stop-button,
-#reload-button[displaystop] {
- display: inherit !important;
-}
-
-#stop-reload-button {
- flex-direction: var(--stop-reload-order) !important;
-}
-
-#urlbar[breakout-extend] {
- top: calc(
- var((--urlbar-toolbar-height) - var(--urlbar-height)) / 2
- ) !important;
- left: 0 !important;
- width: 100% !important;
-}
-
-#urlbar[breakout-extend] #urlbar-input-container {
- height: var(--urlbar-height) !important;
- padding-block: 0px !important;
- padding-inline: 0px !important;
-}
-
-:root[inFullscreen] #browser-bottombox {
- display: none !important;
-}
-
-:root[inFullscreen] .browserStack {
- -moz-default-appearance: none !important;
- -moz-appearance: none !important;
-}
-
-.bookmark-item {
- border: 1px solid transparent;
- border-radius: 0 !important;
- margin: 0 !important;
- background: transparent !important;
- padding: 2px !important;
-}
-
-.bookmark-item[label=""],
-#tabs-newtab-button,
-.toolbarbutton-1:not(#activity_throbber):not(#back-button):not(#ie6_statusbar),
-#PlacesChevron,
-#sidebar-close,
-#placesToolbar > toolbarbutton:not([disabled]) {
- width: 22px;
- height: 22px !important;
-}
-
-#status-bar {
- gap: 2px;
-}
-
-#status-bar .toolbaritem-combined-buttons {
- height: 18px !important;
- min-height: 18px !important;
-}
-
-#status-bar
- .toolbarbutton-1:not(#activity_throbber):not(#back-button):not(
- #ie6_statusbar
- ) {
- width: 22px;
- height: 18px !important;
- min-height: 18px !important;
- box-shadow: inset -1px -1px 0 ThreeDHighlight, inset 1px 1px 0 ThreeDShadow;
-}
-
-.bookmark-item:not(.menuitem-iconic):hover,
-#tabs-newtab-button:hover,
-.toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar):not(
- [disabled]
- ):hover,
-#PlacesChevron:hover,
-#sidebar-close:hover,
-#placesToolbar > toolbarbutton:not([disabled]):hover {
- border-top-color: ThreeDHighlight !important;
- border-left-color: ThreeDHighlight !important;
- border-right-color: ThreeDShadow !important;
- border-bottom-color: ThreeDShadow !important;
- background-color: transparent !important;
- border-radius: 0 !important;
-}
-
-.bookmark-item:active,
-.bookmark-item[open="true"],
-#sidebar-close:active,
-#tabs-newtab-button:active,
-.toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar):not(
- [disabled]
- ):active,
-.toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar)[open="true"],
-#PlacesChevron[open="true"],
-#PlacesChevron:active,
-#placesToolbar > toolbarbutton:not([disabled]):active {
- border-top-color: ThreeDShadow !important;
- border-left-color: ThreeDShadow !important;
- border-right-color: ThreeDHighlight !important;
- border-bottom-color: ThreeDHighlight !important;
- background-color: transparent !important;
- border-radius: 0 !important;
-}
-
-#PlacesChevron[open="true"] .toolbarbutton-icon,
-#PlacesChevron:active .toolbarbutton-icon,
-#PlacesToolbar .bookmark-item:active > *,
-#PlacesToolbar .bookmark-item[open="true"] > *,
-.toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar):active > *,
-.toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar)[open="true"] > *,
-#viewButton[open="true"] .button-box,
-#viewButton:active .button-box,
-#sidebar-close:active .toolbarbutton-icon,
-.close-icon.findbar-closebutton:active,
-.findbar-find-previous:not([disabled="true"]):active .toolbarbutton-icon,
-.findbar-find-next:not([disabled="true"]):active .toolbarbutton-icon,
-#tabs-newtab-button:active .toolbarbutton-icon,
-#placesToolbar > toolbarbutton:not([disabled]):active {
- transform: translate(1px, 1px);
-}
-
-#PlacesToolbarItems > toolbarseparator {
- padding-inline: 0 !important;
- margin: 2px !important;
-}
-
-#PlacesToolbarItems > toolbarseparator::before {
- display: none !important;
-}
-
-.bookmark-item[container] {
- list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAYUExURZmZAAAAAPHx8f//zP//mczMZv/MmQAAAHwygQUAAAAIdFJOU/////////8A3oO9WQAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAFBJREFUKFNdz0kSwCAIBVEICPe/cT5DkWC74slCya8AFHHPAHpEVEeITpV7uS9fejhAJ1tgOHsD8oO43xspA3VvDT1hLuiHVQDnVXxud4H7C0+1BHuF0oyhAAAAAElFTkSuQmCC") !important;
-}
-
-.bookmark-item[open="true"][container] {
- list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAVUExURZmZAPj4+P//mczMZgAAAP/MmQAAAICpg0sAAAAHdFJOU////////wAaSwNGAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAWElEQVQoU13PWw7AIAwDwdA87n/k2oagiG1/PKJItXoiGNtTYIu1GPbHls5hNoCQxwAGmLngHMgvPfxC8t3Qd+BEWuARYGHjGwLk7HQLwUhQMetfuD1Q9QOj9wNL8v7HsAAAAABJRU5ErkJggg==") !important;
-}
-
-.bookmark-item .toolbarbutton-text {
- margin-right: 2px !important;
-}
-
-/*#PlacesToolbar menupopup {
- background: transparent !important;
- padding: 0 !important;
- box-shadow: none !important;
-}*/
-
-.tab-throbber {
- display: none !important;
-}
-
-#PlacesToolbarItems::before {
- content: "Links";
- display: inline-block;
- height: 100%;
- line-height: 22px;
- padding-left: 4px;
- padding-right: 4px;
-}
-
-#additional_top_toolbar1::before {
+/* Adds "Address" to navigation bar if desired to use that instead of a separate bar */
+/*#nav-bar::before {
content: "Address";
display: block;
height: 100%;
@@ -628,1645 +65,4 @@ toolbarspring {
padding-left: 4px;
padding-right: 4px;
-moz-box-ordinal-group: 1 !important;
-}
-
-#additional_top_toolbar1::after,
-.browser-toolbar:not(#TabsToolbar)::after {
- content: "";
- display: var(--lock-toolbars);
- width: 3px;
- box-shadow: inset -1px -1px 0 ThreeDShadow, inset 1px 1px 0 ThreeDHighlight;
- margin: 2px;
- margin-right: 0;
- cursor: ew-resize;
- -moz-box-ordinal-group: 0 !important;
-}
-
-#nav-bar::after,
-#toolbar-menubar::after {
- margin-right: 4px !important;
-}
-
-#urlbar-container {
- display: flex !important;
-}
-
-#PersonalToolbar {
- padding-left: 0 !important;
- -moz-box-ordinal-group: 10 !important;
-}
-
-#TabsToolbar {
- -moz-box-ordinal-group: 11 !important;
-}
-
-.tab-icon-overlay[soundplaying] {
- list-style-image: none !important;
- mask-position: center center;
- mask-repeat: no-repeat;
- mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAMAAABFNRROAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAGUExURQAAAAAAAKVnuc8AAAACdFJOU/8A5bcwSgAAAAlwSFlzAAAOwwAADsMBx2+oZAAAADFJREFUGFdjYEQGWHkoFAOQArHAPAYQD8QEIRAAMgjzwHy4PjAXwoLw0CgoQOYxMgIAL5wAhbFaK4UAAAAASUVORK5CYII=") !important;
- background: -moz-DialogText !important;
-}
-
-.tab-icon-overlay[muted] {
- list-style-image: none !important;
- mask-position: center center;
- mask-repeat: no-repeat;
- mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAMAAABFNRROAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAGUExURQAAAAAAAKVnuc8AAAACdFJOU/8A5bcwSgAAAAlwSFlzAAAOwwAADsMBx2+oZAAAADNJREFUGFdtigEKADAIAvX/n17OhBoTSa8Cp36U3U1MQlFbXTePkL+em0u7SGk5N0WTyAMtxwCAzRsJ1wAAAABJRU5ErkJggg==") !important;
- background: -moz-DialogText !important;
-}
-
-.tab-icon-overlay[activemedia-blocked] {
- list-style-image: none !important;
- mask-position: center center;
- mask-repeat: no-repeat;
- mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAdSURBVChTYxhQ8B+KQQCZjReMaoKCQa6JFoCBAQARRSPdHMGSFgAAAABJRU5ErkJgggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==") !important;
- background: -moz-DialogText !important;
-}
-
-.tab-icon-overlay[indicator-replaces-favicon] {
- padding: 0 !important;
- border-radius: 0 !important;
- margin-inline-end: 3px !important;
-}
-
-.tab-icon-overlay[pinned]:not([soundplaying]):not([muted]):not(
- [activemedia-blocked]
- ) {
- display: none !important;
-}
-
-.tabbrowser-tab::before {
- content: "";
- display: block;
- width: calc(100% - 1px);
- height: 2px;
- margin-top: -8px;
- left: 0;
- appearance: menuseparator;
- position: absolute;
- z-index: 2;
- pointer-events: none !important;
-}
-
-.tabbrowser-tab:not([selected="true"])::before {
- margin-top: -10px !important;
-}
-
-#tabs-newtab-button {
- min-height: 22px !important;
- min-width: 24px !important;
- border: 1px solid transparent;
- padding: 0 !important;
- background: transparent !important;
-}
-
-toolbar:not(#TabsToolbar) #new-tab-button {
- width: 24px !important;
-}
-
-#tabs-newtab-button .toolbarbutton-icon,
-toolbar:not(#TabsToolbar) #new-tab-button .toolbarbutton-icon,
-#TabsToolbar #wrapper-new-tab-button #new-tab-button,
-#tabs-newtab-button,
-#TabsToolbar #new-tab-button {
- padding: 0 !important;
- width: 16px !important;
- height: 16px !important;
- list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAA2UExURYCAgP///+Pj40JCQsDAwDOZADPMMzNmAACAgDNm/8z//zPM/zP//wBmAAAAAACAAAAA/wAAAD6tG54AAAASdFJOU///////////////////////AOK/vxIAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABmSURBVChTXc7REoUgCEVR04NWBLf+/2cvpBbTfnKWDEMKXV5KyyiXmxxARDCAkwGoUlvhgOKw7a0xbwGOg1k0wE9YagCpH4DIeWpYukBVc37Anr0B5a2DHYvZhDFgdQgjE8a/Va4/5y0FqgTh7iIAAAAASUVORK5CYII=") !important;
-}
-
-#TabsToolbar #new-tab-button {
- padding-inline: 3px !important;
-}
-
-toolbar #new-tab-button.toolbarbutton-1 > .toolbarbutton-icon {
- padding: 0 !important;
-}
-
-.tab-icon-pending {
- display: none !important;
-}
-
-#urlbar-container {
- padding-top: 0 !important;
- padding-bottom: 0 !important;
- margin-inline: 0 !important;
-}
-
-#urlbar[breakout] {
- min-height: var(--urlbar-height) !important;
- font: menu !important;
- display: -moz-box !important;
-}
-
-#urlbar[breakout][breakout-extend] {
- display: block !important;
-}
-
-#urlbar[breakout][breakout-extend] #identity-box {
- margin-inline-end: 1px !important;
-}
-
-#PersonalToolbar {
- overflow: unset !important;
-}
-
-#urlbar-input-container {
- border: 0 !important;
-}
-
-#tracking-protection-icon-container,
-#star-button-box,
-#identity-icon-box,
-#identity-permission-box {
- display: none !important;
-}
-
-#favimginurlbar {
- margin: 2px !important;
-}
-
-#urlbar[focused="true"]:not([suppress-focus-border]) > #urlbar-background,
-#searchbar:focus-within {
- outline: 0 !important;
- box-shadow: none !important;
-}
-
-#identity-box {
- margin-inline-end: 2px !important;
-}
-
-#urlbar-go-button,
-.urlbarView-row[label]::before {
- display: none !important;
-}
-
-.urlbarView-row[label] {
- margin-block-start: 0 !important;
-}
-
-.urlbarView-row:not([type="tip"], [type="dynamic"])[selected]
- > .urlbarView-row-inner,
-.urlbarView-row-inner[selected] {
- background-color: Highlight !important;
- color: HighlightText !important;
-}
-
-.urlbarView-row {
- padding-block: 0 !important;
- border-radius: 0 !important;
- padding: 0 !important;
-}
-
-:root:not([uidensity="compact"]) .urlbarView-row-inner {
- min-height: 100% !important;
- padding-block: 0 !important;
- padding-inline: 3px !important;
- padding-top: 1px !important;
-}
-
-:root:not([uidensity="compact"])
- .urlbarView-row:not([type="tip"], [type="dynamic"]) {
- min-height: unset !important;
-}
-
-.urlbarView-row-inner {
- padding-block: 3px !important;
- border-radius: 0 !important;
- padding-inline: 2px !important;
-}
-
-.urlbarView-row:not([type="tip"], [type="dynamic"], [has-buttons]):hover
- > .urlbarView-row-inner,
-.urlbarView-row[has-buttons] > .urlbarView-row-inner:not([selected]):hover {
- background-color: Highlight !important;
- color: HighlightText !important;
-}
-
-#back-button,
-#forward-button,
-#stop-button,
-#reload-button,
-#home-button,
-#downloads-button,
-#history-panelmenu,
-#bookmarks-menu-button,
-#print-button,
-#new-window-button,
-#cut-button,
-#copy-button,
-#paste-button,
-#fullscreen-button,
-#find-button,
-#email-link-button,
-#sidebar-button,
-#library-button {
- list-style-image: none !important;
- -moz-context-properties: unset !important;
- fill: unset !important;
- opacity: unset !important;
-}
-
-#back-button > .toolbarbutton-icon,
-#forward-button > .toolbarbutton-icon,
-#stop-button > .toolbarbutton-icon,
-#reload-button > .toolbarbutton-icon,
-#home-button > .toolbarbutton-icon,
-#downloads-button > .toolbarbutton-icon,
-#downloads-button > .toolbarbutton-badge-stack,
-#history-panelmenu > .toolbarbutton-icon,
-#bookmarks-menu-button > .toolbarbutton-icon,
-#print-button > .toolbarbutton-icon,
-#new-window-button > .toolbarbutton-icon,
-#cut-button > .toolbarbutton-icon,
-#copy-button > .toolbarbutton-icon,
-#paste-button > .toolbarbutton-icon,
-#fullscreen-button > .toolbarbutton-icon,
-#find-button > .toolbarbutton-icon,
-#email-link-button > .toolbarbutton-icon,
-#sidebar-button > .toolbarbutton-icon,
-#library-button > .toolbarbutton-icon {
- padding: 0 !important;
- opacity: unset !important;
- width: 16px !important;
- height: 16px !important;
-}
-
-#back-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/back.png") !important;
-}
-#forward-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/forward.png") !important;
-}
-#stop-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/stop.png") !important;
-}
-#reload-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/refresh.png") !important;
-}
-#home-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/home.png") !important;
-}
-#downloads-button > .toolbarbutton-icon,
-#downloads-button > .toolbarbutton-badge-stack,
-#downloads-button > .toolbarbutton-badge-stack > #downloads-indicator-anchor {
- list-style-image: url("toolbar/downloads.png") !important;
-}
-#history-panelmenu > .toolbarbutton-icon {
- list-style-image: url("toolbar/history.png") !important;
-}
-#library-button > .toolbarbutton-icon,
-#bookmarks-menu-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/bookmarks.png") !important;
-}
-#print-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/print.png") !important;
-}
-#new-window-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/new.png") !important;
-}
-#cut-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/cut.png") !important;
-}
-#copy-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/copy.png") !important;
-}
-#paste-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/paste.png") !important;
-}
-#fullscreen-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/fullscreen.png") !important;
-}
-#find-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/find.png") !important;
-}
-#email-link-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/email.png") !important;
-}
-#sidebar-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/sidebar.png") !important;
-}
-
-#back-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/back.png") !important;
-}
-#forward-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/forward.png") !important;
-}
-#stop-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/stop.png") !important;
-}
-#reload-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/refresh.png") !important;
-}
-#home-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/home.png") !important;
-}
-#downloads-button:hover > .toolbarbutton-icon,
-#downloads-button:hover > .toolbarbutton-badge-stack,
-#downloads-button:hover
- > .toolbarbutton-badge-stack
- > #downloads-indicator-anchor,
-#downloads-button[open] > .toolbarbutton-icon,
-#downloads-button[open] > .toolbarbutton-badge-stack,
-#downloads-button[open]
- > .toolbarbutton-badge-stack
- > #downloads-indicator-anchor {
- list-style-image: url("toolbar/hover/downloads.png") !important;
-}
-#history-panelmenu:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/history.png") !important;
-}
-#library-button:hover > .toolbarbutton-icon,
-#bookmarks-menu-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/bookmarks.png") !important;
-}
-#print-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/print.png") !important;
-}
-#new-window-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/new.png") !important;
-}
-#cut-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/cut.png") !important;
-}
-#copy-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/copy.png") !important;
-}
-#paste-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/paste.png") !important;
-}
-#fullscreen-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/fullscreen.png") !important;
-}
-#find-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/find.png") !important;
-}
-#email-link-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/email.png") !important;
-}
-#sidebar-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/sidebar.png") !important;
-}
-
-#nav-bar
- toolbarbutton:not(#tabs-newtab-button):not(:hover):not(
- #forward-button[disabled="true"]
- ):not(#back-button[disabled="true"])
- .toolbarbutton-icon {
- mix-blend-mode: var(--toolbar-tinting);
-}
-
-#nav-bar .toolbarbutton-1 {
- min-height: 12px !important;
-}
-
-.toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar):not(#status-text) {
- border: 1px solid transparent;
-}
-#status-bar
- .toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar):not(
- #status-text
- ),
-#status-bar
- .toolbarbutton-1:not(#activity_throbber):not(#ie6_statusbar):not(
- #status-text
- ):hover {
- border: none !important;
- border-radius: 0 !important;
-}
-
-toolbarbutton:where([disabled="true"]) {
- color: ThreeDShadow !important;
- text-shadow: 1px 1px 0 ThreeDHighlight;
-}
-
-#nav-bar #back-button:where([disabled="true"]),
-#nav-bar #forward-button:where([disabled="true"]) {
- border-color: transparent !important;
-}
-
-toolbar:not(#nav-bar) .webextension-browser-action {
- padding: 0 4px !important;
-}
-
-#PersonalToolbar
- .toolbarbutton-1:not([disabled="true"]):is([open], [checked], :hover:active),
-#tabbrowser-arrowscrollbox:not([scrolledtostart="true"])::part(
- scrollbutton-up
- ):hover:active,
-#tabbrowser-arrowscrollbox:not([scrolledtoend="true"])::part(
- scrollbutton-down
- ):hover:active,
-toolbarbutton.bookmark-item:hover:active:not(.subviewbutton, [disabled="true"]),
-toolbarbutton.bookmark-item[open="true"],
-toolbar
- .toolbarbutton-1:not([disabled="true"]):is([open], [checked], :hover:active)
- > .toolbarbutton-icon,
-toolbar
- .toolbarbutton-1:not([disabled="true"]):is([open], [checked], :hover:active)
- > .toolbarbutton-text,
-toolbar
- .toolbarbutton-1:not([disabled="true"]):is([open], [checked], :hover:active)
- > .toolbarbutton-badge-stack {
- background: transparent !important;
-}
-
-#nav-bar .toolbarbutton-icon {
- margin-left: 1px !important;
- margin-right: 1px !important;
-}
-
-#back-button[disabled="true"] .toolbarbutton-icon,
-#forward-button[disabled="true"] .toolbarbutton-icon {
- fill: currentColor;
- color: ThreeDShadow;
- filter: drop-shadow(1px 1px 0 ThreeDHighlight) !important;
- -moz-context-properties: fill, fill-opacity;
-}
-
-#nav-bar #back-button[disabled="true"] > *,
-#nav-bar #forward-button[disabled="true"] {
- transform: none !important;
-}
-
-#back-button[disabled="true"] .toolbarbutton-icon,
-#forward-button[disabled="true"] .toolbarbutton-icon {
- list-style-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZlcnNpb249IjEuMSIgZmlsbD0iY29udGV4dC1maWxsIiBmaWxsLW9wYWNpdHk9ImNvbnRleHQtZmlsbC1vcGFjaXR5IiB2aWV3Qm94PSIwIDAgNC4yMzMzIDQuMjMzMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBzdHJva2Utd2lkdGg9Ii4yNjQ1OCI+PHJlY3QgeD0iLjUyOTE3IiB5PSIxLjg1MjEiIHdpZHRoPSIzLjE3NSIgaGVpZ2h0PSIuNTI5MTciLz48cmVjdCB4PSIuNzkzNzUiIHk9IjEuNTg3NSIgd2lkdGg9IjIuOTEwNCIgaGVpZ2h0PSIxLjA1ODMiLz48cmVjdCB4PSIxLjMyMjkiIHk9IjEuMDU4MyIgd2lkdGg9Ii41MjkxNyIgaGVpZ2h0PSIyLjExNjciLz48cmVjdCB4PSIxLjU4NzUiIHk9Ii43OTM3NSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIyLjY0NTgiLz48cmVjdCB4PSIxLjA1ODMiIHk9IjEuMzIyOSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIxLjU4NzUiLz48L2c+PC9zdmc+Cg==") !important;
-}
-
-#forward-button[disabled="true"] .toolbarbutton-icon,
-#forward-button[disabled="true"]:active .toolbarbutton-icon,
-#forward-button[disabled="true"] .toolbarbutton-icon:active {
- transform: scaleX(-1) !important;
-}
-
-#nav-bar
- .toolbarbutton-1:not(#back-button[disabled="true"]):not(
- #forward-button[disabled="true"]
- ):hover
- .toolbarbutton-icon,
-#nav-bar
- .toolbarbutton-1:not(#back-button[disabled="true"]):not(
- #forward-button[disabled="true"]
- ):active
- .toolbarbutton-icon,
-#nav-bar
- .toolbarbutton-1:not(#back-button[disabled="true"]):not(
- #forward-button[disabled="true"]
- )[open="true"]
- .toolbarbutton-icon {
- filter: none !important;
-}
-
-#nav-bar-customization-target > :is(toolbarbutton, toolbaritem):first-child,
-#nav-bar-customization-target
- > toolbarpaletteitem:first-child
- > :is(toolbarbutton, toolbaritem) {
- padding-inline-start: 0 !important;
-}
-
-#nav-bar {
- height: 24px;
-}
-
-#nav-bar .toolbarbutton-1 .toolbarbutton-text {
- padding-left: 3px !important;
- padding-top: 0 !important;
- padding-bottom: 0 !important;
- min-height: unset !important;
-}
-
-#back-button .toolbarbutton-text {
- display: var(--hide-back-button-text) !important;
-}
-
-#find-button .toolbarbutton-text {
- display: var(--hide-find-button-text) !important;
-}
-
-#bookmarks-menu-button .toolbarbutton-text,
-#library-button .toolbarbutton-text {
- display: var(--hide-bookmarks-menu-button-text) !important;
-}
-
-#history-panelmenu .toolbarbutton-text {
- display: var(--hide-history-button-text) !important;
-}
-
-#edit-controls {
- margin: 0 !important;
- display: flex;
-}
-
-#edit-controls separator {
- display: none !important;
-}
-
-#edit-controls .toolbarbutton-1 {
- width: 24px !important;
- height: 100% !important;
-}
-
-#downloads-button .toolbarbutton-animatable-box {
- display: none !important;
-}
-
-#downloads-button[indicator]
- > .toolbarbutton-badge-stack
- > image.toolbarbutton-icon {
- display: unset !important;
-}
-
-toolbarpaletteitem[mousedown] > toolbarbutton > .toolbarbutton-icon,
-toolbarpaletteitem[mousedown]
- > toolbarbutton
- > .toolbarbutton-badge-stack
- > .toolbarbutton-icon {
- transform: none !important;
-}
-
-.urlbarView-favicon {
- margin-inline-end: 3px !important;
-}
-
-#urlbar[open] > #urlbar-background {
- box-shadow: none !important;
-}
-
-.urlbarView {
- border-inline: 0 !important;
- margin-inline: 0 !important;
- width: calc(100% + 16px) !important;
- padding: 0 !important;
- border-inline: 1px solid red;
-}
-
-.urlbarView-body-outer {
- border: 1px solid #000;
- background-color: Window !important;
-}
-
-.urlbarView-results {
- padding-block: 0 !important;
-}
-
-.webextension-browser-action .toolbarbutton-badge-stack {
- padding: 0 !important;
-}
-
-#PanelUI-menu-button {
- list-style-image: none !important;
-}
-
-#PersonalToolbar
- .toolbarbutton-1:not([disabled="true"], [checked], [open], :active):hover,
-#tabbrowser-arrowscrollbox:not([scrolledtostart="true"])::part(
- scrollbutton-up
- ):hover,
-#tabbrowser-arrowscrollbox:not([scrolledtoend="true"])::part(
- scrollbutton-down
- ):hover,
-toolbarbutton.bookmark-item:not(
- .subviewbutton,
- [disabled="true"],
- [open]
- ):hover,
-toolbar
- .toolbarbutton-1:not([disabled="true"], [checked], [open], :active):hover
- > .toolbarbutton-icon,
-toolbar
- .toolbarbutton-1:not([disabled="true"], [checked], [open], :active):hover
- > .toolbarbutton-text,
-toolbar
- .toolbarbutton-1:not([disabled="true"], [checked], [open], :active):hover
- > .toolbarbutton-badge-stack {
- background: transparent !important;
-}
-
-#BMB_bookmarksPopup {
- box-shadow: none !important;
- padding: 0 !important;
-}
-
-#tabbrowser-tabs,
-#tabbrowser-arrowscrollbox,
-#tabbrowser-tabs[positionpinnedtabs]
- > #tabbrowser-arrowscrollbox
- > .tabbrowser-tab[pinned] {
- min-height: 0 !important;
-}
-
-#favimginurlbar[style='width: 16px; height: 16px; margin: 3px; list-style-image: url("chrome://branding/content/icon32.png");']
-{
- list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABgUExURYaGhv///5mZmVVVVf/78ABmzDMzMwAAgDNm//Hx8czMzHd3d2aZmZnMzDMzzGb//+rq6pmZZv//mQDM/+fn1v/MmcyZZjNmzF9fXwAzmcDAwABmmYCAADMzZgQEBAAAANSdJEsAAAAgdFJOU/////////////////////////////////////////8AXFwb7QAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAIpJREFUKFNNjFsWgyAMREUIRGhTbOlLW7P/XRoD2t6Tj8w9k3TM3O3IzipMpbeHcEpvxOwCwDnrvVcRQHA4xD7ZTYTTmegCg8tRvnQcxqvU6QZDLnET6Y7bCUAuKtLjidKQg1Ibr/GNOE2Ec2t86EsoSG4/iJdlnjVXwZRMliDTBKd40IT9oeIP5hU1fA8vue4FsgAAAABJRU5ErkJggg==") !important;
-}
-
-#PlacesChevron,
-#nav-bar-overflow-button {
- width: 16px !important;
- height: 100% !important;
- border: 1px solid transparent;
- list-style-image: none !important;
- padding: 0 !important;
-}
-
-#personal-toolbar-empty-description,
-#PersonalToolbar .toolbarbutton-1,
-toolbarbutton.bookmark-item:not(.subviewbutton) {
- margin: 0 !important;
-}
-
-#PlacesChevron .toolbarbutton-icon,
-#nav-bar-overflow-button .toolbarbutton-icon {
- mask-position: center 4px;
- width: 8px !important;
- height: 100% !important;
- padding: 6px !important;
- margin: 0 !important;
- background-color: WindowText !important;
- mask-repeat: no-repeat;
- mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAoSURBVBhXYwCC/1AMA+h8MMCpiBFEQAFMAUwMWQNCBxSg8PFIMjAAAMnUEfGcoUqiAAAAAElFTkSuQmCC") !important;
-}
-
-findbar {
- background-color: ThreeDFace !important;
- color: WindowText !important;
- transition: none !important;
- border-top: 0 !important;
- padding-block-start: 4px !important;
- padding-block-end: 4px !important;
-}
-
-.findbar-textbox {
- border-radius: 0 !important;
- border: 0 !important;
- -moz-default-appearance: listbox !important;
- -moz-appearance: listbox !important;
- background-color: unset !important;
- padding: 0px 3px !important;
- height: 22px !important;
-}
-
-.findbar-find-previous,
-.findbar-find-next {
- padding: 0 !important;
- width: 22px !important;
- min-height: 22px !important;
- border-radius: 0 !important;
- mask-repeat: no-repeat !important;
- mask-position: center center !important;
- border: 1px solid transparent;
- background-color: -moz-Dialog !important;
-}
-
-.findbar-find-previous {
- margin-inline: 4px 0 !important;
-}
-
-.findbar-find-next {
- margin-inline-end: 4px !important;
-}
-
-hbox[anonid="findbar-textbox-wrapper"]::after {
- content: "" !important;
- height: 20px !important;
- display: inline-block !important;
- border-left: 1px solid ThreeDShadow !important;
- border-right: 1px solid ThreeDHighlight !important;
-}
-
-.findbar-find-previous:not([disabled="true"]):hover,
-.findbar-find-next:not([disabled="true"]):hover {
- box-shadow: inset -1px -1px 0 ThreeDShadow, inset 1px 1px 0 ThreeDHighlight;
-}
-
-.findbar-find-previous:not([disabled="true"]):active,
-.findbar-find-next:not([disabled="true"]):active {
- box-shadow: inset -1px -1px 0 ThreeDHighlight, inset 1px 1px 0 ThreeDShadow;
-}
-
-.findbar-find-previous .toolbarbutton-icon,
-.findbar-find-next .toolbarbutton-icon {
- list-style-image: none !important;
- mask-repeat: no-repeat !important;
- mask-position: center center !important;
- background-color: WindowText !important;
- padding: 0 !important;
- min-width: 20px;
- min-height: 20px;
-}
-
-.findbar-find-next .toolbarbutton-icon {
- mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAECAYAAABCxiV9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAkSURBVBhXY2RgYPgPxFgBSBIEsClghEmCALICZHE4QFLAwAAA+twEAr6ulF8AAAAASUVORK5CYII=") !important;
-}
-
-.findbar-find-previous .toolbarbutton-icon {
- mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAECAYAAABCxiV9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAlSURBVBhXY0AD/6E0GDBCaRBAlgCLwyRRdEABI0gSmwQQMDAAAPqFBAIR7Pg5AAAAAElFTkSuQmCC") !important;
-}
-
-.findbar-container {
- height: 22px !important;
- margin-inline-start: 0 !important;
- overflow-inline: unset !important;
-}
-
-.findbar-container::before {
- content: "Find:" !important;
- display: inline-block !important;
- margin-inline-start: 4px !important;
- margin-inline-end: 4px !important;
-}
-
-.findbar-textbox:focus {
- outline: 0 !important;
-}
-
-.toolbarbutton.tabbable {
- padding: 0 !important;
-}
-
-.browserContainer {
- flex-direction: column-reverse !important;
-}
-
-findbar {
- flex-direction: row-reverse !important;
-}
-
-.close-icon.findbar-closebutton {
- list-style-image: none !important;
- height: 22px !important;
- width: 22px !important;
- border-radius: 0 !important;
- padding: 0 !important;
- margin: 0 !important;
- margin-inline-start: 4px !important;
- margin-inline-end: 4px !important;
- background-color: WindowText !important;
- mask-repeat: no-repeat !important;
- mask-position: center center !important;
- mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAGUExURQAAAAAAAKVnuc8AAAACdFJOU/8A5bcwSgAAAAlwSFlzAAAOwwAADsMBx2+oZAAAACRJREFUGFdjYGBgBAIgBWaBSTAbSEG5yAwQDVUBEQTRjIwMDAADqAAZRZMazAAAAABJRU5ErkJggg==") !important;
-}
-
-#sidebar-box {
- margin-right: 4px;
- appearance: groupbox !important;
- background-color: ThreeDFace !important;
-}
-
-#historyTree,
-#bookmarks-view,
-#template-container {
- background-color: Window !important;
-}
-
-treecol,
-treecolpicker {
- border: 0 !important;
-}
-
-#sidebar-search-container,
-#sidebar-header {
- font: Menu !important;
- box-shadow: inset 0 -1px ThreeDShadow !important;
- border-bottom: 1px solid ThreeDHighlight !important;
-}
-
-#sidebar-icon {
- list-style-image: none !important;
- width: 0 !important;
- height: 0 !important;
-}
-
-#sidebar-header {
- padding: 1px !important;
- padding-bottom: 2px !important;
-}
-
-#sidebar-close {
- width: 20px !important;
- height: 17px !important;
- border: 1px solid transparent;
- background-color: transparent !important;
- padding: 0 !important;
- list-style-image: none !important;
- border-radius: 0 !important;
-}
-
-#sidebar-close .toolbarbutton-icon {
- background-color: WindowText !important;
- width: 8px !important;
- height: 7px !important;
- mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA4SURBVBhXY2RgYPgPxCAAYiMDmDgYgDjIAnA+si4UHUCAbiIYoJtEvAnoOuF8kCqYBLqdQHEGBgAx7A/5GaSbcgAAAABJRU5ErkJggg==") !important;
-}
-
-#sidebar-title {
- padding-inline: 0 !important;
-}
-
-#sidebar-switcher-arrow {
- display: none !important;
-}
-
-#sidebar-switcher-target {
- padding: 3px 5px !important;
- border: 0 !important;
- border-radius: 0 !important;
- background-color: transparent !important;
-}
-
-#sidebar-switcher-target:hover {
- box-shadow: inset -1px -1px 0 ThreeDShadow, inset 1px 1px 0 ThreeDHighlight;
-}
-
-#sidebar-switcher-target:hover {
- box-shadow: inset -1px -1px 0 ThreeDShadow, inset 1px 1px 0 ThreeDHighlight;
-}
-
-#sidebar-switcher-target[open="true"] {
- box-shadow: inset -1px -1px 0 ThreeDHighlight, inset 1px 1px 0 ThreeDShadow;
-}
-
-#sidebar-switcher-target[open="true"] #sidebar-title {
- transform: translate(1px, 1px);
-}
-
-#sidebar-search-container {
- padding: 2px !important;
-}
-
-.textbox-search-sign {
- display: none !important;
-}
-
-#viewButton {
- appearance: button !important;
-}
-
-#search-box {
- padding: 2px !important;
-}
-
-.content-header {
- background-color: ThreeDFace !important;
-}
-
-.sidebar-search-container {
- padding: 2px !important;
-}
-
-.tabsFilter {
- margin: 0 !important;
-}
-
-#main-window:-moz-window-inactive .menubar-text,
-#wrapper-menubar-items .menubar-text {
- color: ThreeDShadow;
-}
-
-.menu-text,
-.menu-iconic-text {
- margin-inline-start: 0 !important;
-}
-
-.menu-iconic-icon {
- margin-left: -2px !important;
-}
-
-#main-menubar {
- display: flex !important;
-}
-
-treechildren::-moz-tree-row {
- height: 40% !important;
- min-height: 40% !important;
-}
-
-treechildren::-moz-tree-image(title, query, dayContainer),
-treechildren::-moz-tree-image(query, OrganizerQuery_history____v) {
- list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAeUExURWOczjExnDFjzmNjAJycY////87OnAAAAJwxYwAAAAggbzMAAAAKdFJOU////////////wCyzCzPAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAATElEQVQoU23PUQpAIQhEUX2Z5v433CCPGKNDX5cmSDKFqeTHFEHZQLA5/RyLV3Bf4OW/serQ5AqPyfUohxGCxWGGMJqaNAjR4fsscwNQNAUR4NgQXAAAAABJRU5ErkJggg==") !important;
-}
-
-.titlebar-button {
- list-style-image: none !important;
- height: 20px !important;
- min-width: 20px !important;
- padding: 0 !important;
- margin-top: 2px !important;
-}
-
-.titlebar-min {
- appearance: -moz-window-button-minimize !important;
-}
-
-.titlebar-restore {
- appearance: -moz-window-button-restore !important;
-}
-
-.titlebar-max {
- appearance: -moz-window-button-maximize !important;
-}
-
-.titlebar-close {
- appearance: -moz-window-button-close !important;
-}
-
-.notification-anchor-icon {
- padding: 0 !important;
- margin-inline-start: 2px !important;
-}
-
-.bookmark-item,
-.bookmark-item > label::before,
-.bookmark-item .menu-iconic-icon {
- list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABgUExURYaGhv///5mZmVVVVf/78ABmzDMzMwAAgDNm//Hx8czMzHd3d2aZmZnMzDMzzGb//+rq6pmZZv//mQDM/+fn1v/MmcyZZjNmzF9fXwAzmcDAwABmmYCAADMzZgQEBAAAANSdJEsAAAAgdFJOU/////////////////////////////////////////8AXFwb7QAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAIpJREFUKFNNjFsWgyAMREUIRGhTbOlLW7P/XRoD2t6Tj8w9k3TM3O3IzipMpbeHcEpvxOwCwDnrvVcRQHA4xD7ZTYTTmegCg8tRvnQcxqvU6QZDLnET6Y7bCUAuKtLjidKQg1Ibr/GNOE2Ec2t86EsoSG4/iJdlnjVXwZRMliDTBKd40IT9oeIP5hU1fA8vue4FsgAAAABJRU5ErkJggg==") !important;
-}
-
-.tab-icon-image:not([src]),
-.tab-icon-image:-moz-broken {
- content: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABgUExURYaGhv///5mZmVVVVf/78ABmzDMzMwAAgDNm//Hx8czMzHd3d2aZmZnMzDMzzGb//+rq6pmZZv//mQDM/+fn1v/MmcyZZjNmzF9fXwAzmcDAwABmmYCAADMzZgQEBAAAANSdJEsAAAAgdFJOU/////////////////////////////////////////8AXFwb7QAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAIpJREFUKFNNjFsWgyAMREUIRGhTbOlLW7P/XRoD2t6Tj8w9k3TM3O3IzipMpbeHcEpvxOwCwDnrvVcRQHA4xD7ZTYTTmegCg8tRvnQcxqvU6QZDLnET6Y7bCUAuKtLjidKQg1Ibr/GNOE2Ec2t86EsoSG4/iJdlnjVXwZRMliDTBKd40IT9oeIP5hU1fA8vue4FsgAAAABJRU5ErkJggg==") !important;
-}
-
-.desktop-notification-icon {
- list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAPUExURYCAgP///wAAAMDAwAAAAGFF8HEAAAAFdFJOU/////8A+7YOUwAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAFlJREFUKFNdjkESwDAIAhPk/28uYG2b7sEJO4xxUazGT2qutRsgYqIomUNsKCpDeKTyLGig3d0IIz5Y1N1wLonzW0US9eYIIqrgHNEqcYSUrzQjVPoJ3axBXuvmAgsbIC+oAAAAAElFTkSuQmCC") !important;
-}
-
-:root[sizemode="maximized"] .browserStack {
- margin-left: -2px !important;
- margin-right: -2px !important;
-}
-
-#PanelUI-menu-button,
-#PanelUI-menu-button .toolbarbutton-icon {
- display: none !important;
-}
-
-#PanelUI-menu-button {
- padding: 0 !important;
- border: 0 !important;
-}
-
-#PanelUI-menu-button .toolbarbutton-badge-stack {
- padding: 0 !important;
-}
-
-.checkbox-check {
- background-color: Window !important;
- border: 0 !important;
- border-radius: 0 !important;
- box-shadow: inset -1px -1px 0 ThreeDHighlight, inset 1px 1px 0 ThreeDShadow,
- inset -2px -2px 0 ThreeDFace, inset 2px 2px 0 ThreeDDarkShadow;
-}
-
-.checkbox-check:not([native]) {
- width: 13px !important;
- height: 13px !important;
-}
-
-.checkbox-check[checked] {
- color: WindowText !important;
- background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTMiIGhlaWdodD0iMTMiIHZlcnNpb249IjEuMSIgZmlsbD0iY29udGV4dC1maWxsIiBmaWxsLW9wYWNpdHk9ImNvbnRleHQtZmlsbC1vcGFjaXR5IiB2aWV3Qm94PSIwIDAgMy40Mzk2IDMuNDM5NiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48Zz48Zz48cmVjdCB4PSIuNzkzNzUiIHk9IjEuMzIyOSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuNzkzNzUiLz48cmVjdCB4PSIyLjM4MTIiIHk9Ii43OTM3NSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuNzkzNzUiLz48cmVjdCB4PSIyLjExNjciIHk9IjEuMDU4MyIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuNzkzNzUiLz48cmVjdCB4PSIxLjg1MjEiIHk9IjEuMzIyOSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuNzkzNzUiLz48cmVjdCB4PSIxLjA1ODMiIHk9IjEuODUyMSIgd2lkdGg9Ii43OTM3NSIgaGVpZ2h0PSIuNTI5MTciLz48cmVjdCB4PSIxLjMyMjkiIHk9IjIuMzgxMiIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiLz48cmVjdCB4PSIxLjA1ODMiIHk9IjEuNTg3NSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiLz48cmVjdCB4PSIxLjU4NzUiIHk9IjEuNTg3NSIgd2lkdGg9Ii4yNjQ1OCIgaGVpZ2h0PSIuMjY0NTgiLz48L2c+PC9nPjwvc3ZnPgo=") !important;
-}
-
-#urlbar[open] > .urlbarView > .urlbarView-body-outer > .urlbarView-body-inner {
- border-top: 0 !important;
-}
-
-#urlbar-zoom-button {
- margin: 0 !important;
- font: menu !important;
- border-radius: 0 !important;
- background-color: transparent !important;
-}
-
-#configuration_toolbar {
- -moz-box-ordinal-group: 12;
-}
-
-#customization-panelWrapper > .panel-arrowbox > .panel-arrow[side="top"] {
- display: none !important;
-}
-
-.customizationmode-button {
- appearance: button !important;
- color: WindowText !important;
- font-weight: 500 !important;
-}
-
-:root[inFullscreen] #TabsToolbar {
- -moz-box-ordinal-group: 0 !important;
-}
-
-:root[inFullscreen] .tabbrowser-tab::before {
- display: none !important;
-}
-
-:root[inFullscreen] #tabbrowser-tabs tab:first-of-type:last-of-type,
-:root[inFullscreen]
- #tabbrowser-tabs
- tab:first-of-type:last-of-type
- ~ #tabs-newtab-button,
-:root[inFullscreen]
- #tabbrowser-tabs
- tab:first-of-type:last-of-type
- ~ #tabbrowser-arrowscrollbox-periphery
- #tabs-newtab-button {
- display: -moz-box !important;
-}
-
-#placesToolbar {
- padding: 1px !important;
- appearance: groupbox !important;
- background-color: -moz-Dialog !important;
- margin-bottom: 2px !important;
-}
-
-#placesToolbar .toolbarbutton-text {
- display: none !important;
-}
-
-#placesToolbar .toolbarbutton-icon,
-#placesToolbar .menubar-left {
- filter: grayscale(1);
-}
-
-#placesToolbar .menu-iconic:hover .menubar-left,
-#placesToolbar .menu-iconic[open="true"] .menubar-left,
-#placesToolbar #back-button:not([disabled="true"]):hover .toolbarbutton-icon,
-#placesToolbar
- #forward-button:not([disabled="true"]):hover
- .toolbarbutton-icon {
- filter: none !important;
-}
-
-#searchFilter {
- min-height: 22px !important;
-}
-
-#placesList,
-#downloadsListBox,
-tree {
- background-color: Window !important;
- color: -moz-DialogText !important;
-}
-
-#detailsPane {
- background-color: -moz-Dialog !important;
- color: -moz-dialogText !important;
-}
-
-#placeContent,
-#placesViewsBox #downloadsListBox,
-#placesList,
-#searchFilter,
-#editBMPanel_tagsSelector {
- -moz-default-appearance: listbox !important;
- -moz-appearance: listbox !important;
- color: -moz-DialogText !important;
-}
-
-#places input {
- background-color: Field !important;
- color: -moz-DialogText !important;
- border: 0 !important;
- border-radius: 0 !important;
-}
-
-#searchFilter[focused],
-#places input:focus {
- outline: 0 !important;
-}
-
-#searchFilter[focused] {
- box-shadow: none !important;
-}
-
-#editBookmarkPanelRows .expander-up,
-#editBookmarkPanelRows .expander-down {
- appearance: spinner-downbutton !important;
- list-style-image: none !important;
- padding: 2px !important;
- height: 22px !important;
-}
-
-#editBookmarkPanelRows .expander-up {
- appearance: spinner-upbutton !important;
-}
-
-#placesList {
- border-right: unset !important;
- margin-right: 4px !important;
-}
-
-treecol {
- color: -moz-fieldtext !important;
- padding: 0 7px !important;
- box-shadow: inset -1px -1px 0 ThreeDDarkShadow,
- inset 1px 1px 0 ThreeDHighlight, inset -2px -2px 0 ThreeDShadow !important;
-}
-
-treechildren::-moz-tree-row,
-treecol:not([hideheader="true"]),
-treecolpicker {
- min-height: 17px !important;
-}
-
-.caption-label {
- margin-inline-start: 6px !important;
- color: GrayText !important;
- font: -moz-window !important;
-}
-
-#editBMPanel_tagsSelectorRow > richlistbox > richlistitem[selected] {
- color: HighlightText !important;
- background-color: Highlight !important;
-}
-
-richlistbox[seltype="multiple"]:focus > richlistitem[current="true"],
-richlistbox.theme-listbox:focus > richlistitem[current="true"] {
- outline: 0 !important;
-}
-
-#placesMenu > menu {
- appearance: button !important;
- color: -moz-DialogText !important;
-}
-
-#organizeButton {
- list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAzUExURZmZmf/78Ofn1k1NTcDAwBwcHOrq6mZmAK2pkDMzAP//mZmZAMzMZgAAADMAAGZmZgAAAIQzlaMAAAARdFJOU/////////////////////8AJa2ZYgAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAHxJREFUKFNVzgEOAyEIBECw1T0Blf+/tnD2GktCjJN1Ix3jOURcvvN64F1rpdJOYKb/RAJwQBSCGT+4er8gCle9oRQ0TdAMbVAkxLGhiwgsQhKRBHSIAZahDWAVFlMeN7S4Y7LNaB1Oay3EG2DMaI3S/Ax67Ih9ICfR3f0DrmQINMNg/hUAAAAASUVORK5CYII=") !important;
-}
-
-#viewMenu {
- list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAB4SURBVDhP7ZLNCcAgDIVfulIzg6t0DU/uUGfSmWziT+lJUKH00A8CiZGXPBGrEJBSzSegIrCfksdyNEL0WcAubGAB51yaIYSgg9NWlAA+xBH7nBPJahKNXu8WiLFcUGRAjkav91v4ggVSC8aYWo7BzPqV8XiR1wEuUzD3/j0F1pEAAAAASUVORK5CYII=") !important;
-}
-
-#maintenanceButton {
- list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAVUExURQAAADPM/zNm/5n//8z//zOZ/wAAAACTM88AAAAHdFJOU////////wAaSwNGAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAT0lEQVQoU62PiQ3AIAwDnXf/kWsXChmgJ2GFk4gFmuDNhUaYX8MJFsOA98yqY+AkCwsJHglmKaeIf4W7Oil2tfCIKBV/Qsb05oi5Y6PvdD8/ggRHRlWf0AAAAABJRU5ErkJggg==") !important;
-}
-
-#placesToolbar > toolbarbutton[disabled] {
- opacity: 1 !important;
-}
-
-#placesToolbar > toolbarbutton {
- border-radius: 0 !important;
- appearance: button !important;
- background-color: -moz-Dialog !important;
- border: 1px solid transparent;
- padding: 4px !important;
-}
-
-.tabbrowser-tab[pinned="true"] .tab-label-container {
- display: none !important;
-}
-
-.tabbrowser-tab[pinned="true"]:not([selected="true"]) .tab-icon-overlay {
- pointer-events: none !important;
-}
-
-.tab-icon-overlay:not([crashed]):is([pinned], [sharing]) {
- top: unset !important;
- inset-inline-end: unset !important;
- padding: 0 !important;
- background-color: transparent !important;
-}
-
-#context-navigation .menu-iconic-left {
- padding-top: 0 !important;
-}
-
-.urlbarView-results[wrap]
- > .urlbarView-row[has-url]
- > .urlbarView-row-inner
- > .urlbarView-url:-moz-locale-dir(ltr) {
- padding-left: 19px !important;
-}
-
-#TabsToolbar .toolbarbutton-1 {
- margin: 2px 0 0 !important;
-}
-
-#alltabs-button {
- list-style-image: none !important;
- padding: 0 !important;
- width: 16px !important;
- min-height: 0 !important;
- display: var(--show-alltabs-button) !important;
-}
-
-#alltabs-button .toolbarbutton-icon {
- mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAdSURBVDhPYxiB4D8UwwA6Hy+gv2b6aRoFKICBAQA7tRPtf9lgfQAAAABJRU5ErkJgggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==") !important;
- background-color: -moz-DialogText !important;
- min-height: 0 !important;
- width: 14px !important;
- height: 14px !important;
-}
-
-#alltabs-button .toolbarbutton-badge-stack {
- padding: 0 !important;
- width: 14px;
- height: 14px;
-}
-
-#alltabs-button:hover {
- border-top-color: ThreeDHighlight !important;
- border-left-color: ThreeDHighlight !important;
- border-right-color: ThreeDShadow !important;
- border-bottom-color: ThreeDShadow !important;
- background-color: transparent !important;
- border-radius: 0 !important;
-}
-
-toolbar .toolbarbutton-1 > .toolbarbutton-icon {
- height: 16px !important;
- width: 16px !important;
-}
-
-#wrapper-new-tab-button .toolbarbutton-icon {
- padding: 0 !important;
-}
-
-#wrapper-new-tab-button #new-tab-button {
- min-width: 26px !important;
-}
-
-#urlbar-background::after {
- content: "";
- display: inline-block;
- appearance: spinner-downbutton;
- z-index: 99999;
- padding-top: 18px !important;
- width: 16px;
- top: 0px;
- position: absolute !important;
- right: 0 !important;
-}
-
-#wrapper-menubar-items {
- opacity: 1 !important;
-}
-
-#history-menu {
- display: var(--show-history-menu-item) !important;
-}
-
-#go-button {
- padding: 0 5px !important;
- margin-inline-end: 3px !important;
- margin-inline-start: 2px !important;
-}
-
-#go-button .toolbarbutton-text {
- display: block;
- min-height: 0 !important;
- padding: 0 0 0 1px !important;
-}
-
-#go-button .toolbarbutton-icon {
- padding: 0 !important;
- filter: grayscale(1);
- list-style-image: url("go.png") !important;
-}
-
-#go-button:hover .toolbarbutton-icon,
-#go-button:active .toolbarbutton-icon {
- filter: none;
-}
-
-:root[uidensity="touch"] #back-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #forward-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #stop-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #reload-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #home-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #downloads-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #downloads-button > .toolbarbutton-badge-stack,
-:root[uidensity="touch"] #history-panelmenu > .toolbarbutton-icon,
-:root[uidensity="touch"] #bookmarks-menu-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #print-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #new-window-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #cut-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #copy-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #paste-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #fullscreen-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #find-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #email-link-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #sidebar-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #library-button > .toolbarbutton-icon {
- width: 20px !important;
- height: 20px !important;
-}
-
-:root[uidensity="touch"] #back-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/back.png") !important;
-}
-:root[uidensity="touch"] #forward-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/forward.png") !important;
-}
-:root[uidensity="touch"] #stop-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/stop.png") !important;
-}
-:root[uidensity="touch"] #reload-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/refresh.png") !important;
-}
-:root[uidensity="touch"] #home-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/home.png") !important;
-}
-:root[uidensity="touch"] #downloads-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #downloads-button > .toolbarbutton-badge-stack,
-:root[uidensity="touch"]
- #downloads-button
- > .toolbarbutton-badge-stack
- > #downloads-indicator-anchor {
- list-style-image: url("toolbar/downloads.png") !important;
-}
-:root[uidensity="touch"] #history-panelmenu > .toolbarbutton-icon {
- list-style-image: url("toolbar/history.png") !important;
-}
-:root[uidensity="touch"] #library-button > .toolbarbutton-icon,
-:root[uidensity="touch"] #bookmarks-menu-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/bookmarks.png") !important;
-}
-:root[uidensity="touch"] #print-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/print.png") !important;
-}
-:root[uidensity="touch"] #new-window-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/new.png") !important;
-}
-:root[uidensity="touch"] #cut-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/cut.png") !important;
-}
-:root[uidensity="touch"] #copy-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/copy.png") !important;
-}
-:root[uidensity="touch"] #paste-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/paste.png") !important;
-}
-:root[uidensity="touch"] #fullscreen-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/fullscreen.png") !important;
-}
-:root[uidensity="touch"] #find-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/find.png") !important;
-}
-:root[uidensity="touch"] #email-link-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/email.png") !important;
-}
-:root[uidensity="touch"] #sidebar-button > .toolbarbutton-icon {
- list-style-image: url("toolbar/sidebar.png") !important;
-}
-
-:root[uidensity="touch"] #back-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/back.png") !important;
-}
-:root[uidensity="touch"] #forward-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/forward.png") !important;
-}
-:root[uidensity="touch"] #stop-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/stop.png") !important;
-}
-:root[uidensity="touch"] #reload-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/refresh.png") !important;
-}
-:root[uidensity="touch"] #home-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/home.png") !important;
-}
-:root[uidensity="touch"] #downloads-button:hover > .toolbarbutton-icon,
-:root[uidensity="touch"] #downloads-button:hover > .toolbarbutton-badge-stack,
-:root[uidensity="touch"]
- #downloads-button:hover
- > .toolbarbutton-badge-stack
- > #downloads-indicator-anchor,
-:root[uidensity="touch"] #downloads-button[open] > .toolbarbutton-icon,
-:root[uidensity="touch"] #downloads-button[open] > .toolbarbutton-badge-stack,
-:root[uidensity="touch"]
- #downloads-button[open]
- > .toolbarbutton-badge-stack
- > #downloads-indicator-anchor {
- list-style-image: url("toolbar/hover/downloads.png") !important;
-}
-:root[uidensity="touch"] #history-panelmenu:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/history.png") !important;
-}
-:root[uidensity="touch"] #library-button:hover > .toolbarbutton-icon,
-:root[uidensity="touch"] #bookmarks-menu-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/bookmarks.png") !important;
-}
-:root[uidensity="touch"] #print-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/print.png") !important;
-}
-:root[uidensity="touch"] #new-window-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/new.png") !important;
-}
-:root[uidensity="touch"] #cut-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/cut.png") !important;
-}
-:root[uidensity="touch"] #copy-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/copy.png") !important;
-}
-:root[uidensity="touch"] #paste-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/paste.png") !important;
-}
-:root[uidensity="touch"] #fullscreen-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/fullscreen.png") !important;
-}
-:root[uidensity="touch"] #find-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/find.png") !important;
-}
-:root[uidensity="touch"] #email-link-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/email.png") !important;
-}
-:root[uidensity="touch"] #sidebar-button:hover > .toolbarbutton-icon {
- list-style-image: url("toolbar/hover/sidebar.png") !important;
-}
-
-:root[uidensity="touch"] #nav-bar {
- height: 28px;
-}
-
-:root[uidensity="touch"] #edit-controls .toolbarbutton-1 {
- width: 28px !important;
-}
-
-:root[uidensity="touch"] #back-button[disabled="true"] .toolbarbutton-icon,
-:root[uidensity="touch"] #forward-button[disabled="true"] .toolbarbutton-icon {
- list-style-image: none !important;
- background-color: ThreeDShadow !important;
- mask-image: url("toolbar_large.png") !important;
- filter: drop-shadow(1px 1px 0 ThreeDHighlight) !important;
-}
-
-:root[uidensity="touch"] #back-button[disabled="true"],
-:root[uidensity="touch"] #forward-button[disabled="true"] {
- filter: drop-shadow(1px 1px 0 ThreeDHighlight) !important;
-}
-
-:root[uidensity="touch"] #back-button[disabled="true"] .toolbarbutton-text,
-:root[uidensity="touch"] #forward-button[disabled="true"] .toolbarbutton-text {
- text-shadow: none !important;
-}
-
-:root[uidensity="touch"] #search-box,
-:root[uidensity="touch"] .sidebar-placesTreechildren::-moz-tree-row {
- min-height: 20px !important;
-}
-
-toolbar .toolbaritem-combined-buttons {
- margin-inline: 0 !important;
-}
-
-.unified-extensions-item-action.subviewbutton {
- border-radius: 0 !important;
- height: 100% !important;
- width: 24px !important;
- background-color: -moz-Dialog !important;
-}
-
-toolbarbutton:where([disabled="true"]) {
- text-shadow: none !important;
- color: -moz-DialogText !important;
-}
-
-#back-button:where([disabled="true"]),
-#forward-button:where([disabled="true"]) {
- color: ThreeDShadow !important;
- text-shadow: 1px 1px 0 ThreeDHighlight !important;
-}
-
-:root[uidensity="touch"] .unified-extensions-item-action.subviewbutton {
- width: 28px !important;
-}
-
-panelview {
- background: -moz-Dialog !important;
-}
-
-#unified-extensions-button {
- padding: 0 !important;
- border: 0 !important;
-}
-
-#unified-extensions-button,
-#unified-extensions-button .toolbarbutton-icon {
- display: none !important;
-}
-
-.urlbarView-dynamic-quickactions-buttons,
-.urlbarView-button-help {
- display: none !important;
-}
-
-.urlbarView:not([noresults]) > .search-one-offs:not([hidden]) {
- border: 1px solid #000000 !important;
- margin-top: -1px !important;
- background-color: Window !important;
-}
-
-#urlbar .search-one-offs:not([hidden]) {
- padding-block: 0 !important;
-}
-
-#urlbar .searchbar-engine-one-off-item {
- border-radius: 0 !important;
- margin-inline: 0 !important;
-}
-
-.searchbar-engine-one-off-item:not([selected]):hover {
- background-color: Highlight !important;
- color: HighlightText !important;
-}
-
-#urlbar .search-panel-one-offs-header-label {
- padding-inline: 10px !important;
-}
-
-#personal-toolbar-empty-description {
- min-height: unset !important;
- display: none !important;
-}
-
-:root[lwt-toolbar-field-brighttext] #urlbar:not([focused="true"]),
-:root[lwt-toolbar-field-brighttext] #searchbar:not(:focus-within),
-:root[lwt-toolbar-field-focus-brighttext] #urlbar[focused="true"],
-:root[lwt-toolbar-field-focus-brighttext] #searchbar:focus-within {
- color-scheme: light !important;
-}
-
-toolbar .toolbarbutton-1 > .toolbarbutton-icon,
-toolbar .toolbarbutton-1 > .toolbarbutton-text,
-toolbar .toolbarbutton-1 > .toolbarbutton-badge-stack {
- padding: 0 !important;
- border-radius: 0 !important;
-}
-
-.tabbrowser-tab
- > .tab-stack
- > .tab-content[pinned][titlechanged]:not([selected="true"]) {
- background-image: none !important;
-}
-
-toolbarbutton menupopup[placespopup] {
- --panel-separator-margin-vertical: 0 !important;
- --panel-shadow-margin: 0 !important;
- --nested-margin: 0 !important;
- --panel-shadow: none !important;
- margin: 0 !important;
-}
-
-toolbarbutton menupopup[placespopup] menuitem {
- padding: 0 2px !important;
- min-height: 20px !important;
- border: none !important;
-}
-
-toolbarbutton
- menupopup[placespopup]
- > :is(.menu-iconic, .menuitem-iconic)
- > .menu-iconic-left {
- margin-inline-end: 2px !important;
-}
-
-toolbarbutton menupopup[placespopup] menuitem:hover {
- background: Highlight !important;
-}
-
-.bookmarks-actions-menuseparator,
-.openintabs-menuitem {
- display: none;
-}
-
-toolbarbutton menupopup[placespopup] menuseparator {
- padding: 0 !important;
- margin: 0 !important;
-}
-
-.menu-iconic-left {
- width: 16px;
- margin-right: 1px;
-}
-
-.menu-text {
- padding-inline-start: 18px !important;
-}
-
-.toolbarbutton-badge-stack .toolbarbutton-badge {
- margin-inline-end: 0 !important;
- margin: 0 !important;
- min-width: unset !important;
- align-self: end !important;
- border-radius: 0 !important;
- padding: 0 2px 0 !important;
- box-shadow: none !important;
-}
-
-/* ff 113 */
-#personal-bookmarks {
- flex-grow: 0 !important;
-}
-#titlebar > #toolbar-menubar > spacer[style="order: 1000;"] {
- display: none;
-}
-
-#context-navigation > .menuitem-iconic {
- justify-content: left !important;
-}
+}*/
diff --git a/chrome/utils/BootstrapLoader.jsm b/chrome/utils/BootstrapLoader.jsm
new file mode 100644
index 0000000..f90c554
--- /dev/null
+++ b/chrome/utils/BootstrapLoader.jsm
@@ -0,0 +1,477 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+let EXPORTED_SYMBOLS = [];
+
+const { XPCOMUtils } = ChromeUtils.import(
+ "resource://gre/modules/XPCOMUtils.jsm"
+);
+const Services =
+ globalThis.Services ||
+ ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
+
+XPCOMUtils.defineLazyModuleGetters(this, {
+ Blocklist: "resource://gre/modules/Blocklist.jsm",
+ ConsoleAPI: "resource://gre/modules/Console.jsm",
+ InstallRDF: "chrome://userchromejs/content/RDFManifestConverter.jsm",
+});
+
+Services.obs.addObserver((doc) => {
+ if (
+ doc.location.protocol + doc.location.pathname === "about:addons" ||
+ doc.location.protocol + doc.location.pathname ===
+ "chrome:/content/extensions/aboutaddons.html"
+ ) {
+ const win = doc.defaultView;
+ let handleEvent_orig =
+ win.customElements.get("addon-card").prototype.handleEvent;
+ win.customElements.get("addon-card").prototype.handleEvent = function (e) {
+ if (
+ e.type === "click" &&
+ e.target.getAttribute("action") === "preferences" &&
+ this.addon.optionsType == 1 /*AddonManager.OPTIONS_TYPE_DIALOG*/
+ ) {
+ var windows = Services.wm.getEnumerator(null);
+ while (windows.hasMoreElements()) {
+ var win2 = windows.getNext();
+ if (win2.closed) {
+ continue;
+ }
+ if (win2.document.documentURI == this.addon.optionsURL) {
+ win2.focus();
+ return;
+ }
+ }
+ var features = "chrome,titlebar,toolbar,centerscreen";
+ win.docShell.rootTreeItem.domWindow.openDialog(
+ this.addon.optionsURL,
+ this.addon.id,
+ features
+ );
+ } else {
+ handleEvent_orig.apply(this, arguments);
+ }
+ };
+ let update_orig = win.customElements.get("addon-options").prototype.update;
+ win.customElements.get("addon-options").prototype.update = function (
+ card,
+ addon
+ ) {
+ update_orig.apply(this, arguments);
+ if (addon.optionsType == 1 /*AddonManager.OPTIONS_TYPE_DIALOG*/)
+ this.querySelector(
+ 'panel-item[data-l10n-id="preferences-addon-button"]'
+ ).hidden = false;
+ };
+ }
+}, "chrome-document-loaded");
+
+const { AddonManager } = ChromeUtils.import(
+ "resource://gre/modules/AddonManager.jsm"
+);
+const { XPIDatabase, AddonInternal } = ChromeUtils.import(
+ "resource://gre/modules/addons/XPIDatabase.jsm"
+);
+
+const { defineAddonWrapperProperty } = Cu.import(
+ "resource://gre/modules/addons/XPIDatabase.jsm"
+);
+defineAddonWrapperProperty("optionsType", function optionsType() {
+ if (!this.isActive) {
+ return null;
+ }
+
+ let addon = this.__AddonInternal__;
+ let hasOptionsURL = !!this.optionsURL;
+
+ if (addon.optionsType) {
+ switch (parseInt(addon.optionsType, 10)) {
+ case 1 /*AddonManager.OPTIONS_TYPE_DIALOG*/:
+ case AddonManager.OPTIONS_TYPE_TAB:
+ case AddonManager.OPTIONS_TYPE_INLINE_BROWSER:
+ return hasOptionsURL ? addon.optionsType : null;
+ }
+ return null;
+ }
+
+ return null;
+});
+
+XPIDatabase.isDisabledLegacy = () => false;
+
+XPCOMUtils.defineLazyGetter(this, "BOOTSTRAP_REASONS", () => {
+ const { XPIProvider } = ChromeUtils.import(
+ "resource://gre/modules/addons/XPIProvider.jsm"
+ );
+ return XPIProvider.BOOTSTRAP_REASONS;
+});
+
+const { Log } = ChromeUtils.import("resource://gre/modules/Log.jsm");
+var logger = Log.repository.getLogger("addons.bootstrap");
+
+/**
+ * Valid IDs fit this pattern.
+ */
+var gIDTest =
+ /^(\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\}|[a-z0-9-\._]*\@[a-z0-9-\._]+)$/i;
+
+// Properties that exist in the install manifest
+const PROP_METADATA = [
+ "id",
+ "version",
+ "type",
+ "internalName",
+ "updateURL",
+ "optionsURL",
+ "optionsType",
+ "aboutURL",
+ "iconURL",
+];
+const PROP_LOCALE_SINGLE = ["name", "description", "creator", "homepageURL"];
+const PROP_LOCALE_MULTI = ["developers", "translators", "contributors"];
+
+// Map new string type identifiers to old style nsIUpdateItem types.
+// Retired values:
+// 32 = multipackage xpi file
+// 8 = locale
+// 256 = apiextension
+// 128 = experiment
+// theme = 4
+const TYPES = {
+ extension: 2,
+ dictionary: 64,
+};
+
+const COMPATIBLE_BY_DEFAULT_TYPES = {
+ extension: true,
+ dictionary: true,
+};
+
+const hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
+
+function isXPI(filename) {
+ let ext = filename.slice(-4).toLowerCase();
+ return ext === ".xpi" || ext === ".zip";
+}
+
+/**
+ * Gets an nsIURI for a file within another file, either a directory or an XPI
+ * file. If aFile is a directory then this will return a file: URI, if it is an
+ * XPI file then it will return a jar: URI.
+ *
+ * @param {nsIFile} aFile
+ * The file containing the resources, must be either a directory or an
+ * XPI file
+ * @param {string} aPath
+ * The path to find the resource at, '/' separated. If aPath is empty
+ * then the uri to the root of the contained files will be returned
+ * @returns {nsIURI}
+ * An nsIURI pointing at the resource
+ */
+function getURIForResourceInFile(aFile, aPath) {
+ if (!isXPI(aFile.leafName)) {
+ let resource = aFile.clone();
+ if (aPath) aPath.split("/").forEach((part) => resource.append(part));
+
+ return Services.io.newFileURI(resource);
+ }
+
+ return buildJarURI(aFile, aPath);
+}
+
+/**
+ * Creates a jar: URI for a file inside a ZIP file.
+ *
+ * @param {nsIFile} aJarfile
+ * The ZIP file as an nsIFile
+ * @param {string} aPath
+ * The path inside the ZIP file
+ * @returns {nsIURI}
+ * An nsIURI for the file
+ */
+function buildJarURI(aJarfile, aPath) {
+ let uri = Services.io.newFileURI(aJarfile);
+ uri = "jar:" + uri.spec + "!/" + aPath;
+ return Services.io.newURI(uri);
+}
+
+var BootstrapLoader = {
+ name: "bootstrap",
+ manifestFile: "install.rdf",
+ async loadManifest(pkg) {
+ /**
+ * Reads locale properties from either the main install manifest root or
+ * an em:localized section in the install manifest.
+ *
+ * @param {Object} aSource
+ * The resource to read the properties from.
+ * @param {boolean} isDefault
+ * True if the locale is to be read from the main install manifest
+ * root
+ * @param {string[]} aSeenLocales
+ * An array of locale names already seen for this install manifest.
+ * Any locale names seen as a part of this function will be added to
+ * this array
+ * @returns {Object}
+ * an object containing the locale properties
+ */
+ function readLocale(aSource, isDefault, aSeenLocales) {
+ let locale = {};
+ if (!isDefault) {
+ locale.locales = [];
+ for (let localeName of aSource.locales || []) {
+ if (!localeName) {
+ logger.warn("Ignoring empty locale in localized properties");
+ continue;
+ }
+ if (aSeenLocales.includes(localeName)) {
+ logger.warn("Ignoring duplicate locale in localized properties");
+ continue;
+ }
+ aSeenLocales.push(localeName);
+ locale.locales.push(localeName);
+ }
+
+ if (locale.locales.length == 0) {
+ logger.warn("Ignoring localized properties with no listed locales");
+ return null;
+ }
+ }
+
+ for (let prop of [...PROP_LOCALE_SINGLE, ...PROP_LOCALE_MULTI]) {
+ if (hasOwnProperty(aSource, prop)) {
+ locale[prop] = aSource[prop];
+ }
+ }
+
+ return locale;
+ }
+
+ let manifestData = await pkg.readString("install.rdf");
+ let manifest = InstallRDF.loadFromString(manifestData).decode();
+
+ let addon = new AddonInternal();
+ for (let prop of PROP_METADATA) {
+ if (hasOwnProperty(manifest, prop)) {
+ addon[prop] = manifest[prop];
+ }
+ }
+
+ if (!addon.type) {
+ addon.type = "extension";
+ } else {
+ let type = addon.type;
+ addon.type = null;
+ for (let name in TYPES) {
+ if (TYPES[name] == type) {
+ addon.type = name;
+ break;
+ }
+ }
+ }
+
+ if (!(addon.type in TYPES))
+ throw new Error("Install manifest specifies unknown type: " + addon.type);
+
+ if (!addon.id) throw new Error("No ID in install manifest");
+ if (!gIDTest.test(addon.id))
+ throw new Error("Illegal add-on ID " + addon.id);
+ if (!addon.version) throw new Error("No version in install manifest");
+
+ addon.strictCompatibility =
+ !(addon.type in COMPATIBLE_BY_DEFAULT_TYPES) ||
+ manifest.strictCompatibility == "true";
+
+ // Only read these properties for extensions.
+ if (addon.type == "extension") {
+ if (manifest.bootstrap != "true") {
+ throw new Error("Non-restartless extensions no longer supported");
+ }
+
+ if (
+ addon.optionsType &&
+ addon.optionsType != 1 /*AddonManager.OPTIONS_TYPE_DIALOG*/ &&
+ addon.optionsType != AddonManager.OPTIONS_TYPE_INLINE_BROWSER &&
+ addon.optionsType != AddonManager.OPTIONS_TYPE_TAB
+ ) {
+ throw new Error(
+ "Install manifest specifies unknown optionsType: " + addon.optionsType
+ );
+ }
+
+ if (addon.optionsType) addon.optionsType = parseInt(addon.optionsType);
+ }
+
+ addon.defaultLocale = readLocale(manifest, true);
+
+ let seenLocales = [];
+ addon.locales = [];
+ for (let localeData of manifest.localized || []) {
+ let locale = readLocale(localeData, false, seenLocales);
+ if (locale) addon.locales.push(locale);
+ }
+
+ let dependencies = new Set(manifest.dependencies);
+ addon.dependencies = Object.freeze(Array.from(dependencies));
+
+ let seenApplications = [];
+ addon.targetApplications = [];
+ for (let targetApp of manifest.targetApplications || []) {
+ if (!targetApp.id || !targetApp.minVersion || !targetApp.maxVersion) {
+ logger.warn(
+ "Ignoring invalid targetApplication entry in install manifest"
+ );
+ continue;
+ }
+ if (seenApplications.includes(targetApp.id)) {
+ logger.warn(
+ "Ignoring duplicate targetApplication entry for " +
+ targetApp.id +
+ " in install manifest"
+ );
+ continue;
+ }
+ seenApplications.push(targetApp.id);
+ addon.targetApplications.push(targetApp);
+ }
+
+ // Note that we don't need to check for duplicate targetPlatform entries since
+ // the RDF service coalesces them for us.
+ addon.targetPlatforms = [];
+ for (let targetPlatform of manifest.targetPlatforms || []) {
+ let platform = {
+ os: null,
+ abi: null,
+ };
+
+ let pos = targetPlatform.indexOf("_");
+ if (pos != -1) {
+ platform.os = targetPlatform.substring(0, pos);
+ platform.abi = targetPlatform.substring(pos + 1);
+ } else {
+ platform.os = targetPlatform;
+ }
+
+ addon.targetPlatforms.push(platform);
+ }
+
+ addon.userDisabled = false;
+ addon.softDisabled = addon.blocklistState == Blocklist.STATE_SOFTBLOCKED;
+ addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DEFAULT;
+
+ addon.userPermissions = null;
+
+ addon.icons = {};
+ if (await pkg.hasResource("icon.png")) {
+ addon.icons[32] = "icon.png";
+ addon.icons[48] = "icon.png";
+ }
+
+ if (await pkg.hasResource("icon64.png")) {
+ addon.icons[64] = "icon64.png";
+ }
+
+ return addon;
+ },
+
+ loadScope(addon) {
+ let file = addon.file || addon._sourceBundle;
+ let uri = getURIForResourceInFile(file, "bootstrap.js").spec;
+ let principal = Services.scriptSecurityManager.getSystemPrincipal();
+
+ let sandbox = new Cu.Sandbox(principal, {
+ sandboxName: uri,
+ addonId: addon.id,
+ wantGlobalProperties: ["ChromeUtils"],
+ metadata: { addonID: addon.id, URI: uri },
+ });
+
+ try {
+ Object.assign(sandbox, BOOTSTRAP_REASONS);
+
+ XPCOMUtils.defineLazyGetter(
+ sandbox,
+ "console",
+ () => new ConsoleAPI({ consoleID: `addon/${addon.id}` })
+ );
+
+ Services.scriptloader.loadSubScript(uri, sandbox);
+ } catch (e) {
+ logger.warn(`Error loading bootstrap.js for ${addon.id}`, e);
+ }
+
+ function findMethod(name) {
+ if (sandbox[name]) {
+ return sandbox[name];
+ }
+
+ try {
+ let method = Cu.evalInSandbox(name, sandbox);
+ return method;
+ } catch (err) {}
+
+ return () => {
+ logger.warn(`Add-on ${addon.id} is missing bootstrap method ${name}`);
+ };
+ }
+
+ let install = findMethod("install");
+ let uninstall = findMethod("uninstall");
+ let startup = findMethod("startup");
+ let shutdown = findMethod("shutdown");
+
+ return {
+ install(...args) {
+ install(...args);
+ // Forget any cached files we might've had from this extension.
+ Services.obs.notifyObservers(null, "startupcache-invalidate");
+ },
+
+ uninstall(...args) {
+ uninstall(...args);
+ // Forget any cached files we might've had from this extension.
+ Services.obs.notifyObservers(null, "startupcache-invalidate");
+ },
+
+ startup(...args) {
+ if (addon.type == "extension") {
+ logger.debug(`Registering manifest for ${file.path}\n`);
+ Components.manager.addBootstrappedManifestLocation(file);
+ }
+ return startup(...args);
+ },
+
+ shutdown(data, reason) {
+ try {
+ return shutdown(data, reason);
+ } catch (err) {
+ throw err;
+ } finally {
+ if (reason != BOOTSTRAP_REASONS.APP_SHUTDOWN) {
+ logger.debug(`Removing manifest for ${file.path}\n`);
+ Components.manager.removeBootstrappedManifestLocation(file);
+ }
+ }
+ },
+ };
+ },
+};
+
+AddonManager.addExternalExtensionLoader(BootstrapLoader);
+
+if (AddonManager.isReady) {
+ AddonManager.getAllAddons().then((addons) => {
+ addons.forEach((addon) => {
+ if (
+ addon.type == "extension" &&
+ !addon.isWebExtension &&
+ !addon.userDisabled
+ ) {
+ addon.reload();
+ }
+ });
+ });
+}
diff --git a/chrome/utils/RDFDataSource.jsm b/chrome/utils/RDFDataSource.jsm
new file mode 100644
index 0000000..e89244e
--- /dev/null
+++ b/chrome/utils/RDFDataSource.jsm
@@ -0,0 +1,441 @@
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * This module creates a new API for accessing and modifying RDF graphs. The
+ * goal is to be able to serialise the graph in a human readable form. Also
+ * if the graph was originally loaded from an RDF/XML the serialisation should
+ * closely match the original with any new data closely following the existing
+ * layout. The output should always be compatible with Mozilla's RDF parser.
+ *
+ * This is all achieved by using a DOM Document to hold the current state of the
+ * graph in XML form. This can be initially loaded and parsed from disk or
+ * a blank document used for an empty graph. As assertions are added to the
+ * graph, appropriate DOM nodes are added to the document to represent them
+ * along with any necessary whitespace to properly layout the XML.
+ *
+ * In general the order of adding assertions to the graph will impact the form
+ * the serialisation takes. If a resource is first added as the object of an
+ * assertion then it will eventually be serialised inside the assertion's
+ * property element. If a resource is first added as the subject of an assertion
+ * then it will be serialised at the top level of the XML.
+ */
+
+const NS_XML = "http://www.w3.org/XML/1998/namespace";
+const NS_XMLNS = "http://www.w3.org/2000/xmlns/";
+const NS_RDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+const NS_NC = "http://home.netscape.com/NC-rdf#";
+
+/* eslint prefer-template: 1 */
+
+var EXPORTED_SYMBOLS = ["RDFLiteral", "RDFBlankNode", "RDFResource", "RDFDataSource"];
+
+const {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+const Services = globalThis.Services || ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
+
+XPCOMUtils.defineLazyGlobalGetters(this, ["DOMParser", "Element", "fetch"]);
+
+function isElement(obj) {
+ return Element.isInstance(obj);
+}
+function isText(obj) {
+ return obj && typeof obj == "object" && ChromeUtils.getClassName(obj) == "Text";
+}
+
+/**
+ * Returns either an rdf namespaced attribute or an un-namespaced attribute
+ * value. Returns null if neither exists,
+ */
+function getRDFAttribute(element, name) {
+ if (element.hasAttributeNS(NS_RDF, name))
+ return element.getAttributeNS(NS_RDF, name);
+ if (element.hasAttribute(name))
+ return element.getAttribute(name);
+ return undefined;
+}
+
+/**
+ * Represents an assertion in the datasource
+ */
+class RDFAssertion {
+ constructor(subject, predicate, object) {
+ // The subject on this assertion, an RDFSubject
+ this._subject = subject;
+ // The predicate, a string
+ this._predicate = predicate;
+ // The object, an RDFNode
+ this._object = object;
+ // The datasource this assertion exists in
+ this._ds = this._subject._ds;
+ // Marks that _DOMnode is the subject's element
+ this._isSubjectElement = false;
+ // The DOM node that represents this assertion. Could be a property element,
+ // a property attribute or the subject's element for rdf:type
+ this._DOMNode = null;
+ }
+
+ getPredicate() {
+ return this._predicate;
+ }
+
+ getObject() {
+ return this._object;
+ }
+}
+
+class RDFNode {
+ equals(rdfnode) {
+ return (rdfnode.constructor === this.constructor &&
+ rdfnode._value == this._value);
+ }
+}
+
+/**
+ * A simple literal value
+ */
+class RDFLiteral extends RDFNode {
+ constructor(value) {
+ super();
+ this._value = value;
+ }
+
+ getValue() {
+ return this._value;
+ }
+}
+
+/**
+ * This is an RDF node that can be a subject so a resource or a blank node
+ */
+class RDFSubject extends RDFNode {
+ constructor(ds) {
+ super();
+ // A lookup of the assertions with this as the subject. Keyed on predicate
+ this._assertions = {};
+ // A lookup of the assertions with this as the object. Keyed on predicate
+ this._backwards = {};
+ // The datasource this subject belongs to
+ this._ds = ds;
+ // The DOM elements in the document that represent this subject. Array of Element
+ this._elements = [];
+ }
+
+ /**
+ * Parses the given Element from the DOM document
+ */
+ /* eslint-disable complexity */
+ _parseElement(element) {
+ this._elements.push(element);
+
+ // There might be an inferred rdf:type assertion in the element name
+ if (element.namespaceURI != NS_RDF ||
+ element.localName != "Description") {
+ var assertion = new RDFAssertion(this, RDF_R("type"),
+ this._ds.getResource(element.namespaceURI + element.localName));
+ assertion._DOMnode = element;
+ assertion._isSubjectElement = true;
+ this._addAssertion(assertion);
+ }
+
+ // Certain attributes can be literal properties
+ for (let attr of element.attributes) {
+ if (attr.namespaceURI == NS_XML || attr.namespaceURI == NS_XMLNS ||
+ attr.nodeName == "xmlns")
+ continue;
+ if ((attr.namespaceURI == NS_RDF || !attr.namespaceURI) &&
+ (["nodeID", "about", "resource", "ID", "parseType"].includes(attr.localName)))
+ continue;
+ var object = null;
+ if (attr.namespaceURI == NS_RDF) {
+ if (attr.localName == "type")
+ object = this._ds.getResource(attr.nodeValue);
+ }
+ if (!object)
+ object = new RDFLiteral(attr.nodeValue);
+ assertion = new RDFAssertion(this, attr.namespaceURI + attr.localName, object);
+ assertion._DOMnode = attr;
+ this._addAssertion(assertion);
+ }
+
+ var child = element.firstChild;
+ element.listCounter = 1;
+ while (child) {
+ if (isElement(child)) {
+ object = null;
+ var predicate = child.namespaceURI + child.localName;
+ if (child.namespaceURI == NS_RDF) {
+ if (child.localName == "li") {
+ predicate = RDF_R(`_${element.listCounter}`);
+ element.listCounter++;
+ }
+ }
+
+ // Check for and bail out on unknown attributes on the property element
+ for (let attr of child.attributes) {
+ // Ignore XML namespaced attributes
+ if (attr.namespaceURI == NS_XML)
+ continue;
+ // These are reserved by XML for future use
+ if (attr.localName.substring(0, 3).toLowerCase() == "xml")
+ continue;
+ // We can handle these RDF attributes
+ if ((!attr.namespaceURI || attr.namespaceURI == NS_RDF) &&
+ ["resource", "nodeID"].includes(attr.localName))
+ continue;
+ // This is a special attribute we handle for compatibility with Mozilla RDF
+ if (attr.namespaceURI == NS_NC &&
+ attr.localName == "parseType")
+ continue;
+ }
+
+ var parseType = child.getAttributeNS(NS_NC, "parseType");
+
+ var resource = getRDFAttribute(child, "resource");
+ var nodeID = getRDFAttribute(child, "nodeID");
+
+ if (resource !== undefined) {
+ var base = Services.io.newURI(element.baseURI);
+ object = this._ds.getResource(base.resolve(resource));
+ } else if (nodeID !== undefined) {
+ object = this._ds.getBlankNode(nodeID);
+ } else {
+ var hasText = false;
+ var childElement = null;
+ var subchild = child.firstChild;
+ while (subchild) {
+ if (isText(subchild) && /\S/.test(subchild.nodeValue)) {
+ hasText = true;
+ } else if (isElement(subchild)) {
+ childElement = subchild;
+ }
+ subchild = subchild.nextSibling;
+ }
+
+ if (childElement) {
+ object = this._ds._getSubjectForElement(childElement);
+ object._parseElement(childElement);
+ } else
+ object = new RDFLiteral(child.textContent);
+ }
+
+ assertion = new RDFAssertion(this, predicate, object);
+ this._addAssertion(assertion);
+ assertion._DOMnode = child;
+ }
+ child = child.nextSibling;
+ }
+ }
+ /* eslint-enable complexity */
+
+ /**
+ * Adds a new assertion to the internal hashes. Should be called for every
+ * new assertion parsed or created programmatically.
+ */
+ _addAssertion(assertion) {
+ var predicate = assertion.getPredicate();
+ if (predicate in this._assertions)
+ this._assertions[predicate].push(assertion);
+ else
+ this._assertions[predicate] = [ assertion ];
+
+ var object = assertion.getObject();
+ if (object instanceof RDFSubject) {
+ // Create reverse assertion
+ if (predicate in object._backwards)
+ object._backwards[predicate].push(assertion);
+ else
+ object._backwards[predicate] = [ assertion ];
+ }
+ }
+
+ /**
+ * Returns all objects in assertions with this subject and the given predicate.
+ */
+ getObjects(predicate) {
+ if (predicate in this._assertions)
+ return Array.from(this._assertions[predicate],
+ i => i.getObject());
+
+ return [];
+ }
+
+ /**
+ * Retrieves the first property value for the given predicate.
+ */
+ getProperty(predicate) {
+ if (predicate in this._assertions)
+ return this._assertions[predicate][0].getObject();
+ return null;
+ }
+}
+
+/**
+ * Creates a new RDFResource for the datasource. Private.
+ */
+class RDFResource extends RDFSubject {
+ constructor(ds, uri) {
+ super(ds);
+ // This is the uri that the resource represents.
+ this._uri = uri;
+ }
+}
+
+/**
+ * Creates a new blank node. Private.
+ */
+class RDFBlankNode extends RDFSubject {
+ constructor(ds, nodeID) {
+ super(ds);
+ // The nodeID of this node. May be null if there is no ID.
+ this._nodeID = nodeID;
+ }
+
+ /**
+ * Sets attributes on the DOM element to mark it as representing this node
+ */
+ _applyToElement(element) {
+ if (!this._nodeID)
+ return;
+ if (USE_RDFNS_ATTR) {
+ var prefix = this._ds._resolvePrefix(element, RDF_R("nodeID"));
+ element.setAttributeNS(prefix.namespaceURI, prefix.qname, this._nodeID);
+ } else {
+ element.setAttribute("nodeID", this._nodeID);
+ }
+ }
+
+ /**
+ * Creates a new Element in the document for holding assertions about this
+ * subject. The URI controls what tagname to use.
+ */
+ _createNewElement(uri) {
+ // If there are already nodes representing this in the document then we need
+ // a nodeID to match them
+ if (!this._nodeID && this._elements.length > 0) {
+ this._ds._createNodeID(this);
+ for (let element of this._elements)
+ this._applyToElement(element);
+ }
+
+ return super._createNewElement.call(uri);
+ }
+
+ /**
+ * Adds a reference to this node to the given property Element.
+ */
+ _addReferenceToElement(element) {
+ if (this._elements.length > 0 && !this._nodeID) {
+ // In document elsewhere already
+ // Create a node ID and update the other nodes referencing
+ this._ds._createNodeID(this);
+ for (let element of this._elements)
+ this._applyToElement(element);
+ }
+
+ if (this._nodeID) {
+ if (USE_RDFNS_ATTR) {
+ let prefix = this._ds._resolvePrefix(element, RDF_R("nodeID"));
+ element.setAttributeNS(prefix.namespaceURI, prefix.qname, this._nodeID);
+ } else {
+ element.setAttribute("nodeID", this._nodeID);
+ }
+ } else {
+ // Add the empty blank node, this is generally right since further
+ // assertions will be added to fill this out
+ var newelement = this._ds._addElement(element, RDF_R("Description"));
+ newelement.listCounter = 1;
+ this._elements.push(newelement);
+ }
+ }
+
+ /**
+ * Removes any reference to this node from the given property Element.
+ */
+ _removeReferenceFromElement(element) {
+ if (element.hasAttributeNS(NS_RDF, "nodeID"))
+ element.removeAttributeNS(NS_RDF, "nodeID");
+ if (element.hasAttribute("nodeID"))
+ element.removeAttribute("nodeID");
+ }
+
+ getNodeID() {
+ return this._nodeID;
+ }
+}
+
+/**
+ * Creates a new RDFDataSource from the given document. The document will be
+ * changed as assertions are added and removed to the RDF. Pass a null document
+ * to start with an empty graph.
+ */
+class RDFDataSource {
+ constructor(document) {
+ // All known resources, indexed on URI
+ this._resources = {};
+ // All blank nodes
+ this._allBlankNodes = [];
+
+ // The underlying DOM document for this datasource
+ this._document = document;
+ this._parseDocument();
+ }
+
+ static loadFromString(text) {
+ let parser = new DOMParser();
+ let document = parser.parseFromString(text, "application/xml");
+
+ return new this(document);
+ }
+
+ /**
+ * Returns an rdf subject for the given DOM Element. If the subject has not
+ * been seen before a new one is created.
+ */
+ _getSubjectForElement(element) {
+ var about = getRDFAttribute(element, "about");
+
+ if (about !== undefined) {
+ let base = Services.io.newURI(element.baseURI);
+ return this.getResource(base.resolve(about));
+ }
+ return this.getBlankNode(null);
+ }
+
+ /**
+ * Parses the document for subjects at the top level.
+ */
+ _parseDocument() {
+ var domnode = this._document.documentElement.firstChild;
+ while (domnode) {
+ if (isElement(domnode)) {
+ var subject = this._getSubjectForElement(domnode);
+ subject._parseElement(domnode);
+ }
+ domnode = domnode.nextSibling;
+ }
+ }
+
+ /**
+ * Gets a blank node. nodeID may be null and if so a new blank node is created.
+ * If a nodeID is given then the blank node with that ID is returned or created.
+ */
+ getBlankNode(nodeID) {
+ var rdfnode = new RDFBlankNode(this, nodeID);
+ this._allBlankNodes.push(rdfnode);
+ return rdfnode;
+ }
+
+ /**
+ * Gets the resource for the URI. The resource is created if it has not been
+ * used already.
+ */
+ getResource(uri) {
+ if (uri in this._resources)
+ return this._resources[uri];
+
+ var resource = new RDFResource(this, uri);
+ this._resources[uri] = resource;
+ return resource;
+ }
+}
diff --git a/chrome/utils/RDFManifestConverter.jsm b/chrome/utils/RDFManifestConverter.jsm
new file mode 100644
index 0000000..370c388
--- /dev/null
+++ b/chrome/utils/RDFManifestConverter.jsm
@@ -0,0 +1,102 @@
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+var EXPORTED_SYMBOLS = ["InstallRDF"];
+
+ChromeUtils.defineModuleGetter(this, "RDFDataSource",
+ "chrome://userchromejs/content/RDFDataSource.jsm");
+
+const RDFURI_INSTALL_MANIFEST_ROOT = "urn:mozilla:install-manifest";
+
+function EM_R(aProperty) {
+ return `http://www.mozilla.org/2004/em-rdf#${aProperty}`;
+}
+
+function getValue(literal) {
+ return literal && literal.getValue();
+}
+
+function getProperty(resource, property) {
+ return getValue(resource.getProperty(EM_R(property)));
+}
+
+class Manifest {
+ constructor(ds) {
+ this.ds = ds;
+ }
+
+ static loadFromString(text) {
+ return new this(RDFDataSource.loadFromString(text));
+ }
+}
+
+class InstallRDF extends Manifest {
+ _readProps(source, obj, props) {
+ for (let prop of props) {
+ let val = getProperty(source, prop);
+ if (val != null) {
+ obj[prop] = val;
+ }
+ }
+ }
+
+ _readArrayProp(source, obj, prop, target, decode = getValue) {
+ let result = Array.from(source.getObjects(EM_R(prop)),
+ target => decode(target));
+ if (result.length) {
+ obj[target] = result;
+ }
+ }
+
+ _readArrayProps(source, obj, props, decode = getValue) {
+ for (let [prop, target] of Object.entries(props)) {
+ this._readArrayProp(source, obj, prop, target, decode);
+ }
+ }
+
+ _readLocaleStrings(source, obj) {
+ this._readProps(source, obj, ["name", "description", "creator", "homepageURL"]);
+ this._readArrayProps(source, obj, {
+ locale: "locales",
+ developer: "developers",
+ translator: "translators",
+ contributor: "contributors",
+ });
+ }
+
+ decode() {
+ let root = this.ds.getResource(RDFURI_INSTALL_MANIFEST_ROOT);
+ let result = {};
+
+ let props = ["id", "version", "type", "updateURL", "optionsURL",
+ "optionsType", "aboutURL", "iconURL",
+ "bootstrap", "unpack", "strictCompatibility"];
+ this._readProps(root, result, props);
+
+ let decodeTargetApplication = source => {
+ let app = {};
+ this._readProps(source, app, ["id", "minVersion", "maxVersion"]);
+ return app;
+ };
+
+ let decodeLocale = source => {
+ let localized = {};
+ this._readLocaleStrings(source, localized);
+ return localized;
+ };
+
+ this._readLocaleStrings(root, result);
+
+ this._readArrayProps(root, result, {"targetPlatform": "targetPlatforms"});
+ this._readArrayProps(root, result, {"targetApplication": "targetApplications"},
+ decodeTargetApplication);
+ this._readArrayProps(root, result, {"localized": "localized"},
+ decodeLocale);
+ this._readArrayProps(root, result, {"dependency": "dependencies"},
+ source => getProperty(source, "id"));
+
+ return result;
+ }
+}
diff --git a/chrome/utils/aboutconfig/aboutconfig.xhtml b/chrome/utils/aboutconfig/aboutconfig.xhtml
new file mode 100644
index 0000000..80fafa0
--- /dev/null
+++ b/chrome/utils/aboutconfig/aboutconfig.xhtml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/chrome/utils/aboutconfig/config.css b/chrome/utils/aboutconfig/config.css
new file mode 100644
index 0000000..908ac42
--- /dev/null
+++ b/chrome/utils/aboutconfig/config.css
@@ -0,0 +1,49 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#warningScreen {
+ font-size: 15px;
+ padding-top: 0;
+ padding-bottom: 0;
+ padding-inline-start: calc(48px + 4.6em);
+ padding-inline-end: 48px;
+}
+
+.title {
+ background-image: url("chrome://global/skin/icons/warning.svg");
+ fill: #fcd100;
+}
+
+#warningTitle {
+ font-weight: lighter;
+ line-height: 1.2;
+ margin: 0;
+ margin-bottom: .5em;
+}
+
+#warningText {
+ margin: 1em 0;
+}
+
+#warningButton {
+ margin-top: 0.6em;
+}
+
+#filterRow {
+ margin-top: 4px;
+ margin-inline-start: 4px;
+}
+
+#configTree {
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+#configTreeBody::-moz-tree-cell-text(user) {
+ font-weight: bold;
+}
+
+#configTreeBody::-moz-tree-cell-text(locked) {
+ font-style: italic;
+}
\ No newline at end of file
diff --git a/chrome/utils/aboutconfig/config.js b/chrome/utils/aboutconfig/config.js
new file mode 100644
index 0000000..7b0352e
--- /dev/null
+++ b/chrome/utils/aboutconfig/config.js
@@ -0,0 +1,781 @@
+// -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+
+const nsIPrefLocalizedString = Ci.nsIPrefLocalizedString;
+const nsISupportsString = Ci.nsISupportsString;
+const nsIPrefBranch = Ci.nsIPrefBranch;
+const nsIClipboardHelper = Ci.nsIClipboardHelper;
+
+const nsClipboardHelper_CONTRACTID = "@mozilla.org/widget/clipboardhelper;1";
+
+const gPrefBranch = Services.prefs;
+const gClipboardHelper = Cc[nsClipboardHelper_CONTRACTID].getService(
+ nsIClipboardHelper
+);
+
+var gLockProps = ["default", "user", "locked"];
+// we get these from a string bundle
+var gLockStrs = [];
+var gTypeStrs = [];
+
+const PREF_IS_DEFAULT_VALUE = 0;
+const PREF_IS_MODIFIED = 1;
+const PREF_IS_LOCKED = 2;
+
+var gPrefHash = {};
+var gPrefArray = [];
+var gPrefView = gPrefArray; // share the JS array
+var gSortedColumn = "prefCol";
+var gSortFunction = null;
+var gSortDirection = 1; // 1 is ascending; -1 is descending
+var gFilter = null;
+
+var view = {
+ get rowCount() {
+ return gPrefView.length;
+ },
+ getCellText(index, col) {
+ if (!(index in gPrefView)) {
+ return "";
+ }
+
+ var value = gPrefView[index][col.id];
+
+ switch (col.id) {
+ case "lockCol":
+ return gLockStrs[value];
+ case "typeCol":
+ return gTypeStrs[value];
+ default:
+ return value;
+ }
+ },
+ getRowProperties(index) {
+ return "";
+ },
+ getCellProperties(index, col) {
+ if (index in gPrefView) {
+ return gLockProps[gPrefView[index].lockCol];
+ }
+
+ return "";
+ },
+ getColumnProperties(col) {
+ return "";
+ },
+ treebox: null,
+ selection: null,
+ isContainer(index) {
+ return false;
+ },
+ isContainerOpen(index) {
+ return false;
+ },
+ isContainerEmpty(index) {
+ return false;
+ },
+ isSorted() {
+ return true;
+ },
+ canDrop(index, orientation) {
+ return false;
+ },
+ drop(row, orientation) {},
+ setTree(out) {
+ this.treebox = out;
+ },
+ getParentIndex(rowIndex) {
+ return -1;
+ },
+ hasNextSibling(rowIndex, afterIndex) {
+ return false;
+ },
+ getLevel(index) {
+ return 1;
+ },
+ getImageSrc(row, col) {
+ return "";
+ },
+ toggleOpenState(index) {},
+ cycleHeader(col) {
+ var index = this.selection.currentIndex;
+ if (col.id == gSortedColumn) {
+ gSortDirection = -gSortDirection;
+ gPrefArray.reverse();
+ if (gPrefView != gPrefArray) {
+ gPrefView.reverse();
+ }
+ if (index >= 0) {
+ index = gPrefView.length - index - 1;
+ }
+ } else {
+ var pref = null;
+ if (index >= 0) {
+ pref = gPrefView[index];
+ }
+
+ var old = document.getElementById(gSortedColumn);
+ old.removeAttribute("sortDirection");
+ gPrefArray.sort((gSortFunction = gSortFunctions[col.id]));
+ if (gPrefView != gPrefArray) {
+ gPrefView.sort(gSortFunction);
+ }
+ gSortedColumn = col.id;
+ if (pref) {
+ index = getViewIndexOfPref(pref);
+ }
+ }
+ col.element.setAttribute(
+ "sortDirection",
+ gSortDirection > 0 ? "ascending" : "descending"
+ );
+ this.treebox.invalidate();
+ if (index >= 0) {
+ this.selection.select(index);
+ this.treebox.ensureRowIsVisible(index);
+ }
+ },
+ selectionChanged() {},
+ cycleCell(row, col) {},
+ isEditable(row, col) {
+ return false;
+ },
+ setCellValue(row, col, value) {},
+ setCellText(row, col, value) {},
+ isSeparator(index) {
+ return false;
+ },
+};
+
+// find the index in gPrefView of a pref object
+// or -1 if it does not exist in the filtered view
+function getViewIndexOfPref(pref) {
+ var low = -1,
+ high = gPrefView.length;
+ var index = (low + high) >> 1;
+ while (index > low) {
+ var mid = gPrefView[index];
+ if (mid == pref) {
+ return index;
+ }
+ if (gSortFunction(mid, pref) < 0) {
+ low = index;
+ } else {
+ high = index;
+ }
+ index = (low + high) >> 1;
+ }
+ return -1;
+}
+
+// find the index in gPrefView where a pref object belongs
+function getNearestViewIndexOfPref(pref) {
+ var low = -1,
+ high = gPrefView.length;
+ var index = (low + high) >> 1;
+ while (index > low) {
+ if (gSortFunction(gPrefView[index], pref) < 0) {
+ low = index;
+ } else {
+ high = index;
+ }
+ index = (low + high) >> 1;
+ }
+ return high;
+}
+
+// find the index in gPrefArray of a pref object
+function getIndexOfPref(pref) {
+ var low = -1,
+ high = gPrefArray.length;
+ var index = (low + high) >> 1;
+ while (index > low) {
+ var mid = gPrefArray[index];
+ if (mid == pref) {
+ return index;
+ }
+ if (gSortFunction(mid, pref) < 0) {
+ low = index;
+ } else {
+ high = index;
+ }
+ index = (low + high) >> 1;
+ }
+ return index;
+}
+
+function getNearestIndexOfPref(pref) {
+ var low = -1,
+ high = gPrefArray.length;
+ var index = (low + high) >> 1;
+ while (index > low) {
+ if (gSortFunction(gPrefArray[index], pref) < 0) {
+ low = index;
+ } else {
+ high = index;
+ }
+ index = (low + high) >> 1;
+ }
+ return high;
+}
+
+var gPrefListener = {
+ observe(subject, topic, prefName) {
+ if (topic != "nsPref:changed") {
+ return;
+ }
+
+ var arrayIndex = gPrefArray.length;
+ var viewIndex = arrayIndex;
+ var selectedIndex = view.selection.currentIndex;
+ var pref;
+ var updateView = false;
+ var updateArray = false;
+ var addedRow = false;
+ if (prefName in gPrefHash) {
+ pref = gPrefHash[prefName];
+ viewIndex = getViewIndexOfPref(pref);
+ arrayIndex = getIndexOfPref(pref);
+ fetchPref(prefName, arrayIndex);
+ // fetchPref replaces the existing pref object
+ pref = gPrefHash[prefName];
+ if (viewIndex >= 0) {
+ // Might need to update the filtered view
+ gPrefView[viewIndex] = gPrefHash[prefName];
+ view.treebox.invalidateRow(viewIndex);
+ }
+ if (gSortedColumn == "lockCol" || gSortedColumn == "valueCol") {
+ updateArray = true;
+ gPrefArray.splice(arrayIndex, 1);
+ if (gFilter && gFilter.test(pref.prefCol + ";" + pref.valueCol)) {
+ updateView = true;
+ gPrefView.splice(viewIndex, 1);
+ }
+ }
+ } else {
+ fetchPref(prefName, arrayIndex);
+ pref = gPrefArray.pop();
+ updateArray = true;
+ addedRow = true;
+ if (gFilter && gFilter.test(pref.prefCol + ";" + pref.valueCol)) {
+ updateView = true;
+ }
+ }
+ if (updateArray) {
+ // Reinsert in the data array
+ var newIndex = getNearestIndexOfPref(pref);
+ gPrefArray.splice(newIndex, 0, pref);
+
+ if (updateView) {
+ // View is filtered, reinsert in the view separately
+ newIndex = getNearestViewIndexOfPref(pref);
+ gPrefView.splice(newIndex, 0, pref);
+ } else if (gFilter) {
+ // View is filtered, but nothing to update
+ return;
+ }
+
+ if (addedRow) {
+ view.treebox.rowCountChanged(newIndex, 1);
+ }
+
+ // Invalidate the changed range in the view
+ var low = Math.min(viewIndex, newIndex);
+ var high = Math.max(viewIndex, newIndex);
+ view.treebox.invalidateRange(low, high);
+
+ if (selectedIndex == viewIndex) {
+ selectedIndex = newIndex;
+ } else if (selectedIndex >= low && selectedIndex <= high) {
+ selectedIndex += newIndex > viewIndex ? -1 : 1;
+ }
+ if (selectedIndex >= 0) {
+ view.selection.select(selectedIndex);
+ if (selectedIndex == newIndex) {
+ view.treebox.ensureRowIsVisible(selectedIndex);
+ }
+ }
+ }
+ },
+};
+
+function prefObject(prefName, prefIndex) {
+ this.prefCol = prefName;
+}
+
+prefObject.prototype = {
+ lockCol: PREF_IS_DEFAULT_VALUE,
+ typeCol: nsIPrefBranch.PREF_STRING,
+ valueCol: "",
+};
+
+function fetchPref(prefName, prefIndex) {
+ var pref = new prefObject(prefName);
+
+ gPrefHash[prefName] = pref;
+ gPrefArray[prefIndex] = pref;
+
+ if (gPrefBranch.prefIsLocked(prefName)) {
+ pref.lockCol = PREF_IS_LOCKED;
+ } else if (gPrefBranch.prefHasUserValue(prefName)) {
+ pref.lockCol = PREF_IS_MODIFIED;
+ }
+
+ try {
+ switch (gPrefBranch.getPrefType(prefName)) {
+ case gPrefBranch.PREF_BOOL:
+ pref.typeCol = gPrefBranch.PREF_BOOL;
+ // convert to a string
+ pref.valueCol = gPrefBranch.getBoolPref(prefName).toString();
+ break;
+ case gPrefBranch.PREF_INT:
+ pref.typeCol = gPrefBranch.PREF_INT;
+ // convert to a string
+ pref.valueCol = gPrefBranch.getIntPref(prefName).toString();
+ break;
+ default:
+ case gPrefBranch.PREF_STRING:
+ pref.valueCol = gPrefBranch.getStringPref(prefName);
+ // Try in case it's a localized string (will throw an exception if not)
+ if (
+ pref.lockCol == PREF_IS_DEFAULT_VALUE &&
+ /^chrome:\/\/.+\/locale\/.+\.properties/.test(pref.valueCol)
+ ) {
+ pref.valueCol = gPrefBranch.getComplexValue(
+ prefName,
+ nsIPrefLocalizedString
+ ).data;
+ }
+ break;
+ }
+ } catch (e) {
+ // Also catch obscure cases in which you can't tell in advance
+ // that the pref exists but has no user or default value...
+ }
+}
+
+async function onConfigLoad() {
+ let configContext = document.getElementById("configContext");
+ configContext.addEventListener("popupshowing", function(event) {
+ if (event.target == this) {
+ updateContextMenu();
+ }
+ });
+
+ let commandListeners = {
+ toggleSelected: ModifySelected,
+ modifySelected: ModifySelected,
+ copyPref,
+ copyName,
+ copyValue,
+ resetSelected: ResetSelected,
+ };
+
+ configContext.addEventListener("command", e => {
+ if (e.target.id in commandListeners) {
+ commandListeners[e.target.id]();
+ }
+ });
+
+ let configString = document.getElementById("configString");
+ configString.addEventListener("command", function() {
+ NewPref(nsIPrefBranch.PREF_STRING);
+ });
+
+ let configInt = document.getElementById("configInt");
+ configInt.addEventListener("command", function() {
+ NewPref(nsIPrefBranch.PREF_INT);
+ });
+
+ let configBool = document.getElementById("configBool");
+ configBool.addEventListener("command", function() {
+ NewPref(nsIPrefBranch.PREF_BOOL);
+ });
+
+ let keyVKReturn = document.getElementById("keyVKReturn");
+ keyVKReturn.addEventListener("command", ModifySelected);
+
+ let textBox = document.getElementById("textbox");
+ textBox.addEventListener("command", FilterPrefs);
+
+ let configFocuSearch = document.getElementById("configFocuSearch");
+ configFocuSearch.addEventListener("command", function() {
+ textBox.focus();
+ });
+
+ let configFocuSearch2 = document.getElementById("configFocuSearch2");
+ configFocuSearch2.addEventListener("command", function() {
+ textBox.focus();
+ });
+
+ let warningButton = document.getElementById("warningButton");
+ warningButton.addEventListener("command", ShowPrefs);
+
+ let configTree = document.getElementById("configTree");
+ configTree.addEventListener("select", function() {
+ window.updateCommands("select");
+ });
+
+ let configTreeBody = document.getElementById("configTreeBody");
+ configTreeBody.addEventListener("dblclick", function(event) {
+ if (event.button == 0) {
+ ModifySelected();
+ }
+ });
+
+ gLockStrs[PREF_IS_DEFAULT_VALUE] = 'default';
+ gLockStrs[PREF_IS_MODIFIED] = 'modified';
+ gLockStrs[PREF_IS_LOCKED] = 'locked';
+ gTypeStrs[nsIPrefBranch.PREF_STRING] = 'string';
+ gTypeStrs[nsIPrefBranch.PREF_INT] = 'integer';
+ gTypeStrs[nsIPrefBranch.PREF_BOOL] = 'boolean';
+
+ var showWarning = gPrefBranch.getBoolPref("general.warnOnAboutConfig");
+
+ if (showWarning) {
+ document.getElementById("warningButton").focus();
+ } else {
+ ShowPrefs();
+ }
+}
+
+// Unhide the warning message
+function ShowPrefs() {
+ document.getElementById('configDeck').lastElementChild.style.visibility = 'visible';
+ gPrefBranch.getChildList("").forEach(fetchPref);
+
+ var descending = document.getElementsByAttribute(
+ "sortDirection",
+ "descending"
+ );
+ if (descending.item(0)) {
+ gSortedColumn = descending[0].id;
+ gSortDirection = -1;
+ } else {
+ var ascending = document.getElementsByAttribute(
+ "sortDirection",
+ "ascending"
+ );
+ if (ascending.item(0)) {
+ gSortedColumn = ascending[0].id;
+ } else {
+ document
+ .getElementById(gSortedColumn)
+ .setAttribute("sortDirection", "ascending");
+ }
+ }
+ gSortFunction = gSortFunctions[gSortedColumn];
+ gPrefArray.sort(gSortFunction);
+
+ gPrefBranch.addObserver("", gPrefListener);
+
+ var configTree = document.getElementById("configTree");
+ configTree.view = view;
+ configTree.controllers.insertControllerAt(0, configController);
+
+ document.getElementById("configDeck").setAttribute("selectedIndex", 1);
+ document.getElementById("configTreeKeyset").removeAttribute("disabled");
+ if (!document.getElementById("showWarningNextTime").checked) {
+ gPrefBranch.setBoolPref("general.warnOnAboutConfig", false);
+ }
+
+ // Process about:config?filter=
+ var textbox = document.getElementById("textbox");
+ // About URIs don't support query params, so do this manually
+ var loc = document.location.href;
+ var matches = /[?&]filter\=([^&]+)/i.exec(loc);
+ if (matches) {
+ textbox.value = decodeURIComponent(matches[1]);
+ }
+
+ // Even if we did not set the filter string via the URL query,
+ // textbox might have been set via some other mechanism
+ if (textbox.value) {
+ FilterPrefs();
+ }
+ textbox.focus();
+}
+
+function onConfigUnload() {
+ if (
+ document.getElementById("configDeck").getAttribute("selectedIndex") == 1
+ ) {
+ gPrefBranch.removeObserver("", gPrefListener);
+ var configTree = document.getElementById("configTree");
+ configTree.view = null;
+ configTree.controllers.removeController(configController);
+ }
+}
+
+function FilterPrefs() {
+ if (
+ document.getElementById("configDeck").getAttribute("selectedIndex") != 1
+ ) {
+ return;
+ }
+
+ var substring = document.getElementById("textbox").value;
+ // Check for "/regex/[i]"
+ if (substring.charAt(0) == "/") {
+ var r = substring.match(/^\/(.*)\/(i?)$/);
+ try {
+ gFilter = RegExp(r[1], r[2]);
+ } catch (e) {
+ return; // Do nothing on incomplete or bad RegExp
+ }
+ } else if (substring) {
+ gFilter = RegExp(
+ substring
+ .replace(/([^* \w])/g, "\\$1")
+ .replace(/^\*+/, "")
+ .replace(/\*+/g, ".*"),
+ "i"
+ );
+ } else {
+ gFilter = null;
+ }
+
+ var prefCol =
+ view.selection && view.selection.currentIndex < 0
+ ? null
+ : gPrefView[view.selection.currentIndex].prefCol;
+ var oldlen = gPrefView.length;
+ gPrefView = gPrefArray;
+ if (gFilter) {
+ gPrefView = [];
+ for (var i = 0; i < gPrefArray.length; ++i) {
+ if (gFilter.test(gPrefArray[i].prefCol + ";" + gPrefArray[i].valueCol)) {
+ gPrefView.push(gPrefArray[i]);
+ }
+ }
+ }
+ view.treebox.invalidate();
+ view.treebox.rowCountChanged(oldlen, gPrefView.length - oldlen);
+ gotoPref(prefCol);
+}
+
+function prefColSortFunction(x, y) {
+ if (x.prefCol > y.prefCol) {
+ return gSortDirection;
+ }
+ if (x.prefCol < y.prefCol) {
+ return -gSortDirection;
+ }
+ return 0;
+}
+
+function lockColSortFunction(x, y) {
+ if (x.lockCol != y.lockCol) {
+ return gSortDirection * (y.lockCol - x.lockCol);
+ }
+ return prefColSortFunction(x, y);
+}
+
+function typeColSortFunction(x, y) {
+ if (x.typeCol != y.typeCol) {
+ return gSortDirection * (y.typeCol - x.typeCol);
+ }
+ return prefColSortFunction(x, y);
+}
+
+function valueColSortFunction(x, y) {
+ if (x.valueCol > y.valueCol) {
+ return gSortDirection;
+ }
+ if (x.valueCol < y.valueCol) {
+ return -gSortDirection;
+ }
+ return prefColSortFunction(x, y);
+}
+
+const gSortFunctions = {
+ prefCol: prefColSortFunction,
+ lockCol: lockColSortFunction,
+ typeCol: typeColSortFunction,
+ valueCol: valueColSortFunction,
+};
+
+const gCategoryLabelForSortColumn = {
+ prefCol: "SortByName",
+ lockCol: "SortByStatus",
+ typeCol: "SortByType",
+ valueCol: "SortByValue",
+};
+
+const configController = {
+ supportsCommand: function supportsCommand(command) {
+ return command == "cmd_copy";
+ },
+ isCommandEnabled: function isCommandEnabled(command) {
+ return view.selection && view.selection.currentIndex >= 0;
+ },
+ doCommand: function doCommand(command) {
+ copyPref();
+ },
+ onEvent: function onEvent(event) {},
+};
+
+function updateContextMenu() {
+ var lockCol = PREF_IS_LOCKED;
+ var typeCol = nsIPrefBranch.PREF_STRING;
+ var valueCol = "";
+ var copyDisabled = true;
+ var prefSelected = view.selection.currentIndex >= 0;
+
+ if (prefSelected) {
+ var prefRow = gPrefView[view.selection.currentIndex];
+ lockCol = prefRow.lockCol;
+ typeCol = prefRow.typeCol;
+ valueCol = prefRow.valueCol;
+ copyDisabled = false;
+ }
+
+ var copyPref = document.getElementById("copyPref");
+ copyPref.setAttribute("disabled", copyDisabled);
+
+ var copyName = document.getElementById("copyName");
+ copyName.setAttribute("disabled", copyDisabled);
+
+ var copyValue = document.getElementById("copyValue");
+ copyValue.setAttribute("disabled", copyDisabled);
+
+ var resetSelected = document.getElementById("resetSelected");
+ resetSelected.setAttribute("disabled", lockCol != PREF_IS_MODIFIED);
+
+ var canToggle = typeCol == nsIPrefBranch.PREF_BOOL && valueCol != "";
+ // indicates that a pref is locked or no pref is selected at all
+ var isLocked = lockCol == PREF_IS_LOCKED;
+
+ var modifySelected = document.getElementById("modifySelected");
+ modifySelected.setAttribute("disabled", isLocked);
+ modifySelected.hidden = canToggle;
+
+ var toggleSelected = document.getElementById("toggleSelected");
+ toggleSelected.setAttribute("disabled", isLocked);
+ toggleSelected.hidden = !canToggle;
+}
+
+function copyPref() {
+ var pref = gPrefView[view.selection.currentIndex];
+ gClipboardHelper.copyString(pref.prefCol + ";" + pref.valueCol);
+}
+
+function copyName() {
+ gClipboardHelper.copyString(gPrefView[view.selection.currentIndex].prefCol);
+}
+
+function copyValue() {
+ gClipboardHelper.copyString(gPrefView[view.selection.currentIndex].valueCol);
+}
+
+function ModifySelected() {
+ if (view.selection.currentIndex >= 0) {
+ ModifyPref(gPrefView[view.selection.currentIndex]);
+ }
+}
+
+function ResetSelected() {
+ var entry = gPrefView[view.selection.currentIndex];
+ gPrefBranch.clearUserPref(entry.prefCol);
+}
+
+async function NewPref(type) {
+ var result = { value: "" };
+ var dummy = { value: 0 };
+
+ let [newTitle, newPrompt] = [`New ${gTypeStrs[type]} value`, 'Enter the preference name'];
+
+ if (
+ Services.prompt.prompt(window, newTitle, newPrompt, result, null, dummy)
+ ) {
+ result.value = result.value.trim();
+ if (!result.value) {
+ return;
+ }
+
+ var pref;
+ if (result.value in gPrefHash) {
+ pref = gPrefHash[result.value];
+ } else {
+ pref = {
+ prefCol: result.value,
+ lockCol: PREF_IS_DEFAULT_VALUE,
+ typeCol: type,
+ valueCol: "",
+ };
+ }
+ if (ModifyPref(pref)) {
+ setTimeout(gotoPref, 0, result.value);
+ }
+ }
+}
+
+function gotoPref(pref) {
+ // make sure the pref exists and is displayed in the current view
+ var index = pref in gPrefHash ? getViewIndexOfPref(gPrefHash[pref]) : -1;
+ if (index >= 0) {
+ view.selection.select(index);
+ view.treebox.ensureRowIsVisible(index);
+ } else {
+ view.selection.clearSelection();
+ view.selection.currentIndex = -1;
+ }
+}
+
+async function ModifyPref(entry) {
+ if (entry.lockCol == PREF_IS_LOCKED) {
+ return false;
+ }
+
+ let [title] = [`Enter ${gTypeStrs[entry.typeCol]} value`];
+
+ if (entry.typeCol == nsIPrefBranch.PREF_BOOL) {
+ var check = { value: entry.valueCol == "false" };
+ if (
+ !entry.valueCol &&
+ !Services.prompt.select(
+ window,
+ title,
+ entry.prefCol,
+ [false, true],
+ check
+ )
+ ) {
+ return false;
+ }
+ gPrefBranch.setBoolPref(entry.prefCol, check.value);
+ } else {
+ var result = { value: entry.valueCol };
+ var dummy = { value: 0 };
+ if (
+ !Services.prompt.prompt(window, title, entry.prefCol, result, null, dummy)
+ ) {
+ return false;
+ }
+ if (entry.typeCol == nsIPrefBranch.PREF_INT) {
+ // | 0 converts to integer or 0; - 0 to float or NaN.
+ // Thus, this check should catch all cases.
+ var val = result.value | 0;
+ if (val != result.value - 0) {
+ const [err_title, err_text] = ['Invalid value', 'The text you entered is not a number.'];
+
+ Services.prompt.alert(window, err_title, err_text);
+ return false;
+ }
+ gPrefBranch.setIntPref(entry.prefCol, val);
+ } else {
+ gPrefBranch.setStringPref(entry.prefCol, result.value);
+ }
+ }
+
+ Services.prefs.savePrefFile(null);
+ return true;
+}
+
+window.onload = onConfigLoad;
+window.onunload = onConfigUnload;
diff --git a/chrome/utils/chrome.manifest b/chrome/utils/chrome.manifest
new file mode 100644
index 0000000..d9076b2
--- /dev/null
+++ b/chrome/utils/chrome.manifest
@@ -0,0 +1,2 @@
+content userchromejs ./
+resource userchromejs ../
diff --git a/chrome/utils/hookFunction.jsm b/chrome/utils/hookFunction.jsm
new file mode 100644
index 0000000..30979cc
--- /dev/null
+++ b/chrome/utils/hookFunction.jsm
@@ -0,0 +1,42 @@
+let EXPORTED_SYMBOLS = ['hookFunction'];
+
+/**
+ * Add hooks to a function to execute before and after it. The function to modify is functionContext[functionName]. Call only once per function - modification is not supported.
+ *
+ * Other addons wishing to access the original function may do so using the .originalFunction member of the replacement function. This member can also be set if required, to insert a new function replacement into the chain rather than appending.
+ *
+ * @param functionContext The object on which the function is a property
+ * @param functionName The name of the property containing the function (on functionContext)
+ * @param onBeforeFunction A function to be called before the hooked function is executed. It will be passed the same parameters as the hooked function. It's return value will be passed on to onAfterFunction
+ * @param onAfterFunction A function to be called after the hooked function is executed. The parameters passed to it are: onBeforeFunction return value, arguments object from original hooked function, return value from original hooked function. It's return value will be returned in place of that of the original function.
+ * @returns A function which can be called to safely un-hook the hook
+ */
+ function hookFunction(functionContext, functionName, onBeforeFunction, onAfterFunction) {
+ let originalFunction = functionContext[functionName];
+
+ if (!originalFunction) {
+ throw new Error("Could not find function " + functionName);
+ }
+
+ let replacementFunction = function() {
+ let onBeforeResult = null;
+ if (onBeforeFunction) {
+ onBeforeResult = onBeforeFunction.apply(this, arguments);
+ }
+ let originalResult = replacementFunction.originalFunction.apply(this, arguments);
+ if (onAfterFunction) {
+ return onAfterFunction.call(this, onBeforeResult, arguments, originalResult);
+ } else {
+ return originalResult;
+ }
+ }
+ replacementFunction.originalFunction = originalFunction;
+ functionContext[functionName] = replacementFunction;
+
+ return function () {
+ // Not safe to simply assign originalFunction back again, as something else might have chained onto this function, which would then break the chain
+ // Unassigning these variables prevent any effects of the hook, though the function itself remains in place.
+ onBeforeFunction = null;
+ onAfterFunction = null;
+ };
+}
\ No newline at end of file
diff --git a/chrome/utils/passwordmgr/passwordManager.js b/chrome/utils/passwordmgr/passwordManager.js
new file mode 100644
index 0000000..d0d12a7
--- /dev/null
+++ b/chrome/utils/passwordmgr/passwordManager.js
@@ -0,0 +1,845 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/** * =================== SAVED SIGNONS CODE =================== ***/
+/* eslint-disable-next-line no-var */
+var { AppConstants } = ChromeUtils.import(
+ "resource://gre/modules/AppConstants.jsm"
+);
+/* eslint-disable-next-line no-var */
+var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+
+ChromeUtils.defineModuleGetter(
+ this,
+ "DeferredTask",
+ "resource://gre/modules/DeferredTask.jsm"
+);
+ChromeUtils.defineModuleGetter(
+ this,
+ "PlacesUtils",
+ "resource://gre/modules/PlacesUtils.jsm"
+);
+
+// Default value for signon table sorting
+let lastSignonSortColumn = "origin";
+let lastSignonSortAscending = true;
+
+let showingPasswords = false;
+
+// password-manager lists
+let signons = [];
+let deletedSignons = [];
+
+// Elements that would be used frequently
+let filterField;
+let togglePasswordsButton;
+let signonsIntro;
+let removeButton;
+let removeAllButton;
+let signonsTree;
+
+let signonReloadDisplay = {
+ observe(subject, topic, data) {
+ if (topic == "passwordmgr-storage-changed") {
+ switch (data) {
+ case "addLogin":
+ case "modifyLogin":
+ case "removeLogin":
+ case "removeAllLogins":
+ if (!signonsTree) {
+ return;
+ }
+ signons.length = 0;
+ LoadSignons();
+ // apply the filter if needed
+ if (filterField && filterField.value != "") {
+ FilterPasswords();
+ }
+ signonsTree.ensureRowIsVisible(
+ signonsTree.view.selection.currentIndex
+ );
+ break;
+ }
+ Services.obs.notifyObservers(null, "passwordmgr-dialog-updated");
+ }
+ },
+};
+
+// Formatter for localization.
+let dateFormatter = new Services.intl.DateTimeFormat(undefined, {
+ dateStyle: "medium",
+});
+let dateAndTimeFormatter = new Services.intl.DateTimeFormat(undefined, {
+ dateStyle: "medium",
+ timeStyle: "short",
+});
+
+function Startup() {
+ // be prepared to reload the display if anything changes
+ Services.obs.addObserver(signonReloadDisplay, "passwordmgr-storage-changed");
+
+ signonsTree = document.getElementById("signonsTree");
+ filterField = document.getElementById("filter");
+ togglePasswordsButton = document.getElementById("togglePasswords");
+ signonsIntro = document.getElementById("signonsIntro");
+ removeButton = document.getElementById("removeSignon");
+ removeAllButton = document.getElementById("removeAllSignons");
+
+ togglePasswordsButton.label = "Show Passwords";
+ togglePasswordsButton.accessKey = "P";
+ signonsIntro.textContent = "Logins for the following sites are stored on your computer";
+ removeAllButton.label = "Remove All";
+ removeAllButton.accessKey = "A";
+
+ if (Services.policies && !Services.policies.isAllowed("passwordReveal")) {
+ togglePasswordsButton.hidden = true;
+ }
+
+ document
+ .getElementsByTagName("treecols")[0]
+ .addEventListener("click", event => {
+ let { target, button } = event;
+ let sortField = target.getAttribute("data-field-name");
+
+ if (target.nodeName != "treecol" || button != 0 || !sortField) {
+ return;
+ }
+
+ SignonColumnSort(sortField);
+ Services.telemetry
+ .getKeyedHistogramById("PWMGR_MANAGE_SORTED")
+ .add(sortField);
+ });
+
+ LoadSignons();
+
+ // filter the table if requested by caller
+ if (
+ window.arguments &&
+ window.arguments[0] &&
+ window.arguments[0].filterString
+ ) {
+ setFilter(window.arguments[0].filterString);
+ }
+
+ FocusFilterBox();
+}
+
+function Shutdown() {
+ Services.obs.removeObserver(
+ signonReloadDisplay,
+ "passwordmgr-storage-changed"
+ );
+}
+
+function setFilter(aFilterString) {
+ filterField.value = aFilterString;
+ FilterPasswords();
+}
+
+let signonsTreeView = {
+ _filterSet: [],
+ _lastSelectedRanges: [],
+ selection: null,
+
+ rowCount: 0,
+ setTree(tree) {},
+ getImageSrc(row, column) {
+ if (column.element.getAttribute("id") !== "siteCol") {
+ return "";
+ }
+
+ const signon = GetVisibleLogins()[row];
+
+ return PlacesUtils.urlWithSizeRef(window, "page-icon:" + signon.origin, 16);
+ },
+ getCellValue(row, column) {},
+ getCellText(row, column) {
+ let time;
+ let signon = GetVisibleLogins()[row];
+ switch (column.id) {
+ case "siteCol":
+ return signon.httpRealm
+ ? signon.origin + " (" + signon.httpRealm + ")"
+ : signon.origin;
+ case "userCol":
+ return signon.username || "";
+ case "passwordCol":
+ return signon.password || "";
+ case "timeCreatedCol":
+ time = new Date(signon.timeCreated);
+ return dateFormatter.format(time);
+ case "timeLastUsedCol":
+ time = new Date(signon.timeLastUsed);
+ return dateAndTimeFormatter.format(time);
+ case "timePasswordChangedCol":
+ time = new Date(signon.timePasswordChanged);
+ return dateFormatter.format(time);
+ case "timesUsedCol":
+ return signon.timesUsed;
+ default:
+ return "";
+ }
+ },
+ isEditable(row, col) {
+ if (col.id == "userCol" || col.id == "passwordCol") {
+ return true;
+ }
+ return false;
+ },
+ isSeparator(index) {
+ return false;
+ },
+ isSorted() {
+ return false;
+ },
+ isContainer(index) {
+ return false;
+ },
+ cycleHeader(column) {},
+ getRowProperties(row) {
+ return "";
+ },
+ getColumnProperties(column) {
+ return "";
+ },
+ getCellProperties(row, column) {
+ if (column.element.getAttribute("id") == "siteCol") {
+ return "ltr";
+ }
+
+ return "";
+ },
+ setCellText(row, col, value) {
+ let table = GetVisibleLogins();
+ function _editLogin(field) {
+ if (value == table[row][field]) {
+ return;
+ }
+ let existingLogin = table[row].clone();
+ table[row][field] = value;
+ table[row].timePasswordChanged = Date.now();
+ Services.logins.modifyLogin(existingLogin, table[row]);
+ signonsTree.invalidateRow(row);
+ }
+
+ if (col.id == "userCol") {
+ _editLogin("username");
+ } else if (col.id == "passwordCol") {
+ if (!value) {
+ return;
+ }
+ _editLogin("password");
+ }
+ },
+};
+
+function SortTree(column, ascending) {
+ let table = GetVisibleLogins();
+ // remember which item was selected so we can restore it after the sort
+ let selections = GetTreeSelections();
+ let selectedNumber = selections.length ? table[selections[0]].number : -1;
+ function compareFunc(a, b) {
+ let valA, valB;
+ switch (column) {
+ case "origin":
+ let realmA = a.httpRealm;
+ let realmB = b.httpRealm;
+ realmA = realmA == null ? "" : realmA.toLowerCase();
+ realmB = realmB == null ? "" : realmB.toLowerCase();
+
+ valA = a[column].toLowerCase() + realmA;
+ valB = b[column].toLowerCase() + realmB;
+ break;
+ case "username":
+ case "password":
+ valA = a[column].toLowerCase();
+ valB = b[column].toLowerCase();
+ break;
+
+ default:
+ valA = a[column];
+ valB = b[column];
+ }
+
+ if (valA < valB) {
+ return -1;
+ }
+ if (valA > valB) {
+ return 1;
+ }
+ return 0;
+ }
+
+ // do the sort
+ table.sort(compareFunc);
+ if (!ascending) {
+ table.reverse();
+ }
+
+ // restore the selection
+ let selectedRow = -1;
+ if (selectedNumber >= 0 && false) {
+ for (let s = 0; s < table.length; s++) {
+ if (table[s].number == selectedNumber) {
+ // update selection
+ // note: we need to deselect before reselecting in order to trigger ...Selected()
+ signonsTree.view.selection.select(-1);
+ signonsTree.view.selection.select(s);
+ selectedRow = s;
+ break;
+ }
+ }
+ }
+
+ // display the results
+ signonsTree.invalidate();
+ if (selectedRow >= 0) {
+ signonsTree.ensureRowIsVisible(selectedRow);
+ }
+}
+
+function LoadSignons() {
+ // loads signons into table
+ try {
+ signons = Services.logins.getAllLogins();
+ } catch (e) {
+ signons = [];
+ }
+ signons.forEach(login => login.QueryInterface(Ci.nsILoginMetaInfo));
+ signonsTreeView.rowCount = signons.length;
+
+ // sort and display the table
+ signonsTree.view = signonsTreeView;
+ // The sort column didn't change. SortTree (called by
+ // SignonColumnSort) assumes we want to toggle the sort
+ // direction but here we don't so we have to trick it
+ lastSignonSortAscending = !lastSignonSortAscending;
+ SignonColumnSort(lastSignonSortColumn);
+
+ // disable "remove all signons" button if there are no signons
+ if (!signons.length) {
+ removeAllButton.setAttribute("disabled", "true");
+ togglePasswordsButton.setAttribute("disabled", "true");
+ } else {
+ removeAllButton.removeAttribute("disabled");
+ togglePasswordsButton.removeAttribute("disabled");
+ }
+
+ return true;
+}
+
+function GetVisibleLogins() {
+ return signonsTreeView._filterSet.length
+ ? signonsTreeView._filterSet
+ : signons;
+}
+
+function GetTreeSelections() {
+ let selections = [];
+ let select = signonsTree.view.selection;
+ if (select) {
+ let count = select.getRangeCount();
+ let min = {};
+ let max = {};
+ for (let i = 0; i < count; i++) {
+ select.getRangeAt(i, min, max);
+ for (let k = min.value; k <= max.value; k++) {
+ if (k != -1) {
+ selections[selections.length] = k;
+ }
+ }
+ }
+ }
+ return selections;
+}
+
+function SignonSelected() {
+ let selections = GetTreeSelections();
+ if (selections.length) {
+ removeButton.removeAttribute("disabled");
+ } else {
+ removeButton.setAttribute("disabled", true);
+ }
+}
+
+function DeleteSignon() {
+ let syncNeeded = !!signonsTreeView._filterSet.length;
+ let tree = signonsTree;
+ let view = signonsTreeView;
+ let table = GetVisibleLogins();
+
+ // Turn off tree selection notifications during the deletion
+ tree.view.selection.selectEventsSuppressed = true;
+
+ // remove selected items from list (by setting them to null) and place in deleted list
+ let selections = GetTreeSelections();
+ for (let s = selections.length - 1; s >= 0; s--) {
+ let i = selections[s];
+ deletedSignons.push(table[i]);
+ table[i] = null;
+ }
+
+ // collapse list by removing all the null entries
+ for (let j = 0; j < table.length; j++) {
+ if (table[j] == null) {
+ let k = j;
+ while (k < table.length && table[k] == null) {
+ k++;
+ }
+ table.splice(j, k - j);
+ view.rowCount -= k - j;
+ tree.rowCountChanged(j, j - k);
+ }
+ }
+
+ // update selection and/or buttons
+ if (table.length) {
+ // update selection
+ let nextSelection =
+ selections[0] < table.length ? selections[0] : table.length - 1;
+ tree.view.selection.select(nextSelection);
+ } else {
+ // disable buttons
+ removeButton.setAttribute("disabled", "true");
+ removeAllButton.setAttribute("disabled", "true");
+ }
+ tree.view.selection.selectEventsSuppressed = false;
+ FinalizeSignonDeletions(syncNeeded);
+}
+
+async function DeleteAllSignons() {
+ // Confirm the user wants to remove all passwords
+ let dummy = { value: false };
+ if (
+ Services.prompt.confirmEx(
+ window,
+ "Remove all passwords",
+ "Are you sure you wish to remove all passwords?",
+ Services.prompt.STD_YES_NO_BUTTONS + Services.prompt.BUTTON_POS_1_DEFAULT,
+ null,
+ null,
+ null,
+ null,
+ dummy
+ ) == 1
+ ) {
+ // 1 == "No" button
+ return;
+ }
+
+ let syncNeeded = !!signonsTreeView._filterSet.length;
+ let view = signonsTreeView;
+ let table = GetVisibleLogins();
+
+ // remove all items from table and place in deleted table
+ for (let i = 0; i < table.length; i++) {
+ deletedSignons.push(table[i]);
+ }
+ table.length = 0;
+
+ // clear out selections
+ view.selection.select(-1);
+
+ // update the tree view and notify the tree
+ view.rowCount = 0;
+
+ signonsTree.rowCountChanged(0, -deletedSignons.length);
+ signonsTree.invalidate();
+
+ // disable buttons
+ removeButton.setAttribute("disabled", "true");
+ removeAllButton.setAttribute("disabled", "true");
+ FinalizeSignonDeletions(syncNeeded);
+ Services.telemetry.getHistogramById("PWMGR_MANAGE_DELETED_ALL").add(1);
+ Services.obs.notifyObservers(
+ null,
+ "weave:telemetry:histogram",
+ "PWMGR_MANAGE_DELETED_ALL"
+ );
+}
+
+async function TogglePasswordVisible() {
+ if (showingPasswords || (await masterPasswordLogin(AskUserShowPasswords))) {
+ showingPasswords = !showingPasswords;
+ togglePasswordsButton.label = showingPasswords ? "Hide Passwords" : "Show Passwords";
+ togglePasswordsButton.accessKey = "P";
+ document.getElementById("passwordCol").hidden = !showingPasswords;
+ FilterPasswords();
+ }
+
+ // Notify observers that the password visibility toggling is
+ // completed. (Mostly useful for tests)
+ Services.obs.notifyObservers(null, "passwordmgr-password-toggle-complete");
+ Services.telemetry
+ .getHistogramById("PWMGR_MANAGE_VISIBILITY_TOGGLED")
+ .add(showingPasswords);
+ Services.obs.notifyObservers(
+ null,
+ "weave:telemetry:histogram",
+ "PWMGR_MANAGE_VISIBILITY_TOGGLED"
+ );
+}
+
+async function AskUserShowPasswords() {
+ let dummy = { value: false };
+
+ // Confirm the user wants to display passwords
+ return (
+ Services.prompt.confirmEx(
+ window,
+ null,
+ "Are you sure you wish to show your passwords?",
+ Services.prompt.STD_YES_NO_BUTTONS,
+ null,
+ null,
+ null,
+ null,
+ dummy
+ ) == 0
+ ); // 0=="Yes" button
+}
+
+function FinalizeSignonDeletions(syncNeeded) {
+ for (let s = 0; s < deletedSignons.length; s++) {
+ Services.logins.removeLogin(deletedSignons[s]);
+ Services.telemetry.getHistogramById("PWMGR_MANAGE_DELETED").add(1);
+ Services.obs.notifyObservers(
+ null,
+ "weave:telemetry:histogram",
+ "PWMGR_MANAGE_DELETED"
+ );
+ }
+ // If the deletion has been performed in a filtered view, reflect the deletion in the unfiltered table.
+ // See bug 405389.
+ if (syncNeeded) {
+ try {
+ signons = Services.logins.getAllLogins();
+ } catch (e) {
+ signons = [];
+ }
+ }
+ deletedSignons.length = 0;
+}
+
+function HandleSignonKeyPress(e) {
+ // If editing is currently performed, don't do anything.
+ if (signonsTree.getAttribute("editing")) {
+ return;
+ }
+ if (
+ e.keyCode == KeyboardEvent.DOM_VK_DELETE ||
+ (AppConstants.platform == "macosx" &&
+ e.keyCode == KeyboardEvent.DOM_VK_BACK_SPACE)
+ ) {
+ DeleteSignon();
+ e.preventDefault();
+ }
+}
+
+function getColumnByName(column) {
+ switch (column) {
+ case "origin":
+ return document.getElementById("siteCol");
+ case "username":
+ return document.getElementById("userCol");
+ case "password":
+ return document.getElementById("passwordCol");
+ case "timeCreated":
+ return document.getElementById("timeCreatedCol");
+ case "timeLastUsed":
+ return document.getElementById("timeLastUsedCol");
+ case "timePasswordChanged":
+ return document.getElementById("timePasswordChangedCol");
+ case "timesUsed":
+ return document.getElementById("timesUsedCol");
+ }
+ return undefined;
+}
+
+function SignonColumnSort(column) {
+ let sortedCol = getColumnByName(column);
+ let lastSortedCol = getColumnByName(lastSignonSortColumn);
+
+ // clear out the sortDirection attribute on the old column
+ lastSortedCol.removeAttribute("sortDirection");
+
+ // determine if sort is to be ascending or descending
+ lastSignonSortAscending =
+ column == lastSignonSortColumn ? !lastSignonSortAscending : true;
+
+ // sort
+ lastSignonSortColumn = column;
+ SortTree(lastSignonSortColumn, lastSignonSortAscending);
+
+ // set the sortDirection attribute to get the styling going
+ // first we need to get the right element
+ sortedCol.setAttribute(
+ "sortDirection",
+ lastSignonSortAscending ? "ascending" : "descending"
+ );
+}
+
+function SignonClearFilter() {
+ let singleSelection = signonsTreeView.selection.count == 1;
+
+ // Clear the Tree Display
+ signonsTreeView.rowCount = 0;
+ signonsTree.rowCountChanged(0, -signonsTreeView._filterSet.length);
+ signonsTreeView._filterSet = [];
+
+ // Just reload the list to make sure deletions are respected
+ LoadSignons();
+
+ // Restore selection
+ if (singleSelection) {
+ signonsTreeView.selection.clearSelection();
+ for (let i = 0; i < signonsTreeView._lastSelectedRanges.length; ++i) {
+ let range = signonsTreeView._lastSelectedRanges[i];
+ signonsTreeView.selection.rangedSelect(range.min, range.max, true);
+ }
+ } else {
+ signonsTreeView.selection.select(0);
+ }
+ signonsTreeView._lastSelectedRanges = [];
+
+ signonsIntro.textContent = "Logins for the following sites are stored on your computer";
+ removeAllButton.label = "Remove All";
+ removeAllButton.accessKey = "A";
+}
+
+function FocusFilterBox() {
+ if (filterField.getAttribute("focused") != "true") {
+ filterField.focus();
+ }
+}
+
+function SignonMatchesFilter(aSignon, aFilterValue) {
+ if (aSignon.origin.toLowerCase().includes(aFilterValue)) {
+ return true;
+ }
+ if (
+ aSignon.username &&
+ aSignon.username.toLowerCase().includes(aFilterValue)
+ ) {
+ return true;
+ }
+ if (
+ aSignon.httpRealm &&
+ aSignon.httpRealm.toLowerCase().includes(aFilterValue)
+ ) {
+ return true;
+ }
+ if (
+ showingPasswords &&
+ aSignon.password &&
+ aSignon.password.toLowerCase().includes(aFilterValue)
+ ) {
+ return true;
+ }
+
+ return false;
+}
+
+function _filterPasswords(aFilterValue, view) {
+ aFilterValue = aFilterValue.toLowerCase();
+ return signons.filter(s => SignonMatchesFilter(s, aFilterValue));
+}
+
+function SignonSaveState() {
+ // Save selection
+ let seln = signonsTreeView.selection;
+ signonsTreeView._lastSelectedRanges = [];
+ let rangeCount = seln.getRangeCount();
+ for (let i = 0; i < rangeCount; ++i) {
+ let min = {};
+ let max = {};
+ seln.getRangeAt(i, min, max);
+ signonsTreeView._lastSelectedRanges.push({
+ min: min.value,
+ max: max.value,
+ });
+ }
+}
+
+function FilterPasswords() {
+ if (filterField.value == "") {
+ SignonClearFilter();
+ return;
+ }
+
+ let newFilterSet = _filterPasswords(filterField.value, signonsTreeView);
+ if (!signonsTreeView._filterSet.length) {
+ // Save Display Info for the Non-Filtered mode when we first
+ // enter Filtered mode.
+ SignonSaveState();
+ }
+ signonsTreeView._filterSet = newFilterSet;
+
+ // Clear the display
+ let oldRowCount = signonsTreeView.rowCount;
+ signonsTreeView.rowCount = 0;
+ signonsTree.rowCountChanged(0, -oldRowCount);
+ // Set up the filtered display
+ signonsTreeView.rowCount = signonsTreeView._filterSet.length;
+ signonsTree.rowCountChanged(0, signonsTreeView.rowCount);
+
+ // if the view is not empty then select the first item
+ if (signonsTreeView.rowCount > 0) {
+ signonsTreeView.selection.select(0);
+ }
+
+ signonsIntro.textContent = "The following logins match your search:";
+ removeAllButton.label = "Remove All Shown";
+ removeAllButton.accessKey = "A";
+}
+
+function CopySiteUrl() {
+ // Copy selected site url to clipboard
+ let clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(
+ Ci.nsIClipboardHelper
+ );
+ let row = signonsTree.currentIndex;
+ let url = signonsTreeView.getCellText(row, { id: "siteCol" });
+ clipboard.copyString(url);
+}
+
+async function CopyPassword() {
+ // Don't copy passwords if we aren't already showing the passwords & a master
+ // password hasn't been entered.
+ if (!showingPasswords && !(await masterPasswordLogin())) {
+ return;
+ }
+ // Copy selected signon's password to clipboard
+ let clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(
+ Ci.nsIClipboardHelper
+ );
+ let row = signonsTree.currentIndex;
+ let password = signonsTreeView.getCellText(row, { id: "passwordCol" });
+ clipboard.copyString(password);
+ Services.telemetry.getHistogramById("PWMGR_MANAGE_COPIED_PASSWORD").add(1);
+ Services.obs.notifyObservers(
+ null,
+ "weave:telemetry:histogram",
+ "PWMGR_MANAGE_COPIED_PASSWORD"
+ );
+}
+
+function CopyUsername() {
+ // Copy selected signon's username to clipboard
+ let clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(
+ Ci.nsIClipboardHelper
+ );
+ let row = signonsTree.currentIndex;
+ let username = signonsTreeView.getCellText(row, { id: "userCol" });
+ clipboard.copyString(username);
+ Services.telemetry.getHistogramById("PWMGR_MANAGE_COPIED_USERNAME").add(1);
+ Services.obs.notifyObservers(
+ null,
+ "weave:telemetry:histogram",
+ "PWMGR_MANAGE_COPIED_USERNAME"
+ );
+}
+
+function EditCellInSelectedRow(columnName) {
+ let row = signonsTree.currentIndex;
+ let columnElement = getColumnByName(columnName);
+ signonsTree.startEditing(
+ row,
+ signonsTree.columns.getColumnFor(columnElement)
+ );
+}
+
+function LaunchSiteUrl() {
+ let row = signonsTree.currentIndex;
+ let url = signonsTreeView.getCellText(row, { id: "siteCol" });
+ window.openWebLinkIn(url, "tab");
+}
+
+function UpdateContextMenu() {
+ let singleSelection = signonsTreeView.selection.count == 1;
+ let menuItems = new Map();
+ let menupopup = document.getElementById("signonsTreeContextMenu");
+ for (let menuItem of menupopup.querySelectorAll("menuitem")) {
+ menuItems.set(menuItem.id, menuItem);
+ }
+
+ if (!singleSelection) {
+ for (let menuItem of menuItems.values()) {
+ menuItem.setAttribute("disabled", "true");
+ }
+ return;
+ }
+
+ let selectedRow = signonsTree.currentIndex;
+
+ // Don't display "Launch Site URL" if we're not a browser.
+ if (window.openWebLinkIn) {
+ menuItems.get("context-launchsiteurl").removeAttribute("disabled");
+ } else {
+ menuItems.get("context-launchsiteurl").setAttribute("disabled", "true");
+ menuItems.get("context-launchsiteurl").setAttribute("hidden", "true");
+ }
+
+ // Disable "Copy Username" if the username is empty.
+ if (signonsTreeView.getCellText(selectedRow, { id: "userCol" }) != "") {
+ menuItems.get("context-copyusername").removeAttribute("disabled");
+ } else {
+ menuItems.get("context-copyusername").setAttribute("disabled", "true");
+ }
+
+ menuItems.get("context-copysiteurl").removeAttribute("disabled");
+ menuItems.get("context-editusername").removeAttribute("disabled");
+ menuItems.get("context-copypassword").removeAttribute("disabled");
+
+ // Disable "Edit Password" if the password column isn't showing.
+ if (!document.getElementById("passwordCol").hidden) {
+ menuItems.get("context-editpassword").removeAttribute("disabled");
+ } else {
+ menuItems.get("context-editpassword").setAttribute("disabled", "true");
+ }
+}
+
+async function masterPasswordLogin(noPasswordCallback) {
+ // This does no harm if master password isn't set.
+ let tokendb = Cc["@mozilla.org/security/pk11tokendb;1"].createInstance(
+ Ci.nsIPK11TokenDB
+ );
+ let token = tokendb.getInternalKeyToken();
+
+ // If there is no master password, still give the user a chance to opt-out of displaying passwords
+ if (token.checkPassword("")) {
+ return noPasswordCallback ? noPasswordCallback() : true;
+ }
+
+ // So there's a master password. But since checkPassword didn't succeed, we're logged out (per nsIPK11Token.idl).
+ try {
+ // Relogin and ask for the master password.
+ token.login(true); // 'true' means always prompt for token password. User will be prompted until
+ // clicking 'Cancel' or entering the correct password.
+ } catch (e) {
+ // An exception will be thrown if the user cancels the login prompt dialog.
+ // User is also logged out of Software Security Device.
+ }
+
+ return token.isLoggedIn();
+}
+
+function escapeKeyHandler() {
+ // If editing is currently performed, don't do anything.
+ if (signonsTree.getAttribute("editing")) {
+ return;
+ }
+ window.close();
+}
+
+function OpenMigrator() {
+ const { MigrationUtils } = ChromeUtils.import(
+ "resource:///modules/MigrationUtils.jsm"
+ );
+ // We pass in the type of source we're using for use in telemetry:
+ MigrationUtils.showMigrationWizard(window, [
+ MigrationUtils.MIGRATION_ENTRYPOINT_PASSWORDS,
+ ]);
+}
diff --git a/chrome/utils/passwordmgr/passwordManager.xhtml b/chrome/utils/passwordmgr/passwordManager.xhtml
new file mode 100644
index 0000000..a36096d
--- /dev/null
+++ b/chrome/utils/passwordmgr/passwordManager.xhtml
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/chrome/utils/passwordmgr/passwordmgr.css b/chrome/utils/passwordmgr/passwordmgr.css
new file mode 100644
index 0000000..19d2877
--- /dev/null
+++ b/chrome/utils/passwordmgr/passwordmgr.css
@@ -0,0 +1,22 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+
+.contentPane {
+ margin: 9px 8px 5px;
+}
+
+.actionButtons {
+ margin: 0 3px 6px;
+}
+
+treechildren::-moz-tree-image(siteCol) {
+ list-style-image: url(chrome://mozapps/skin/places/defaultFavicon.svg);
+ -moz-context-properties: fill;
+ fill: currentColor;
+ width: 16px;
+ height: 16px;
+ margin-inline-end: 5px;
+}
diff --git a/chrome/utils/styloaix/16.png b/chrome/utils/styloaix/16.png
new file mode 100644
index 0000000..02a8381
Binary files /dev/null and b/chrome/utils/styloaix/16.png differ
diff --git a/chrome/utils/styloaix/16w.png b/chrome/utils/styloaix/16w.png
new file mode 100644
index 0000000..da1fd9f
Binary files /dev/null and b/chrome/utils/styloaix/16w.png differ
diff --git a/chrome/utils/styloaix/autocomplete.js b/chrome/utils/styloaix/autocomplete.js
new file mode 100644
index 0000000..74a9f45
--- /dev/null
+++ b/chrome/utils/styloaix/autocomplete.js
@@ -0,0 +1,320 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const AutocompletePopup = require('devtools/client/shared/autocomplete-popup');
+
+let loader;
+try {
+ ({ loader } = ChromeUtils.import('resource://devtools/shared/loader/Loader.jsm'));
+} catch (e) {
+ // tb91
+ ({ loader } = ChromeUtils.import('resource://devtools/shared/Loader.jsm'));
+}
+
+loader.lazyRequireGetter(
+ this,
+ "KeyCodes",
+ "devtools/client/shared/keycodes",
+ true
+);
+loader.lazyRequireGetter(
+ this,
+ "CSSCompleter",
+ "devtools/client/shared/sourceeditor/css-autocompleter"
+);
+
+const autocompleteMap = new WeakMap();
+
+/**
+ * Prepares an editor instance for autocompletion.
+ */
+function initializeAutoCompletion(ctx, options = {}) {
+ const { cm, ed, Editor } = ctx;
+ if (autocompleteMap.has(ed)) {
+ return;
+ }
+
+ const win = ed.container.contentWindow.wrappedJSObject;
+ const { CodeMirror } = win;
+
+ let completer = null;
+ const autocompleteKey =
+ "Ctrl-" + Editor.keyFor("autocompletion", { noaccel: true });
+ if (ed.config.mode == Editor.modes.css) {
+ completer = new CSSCompleter({
+ walker: options.walker,
+ cssProperties: options.cssProperties,
+ maxEntries: 1000,
+ });
+ }
+
+ function insertSelectedPopupItem() {
+ const autocompleteState = autocompleteMap.get(ed);
+ if (!popup || !popup.isOpen || !autocompleteState) {
+ return false;
+ }
+
+ if (!autocompleteState.suggestionInsertedOnce && popup.selectedItem) {
+ autocompleteMap.get(ed).insertingSuggestion = true;
+ insertPopupItem(ed, popup.selectedItem);
+ }
+
+ popup.once("popup-closed", () => {
+ // This event is used in tests.
+ ed.emit("popup-hidden");
+ });
+ popup.hidePopup();
+ return true;
+ }
+
+ // Give each popup a new name to avoid sharing the elements.
+
+ let popup = new AutocompletePopup(win.parent.document, {
+ position: "bottom",
+ autoSelect: true,
+ onClick: insertSelectedPopupItem,
+ });
+
+ const cycle = reverse => {
+ if (popup?.isOpen) {
+ // eslint-disable-next-line mozilla/no-compare-against-boolean-literals
+ cycleSuggestions(ed, reverse == true);
+ return null;
+ }
+
+ return CodeMirror.Pass;
+ };
+
+ let keyMap = {
+ Tab: cycle,
+ Down: cycle,
+ "Shift-Tab": cycle.bind(null, true),
+ Up: cycle.bind(null, true),
+ Enter: () => {
+ const wasHandled = insertSelectedPopupItem();
+ return wasHandled ? true : CodeMirror.Pass;
+ },
+ };
+
+ const autoCompleteCallback = autoComplete.bind(null, ctx);
+ const keypressCallback = onEditorKeypress.bind(null, ctx);
+ keyMap[autocompleteKey] = autoCompleteCallback;
+ cm.addKeyMap(keyMap);
+
+ cm.on("keydown", keypressCallback);
+ ed.on("change", autoCompleteCallback);
+ ed.on("destroy", destroy);
+
+ function destroy() {
+ ed.off("destroy", destroy);
+ cm.off("keydown", keypressCallback);
+ ed.off("change", autoCompleteCallback);
+ cm.removeKeyMap(keyMap);
+ popup.destroy();
+ keyMap = popup = completer = null;
+ autocompleteMap.delete(ed);
+ }
+
+ autocompleteMap.set(ed, {
+ popup: popup,
+ completer: completer,
+ keyMap: keyMap,
+ destroy: destroy,
+ insertingSuggestion: false,
+ suggestionInsertedOnce: false,
+ });
+}
+
+/**
+ * Provides suggestions to autocomplete the current token/word being typed.
+ */
+function autoComplete({ ed, cm }) {
+ const autocompleteOpts = autocompleteMap.get(ed);
+ const { completer, popup } = autocompleteOpts;
+ if (
+ !completer ||
+ autocompleteOpts.insertingSuggestion ||
+ autocompleteOpts.doNotAutocomplete
+ ) {
+ autocompleteOpts.insertingSuggestion = false;
+ return;
+ }
+ const cur = ed.getCursor();
+ completer
+ .complete(cm.getRange({ line: 0, ch: 0 }, cur), cur)
+ .then(suggestions => {
+ if (
+ !suggestions ||
+ !suggestions.length ||
+ suggestions[0].preLabel == null
+ ) {
+ autocompleteOpts.suggestionInsertedOnce = false;
+ popup.once("popup-closed", () => {
+ // This event is used in tests.
+ ed.emit("after-suggest");
+ });
+ popup.hidePopup();
+ return;
+ }
+ // The cursor is at the end of the currently entered part of the token,
+ // like "backgr|" but we need to open the popup at the beginning of the
+ // character "b". Thus we need to calculate the width of the entered part
+ // of the token ("backgr" here).
+
+ const cursorElement = cm.display.cursorDiv.querySelector(
+ ".CodeMirror-cursor"
+ );
+ const left = suggestions[0].preLabel.length * cm.defaultCharWidth();
+ popup.hidePopup();
+ popup.setItems(suggestions);
+
+ popup.once("popup-opened", () => {
+ // This event is used in tests.
+ ed.emit("after-suggest");
+ });
+ popup.openPopup(cursorElement, -1 * left, 0);
+ autocompleteOpts.suggestionInsertedOnce = false;
+ })
+ .catch(console.error);
+}
+
+/**
+ * Inserts a popup item into the current cursor location
+ * in the editor.
+ */
+function insertPopupItem(ed, popupItem) {
+ const { preLabel, text } = popupItem;
+ const cur = ed.getCursor();
+ const textBeforeCursor = ed.getText(cur.line).substring(0, cur.ch);
+ const backwardsTextBeforeCursor = textBeforeCursor
+ .split("")
+ .reverse()
+ .join("");
+ const backwardsPreLabel = preLabel
+ .split("")
+ .reverse()
+ .join("");
+
+ // If there is additional text in the preLabel vs the line, then
+ // just insert the entire autocomplete text. An example:
+ // if you type 'a' and select '#about' from the autocomplete menu,
+ // then the final text needs to the end up as '#about'.
+ if (backwardsPreLabel.indexOf(backwardsTextBeforeCursor) === 0) {
+ ed.replaceText(text, { line: cur.line, ch: 0 }, cur);
+ } else {
+ ed.replaceText(text.slice(preLabel.length), cur, cur);
+ }
+}
+
+/**
+ * Cycles through provided suggestions by the popup in a top to bottom manner
+ * when `reverse` is not true. Opposite otherwise.
+ */
+function cycleSuggestions(ed, reverse) {
+ const autocompleteOpts = autocompleteMap.get(ed);
+ const { popup } = autocompleteOpts;
+ const cur = ed.getCursor();
+ autocompleteOpts.insertingSuggestion = true;
+ if (!autocompleteOpts.suggestionInsertedOnce) {
+ autocompleteOpts.suggestionInsertedOnce = true;
+ let firstItem;
+ if (reverse) {
+ firstItem = popup.getItemAtIndex(popup.itemCount - 1);
+ popup.selectPreviousItem();
+ } else {
+ firstItem = popup.getItemAtIndex(0);
+ if (firstItem.label == firstItem.preLabel && popup.itemCount > 1) {
+ firstItem = popup.getItemAtIndex(1);
+ popup.selectNextItem();
+ }
+ }
+ if (popup.itemCount == 1) {
+ popup.hidePopup();
+ }
+ insertPopupItem(ed, firstItem);
+ } else {
+ const fromCur = {
+ line: cur.line,
+ ch: cur.ch - popup.selectedItem.text.length,
+ };
+ if (reverse) {
+ popup.selectPreviousItem();
+ } else {
+ popup.selectNextItem();
+ }
+ ed.replaceText(popup.selectedItem.text, fromCur, cur);
+ }
+ // This event is used in tests.
+ ed.emit("suggestion-entered");
+}
+
+/**
+ * onkeydown handler for the editor instance to prevent autocompleting on some
+ * keypresses.
+ */
+function onEditorKeypress({ ed, Editor }, cm, event) {
+ const autocompleteOpts = autocompleteMap.get(ed);
+
+ // Do not try to autocomplete with multiple selections.
+ if (ed.hasMultipleSelections()) {
+ autocompleteOpts.doNotAutocomplete = true;
+ autocompleteOpts.popup.hidePopup();
+ return;
+ }
+
+ if (
+ (event.ctrlKey || event.metaKey) &&
+ event.keyCode == KeyCodes.DOM_VK_SPACE
+ ) {
+ // When Ctrl/Cmd + Space is pressed, two simultaneous keypresses are emitted
+ // first one for just the Ctrl/Cmd and second one for combo. The first one
+ // leave the autocompleteOpts.doNotAutocomplete as true, so we have to make
+ // it false
+ autocompleteOpts.doNotAutocomplete = false;
+ return;
+ }
+
+ if (event.ctrlKey || event.metaKey || event.altKey) {
+ autocompleteOpts.doNotAutocomplete = true;
+ autocompleteOpts.popup.hidePopup();
+ return;
+ }
+
+ switch (event.keyCode) {
+ case KeyCodes.DOM_VK_RETURN:
+ autocompleteOpts.doNotAutocomplete = true;
+ break;
+ case KeyCodes.DOM_VK_ESCAPE:
+ if (autocompleteOpts.popup.isOpen) {
+ // Prevent the Console input to open, but still remove the autocomplete popup.
+ autocompleteOpts.doNotAutocomplete = true;
+ autocompleteOpts.popup.hidePopup();
+ event.preventDefault();
+ }
+ break;
+ case KeyCodes.DOM_VK_LEFT:
+ case KeyCodes.DOM_VK_RIGHT:
+ case KeyCodes.DOM_VK_HOME:
+ case KeyCodes.DOM_VK_END:
+ autocompleteOpts.doNotAutocomplete = true;
+ autocompleteOpts.popup.hidePopup();
+ break;
+ case KeyCodes.DOM_VK_BACK_SPACE:
+ case KeyCodes.DOM_VK_DELETE:
+ if (ed.config.mode == Editor.modes.css) {
+ autocompleteOpts.completer.invalidateCache(ed.getCursor().line);
+ }
+ autocompleteOpts.doNotAutocomplete = true;
+ autocompleteOpts.popup.hidePopup();
+ break;
+ default:
+ autocompleteOpts.doNotAutocomplete = false;
+ }
+}
+
+// Export functions
+
+exports.initializeAutoCompletion = initializeAutoCompletion;
diff --git a/chrome/utils/styloaix/edit.css b/chrome/utils/styloaix/edit.css
new file mode 100644
index 0000000..9312e34
--- /dev/null
+++ b/chrome/utils/styloaix/edit.css
@@ -0,0 +1,48 @@
+#styloaix-edit {
+ min-width: 850px;
+}
+#errors {
+ margin: 2px 0px 4px 5px;
+ color: red;
+}
+#errors label {
+ cursor: pointer;
+}
+#internal-code {
+ font-family: monospace;
+ margin-bottom: 0;
+}
+.findbar-closebutton, .findbar-highlight, *[anonid="find-case-sensitive"] {
+ display: none;
+}
+#findbar {
+ border-top: 0;
+}
+.devtools-horizontal-splitter {
+ /* Overriding global.css */
+ height: 3px !important;
+}
+input.devtools-textinput {
+ padding: 4px;
+ margin: 0 6px 0 4px;
+ border: 1px solid ThreeDShadow;
+ -moz-box-flex: 1;
+}
+.devtools-toolbarbutton {
+ border-radius: 2px !important;
+ border: 1px solid rgba(0,0,0,0.3) !important;
+ padding: 1px 5px !important;
+}
+.devtools-separator {
+ margin: 0 5px 0 4px !important;
+}
+.devtools-toolbarbutton[disabled="true"] {
+ opacity: 0.2;
+}
+.update-url-row {
+ display: none;
+}
+#editor-tools {
+ padding: 5px;
+ -moz-box-align: center;
+}
diff --git a/chrome/utils/styloaix/edit.js b/chrome/utils/styloaix/edit.js
new file mode 100644
index 0000000..4ffb36d
--- /dev/null
+++ b/chrome/utils/styloaix/edit.js
@@ -0,0 +1,459 @@
+const { Services } = ChromeUtils.import('resource://gre/modules/Services.jsm');
+const { NetUtil } = ChromeUtils.import('resource://gre/modules/NetUtil.jsm');
+
+let require;
+try {
+ ({ require } = ChromeUtils.import('resource://devtools/shared/loader/Loader.jsm'));
+} catch (e) {
+ // tb91
+ ({ require } = ChromeUtils.import('resource://devtools/shared/Loader.jsm'));
+}
+
+docShell.cssErrorReportingEnabled = true;
+
+function require_mini (m) {
+ let scope = {
+ exports: {}
+ };
+ Services.scriptloader.loadSubScript('chrome://' + m + '.js', scope);
+ return scope.exports;
+};
+
+let url;
+let type;
+let id;
+let style;
+
+if (isChromeWindow) {
+ let params = window.arguments[0];
+ url = params.url;
+ type = params.type;
+ id = params.id;
+} else {
+ let params = new URLSearchParams(location.search);
+ url = params.get('url');
+ type = params.get('type');
+ id = params.get('id');
+}
+
+origin = 2;
+let lastOrigin;
+let unsaved = false;
+let previewCode;
+let previewOrigin;
+let previewActive = false;
+let isInstantPreview;
+let isInstantCheck;
+let timeoutRunning = false;
+let interval;
+let nameE;
+let initialCode = '';
+let sourceEditor;
+
+function init () {
+ if (id)
+ style = UC.styloaix.styles.get(id);
+ if (style) {
+ origin = style.type;
+ NetUtil.asyncFetch(
+ {
+ uri: style.url,
+ loadingNode: document,
+ securityFlags: Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_INHERITS_SEC_CONTEXT || Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_DATA_INHERITS,
+ contentPolicyType: Ci.nsIContentPolicy.TYPE_OTHER,
+ },
+ async function (stream) {
+ const bstream = Cc['@mozilla.org/binaryinputstream;1'].createInstance(Ci.nsIBinaryInputStream);
+ bstream.setInputStream(stream);
+
+ try {
+ initialCode = bstream.readBytes(bstream.available());
+ } catch {}
+
+ stream.close();
+
+ try {
+ const converter = Cc['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Ci.nsIScriptableUnicodeConverter);
+ converter.charset = 'utf-8';
+ initialCode = converter.ConvertToUnicode(initialCode);
+ } catch {}
+
+ initEditor();
+ }
+ );
+ } else {
+ if (url)
+ initialCode = '@-moz-document ' + type + '("' + url + '") {\n\n\n}';
+ initEditor();
+ }
+
+ nameE = document.getElementById('name');
+ nameE.value = style?.name || '';
+ updateTitle();
+ nameE.addEventListener('input', function () {
+ unsaved = true;
+ toggleUI('save-button', true);
+ });
+
+ document.getElementById('origin').value = origin;
+
+ document.getElementById('errors').addEventListener('click', function (e) {
+ if (e.target == this)
+ this.style.display = 'none';
+ });
+
+ isInstantPreview = xPref.get(UC.styloaix.PREF_INSTANTPREVIEW);
+ document.getElementById('instant-preview').checked = isInstantPreview;
+ isInstantCheck = xPref.get(UC.styloaix.PREF_INSTANTCHECK);
+ document.getElementById('instant-check').checked = isInstantCheck;
+ if (style?.enabled === false)
+ toggleUI('preview-button', true);
+ interval = xPref.get(UC.styloaix.PREF_INSTANTINTERVAL);
+ xPref.addListener(UC.styloaix.PREF_INSTANTINTERVAL, function (ms) {
+ interval = ms;
+ });
+}
+
+function initEditor () {
+ const Editor = require('devtools/client/shared/sourceeditor/editor');
+
+ const extraKeys = {
+ [Editor.accel('S')]: save,
+ 'F3': 'findNext',
+ 'Shift-F3': 'findPrev'
+ };
+
+ const lineWrapping = xPref.get(UC.styloaix.PREF_LINEWRAPPING);
+ document.getElementById('wrap-lines').checked = lineWrapping;
+
+ sourceEditor = new Editor({
+ mode: Editor.modes.css,
+ contextMenu: 'sourceEditorContextMenu',
+ extraKeys: extraKeys,
+ lineNumbers: true,
+ lineWrapping: lineWrapping,
+ value: initialCode,
+ maxHighlightLength: 10000
+ });
+
+ sourceEditor.setupAutoCompletion = function () {
+ this.extend(require_mini('userchromejs/content/styloaix/autocomplete'));
+ this.initializeAutoCompletion();
+ };
+
+ document.getElementById('editor').selectedIndex = 1;
+
+ sourceEditor.appendTo(document.getElementById('sourceeditor')).then(function () {
+ sourceEditor.insertCommandsController();
+ sourceEditor.focus();
+ if (isInstantCheck)
+ checkForErrors();
+ });
+
+ sourceEditor.on('change', function () {
+ changed();
+ if (!isInstantCheck)
+ toggleUI('check-for-errors-button', true);
+ });
+}
+
+function changed () {
+ if ((isInstantPreview || isInstantCheck) && !timeoutRunning)
+ instantTimeout();
+
+ unsaved = true;
+ toggleUI('save-button', true);
+ if (!isInstantPreview)
+ toggleUI('preview-button', true);
+}
+
+function instantTimeout () {
+ timeoutRunning = true;
+ setTimeout(() => {
+ if (isInstantPreview) {
+ if (previewActive)
+ _uc.sss.unregisterSheet(previewCode, previewOrigin);
+ else if (style?.enabled)
+ style.unregister();
+ previewCode = Services.io.newURI('data:text/css;charset=UTF-8,' + encodeURIComponent(codeElementWrapper.value));
+ previewOrigin = origin;
+ previewActive = true;
+ _uc.sss.loadAndRegisterSheet(previewCode, previewOrigin);
+ toggleUI('preview-button', false);
+ if (origin === _uc.sss.AGENT_SHEET || lastOrigin === _uc.sss.AGENT_SHEET) {
+ lastOrigin = origin;
+ UC.styloaix.forceRefresh();
+ }
+ }
+ if (isInstantCheck)
+ checkForErrors();
+ timeoutRunning = false;
+ }, interval)
+}
+
+function save () {
+ if (!nameE.value)
+ return alert('Style name must not be empty.');
+
+ if (style)
+ style.unregister();
+
+ const finalTitle = nameE.value + (origin == 0 ? '.as' : origin == 1 ? '.us' : '') + '.css';
+ const file = UC.styloaix.CSSDIR.clone();
+ file.append(finalTitle);
+ if (!file.exists())
+ file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o666);
+
+ const ostream = Cc['@mozilla.org/network/file-output-stream;1'].createInstance(Ci.nsIFileOutputStream);
+ ostream.init(file, -1, -1, 0);
+
+ const converter = Cc['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Ci.nsIScriptableUnicodeConverter);
+ converter.charset = 'UTF-8';
+
+ const istream = converter.convertToInputStream(codeElementWrapper.value);
+
+ NetUtil.asyncCopy(istream, ostream, function (aResult) {
+ if (Components.isSuccessCode(aResult)) {
+ const enabled = style ? style.enabled : true;
+
+ if (style && finalTitle != style.fullName) {
+ const oldFile = UC.styloaix.CSSDIR.clone()
+ oldFile.append(style.fullName);
+ oldFile.remove(false);
+ UC.styloaix.styles.delete(style.fullName);
+ if (!enabled) {
+ UC.styloaix.disabledStyles.add(finalTitle);
+ UC.styloaix.disabledStyles.delete(oldFile.leafName);
+ }
+ }
+
+ style = new UC.styloaix.UserStyle(file);
+ style.enabled = enabled;
+ updateTitle();
+ UC.styloaix.styles.set(style.fullName, style);
+ if (UC.styloaix.enabled && enabled) {
+ style.register();
+ toggleUI('preview-button', false);
+ if (previewActive) {
+ _uc.sss.unregisterSheet(previewCode, previewOrigin);
+ previewActive = false;
+ if (origin === _uc.sss.AGENT_SHEET || lastOrigin === _uc.sss.AGENT_SHEET)
+ UC.styloaix.forceRefresh();
+ }
+ }
+
+ unsaved = false;
+
+ toggleUI('save-button', false);
+ } else {
+ alert('Error!');
+ }
+ })
+
+ sourceEditor.focus();
+}
+
+function updateTitle () {
+ document.title = (style?.fullName || 'New Style') + ' - StyloaiX Editor';
+}
+
+function toggleUI (id, state) {
+ document.getElementById(id).disabled = !state;
+}
+
+function preview () {
+ if (previewActive)
+ _uc.sss.unregisterSheet(previewCode, previewOrigin);
+ else if (style?.enabled)
+ style.unregister();
+ previewCode = Services.io.newURI('data:text/css;charset=UTF-8,' + encodeURIComponent(codeElementWrapper.value));
+ previewOrigin = origin;
+ _uc.sss.loadAndRegisterSheet(previewCode, previewOrigin);
+ previewActive = true;
+ if (origin === _uc.sss.AGENT_SHEET || lastOrigin === _uc.sss.AGENT_SHEET) {
+ lastOrigin = origin;
+ UC.styloaix.forceRefresh();
+ }
+
+ checkForErrors();
+ toggleUI('preview-button', false);
+ sourceEditor.focus();
+}
+
+function checkForErrors () {
+ const errors = document.getElementById('errors');
+ errors.style.display = 'none';
+
+ while (errors.hasChildNodes())
+ errors.lastChild.remove();
+
+ let count = 0;
+
+ const errorListener = {
+ observe: (message) => {
+ if (!count)
+ errors.style.display = 'block';
+
+ const error = message.QueryInterface(Ci.nsIScriptError);
+ const errMsg = error.lineNumber + ':' + error.columnNumber + ' - ' + error.errorMessage;
+
+ const label = document.createElement('label');
+ label.appendChild(document.createTextNode(errMsg));
+ label.addEventListener('click', function () {
+ goToLine(error.lineNumber, error.columnNumber);
+ });
+ errors.appendChild(label);
+ errors.appendChild(document.createElement('br'));
+ count++;
+
+ if (count == 10) {
+ errors.appendChild(document.createTextNode('...'));
+ Services.console.unregisterListener(this);
+ }
+ }
+ }
+
+ Services.console.registerListener(errorListener);
+
+ const styleEl = document.createElement('style');
+ styleEl.appendChild(document.createTextNode(codeElementWrapper.value));
+ document.documentElement.appendChild(styleEl);
+ styleEl.remove();
+
+ setTimeout(() => {
+ if (count < 10)
+ Services.console.unregisterListener(errorListener);
+ });
+
+ toggleUI('check-for-errors-button', false);
+ sourceEditor.focus();
+}
+
+function goToLine (line, col) {
+ sourceEditor.focus();
+ sourceEditor.setCursor({line: line - 1, ch: col});
+}
+
+function insertCodeAtStart (snippet) {
+ let position = codeElementWrapper.value.indexOf(snippet);
+ if (position == -1) {
+ codeElementWrapper.value = snippet + '\n' + codeElementWrapper.value;
+ position = 0;
+ }
+ const positionEnd = position + snippet.length;
+
+ codeElementWrapper.setSelectionRange(positionEnd, positionEnd);
+ sourceEditor.focus();
+}
+
+function insertCodeAtCaret (snippet) {
+ const selectionStart = codeElementWrapper.selectionStart;
+ const selectionEnd = selectionStart + snippet.length;
+ codeElementWrapper.value = codeElementWrapper.value.substring(0, codeElementWrapper.selectionStart) + snippet + codeElementWrapper.value.substring(codeElementWrapper.selectionEnd, codeElementWrapper.value.length);
+ codeElementWrapper.setSelectionRange(selectionEnd, selectionEnd);
+ sourceEditor.focus();
+}
+
+function changeWordWrap (bool, persist) {
+ if (persist)
+ xPref.set(UC.styloaix.PREF_LINEWRAPPING, bool);
+ sourceEditor.setOption('lineWrapping', bool);
+ sourceEditor.focus();
+}
+
+function instantPreview (bool, persist) {
+ if (persist)
+ xPref.set(UC.styloaix.PREF_INSTANTPREVIEW, bool);
+ isInstantPreview = bool
+ if (isInstantPreview && !timeoutRunning)
+ instantTimeout();
+
+ sourceEditor.focus();
+}
+
+function instantCheck (bool, persist) {
+ if (persist)
+ xPref.set(UC.styloaix.PREF_INSTANTCHECK, bool);
+ isInstantCheck = bool
+ if (isInstantCheck && !timeoutRunning)
+ instantTimeout();
+
+ sourceEditor.focus();
+}
+
+function insertDataURI() {
+ const fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker);
+ fp.init(window, 'Choose File…', Ci.nsIFilePicker.modeOpen);
+ fp.open(res => {
+ if (res != Ci.nsIFilePicker.returnOK)
+ return;
+
+ const contentType = Cc['@mozilla.org/mime;1'].getService(Ci.nsIMIMEService).getTypeFromFile(fp.file);
+ const inputStream = Cc['@mozilla.org/network/file-input-stream;1'].createInstance(Ci.nsIFileInputStream);
+ inputStream.init(fp.file, parseInt('01', 16), parseInt('0600', 8), 0);
+ const stream = Cc['@mozilla.org/binaryinputstream;1'].createInstance(Ci.nsIBinaryInputStream);
+ stream.setInputStream(inputStream);
+ const encoded = btoa(stream.readBytes(stream.available()));
+ stream.close();
+ inputStream.close();
+ insertCodeAtCaret('data:' + contentType + ';base64,' + encoded);
+ });
+}
+
+const codeElementWrapper = {
+ get value() {
+ return sourceEditor.getText();
+ },
+
+ set value(v) {
+ sourceEditor.setText(v);
+ },
+
+ setSelectionRange: function (start, end) {
+ sourceEditor.setSelection(sourceEditor.getPosition(start), sourceEditor.getPosition(end));
+ },
+
+ get selectionStart() {
+ return sourceEditor.getOffset(sourceEditor.getCursor('start'));
+ },
+
+ get selectionEnd() {
+ return sourceEditor.getOffset(sourceEditor.getCursor('end'));
+ },
+
+}
+
+const closeFn = window.close;
+let shouldHandle = true;
+
+if (isChromeWindow) {
+ window.close = function () {
+ if (!unsaved || confirm('Do you want to close and lose unsaved changes?')) {
+ shouldHandle = false;
+ setTimeout(closeFn);
+ }
+ }
+}
+
+window.addEventListener('close', function (e) {
+ e.preventDefault();
+ window.close();
+})
+
+window.addEventListener('beforeunload', function (e) {
+ if (shouldHandle && unsaved)
+ e.preventDefault();
+});
+
+window.addEventListener('unload', function (event) {
+ if (previewActive) {
+ _uc.sss.unregisterSheet(previewCode, previewOrigin);
+ if (origin === _uc.sss.AGENT_SHEET || lastOrigin === _uc.sss.AGENT_SHEET)
+ UC.styloaix.forceRefresh();
+ }
+
+ if (style?.enabled && previewActive)
+ style.register();
+});
+
+window.addEventListener('DOMContentLoaded', init, {once: true});
diff --git a/chrome/utils/styloaix/edit.xhtml b/chrome/utils/styloaix/edit.xhtml
new file mode 100644
index 0000000..3af3830
--- /dev/null
+++ b/chrome/utils/styloaix/edit.xhtml
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/chrome/utils/userChrome.jsm b/chrome/utils/userChrome.jsm
new file mode 100644
index 0000000..44d871b
--- /dev/null
+++ b/chrome/utils/userChrome.jsm
@@ -0,0 +1,222 @@
+let EXPORTED_SYMBOLS = [];
+
+const Services = globalThis.Services || ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
+const { xPref } = ChromeUtils.import('chrome://userchromejs/content/xPref.jsm');
+const { Management } = ChromeUtils.import('resource://gre/modules/Extension.jsm');
+const { AppConstants } = ChromeUtils.import('resource://gre/modules/AppConstants.jsm');
+
+let UC = {
+ webExts: new Map(),
+ sidebar: new Map()
+};
+
+let _uc = {
+ ALWAYSEXECUTE: 'rebuild_userChrome.uc.js',
+ BROWSERCHROME: AppConstants.MOZ_APP_NAME == 'thunderbird' ? 'chrome://messenger/content/messenger.xhtml' : 'chrome://browser/content/browser.xhtml',
+ BROWSERTYPE: AppConstants.MOZ_APP_NAME == 'thunderbird' ? 'mail:3pane' : 'navigator:browser',
+ BROWSERNAME: AppConstants.MOZ_APP_NAME.charAt(0).toUpperCase() + AppConstants.MOZ_APP_NAME.slice(1),
+ PREF_ENABLED: 'userChromeJS.enabled',
+ PREF_SCRIPTSDISABLED: 'userChromeJS.scriptsDisabled',
+
+ chromedir: Services.dirsvc.get('UChrm', Ci.nsIFile),
+ scriptsDir: '',
+
+ sss: Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService),
+
+ getScripts: function () {
+ this.scripts = {};
+ let files = this.chromedir.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
+ while (files.hasMoreElements()) {
+ let file = files.getNext().QueryInterface(Ci.nsIFile);
+ if (/\.uc\.js$/i.test(file.leafName)) {
+ _uc.getScriptData(file);
+ }
+ }
+ },
+
+ getScriptData: function (aFile) {
+ let aContent = this.readFile(aFile);
+ let header = (aContent.match(/^\/\/ ==UserScript==\s*\n(?:.*\n)*?\/\/ ==\/UserScript==\s*\n/m) || [''])[0];
+ let match, rex = {
+ include: [],
+ exclude: []
+ };
+ let findNextRe = /^\/\/ @(include|exclude)\s+(.+)\s*$/gm;
+ while ((match = findNextRe.exec(header))) {
+ rex[match[1]].push(match[2].replace(/^main$/i, _uc.BROWSERCHROME).replace(/\*/g, '.*?'));
+ }
+ if (!rex.include.length) {
+ rex.include.push(_uc.BROWSERCHROME);
+ }
+ let exclude = rex.exclude.length ? '(?!' + rex.exclude.join('$|') + '$)' : '';
+
+ let def = ['', ''];
+ let author = (header.match(/\/\/ @author\s+(.+)\s*$/im) || def)[1];
+ let filename = aFile.leafName || '';
+
+ return this.scripts[filename] = {
+ filename: filename,
+ file: aFile,
+ url: Services.io.getProtocolHandler('file').QueryInterface(Ci.nsIFileProtocolHandler).getURLSpecFromDir(this.chromedir) + filename,
+ name: (header.match(/\/\/ @name\s+(.+)\s*$/im) || def)[1],
+ description: (header.match(/\/\/ @description\s+(.+)\s*$/im) || def)[1],
+ version: (header.match(/\/\/ @version\s+(.+)\s*$/im) || def)[1],
+ author: (header.match(/\/\/ @author\s+(.+)\s*$/im) || def)[1],
+ regex: new RegExp('^' + exclude + '(' + (rex.include.join('|') || '.*') + ')$', 'i'),
+ id: (header.match(/\/\/ @id\s+(.+)\s*$/im) || ['', filename.split('.uc.js')[0] + '@' + (author || 'userChromeJS')])[1],
+ homepageURL: (header.match(/\/\/ @homepageURL\s+(.+)\s*$/im) || def)[1],
+ downloadURL: (header.match(/\/\/ @downloadURL\s+(.+)\s*$/im) || def)[1],
+ updateURL: (header.match(/\/\/ @updateURL\s+(.+)\s*$/im) || def)[1],
+ optionsURL: (header.match(/\/\/ @optionsURL\s+(.+)\s*$/im) || def)[1],
+ startup: (header.match(/\/\/ @startup\s+(.+)\s*$/im) || def)[1],
+ shutdown: (header.match(/\/\/ @shutdown\s+(.+)\s*$/im) || def)[1],
+ onlyonce: /\/\/ @onlyonce\b/.test(header),
+ isRunning: false,
+ get isEnabled() {
+ return (xPref.get(_uc.PREF_SCRIPTSDISABLED) || '').split(',').indexOf(this.filename) == -1;
+ }
+ }
+ },
+
+ readFile: function (aFile, metaOnly = false) {
+ let stream = Cc['@mozilla.org/network/file-input-stream;1'].createInstance(Ci.nsIFileInputStream);
+ stream.init(aFile, 0x01, 0, 0);
+ let cvstream = Cc['@mozilla.org/intl/converter-input-stream;1'].createInstance(Ci.nsIConverterInputStream);
+ cvstream.init(stream, 'UTF-8', 1024, Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
+ let content = '',
+ data = {};
+ while (cvstream.readString(4096, data)) {
+ content += data.value;
+ if (metaOnly && content.indexOf('// ==/UserScript==') > 0) {
+ break;
+ }
+ }
+ cvstream.close();
+ return content.replace(/\r\n?/g, '\n');
+ },
+
+ everLoaded: [],
+
+ loadScript: function (script, win) {
+ if (!script.regex.test(win.location.href) || (script.filename != this.ALWAYSEXECUTE && !script.isEnabled)) {
+ return;
+ }
+
+ if (script.onlyonce && script.isRunning) {
+ if (script.startup) {
+ eval(script.startup);
+ }
+ return;
+ }
+
+ try {
+ Services.scriptloader.loadSubScript(script.url + '?' + script.file.lastModifiedTime,
+ script.onlyonce ? { window: win } : win);
+ script.isRunning = true;
+ if (script.startup) {
+ eval(script.startup);
+ }
+ if (!script.shutdown) {
+ this.everLoaded.push(script.id);
+ }
+ } catch (ex) {
+ Cu.reportError(ex);
+ }
+ },
+
+ windows: function (fun, onlyBrowsers = true) {
+ let windows = Services.wm.getEnumerator(onlyBrowsers ? this.BROWSERTYPE : null);
+ while (windows.hasMoreElements()) {
+ let win = windows.getNext();
+ if (!win._uc)
+ continue;
+ if (!onlyBrowsers) {
+ let frames = win.docShell.getAllDocShellsInSubtree(Ci.nsIDocShellTreeItem.typeAll, Ci.nsIDocShell.ENUMERATE_FORWARDS);
+ let res = frames.some(frame => {
+ let fWin = frame.domWindow;
+ let {document, location} = fWin;
+ if (fun(document, fWin, location))
+ return true;
+ });
+ if (res)
+ break;
+ } else {
+ let {document, location} = win;
+ if (fun(document, win, location))
+ break;
+ }
+ }
+ },
+
+ createElement: function (doc, tag, atts, XUL = true) {
+ let el = XUL ? doc.createXULElement(tag) : doc.createElement(tag);
+ for (let att in atts) {
+ el.setAttribute(att, atts[att]);
+ }
+ return el
+ }
+};
+
+if (xPref.get(_uc.PREF_ENABLED) === undefined) {
+ xPref.set(_uc.PREF_ENABLED, true, true);
+}
+
+if (xPref.get(_uc.PREF_SCRIPTSDISABLED) === undefined) {
+ xPref.set(_uc.PREF_SCRIPTSDISABLED, '', true);
+}
+
+let UserChrome_js = {
+ observe: function (aSubject) {
+ aSubject.addEventListener('DOMContentLoaded', this, {once: true});
+ },
+
+ handleEvent: function (aEvent) {
+ let document = aEvent.originalTarget;
+ let window = document.defaultView;
+ let location = window.location;
+
+ if (!this.sharedWindowOpened && location.href == 'chrome://extensions/content/dummy.xhtml') {
+ this.sharedWindowOpened = true;
+
+ Management.on('extension-browser-inserted', function (topic, browser) {
+ browser.messageManager.addMessageListener('Extension:ExtensionViewLoaded', this.messageListener.bind(this));
+ }.bind(this));
+ } else if (/^(chrome:(?!\/\/global\/content\/commonDialog\.x?html)|about:(?!blank))/i.test(location.href)) {
+ window.UC = UC;
+ window._uc = _uc;
+ window.xPref = xPref;
+ if (window._gBrowser) // bug 1443849
+ window.gBrowser = window._gBrowser;
+
+ if (xPref.get(_uc.PREF_ENABLED)) {
+ Object.values(_uc.scripts).forEach(script => {
+ _uc.loadScript(script, window);
+ });
+ } else if (!UC.rebuild) {
+ _uc.loadScript(_uc.scripts[_uc.ALWAYSEXECUTE], window);
+ }
+ }
+ },
+
+ messageListener: function (msg) {
+ const browser = msg.target;
+ const { addonId } = browser._contentPrincipal;
+
+ browser.messageManager.removeMessageListener('Extension:ExtensionViewLoaded', this.messageListener);
+
+ if (browser.ownerGlobal.location.href == 'chrome://extensions/content/dummy.xhtml') {
+ UC.webExts.set(addonId, browser);
+ Services.obs.notifyObservers(null, 'UCJS:WebExtLoaded', addonId);
+ } else {
+ let win = browser.ownerGlobal.windowRoot.ownerGlobal;
+ UC.sidebar.get(addonId)?.set(win, browser) || UC.sidebar.set(addonId, new Map([[win, browser]]));
+ Services.obs.notifyObservers(win, 'UCJS:SidebarLoaded', addonId);
+ }
+ }
+};
+
+if (!Services.appinfo.inSafeMode) {
+ _uc.chromedir.append(_uc.scriptsDir);
+ _uc.getScripts();
+ Services.obs.addObserver(UserChrome_js, 'chrome-document-global-created', false);
+}
diff --git a/chrome/utils/xPref.jsm b/chrome/utils/xPref.jsm
new file mode 100644
index 0000000..5cbf7cb
--- /dev/null
+++ b/chrome/utils/xPref.jsm
@@ -0,0 +1,94 @@
+let EXPORTED_SYMBOLS = ['xPref'];
+
+const Services = globalThis.Services || ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
+
+var xPref = {
+ // Retorna o valor da preferência, seja qual for o tipo, mas não
+ // testei com tipos complexos como nsIFile, não sei como detectar
+ // uma preferência assim, na verdade nunca vi uma
+ get: function (prefPath, def = false, valueIfUndefined, setDefault = true) {
+ let sPrefs = def ?
+ Services.prefs.getDefaultBranch(null) :
+ Services.prefs;
+
+ try {
+ switch (sPrefs.getPrefType(prefPath)) {
+ case 0:
+ if (valueIfUndefined != undefined)
+ return this.set(prefPath, valueIfUndefined, setDefault);
+ else
+ return undefined;
+ case 32:
+ return sPrefs.getStringPref(prefPath);
+ case 64:
+ return sPrefs.getIntPref(prefPath);
+ case 128:
+ return sPrefs.getBoolPref(prefPath);
+ }
+ } catch (ex) {
+ return undefined;
+ }
+ return;
+ },
+
+ set: function (prefPath, value, def = false) {
+ let sPrefs = def ?
+ Services.prefs.getDefaultBranch(null) :
+ Services.prefs;
+
+ switch (typeof value) {
+ case 'string':
+ return sPrefs.setStringPref(prefPath, value) || value;
+ case 'number':
+ return sPrefs.setIntPref(prefPath, value) || value;
+ case 'boolean':
+ return sPrefs.setBoolPref(prefPath, value) || value;
+ }
+ return;
+ },
+
+ lock: function (prefPath, value) {
+ let sPrefs = Services.prefs;
+ this.lockedBackupDef[prefPath] = this.get(prefPath, true);
+ if (sPrefs.prefIsLocked(prefPath))
+ sPrefs.unlockPref(prefPath);
+
+ this.set(prefPath, value, true);
+ sPrefs.lockPref(prefPath);
+ },
+
+ lockedBackupDef: {},
+
+ unlock: function (prefPath) {
+ Services.prefs.unlockPref(prefPath);
+ let bkp = this.lockedBackupDef[prefPath];
+ if (bkp == undefined)
+ Services.prefs.deleteBranch(prefPath);
+ else
+ this.set(prefPath, bkp, true);
+ },
+
+ clear: Services.prefs.clearUserPref,
+
+ // Detecta mudanças na preferência e retorna:
+ // return[0]: valor da preferência alterada
+ // return[1]: nome da preferência alterada
+ // Guardar chamada numa var se quiser interrompê-la depois
+ addListener: function (prefPath, trat) {
+ this.observer = function (aSubject, aTopic, prefPath) {
+ return trat(xPref.get(prefPath), prefPath);
+ }
+
+ Services.prefs.addObserver(prefPath, this.observer);
+ return {
+ prefPath: prefPath,
+ observer: this.observer
+ };
+ },
+
+ // Encerra pref observer
+ // Só precisa passar a var definida quando adicionou
+ removeListener: function (obs) {
+ Services.prefs.removeObserver(obs.prefPath, obs.observer);
+ }
+}
diff --git a/ffroot/browser/chrome/icons/default/_main-window.ico b/ffroot/browser/chrome/icons/default/_main-window.ico
new file mode 100644
index 0000000..dd52a9c
Binary files /dev/null and b/ffroot/browser/chrome/icons/default/_main-window.ico differ
diff --git a/ffroot/browser/chrome/icons/default/main-window.ico b/ffroot/browser/chrome/icons/default/main-window.ico
new file mode 100644
index 0000000..a80fe62
Binary files /dev/null and b/ffroot/browser/chrome/icons/default/main-window.ico differ
diff --git a/ffroot/config.js b/ffroot/config.js
new file mode 100644
index 0000000..d2c47d0
--- /dev/null
+++ b/ffroot/config.js
@@ -0,0 +1,34 @@
+// skip 1st line
+lockPref("xpinstall.signatures.required", false);
+lockPref("extensions.install_origins.enabled", false);
+
+try {
+ const cmanifest = Cc["@mozilla.org/file/directory_service;1"]
+ .getService(Ci.nsIProperties)
+ .get("UChrm", Ci.nsIFile);
+ cmanifest.append("utils");
+ cmanifest.append("chrome.manifest");
+ Components.manager
+ .QueryInterface(Ci.nsIComponentRegistrar)
+ .autoRegister(cmanifest);
+
+ const objRef = ChromeUtils.import(
+ "resource://gre/modules/addons/AddonSettings.jsm"
+ );
+ const temp = Object.assign(
+ {},
+ Object.getOwnPropertyDescriptors(objRef.AddonSettings),
+ {
+ REQUIRE_SIGNING: { value: false },
+ }
+ );
+ objRef.AddonSettings = Object.defineProperties({}, temp);
+} catch (err) {}
+
+try {
+ Cu.import("chrome://userchromejs/content/BootstrapLoader.jsm");
+} catch (err) {}
+
+try {
+ Cu.import("chrome://userchromejs/content/userChrome.jsm");
+} catch (err) {}
diff --git a/ffroot/defaults/pref/channel-prefs.js b/ffroot/defaults/pref/channel-prefs.js
new file mode 100644
index 0000000..a545242
--- /dev/null
+++ b/ffroot/defaults/pref/channel-prefs.js
@@ -0,0 +1,9 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+//
+// This pref is in its own file for complex reasons. See the comment in
+// browser/app/Makefile.in, bug 756325, and bug 1431342 for details. Do not add
+// other prefs to this file.
+
+pref("app.update.channel", "aurora");
diff --git a/ffroot/defaults/pref/config-prefs.js b/ffroot/defaults/pref/config-prefs.js
new file mode 100644
index 0000000..65ff8af
--- /dev/null
+++ b/ffroot/defaults/pref/config-prefs.js
@@ -0,0 +1,3 @@
+pref("general.config.obscure_value", 0);
+pref("general.config.filename", "config.js");
+pref("general.config.sandbox_enabled", false);
\ No newline at end of file