301 Moved Permanently

Moved to https://vow.g.hatena.ne.jp/vow/

aboutPermissions

“完全なるルビ”正式リリース記念 @ Mozilla Firefox 38

(続き)

Download: mod about:permissions r0 for Mozilla Firefox 38 (ja_JP only) [7z 9KB]

rationale

その昔は表のUIに普通に設定項目が出ていた network.image.imageBehavior の処理は、現在では (というほど最近の話でもないのだけど) nsContentBlocker が引き継いだわけですが、これの動作を設定するUIはついぞ実装されていません。一応 nsContentBlocker は画像だけでなく全てのリソースへのアクセスを見張っているものの、肝心の設定が投入されない以上はすることもないわけで、ぶっちゃけてしまうと「とにかく全部素通しにする」以外の仕事はしていません。ほぼ無駄飯食いです。

それ関係のUIの中心となるのはおそらくページ情報 (pageInfo) のメディアパネルとサイト別設定パネルのあたりなわけですが・・・まず出自からして当然のことながらデフォルトの設定を変更する機能は無い上に、問題のサイトなり画像なりへの参照が先に無いと設定できないので、既に行われている設定の確認にはほとんど役に立ちませんし、メディア扱いでない他の種類のリソースに関しては全く無力です。

内部動作のインフラとしては、nsContentBlocker のサイト毎の設定は Services.perms の担当なのでクッキー等と同列の扱いであり、いわゆる permissions.sqlite エディタの類で対応できます。しかしそれだけだと、グローバルなデフォルトの設定を一緒に扱えないので、見通しが悪くてなんだかもやもやします。一方デフォルトの方はいつも通りの pref の担当なので about:config なり何なりで書き込むことはできますが、ソレをまっとうなUIとは言いません。

デフォルトとサイト別の両方の設定を一度に見せるUIとしては、nsContentBlocker の分を除くならば一応 about:permissions が用意されているものの・・・まずどこからもリンクされてない程度には打ち棄てられているあたり、これを表と言っていいのかどうか微妙なところ。そして実際に開いてみるとこれがまた妙に ad-hoc な感じで、一応“だいたい正しいっぽい程度の現在の動作状況”を表示するという意味ではおおよそ合っているものの、どれがデフォルトから引き継いだ設定でどれがサイト毎に保存された設定なのかの区別を全くしないため、いざ設定を変更しようとすると表示と動作が食い違うという爆弾を抱えている始末。しかも大がかりなUIを用意しているわりに、単に設定を任意のサイトに対して追加するという能力が欠如していて、例によって至極 ad-hoc な感じで列挙されるリストからサイトを選ぶことしかできません。いったい何を考えているんでしょうか。まあはっきり言ってしまえばまるで使い物になりません。

そういうようなわけで、このままではいくら何でもあまりにも仕方がなさ過ぎるので、nsContentBlocker の分も含めてデフォルトとサイト別の両方をまとめて取り扱えるように、適当に about:permissions を改造してみました。というのがコレです。

usage

ええとアドオンとしてまじめに梱包するとか超めんどくさいので昔ながら(?)の方法で手動インストールとなります。具体的にはアーカイヴ内の各ファイルを適当なディレクトリに配置した上で、Firefox のアプリケーションバイナリのルートディレクトリの chrome.manifest (普通は無いので新規作成になります) に以下のように書き足してください。これで元からある about:permissions を乗っ取ります。

