前往
大廳
主題

火狐UC腳本:快速切換代理QuickProxyModoki

—— | 2015-09-13 15:03:45 | 巴幣 0 | 人氣 340

火狐內建的藏太裡面了,要打開不方便,在導航列新增按鈕。
打開記事本,檔名:quickProxyModok,附檔名:.uc.xul

<?xml version="1.0"?>
<!--
// ==UserScript==
// @name           quickProxyModoki_Fx29.uc.xul
// @namespace      http://space.geocities.yahoo.co.jp/gl/alice0775
// @description    quickProxy
// @include        main
// @compatibility  Firefox 29+
// @author         Alice0775
// @version        2014/05/13 10:30 fix second window
-->

<?xml-stylesheet href="data:text/css,@namespace%20url('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul');@namespace%20html%20url('http://www.w3.org/1999/xhtml');
.quickproxy-status-on {
  list-style-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABW0lEQVQ4jY3TsWoUURTG8V8kwrYKFiksRdGIEk1I3sDKV7DxKcTCIp0ohu2TxiKNkiqWAwohu3tu0tnmAdIIgmaFuDZnlrtD3OTCMHPnnPnP+b5zLp1VWC/0g+PCuDDO5/6AjW5+vRaCncJk3hXsvOHazJcNi4X9TPo7B9DGvgTX67K3M3Ce94M5kPO2EjBiraLvBiWhry6rZMCG4EMSP3/jxiH3g5Xgx2V+FPoKkZsnraQht4O9ws+OgaeFT8HH3B8rnBUmDb1uW0YsB79awJBnaXovAX+mgOB1w+IFc7FZVfASgqV8N64lTArbXUDwoo0PeJQSH08lVCb+/sqtC2Q8T8BuBX07NXHA01ZPcK8LOOBm4fshdxJ4t/JlvTtIJ8HDLqTqzoPCycwgpavTUU76+2ClodfQy7l4V/15f2aUK21XOkxY+F+VhqwGW8FRtvgsOAq2Rqx18/8B9UkbjtKiOoEAAAAASUVORK5CYII=');
}
.quickproxy-status-off {
  list-style-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABbUlEQVQ4jY2Tu0oDQRSGJxJhSxEsLCxF8YKS1eAWZ+b8f2XlK9j4FGJpJ0okvWks0ihW+gZWXjpbH8BGEGIixNicDZPBGAeW3Tnn7Df/uYxzyVLVHZJNAM8keyR79t0MIRRpfLwqJFskBxOelnNuKj21SvKW5ADA97ifSx+AuzzPp4cAABcW1Lf3/R8K+pES50SkXtIBtEk+GvRwkpIQQuFINsxxraozIrIiIjWS7/+oR9MBeDBqXqbkvV8AcAPgIzn5DcAVgEvbPzuSXZIDVc1+aekagE4JUNVds2cG+BoCSB6pajWFkDyOAAdWt3mz9YYpGPHiFxX7kX/DbJtxCg3bfIrIXAoAsGf+dgQ9GRZRVbfKfFR1OQUURTFL8sV7v2jApbIuqrozMkgAXr336ykkUrMK4HVkkExSPModAGciUlPVTFUzEakBOI06cjsyylHF/3uZKuNUuhDCNoBzkk/W4i7JJwDnIlJP438ArzgUybLBdecAAAAASUVORK5CYII=');
}
"
type="text/css"?>


