diff options
-rw-r--r-- | autoproxychanger.js | 223 | ||||
-rw-r--r-- | commandBookmarklet.js | 3 | ||||
-rw-r--r-- | copy.js | 4 | ||||
-rw-r--r-- | direct_bookmark.js | 9 | ||||
-rw-r--r-- | direct_hb.js | 14 | ||||
-rw-r--r-- | encodingSwitcherCommand.js | 24 | ||||
-rw-r--r-- | ldrize_cooperation.js | 6 | ||||
-rw-r--r-- | localkeymode.js | 38 | ||||
-rw-r--r-- | refcontrol.js | 200 |
9 files changed, 477 insertions, 44 deletions
diff --git a/autoproxychanger.js b/autoproxychanger.js new file mode 100644 index 0000000..f3394f4 --- /dev/null +++ b/autoproxychanger.js @@ -0,0 +1,223 @@ +/** + * ==VimperatorPlugin== + * @name autoproxychanger.js + * @description proxy setting plugin + * @description-ja プロクシ設定 + * @minVersion 2.0pre + * @author pekepeke + * @version 0.1.1 + * ==/VimperatorPlugin== + * + * Usage: + * :proxy [setting_name] -> set proxy setting to setting_name + * :proxy! -> set proxy setting to default setting + * :toggleautoproxy -> proxy autochanger on/off toggle + * + * The proxy_settings is a string variable which can set on + * vimperatorrc as following. + * + * 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 proxy_settings = liberator.globalVariables.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 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) { + var 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(){ + return _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() applyProxyByName('default'), false); + } + + manager.isEnable = eval(liberator.globalVariables.autochanger_proxy_enabled) || false; +} +function restore(){ + let 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 (var 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(); + applyProxyByName(manager.name); + if (manager.run) { + io.run(manager.run, manager.args, false); + manager.run = null; manager.args = null; + } + 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 (var key in proxy){ + if (typeof proxy[key] != 'undefined') + options.setPref("network.proxy."+key, proxy[key]); + } +} + +commands.addUserCommand(["proxy"], 'Proxy settings', + function(args, bang) { + if (bang) applyProxyByName('default'); + else applyProxyByName(args.string); + }, { + bang: true, + completer: function(context, arg, special){ + 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}, {} +); + +init(); +return manager; +})(); diff --git a/commandBookmarklet.js b/commandBookmarklet.js index d25d338..989c301 100644 --- a/commandBookmarklet.js +++ b/commandBookmarklet.js @@ -17,11 +17,12 @@ } } + const regex = /[^a-zA-Z]/; items.forEach(function(item) { var [url, title] = [item.url, item.title]; var desc = title; title = escape( title.replace(/ +/g,'').toLowerCase() ); - if (/[^a-zA-Z]+/.test(title)) { + if (regex.test(title)) { title = "bm"+title.replace(/[^a-zA-Z]+/g,''); title = title.substr(0, title.length>50?50:title.length); } @@ -91,9 +91,9 @@ commands.addUserCommand(['copy'],'Copy to clipboard', var templates = liberator.globalVariables.copy_templates.map(function(template) [template.label, liberator.modules.util.escapeString(template.value, '"')] ); - if (!context.filter){ context.items = templates; return; } + if (!context.filter){ context.completions = templates; return; } var candidates = []; - context.items = completion.filter(templates, context.filter, true); + context.completions = completion.filter(templates, context.filter, true); }, bang: true } diff --git a/direct_bookmark.js b/direct_bookmark.js index 58c20f9..88ee223 100644 --- a/direct_bookmark.js +++ b/direct_bookmark.js @@ -632,14 +632,17 @@ d.error(function(e){liberator.echoerr("direct_bookmark.js: Exception throwed! " + e);liberator.log(e);});
setTimeout(function(){first.call();},0);
},{
- completer: function(filter){
+ completer: function(context, arg, special){
+ let filter = context.filter;
var match_result = filter.match(/((?:\[[^\]]*\])*)\[?(.*)/); //[all, commited, now inputting]
var m = new RegExp(XMigemoCore && isUseMigemo ? "^(" + XMigemoCore.getRegExp(match_result[2]) + ")" : "^" + match_result[2],'i');
var completionList = [];
if(liberator.plugins.direct_bookmark.tags.length == 0)
getTags().call([]);
- return [match_result[1].length, [["[" + tag + "]","Tag"]
- for each (tag in liberator.plugins.direct_bookmark.tags) if (m.test(tag) && match_result[1].indexOf('[' + tag + ']') < 0)]];
+ context.title = ['Tag','Description'];
+ context.advance( match_result[1].length );
+ context.completions = [["[" + tag + "]","Tag"]
+ for each (tag in liberator.plugins.direct_bookmark.tags) if (m.test(tag) && match_result[1].indexOf('[' + tag + ']') < 0)];
},
options: [
[['-s','-service'], liberator.modules.commands.OPTION_STRING],
diff --git a/direct_hb.js b/direct_hb.js index 8624d69..040a8d6 100644 --- a/direct_hb.js +++ b/direct_hb.js @@ -148,7 +148,7 @@ httpGET("http://b.hatena.ne.jp/my",
function(mypage_text){
var mypage_html = parseHTML(mypage_text);
- var tags = getElementsByXPath("//ul[@id=\"taglist\"]/li/a",mypage_html);
+ var tags = getElementsByXPath("//ul[@id=\"tags\"]/li/a",mypage_html);
tags.forEach(function(tag){
liberator.plugins.hatena_tags.push(tag.innerHTML);
});
@@ -185,7 +185,8 @@ {}
);
commands.addUserCommand(['hb'],"Post to HatenaBookmark",
- function(arg){
+ function(args){
+ var arg = args.string;
try {
var passwordManager = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
var logins = passwordManager.findLogins({}, 'https://www.hatena.ne.jp', 'https://www.hatena.ne.jp', null);
@@ -196,9 +197,10 @@ }
catch(ex){
}
- addHatenaBookmarks(hatenaUser,hatenaPassword,liberator.buffer.URL,arg,isNormalize);
+ addHatenaBookmarks(hatenaUser,hatenaPassword,modules.buffer.URL,arg,isNormalize);
},{
- completer: function(filter){
+ completer: function(context, arg, special){
+ let filter = context.filter;
//var match_result = filter.match(/(.*)\[(\w*)$/); //[all, commited, now inputting]
var match_result = filter.match(/((?:\[[^\]]*\])+)?\[?(.*)/); //[all, commited, now inputting]
//var m = new RegExp("^" + match_result[2]);
@@ -209,7 +211,9 @@ completionList.push([(match_result[1] || "") + "[" + tag + "]","Tag"]);
}
});
- return [0, completionList];
+ context.title = ['Tag','Description'];
+// context.advance(match_result[1].length);
+ context.completions = completionList;
}
}
);
diff --git a/encodingSwitcherCommand.js b/encodingSwitcherCommand.js index bf3cba6..8071313 100644 --- a/encodingSwitcherCommand.js +++ b/encodingSwitcherCommand.js @@ -96,8 +96,10 @@ liberator.modules.commands.addUserCommand(['fileencoding','fenc'],'set the chara } }, { - completer: function(filter) - [0,completion( encodings, filter)] + completer: function(context, arg, special){
+ let filter = context.filter;
+ context.completions = completion( encodings, filter); + } } ); liberator.modules.commands.addUserCommand(['autodetector','audet'],'set auto detect character encoding', function(args) { @@ -126,8 +128,10 @@ liberator.modules.commands.addUserCommand(['autodetector','audet'],'set auto det } }, { - completer: function(filter) - [0,completion( detectors, filter)] + completer: function(context, arg, special){
+ let filter = context.filter;
+ context.completions = completion( detectors, filter); + } } ); function listCharset(arg, current, list){ @@ -153,8 +157,10 @@ liberator.modules.commands.addUserCommand(['listencoding','lsenc'],'list all enc var arg = args.string == undefined ? args: args.string; listCharset(arg, liberator.modules.options.fileencoding, encodings); },{ - completer: function(filter) - [0,completion(encodings, filter)] + completer: function(context, arg, special){
+ let filter = context.filter;
+ context.completions = completion( encodings, filter); + } } ); liberator.modules.commands.addUserCommand(['listdetector','lsdet'],'list all auto detectors', @@ -162,8 +168,10 @@ liberator.modules.commands.addUserCommand(['listdetector','lsdet'],'list all aut var arg = args.string == undefined ? args: args.string; listCharset(arg, liberator.modules.options.autodetector, detectors); },{ - completer: function(filter) - [0,completion(detectors, filter)] + completer: function(context, arg, special){
+ let filter = context.filter;
+ context.completions = completion( detectors, filter); + } } ); diff --git a/ldrize_cooperation.js b/ldrize_cooperation.js index fa2640c..b091f41 100644 --- a/ldrize_cooperation.js +++ b/ldrize_cooperation.js @@ -268,7 +268,8 @@ liberator.modules.commands.addUserCommand(["mb","m","minibuffer"], "Execute Minibuffer",
function(arg){self.Minibuffer.execute(arg.string)},
{
- completer: function(filter){
+ completer: function(context, arg, special){
+ let filter = context.filter;
var completionList = [];
var command = self.Minibuffer.command;
var alias = self.Minibuffer.alias_getter();
@@ -276,7 +277,8 @@ var exp = new RegExp("^" + tokens.pop());
for(let i in command) if(exp.test(i))completionList.push([tokens.concat(i).join(" | "),"MinibufferCommand"]);
for(let i in alias) if(exp.test(i))completionList.push([i,"MinibufferAlias"]);
- return [0,completionList];
+ context.title = ['Minibuffer Command', 'Description'];
+ context.completions = completionList;
}
});
liberator.modules.commands.addUserCommand(["pindownload"], "Download pinned links by any software",
diff --git a/localkeymode.js b/localkeymode.js index 65b4c22..3ab2ccb 100644 --- a/localkeymode.js +++ b/localkeymode.js @@ -42,28 +42,16 @@ * EOM * * 備考: - * * + * * */ liberator.plugins.LocalKeyMode = (function() { - + // アイコン定義 const DISABLE_ICON = 'data:image/png;base64,' - +'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAADAFBMVEUAAAABAQECAgIDAwMEBAQF' - +'BQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUWFhYXFxcY' - +'GBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJycoKCgpKSkqKior' - +'KyssLCwtLS0uLi4vLy8wMDAxMTEyMjIzMzM0NDQ1NTU2NjY3Nzc4ODg5OTk6Ojo7Ozs8PDw9PT0+' - +'Pj4/Pz9AQEBBQUFCQkJDQ0NERERFRUVGRkZHR0dISEhJSUlKSkpLS0tMTExNTU1OTk5PT09QUFBR' - +'UVFSUlJTU1NUVFRVVVVWVlZXV1dYWFhZWVlaWlpbW1tcXFxdXV1eXl5fX19gYGBhYWFiYmJjY2Nk' - +'ZGRlZWVmZmZnZ2doaGhpaWlqampra2tsbGxtbW1ubm5vb29wcHBxcXFycnJzc3N0dHR1dXV2dnZ3' - +'d3d4eHh5eXl6enp7e3t8fHx9fX1+fn5/f3+AgICBgYGCgoKDg4OEhISFhYWGhoaHh4eIiIiJiYmK' - +'ioqLi4uMjIyNjY2Ojo6Pj4+QkJCRkZGSkpKTk5OUlJSVlZWWlpaXl5eYmJiZmZmampqbm5ucnJyd' - +'nZ2enp6fn5+goKChoaGioqKjo6OkpKSlpaWmpqanp6eoqKipqamqqqqrq6usrKytra2urq6vr6+w' - +'sLCxsbGysrKzs7O0tLS1tbW2tra3t7e4uLi5ubm6urq7u7u8vLy9vb2+vr6/v7/AwMDBwcHCwsLD' - +'w8PExMTFxcXGxsbHx8fIyMjJycnKysrLy8vMzMzNzc3Ozs7Pz8/Q0NDR0dHS0tLT09PU1NTV1dXW' - +'1tbX19fY2NjZ2dna2trb29vc3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm5ubn5+fo6Ojp' - +'6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6+vr7+/v8' - +'/Pz9/f3+/v7////isF19AAAAPElEQVR4nGNYgwYYsAv8/48Q6AeB///7YQBToAkE/v9vggFMgRIQ' - +'+P+/BAYwBQibgcsdEAASmIsGCAsAAE8ZnUuRMbA8AAAAAElFTkSuQmCC'; + +'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAZ0lEQVR4nGNcvXo1AymAiSTV' + +'WDSEhISEhITg0cDy+PFjTFGsgmQ6ieXz58+YolgFybXh06dPmKJYBcm1gY+PD1MUqyC5NvDy' + +'8mKKYhWEasAqWlhYiCbS398PYTDOmTOHJCdRnPgIAgBfBxpKyax43AAAAABJRU5ErkJg' + +'gg=='; const ENABLE_ICON = 'data:image/png;base64,' +'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAa0lEQVR4nGP0+OzAQApgIkk1Fg3b' +'efZv59mPRwMjwycU/n/e/wwMDIyfGanmJBaG16gCvAwMDAzogpTZ8AJVQImBgYEBXZAyGySwCWMV' @@ -73,7 +61,7 @@ liberator.plugins.LocalKeyMode = (function() { + 'Gpz+Mzj9x6OBheEZNmGsguQ5iYXhHjZhrILk2vAVmzBWQXJt4MYmjFWQXBuUsAljFYRqwApi' + 'MCJ7CSOEZqR/4iMEAOh5DfER9lQKAAAAAElFTkSuQmCC'; const rhsRegExp = /[ \r\n]+/g; - + var _isEnable; var _isBindLocalKey = false; @@ -312,12 +300,16 @@ liberator.plugins.LocalKeyMode = (function() { } } }, { - completer: function(filter) { + completer: function(context, arg, special){ + let filter = context.filter; var names = self.completeNames; - if (!filter) return [0, names]; + context.title = ['Name','Description']; + if (!filter) { + context.completions = names; + return; + } filter = filter.toLowerCase(); - return [0, names.filter( function(el) - el[0].toLowerCase().indexOf(filter) == 0) ]; + context.completions = names.filter( function(el) el[0].toLowerCase().indexOf(filter) == 0); } } ); commands.addUserCommand(['clearkeymaps', 'clearlocalkeymaps'], 'Clear local key mapping', diff --git a/refcontrol.js b/refcontrol.js new file mode 100644 index 0000000..9a61a60 --- /dev/null +++ b/refcontrol.js @@ -0,0 +1,200 @@ +/** + * ==VimperatorPlugin== + * @name refcontrol + * @description control referrer + * @description-ja リファラー制御 + * @version 0.1.0 + * ==/VimperatorPlugin== + * + * Usage: + * + * :togglerefcontrol - 有効/無効のトグルです。(ステータスバーのアイコンクリックでも切り替え可能) + * :addref - リファラー設定追加(再起動すると消えます) + * + * .vimperatorrc + * g:localkeymode_enable : [true=有効/false=無効(デフォルト)] + * + * .vimperatorrrc 設定例: + * let g:refcontrol_enabled = "true" + * javascript <<EOM + * liberator.globalVariables.refcontrol={ + * '@DEFAULT' : '@FORGE', + * 'tumblr.com' : '@FORGE', + * 'del.icio.us': '@NORMAL', + * //domain : param, + * }; + * EOM + * + * domain> + * '@DEFAULT' はデフォルト設定を指します。 + * + * param> + * @NORMAL : 通常の動作です。 + * @FORGE : ドメインのルートをリファラにセットします。 + * '' : リファラーを送信しません + * url : 指定したURLでリファラーを送信します。 + * + * 備考: + * + */ +liberator.plugins.RefControl = (function(){ + +const Cc = Components.classes; +const Ci = Components.interfaces; + +const ENABLE_ICON = 'data:image/png;base64,' + + 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMA/wAAAP+JwC+QAAAB' + + 't0lEQVR4nI1RTWsTURQ9d96bTJpMW8bY0pEspB80IBJtQzctkpWI4KrgHxAFQXDlxh8gKBTc' + + 'uHXRje78Af6AoqCCVSjBfi9MGakyJiZ5X9dFFZPpIl7O5r17zj3vnkcMlkFhbvX29LWbU5eX' + + 'hO9jsNjZo80Pe69fbb14pto/JJE3e/1O7f7jcCwvPIAzfJAQ5WqtNFu1lrx1X4xPX7x0d22y' + + 'POU0XA9WDcBpWAVY5ITITVSSTxsyiOJCKTYK7LKz/5kQLGG0NBlEsSSSYGkU+NRjMmUMeX5e' + + 'Omaj2eghbABGMzNLZjba6f8UOJYAWct2mIAZ1sAxpNXt7q+fQb5I5P3dMcMFwMxOKWW6qew0' + + 'd1rHh+MTsemaP79ARCAQgZnBJ2mIQKTJbqe543WSw8bzB0myz5F0YeDCwAXSglWvp7TW2tq8' + + 'jzO54/Sosf6wdfCZGAxgdKYWziyG5xdAVCzPR5WVEc+adi/99vX77tvW9pvW9vu0scHsTiwH' + + 'QMKPFm9Un3ysv9RLT7+MVer9XXk6EGcV3qHQvHC2fiu+eq8wt4ytgQyyDv0I56+cW33UfzNE' + + 'wGBRjPqPvwHSQByM8Fg+IQAAAABJRU5ErkJggg=='; + +const DISABLE_ICON = 'data:image/png;base64,' + + 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMA/wAAAP+JwC+QAAAB' + + 'kklEQVR4nIVSzWoiQRCu/hkdHRh7dfxZNmGH5CasV0/eosx75OL7+AI+wZK8hDcvySQkgouQ' + + 'Q0RwMpdo07ZdOTRpREP2o/noqvq+ruqmCQLyYvn3r5+9Xi+KomKxSAhhjJVKJc/zdrvder3O' + + 'smwymcxfXtV7ToCQ/tXVcDgMw5BSaow5ZQCQUo7H4783t/z87GwwGPi+r5SytSM4Z5IkaZpS' + + 'IUSr1TLGSCkBQCl1xDZvjBFCCCG4LZzqvmRCCLVuKaWU0m6+YQCgxhg3vc26SZzOCpRSiEjd' + + 'O7gbu8McnGe73XL5CUqpUxyF1q+U0lrz/X6/Wq2q1ap9DYtCoXAYAoDv+8vlkjHGsrfs+uU6' + + 'juN6vc45Z4x5nqe11lojIiISQoIg4JyPRqOn5yeCgADQ+dMRQlQqlXK5jIi1Wq3ZbIZhuNls' + + 'ZrPZYrHI8/w+TRENtx3v7u9c98uLyyAIkiSJoijP8+l0+vD44Kr89C/M/80BoAOdOI673W6j' + + '0YDHgzICfrPa7Xa/3z/M/MeAgCz4cRh+AOxEaXXUX/5aAAAAAElFTkSuQmCC'; + +var sites; +var _isEnable = false; + +const completer_params = [['', 'send referrer:nothing'], + ['@FORGE', 'send referrer:top domain url'], + ['@NORMAL','send referrer:normal']]; + +// icon manager object +var Class = function(){ return function(){this.initialize.apply(this, arguments);}}; +var RefControl = new Class(); + +RefControl.prototype = { + initialize : function(){ + this.panel = this.createPanel(); + this.isEnable = eval(liberator.globalVariables.refcontrol_enabled) || false; + }, + createPanel: function(){ + var self = this; + var panel = document.getElementById('refcontrol-status-panel'); + if (panel) { + var parent = panel.parentNode; + parent.removeChild(panel); + } + panel = document.createElement('statusbarpanel'); + panel.setAttribute('id', 'refcontrol-status-panel'); + 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(){ return _isEnable }, + set isEnable(val){ + this.panel.setAttribute('src', val ? ENABLE_ICON : DISABLE_ICON); + _isEnable = val; + }, +} + +// some utilities +var init = function(){ + // read settings + sites = liberator.globalVariables.refcontrol; + if (typeof sites == 'undefined') sites = new Object(); + if (typeof sites['@DEFAULT'] == 'undefined') sites['@DEFAULT'] = '@NORMAL'; +} + +var dump = function(obj){ + var m=""; + for (var key in obj){ + m+=key+":"+obj[key]+"\n"; + } + return m; +} + +init(); +var manager = new RefControl(); + +// add user command +commands.addUserCommand(['addref'], 'add referrer control setting' , function(args){ + let domain = args.arguments[0]; + let perf = args.arguments[1] || ''; + if (!domain || /[:\/]/.test(domain)) { + liberator.echo(dump(sites)+'usage: addref [domain] [@NORMAL or @FORGE or empty]'); + return; + } + sites[domain] = perf; + },{ + completer: function(context, arg, special){ + let last = context.contextList.slice(-1)[0]; + var args = arg.arguments; + let list; + var pos = 0; + if (args.length == 2) { + context.title = ['Params','Description']; + list = completer_params; + //pos = 1; + } else if (args.length <= 1) { + context.title = ['Url','Description']; + list = [['@DEFAULT','default preference'], [window.content.location.host, '']]; + } + context.completions = list; + context.advance(pos); + } + } +); + +commands.addUserCommand(['togglerefcontrol'], 'toggle referrer control on/off', + function() { + manager.isEnable = !manager.isEnable; + },{} +); + +// regist refcontrol +var adjustRef = function (http, site) { + try { + var sRef; + var refAction = sites[site]; + if (refAction == undefined) return false; + if (refAction.charAt(0) == '@'){ + switch (refAction){ + case '@NORMAL': + return true; + case '@FORGE': + sRef = http.URI.scheme + "://" + http.URI.hostPort + "/"; + break; + default: + return false; + } + } else if (refAction.length > 0) sRef = refAction; + + http.setRequestHeader("Referer", sRef, false); + if (http.referrer) + http.referrer.spec = sRef; + return true; + } catch (e) {} + return false; +} + +Cc['@mozilla.org/observer-service;1'].getService(Ci.nsIObserverService).addObserver({ + observe: function(subject,topic,data){ + if (topic != 'http-on-modify-request') return; + if (!_isEnable) return; + var http = subject.QueryInterface(Ci.nsIHttpChannel); + for (var s = http.URI.host; s != ""; s = s.replace(/^.*?(\.|$)/, "")) + if (adjustRef(http, s)) return; + adjustRef( http, '@DEFAULT'); + } +},'http-on-modify-request',false); + +return manager; + +})(); |