Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№1452618-04-2020 22:15:02

svin88
Участник
 
Группа: Members
Зарегистрирован: 26-07-2011
Сообщений: 14
UA: Chrome 80.0

Re: Custom Buttons

Вопрос такой - есть работающий прогресс-бар на загрузку страниц в адресной строке - но работает он только при нажатии на кнопку
Как его приладить без кнопки - чтоб автоматом запускался при загрузке  FF 56.3

Выделить код

Код:

/*CODE*/
  //Полоса загрузки в адресной строке
 
(function(){
//Location Bar Enhancer5.1;Loading Bar0.3.0
    var cssStr = (function(){/*
            #urlbar {
                background-image: -moz-repeating-linear-gradient(top -45deg, rgba(255,255,255,0), rgba(255,255,255,0) 6px, rgba(255,255,255,0) 6px, rgba(255,255,255,0) 12px), -moz-linear-gradient(left, #33FF66 0%, #33FF66 100%);
                background-size:0 0;
             background-repeat:repeat-x, no-repeat;
           //  transition: background-size 350ms ease 0s !important;
            }
            #urlbar:not([connecting])::after {
                        display:none;
                    }
            @-moz-keyframes progress-bar-stripes {
                from {
                    background-position: 0, 0;
                }
                to {
                    background-position: 51px 0, 0;
                }
            }
    */}).toString().replace(/^.+\s|.+$/,"");
    
    var style = document.createProcessingInstruction("xml-stylesheet", "type=\"text/css\"" + " href=\"data:text/css;base64," + btoa(cssStr) + "\"");
    var mainW = document.getElementById("main-window");
    document.insertBefore(style, mainW);

    function main(window) {
      var {document, gBrowser} = window;
      function $(id) document.getElementById(id);
      var urlbar = $("urlbar");
      let pageProgress = 0;
      let async = makeWindowHelpers(window).async;
      var LoadingBar = {
        listener: {
          onChangeTab: function(e) {
            urlbar.style.backgroundSize = '0% 100%';
            pageProgress = 0;
          },
          
          onProgressChange: function(aBrowser,webProgress,request,curSelfProgress,maxSelfProgress,curTotalProgress,maxTotalProgress) {
            if (gBrowser.contentDocument === aBrowser.contentDocument) {
                var val = (curTotalProgress-1)/(maxTotalProgress-1);
                pageProgress = val;
                urlbar.style.backgroundSize = (100*val) + '% 100%';
                if (val > 0.9)
                  async(function() {
                    if (pageProgress > 0.95)
                        urlbar.style.backgroundSize = '100% 100%';
                }, 1000);
            }
          },
          
          onStateChange: function() {
            if (pageProgress > 0.95){
                async(function() {
                    urlbar.style.backgroundSize = '0% 100%';
                    pageProgress = 0;
                }, 1000);
            }else{
                urlbar.style.backgroundSize = '0% 100%';
            }
          }
        }
      };

      gBrowser.tabContainer.addEventListener('TabSelect',LoadingBar.listener.onChangeTab,false);
      gBrowser.addTabsProgressListener(LoadingBar.listener);

      unload(function() {
        gBrowser.tabContainer.removeEventListener('TabSelect',LoadingBar.listener.onChangeTab,false);

        gBrowser.removeTabsProgressListener(LoadingBar.listener);
      }, window);
    }

    watchWindows(main, "navigator:browser");

    function runOnLoad(window, callback, winType) {
      window.addEventListener("load", function() {
        window.removeEventListener("load", arguments.callee, false);

        if (window.document.documentElement.getAttribute("windowtype") == winType)
          callback(window);
      }, false);
    }

    function runOnWindows(callback, winType) {
      function watcher(window) {
        try {
          callback(window);
        }
        catch(ex) {}
      }

      let browserWindows = Services.wm.getEnumerator(winType);
      while (browserWindows.hasMoreElements()) {
        let browserWindow = browserWindows.getNext();
        if (browserWindow.document.readyState == "complete")
          watcher(browserWindow);
        else
          runOnLoad(browserWindow, watcher, winType);
      }
    }

    function watchWindows(callback, winType) {
      function watcher(window) {
        try {
          callback(window);
        }
        catch(ex) {}
      }

      runOnWindows(callback, winType);

      function windowWatcher(subject, topic) {
        if (topic == "domwindowopened")
          runOnLoad(subject, watcher, winType);
      }
      Services.ww.registerNotification(windowWatcher);

      unload(function() Services.ww.unregisterNotification(windowWatcher));
    }

    function unload(callback, container) {
      let unloaders = unload.unloaders;
      if (unloaders == null)
        unloaders = unload.unloaders = [];

      if (callback == null) {
        unloaders.slice().forEach(function(unloader) unloader());
        unloaders.length = 0;
        return null;
      }

      if (container != null) {
        container.addEventListener("unload", removeUnloader, false);

        let origCallback = callback;
        callback = function() {
          container.removeEventListener("unload", removeUnloader, false);
          origCallback();
        }
      }

      function unloader() {
        try {
          callback();
        }
        catch(ex) {}
      }
      unloaders.push(unloader);


    function removeUnloader() {
        let index = unloaders.indexOf(unloader);
        if (index != -1)
          unloaders.splice(index, 1);
      }
      return removeUnloader;
    }
    
    function makeWindowHelpers(window) {
      let {clearTimeout, setTimeout} = window;

      function async(callback, delay) {
        delay = delay || 0;
        let timer = setTimeout(function() {
          stopTimer();
          callback();
        }, delay);

        function stopTimer() {
          if (timer == null)
            return;
          clearTimeout(timer);
          timer = null;
        }
      }

      return {
        async: async,
      };
    }

})();

