anywlan
小狐狸
小狐狸
  • UID56188
  • 注册日期2017-12-08
  • 最后登录2026-04-02
  • 发帖数34
  • 经验40枚
  • 威望0点
  • 贡献值40点
  • 好评度1点
阅读:34回复:0

请高手修复脚本,firefox149失效。

楼主#
更多 发布于:2026-04-02 08:58
// ==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 149
// @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: async function() {
    ChromeUtils.defineESModuleGetters(this.lazy, {
      SearchService: "moz-src:///toolkit/components/search/SearchService.sys.mjs",
    });
    if (!this.lazy.SearchService.isInitialized) {
      await this.lazy.SearchService.init();
    }
    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);
    if (Services.prefs.getBoolPref("browser.search.widget.new", false)) {
      var searchbar = window.document.getElementById("searchbar-new");
      if (!searchbar)
        return;
      let  searchbutton = searchbar.querySelector(".searchmode-switcher-icon");
      if (!searchbutton)
        return;
      Services.console.logStringMessage("toggleImage "+topic +" done");
      let searchMode = searchbar.searchMode;
      let engine, uri, label;
      if (!searchMode) {
        engine = await this.lazy.SearchService.getDefault();
        uri = await engine.getIconURL();
        label = engine.name;
      } else {
        label = searchMode.engineName;
        engine = await this.lazy.SearchService.getEngineByName(label);
        uri = await engine.getIconURL();
      }
      //var icon = PlacesUtils.getImageURLForResolution(window, uri);
      searchbutton.setAttribute("style", "list-style-image: url('"+ uri +"') !important;/* -moz-image-region: auto !important;*/ width: 16px !important; ");
      //searchbar.inputField.setAttribute("placeholder",  label);
    } 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");
}
游客

返回顶部