2007年 06月 17日

userChrome でプロキシ設定きりかえ

FoxyProxy を(たいして機能をつかっていないのに、複数プロキシをきりかえたいというだけで) つかっていたのだけれど、やめた。
普通にステータスバーから切り替えさえできればいいので (なんか FoxyProxy だとこれができないのだ。設定画面が Cmd-W で閉じれないし)、userChrome で prefs をいぢるようにした。

(function () {
	const prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
	var proxySetting = [
		function Disable () {
			prefs.setIntPref("network.proxy.type", 0);
		},
		function LocalSocks () {
			prefs.setIntPref("network.proxy.type", 1);
			prefs.setCharPref("network.proxy.socks", "localhost");
			prefs.setIntPref("network.proxy.socks_port", 10080);
		},
		function School () {
			prefs.setIntPref("network.proxy.type", 1);
			prefs.setCharPref("network.proxy.http", "");
			prefs.setIntPref("network.proxy.http_port", 8081);
		},
	];
	const ID = "status-bar-proxy-uc";
	var statusbar = document.getElementById("status-bar");
	var panel     = document.createElementNS(kXULNS, "statusbarpanel");
	var iconimg   = <><![CDATA[
		data:image/png;base64,
		iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAACzGlDQ1BJQ0Mg
		UHJvZmlsZQAAeJx9kEtoE1EUhr87WgRpFTRWKQp3VbNoy9C6qC6Upta0VmIY
		U/tAkHRyk4ydTMY7k/jAhQjiRrC6FDc+cCUupQsXLoQuRAqKuhHBpVhBENyI
		xMUkzUirFwa+Oefe/5z/h45k3vddQ0LFC7WVTsmZ2Tm55Q0ddNEJkLcDfySb
		PQGQ932XdefnewTA2/6N+/89XXpmdg6EBBKliA8AifmIx4HEhdAPQZwBEnY5
		XwDhA306Z42CuAdsK8V4PsYFFdggngBHbF+HYOSA8bpdCkGsAqZXcDww9gLD
		hcCugHEPjJszs3MyWjOchMP7YNOrdm0ugCePYXdvu5bcA7umYWmoXfthIQDR
		vRIUhwYBEJ0p6PjUaPzohS134PftRuPXg0bj90PY9BFeuHZN15sZCfEaIh8A
		JNLKU9qxpZVOyayuFh1XxSLduB35jfRgyWrRvzjKBIBhuD8O01th8jrc/Qz7
		n8LOZ5DtgtxBjKu0vlBdDAFGq/4l7ZTKoRw0zUHZLwdNc0iO+L6r5Gi14tdC
		peWEZw/0ybzrSu2UymEgtQqUrqvCABW31vK7HehU3tQpoBeMogrGmizOFfJH
		J4EBEG8K6ugY0AdisegcmwCSwMuiPjYVsdjhhBO5iI3Dnps50WS8auZkpMmq
		H6asln5QPzXWqp/LH88CPSAOLVQnLaAbjOTlcm46YpG7XB7NNPk5s7goHDwU
		HhKLNCn68dFUKeLg4OKQRuGh0DgELGx40yUbY0maL3h8QeNwnhoKicVpUhmu
		9a0pSPOD+c18Z943H5lfF3tqyXbnmj7r2Cu3vpNFodd0m93mTpG+TZURXFxK
		KCprnoLYprHtit5iT1vJXrn1Xd3I/Iy5VLFJ/cyjCFhA41BH4RKgGIlN+1d6
		Cnf5yvM97VnvNi+dedu5fOWvrKrrXKk1V3//t+/F36s/zbABaFPXSTsAAAB3
		SURBVCjPrZFBFcAgDEO/DR4WcFYR4IT78ICNyekuMKCD28KF14Y0pPAnAkJC
		CLumo6AoSiaScbZ9oygV3yp+pfTXfqr5eXYXt54apBGSIUi/xINCsgrWg1gP
		6y/qnMf1UpRMIqOUXQ7j3N+oZpVi22MX8bSLIx4U5UEkYy3cDgAAAABJRU5E
		rkJggg==
	]]></>.replace(/¥s/g, "");

	var img = document.createElementNS(kXULNS, "image");
	img.setAttribute("src", iconimg);

	var menu = document.createElementNS(kXULNS, "menupopup");
	var sett = document.createElementNS(kXULNS, "menuitem");
	sett.setAttribute("disabled", "true");
	menu.appendChild(sett);
	proxySetting.forEach(function (f) {
		var mi = document.createElementNS(kXULNS, "menuitem");
		mi.setAttribute("label", f.name);
		var command = function (e) {
			if (menu.hidePopup) menu.hidePopup();
			sett.setAttribute("label", "Cur: "+f.name);
			// reset
			["http", "ssl", "ftp", "gopher"].forEach(function (p) {
				prefs.setCharPref("network.proxy."+p, "");
				prefs.setIntPref("network.proxy."+p+"_port", 0);
			});
			f();
		};
		if (!arguments.callee.called) { command(); arguments.callee.called = true }
		mi.addEventListener("command", command, false);
		menu.appendChild(mi);
	});

	panel.appendChild(img);
	panel.appendChild(menu);
	panel.setAttribute("tooltiptext", "Change proxies");
	panel.addEventListener("click", function (e) {
		menu.showPopup(panel, -1, -1, "popup", "bottomleft", "topleft");
	}, false);

	var t = document.getElementById(ID)
	if (t) t.parentNode.removeChild(t);
	panel.id = ID;
	statusbar.appendChild(panel);
})();

インストールしていたアドオンが一個へった。

http://lab.lowreal.net/trac/browser/c/userChrome/proxy.uc.js