Hatena::Groupmoz-addon

hogezilla RSSフィード

当ページに書かれているコードは、修正BSDライセンスのもと、再頒布して頂いて構いません。

 | 

2011-09-14femo.jp がサービス終了してしまったので、ここにリストア

実行アプリケーションのシステム情報を得る

| 19:25 | はてなブックマーク - 実行アプリケーションのシステム情報を得る - hogezilla

XULRunner 等では重要?

Class
@mozilla.org/xre/app-info;1
Interface
nsIXULAppInfo , nsIXULRuntime

nsIXULAppInfo

var appInfo = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo);
Firefoxの例
{
  ID: "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}",
  appBuildID: "20100914125854",
  name: "Firefox",
  platformBuildID: "20100914125854",
  platformVersion: "1.9.2.10",
  vendor: "Mozilla",
  version: "3.6.10",
}

nsIXULRuntime

appInfo.QueryInterface(Ci.nsIXULRuntime);
Windows XP 上の Firefox の例
{
  OS: "WINNT",
  XPCOMABI: "x86-msvc",
  isSafeMode: false,
  logConsoleErrors: false,
  widgetToolkit: "windows"
}

nsIProperties や nsIDirectoryService で使用できるキー値

| 19:18 | はてなブックマーク - nsIProperties や nsIDirectoryService で使用できるキー値 - hogezilla

const directoryService = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIDirectoryService);
var profileDir = directoryService.get("ProfD", Ci.nsIFile);

などで使用しているプロファイルディレクトリを得たりすることは多いが、この "ProfD" って何? っていうか、それ以外は何が使えるの? って話

getKeys メソッド 使えない。 実装を見ると、以下のとおり (T_T)

NS_IMETHODIMP nsDirectoryService::GetKeys(PRUint32 *count, char ***keys) {
  return NS_ERROR_NOT_IMPLEMENTED;
}

結論

nsIDirectoryServiceDefs.h を見ろ

http://mxr.mozilla.org/mozilla/source/xpcom/io/nsDirectoryServiceDefs.h を見るのが一番

nsIFile と nsIURI との相互変換

| 19:16 | はてなブックマーク - nsIFile と nsIURI との相互変換 - hogezilla

nsIURI (file URL) から nsIFile への変換

var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
file.initWithPath("C:\\WINDOWS");

// nsIFile to nsIURI
const IOS = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
var uri = IOS.newFileURI(file);

// nsIURI to nsIFile
const FPH = Cc["@mozilla.org/network/protocol;1?name=file"].getService(Ci.nsIFileProtocolHandler);
var file = FPH.getFileFromURLSpec(uri.spec);

Windowsのドライブリストを得る

| 19:12 | はてなブックマーク - Windowsのドライブリストを得る - hogezilla

LinuxMac OS X ならルートとなるディレクトリがあるが Windowsだと・・・なので調べた。

結果、RDFrdf:filesデータソースを使う

const Cc = Components.classes,
      Ci = Components.interfaces;

const FileProtocolHandler = Cc["@mozilla.org/network/protocol;1?name=file"]
                             .getService(Ci.nsIFileProtocolHandler);
const RDF = Cc["@mozilla.org/rdf/rdf-services;1"].getService(Ci.nsIRDFService);
const NC_ROOT = "NC:FilesRoot",
      NC_CHILD = "http://home.netscape.com/NC-rdf#child";

var rdfFiles = RDF.GetDataSource("rdf:files");
var enumerator = rdfFiles.GetTargets(NC_ROOT, NC_CHILD, true); // nsISimpleEnumerator
var drives = [];
while (enumerator.hasMoreElements()){ // resource.Value に "file://C|/" などがある
  var resource = enumerator.getNext().QueryInterface(Ci.nsIRDFResource); // nsIFile に変換
  var file = FileProtocolHandler.getFileFromURLSpec(resource.Value);
  drives.push(file);
}

Linux系やMacでも、動く。ただし、/ (root)ディレクトリが得られるだけである。 余談 実装を見てちょっと笑った http://mxr.mozilla.org/mozilla/ident?i=GetVolumeList ボクの実力ではきちんと読むことは出来ないが、A-Zのドライブがあるかどうかで総当りをしているみたい

Firefox 3 OpenSeachのsuggest機能

| 19:08 | はてなブックマーク - Firefox 3 OpenSeachのsuggest機能 - hogezilla

ContractID
@mozilla.org/browser/search-service;1
Interface
nsISearchEngine
const Cc = Components.classes;
const Ci = Components.interfaces;
const responseType = 'application/x-suggestion+json';
var searchWord = 'hogehoge';
var ss = Cc['@mozilla.org/browser/search-searvice;1'] .getService(Ci.nsIBrowserSearchService);
var googleSE = ss.getEngineByAlias('google'); //nsISearchEngine
if (googleSE.supportsResponseType(responseType)) {
  var submission = googleSE.getSubmission(searchWord, responseType); //nsISearchSubmission
  var uri = submission.uri; //nsIURI
  var uri_spec = uri.asciiSpec; //'http://suggestqueries.google.com/complete/search?output=firefox&client=firefox&hl=ja&qu=hogehoge
  // ....;
}
トラックバック - http://moz-addon.g.hatena.ne.jp/teramako/20110914
 |