ВСе вопрос снят - в инициализации "в фоне" засунул

Отредактировано svin88 (18-04-2020 22:30:00)

Отсутствует

 

№1452719-04-2020 02:06:41

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 77.0

Re: Custom Buttons

Можно сделать под 75+ скрипт выше? если долго то не надо, просто хотел затестить.

Отредактировано func4ptch4 (19-04-2020 09:59:02)

Отсутствует

 

№1452819-04-2020 11:38:04

shadow_user
Участник
 
Группа: Members
Зарегистрирован: 14-02-2007
Сообщений: 244
UA: Firefox 68.0

Re: Custom Buttons

svin88 пишет

работающий прогресс-бар на загрузку страниц в адресной строке

На v57 еще работает, на v68 уже не работает. Но идея интересная!
Dumby
Плиз, поправьте, пожалуйста!

Отредактировано shadow_user (19-04-2020 19:04:08)

Отсутствует

 

№1452919-04-2020 16:45:28

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 68.0

Re: Custom Buttons

Dumby
Толку от него мало, но напишу "несжатый размер", пусть будет. Спасибо.

Отсутствует

 

№1453019-04-2020 23:13:25

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 484
UA: Firefox 75.0

Re: Custom Buttons

func4ptch4 только для urlbar.update1 = false

