| « 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