var PLUGIN_INFO = refcontrol control referrer リファラー制御 https://gist.github.com/958/945710/raw/refcontrol.ks.js 0.1.1 958 1.8.0 || 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 ]]> ; 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); } }