Last active
September 25, 2015 15:48
-
-
Save 958/945710 to your computer and use it in GitHub Desktop.
[keysnail]refcontrol plugin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var PLUGIN_INFO = | |
<KeySnailPlugin> | |
<name>refcontrol</name> | |
<description>control referrer</description> | |
<description lang="ja">リファラー制御</description> | |
<updateURL>https://gist.github.com/958/945710/raw/refcontrol.ks.js</updateURL> | |
<version>0.1.1</version> | |
<author>958</author> | |
<minVersion>1.8.0</minVersion> | |
<detail><![CDATA[ | |
=== エクステ === | |
refcontrol-toggle | |
有効/無効のトグルです。(ステータスバーのアイコンクリックでも切り替え可能) | |
refcontrol-add | |
リファラー設定追加(再起動すると消えます) | |
=== 設定例 === | |
>|| | |
plugins.options['refcontrol.sites'] = { | |
[domain] : [param], | |
'@DEFAULT' : '@FORGE', | |
'tumblr.com' : '@FORGE', | |
'del.icio.us': '@NORMAL', | |
}; | |
||< | |
==== domain ==== | |
'@DEFAULT' はデフォルト設定を指します。 | |
==== param ==== | |
@NORMAL: | |
通常の動作です | |
@FORGE: | |
ドメインのルートをリファラにセットします | |
'': | |
リファラーを送信しません | |
url: | |
指定したURLでリファラーを送信します | |
=== 流用元 === | |
refcontrol.js at master from vimpr/vimperator-plugins - GitHub | |
https://github.com/vimpr/vimperator-plugins/blob/master/refcontrol.js | |
]]></detail> | |
</KeySnailPlugin>; | |
let pOptions = plugins.setupOptions('refcontrol', { | |
'enabled': { | |
preset: true, | |
description: M({ja: '起動時に有効にするか (初期値: true)', en:'initial state (default: true)'}) | |
}, | |
'sites': { | |
preset: {}, | |
description: M({ja: 'リファラを制御するサイト', en:'sites'}) | |
} | |
}, PLUGIN_INFO); | |
const ENABLE_ICON = 'data:image/png;base64,' | |
+ 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABD0lEQVQ4y2NgoBJIAOI5WlpaxXPm' | |
+ 'zGEgBvv7+6MYMAeI/7u4uOz+//8/AzG4sbFx1ABkA9jY2KaDDNDW1r7y798/RmSFhw4dsi0qKur9' | |
+ '+vUrF04DAgMDvUEGgHB4ePjyJ0+eSMEU7tu3zxEkrqKicvvgwYN2WA0AxWtmZuY0mCEsLCy/LS0t' | |
+ 'j2VnZ0+Ji4tbCBNnZmb+k5eXN+HLly9cGAaAnD5lypRsQUHBdzANuLCqqurNrKwscRQDYE77/Pkz' | |
+ 'z7JlyyKSkpLmWlhYHJeTk3uIrBnIf7Br1y5XDBfgCm1YGIBwWlrazI8fP/JhDQN8BsjLy4NtxRkL' | |
+ 'oIwBEsCGgQEpVlxczIcu7ujoSJ1sDACJopmC0veorAAAAABJRU5ErkJggg=='; | |
const DISABLE_ICON = 'data:image/png;base64,' | |
+ 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABG0lEQVQ4y2NgoAYwNjZOCA4OnpOW' | |
+ 'llY8Z84cBmKwv78/wgCQ5vb29v/Lly/f/f//fwZicGNj46gByAaEhoZOBxkwe/bsK//+/WNEVvjo' | |
+ '0SPbvXv39v769YsLpwGVlZXeIANAeMOGDcs/ffokBVP48OFDR5D4jBkzbgMNs8NqAChed+7cOQ1m' | |
+ 'SGdn5+9FixYdA4pN2bx580KYeEdHx5/du3dPALkGwwCQ08+ePZvd39//DqYBFwa65mZZWZk4igEw' | |
+ 'p/38+ZPn6tWrEVu3bp27cOHC41OnTn2IrBnIf3Dv3j1XDBfgCm1YGIDw9u3bZ/748YMPaxjgM2Da' | |
+ 'tGkP7t+/74ozFkAZAySADZeXl4tVVVXxoYs7OjpSJSMzAAAVVeyzzuffRgAAAABJRU5ErkJggg=='; | |
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() function() {this.initialize.apply(this, arguments);}; | |
var RefControl = new Class(); | |
RefControl.prototype = { | |
initialize : function() { | |
this.panel = this.createPanel(); | |
this.isEnable = pOptions['enabled']; | |
}, | |
createPanel: function() { | |
var self = this; | |
var panel = document.getElementById('refcontrol-status-panel'); | |
if (panel) { | |
let 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.setAttribute('tooltiptext', self.isEnable ? 'Refcontrol enabled' : 'Refcontrol disabled'); | |
panel.addEventListener('click', function(e) { self.isEnable = !self.isEnable; }, false); | |
try { | |
document.getElementById('status-bar').insertBefore( | |
panel, document.getElementById('keysnail-status').nextSibling); | |
} catch(e) { } | |
return panel; | |
}, | |
get isEnable() _isEnable, | |
set isEnable(val) { | |
this.panel.setAttribute('src', val ? ENABLE_ICON : DISABLE_ICON); | |
this.panel.setAttribute('tooltiptext', val ? 'Refcontrol enabled' : 'Refcontrol disabled'); | |
_isEnable = val; | |
}, | |
}; | |
// some utilities | |
var init = function() { | |
// read settings | |
sites = pOptions['sites']; | |
if (typeof sites == 'undefined') sites = new Object(); | |
if (typeof sites['@DEFAULT'] == 'undefined') sites['@DEFAULT'] = '@NORMAL'; | |
}; | |
var dump = function(obj) { | |
var m = ''; | |
for (let key in obj) { | |
m+=key+':'+obj[key]+'\n'; | |
} | |
return m; | |
}; | |
if (KeySnail.windowType == 'navigator:browser') { | |
init(); | |
var manager = new RefControl(); | |
// add user ext | |
plugins.withProvides(function (provide) { | |
provide(['refcontrol-add'], function(args) { | |
prompt.reader({ | |
message: 'input refcontrol setting :', | |
callback: function(args) { | |
var domain = args[0]; | |
var perf = args[1] || ''; | |
if (!domain || /[:\/]/.test(domain)) { | |
display.echoStatusBar(dump(sites)+'usage: addref [domain] [@NORMAL or @FORGE or empty]'); | |
return; | |
} | |
sites[domain] = perf; | |
}, | |
completer: function(left, whole) { | |
let args = whole.split(' '); | |
//var last = context.contextList.slice(-1)[0]; | |
var context = {}; | |
var list; | |
if (args.length == 2) { | |
context.title = ['Params', 'Description']; | |
list = completer_params; | |
} else if (args.length <= 1) { | |
context.title = ['URL', 'Description']; | |
list = [['@DEFAULT', 'default preference'], [window.content.location.host, '']]; | |
} | |
context.collection = list; | |
context.query = whole; | |
return context; | |
} | |
}); | |
}, 'add referrer control setting'); | |
provide('refcontrol-toggle', | |
function() manager.isEnable = !manager.isEnable, | |
'toggle referrer control on/off'); | |
}, PLUGIN_INFO); | |
// register refcontrol | |
var adjustRef = function(http, site) { | |
var sRef, refAction; | |
try { | |
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; | |
}; | |
let OS = Cc['@mozilla.org/observer-service;1'].getService(Ci.nsIObserverService); | |
if (!share.refcontrolObserver) { | |
// OS.removeObserver(share.refcontrolObserver, 'http-on-modify-request'); | |
share.refcontrolObserver = { | |
observe: function(subject, topic, data) { | |
if (topic != 'http-on-modify-request') return; | |
if (!_isEnable) return; | |
var http = subject.QueryInterface(Ci.nsIHttpChannel); | |
for (let s = http.URI.host; s != ''; s = s.replace(/^[^.]*(?:\.|$)/, '')) | |
if (adjustRef(http, s)) return; | |
adjustRef( http, '@DEFAULT'); | |
} | |
}; | |
OS.addObserver(share.refcontrolObserver, 'http-on-modify-request', false); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment