2007年8月26日日曜日

Firefox拡張メモ

Firefoxの拡張メモ。
Firefox Portableで使用したことのある拡張一覧です。

keyconfig

ショートカットキーをカスタマイズします。
公式は大分前から更新停止していて、Firefox 2.0.0.7対応している拡張は非公式の拡張(日本語版)のみのようです。

All-in-One Gestures

マウスジェスチャに代表される、あらゆるマウス操作をカスタマイズします。日本語対応。

ColorZilla

カラーピッカー。
抽出ポイントを選択しやすくするためか、[ページ拡大] 機能のおまけも付いてきます。日本語対応。

Firebug

強力なJavaScriptデバッガ。
DOMツリーを表示でき、HTML構造の確認に役立ちます。非公式版は日本語対応。

FoxyProxy

設定したURL毎にProxyを切り替えて接続します。
URLリストを使わなければ、単純なProxy切り替えとしても使えます。

日本語に対応していないので、英語が得意でない人は辞書を引きつつ頑張ってください。
Firefox Portableを使用している場合は、オプションから [I am using Portable Firefox] にチェックを入れないと動作しません。

FullerScreen

デフォルトのFirefoxは全画面表示で [ナビゲーション ツールバー] と [タブバー] が残りますが、この拡張を入れることでページ描画領域だけで全画面表示できます。
英語表記ですが、設定項目がそれほど多くないので何とかなるでしょう。

Gmail Notifier

Gmailの新着メールをお知らせします。
ログインも楽になるので、Webメールを利用しているなら、入れる価値は十分あります。日本語対応。

IE Tab

現在のタブをIEエンジンに切り替えて描画します。お気に入りからもIEエンジンに切り替えることが可能です。
IEでしか表示できないサイト用に。日本語対応。

Locale Switcher

Firefox本体の言語設定を切り替えます。Firefox英語版を入れて、言語設定を日本語に切り替えたいときに。

以下に、Firefox Portable の言語設定を英語から日本語に変える方法を紹介します。

  1. Locale Switcher をインストール
  2. http://releases.mozilla.org/pub/mozilla.org/firefox/releases/ にアクセス
  3. http://releases.mozilla.org/pub/mozilla.org/firefox/releases/(Firefoxのバージョン番号)/win32/xpi/ へ移動
  4. ja.xpi をダウンロード
  5. ja.xpi をFirefoxウインドウにドラッグ&ドロップ
  6. Firefox再起動
  7. [Tool -> Languages -> Japanese] にチェック
  8. Firefox再起動
NoScript

ホワイトリストに登録されていないURLにアクセスしたとき、JavaScript, Java, Flash, その他プラグインを遮断します。
この拡張の便利なところは遮断したときに、情報バーでお知らせしてくれることです。
ページが正常描画されなかったときに、JavaScriptを禁止したことが原因かもしれないと一目でわかるので重宝します。
ほとんど日本語対応ですが、英語表記のままの箇所が少し残っています。

ScrapBook

WebページやWebサイト全体をスクラップ的に保存します。
使用してみて、気が付いた特徴は以下の通り。

  • 保存したページは、メニューやサイドバーの [ScrapBook] からアクセスできる
  • 保存しないページへの相対パスリンクを絶対パスに変換できる
  • JavaScriptで改変した内容もソースに反映される
  • Webページのテキストにマーカーをつけて、ハイライトできる
  • 保存したページをHTML要素単位で視覚的に削除できる (一回だけ [元に戻す] をできる)
  • 日本語対応
Stylish

ユーザースタイルシートの編集/管理を行います。日本語対応。

Tab Mix Plus

タブに関連する挙動をカスタマイズします。
[新しいタブをアクティブなタブの隣に開く], [タブバーをホイールクリックしたときにタブを閉じる] など、国産タブブラウザで当たり前に出来る多く機能をこの拡張で実現できます。日本語対応。

Tab Tree

サイドバーに [現在開いているタブ] をツリー表示します。
アルファ版なので機能は少ないですが、不具合はなく。
難点を述べるなら、[Tab Tree] を呼ぶショートカットキーがないのが少し不便です。日本語対応。

