fc2ブログ
QLOOKアクセス解析

Firefox コード例:一番親のウィンドウを取得する(サイドバーからでも有効)

Firefoxアドオンにて、一番親のウィンドウを取得するJavascriptコード例を挙げる。
サイドバーからでも有効に動作する。

/***********************************************
一番親のウィンドウを取得する(サイドバーからでも有効)
*/
var _win = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIWebNavigation)
.QueryInterface(Components.interfaces.nsIDocShellTreeItem)
.rootTreeItem
.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindow);
//オープナーを上へ上へとたどってゆく
while (_win.opener) _win = _win.opener;
//ルートウィンドウにフォーカス
_win.focus();


以下のようにwindow.topで取得する方がスマートに見えるが、Chromeを超えた場合に狙いと違うものが取れることがあるので注意が必要である。

_win = _win.top

以下、リファレンスの引用文。
Accessor for the root of this hierarchy of windows. This root may be the window itself if there is no parent, or if the parent is of different type (i.e. this does not cross chrome-content boundaries).
XULPlanet: Object Reference: ChromeWindow#topより引用)
スポンサーサイト



Firefox コード例:Firefoxのエラーコンソールにログを出力する

Firefoxのエラーコンソールにログを出力するJavascript例を挙げる。

/******************************************
Firefoxのエラーコンソールにログを出力する
*/
//標準ログ出力
var logs = Components.classes["@mozilla.org/consoleservice;1"] .getService(Components.interfaces.nsIConsoleService);
logs.logStringMessage("普通のログです");
//エラーログ出力
Components.utils.reportError("エラーログです");
try {
if (true) throw new Error("エラー発生!");
} catch (err){
//例外も引数に渡せる
Components.utils.reportError(err);
}


以下に例付きで詳しい。
cf. nsIConsoleService - MDC