скрытый текст
//Полоса загрузки в адресной строке..................................................................................................................
(function() {

   var cssStr = (function(){/*
                        #urlbar {
                            background-image: repeating-linear-gradient(-45deg, rgba(255,255,255,0), rgba(255,255,255,0) 6px, rgba(255,255,255,0) 6px, rgba(255,255,255,0) 12px), linear-gradient(to left, #33FF66 0%, #33FF66 100%);                               
                background-size:0 0;
                                background-repeat:repeat-x, no-repeat;
            }
            #urlbar:not([connecting])::after {
                        display:none;
                    }
            @-moz-keyframes progress-bar-stripes {
                from {
                    background-position: 0, 0;
                }
                to {
                    background-position: 51px 0, 0;
                }
            }
                        */}).toString().replace(/^.+\s|.+$/,"");

  var style = document.createProcessingInstruction("xml-stylesheet", "type=\"text/css\"" + " href=\"data:text/css;base64," + btoa(cssStr) + "\"");
  var mainW = document.getElementById("main-window");
  document.insertBefore(style, mainW);

  function main(window) {
    var {
      document,
      gBrowser
    } = window;

    function $(id) {
      return document.getElementById(id)
    };
    var urlbar = $("urlbar");
    let pageProgress = 0;
    let async = makeWindowHelpers(window).async;
    var LoadingBar = {
      listener: {
        onChangeTab: function(e) {
          urlbar.style.backgroundSize = '0% 100%';
          pageProgress = 0;
        },
        onProgressChange: function(aBrowser, webProgress, request, curSelfProgress, maxSelfProgress, curTotalProgress, maxTotalProgress) {
          if (gBrowser.contentDocument === aBrowser.contentDocument) {
            var val = (curTotalProgress - 1) / (maxTotalProgress - 1);
            pageProgress = val;
            urlbar.style.backgroundSize = (100 * val) + '% 100%';
            if (val > 0.9)
              async(function() {
                if (pageProgress > 0.95)
                  urlbar.style.backgroundSize = '100% 100%';
              }, 1000);
          }
        },
        onStateChange: function() {
          if (pageProgress > 0.95) {
            async(function() {
              urlbar.style.backgroundSize = '0% 100%';
              pageProgress = 0;
            }, 1000);
          } else {
            urlbar.style.backgroundSize = '0% 100%';
          }
        }
      }
    };
    gBrowser.tabContainer.addEventListener('TabSelect', LoadingBar.listener.onChangeTab, false);
    gBrowser.addTabsProgressListener(LoadingBar.listener);
    unload(function() {
      gBrowser.tabContainer.removeEventListener('TabSelect', LoadingBar.listener.onChangeTab, false);
      gBrowser.removeTabsProgressListener(LoadingBar.listener);
    }, window);
  }
  watchWindows(main, "navigator:browser");

  function runOnLoad(window, callback, winType) {
    window.addEventListener("load", function() {
      window.removeEventListener("load", arguments.callee, false);
      if (window.document.documentElement.getAttribute("windowtype") == winType)
        callback(window);
    }, false);
  }

  function runOnWindows(callback, winType) {
    function watcher(window) {
      try {
        callback(window);
      } catch (ex) {}
    }
    let browserWindows = Services.wm.getEnumerator(winType);
    while (browserWindows.hasMoreElements()) {
      let browserWindow = browserWindows.getNext();
      if (browserWindow.document.readyState == "complete")
        watcher(browserWindow);
      else
        runOnLoad(browserWindow, watcher, winType);
    }
  }

  function watchWindows(callback, winType) {
    function watcher(window) {
      try {
        callback(window);
      } catch (ex) {}
    }
    runOnWindows(callback, winType);

    function windowWatcher(subject, topic) {
      if (topic == "domwindowopened")
        runOnLoad(subject, watcher, winType);
    }
    Services.ww.registerNotification(windowWatcher);
    unload(function() {
      Services.ww.unregisterNotification(windowWatcher)
    });
  }

  function unload(callback, container) {
    let unloaders = unload.unloaders;
    if (unloaders == null)
      unloaders = unload.unloaders = [];
    if (callback == null) {
      unloaders.slice().forEach(function(unloader) {
        unloader()
      });
      unloaders.length = 0;
      return null;
    }
    if (container != null) {
      container.addEventListener("unload", removeUnloader, false);
      let origCallback = callback;
      callback = function() {
        container.removeEventListener("unload", removeUnloader, false);
        origCallback();
      }
    }

    function unloader() {
      try {
        callback();
      } catch (ex) {}
    }
    unloaders.push(unloader);

    function removeUnloader() {
      let index = unloaders.indexOf(unloader);
      if (index != -1)
        unloaders.splice(index, 1);
    }
    return removeUnloader;
  }

  function makeWindowHelpers(window) {
    let {
      clearTimeout,
      setTimeout
    } = window;

    function async(callback, delay) {
      delay = delay || 0;
      let timer = setTimeout(function() {
        stopTimer();
        callback();
      }, delay);

      function stopTimer() {
        if (timer == null)
          return;
        clearTimeout(timer);
        timer = null;
      }
    }
    return {
      async: async,
    };
  }
})();

Отредактировано Andrey_Krropotkin (19-04-2020 23:15:17)

Отсутствует

 

№1453120-04-2020 01:33:59

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 75.0

Re: Custom Buttons

Andrey_Krropotkin, спасибо, но смотрю на код и думаю не сложно было? там столько кода... ааа.
Кстати в новой ночнушке отпилили вроде urlbar.update1=false, вот недавно только обновил и настройки не пашут.. надеюсь временно как как тестовая сборка, но говорят настройки отпилили).

Просил до обновы и не думал о таком, так что извините заранее, я скорее перейду на стабильную ветку, просто интересно они и в стабильную это завезут? если так то там много чего отвалится, многие стили и т.д.

Отсутствует

 

№1453221-04-2020 14:50:47

Quartz1t
Участник
 
Группа: Members
Зарегистрирован: 25-11-2013
Сообщений: 111
UA: unknown 0.0

Re: Custom Buttons

Привет!
Ищу кнопку запуска ТОР, поделитесь если есть...
А если нет, то можно ли её сделать?
Спасибо!

Отсутствует

 

№1453322-04-2020 05:16:28

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 75.0

Re: Custom Buttons

Quartz1t, кнопка для запуска ссылки в другом браузере? в торе к примеру, или код который я видел, но он был в esr на рутрекере, там автор сам пишет его, его если подправить как основу для кнопки и норм, но думаю тебе надо найти кинуть сюда, и если кому нибудь захочется он сделает, что 30% из 100% может и ниже..
Вообще интересная кнопка я бы и себе взял, но я не умею.
Также в плане анонимности лучше все таки сам браузер тор использовать, если как прокси то надо ли тебе тогда тор?

Отсутствует

 

№1453422-04-2020 15:13:05

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 75.0

Re: Custom Buttons

Quartz1t

Quartz1t пишет

Ищу кнопку запуска ТОР, поделитесь если есть..

Вопросы научись задавать. Запуск чего ? Торпедной одноразовой ракеты ? Браузера или переход  в прокси-анонимайзер ?

Отсутствует

 

№1453523-04-2020 23:21:11

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 68.0

Re: Custom Buttons

egorsemenov06 пишет

Dumby можно эту  кнопку адаптировать для user_chrome_files? [firefox] 75.0

Попробуй так:
сохрани код как Save.js в папку custom_scripts (рядом с custom_script.js),
а в custom_script.js добавь этот код

скрытый текст

Выделить код

Код:

try {CustomizableUI.createWidget({
	id: "ucf-cbbtn-Save",
	localized: false,
	get initCode() {
		delete this.initCode;
		return this.initCode = Cu.readUTF8URI(Services.io.newURI(
			"chrome://user_chrome_files/content/custom_scripts/Save.js"
		));
	},
	cbu: {
		types: {
			128: "Bool", boolean: "Bool",
			64: "Int", number: "Int",
			32: "String", string: "String"
		},
		getPrefs(pref) {
			try {
				return Services.prefs[`get${
					this.types[Services.prefs.getPrefType(pref)]
				}Pref`](pref);
			}
			catch {return null;}
		},
		setPrefs(pref, val) {
			Services.prefs[`set${this.types[typeof val]}Pref`](pref, val);
		}
	},
	gClipboard: {
		get ch() {
			delete this.ch;
			return this.ch = Cc["@mozilla.org/widget/clipboardhelper;1"]
				.getService(Ci.nsIClipboardHelper);
		},
		write(str) {
			this.ch.copyStringToClipboard(str, Services.clipboard.kGlobalClipboard);
		}
	},
	addDestructor(destructor, context) {
		this._destructors.push({destructor, context});
	},
	addEventListener(...args) {
		var trg = args[3];
		if (!trg) trg = args[3] = this.ownerGlobal;
		trg.addEventListener(...args);
		this._handlers.push(args);
	},
	onCreated(btn) {
		var win = btn.ownerGlobal;
		btn._handlers = new win.Array();
		btn._destructors = new win.Array();
		win.addEventListener("unload", this, {once: true});
		new win.Function(
			"self,_id,cbu,xhtmlns,addDestructor,addEventListener,gClipboard",
			this.initCode
		).call(
			btn, btn, this.id, this.cbu,
			"http://www.w3.org/1999/xhtml",
			this.addDestructor.bind(btn),
			this.addEventListener.bind(btn),
			this.gClipboard
		);
	},
	handleEvent(e) {
		var btn = e.target.getElementById(this.id);
		for(var args of btn._handlers)
			args.pop().removeEventListener(...args);
		delete btn._handlers;
		for(var {destructor, context} of btn._destructors)
			try {destructor.call(context, "destructor");}
			catch(ex) {Cu.reportError(ex);}
		delete btn._destructors;
	}
});} catch(ex) {Cu.reportError(ex);}

Отредактировано Dumby (24-04-2020 08:47:12)

Отсутствует

 

№1453624-04-2020 00:27:45

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 75.0

Re: Custom Buttons

Dumby пишет

Попробуй так:

Здорово, спасибо.
А с Cookies Permissions такое можно проделать?

Отсутствует

 

№1453724-04-2020 08:48:26

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 68.0

Re: Custom Buttons

Dumby пишет

typeof pref

Упс, конечно же typeof val

egorsemenov06 пишет

А эту кнопку так же не получиться сделать

Может и получится, но я её уже пытался интегрировать,
не охота переделывать, разве что только если не работает.

скрытый текст

Выделить код

Код:

