var PLUGIN_INFO = autoproxychanger setting proxy proxyの設定・自動切り替え 0.1.3 pekepeke 2.0pre 2.0pre http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/autoproxychanger.js || let autochanger_proxy_settings = "[{ name:'disable', usage: 'direct connection', proxy:{type:0} }]" let autochanger_proxy_enabled = "true" ||< or your can set it using inline JavaScript. >|| liberator.globalVariables.autochanger_proxy_enabled = true; liberator.globalVariables.autochanger_proxy_settings = [{ name : 'disable', usage : 'direct connection', proxy :{ type :0, }, },{ name : 'http', usage : 'localhost proxy', proxy :{ type : 1, http : 'localhost', http_port : 8080, }, url : /http:\/\/www.nicovideo.jp/, run : 'java.exe', args : ['C:\Personal\Apps\Internet\NicoCacheNl\NicoCache_nl.jar'], }]; EOM ||< ]]> ; liberator.plugins.AutoProxyChanger = (function() { var gVar = liberator.globalVariables; var proxy_settings = gVar.autochanger_proxy_settings; if (!proxy_settings) { proxy_settings = [{ name : 'disable', usage : 'direct connection', proxy : { type : 0, }, }, { name : 'http', usage : 'localhost:8080', proxy : { type : 1, http : 'localhost', http_port : 8080, }, }]; } const ENABLE_ICON = 'data:image/png;base64,' + 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMA/wAAAIBJekM9AAAB' + 'mElEQVR4nIWS3StDYRzHv895njOvaWy4WWPJcquE8nIrbSW54mrGjWsppbQtCuXajZd/QDKs' + 'UNxoLpYbKc1b2zm4mJ2NsGPNOC6OnHXGfO+eb8/neX6fp4e43aNWax3+iCgKK6uW3IZZrXXT' + '01OEkPzdiqL4fLPja04Al6H97aU3AAwAIcTmmMsHIoFJAIvDfgDja31Y8n8Dapw97cUGSilH' + 'CUlnshuB41+H1IDMJ5QsMb2cc3LMALha4fXOAPB6KIAKYcfroaIoaMBTKltaSqvlWGElDQgd' + 'nwBwtf6jxFRUXQDfYxRQYqIo+Hyz+eepSm/y+3MqI6czmvTVdbh/wGFvbBJuI2ZT9dbmbq4S' + '4w3l5ZTjOA1wOHuNxkrhNsIYLyXiOqX8MADBYFD3Gj9Kuh4AUeDJbUfcd4W/FhtbbEmfrT9+' + 'lJ0eBSJRl05JSsTNphop8WCrbwiHzw8O92j34EQtiZU1D7XZSpYtF51dHXa7XUrGGeNfUy8c' + 'x6XkV57xiaRUZawyFPFMTt4no9HHm2X1hvkFvZIuXyp4v/YfvuEoAAAAAElFTkSuQmCC'; const DISABLE_ICON = 'data:image/png;base64,' + 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMA/wAAAIBJekM9AAAB' + 'i0lEQVR4nH2SwUoCURSG/7lzZwJxYWqtRItQwm3LbCkStol8gLAW9QzB4AgW9QIJWc8QgVBI' + '7RQ3bsOmQGdsY466aCZ1RGwxksNo/rt7uN+55ztcJpk89vsD+CeKIt/e+awV6vcHBOGMYZjZ' + '2+PxOJ3OZK+9ACqVyk3OB4ACYBgmGo3OAoVCAcDJaRNA9noLueYEMBOLxXieZ1mWEDIYDPL5' + '/Nwhp8BoNBoOh71er9/vA4hEIqIoAqyYYgGgqYopVlHkKaBpmsPhMAxDEIQFSlOgXC6bjRcr' + 'URM1DwBEUVysRBVFTqczlkasVUnXdU3TTKsJ8P5R3T+Ih4KbcqPm9aw83D9alSilTqeTEDIF' + '4nu7Ltey3KhRyqntlk1p/lqLxaJtG39KtjoAZoyUtXqU/Fz8tejFOS9JkmEYpVKpVj+0Kant' + 'ltezqra/1tc2qtXX55cnNpFIcBwXDoeDwWDO9xbZ2Q6FQmqnRSmn6d+EEP1H4yjX7qhul5tf' + '4mi3263X65IkmS9cXtmVbPkFaGbHAxyF/18AAAAASUVORK5CYII='; var acmanager = []; const prefkeys = ['ftp','gopher','http','ssl']; var prevSetting = null; var _isEnable = false; var exec = (function(){ const Cc = Components.classes; const Ci = Components.interfaces; var getFile = function(){ if (arguments.length <= 0) return null; var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile); if (!file) return null; file.initWithPath(arguments[0]); for (var i=1; i= 0 || cmd.indexOf('\\') >= 0) && (file=getFile(cmd)) ) return run(file, arg, async); var env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); var exitValue = null; env.get('PATH').split(spchar).some( function(path){ if (file=getFile( path, cmd)){ exitValue = run(file, arg, async); return true; } return false; } ); return exitValue; }; })(); var ProxyChanger = function() this.initialize.apply(this, arguments); ProxyChanger.prototype = { initialize: function() { this.panel = this.createPanel(); }, createPanel: function() { var self = this; var panel = document.getElementById('proxychanger-status'); if (panel) { let parent = panel.parentNode; parent.removeChild(panel); } panel = document.createElement('statusbarpanel'); panel.setAttribute('id', 'proxychanger-status'); panel.setAttribute('class', 'statusbarpanel-iconic'); panel.setAttribute('src', self.isEnable ? ENABLE_ICON : DISABLE_ICON); panel.addEventListener('click', function(e) { self.isEnable = !self.isEnable; }, false); document.getElementById('status-bar').insertBefore( panel, document.getElementById('security-button').nextSibling); return panel; }, get isEnable() _isEnable, set isEnable(val) { this.panel.setAttribute('src', val ? ENABLE_ICON : DISABLE_ICON); _isEnable = val; }, autoApplyProxy : checkApplyProxy }; var manager = new ProxyChanger(); function init() { // initialize manager proxy_settings.forEach(function(s) { if (s.url instanceof RegExp && s.name) acmanager.push( {url: s.url, name: s.name, run: s.run || '', args: s.args || [] } ); }); proxy_settings.splice(0, 0, {name: 'default', usage: 'default setting', proxy: restore() }); if (acmanager.length > 0) { autocommands.add("LocationChange", '.*', 'js liberator.plugins.AutoProxyChanger.autoApplyProxy()'); window.addEventListener("unload", function() { if (prevSetting != null) applyProxy(prevSetting) }, false); } manager.isEnable = eval(gVar.autochanger_proxy_enabled) || false; } function restore() { var opt = new Object(); opt['type'] = options.getPref('network.proxy.type', 0); prefkeys.forEach(function(key) { opt[key] = options.getPref('network.proxy.' + key, ''); opt[key+'_port'] = options.getPref('network.proxy.' + key + '_port', 0); }); return opt; } function dump(obj) { var m = ''; for (let key in obj) m+=key+':'+obj[key]+'\n'; return m; } function checkApplyProxy() { if (prevSetting != null) { applyProxy(prevSetting); prevSetting = null; } if (!_isEnable) return; acmanager.some( function( manager ) { if (manager.url.test(content.location.href)) { prevSetting = restore(); try { if (manager.run) { if (exec(manager.run, manager.args, false) == null) throw "run process failed..."; manager.run = null; manager.args = null; } applyProxyByName(manager.name); return true; } catch(e) { liberator.echoerr(e); return true; } } return false; }); } function applyProxyByName( name ) { if (!name) { liberator.echo( dump(restore())+'usage:proxy [setting name]' ); return; } proxy_settings.some( function(setting) { if (setting.name.toLowerCase() != name.toLowerCase()) return false; // delete setting prefkeys.forEach( function(key) { options.setPref('network.proxy.'+key, ''); options.setPref('network.proxy.'+key+'_port', 0); }); // apply proxy applyProxy(setting.proxy); return true; }); } function applyProxy(proxy) { for (let key in proxy) { if (typeof proxy[key] != 'undefined') options.setPref('network.proxy.'+key, proxy[key]); } } commands.addUserCommand(['proxy'], 'Proxy settings', function(args) { if (args.bang) applyProxyByName('default'); else applyProxyByName(args.string); }, { bang: true, completer: function(context, arg) { context.title = ['Name', 'Usage']; var list = context.filter ? proxy_settings.filter( function(el) this.test(el.name), new RegExp('^'+context.filter)) : proxy_settings; context.completions = list.map( function(v) [v.name, v.usage] ); } }); commands.addUserCommand(['toggleautoproxy','aprxy'], 'Toggle auto proxy changer on/off', function() { manager.isEnable = !manager.isEnable liberator.echo('autoproxy:'+ manager.isEnable ? 'ON' : 'OFF'); }, {} ); init(); return manager; })(); 75 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
/* {{{
Copyright (c) 2008, anekos.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice,
       this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright notice,
       this list of conditions and the following disclaimer in the documentation
       and/or other materials provided with the distribution.
    3. The names of the authors may not be used to endorse or promote products
       derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.


###################################################################################
# http://sourceforge.jp/projects/opensource/wiki/licenses%2Fnew_BSD_license       #
# に参考になる日本語訳がありますが、有効なのは上記英文となります。                #
###################################################################################

}}} */

// PLUGIN_INFO {{{
let PLUGIN_INFO =
<VimperatorPlugin>
  <name>Command Menu</name>
  <description>Execute main-menu and tool-bar by ex-command.</description>
  <description lang="ja">メインメニューとツールバーをコマンドで実行できる</description>
  <version>1.5.2</version>
  <author mail="anekos@snca.net" homepage="http://d.hatena.ne.jp/nokturnalmortum/">anekos</author>
  <license>new BSD License (Please read the source code comments of this plugin)</license>
  <license lang="ja">修正BSDライセンス (ソースコードのコメントを参照してください)</license>
  <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/command_menu.js</updateURL>
  <minVersion>2.0pre</minVersion>
  <maxVersion>2.0pre</maxVersion>
  <detail><![CDATA[
    == Usage ==
      >||
        :menu tools-addons
        :toolbar back
      ||<
    == Requires ==
      XUL/Migemo addon
  ]]></detail>
  <detail lang="ja"><![CDATA[
    == Usage ==
      >||
        :menu ツール-アドオン
        :toolbar 戻る
      ||<
      のようにメニュー/ツールバーの"-"区切りのパスを渡すことでメニュー/ツールバーをクリックします
      Migemo必須
    == Requires ==
      XUL/Migemo アドオン
  ]]></detail>
</VimperatorPlugin>;
// }}}

// TODO ==
// ・一度開かないと生成されないようなメニュー(ラベル)に対処できる魔法があったらいいな!
//  (ScrapBook / ブックマークメニュー)
// ・コンテクストメニューがうまくいかない。

(function () {

  const migemo = Components
                  .classes['@piro.sakura.ne.jp/xmigemo/factory;1']
                  .getService(Components.interfaces.pIXMigemoFactory)
                  .getService("ja");

  function equal (x) function (y) x == y;

  function cloneArray (src) src.map(function (id) id);

  function matchPath (elem, path, getName) {
    var i = 0;
    for (let l = path.length; i < l; i++) {
      if (!path[i](getName(elem)))
        break;
    }
    if (i) {
      let res = [];
      for (let j = i, l = path.length; j < l; j++)
        res.push(path[j]);
      return res;
    }
  }

  function getElementsByPath (elem, path, getName, isTarget, isEnabled) {
    try {
      function get (point, elem, path) {
        var m = path[0](getName(elem, true));

        if (isTarget(elem)) {
          if (!isEnabled(elem))
            return [];
          if (m) {
            if (path.length == 1)
              return [[point + m, elem]];
            (path = cloneArray(path)).shift();
          } else {
            return [];
          }
        }

        //elem.containerOpen = true;
        var res, cs = elem.childNodes, result = [];
        if (cs && cs.length) {
          for (let i = 0, l = cs.length; i < l; i++) {
            if (res = get(m + point, cs[i], path))
              res.map(function (it) it && result.push(it));
          }
        }
        //elem.containerOpen = false;

        return result;
      }

      return get(0, elem, path).sort().map(function (it) it[1]);
    } catch (e) { liberator.log(e); }
  }

  function getPathMatchers (args)
    args.split('-').map(function (it)
      function (l)
        !l                                                        ? 0 :
        l == it                                                   ? 1 :
        l.toLowerCase().indexOf(it.toLowerCase()) >= 0            ? 2 :
        new RegExp(migemo.getRegExp(it.replace(/^\s+|\s+$/, '')),
                   'i').test(l)                                   ? 3 :
                                                                    0);

  function getPathString (elem, isRoot, getName, isTarget) {
    var res = [];
    while (!isRoot(elem)) {
      isTarget(elem) && res.unshift(getName(elem));
      elem = elem.parentNode;
    }
    return res.join('-');

  }



  /*********************************************************************************
   * メインメニュー
   *********************************************************************************/

  const mainMenubar = document.getElementById('main-menubar');
  const toolbox = document.getElementById('navigator-toolbox');
  const contextmenu = document.getElementById('contentAreaContextMenu');

  function fixName (name)
    name ? name.replace(/^\s+|\s+$/, '').replace(/[-\s]+/g, '_') : '';

  function getElementName (elem, multi)
    multi ? [elem.label, elem.tooltipText].map(function (it) fixName(it) || '')
                                          .join('-')
          : fixName(elem.label || elem.tooltipText || '');

  function isNotHidden (elem)
    !elem.hidden ? true : false;

  function isClickable (elem)
    /^(?:menu(?:item)?|toolbarbutton)$/.test(elem.nodeName.toLowerCase());

  function addCommand (cmds, name, root, action) {
    function _find (args, single) {
      var result = getElementsByPath(root,
                                     getPathMatchers(args),
                                     getElementName,
                                     isClickable,
                                     isNotHidden);
      return single ? result[0] : result;
    }

    if (!action) {
      action = function (elem) {
        if (!elem.click)
          return;
        elem.click();
        return true;
      };
    }

    commands.addUserCommand(
      cmds,
      name,
      function (arg) {
        var res = _find(arg.string.replace(/-\s*$/,''), true);
        if (!(res && action(res)))
          liberator.echoerr('menu not found');
      },
      {
        completer: function (context, arg) {
          const gps = function (it) getPathString(it, equal(root), getElementName, isClickable);
          const fp = function (it) [gps(it), it.tooltipText || ''];
          return [0, _find(context.filter).map(fp)];
        }
      },
      true
    );
  }

  addCommand(['me[nu]'], 'Command MainMenu', mainMenubar);
  addCommand(['toolbar', 'tb'], 'Command Toolbar', toolbox);
  addCommand(['conme', 'contextmenu'],
             'Context Menu',
             contextmenu,
             function (elem) {
               //contextmenu.openPopup(null, null, 0, 0, true);
               //contextmenu.hidePopup();
               elem.click();
               //elem.doCommand();
               return true;
             }
  );

})();