ここではMozilla系ブラウザ(Firefox/SeaMonkey/Camino)に関するちょっとしたコツを扱います。
Firefox.app/Contents/Resources/browser/searchplugins
」に置いておけば良いようです(Firefix 21.0 からすべてのユーザ向けの検索プラグインを置いておく場所が変わってしまいました。以前は「Firefox.app/Contents/MacOS/searchplugins
」でしたが、今は「Firefox.app/Contents/MacOS/browser/searchplugins/
」に置いておけば良いようです)。ちなみに、私は以下の追加の検索プラグインを使っています。
私が重宝しているのはprefbarアドオンで、それに関連したabout:configの設定などをまとめておきたいと思います。
稀に色を多用していて非常に読みづらいページがあります。私には、やり過ぎな配色が邪魔して努力無しでは内容が頭に入ってきません。
この場合、アドレスバーに「about:config
」と入力して、設定項目で「browser.display.use_document_colors
」を探してオフにすれば読み易くなります。しかし、そんなページは稀ですので、いちいちabout:configで設定するのは面倒です。
以上のような用途にprefbarアドオンをインストールすると、ツールバーに「カラー」ボタンが追加できるので、必要な時に必要な設定が出来るようになります。
まず、prefbarに予め搭載されているボタンの内で、極めて重要で便利なものを、対応するabout:configの項目があればそれを添えて紹介します。
browser.display.use_document_colors
」を1か0に設定(1: 文書の指定する配色、0: ブラウザが指定する配色、前述のもの)permissions.default.image
」を1か2に設定(1: すべての画像を表示、2: すべての画像を非表示、しかし、3: サイト内の画像のみ表示、を選べず不適当)image.animation_mode
」を'normal
' か'none
'に設定(gifアニメーション、アニメーテッドpng、SVG SMILの有効・無効が設定されます)network.cookie.cookieBehavior
」を2か0に設定(2: すべてのCookieを許可、0: すべてのCookieを拒否、なので1: 文書があるWebサイトから送信されるCookieのみ許可、を選べず不適当)javascript.enabled
」でJavascriptの有効・無効を設定network.http.sendRefererHeader
」を0か2に設定(リンク元のURLをサーバに送信するか否かを設定、送信すると拒否されるサイトが稀にありますので便利です)network.proxy.type
」を0: 直接接続、1: 手動設定、2: 自動検出のいずれかに設定(この手動設定はブラウザのプロキシ設定で予め行っておきます。ssh -D 利用者には便利です)intl.accept_languages
」を規定値か様々な国向けの設定から選択(コンテントネゴシエーションにより英語が閲覧できない場合などで英語を選ぶと便利です)browser.display.use_document_fonts
」を0か1に設定(0: ユーザが指定したフォントを使用、1: 文書が指定したフォントを使用、なのでIEによる悪しきゴシック文化の無効化に便利です)ここで画像、Cookie、Java以外は特に問題なく使え大変便利です。さらに、私が作成したボタンを紹介します。まずは、設定を安全側に倒していない時と安全側に倒した時のスクリーンショットをご覧下さい。
ここで私が作成したボタンのうち、上記のスクリーンショットに見えている範囲のものを紹介します。特に、Cookie、Javaについては上記の問題を解決してあります。
permissions.default.image
」を2: すべての画像を非表示、3: サイト内の画像のみ表示、1: すべての画像を表示のいずれかに設定(視認性考慮)
accessibility.blockautorefresh
」の無効・有効を設定(利便性考慮)dom.storage.enabled
」を有効・無効に設定(プライバシー考慮)dom.indexedDB.enabled
」を有効・無効に設定(プライバシー考慮)※ Firefox 35.0.1 ではこれが無効だと「以前のセッションの復元」や「最近閉じたタブ」などが使えなくなるようです。gfx.downloadable_fonts.enabled
」を有効・無効に設定(フォントレンダラに脆弱性が絶対にないとでも?こんなものは必要になったら有効にすればよいのです。セキュリティ考慮)geo.enabled
」を有効・無効に設定(こんなものは必要になったら有効にすればよいのです。プライバシー考慮)media.autoplay.enabled
」を有効・無効に設定(視認性考慮)network.cookie.cookieBehavior
」を1か0に設定(1: 文書があるWebサイトから送信されるCookieのみ許可、0: すべてのCookieを拒否、プライバシー考慮)
network.cookie.cookieBehavior
」を2: すべてのCookieを許可、1: 文書があるWebサイトから送信されるCookieのみ許可、0: すべてのCookieを拒否から選択可能にしたもの(プライバシー考慮)media.wave.enabled
」を有効・無効に設定(こんなものは必要になったら有効にすればよいのです。セキュリティ考慮)media.ogg.enabled
」を有効・無効に設定(こんなものは必要になったら有効にすればよいのです。セキュリティ考慮)media.webm.enabled
」を有効・無効に設定(こんなものは必要になったら有効にすればよいのです。セキュリティ考慮)webgl.disabled
」を無効・有効に設定(こんなものは必要になったら有効にすればよいのです。セキュリティ考慮)svg.smil.enabled
」を有効・無効に設定(視認性考慮)
pdfjs.disabled
」を無効・有効に設定(利便性考慮)ここで配布している*.btn
は、prefbarの右クリックのカスタマイズの右クリックのインポートで導入することが出来ます。しかし、それも面倒なのでこれらをすべて取り込んだ、
さらに、その他の私が作成したボタンを紹介します。ちなみに、上述の成果物にはこれら全てが同梱されています。
network.prefetch-next
」を有効・無効に設定(閲覧したつもりもないのにサイトにアクセスしてる場合があります。それはこれがデフォルトで有効だからです。常に無効にしましょう。プライバシー考慮)browser.chrome.favicons
」を有効・無効に設定(faviconのキャッシュ有無検証で訪問済みサイトが漏洩する可能性があります。常に無効にしましょう。プライバシー考慮)browser.chrome.site_icons
」を有効・無効に設定(siteiconのキャッシュ有無検証で訪問済みサイトが漏洩する可能性があります。常に無効にしましょう。プライバシー考慮)browser.urlbar.maxRichResults
」を有効・無効に設定(プライバシー考慮)browser.search.suggest.enabled
」有効・無効に設定(プライバシー考慮)browser.display.use_document_fonts
」を0か1に設定(prefbar標準搭載の「フォント」と同等、分かり易い翻訳にしただけ。利便性考慮)font.default.ja
」を'serif
'か'sans-serif
' のいずれかに設定(利便性考慮)font.name.serif.ja
」を他のブラウザもよく使う明朝体フォントから選択(利便性考慮)font.name.sans-serif.ja
」を他のブラウザもよく使うゴシック体フォントから選択(利便性考慮)font.name.monospace.ja
」を他のブラウザもよく使う等幅フォントから選択(利便性考慮)以上の多くのボタンを並べると、ブラウザのウィンドウの幅に入り切らず使いにくいかと思われます。そういった場合は、prefbarで右クリックのカスタマイズの右クリックで、作成、サブメニューを選ぶと、いくつかのボタンをそのなかにまとめることができます。
スクリーショットの「メディア」がそのサブメニューです。
但し、サブメニューでチェックマークが付かないという不都合があるようなので直してみました。(2014/11/11追記) 6.5.0からはこの不具合は解消されています。
を置いておきます。稀に書体の種類を前提としつつも文書に書体指定がなく、意図が伝わり難い場合があります。典型例が、日本語環境IEを前提とした日本特有のアスキーアートです。日本では、プロポーショナルフォントでアスキーアートなどという思いもよらない特異な独自の文化が形成されており、フォントは日本語環境IEの規定値「MS Pゴシック 11pt」を想定しているようです。よって、環境が変わるとこのアスキーアートは作者の意図通りに表示されません。しかし、「IPAモナー」フォントをインストールするとそれに近い閲覧環境が得られるようです。それをトグルボタンかメニューで一発で切り替えるprefbarのボタンを用意してみました。
font.default.ja
, font.name.sans-serif.ja
, etc」を「IPAPMonaフォント」系に切り替えるか、リセットするfont.default.ja
, font.name.sans-serif.ja
, etc」を各種日本語フォントに切り替えるか、リセットするこれらは所有するフォントや環境に依存すると思われますので、成果物には同梱されていません。
prefbarのカスタマイズで「ボタンの追加」でサードパーティのボタンが追加できます。精査はしていませんが、ここで紹介したものと重なるものもあるようです。その他、いくつか有用なボタンを紹介します。
browser.zoom.full
」を有効・無効に設定(ズームの拡大・縮小がレイアウトを保持したままか、従前のフォントサイズのみかを切り替える。これが「browser.zoom.siteSpecific
」と連動してくれればベターなんですが、今ひとつです)file:///Users/taiji/Sites/index.html
, http://localhost/
などでは出来ないので今ひとつです)。file:///Users/taiji/Sites/index.html
, http://localhost/
なども検証可能です。これらは現時点では、成果物には同梱されていません。
prefbarを用いるとJavascriptで簡単にDOM(Document Object Model)操作を行なうことができます。ここでは以下の問題提起とその解決策をprefbarボタンで実現する「ドキュメントURLツール・ボタンセット [2012/09/29]」を紹介します。
http://ime.nu/
)。このボタンを押すと正しいURLにリンクを貼り直します。function check_img_hrefs(node) { var tag_a = node.getElementsByTagName('a'); // 「a」タグの配列を取得 for (var i=0; i<tag_a.length; ++i) { // すべての「a」タグについて、 if (tag_a[i].href.match(/\.(jpg|gif|png)$/)) { // 「href」属性が画像のときのみ、 if (/^img$/i.test(tag_a[i].lastChild.tagName) && // 「a」タグの最後の子要素が「img」タグ、かつ、 tag_a[i].lastChild.src == tag_a[i].href) // 「img」タグの「src」属性と「href」属性が等しければ、 continue; // 既に埋め込まれている、さもなくば、 return true; // 埋め込まれていない(チェックはtrue)で終了 } } return false; // さもなくば、既にすべて埋め込まれている(チェックはfalse) } value = check_img_hrefs(gBrowser.contentDocument.body); // 以上の操作を document.body 要素から調査し、結果をprefbarのvalueへ代入
function embed_hrefs(node) { var tag_a = node.getElementsByTagName('a'); // 「a」タグの配列を取得 for (var i=0; i<tag_a.length; ++i) { // すべての「a」タグについて、 if (tag_a[i].href.match(/\.(jpg|gif|png)$/)) { // 「href」属性が画像のときのみ、 tag_a[i].innerHTML += '<img src="' + tag_a[i].href + '" border=0/>'; // 「a」タグの内部HTMLの最後に「img」タグを「href」属性を指定して追加 } } } if (!value) { // Get-Function がオンからオフになったら、 embed_hrefs(gBrowser.contentDocument.body); // 以上の操作を document.body 要素から実行 }
基本はgetElementsByTagName
で目的のタグを辿ることにあります。他のボタンも以下の例外を除き、同様に実現しています。
一方で、タグ名を手掛かりに辿れないテキストについては、以下のようにすべての要素を辿る必要があります。
function check_text_link(node) { // すべての要素をこの関数を用いて再帰的に調査 if (node.nodeType === 3) { // テキストノードなら if (node.nodeValue.match(/\b(h?ttp:\/\/(\S+))/)) { // テキストの値がURL(もしくはh抜き)にマッチなら、 return true; // 真を返して終了(チェックはtrue) } } else if (node.nodeType === 1 && // 要素ノード、かつ !/^(style|script|iframe|pre|a)$/i.test(node.tagName)) { // タグ名が調査対象外ではないなら、 for (var i=0; i<node.childNodes.length; ++i) { // すべての子要素について if (check_text_link(node.childNodes[i])) // この関数を再帰的に呼んで、どれかがテキストがURLなら return true; // 真を返して終了(チェックはtrue) } } return false; // さもなくば偽を返して終了(チェックはfalse) }; value = check_text_link(gBrowser.contentDocument.body); // 以上の操作を document.body 要素から調査し、結果をprefbarのvalueへ代入
function text_link(node) { // すべての要素をこの関数を用いて再帰的に操作 var parentNode = node.parentNode; if (node.nodeType === 3) { // テキストノードなら if (node.nodeValue.match(/\b(h?ttp:\/\/(\S+))/)) { // テキストの値がURL(もしくはh抜き)にマッチなら、 var url = 'http://' + RegExp.$2; var a = gBrowser.contentDocument.createElement('a'); // 「a」タグを生成 a.href = url; a.appendChild(document.createTextNode(RegExp.$1)); // 「a」タグにテキスト要素(マッチした元のURL)を追加 parentNode.insertBefore(document.createTextNode(RegExp.leftContext), node); // テキストノードの前にテキスト要素(マッチの左側のテキスト)を追加 parentNode.insertBefore(a, node); // テキストノードの前に「a」タグを追加 parentNode.insertBefore(document.createTextNode(RegExp.rightContext), node); // テキストノードの前にテキスト要素(マッチの右側のテキスト)を追加 parentNode.removeChild(node); // このテキストノードそのものは削除 } } else if (node.nodeType === 1 && // 要素ノード、かつ !/^(style|script|iframe|pre|a)$/i.test(node.tagName)) { // タグ名が調査対象外ではないなら、 for (var i=0; i<node.childNodes.length; ++i) { // すべての子要素について text_link(node.childNodes[i]); // この関数を再帰的に呼んで、操作 } } } if (!value) { // Get-Function がオンからオフになったら、 text_link(gBrowser.contentDocument.body); // 以上の操作を document.body 要素から実行 }
基本はchildNodes
配列ですべての要素を辿ることにあります。また、innerHTML
を書き換えるか、createElement
の追加・削除で書き換えるかは、以上の二つの例のように少々コツが必要です。nodeTypeがいつ決定されるべきなのかを考えればどちらがよいかわかると思います。また、埋め込み画像の追加などは、innerHTML
を書き換える方式じゃないと画像の読み込みと描画がなされないようです。
prefbarのカスタマイズで「初期化」というのがあります。これはボタンIDに従って既定の内容に戻すためのもので、ボタンの配置や別途作成した別のIDのボタンには影響がありません。新しいprefbarをインストールした際に最新の状態に追従したい時に便利です。また、追従したくないボタンについては、複製してIDを別のものにしたものにしておけば、独自のボタン設定が消されないで済みます。
昨今はブラウザも機能過多になり、枯れていない技術だと特にその脆弱性が狙われやすく、使っていない機能は是非とも無効にしておきたいものです。以下のサイトは、ブラウザの機能や設定を確認するために作成したものですのでどうぞ活用して下さい。
Written by Taiji Yamada