Skip to content

Instantly share code, notes, and snippets.

@958
Last active September 25, 2015 15:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 958/945710 to your computer and use it in GitHub Desktop.
Save 958/945710 to your computer and use it in GitHub Desktop.
[keysnail]refcontrol plugin
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