try {CustomizableUI.createWidget({
	label: "Переключить текущий поисковик",
	id: "ucf-cbbtn-ToggleCurrentSearchEngine",
	image: "data:image/png;base64,AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs9Pt8xetPtu9FsfFNtu%2BTzvb2%2B%2Fne4dFJeBw0egA%2FfAJAfAA8ewBBegAAAAD%2B%2FPtft98Mp%2BwWsfAVsvEbs%2FQeqvF8xO7%2F%2F%2F63yqkxdgM7gwE%2FggM%2BfQA%2BegBDeQDe7PIbotgQufcMufEPtfIPsvAbs%2FQvq%2Bfz%2Bf%2F%2B%2B%2FZKhR05hgBBhQI8hgBAgAI9ewD0%2B%2Fg3pswAtO8Cxf4Kw%2FsJvvYAqupKsNv%2B%2Fv7%2F%2FP5VkSU0iQA7jQA9hgBDgQU%2BfQH%2F%2Ff%2FQ6fM4sM4KsN8AteMCruIqqdbZ7PH8%2Fv%2Fg6Nc%2Fhg05kAA8jAM9iQI%2BhQA%2BgQDQu6b97uv%2F%2F%2F7V8Pqw3eiWz97q8%2Ff%2F%2F%2F%2F7%2FPptpkkqjQE4kwA7kAA5iwI8iAA8hQCOSSKdXjiyflbAkG7u2s%2F%2B%2F%2F39%2F%2F7r8utrqEYtjQE8lgA7kwA7kwA9jwA9igA9hACiWSekVRyeSgiYSBHx6N%2F%2B%2Fv7k7OFRmiYtlAA5lwI7lwI4lAA7kgI9jwE9iwI4iQCoVhWcTxCmb0K%2BooT8%2Fv%2F7%2F%2F%2FJ2r8fdwI1mwA3mQA3mgA8lAE8lAE4jwA9iwE%2BhwGfXifWvqz%2B%2Ff%2F58u%2Fev6Dt4tr%2B%2F%2F2ZuIUsggA7mgM6mAM3lgA5lgA6kQE%2FkwBChwHt4dv%2F%2F%2F728ei1bCi7VAC5XQ7kz7n%2F%2F%2F6bsZkgcB03lQA9lgM7kwA2iQktZToPK4r9%2F%2F%2F9%2F%2F%2FSqYK5UwDKZAS9WALIkFn%2B%2F%2F3%2F%2BP8oKccGGcIRJrERILYFEMwAAuEAAdX%2F%2Ff7%2F%2FP%2B%2BfDvGXQLIZgLEWgLOjlf7%2F%2F%2F%2F%2F%2F9QU90EAPQAAf8DAP0AAfMAAOUDAtr%2F%2F%2F%2F7%2B%2Fu2bCTIYwDPZgDBWQDSr4P%2F%2Fv%2F%2F%2FP5GRuABAPkAA%2FwBAfkDAPAAAesAAN%2F%2F%2B%2Fz%2F%2F%2F64g1C5VwDMYwK8Yg7y5tz8%2Fv%2FV1PYKDOcAAP0DAf4AAf0AAfYEAOwAAuAAAAD%2F%2FPvi28ymXyChTATRrIb8%2F%2F3v8fk6P8MAAdUCAvoAAP0CAP0AAfYAAO4AAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAA",
	excludeHiddenOneOffs: false,
	gn: () => Services.search.defaultEngine,
	gp: () => Services.search.defaultPrivateEngine,
	sn: val => Services.search.defaultEngine = val,
	sp: val => Services.search.defaultPrivateEngine = val,
	onCreated(btn) {
		btn.type = "menu";
		btn.owner = this;
		btn.setAttribute("image", this.image);

		var win = btn.ownerGlobal;
		var popup = btn.appendChild(win.document.createXULElement("menupopup"));
		var pr = win.PrivateBrowsingUtils.isWindowPrivate(win);
		popup.getDefaultEngine = pr ? this.gp : this.gn;
		popup.setDefaultEngine = pr ? this.sp : this.sn;
		popup.setAttribute("oncommand", "setDefaultEngine(event.target.engine)");
		popup.setAttribute("onpopupshowing", "this.shouldRebuild && owner.rebuild(this, document)");

		this.autoOpenCloseFeature(win, btn);
		this.updButton(btn, win);
	},
	async rebuild(popup, doc) {
		popup.textContent = "";
		var df = doc.createDocumentFragment();
		var de = popup.getDefaultEngine().wrappedJSObject, jsde = this.json(de);
		if (this.excludeHiddenOneOffs)
			var ex = Services.prefs.getStringPref(this.pref, "").split(",");
		var check = true;
		for(var engine of await Services.search.getVisibleEngines()) {
			if (check && engine.name == de.name && this.json(engine) == jsde) {
				check = false; continue;
			}
			if (this.excludeHiddenOneOffs && ex.includes(engine.name)) continue;
			var menuitem = df.appendChild(doc.createXULElement("menuitem"));
			menuitem.engine = engine;
			menuitem.label = engine.name;
			menuitem.image = this.img(engine);
			menuitem.className = "menuitem-iconic";
		}
		popup.append(df);
		delete popup.shouldRebuild;
	},
	async updButton(btn, win) {
		this.updButton = () => {};
		Services.search.isInitialized || await Services.search.init();

		var topics = ["browser-search-engine-modified", "quit-application-granted"];
		for(var topic of topics) Services.obs.addObserver(this, topic, false);
		this.observe = (s, topic) => this[topic[0]]();

		var remove = () => topics.forEach(
			topic => Services.obs.removeObserver(this, topic)
		);
		var {id} = this;
		var wins = callback => {
			for(var win of CustomizableUI.windows) {
				var btn = win.document.getElementById(id);
				btn && callback(btn, win);
			}
		}
		if (this.excludeHiddenOneOffs) {
			var setRebuild = btn => btn.firstChild.shouldRebuild = true;
			var {pref} = this, obs = () => wins(setRebuild);
			Services.prefs.addObserver(pref, obs);
			this.q = () => remove(Services.prefs.removeObserver(pref, obs));
		}
		else this.q = remove;

		var updButton = (btn, win) => {
			var popup = btn.firstChild;
			var engine = popup.getDefaultEngine();
			/*btn.label =*/ btn.tooltipText = engine.name;
			popup.shouldRebuild = true;
			win.requestAnimationFrame(() => btn.icon.src = this.img(engine));
		}
		(this.b = () => wins(updButton))();
		this.updButton = updButton;
		btn.tooltipText || updButton(btn, win);
	},
	pref: "browser.search.hiddenOneOffs",
	json: e => JSON.stringify(e.toJSON()),
	img: e => e.iconURI ? e.iconURI.spec : "chrome://browser/skin/search-engine-placeholder.png",

	// https://github.com/Infocatcher/Custom_Buttons/blob/master/code_snippets/autoOpenCloseMenu.js
	// Automatically open menu on mouse over (and hide it on mouse out)
	autoOpenCloseFeature(win, btn, openDelay = 200, closeDelay = 350) {
		var _openTimer = 0;
		var _closeTimer = 0;
		btn.onmouseover = function(e) {
			win.clearTimeout(_closeTimer);
			if(e.target == btn && closeOtherMenus()) {
				btn.open = true;
				return;
			}
			_openTimer = win.setTimeout(function() {
				btn.open = true;
			}, openDelay);
		};
		btn.onmouseout = function(e) {
			win.clearTimeout(_openTimer);
			_closeTimer = win.setTimeout(function() {
				if(!isContextOpened())
					btn.open = false;
			}, closeDelay);
		};
		function closeOtherMenus() {
			return win.Array.prototype.some.call(
				btn.parentNode.getElementsByTagName("*"),
				function(node) {
					if(
						node != btn
						&& win.XULElement.isInstance(node)
						// See https://github.com/Infocatcher/Custom_Buttons/issues/28
						//&& node.boxObject
						//&& node.boxObject instanceof Components.interfaces.nsIMenuBoxObject
						&& "open" in node
						&& node.open
						&& node.getElementsByTagName("menupopup").length
					) {
						node.open = false;
						return true;
					}
					return false;
				}
			);
		}
		function isContextOpened() {
			return inBtn(win.document.popupNode);
		}
		function inBtn(node) {
			for(; node; node = node.parentNode)
				if(node == btn)
					return true;
			return false;
		}
	}
});} catch(ex) {Cu.reportError(ex);}

