2013年10月26日土曜日

GeckoFxのGeckoWebBrowserの履歴を残さない方法/消す方法

ローカルデータのビューアを作るためにGeckoが使えないかと色々試しています。 というわけで前回に続きGeckoFxネタです。 履歴を残さない方法と履歴の消去方法について調べてみました。 ローカルデータを見てるだけなのに履歴が増えていって圧迫とか、マズいですもんね。

Geckoの設定は Gecko.GeckoPreferences.User["項目"] = 値; でできます。 設定内容はfirefoxのabout:configとかぶっているわけですが、そのままではありません。 「Geckoに色々機能を付けてfirefoxを作った」という事で、firefoxにあってGeckoにない項目がけっこうあるのです。

で、履歴の管理方法について少し調べたんですが、GeckoPreferencesで履歴をどうこうする方法が見つかりませんでした。 firefoxでいうところの「プライベートブラウジングで履歴を残さない」とか「ブラウザ終了時に履歴を消す」とかっていう機能は自分でコードを書かなければならないようです。

まず、履歴を残さないでページを移動するには単純にGeckoWebBrowser.NavigateでGeckoLoadFlags.BypassHistoryを指定すればいいようです。 GeckoWebBrowser.Navigateにはいくつかのオーバーロードがあるので、その中でGeckoLoadFlagsが指定できるメソッドを使います。

ただし、この方法は完全ではありませんでした。 リダイレクト跡なのか何なのかよく確認しませんでしたが、例えばウィキペディアのページをGeckoFxで見ると履歴の一片が残ってしまいました。 凝ったものを作る場合は注意が必要です。 履歴を消す方法と併せて実装する必要があります。 ローカルの画像ファイルなどを見るときには履歴は残りませんでした。 単純なビューアのレンダリングエンジンとして使う場合などはGeckoLoadFlagsを指定するだけで良さそうですね。

次に履歴を消す方法を書きます。 XPCOMのnsIBrowserHistoryインターフェイスを継承したオブジェクトを使うといいようです。 GeckoFxでnsIBrowserHistoryのインスタンスを得るコードはこうなります。

「@mozilla.org/browser/nav-history-service;1」はContractIDというモノらしいです。 javascriptのコードなどでいくつか見たことがあります。 XPCOMには色々なオブジェクトがあるので、そういうコードを参考にすればできることを広げられそうですね。

で、実際に履歴を消すには

とします。 これで履歴が全部消せます。

XPCOMのインスタンスを得るには別の書き方があるようです。 こんな書き方でも大丈夫でした。

XPCOMのインスタンスには色々あるけど、オブジェクトによって「2つのやり方の片方でしかインスタンスを得られない」とかあるそうです。 nsIBrowserHistoryの場合は両方大丈夫でしたが、詳細は調べてないので「どっちを使うのがより良いか?」とか「こういうオブジェクトの場合はこっちのやり方にすべき」とかっていうのは不明です。

あと、気になる事があって、XPCOMオブジェクトのライフサイクルについても不明なんです。 特にCreateInstanceByContractIDを使った場合、「CreateしたんならDisposeしなくちゃダメ?」などと考えてはいるんですけど、情報が見つからないんですよね。 小さなサンプルコードを書いて満足している今は「その都度インスタンスを用意するんじゃなくて初期化処理のときにインスタンスを用意しといて使いまわせばリークの被害とか少なそうだなぁ」という程度でやってますが、続けるならもうちょっと調べなくては...