tabgroups

複数のタブをまとめる「タブグループ」というタブを配置し、多数のタブを効率よく管理します。
英語表記ですが、オプションがないので使用するに当たって支障はないと思います。

Syleraのレイヤーによく似た機能で期待していたのですが、タブを50個ほど開くと動作が不安定になるので泣く泣く使用を断念しました。
公式HPでは「既知の不具合」が判明しているにも関わらず、更新されていないので、不具合修正は期待できそうにありません。

userChrome.js

ユーザースクリプトを追加してFirefox本体の機能をカスタマイズします。

ViewSourceWith

Webページのソースを予め設定しておいた任意のテキストエディタで開きます。
使用してみて、気が付いた特徴は以下の通り。

  • 右クリックメニューに [ソースをプログラムで開く] という項目を追加する
  • ページ上の右クリックメニュー [ページのソースを表示] のエディタは変更しない
  • 登録したエディタに対して、文字コード「UTF-8」の文字列を渡す
  • 複数のエディタを登録できる
  • 日本語対応

秀丸エディタを登録すると、文字コードの指定し直しを要求される事があります。
秀丸エディタはmeta要素のcharset属性値から文字コードを取得して読み込みを試みますが、ViewSourceWithはUTF-8のテキストを秀丸に渡すので、charsetの値がUTF-8ではないとき、文字コードが合致しません。
起動オプションが渡せれば、秀丸は強制的にUTF-8として開くことが出来るのですが…。

ラベル: ,

2007年8月22日水曜日

JavaScriptを挿入するデフォルトのProxomitronフィルタ修正版

Proxomitron本体にデフォルトで付属しているフィルタは、誤爆を引き起こす要素をいくつか持っています。
以下に挙げるフィルタは、JavaScriptを挿入するタイプのフィルタで出来るだけ誤爆しないように工夫したものです。

HTML文書を読み込む前にJavaScriptを挿入するフィルタ修正版。

[Patterns]
Name = "Kill pop-up windows [2007/08/21] fixed"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 8
Match = "(^(^<script[ >]|</head>))$STOP()"
Replace = "<script type='text/javascript' src='http://local.ptron/WindowOpen.js'></script>\r\n"

Name = "Suppress all JavaScript errors [2007/08/21] fixed"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 8
Match = "(^(^<script[ >]|</head>))$STOP()"
Replace = "<script type='text/javascript'>\r\n"
          "function NoError(){return(true);} onerror=NoError;"
          "</script>\r\n"

Name = "Stop browser window resizing [2007/08/21] fixed"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 8
Match = "(^(^<script[ >]|</head>))$STOP()"
Replace = "<script type='text/javascript'>\r\n"
          "function moveTo(){return true;} function resizeTo(){return true;}"
          "</script>\r\n"

HTML文書を読み終わった後にJavaScriptを挿入するフィルタ。

[Patterns]
Name = "Restore pop-ups after a page loads [2007/08/21] fixed"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 8
Match = "(^(^</head>))$STOP()"
Replace = "<script type='text/javascript'>\r\n"
          "function addLoadEvent(func) {"
          "	var oldonload = window.onload;"
          "	if (typeof window.onload != 'function') {"
          "		window.onload = func;"
          "	} else {"
          "		window.onload = function() {"
          "			oldonload();"
          "			func();"
          "		}"
          "	}"
          "}"
          "addLoadEvent(PrxRST); "
          "</script>\r\n"

2007/05/22時点の修正版では、ページ読み込み後にJavaScript実行するために、(^(^</html>)) を使っていましたが、これは </html> の後ろにJavaScriptを挿入するHTMLに対応できていませんでした。
今回は、addLoadEvent でこの問題を解消しています。
でも、今となっては「addLoadEvent」も古い書き方で、window.addEventListener を使う のが適切なのでしょうね。
今の書き方でも実用上問題はないはずなので、イベントリスナ系統をまとめて覚えた後に対応しようと考えています。