voqabuhe пишет

А с Cookies Permissions такое можно проделать?

Не исключено, наверно

скрытый текст

Выделить код

Код:

try {CustomizableUI.createWidget({
	label: "Cookies Permissions",
	id: "ucf-cbbtn-CookiesPermissions",
	localized: false,
	get initCode() {
		delete this.initCode;
		return this.initCode = Cu.readUTF8URI(Services.io.newURI(
			"chrome://user_chrome_files/content/custom_scripts/cookiesPermissions.js"
		));
	},
	onCreated(btn) {
		var win = btn.ownerGlobal;
		var dp = class extends win.DOMParser {
			constructor() {
				super();
				this.forceEnableXULXBL();
			}
			parseFromString(...args) {
				var doc = this.parseFromSafeString(...args);
				var [menu] = doc.getElementsByTagName("menu");
				btn.defaultContextId = menu.id = btn.id + "-fake-context";
				menu.cloneNode = () => menu;
				menu.appendChild = () => {
					menu.previousSibling.remove();
					menu.remove();
					btn.defaultContextId = "toolbar-context-menu";
				}
				return doc;
			}
		}
		win.addEventListener("unload", () => btn.onDestroy("destructor"), {once: true});
		win.requestAnimationFrame(
			() => new win.Function("DOMParser", this.initCode).call(btn, dp)
		);
	}
});} catch(ex) {Cu.reportError(ex);}

Отредактировано Dumby (25-04-2020 02:31:40)

Отсутствует

 

№1453824-04-2020 12:56:50

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 75.0

Re: Custom Buttons

Dumby пишет

Не исключено, наверно

У меня кнопка появилась, но без иконки и полностью не рабочая.

Отсутствует

 

№1453924-04-2020 21:14:16

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 68.0

Re: Custom Buttons

egorsemenov06 пишет

А еще одну не посмотрите

скрытый текст

Выделить код

Код:

