Hallo omar1979
Ich habe da diese Version in den Asiatischen Tiefen gefunden.
Die müsste eine frei verschiebbare Schaltfläche haben.
Aber ob die überhaupt funktioniert kann ich nicht sagen.
Edit: funktioniert hier leider nicht.
Falls Du mal testen möchtest:
JavaScript
// ==UserScript==
// @name ExtrasConfigMenuPlus.uc.js
// @include main
// @charset UTF-8
// @note extras_config_menu.uc.js から機能削減+α
// @note ボタンを右クリックで再起動、 中クリックでabout:configを開く
// @note スクリプトの有効無効を切り替えるコードはalice0775氏のrebuild_userChrome.uc.xulから拝借
// @version 2.0.6 ボタン右クリックでの「再起動」が機能していない問題を修正
// @version 2.0.5 Fx72betaでも
// @version 2.0.4 Fx65以降に対応
// @version 2.0.3 Fx65以降に対応? scriptファイル名の拡張子を非表示固定に変更
// @version 2.0.2 Fx57以降に対応 コンテキストメニュー形式を廃止、ボタンを自由に配置できるように変更
// @version 2.0.1 Fx47以降でアイコン右クリックによる再起動ができなくなっていたのを修正
// @version 2.0.0 スクラッチパッドをエディタにする機能を廃止、Fx44以降で再起動できなくなっていたのを修正
// ==/UserScript==
/*
■ edit & open関数について
ファイルを編集する場合は'edit'関数を使う
ファイルやフォルダを開く場合は'open'関数を使う
真偽値を切り替える場合は'toggle'関数を使う
各関数の第一引数は基点にするフォルダを指定する
0 = chrome
1 = profile
2 = C:\WINDOWS
3 = C:\Program Files またはC:\Program Files (x86)
4 = 第2引数にフルパスを書く場合 ※パスの区切り文字は\\\\にする
'C' = Cドライブ
'D' = Dドライブ
第2引数は第1引数で指定した基点フォルダにあるファイルかフォルダ名を指定する
[]で囲むのとファイル(フォルダ)名を''で括るのを忘れずに
■ profileフォルダ内のprefs.jsを編集する例
ECM.edit(1, ['prefs.js'])
■ chromeフォルダを開く例
ECM.open(0)
■ firefoxを起動する例(第3引数のパラメータは省略可)
ECM.open(3, ['Mozilla Firefox', 'firefox.exe'], '-no-remote')
■ javascriptの有効無効を切り替える例
ECM.toggle('javascript.enabled')
*/
(function () {
'use strict';
const Preferences = Cu.import("resource://gre/modules/Preferences.jsm", {}).Preferences;
window.ECM = {
editor: 1,
// 1 = view_source.editor.pathに設定したエディタ
// エディタへのフルパスを記述すればそのエディタを使う ※パスを''で囲い\は\\に置き換える
itemLength: null,
init: function () {
try {
CustomizableUI.createWidget({
id: 'ExtrasConfigMenu',
type: 'custom',
onBuild: function(aDocument) {
var toolbaritem = aDocument.createXULElement('toolbarbutton');
var attributes = {
id: 'ExtrasConfigMenu',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
type: 'menu',
label: 'Extras Config Menu',
image: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACnElEQVR4Xm2RzYtbZRSHn/fr3pvJzTB3qiNM2k2pMBUGhEHaqsUqdeFGQalCobgREaFu/B/cqCtxVSjoQhBEQRBmIfWDKgNGJUPt0Nhah9JJ4iSd5E6+bu5972tAO4SS5/DjXZ1znsMrNiq1eikMQqYYJCmjxNH5+zdW777L0J5KKl9VPmnf+ut9KWkwhbheuzNcOVYOmGKc5iRO0r1ykeXCx0h7kt4fC3z5wfqbQnAJwQHa5S7jAZSRuJ0mkf81cheobhBXZa+ri1uptQjHAZoZCEC1PiPgDuwxCfwerBU7b73zXn//3usCcdt4HkZ7SGZg431U51NUCgwlO3cV/bVXhR/6p9ut+nP9QYeNn7/n8qUPZxvQ/Q6VVWHk4ZqWRvlJjpx9hcGfW2wO95N2q8m3618A2WwDt/0RplSAXsBed57eyossHl5GYdHacG3zGpADM06wjQ1UUIN+CLHPvfAxojPnKLiE+bDE1R9+5GatAmgPeGCAteQ7l5GBhGSyuROyd/gFouUyWkqEErR2mwXAAA8BRS0AgMQBjSra30ZkEeDzz9Dn4ZcvMO51SMcJcTdGChmA0ABA6cAgzyG3I8jLEBylV4fWoaeIc0V7t0Uv7pFbC+CA+28mp/8+SwXKnMVmz1O9HpE+eobMZdjcoY1GIHD/NwIdoH1fBaNguzlg88pVyoUi4vTbFI8eJxsNAIfSkrliESllH/L0v0jktNNomFGv1TFrL3Fo9QSMR3jaEEXzLC09gjaKp595No0WjyCEB4zRclICUMDxtRMce/wJ1MIi2SglXShhfI/cOjxPoZRmbq4gXzt/gVrtBrdvbiG+Wf+p/mvll1BpiVAGhCDPxuAUDotz4HKHlIJON6bRbL4hhPjcMx5mkn8BBLEUrsVZbq0AAAAASUVORK5CYII=',
tooltiptext: 'Extras Config Menu',
oncontextmenu: 'return false'
};
for (var a in attributes) {
toolbaritem.setAttribute(a, attributes[a]);
};
return toolbaritem;
},
onCreated: function(toolbaritem) {
}
});
} catch (e) {};
setTimeout(() => ECM.init2(), 1000);
this.addPrefListener(ECM.readLaterPrefListener);
window.addEventListener('unload', this, false);
},
init2: function (btn) {
var btn = document.getElementById('ExtrasConfigMenu');
if (!btn)
setTimeout(() => ECM.init2(), 1000);
btn.addEventListener('click', (event) => ECM.onClick(event));
var mp = btn.appendChild(this.createME('menupopup', 0, 0, 0, 'ecm-popup'));
mp.setAttribute('onclick', 'event.preventDefault(); event.stopPropagation();');
mp.addEventListener('popupshowing', (event) => ECM.onpopup(event));
/* ==================== ここから設定 ==================== */
var devMenu = $('webDeveloperMenu');
//ツール
mp.appendChild($('tools-menu')).firstChild.className = "menu-text";
//開発ツール
mp.appendChild(devMenu);
//ブラウザ内メモリ開放
mp.appendChild(this.createME('menuitem', 'Purge Memory', () => {
var os = Services.obs;
var gMgr = Cc['@mozilla.org/memory-reporter-manager;1'].getService(Ci.nsIMemoryReporterManager);
var parentWindow = Services.wm.getMostRecentWindow('navigator:browser');
os.notifyObservers(null, 'child-gc-request', null);
Cu.forceGC();
os.notifyObservers(null, 'child-cc-request', null);
parentWindow.windowUtils.cycleCollect();
os.notifyObservers(null, 'child-mmu-request', null);
gMgr.minimizeMemoryUsage(() => '');
}));
mp.appendChild(this.createME('menuitem', 'メモリ解放', 'ECM.open(4, "D:\\\\Software\\\\empty\\\\empty.vbs")', 'ecm_vbs', 0));
mp.appendChild(document.createXULElement('menuseparator'));
//新パスワードマネージャ
mp.appendChild(this.createME('menuitem', 'パスワードマネージャ', 'openTrustedLinkIn("about:logins", "tab");', 0, 0));
mp.appendChild(document.createXULElement('menuseparator'));
mp.appendChild(this.createME('menuitem', 'Javascript On/Off', 'ECM.toggle("javascript.enabled")', 'ecm_pref', 0));
mp.appendChild(this.createME('menuitem', '位置情報 On/Off', 'ECM.toggle("geo.enabled")', 'ecm_pref', 0));
mp.appendChild(document.createXULElement('menuseparator'));
mp.appendChild(this.createME('menuitem', 'userChrome.css', 'ECM.edit(0, ["userChrome.css"])', 'ecm_edit', 0));
mp.appendChild(this.createME('menuitem', 'userContent.css', 'ECM.edit(0, ["userContent.css"])', 'ecm_edit', 0));
mp.appendChild(document.createXULElement('menuseparator'));
mp.appendChild(this.createME('menuitem', 'prefs.js', 'ECM.edit(1, ["prefs.js"])', 'ecm_js', 0));
mp.appendChild(this.createME('menuitem', 'user.js', 'ECM.edit(1, ["user.js"])', 'ecm_js', 0));
mp.appendChild(this.createME('menuitem', '_keychanger.js', 'ECM.edit(0, ["_keychanger.js"])', 'ecm_edit', 0));
/*
mp.appendChild(this.createME('menuitem', '_uAutoPagerize.js', 'ECM.edit(0, ["_uAutoPagerize.js"])', 'ecm_edit', 0));
*/
mp.appendChild(document.createXULElement('menuseparator'));
mp.appendChild(this.createME('menuitem', 'Chrome', 'ECM.open(0)', 'ecm_folder', 0));
mp.appendChild(this.createME('menuitem', 'Profile', 'ECM.open(1)', 'ecm_folder', 0));
/*
mp.appendChild(this.createME('menuitem', 'SubScript', 'ECM.open(0, ["SubScript"])', 'ecm_folder', 0));
mp.appendChild(this.createME('menuitem', 'CSS', 'ECM.open(0, ["CSS"])', 'ecm_folder', 0));
mp.appendChild(this.createME('menuitem', 'UserScriptLoader', 'ECM.open(0, ["UserScriptLoader"])', 'ecm_folder', 0));
mp.appendChild(this.createME('menuitem', 'Install Folder', 'ECM.open(3, ["Mozilla Firefox"])', 'ecm_folder', 0));
*/
mp.appendChild(document.createXULElement('menuseparator'));
mp.appendChild($('aboutName').cloneNode(false));
/* ==================== END ==================== */
this.itemLength = mp.childNodes.length;
},
handleEvent: function (event) {
if (event.type === 'unload') {
this.removePrefListener(ECM.readLaterPrefListener);
this.itemLength = null;
}
},
onClick: function (event) {
if (event.button === 1) {
gBrowser.selectedTab = gBrowser.addTrustedTab("about:config");
} else if (event.button === 2) {
event.preventDefault();
Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);
}
},
edit: function (key, pathArray) {
var path = this.getPath(key, pathArray);
if (this.editor === 1) {
this.launch(Services.prefs.getCharPref('view_source.editor.path'), path);
} else {
this.launch(this.editor, path);
}
},
open: function (key, pathArray, arg) {
var path = this.getPath(key, pathArray);
this.launch(path, arg);
},
launch: function (path, arg) {
arg = [arg] || [];
var file = this.getFile(path);
if (!file.exists()) {
return;
}
if (!file.isDirectory()) {
var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
process.init(file);
process.run(false, arg, arg.length);
} else {
file.reveal();
}
},
getFile: function (path) {
var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
file.initWithPath(path);
return file;
},
getDir: function (key, pathArray) {
var dir;
if (key.indexOf('\\') !== -1) {
dir = this.getFile(key);
} else {
dir = Services.dirsvc.get(key, Ci.nsIFile);
}
if (pathArray != null) {
for (var i = 0, len = pathArray.length; i < len; ++i) {
dir.append(pathArray[i]);
}
}
return dir.path;
},
getPath: function (key, pathArray) {
pathArray = pathArray || [];
var path = '';
switch (key) {
case 0:
path = this.getDir('UChrm', pathArray);
break;
case 1:
path = this.getDir('ProfD', pathArray);
break;
case 2:
path = this.getDir('WinD', pathArray);
break;
case 3:
path = this.getDir('ProgF', pathArray);
break;
case 4:
path = pathArray;
break;
case 'C':
path = this.getDir('C:\\', pathArray);
break;
case 'D':
path = this.getDir('D:\\', pathArray);
break;
}
return path;
},
toggle: function (prefName) {
var pref = this.getPref(prefName);
var prefType = Services.prefs.getPrefType(prefName);
if (prefType === Ci.nsIPrefBranch.PREF_BOOL) {
this.setPref(prefName, !pref);
}
},
createME: function (sTyp, sLabel, sCommand, sClass, sId) {
var ele = document.createXULElement(sTyp);
switch (sTyp) {
case 'menuitem':
ele.setAttribute('label', sLabel);
ele.setAttribute('class', 'menuitem-iconic');
if (typeof sCommand === 'function') {
ele.setAttribute('oncommand', '(' + sCommand.toSource() + ').call(this, event);');
} else {
ele.setAttribute('oncommand', sCommand);
}
if (sClass) ele.classList.add(sClass);
break;
case 'menu':
ele.setAttribute('label', sLabel);
ele.setAttribute('id', sId);
break;
case 'menupopup':
ele.setAttribute('id', sId);
break;
}
return ele;
},
onpopup: function (event) {
var mp = event.target;
if (mp !== event.currentTarget) {
return;
}
for (let i = this.itemLength, len = mp.childNodes.length; i < len; i++) {
mp.removeChild(mp.lastChild);
}
var sep = document.createXULElement('menuseparator');
mp.appendChild(sep);
var scripts = userChrome_js.scripts.concat(userChrome_js.overlays);
for (let j = 0, lenj = userChrome_js.arrSubdir.length; j < lenj; j++) {
var dirName = (userChrome_js.arrSubdir[j] == '') ? 'root' : userChrome_js.arrSubdir[j];
var flg = false;
for (var i = 0, len = scripts.length; i < len; i++) {
var script = scripts[i];
if (script.dir !== dirName) continue;
flg = true;
break;
}
if (!flg) continue;
var menu = mp.appendChild(document.createXULElement('menu'));
menu.setAttribute('label', 'chrome/' + (dirName == 'root' ? '' : dirName));
menu.dirName = dirName;
var mp = menu.appendChild(document.createXULElement('menupopup'));
mp.setAttribute('onpopupshowing', 'event.stopPropagation();');
var flg = false;
for (let i = 0, len = scripts.length; i < len; i++) {
var script = scripts[i];
var type = script.filename.lastIndexOf('uc.js') !== -1;
if (script.dir != dirName) continue;
if (flg && type !== flg) {
var sep = document.createXULElement('menuseparator');
mp.appendChild(sep);
}
flg = type;
var mi = mp.appendChild(document.createXULElement('menuitem'));
mi.setAttribute('label', script.filename.replace(/\.uc\.js$|\.uc\.xul$/g, ''));
mi.setAttribute('oncommand', 'ECM.chgScriptStat(script.filename);');
mi.setAttribute('onclick', 'if (event.button !== 0) { event.preventDefault(); event.stopPropagation(); ECM.clickScriptMenu(event); }');
mi.setAttribute('closemenu', 'none');
mi.setAttribute('type', 'checkbox');
mi.setAttribute('checked', !userChrome_js.scriptDisable[script.filename]);
if (script.description)
mi.setAttribute('tooltiptext', script.description);
mi.script = script;
}
mp = event.target;
}
},
clickScriptMenu: function (event) {
var target = event.target;
var script = target.script;
var fileURL = Services.io.getProtocolHandler('file').QueryInterface(Ci.nsIFileProtocolHandler).getFileFromURLSpec(script.url);
if (event.button === 1) {
this.chgScriptStat(script.filename);
target.setAttribute('checked', !userChrome_js.scriptDisable[script.filename]);
} else if (event.button === 2) {
this.edit(4, fileURL.path);
}
},
chgScriptStat: function (afilename) {
var s = this.getPref('userChrome.disable.script');
if (!userChrome_js.scriptDisable[afilename]) {
s = (s + ',').replace(afilename + ',', '') + afilename + ',';
} else {
s = (s + ',').replace(afilename + ',', '');
}
s = s.replace(/,,/g, ',').replace(/^,/, '');
this.setPref('userChrome.disable.script', s);
userChrome_js.scriptDisable = this.restoreState(s.split(','));
},
restoreState: function (arr) {
var disable = [];
for (var i = 0, len = arr.length; i < len; i++) {
disable[arr[i]] = true;
}
return disable;
},
getPref: function (prefName) {
return Preferences.get(prefName);
},
setPref: function (prefName, value) {
Preferences.set(prefName, value);
},
addPrefListener: function (aObserver) {
Services.prefs.addObserver(aObserver.domain, aObserver, false);
},
removePrefListener: function (aObserver) {
Services.prefs.removeObserver(aObserver.domain, aObserver);
},
readLaterPrefListener: {
domain: 'userChrome.disable',
observe: function (aSubject, aTopic, aPrefstring) {
if (aTopic === 'nsPref:changed') {
setTimeout(() => {
var s = ECM.getPref('userChrome.disable.script');
userChrome_js.scriptDisable = ECM.restoreState(s.split(','));
}, 0);
}
}
}
};
window.ECM.init();
function $(id) {
var ele = {};
if (ele[id] == null) {
ele[id] = document.getElementById(id);
}
return ele[id];
}
}());
Alles anzeigen
Hinweis: diese Version ist noch nicht übersetzt. Vieles ist noch auf japanisch oder Chinesisch.
Vielleicht könnte man daraus auch den Teil für die frei verschiebbare Schaltfläche in unsere Version
hier übernehmen. Wenn dann müsste sich das aber aborix mal anschauen.
Mfg.
Endor