Proxomitron-Jで配布されている「Allow right mouse click 3種セット」の修正版。

[Patterns]
Name = "Allow right mouse click [2007/05/23] fixed"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 16
Match = ".(onmousedown=|captureEvents\()"
Replace = ".PrxOff_"

Name = "Allow right mouse click 2 [2007/08/21] fixed"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 8
Match = "(^(^</head>))$STOP()"
Replace = "<script type='text/javascript'>\r\n"
          "function addLoadEvent(func) {"
          "	var oldonload = window.onload;"
          "	if (typeof window.onload != 'function') {"
          "		window.onload = func;"
          "	} else {"
          "		window.onload = function() {"
          "			oldonload();"
          "			func();"
          "		}"
          "	}"
          "}"
          "function onMousedownNull(){"
          "	document.onmousedown=null;"
          "}"
          "addLoadEvent(onMousedownNull);"
          "</script>\r\n"

Name = "Allow right mouse click plus [2007/05/23] fixed"
Active = TRUE
Multi = TRUE
URL = "$TYPE(htm)"
Limit = 512
Match = "(<[^>]++\s)oncontextmenu(^(^=))"
Replace = "ProxAllow"

依頼を受けたフィルタを修正しており、デフォルトのフィルタ全てを修正してはいません。
元のフィルタと修正版を比較すれば、修正内容の見当は付くと思います。
でも、リクエストを受け付けないというわけではないので、要望があれば、順次対応していくつもりです。

ラベル: , ,

2007年8月7日火曜日

不正な Content-Encoding ヘッダを削除するProxomitronフィルタ

Content-EncodingヘッダはHTTP通信時の符号化方式を指定するヘッダです。
Proxomitronは不正な Content-Encoding を検出すると、符号化内容がわからないために、フィルタの働きを止めてしまいます。
このフィルタは不正なContent-Encodingヘッダを削除することで、符号化内容をProxomitronに正しく認識させ、フィルタを有効にします。
(ついでに、古い名前の x-gzip, x-compress を新しい名前に訂正します)

[HTTP headers]
In = TRUE
Out = FALSE
Key = "Content-Encoding: Kill incorrect Encoding (In) [2007/08/07] test1"
Match = "(^gzip|deflate|compress)(x-(gzip|compress)\0|?)"
Replace = "\0"

改めて、RFC2616を確認してみたら、この content-coding 値は、Accept-Encoding ヘッダでのみ使用し、Content-Encoding ヘッダでは使用すべきではない とあったので、その修正版です。
フィルタ名が変わっているのは気分的なもので、特に意味はありません。

ラベル: ,

2007年8月6日月曜日

userchrome.js で「タイトルとURLをコピー」

前々から利用させていただいているSCRAPBLOG : [userChrome.js] Copy Title + URLにちょっとした変更を加えてみました。 変更点は以下の通り。

  • userchrome.js.xpiの話題 - alice0775のファイル置き場 を参考に、コンテキストメニューを日本語に変更
  • 改行コードを \r\n に変更 (一部のソフトで \n を改行として扱わないことがあるため)
  • URLテキストの一部記号をURLエスケープ
  • タイトルのHTMLエスケープ処理でシングルクォートもエスケープ
  • (個人的に使用している)li要素形式のコピーを追加