try {CustomizableUI.createWidget({
	label: "Дополнения",
	id: "ucf-cbbtn-ToggleRestartlessAddons",
	localized: false,
	get initCode() {
		this.event = Object.create(null);
		delete this.initCode;
		return this.initCode = Cu.readUTF8URI(Services.io.newURI(
			"chrome://user_chrome_files/content/custom_scripts/toggleRestartlessAddons.js"
		));
	},
	onCreated(btn) {
		btn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAt0lEQVR42mP4//8/AzK269D+zxDPAMYgNro8OsYUsGf4L5IrAMYgNskGPHrzkAHmAhCbZAPAglFAA6II2w5WC/ZzGEQDDMO9gCQGUmNYr4dhKANPBgdcAyEMMgSrAWA/R0H8jdcALN5iQHYWLABJMgBbABJjACiKweFHigHwgIW6Eux1UryA1QD0QISzsQQqVi+gKEBLfeguwhqIBEM5ihQD4rEoQHaBLwEDQOGBHKggNiyl4sreAEpLK4gRQN5TAAAAAElFTkSuQmCC");
		new btn.ownerGlobal.Function("self,event,_phase", this.initCode)
			.call(btn, btn, this.event, "init");
	}
});} catch(ex) {Cu.reportError(ex);}

Отсутствует

 

№1454025-04-2020 00:38:32

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1739
UA: Firefox 52.0

Re: Custom Buttons

voqabuhe пишет

У меня кнопка появилась, но без иконки и полностью не рабочая.

Что бы заработала, необходимо ещё создать файл с названием-> cookiesPermissions.js -> + этим кодом: https://github.com/Infocatcher/Custom_B … issions.js и добавить в папку custom_scripts.

Отредактировано kokoss (26-04-2020 16:33:20)


Win7

Отсутствует

 

№1454125-04-2020 15:27:48

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 75.0

Re: Custom Buttons

kokoss
Ну конечно я это всё сделал. Кнопка Save то у меня работает и с CookiesPermissions проделал тоже самое, а она не рабочая.  ХЗ почему.

Отсутствует

 

№1454225-04-2020 21:44:33

Quartz1t
Участник
 
Группа: Members
Зарегистрирован: 25-11-2013
Сообщений: 111
UA: unknown 0.0

Re: Custom Buttons

solombala пишет

Вопросы научись задавать. Запуск чего ? Торпедной одноразовой ракеты ? Браузера или переход  в прокси-анонимайзер ?

есть такой косяк... никто не совершенен...

но как по моему всё понятно, ТОР это ТОР, а ТорБраузер это ТорБраузер...

в силу причуд провайдера, иногда нужен подключение к ТОР сети, ВПН или Прокси почему-то не помогают.
не работает ряд сайтов не заблокированные решением "сверху".
на данный момент использую ProxAllium (аналог Vidalia), но кнопка как в браузере от Small_Z былабы удобнее.
сама кнопка громоздкая, много там всякого собрано, пытался её почистить, но не преуспел... увы

Отсутствует

 

№1454325-04-2020 22:23:44

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 75.0

Re: Custom Buttons

Quartz1t
Прокси , плюс настойки браузера, плюс аддон времени  и результат:
m99sz26v.png

Отсутствует

 

№1454425-04-2020 22:38:11

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 68.0

Re: Custom Buttons

solombala
Какой аддон времени?

Отсутствует

 

№1454525-04-2020 23:40:58

Quartz1t
Участник
 
Группа: Members
Зарегистрирован: 25-11-2013
Сообщений: 111
UA: unknown 0.0

Re: Custom Buttons

_zt
походу, подменяет системное время на часовой пояс прокси... ну, как-то так))

Добавлено 25-04-2020 23:45:59
solombala
пробовал я всякое... но в некоторых случаях не помогает.
к примеру в корпоративных сетях,.. как в них зашифровать трафик? ТОР справляется) а переходить на ТОрБраузер не хочу, привык к Pale Moon. уже 6 лет на нём...

Добавлено 25-04-2020 23:47:33
и Сustom Buttons на РМ работает без каких либо танцев...

Отредактировано Quartz1t (25-04-2020 23:47:33)

Отсутствует

 

№1454626-04-2020 00:46:21

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 68.0

Re: Custom Buttons

Bug 1631933 - Remove or revisit support for data:-URLs in the webRequest API (remove/replace WebRequestContent.js)
Конфиг с поправкой

config.js

Выделить код

Код:

