- Firefox-Version
- Firefox 156 Nightly
- Betriebssystem
- Windows 11 Pro 24H2
Moin, ich nutze schon länger o.a. Script
JavaScript
// ==UserScript==
// @name searchEngineIcon.uc.js
// @namespace http://space.geocities.yahoo.co.jp/gl/alice0775
// @description replace the magnifying glass with the search engine's icon
// @include main
// @compatibility Firefox 151
// @version 2026/04/19 00:00 Bug 1998985 - Convert XUL in SearchModeSwitcher to HTML
// @version 2026/04/15 00:00 remove async function
// @version 2026/01/23 00:00 Bug 2000685 - Replace the search service instance with a singleton
// @version 2026/01/13 00:00 compatibility 149 from 148
// @author Alice0775
// @version 2025/12/20 00:00 new search widget
// @version 2025/02/04 23:00 Bug 1880913 - Move BrowserSearch out of browser.js
// @version 2024/03/01 00:00 Bug 1882577 - Make nsISearchEngine.getIconURL an async function
// @version 2023/12/24 00:00 Bug 1870644 use engine.getIconURL() instead engine.iconURI.spec
// @version 2023/02/08 10:00 remove -moz-image-region
// @version 2021/01/21 12:00 indicate engine name
// @version 2020/01/26 22:00 fix typo & simplify
// @version 2020/01/26 20:00 fox after DOM fullscreen
// @version 2019/11/22 00:00 workaround delayed initialize using gBrowserInit.delayedStartupFinished instead async Services.search.init()
// @version 2019/11/14 00:00 Fix 72+ Bug 1591145 Remove Document.GetAnonymousElementByAttribute
// @version 2019/06/24 11:00 Fix 68+ Bug 1518545 - Merge engine-current/ default notifications
// @version 2019/05/24 11:00 Fix overflowed/underflowed
// @version 2019/03/30 19:00 Fix 67.0a1 Bug 1492475 The search service init() method should simply return a Promise
// @version 2019/03/20 00:00 Fix 67.0a1
// @version 2018/11/29 00:00 Fix 67.0a1 Bug 1524593 - nsISearchService (aka nsIBrowserSearchService, previously) refactor to be mostly an asynchronouse
// @version 2018/11/29 00:00 Fix 65.0a1 Bug 1453264
// @version 2018/09/29 23:00 Fix 64.0a1
// @version 2018/09/24 23:00 Fix warning from nsIBrowserSearchService
// @version 2018/07*20 23:00 Fix change option > search
// @version 2017/11/17 02:00 Fx57
// @version 2015/09/08 02:00 Bug 827546
// ==/UserScript==
var searchengineicon = {
lazy: {},
init: function() {
this.toggleImage("init");
window.addEventListener('aftercustomization', this, false);
window.addEventListener('MozDOMFullscreen:Exited', this, false);
Services.prefs.addObserver('browser.search.widget.inNavBar', this, false);
Services.obs.addObserver(this, "browser-search-engine-modified");
window.addEventListener("resize", this, false);
window.addEventListener('unload', this, false);
},
uninit: function(){
window.removeEventListener('aftercustomization', this, false);
window.removeEventListener('MozDOMFullscreen:Exited', this, false);
Services.prefs.removeObserver('browser.search.widget.inNavBar', this);
Services.obs.removeObserver(this, "browser-search-engine-modified");
window.removeEventListener("resize", this, false);
window.removeEventListener('unload', this, false);
},
toggleImage: async function(topic) {
Services.console.logStringMessage("toggleImage "+topic);
ChromeUtils.defineESModuleGetters(this.lazy, {
SearchService: "moz-src:///toolkit/components/search/SearchService.sys.mjs",
});
if (!this.lazy.SearchService.isInitialized) {
await this.lazy.SearchService.init();
}
if (Services.prefs.getBoolPref("browser.search.widget.new", false)) {
var searchbar = window.document.getElementById("searchbar-new");
if (!searchbar)
return;
searchbar.searchModeSwitcher.updateSearchIcon();
} else {
var searchbar = window.document.getElementById("searchbar");
if (!searchbar)
return;
let searchbutton = searchbar.querySelector(".searchbar-search-icon");
if (!searchbutton)
return;
Services.console.logStringMessage("toggleImage "+topic +" done");
let defaultEngine = await this.lazy.SearchService.getDefault();
var uri = await defaultEngine.getIconURL();
//var icon = PlacesUtils.getImageURLForResolution(window, uri);
searchbutton.setAttribute("style", "list-style-image: url('"+ uri +"') !important;/* -moz-image-region: auto !important;*/ width: 16px !important; padding: 2px 0 !important;");
searchbar._textbox.setAttribute("placeholder", searchbar.currentEngine.name);
}
},
observe(aSubject, aTopic, aPrefstring) {
if (aTopic == "browser-search-engine-modified") {
//aSubject.QueryInterface(Components.interfaces.nsISearchEngine);
switch (aPrefstring) {
case "engine-current":
case "engine-default":
this.toggleImage(aPrefstring);
// Not relevant
break;
}
}
if (aTopic == 'nsPref:changed') {
// 設定が変更された時の処理
setTimeout(function(){searchengineicon.toggleImage(aTopic);}, 0);
}
},
_timer: null,
handleEvent: function(event){
switch (event.type) {
case "MozDOMFullscreen:Exited":
setTimeout(() => {this.toggleImage(event.type);}, 1000);
break;
case "aftercustomization":
this.toggleImage("aftercustomization");
break;
case 'unload':
this.uninit();
break;
}
}
}
// We should only start the redirection if the browser window has finished
// starting up. Otherwise, we should wait until the startup is done.
if (gBrowserInit.delayedStartupFinished) {
searchengineicon.init();
} else {
let delayedStartupFinished = (subject, topic) => {
if (topic == "browser-delayed-startup-finished" &&
subject == window) {
Services.obs.removeObserver(delayedStartupFinished, topic);
searchengineicon.init();
}
};
Services.obs.addObserver(delayedStartupFinished,
"browser-delayed-startup-finished");
}
Alles anzeigen
Seit kurzem sieht das nun so aus:
Liegts an diesem Script? Wie kann es geändert werden?
Ich nutze noch ein weiteres Script, was da ggf. Einfluss nehmen könnte
JavaScript
// ==UserScript==
// @name SearchEngineWheelScroll.uc.js
// @include main
// @async true
// compatibility 149
// @version 2026/01/28 00:00 Bug 2003300 - Replace nsISearchService.CHANGE_REASON* with SearchService.CHANGE_REASON*
// @version 2026/01/23 00:00 Bug 2000685 - Replace the search service instance with a singleton
// @version 2025/12/20 00:00 new search widget
// @version 2025/10/14 00:00 Bug 1977965 - Add a "Search Image" content context menu item for performing visual searches
// @version 2025/07/31 00:00 Bug 1979338 - Use srcset for images on menuitems
// @version 2025/07/09 00:00 Bug 1974698 - Remove setters for synchronous setting of the default (private) engines (use Services.search.setDefault instead setter of defaultEngine)
// @version 2025/06/03 00:00 Bug 1882577 - Make nsISearchEngine.getIconURL an async function
// @version 2024/03/01 00:00 Bug 1882577 - Make nsISearchEngine.getIconURL an async function
// @version 2023/12/24 00:00 Bug 1870644 use engine.getIconURL() instead engine.iconURI.spec
// @version 2023/10/10 00:00 Stop using xml-stylesheet processing instructions
// @version 2023/07/17 00:00 use ES module imports
// @version 2023/02/08 10:00 remove -moz-image-region
// @version 2022/11/06 17:00 107 Bug 1793414
// @version 2020/06/13 11:00 Respect the focus
// @version 2020/12/14 00:00 proton
// @version 2020/12/14 00:00 Fix Firefox 85 Bug 1654217 - Make getEngineByAlias async
// @version 2020/01/26 20:00 fox after DOM fullscreen
// @version 2019/11/22 00:00 workaround delayed initialize using gBrowserInit.delayedStartupFinished instead async Services.search.init()
// @version 2019/12/11 00:00 Fix Services.search initialize
// @version 2019/11/14 00:00 Fix contextmenu
// @version 2019/06/24 23:00 fix 69 wait for gBrowser initialized
// @version 0.91 2019/5/26 Firefox67
// @version 0.9 2018/11/30
// ==/UserScript==
/*
Um ein Symbol auf der Suchschaltfläche anzuzeigen, ist die Verwendung von Alice0775s Script searchEngineIcon.uc.js die zuverlässigste Methode.
Soll der Platzhalter im Suchfeld der Name der Suchmaschine sein, fügen Sie die folgende Zeile unterhalb der folgenden Zeile im selben Skript ein:
`searchbutton.setAttribute("style", "list-style-image: url('"+ uri +"') !important; width: 16px !important; padding: 2px 0 !important;");`
searchbar.textbox.setAttribute('placeholder', Services.search.defaultEngine.name);
*/
async function SearchEngineWheelScroll() {
// Einstellung: true für (Ja), false für aus (Nein)
const scrollDown = true // Zum nächsten Suchmaschinen-Element scrollen
const menu_icon = true // Symbol im Kontextmenü anzeigen
const dblclick_reset = true // Doppelklick um zur vorherigen Suchmaschine zurückzukehren
const box_clear = true // Nach der Suche mit Doppelklick auf die Suchschaltfläche das Suchfeld leeren
const top_engine = false // Die oberste Suchmaschine für die Direktsuche festlegen
const select_engine = 'Google' // Suchmaschine per Stichwort auswählen, z. B. 'g'
const sync = true // Suchbegriff aus dem Kontextmenü an die Suchleiste senden
const hist = true // Suchbegriff aus dem Kontextmenü zum Suchverlauf hinzufügen
const loop = false // Die Suchmaschinen in einer Schleife durchlaufen, ohne am Anfang oder Ende anzuhalten
// Einstellungen Ende
const box_reset = true // Suchmaschine nach der Suche in der Suchleiste zurücksetzen
const menu_reset = true //Suchmaschine nach der Suche im Kontextmenü zurücksetzen
window.addEventListener('aftercustomization', handleEvent, false);
window.addEventListener('MozDOMFullscreen:Exited', handleEvent, false);
const searchbar = Services.prefs.getBoolPref("browser.search.widget.new", false) ?
document.getElementById('searchbar-new') :
document.getElementById('searchbar');
if(!searchbar) return;
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
SearchService: "moz-src:///toolkit/components/search/SearchService.sys.mjs",
FormHistory: "resource://gre/modules/FormHistory.sys.mjs",
});
let searchbtn = searchbar.querySelector('hbox.searchbar-search-button');
let newSearchbtns = document.querySelectorAll(".searchmode-switcher");
const menu = document.getElementById('context-searchselect');
const SS = lazy.SearchService;
menu.setAttribute("class", "menuitem-iconic");
menu.addEventListener('wheel', ChangeE, false);
if(!!menu_reset) {
//menu.addEventListener('click', CMenu_reset, false);
menu.parentNode.addEventListener('popuphidden', CMenu_reset, false);
}
await lazy.SearchService.init();
if (!init()) return;
CMenu();
Services.obs.addObserver(observe, "browser-search-engine-modified");
window.addEventListener('unload', function uninit() {
Services.obs.removeObserver(observe, "browser-search-engine-modified");
window.removeEventListener('unload', uninit, false);
}, false);
function init() {
let flg = false;
for (let i = 0; i < newSearchbtns.length; i++) {
newSearchbtns[i].addEventListener('wheel', async (e) => {
const dir = (scrollDown ? 1 : -1) * Math.sign(e.deltaY);
let searchMode = searchbar.searchMode;
// Find the new index.
const engines = await SS.getVisibleEngines();
let currentName;
if (!searchMode) {
currentName = SS.defaultEngine.name;
} else {
currentName = searchMode.engineName;
}
let newIndex = -1;
let lastIndex = engines.length - 1;
for (let i = lastIndex; i >= 0; --i) {
if (engines[i].name == currentName) {
// Check bounds to cycle through the list of engines continuously.
if (dir < 0 && i == 0 && loop) {
newIndex = lastIndex;
} else if (dir > 0 && i == lastIndex && loop) {
newIndex = 0;
} else {
newIndex = i + dir;
}
break;
}
}
if (newIndex >= 0 && newIndex <= lastIndex) {
if (engines[newIndex] == SS.defaultEngine) {
searchbar.searchMode = null;
} else {
searchbar.searchMode = { engineName: engines[newIndex].name };
}
}
}, false);
newSearchbtns[i].addEventListener('dblclick', ResetE, false);
flg = true;
}
if(!searchbtn) return flg;
Services.console.logStringMessage("SearchEngineWheelScroll init");
searchbtn.addEventListener('wheel', ChangeE, false);
searchbtn.addEventListener('dblclick', ResetE, false);
return true;
}
function CMenu_reset(e){
Services.console.logStringMessage(e.type);
searchbar.value = sync? this.searchTerms : searchbar.value;
if(!!hist) SyncHistory();
setTimeout(function(){ResetE()}, 0);
}
function handleEvent(event) {
Services.console.logStringMessage("SearchEngineWheelScroll "+event.type);
switch(event.type) {
case "MozDOMFullscreen:Exited":
setTimeout(() => {init();}, 1000);
break;
case "aftercustomization":
init();
break;
}
}
async function ResetE(){
//SS.defaultEngine = (!!top_engine || select_engine == '') ? (await SS.getVisibleEngines())[0] : await SS.getEngineByAlias(select_engine);
await lazy.SearchService.setDefault(
(!!top_engine || select_engine == '')
? (await SS.getVisibleEngines())[0]
: await SS.getEngineByAlias(select_engine),
lazy.SearchService.CHANGE_REASON_USER_SEARCHBAR
);
if(box_clear) searchbar.value = '';
}
var SSSURI = null;
async function CMenu() {
let selectedText = menu.searchTerms || window.getSelection().toString();
if (selectedText.length > 15) {
let truncLength = 15;
let truncChar = selectedText[15].charCodeAt(0);
if (truncChar >= 0xDC00 && truncChar <= 0xDFFF)
truncLength++;
selectedText = selectedText.substr(0, truncLength) + '\u2026';
}
var menuLabel = gNavigatorBundle.getFormattedString('contextMenuSearch', [SS.defaultEngine.name, selectedText]);
menu.setAttribute('label', menuLabel);
if(!menu_icon) return;
let iconurl =' url('+ await SS.defaultEngine.getIconURL() + ')';
let style = `#context-searchselect .menu-icon{width:16px;height:16px;}
#context-searchselect { --menuitem-icon: ${iconurl} !important;}`;
var sss = Cc['@mozilla.org/content/style-sheet-service;1']
.getService(Ci.nsIStyleSheetService);
if (SSSURI && sss.sheetRegistered(SSSURI, sss.USER_SHEET)) {
sss.unregisterSheet(SSSURI, sss.USER_SHEET);
}
var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(style));
SSSURI = uri;
if(!sss.sheetRegistered(uri, sss.USER_SHEET))
sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
/*
let sspi = document.createProcessingInstruction(
'xml-stylesheet',
'type="text/css" href="data:text/css,' + encodeURIComponent(style) + '"'
);
document.insertBefore(sspi, document.documentElement);
sspi.getAttribute = function(name) {
return document.documentElement.getAttribute(name);
};
*/
}
function SyncHistory() {
if (PrivateBrowsingUtils.isWindowPrivate(window))
return;
const val = menu.searchTerms;
lazy.FormHistory.update({
op: "bump",
fieldname: "searchbar-history",
value: val,
source: menu.engine.name
});
}
async function ChangeE(e) {
const dir = (scrollDown ? 1 : -1) * Math.sign(e.deltaY);
// Find the new index.
let engines = await SS.getVisibleEngines();
let currentName = SS.defaultEngine ? SS.defaultEngine.name : "";
let newIndex = -1;
let lastIndex = engines.length - 1;
for (let i = lastIndex; i >= 0; --i) {
if (engines[i].name == currentName) {
// Check bounds to cycle through the list of engines continuously.
if (dir < 0 && i == 0 && loop) {
newIndex = lastIndex;
} else if (dir > 0 && i == lastIndex && loop) {
newIndex = 0;
} else {
newIndex = i + dir;
}
break;
}
}
if (newIndex >= 0 && newIndex <= lastIndex) {
//SS.defaultEngine = engines[newIndex];
await lazy.SearchService.setDefault(
engines[newIndex],
lazy.SearchService.CHANGE_REASON_USER_SEARCHBAR
);
document.getElementById('context-searchselect').engine = engines[newIndex];
}
}
function observe(aEngine, aTopic, aVerb) {
if (aTopic == "browser-search-engine-modified") {
//aEngine.QueryInterface(Components.interfaces.nsISearchEngine);
if(aVerb == "engine-current" || aVerb == "engine-default")
CMenu();
}
}
if(!box_reset) return;
searchbar.cmd = searchbar.doSearch;
searchbar.doSearch = function(aData, aWhere, aEngine, aParams, isOneOff = false) {
if (false && aWhere == 'current') {
aWhere = gBrowser.selectedTab.isEmpty? 'current': 'tab';
}
this.cmd(aData, aWhere, aEngine, aParams, isOneOff);
ResetE();
}
}
// We should only start the redirection if the browser window has finished
// starting up. Otherwise, we should wait until the startup is done.
if (gBrowserInit.delayedStartupFinished) {
SearchEngineWheelScroll();
} else {
let delayedStartupFinished = (subject, topic) => {
if (topic == "browser-delayed-startup-finished" &&
subject == window) {
Services.obs.removeObserver(delayedStartupFinished, topic);
SearchEngineWheelScroll();
}
};
Services.obs.addObserver(delayedStartupFinished,
"browser-delayed-startup-finished");
}
Alles anzeigen