override chrome://browser/content/preferences/aboutPermissions.xul file:///[当該ファイルを配置したパス]/aboutPermissions.xul
override chrome://browser/content/preferences/aboutPermissions.js  file:///[当該ファイルを配置したパス]/aboutPermissions.js
override chrome://browser/content/preferences/aboutPermissions.css file:///[当該ファイルを配置したパス]/aboutPermissions.css
  • 操作できるpermissionの範囲は元と同等プラス nsContentBlocker の分です。uitour 等の内部用特権は従来通り無視します。
  • placesから適当にサイト名を列挙する動作は廃止しました。保存された設定を持っているサイトだけを、ちゃんとドメイン順にソートして列挙します。
  • パスワードが保存されているだけのサイトは列挙に加えなくなりました。元々クッキーが保存されているだけのサイトは列挙に加えていなかったし、どちらかと言えば加えていた元の方がおかしいような。
  • サイト検索ボックスにサイト名を入力して [追加] ボタンを押すと、そのままのサイト名で設定を追加できるようになります。なお [追加] を押しただけの段階では実際には何の設定も増えていません。
  • 元々中途半端で不適切な動作をしていたクッキーのデフォルトの設定は廃止しました。素直に標準のオプション設定 (about:preferences#privacy) を使ってください。
  • eTLD的な意味でベースドメイン未満の階層のサイトに対する設定について、サイト名の表示の前に × を付けて警告するようにしました。そのような設定それ自体は合法的なのですが、実際には設定がサイトの“見た目的なサブドメイン”に一切適用されないため、大抵の場合は意味がありません。
  • 前項のついでで、逆にサブドメインに対して設定している場合は、とりあえずベースドメインの先頭のドットをだぶらせて表示するようにしてみました。
  • xmlhttprequest等での許可の設定は、あくまで nsContentBlocker 内での (デフォルトあるいは親ドメインへの設定による) ブロックを許可に戻すだけのものです。同一生成元ポリシーや mixed content blocker 等のセキュリティ層をオーバーライドするわけではありませんので、そういう意味では googlevideo.com に許可とか設定しても何も起こりません。


というわけで、これで各種リソースへのアクセスについてNOFOREIGNを設定できる、の、ですが・・・大変残念なことに nsContentBlocker はeTLDサービスを使わずにドット2個分でベースドメインを決め打ちしているため、過度の期待は禁物です。もっとも今流行の間抜け汎用ドメインや間抜けgTLDの連中はかえって簡単に引っかかってくれるのである意味では困らないかもしれない。

なおNOFOREIGNの設定の表示はひとまずクッキーの「ファーストパーティのみ許可」で代用していますが、厳密にはこれは正確な表現ではなく、親から間に一つ子を挟んだ孫の参照においては子と孫の比較になります (クッキーの場合は間の子に関係なく常に親[ファーストパーティ]と孫の比較)。いやとりあえず文字列リソース増設するのめんどくさいし。あとNOFOREIGNは参照元が無い場合を無条件に蹴る一方で、ローカルリソースからの参照は逆に無条件に通します。しかもブックマーク等のクリックは後者の通る側に含まれます。結果documentにNOFOREIGNを設定した場合の動作は比較的意味不明ですが特段に設定禁止にはしていません。もしかしたら何か珍妙な使い道があるかもしれないし。

現状 plugin* は操作できません。そもそもが有効なプラグインのリストから動的に対応するpermissionが生成される方式なので、たとえば設定が保存されてからプラグインの方が行方知れずになって宙に浮いたpermissionがある場合、これを狙って拾い上げる自明な方法は存在しません。そこら辺のゴミ掃除とかまともに処理されているんでしょうか・・・なんというか藪蛇が怖くて調べたくない感じなんですが。

cookieについてサイト毎に ALLOW_FIRST_PARTY_ONLY を設定することは (元から) できるのですが、現状では設定するとサイト情報のサイト別設定パネルがコケるなどの不具合が (元から) 生じます。

コードに関してはとりあえず手っ取り早く動かす優先でいい加減な書き方をしていて、Mozilla的なコーディングスタイル保持なんか全く考慮していないので、このままでは断固review通過しない自信が完全にあります。てかまず文字列リソース分離してないし。元の aboutPermissions ではpermission毎の動作のハードコードが .js 側と .xul 側それぞれに分散・重複していてかなりイヤンな感じだったのは多少整理してしまいましたが、基本的にはdiffが無闇に増えないように改造しているのでその辺は色々とお察しください。そもそも操作できる権限がいくつか微妙に足りていないような気もしますがそれは元からなんです。・・・結局これ一度全部作り直さないとだめなんじゃ・・・。


そしてちょっと別件でバタバタしているため今週のカオスは休業しています。あふん・・・。