Firefox コード例:ローカルファイルを指すURL(file:///)を作る

Firefoxアドオン上で、ローカルファイルを指すURL(file:///)を作るJavascript例を挙げる。

/***********************************************
file:/// の形式のファイルパス(URL)を作る
*/
//一度、普通のファイルを作る
var path = "c:\\Users\\xxx\\Desktop\\tmp\\";
var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
aFile.initWithPath(path);
aFile.append("hoge.txt");
//ファイルプロトコルハンドラの取得
var fph = Components.classes["@mozilla.org/network/protocol;1?name=file"]
.getService(Components.interfaces.nsIFileProtocolHandler);
//普通のファイルパスを file:/// 形式に変換する
var fileURL = fph.getURLSpecFromFile(aFile);
alert("拡張機能のファイルURL=" + fileURL);


cf. nsIFileProtocolHandler

逆に、file:/// から nsIFile を取得したい場合は以下が参考になる。
cf. nsIFile とパス文字列

Firefox コード例:拡張機能ディレクトリのファイルパスを取得する

Firefoxアドオンから自分の拡張機能ディレクトリのファイルパスを取得するJavascript例を挙げる。

/***********************************************
自分の拡張機能ディレクトリのファイルパスを取得する
*/
//Profile以下の自アドオンのディレクトリを取得
var extId = "{1E8D82DB-622C-4f7c-A6C8-66464999320D}";
//nsIFileオブジェクトを取得
var myExtDir = Components.classes["@mozilla.org/extensions/manager;1"]
.getService(Components.interfaces.nsIExtensionManager)
.getInstallLocation(extId)
.getItemLocation(extId);
//クローンを忘れずに!
var fileDir = myExtDir.clone();
//自アドオンディレクトリから下るにはnsIFile#appendを使う
fileDir.append("chrome");
fileDir.append("tmp");
fileDir.append("hoge.txt");
alert("ファイルパス=" + fileDir.path);


nsIFileオブジェクトを通してファイルのコピーや移動ができる。
cf. nsIFile

Firefox コード例:デスクトップ右下にポップアップをスライドアップさせる

Firefoxアドオンにて、デスクトップ右下にポップアップをスライドアップさせるJavascript断片。
この形式のプロンプトはFirefoxのダウンロード完了通知などで見かける。

nsIAlertsService.gif

/***************************************
デスクトップ右下にポップアップをスライドさせる
*/
var alerts = Components.classes["@mozilla.org/alerts-service;1"].getService(Components.interfaces.nsIAlertsService);
alerts.showAlertNotification(null, "タイトル", "内容はここに書きます" , false, "", null);


showAlertNotificationの引数に画像やイベントリスナも設定できるようだ。
以下に詳しい。
cf. nsIAlertsService

Firefox コード例:ウェブからバイナリ画像をGETしてファイルに保存する

Firefoxアドオンにて、ウェブからバイナリファイル(画像)をダウンロードしてファイルに保存するJavascript例を挙げる。


/******************************************
サーバからバイナリファイルをダウンロードする
*/
var url = "http://blog-imgs-19.fc2.com/k/f/a/kfall/hoge.png";
var request = new XMLHttpRequest();
request.open('GET', url, false);
request.overrideMimeType('text/plain; charset=x-user-defined');
//キャッシュをバイパス(必要ならば)
request.channel.loadFlags |= Components.interfaces.nsIRequest.LOAD_BYPASS_CACHE;
req.send(null);
if (req.status != 200) return;
var instream = req.responseText;

/******************************************
バイナリファイルをローカルに出力する
*/
//出力先ディレクトリのパス
var path = "c:\\Users\\ユーザ名\\Desktop\\tmp\\";
//出力先ファイルハンドラの生成
var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
aFile.initWithPath(path);
aFile.append("hoge.png");
//出力ストリームの生成
var outstream = Components.classes["@mozilla.org/network/safe-file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
outstream.init(aFile, 0x02 | 0x08 | 0x20, 0664, 0);
//書き出し
outstream.write(instream, instream.length);
if (outstream instanceof Components.interfaces.nsISafeOutputStream) {
outstream.finish();
} else {
outstream.close();
}


XmlRequestとファイルIOについては以下に詳しい。
cf. XMLHttpRequest
cf. Code snippets:File I/O

また、このコードを書くにあたって「Script雑感」の次の記事を参考にさせていただいた。
cf. Script雑感 Ajax:画像を取得して表示する(Firefox)

「Script雑感」ではブラウザに画像をそのまま表示させており、非常に勉強になった。
以下、画像表示部分の引用:

write_binary_file = function(url) {
// 49 => "1" (decimal)
var filestream = load_url(url);
var bytes = [];
for (i = 0; i < filestream.length; i++)
bytes[i] = filestream.charCodeAt(i) & 0xff;
// 改造
var ele = document.createElement('img');
ele.src = 'data:image/gif;base64,'
+ base64.encode(String.fromCharCode.apply(String, bytes));
document.getElementById('testBinery').appendChild(ele);
}

Firefox コード例:キャッシュをクリアする

FirefoxアドオンからFirefoxのキャッシュをクリアするJavascript例を挙げる。

■キャッシュをまるっと消す
FF3のメニューバーで「ツール→オプション→詳細→ネットワーク→オフラインデータ」とたどり、「今すぐ消去」ボタンを押下するのとほぼ同じようなキャッシュをまるっと消す処理を拡張機能から実行できる。

/********************************************
キャッシュを全部消す
*/
//キャッシュサービスの生成
var caches = Components.classes["@mozilla.org/network/cache-service;1"].getService(Components.interfaces.nsICacheService);
//キャッシュのクリア
caches.evictEntries(Components.interfaces.nsICache.STORE_ANYWHERE);
//↑他にも個別にストレージを指定できる
//STORE_IN_MEMORY, STORE_ON_DISK, STORE_ON_DISK_AS_FILE, STORE_OFFLINE


■キャッシュを個別に消す
特定のキャッシュを指定して消すこともできる。

/********************************************
URLを指定して特定のキャッシュを消去
*/
//消したいキャッシュのURL
var uri = "http://blog-imgs-19.fc2.com/k/f/a/kfall/favicon.ico";
//キャッシュサービスの生成
var caches = Components.classes["@mozilla.org/network/cache-service;1"].getService(Components.interfaces.nsICacheService);
//キャッシュセッション(nsICacheSession)の生成
//第一引数 = "HTTP" ←ミソ。メモリ上の画像は"image"
var cs = this.caches.createSession("HTTP", Components.interfaces.nsICache.STORE_ANYWHERE, true);
cs.doomEntriesIfExpired = false;
//キャッシュエントリ(nsICacheEntryDescriptor)を取得する
//第一引数 = 消したいキャッシュのURL
var dsc = cs.openCacheEntry(uri, Components.interfaces.nsICache.ACCESS_READ_WRITE, true);
if (dsc) {
dsc.doom();
dsc.close();
cs = null;
}


■キャッシュの確認方法
Firefoxのロケーションバーに「about:cache」と入力し、リターンキーを押下すると、キャッシュ情報が参照できる。

Firefoxのキャッシュ操作の参考文献は少ないが、手がかりとしては以下のページがある。
cf. XULPlanet: XPCOM Reference: Cache

Firefox コード例:タイトル付きダイアログプロンプトを出す

Firefoxアドオンから警告や確認ダイアログボックスを出すJavascript例を挙げる。

タイトルを入れられる点が普通のwindow.alert()やwindow.confirm()との違い。

/**************************************
Firefox ダイアログポップアップ
*/
var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
//window.alert()に相当
prompts.alert(null, "タイトル文言", "警告文言");
//window.confirm()に相当
var ret = prompts.confirm(null, "タイトル文言","確認文言");


confirm_fx.png

以下に詳しい。
cf. nsIPromptService

Firefox コード例:SQLite(*.sqlite)を操作する

Firefoxアドオンから、SQLite(*.sqlite)を操作するJavascriptの例を挙げる。

/************************************************
places.sqliteに対しSQLの発行を行う
*/
//ファイルサービスの生成
var myplaces = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);
//アクセスするデータベースファイルを追加
myplaces.append("places.sqlite");
//ストレージサービスの生成
var storages = Components.classes["@mozilla.org/storage/service;1"].getService(Components.interfaces.mozIStorageService);
//DBコネクションの生成
var conn = storages.openDatabase(myplaces);

//SQLの実行(参照)
//この例ではhttp://kfall.blog17.fc2.com/というURLのファビコンのIDを検索
//ステートメントの生成
var stmt = conn.createStatement("SELECT favicon_id, url FROM moz_places WHERE url = ?1");
//バインド変数
stmt.bindStringParameter(0, "http://kfall.blog17.fc2.com/");
//結果取得
while(stmt.executeStep()) {
alert("favicon_id=" + stmt.getString(0) + "\nurl=" + stmt.getString(1));
}
//SQLの実行(更新)
//この例ではhttp://kfall.blog17.fc2.com/というURLのファビコンレコードを削除
conn.executeSimpleSQL("DELETE FROM moz_favicons WHERE id = (SELECT favicon_id FROM moz_places WHERE url = 'http://kfall.blog17.fc2.com/')");


SQLiteの扱いは以下が参考になる。
cf. Storage - MDC

kfall+ Firefox 3ブックマークFaviconリセット手順その2(SQLite Manager)

最近の記事

みんなの拡張機能
シリーズ記事一覧
カテゴリ一覧
ブログ内検索
QRコード
QR
プロフィール

くふぉーる

はじめまして。日本のシステムエンジニア「くふぉーる」です。
このブログではできるだけ役立つ記事を掲載することを心がけています。

RSSフィード
このブログについて
・ このブログは全記事リンクフリーです。
・ スパム対策として、トラックバック、コメントは承認制にしてあります。