/**
 * A user script for userChrome.js extension.
 * @name タイトルとURLをコピー
 * @description 「タイトルとURLをコピー」コマンドをタブメニューに追加
 * @compatibility Firefox 2.0.0.6
 * @author Gomita, think
 * @lastUupdated 2007.09.10
 * @permalink http://thinkarc.blogspot.com/2007/08/userchromejs-url.html
 * @originallink http://www.xuldev.org/blog/?p=51
*/
(function()
{
	window.ucjs_copyTabInfo = function(copytype)
	{
		function htmlEscape(s) {
			s = s.replace(/</g, "&lt;");	// 小なり
			s = s.replace(/>/g, "&gt;");	// 大なり
			s = s.replace(/&/g, "&amp;");	// アンバサンド
			s = s.replace(/"/g, '&quot;');	// ダブルクォート
			s = s.replace(/'/g, '&#039;');	// シングルクォート

			return s;
		}

		function urlEscape(dat){
			dat = dat.replace(/%(?![\da-f]{2})/ig, '%25');	// パーセント
			dat = dat.replace(/ /g, '%20');					// 半角スペース
			dat = dat.replace(/\"/g, '%22');				// ダブルクオート
			dat = dat.replace(/(#[^#]*)#/, "$1%23");		// シャープ
			dat = dat.replace(/\'/g, '%27');				// シングルクオート
			dat = dat.replace(/\(/g, '%28');				// 左小括弧
			dat = dat.replace(/\)/g, '%29');				// 右小括弧
			dat = dat.replace(/\*/g, '%2a');				// アスタリスク
			dat = dat.replace(/,/g, '%2c');					// カンマ
			dat = dat.replace(/</g, '%3c');					// 小なり
			dat = dat.replace(/>/g, '%3e');					// 大なり
			dat = dat.replace(/\[/g, '%5b');				// 左大括弧
			dat = dat.replace(/\\/g, '%5c');				// 円記号
			dat = dat.replace(/]/g, '%5d');					// 右大括弧
			dat = dat.replace(/\^/g, '%5e');				// キャレット
			dat = dat.replace(/`/g, '%60');					// バッククォート
			dat = dat.replace(/{/g, '%7b');					// 左中括弧
			dat = dat.replace(/\|/g, '%7c');				// 縦棒
			dat = dat.replace(/}/g, '%7d');					// 右中括弧

			return dat;
		}

		var tab = document.popupNode;
		var url = gBrowser.getBrowserForTab(tab).contentWindow.location.href;
		var txt;

		switch (copytype){
			case 'text':
				txt = tab.label + "\r\n" + urlEscape(url);
				break;
			case 'anchor':
				txt = '<a href=\'' + htmlEscape(urlEscape(url)) + '\'>' + htmlEscape(tab.label) + '</a>';
				break;
			case 'list':
				txt = '<li><a href=\'' + htmlEscape(urlEscape(url)) + '\'>' + htmlEscape(tab.label) + '</a></li>';
				break;
		}

		if(txt){
			var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"]
			.getService(Components.interfaces.nsIClipboardHelper);
			clipboard.copyString(txt);
		}
    };

	var UI = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].
	createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
	UI.charset = 'UTF-8';
	var menuitem = Array();

/*
	menuitem の初期化処理を forEach で回したかったのですが、上手くいかず保留。
	多分、初歩的なミスだと思います…。

	var menuindex = 0;
	var menu_array = Array(
		'text': 'タイトルとURLをコピー',
		'anchor': 'タイトルとURLをa要素でコピー',
		'list': 'タイトルとURLをli要素でコピー'
	);

	function setLabel(element, index) {
		menuitem[menuindex] = document.createElement("menuitem");
		menuitem[menuindex].setAttribute("label", UI.ConvertToUnicode(element));
		menuitem[menuindex].setAttribute("oncommand", "ucjs_copyTabInfo(" + index + ");");
		menuindex++;
	}

	menu_array.forEach(setLabel);
*/

	menuitem[0] = document.createElement("menuitem");
	menuitem[0].setAttribute("label", UI.ConvertToUnicode("タイトルとURLをコピー"));
	menuitem[0].setAttribute("oncommand", "ucjs_copyTabInfo('text');");

	menuitem[1] = document.createElement("menuitem");
	menuitem[1].setAttribute("label", UI.ConvertToUnicode("タイトルとURLをa要素でコピー"));
	menuitem[1].setAttribute("oncommand", "ucjs_copyTabInfo('anchor');");

	menuitem[2] = document.createElement("menuitem");
	menuitem[2].setAttribute("label", UI.ConvertToUnicode("タイトルとURLをli要素でコピー"));
	menuitem[2].setAttribute("oncommand", "ucjs_copyTabInfo('list');");

	setTimeout(function()
	{
		gBrowser.mStrip.childNodes[1].appendChild(document.createElement("menuseparator"));

		for(var i=0, L=menuitem.length; i < L; i++){
			gBrowser.mStrip.childNodes[1].appendChild(menuitem[i]);
		}

	}, 0);
})();

ようは、Syleraスクリプトで使っていた処理を使い回しただけだったり。
URLエスケープは、Another HTML-lintで文法チェック時にエラーを返すURL文字をエスケープします。

いくつかエスケープ不要な文字が混じっていますが、これは掲示板にURLを投稿する状況を考慮しています。
ほとんどの掲示板は http:// から始まるURL文字列に自動的にリンクが貼られますが、一部の文字をURL文字として認識してくれないことがあります。
例えば、「アスタリスクや括弧があると、その手前でリンク化が止まう」というような状況。
それでは困るので、未対応と思われるマイナーな記号をパーセントエンコードして、正しくリンクさせようという試みです。

ラベル: ,

2007年8月5日日曜日

position:relative のブラクラに対抗するProxomitronフィルタ

ぼくはまちちゃん!(Hatena) - IEを華麗に撃墜する一行で紹介されているブラクラに対抗するためのProxomitronフィルタです。

[Patterns]
Name = "Anti Browser Crasher by position:relative [for IE6] [2007/08/05] test1"
Active = TRUE
URL = "$TYPE(htm)|$TYPE(css)"
Limit = 256
Match = "\* $NEST({,"
        "( ((^position)[^:]+:[^;]+; )+)\#"
        "position : [^;]+;+"
        "\#,})"
Replace = "* {\@}"

IE7ではブラクラそのものが効かず、IE6 Standaloneでブラクラが無効化されることを確認しました。

ラベル: ,

2007年8月4日土曜日

ニコニコ動画のメッセージサーバ系フィルタが効かなくなっていた問題に暫定対応

下記フィルタを適用すれば、今までのフィルタがそのまま動作するようになります。

[HTTP headers]
In = FALSE
Out = TRUE
Key = "Accept-encoding: Kill Nicovideo encoding (out) [2007/08/02] test1"
URL = "msg[0-9]+.nicovideo.jp/api/(^?)"
Match = "*"

ニコニコ動画のメッセージサーバはgzip圧縮したデータを送信するようになりましたが、Proxomitronはgzipを解凍せずに処理しようとします。
上のフィルタは、Webブラウザの通信リクエスト時に「gzip圧縮に対応していません」というヘッダを送信し、gzip圧縮していないデータを受け取ることで既存のフィルタを有効にします。
これを行うと、メッセージサーバのgzip圧縮(負荷対策)を無効化してしまうので、できればやりたくないのですが、他によい代替手段を思いつかないので。

Proxomitronはgzipに対応していないわけではなく、text/html, text/css などの「WebページフィルタでマッチするContent/Type」ではgzipを解凍して処理します。
ですので、Content/Typeを変更すれば、gzip圧縮したままでフィルタが効くようになりますが、汎用フィルタが誤爆する可能性を考えると、難しいものがあります。

Proxomitron等に関するWiki によると、

Content-Encoding: gzip で、Content-Type: が text/html、multipart/x-mixed-replace、text/css、text/javascript、 application/x-javascript、text/vbscript のどれか($TYPE(oth) 以外)の場合、Webページフィルタでは解凍された物が処理対象になる

とあり、multipart/x-mixed-replace というあまりお目にかかることのなさそうなヘッダもgzipの解凍処理対象となるようですが、multipart/x-mixed-replace自体がよくわからないヘッダだったので使用しませんでした。

ラベル: ,

2007年8月1日水曜日

ニコニコ動画を快適にする Proxomitron 導入解説ver0.9

ニコニコ動画おすすめ経由で新しいProxomitron導入開設動画が出ていることに気が付きました。

RC対応版の動画は初めてでしょうか。
「間違いとかあったらコメください。たぶんそのうち改良版を出すと思いますので。」とのこと。

ラベル: