« about:foxkeh | Inspecting Bookmarks data with nsIRDFObserver » |
nsIRDFObserver を使ってブックマークのデータソースの動きを調べる
English version of this post is also available.
nsIRDFObserver によってRDFデータソースに起こった様々な変化を監視することができる。ブックマークのデータも Firefox の内部ではRDFデータソースとして管理されているので、後述するような nsIRDFObserver によってブックマークのデータがどのように管理されているかを、エラーコンソール(JavaScript コンソール)を使って調べることができる。
まずは、データソースを監視するための nsIRDFObserver オブジェクトを定義する。なお、 _targetToString と _log は、独自に定義したプライベートなメソッドである。
var rdfObserver = { onAssert : function(aData, aRes, aProp, aTarget) { this._log(["onAssert", aData.URI, aRes.Value, aProp.Value, this._targetToString(aTarget)].join(" ")); }, onBeginUpdateBatch : function(aData) { this._log(["onBeginUpdateBatch", aData.URI].join(" ")); }, onChange : function(aData, aRes, aProp, aOldTarget, aNewTarget) { this._log(["onChange", aData.URI, aRes.Value, aProp.Value, this._targetToString(aOldTarget), this._targetToString(aNewTarget)].join(" ")); }, onEndUpdateBatch : function(aData) { this._log(["onEndUpdateBatch", aData.URI].join(" ")); }, onMove : function(aData, aOldRes, aNewRes, aProp, aTarget) { this._log(["onMove", aData.URI, aOldRes.Value, aNewRes.Value, aProp.Value, this._targetToString(aTarget)].join(" ")); }, onUnassert : function(aData, aRes, aProp, aTarget) { this._log(["onUnassert", aData.URI, aRes.Value, aProp.Value, this._targetToString(aTarget)].join(" ")); }, /** * nsIRDFNode から適切なインタフェースを参照し、String型の値を取得する */ _targetToString : function(aTarget) { const Ci = Components.interfaces; if ( aTarget instanceof Ci.nsIRDFLiteral ) // 文字列 return aTarget.QueryInterface(Ci.nsIRDFLiteral).Value; else if ( aTarget instanceof Ci.nsIRDFInt ) // 数値 return aTarget.QueryInterface(Ci.nsIRDFInt).Value; else if ( aTarget instanceof Ci.nsIRDFDate ) // 日時 return aTarget.QueryInterface(Ci.nsIRDFDate).Value; else // 他にもあったっけ? return ""; }, /** * 文字列をエラーコンソールへ出力 */ _log : function(aMsg) { var consoleSvc = Components.classes['@mozilla.org/consoleservice;1'].getService(Components.interfaces.nsIConsoleService); consoleSvc.logStringMessage(aMsg); }, };
あとは、ブックマークのデータソースに対して先ほどのオブザーバを追加してやるだけで良い。
// ブックマークのデータソースを取得 var rdfSvc = Components.classes['@mozilla.org/rdf/rdf-service;1'].getService(Components.interfaces.nsIRDFService); var bmds = rdfSvc.GetDataSource("rdf:bookmarks"); // データソースへオブザーバを追加 bmds.RemoveObserver(rdfObserver); bmds.AddObserver(rdfObserver);
リファレンス:
Interface Reference – nsIRDFObserver
Interface Reference – nsIRDFDataSource