<overlay id="quickproxyOverlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

  <script type="application/x-javascript" xmlns="http://www.w3.org/1999/xhtml"><![CDATA[
    var quickProxy = {
      //-- config --
      // 以下はFirefox3以上の場合に有効
      // [true]:在选项卡中打开选项, false:在对话框中打开选项
      optionInTab: true,
      // falseの時ダイアログを開く遅延 巧く開かないときは遅延を大きくする
      optionDelay: 800,
      //-- config --
      _init: function(){
         try {
          CustomizableUI.createWidget({ //must run createWidget before windowListener.register because the register function needs the button added first
            id: 'quickproxy-status',
            type: 'custom',
            defaultArea: CustomizableUI.AREA_NAVBAR,
            onBuild: function(aDocument) {
              var toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
              var props = {
                id: 'quickproxy-status',
                align: 'center',
                removable: 'true',
                overflows: true,
                class: "quickproxy-status-off toolbarbutton-1 chromeclass-toolbar-additional",
                label: "QuickProxy",
                status: "false",
                tooltiptext: "快速代理",
                onclick: "quickProxy._click(event);event.preventDefault();",
              };
              for (var p in props) {
                toolbaritem.setAttribute(p, props[p]);
              }

              return toolbaritem;
            }
          });
        } catch(ee) {}

        quickProxy.addPrefListener(quickProxy.buttonPrefListener); // 登録処理
        window.addEventListener('unload',function(){
            quickProxy.removePrefListener(quickProxy.buttonPrefListener);
          }
        ,false);

        var count = 0, timer = setInterval(function(){if(++count > 50 || (function(){
            var icon = document.getElementById("quickproxy-status");
            if (!icon)
              return false;

            var qp_autooff = quickProxy.getPref('quickproxy.autooff', 'bool', true);
            var Is_Proxy_On = quickProxy.getPref("network.proxy.type", 'int', 0);

            if (qp_autooff == true && quickProxy.getNumberOfWindow() == 1){
              Is_Proxy_On = 0
            }
            quickProxy.setPref("network.proxy.type", 'int', Is_Proxy_On);

            quickProxy._updateUI();
            return true;
        })()) clearInterval(timer);},1000);
      },

      getNumberOfWindow: function(){
        var mediator = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                       .getService(Components.interfaces.nsIWindowMediator);
        var enumerator = mediator.getEnumerator("navigator:browser");
        var num = 0;
        while(enumerator.hasMoreElements()) {
          var win = enumerator.getNext();
          num++;
        }
        return num;
      },

      _switch: function() {
        var Is_Proxy_On = this.getPref("network.proxy.type", 'int', 0);
        var Proxy_Type = this.getPref("quickproxy.type", 'int', 1);
        if (Is_Proxy_On == 0){
          Is_Proxy_On = Proxy_Type;
        }else{
          Is_Proxy_On = 0;
        }
        this.setPref("network.proxy.type", 'int', Is_Proxy_On);
        this._updateUI();
      },

      _click: function(e){
        if (e.button == 0){
          this._switch();
        }
        if (e.button == 2) {
          var aURL = "chrome://browser/content/preferences/connection.xul";
          if (parseInt(Components.classes["@mozilla.org/xre/app-info;1"]
              .getService(Components.interfaces.nsIXULAppInfo)
              .version.substr(0,3) * 10,10) / 10 < 3) {
            //Fx2
            var aName ="";
            var aFeatures = 'modal,centerscreen,resizable=no';
            var aParams = null;
            openDialog(aURL, aName, aFeatures, aParams);
          } else {
            if (this.optionInTab) {
              //Fx3 タブバージョン (タブが一つの時, 閉じるとFxも閉じてしまう)
              if ("isBlankPageURL" in window ? isBlankPageURL(gBrowser.currentURI.spec) : gBrowser.currentURI.spec == "about:blank")
                 gBrowser.loadOneTab(aURL);
               else
                 gBrowser.selectedTab = gBrowser.addTab(aURL);
              var Proxy_Type = this.getPref("network.proxy.type", 'int', 0);
              if(Proxy_Type > 0) this.setPref("quickproxy.type", 'int', Proxy_Type);
              this._updateUI();
              e.preventDefault();

              setTimeout(function(self){
                if (gBrowser.mTabs.length == 1)
                  gBrowser.addTab();
              }, 200 , this);

              return;
            } else {
              //Fx3 ダイアログバージョン
              var prefBack = this.getPref("browser.preferences.instantApply", "bool", false);
              this.setPref("browser.preferences.instantApply", "bool", true);
              var w = openPreferences("paneAdvanced", {"advancedTab":"networkTab"});
              setTimeout(function(self, w, prefBack){
                self.optionOnload(w, prefBack);
              }, self.optionDelay, this, w, prefBack);

              var Proxy_Type = this.getPref("network.proxy.type", 'int', 0);
              if(Proxy_Type > 0) this.setPref("quickproxy.type", 'int', Proxy_Type);
              this._updateUI();
              e.preventDefault();
              return;
            }
          }
        }
        if (e.button == 1) {
          var qp_autooff = this.getPref('quickproxy.autooff', 'bool', true);
          var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
                          .getService(Components.interfaces.nsIPromptService);
          var check = {value: qp_autooff};
          prompts.alertCheck(window, '配置快速代理', '设置启动火狐时的代理状态 (*^__^*)',
                             "启动Firefox时禁用代理?", check);
          this.setPref('quickproxy.autooff', 'bool', check.value);
        }
        e.preventDefault();
      },

      optionOnload: function(w, prefBack){alert(2)
        this.setPref("browser.preferences.instantApply", "bool", prefBack);
        w.gAdvancedPane.showConnections();
      },

      _updateUI: function() {
        var Is_Proxy_On = this.getPref("network.proxy.type", 'int', 0);
        var icon = document.getElementById("quickproxy-status");
        var text1 = "";
        switch (Is_Proxy_On) {
          case 0:
          case 3:
            icon.classList.add("quickproxy-status-off");
            icon.classList.remove("quickproxy-status-on");
            icon.setAttribute("tooltiptext", "代理已禁用 o(︶︿︶)o");
            return;
          case 1:
            var ip = this.getPref("network.proxy.http", "str", "");
            var port = this.getPref("network.proxy.http_port", "int", 0);
            text1 = "\n" + ip + ":" + port;
            break;
          case 2:
            text1 = "\nAutomatic proxy configuration";
            break;
          case 4:
            text1 = "\nAuto-detect proxy settings for this network";
            break;
          case 5:
            text1 = "\nUse system proxy settings";
            break;
        }
        icon.classList.add("quickproxy-status-on");
        icon.classList.remove("quickproxy-status-off");
        icon.setAttribute("tooltiptext", "代理已启用 (*^__^*)" + text1);
      },

      getPref: function(aPrefString, aPrefType, aDefault){
        var xpPref = Components.classes["@mozilla.org/preferences-service;1"]
                     .getService(Components.interfaces.nsIPrefBranch);
        try{
          switch (aPrefType){
            case "str":
              return xpPref.getCharPref(aPrefString).toString(); break;
            case "int":
              return xpPref.getIntPref(aPrefString); break;
            case "bool":
            default:
              return xpPref.getBoolPref(aPrefString); break;
          }
        }catch(e){
        }
        return aDefault;
      },

      setPref: function(aPrefString, aPrefType, aValue){
        var xpPref = Components.classes["@mozilla.org/preferences-service;1"]
                     .getService(Components.interfaces.nsIPrefBranch);
        try{
          switch (aPrefType){
            case "str":
              return xpPref.setCharPref(aPrefString, aValue); break;
            case "int":
              aValue = parseInt(aValue);
              return xpPref.setIntPref(aPrefString, aValue);  break;
            case "bool":
            default:
              return xpPref.setBoolPref(aPrefString, aValue); break;
          }
        }catch(e){
        }
        return null;
      },
      // 監視を開始する
      addPrefListener: function(aObserver) {
        try {
          var pbi = Components.classes['@mozilla.org/preferences;1'].getService(Components.interfaces.nsIPrefBranch2);
          pbi.addObserver(aObserver.domain, aObserver, false);
        } catch(e) {}
      },

      // 監視を終了する
      removePrefListener: function(aObserver) {
        try {
          var pbi = Components.classes['@mozilla.org/preferences;1'].getService(Components.interfaces.nsIPrefBranch2);
          pbi.removeObserver(aObserver.domain, aObserver);
        } catch(e) {}
      },

      buttonPrefListener:{
        domain  : 'network.proxy.type',
          //"grabScroll.XXX"という名前の設定が変更された場合全てで処理を行う

        observe : function(aSubject, aTopic, aPrefstring) {
          if (aTopic == 'nsPref:changed') {
            // 設定が変更された時の処理
            var type = quickProxy.getPref(aPrefstring, 'int', 0);
            if (type != 0)
              quickProxy.setPref("quickproxy.type", 'int', type);
            quickProxy._updateUI();
          }
        }
      }

    }
    quickProxy._init();
  ]]>
</script>
</overlay>

創作回應

更多創作