//
try {(nsvo => {
	var o = Cu.getGlobalForObject(nsvo).Object, {freeze} = o, NEW;
	o.freeze = obj => {
		if (Components.stack.caller.filename != "resource://gre/modules/AppConstants.jsm")
			return freeze(obj);
		obj.MOZ_REQUIRE_SIGNING = false;
		if ((NEW = "MOZ_ALLOW_ADDON_SIDELOAD" in obj))
			lockPref("extensions.experiments.enabled", true);
		else
			obj.MOZ_ALLOW_LEGACY_EXTENSIONS = true,
			lockPref("extensions.legacy.enabled", true);

		return (o.freeze = freeze)(obj);
	}
	lockPref("xpinstall.signatures.required", false);
	lockPref("extensions.langpacks.signatures.required", false);

	nsvo = Cu.import("resource://gre/modules/addons/XPIInstall.jsm", {});
	var shouldVerify = nsvo.shouldVerifySignedState;
	nsvo.shouldVerifySignedState = addon => !addon.id && shouldVerify(addon);

	if (NEW) nsvo.XPIDatabase.isDisabledLegacy = () => false;
})(
	"permitCPOWsInScope" in Cu
		? Cu.import("resource://gre/modules/WebRequestCommon.jsm", {}) : Cu
);}
catch(ex) {Cu.reportError(ex);}

//
try {({
	ids: [
		"custombuttons@xsms.org",
	],
	init(xrt) {
		if (xrt.inSafeMode) return;
		Cu.import("resource://gre/modules/addons/XPIProvider.jsm", this);
		var load = async file => {
			var rootURI = this.XPIInternal.getURIForResourceInFile(file, "");
			Cu.import(rootURI.resolve("startup.jsm"), {}).start(rootURI);
		}
		var proto = this.XPIInternal.BootstrapScope.prototype;
		var func = proto._beforeCallBootstrapMethod;

		proto._beforeCallBootstrapMethod = () => {
			proto._beforeCallBootstrapMethod = func;
			for(var addon of this.XPIInternal.XPIStates.enabledAddons())
				this.ids.includes(addon.id) && !addon.loader && load(addon.file);
		}
	}
}).init(Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime));}
catch(ex) {Cu.reportError(ex);}

voqabuhe пишет

ХЗ почему.

Может консоль что-нибудь подскажет.

Отсутствует

 

№1454726-04-2020 01:13:40

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 76.0

Re: Custom Buttons

kokoss пишет

Что бы заработала, необходимо ещё создать файл с названием-> CookiesPermissions.js

регистр важен, cookiesPermissions.js а не CookiesPermissions.js

Отсутствует

 

№1454826-04-2020 15:42:19

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 75.0

Re: Custom Buttons

Vitaliy V. пишет

регистр важен, cookiesPermissions.js а не CookiesPermissions.js

Спасибо, так конечно работает.
Dumby

Спасибо большое за кнопку.

Отсутствует

 

№1454926-04-2020 20:58:08

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 68.0

Re: Custom Buttons

Quartz1t
Я не спрашивал, что оно делает.

Отсутствует

 

№1455029-04-2020 19:07:36

Alewww
Участник
 
Группа: Members
Зарегистрирован: 31-01-2009
Сообщений: 16
UA: Firefox 71.0

Re: Custom Buttons

Здравствуйте!
Есть кнопка "Поиск по сайту", но к сожалению она сейчас не работает.
Что нужно исправить в данном коде, чтобы она заработала?:

Выделить код

Код:

// Настройка функций кликов мыши для кнопки ..................
this.onclick =e=> {
   if ( e.button == 0 ) {
        var text = getSelect() || custombuttons.promptBox('Поиск по сайту в Google', 'Bведите текст ....')[1];
        text !== '' && searchInWebsite(text);
        } 
               
   e.button == 1 && searchInWebsite(gClipboard.read());
};


// Поиск по сайту в Google ..................
function searchInWebsite(text) { 
   var text = escape( convertFromUnicode("UTF-8", text) );           
   //var domain = Services.eTLD.getBaseDomain( gBrowser.currentURI );
   var domain = encodeURIComponent(content.document.domain);
   var url = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + domain;
   gBrowser.selectedTab = gBrowser.addTab(url); 
};


// Конвертировать текст в юникод ..................
function convertFromUnicode(charset, str) {
   var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
   converter.charset = charset;
   str = converter.ConvertFromUnicode(str);
   return str + converter.Finish();
};


// Получить выделенный текст из страницы или false ..................
function getSelect() {
   var sel = gBrowser.contentDocument.defaultView.getSelection().toString()
   return (sel == '') ? false : sel.toString().replace(/^\s+|\s+$/g,"");
};


// Подсказка для кнопки ..................
this.tooltipText = "Поиск по сайту \nЛ: Поиск выделенного или введённого текста \nС: Поиск текста из буфера обмена \nП: CB меню";

Firefox 71.0

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]