-
Notifications
You must be signed in to change notification settings - Fork 22
/
additional_top_toolbars.uc.js
148 lines (120 loc) · 6.04 KB
/
additional_top_toolbars.uc.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// 'Additional top toolbars' script for Firefox 60+ by Aris
// - "number_of_additional_top_toolbars": set the amount of additional top toolbar
// - "tb_label": set a toolbar name
// - use toolbar[id^="additional_top_toolbar"] {...} to affect all toolbars at once in CSS
// [!] Fix for WebExtensions with own windows by 黒仪大螃蟹 (for 1-N scripts)
//
// workaround on Fx 71 to save/restore toolbar visibility
// creating an observer array always fails, so observers are created manually atm.
Components.utils.import("resource:///modules/CustomizableUI.jsm");
ChromeUtils.importESModule("resource:///modules/CustomizableUI.sys.mjs");
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 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 = "Top Toolbar";
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");
toptoolbar.setAttribute("id", "additional_top_toolbar"+i+"");
toptoolbar.setAttribute("toolbarname", tb_label+" ("+i+")");
toptoolbar.setAttribute("toolbarname", tb_label+" ("+i+")");
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");
toptoolbar.setAttribute("accesskey","");
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);
}
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);
});
});
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);
});
});
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){}
}
}
/* initialization delay workaround */
document.addEventListener("DOMContentLoaded", AdditionalTopToolbars.init(), false);
// not needed anymore, but just in case someone prefers initialization that way
/*
setTimeout(function(){
AdditionalTopToolbars.init();
},500);
*/