aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpekepeke2008-11-26 15:02:44 +0000
committerpekepeke2008-11-26 15:02:44 +0000
commitd6b875f602e3646109f54fd3461b516b1585afea (patch)
treea0d55c0ec45e88dc72088bbc9e7f899a9d247479
parent1fe141a3390e785d5de12537aad18d5df81a342a (diff)
downloadvimperator-plugins-d6b875f602e3646109f54fd3461b516b1585afea.tar.bz2
2.0pre対応
refcontrol, autoproxychanger 追加 git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@24976 d0d07461-0603-4401-acd4-de1884942a52
-rw-r--r--autoproxychanger.js223
-rw-r--r--commandBookmarklet.js3
-rw-r--r--copy.js4
-rw-r--r--direct_bookmark.js9
-rw-r--r--direct_hb.js14
-rw-r--r--encodingSwitcherCommand.js24
-rw-r--r--ldrize_cooperation.js6
-rw-r--r--localkeymode.js38
-rw-r--r--refcontrol.js200
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);
}
diff --git a/copy.js b/copy.js
index d58aafe..48a8942 100644
--- a/copy.js
+++ b/copy.js
@@ -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;
+
+})();