トップページ⇒tech
1001コメント327KB

Mozillaでプログラミング(XUL) その2

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
オラ拡張作る。

前スレ
Mozillaでプログラミング(XUL)
http://pc5.2ch.net/test/read.cgi/tech/1019704370/
0002デフォルトの名無しさんNGNG
テンプレ書いてるうちに立ってたorz

XULはXMLベースのUI記述言語です。
Mozilla,Firefox,Thunderbird,Netscape等の
Gecko系のソフトウェアために開発されました。

このスレはXUL、javascriptで利用できるXPCOM、
拡張を作り方などを主に話しあうスレです。

前スレ
Mozillaでプログラミング(XUL)
http://pc5.2ch.net/test/read.cgi/tech/1019704370/
姉妹スレ
Geckoベースのブラウザを作ろう
http://pc5.2ch.net/test/read.cgi/tech/1023546699/l50

>>2-50あたりに関連リンク、近況など。
00031NGNG
>>2
うわ、すまそ
0004デフォルトの名無しさんNGNG
>>1
いやいや、スレ立て乙。
0005デフォルトの名無しさんNGNG
>>1
乙!
0006デフォルトの名無しさんNGNG
Z。
0007デフォルトの名無しさんNGNG
みなさん、overlayした拡張を作るときどのようにテストしてるんですか?
Firefoxで、xul単体だけなら引数の-chromeで表示・テストできるんですけど
overlayした拡張のテスト方法が分かりません。
0008デフォルトの名無しさんNGNG

MozillaJapan 資料集: コアアーキテクチャ: XUL
http://www.mozilla-japan.org/catalog/architecture/xul/
XUL Tutorial 日本語版 - 和訳ドキュメント一覧
http://www.mozilla.gr.jp/jt/xul/progress.html
XULアプリケーション作成入門
http://www.mozilla.gr.jp/~kazhik/xul/tutorial.html
XUL研 Moz2chなど
http://xul-app.hp.infoseek.co.jp/
XULプログラマの参考書
http://www.bekkoame.ne.jp/~poetlabo/WWW/XULref/XUL_Reference.html

0009デフォルトの名無しさんNGNG
XUL Planet 聖典
http://www.xulplanet.com/
0010デフォルトの名無しさんNGNG
>>7
ブラウザ(chrome://browser/content/browser.xul)にオーバーレイしたXULなら
毎回ブラウザを再起動してテストしなければならない。
0011デフォルトの名無しさんNGNG
関連リンク
Mozilla Cross Reference(ソースコード検索)
http://lxr.mozilla.org/mozilla/

上とxulplanetでなんとかなる。以下余談。

mozilla.orgはサイト構成に問題があるので、自力で見つけるのは難しい。
http://www.mozilla.org/scriptable/components_object.html
Components.interfaces.nsILocalFileとか機械的にコピペしてる人は
一度くらい読んでおくといいかも。

http://www.mozilla-japan.org/docs/tutorials/tinderstatus/
公式拡張サンプル。mykはFirefox用の記事を書いてるって
3ヶ月くらい前に言ってたけど、まだ完成してないらしい。
多分忘れてる。

http://kb-upgrade.mozillazine.org/index.php/Main_Page
私が書いたコードも入っているが、はっきり言うと全然使えない。
でも、__proto__とかやけにマニアックな解説がある。

http://wiki.fdiary.net/xul/
前スレの後ろの方で紹介されてた。
wikiだから、いつの間にか化けてるかも。

Javascriptを極めたいなら、
http://www.crockford.com/#javascript
こういうのが好きな人とか。
foo.prototype.__defineGetter__('bar', function(){return 0;});
0012デフォルトの名無しさんNGNG
>>10
ありがとうございます。
それは、http://www.mozilla.gr.jp/~kazhik/xul/tutorial.htmlに書いてあるように
chromeディレクトリ下にxulなどのファイルを置いた状態でテストできるのでしょうか?
0013デフォルトの名無しさんNGNG
もちろんできますよ。
0014デフォルトの名無しさんNGNG
>>13
それは、引数の-chromeをつけてFirefox本体を起動するんですか?
質問が多くてすいません
0015デフォルトの名無しさんNGNG
いや、そんな必要は無いです。
引数-chromeはあるクロムURLのXULを単体のウィンドウで開きたい時だけ使います。
0016デフォルトの名無しさんNGNG
多分、なんか勘違いしてるんじゃないかな。
overlayは当然インストールしないとテストできない。
で、インストールする時にzipで固めずにインストールするといい感じ。
http://kb-upgrade.mozillazine.org/index.php/Dev_:_Tips_:_Disable_XUL_cache
0017デフォルトの名無しさんNGNG
>>15
そうだったんですかー。
じゃあoverlayしたxulを書いたら、普通に起動するだけでOKなんですね。
ありがとうございました。

>>16
ってやっぱりインストールしないとダメなんですね・・・
installed-chrome.txtを編集するだけじゃダメですか?
0018デフォルトの名無しさんNGNG
installed-chrome.txtを編集するのとinstallするのは全く同じ。
インストーラーが書き換えるか手で書き換えるかの違いだけ。
でも、firefoxの場合、フォルダをインストールする方が楽だと思う。
0019デフォルトの名無しさんNGNG
>>18
勉強になります。ありがとうございました。
0020デフォルトの名無しさんNGNG
だから、順番が逆なんだね。
インストールスクリプトを最初に書いて、
白紙のoverlayをとりあえずインストールするんだよ。
で、いろいろいじって完成したら、コピーをとってアンインストールして、
zipで固めてインストールテスト、公開、鋭いツッコミ、ぎゃあ。
0021デフォルトの名無しさんNGNG
開発用の環境とインストールテスト用の環境は分けといた方が楽だよ。
(当然プロファイルは分けて)
0022デフォルトの名無しさんNGNG
>>10
毎回ブラウザを再起動しなくてもブラウザ自体をリロードすればいい

#そのためのxuld
Ctrl+\でリロード
http://nazodane.hp.infoseek.co.jp/extension/xuld.xhtml
0023デフォルトの名無しさんNGNG
>>22
なるほど!!今まで馬鹿みたいに毎回再起動してたわ。
0024デフォルトの名無しさんNGNG
漏れは新しいウィンドウ開いて確認してる。
0025デフォルトの名無しさんNGNG
>>24
ですね。私もそれです。
0026デフォルトの名無しさんNGNG
>>11 に追加
http://www.hevanet.com/acorbin/xul/top.xul
XUL コンポーネントのサンプル集。 XUL のリファレンスとしても使える。
0027デフォルトの名無しさんNGNG
誰あ前スレを閲覧できておくように保存してくれる人など居ないものか?
0028デフォルトの名無しさんNGNG
保存してまとめサイトにアップしておきました。

ttp://firefox.geckodev.org/?%B4%D8%CF%A2%A5%B9%A5%EC%A5%C3%A5%C9#i0181e3b
0029デフォルトの名無しさんNGNG
>>18
フォルダをインストールってどうやるの?
0030デフォルトの名無しさんNGNG
>>29
前スレにあったはず。
003130NGNG
すまん。。

>>29
>>16
0032デフォルトの名無しさんNGNG
>>16をわかりやすく言うと、
chromeにjarファイルの代わりにフォルダをいれて、
install.rdfにjarファイルの代わりにフォルダ名を書いとけってことだ
0033デフォルトの名無しさんNGNG
>>31
>>32
トン!
0034デフォルトの名無しさんNGNG
まとめサイトの和訳チュートリアル見ながら見よう見真似で拡張の中身とか
install.rdf install.jsを書いて試したんですが、いざインストールしても
再起動する時にエラーで正常にインストールされません。

エラー文にはcontent.rdfの位置指定が間違ってるとかあるんですが・・。
0035デフォルトの名無しさんNGNG
install.jsはとりあえずは不要では?
また、content.rdfではなく、contents.rdfです。
0036デフォルトの名無しさんNGNG
質問です。firefoxの拡張を作ってるのですが
ツリーのカラムヘッダを非表示にするにはどのようにすればよいのでしょうか?
treecolにhideheaderを追加してもダメでした。
0037デフォルトの名無しさんNGNG
hidecolumnpicker="true"になってないとか?
0038デフォルトの名無しさんNGNG
>>37
ありがとうございます。とりあえずこんな感じで書いてるんですが、ダメでした・・orz

<tree flex="1">
<treecols>
<treecol id="test" hideheader="true" hidecolumnpicker="true" primary="true" flex="1" />
</treecols>

<treechildren>
<treeitem container="true" open="true">
<treerow>
<treecell label="test"/>
</treerow>

<treechildren>
<treeitem>
<treerow>
<treecell label="test1"/>
</treerow>
</treeitem>
</treechildren>
</treeitem>
</treechildren>
</tree>
0039デフォルトの名無しさんNGNG
hidecolumnpickerはtreeの属性です。

<tree flex="1" hidecolumnpicker="true">
以下略
0040デフォルトの名無しさんNGNG
treeにhidecolumnpicker="true"を書いたらいけました・・・
>>37さんありがとうございました。
スレ汚しすまそ。
0041デフォルトの名無しさんNGNG
>>32
肝心なインストールの時はどうやるんだ・・・xpiに固めたら意味ないだろうし・・・
英語読めねー誰か解説してくりー
0042デフォルトの名無しさんNGNG
>>41
いや、xpiには固めるんだよ。
0043デフォルトの名無しさんNGNG
>>42
マジですか、でもそれじゃあ編集できないんじゃ・・?
0044デフォルトの名無しさんNGNG
あーなんとなく意味分かったかも。
0045デフォルトの名無しさんNGNG
xpiには固めないでしょ。
情報が古いかもしれないけど、
http://www.mozilla.gr.jp/~kazhik/xul/tutorial01.html
このページに書いてあるように手動でフォルダを置き、設定ファイルを書き換える。
0046デフォルトの名無しさんNGNG
そう、いじるのはプロファイルの中身だから、
上手い具合に解凍されてるわけだ。
0047デフォルトの名無しさんNGNG
>>45
そっちの方が古い
0048デフォルトの名無しさんNGNG
>>45-46
とりあえずxpiに固めて試してみます。
お二人さんありが�d
0049デフォルトの名無しさんNGNG
tinderstatusとか、xpiだけどインストールすると
解凍された状態になる。
確か、torisugari氏もget file sizeのnon-jarred版を公開してたはずだが、
404だね。
0050デフォルトの名無しさんNGNG
一見404でも、この辺にあったりする
http://cgi29.plala.or.jp/mozzarel/addon/obsolete/phoenix_firebird_firefox/non-jarred/
http://cgi29.plala.or.jp/mozzarel/addon/firefox/tinderstatus/
0051デフォルトの名無しさんNGNG
install.rdfのIDって適当に書いていいんですかね?
0052デフォルトの名無しさんNGNG
>>51
だめ。GUID Generator を使おう。

http://extensions.roachfiend.com/cgi-bin/guid.pl
0053デフォルトの名無しさんNGNG
>>52
おお!サンクス!
0054デフォルトの名無しさんNGNG
たまに適当に書いているというか拡張の名前を含めているのもみかけるが。
0055デフォルトの名無しさんNGNG
適当すぎ。
0056デフォルトの名無しさんNGNG
仕様上の要求はGUIDなので、Web上で公開するならGUIDを使うべき。
実際にはどんな文字列でも動くから、
自分のマシンだけで使う場合は適当でいい。
0057デフォルトの名無しさんNGNG
MSのGUIDGenとかで良いよ。
http://www.microsoft.com/downloads/details.aspx?FamilyID=94551f58-484f-4a8c-bb39-adb270833afc&DisplayLang=en
0058デフォルトの名無しさんNGNG
GUIDGenは大文字と小文字が混じってるのがなぁ。
MACアドレス使ってるからこっちがいいんだろうけど。
0059デフォルトの名無しさんNGNG
XPCOMで

aIOService.newChannelFromURI(aURISpec).QueryInterface(Components.interfaces.nsIHttpChannel);

とかやってるのを見たのですが、newChannelFromURIの返り値はnsIChannelなのにnsIHttpChannelで
QueryInterfaceできるのは何故でしょうか。
0060デフォルトの名無しさんNGNG
nsIHttpChannelはnsIChannelを継承してるから。
http://www.xulplanet.com/references/xpcomref/ifaces/nsIHttpChannel.html
0061デフォルトの名無しさんNGNG
>>60
うーん、それってあまり正確じゃないような。
継承してるのは確かだけどね。
あえて言うなら、「理由はない」な。
aURISpecのプロトコルがhttp[s]?じゃなかったら、
QueryInterfaceは失敗する。
こういう実装がごく自然だってことはわかってほしいが…
006259NGNG
メソッドが返す値はドキュメントに書いてあるインタフェイスを
継承した別のインタフェイスを持っている可能性もあるってこと?
メソッドが返す値が持っている可能性があるインタフェイスの一覧とかって
どこ見たら分かりますか?
0063デフォルトの名無しさんNGNG
firefoxでタブを一覧表示しようとしてるのですが
現在開いてるタブをすべて取得するにはどのようにすればよいのでしょうか?
0064デフォルトの名無しさんNGNG
gBrowser.mTabContainer.childNodes
0065デフォルトの名無しさんNGNG
>>64
ありがとうございます!
0066デフォルトの名無しさんNGNG
>>62
>メソッドが返す値はドキュメントに書いてあるインタフェイスを
>継承した別のインタフェイスを持っている可能性もあるってこと?

そうなるね。
でもそれは、継承している親インターフェイス以外でもおき得る。
インターフェイスっていうのは、余分についてる分には文句の付けようがない。
よく本体と手足に喩えられるられるが、
「握手したいから手を差し出せ」
って言われた時、そいつの足が八本あろうがキャタピラになってようが、
手がついていれば握手に支障はない。

逆にいうと、足がいくらたくさんあっても手がなければ握手はできないから、
インターフェイスをきっちり実装するのが重要なんだけどね。

インターフェイスは必要条件を記述するためのものだから、
実際に送りつけられるインスタンスの十分条件とは限らない、って感じだろうか。

足が八本も付いてるのに、パンチしかしないのはもったいないなー、
と感じた時のためのQueryInterfaceで、
「足があるならキックもやらせようか」ということになる。

継承した子クラスってのは、普通の手だと思ってたのが
実は超合金製だった、とかそんな感じだね。
知らなきゃ握手にしか使えないが、
知ってれば釘を打ったりいろいろ使えて便利になる、と。
0067デフォルトの名無しさんNGNG
JavaScriptの重たいループ処理をバックグラウンドで実行させる方法はありますでしょうか。
勘で以下のようにやりましたが、まったく処理が動きませんでした。

var runnable = { run : function(){ 重たい処理 } };
const CITHREAD = Components.interfaces.nsIThread;
var thread = Components.classes['@mozilla.org/thread;1'].createInstance(CITHREAD);
thread.init(runnable, 0, CITHREAD.PRIORITY_NORMAL, CITHREAD.SCOPE_GLOBAL, CITHREAD.STATE_JOINABLE);
0068デフォルトの名無しさんNGNG
>>66
なるほど。

>>59のコードを書いた人はどうやって
aIOService.newChannelFromURI(aURISpec)の返り値が
Components.interfaces.nsIHttpChannelお持っていると
気付いたのでしょうか。
たまたまQueryInterfaceして分かったってこと?
0069デフォルトの名無しさんNGNG
内部の情報に詳しかったんじゃないの?
英語の方ならドキュメントも充実してるようだし・・・
0070デフォルトの名無しさんNGNG
xpcom warpped objectかどうかを判定する確実な方法が
しりたいのですが、どうすればいいですか?
0071デフォルトの名無しさんNGNG
try-catch構文でQueryInterfaceしてみるのが一番早いのではないでしょうか。
0072デフォルトの名無しさんNGNG
>>70
instanceof 構文で出来るよ。

var channel = ioService.newChannel("http://www.example.com/", null, null);
alert(channel instanceof Components.interfaces.nsIHttpChannel); // おそらく true
alert(channel instanceof Components.interfaces.nsIFTPChannel); // おそらく false

var channel = ioService.newChannel("ftp://ftp.example.com/", null, null);
alert(channel instanceof Components.interfaces.nsIHttpChannel) // おそらく false
alert(channel instanceof Components.interfaces.nsIFTPChannel) // おそらく true
0073デフォルトの名無しさんNGNG
treeにアイテムを追加するにはどうすればいいの?
タブはaddTabとかあるけど、treeがいまいち分からん。
0074デフォルトの名無しさんNGNG
>>71
>>72
ありがとうございます。
もうひとつ、nsIEnumerator,nsICollectionでは
アイテムの返り値は、nsISupportsですが
例えば、nsICollectionのなかに、複数の[spconnect wapped nsI*]を格納した時
どのように、QueryInterfaceすれば良いのでしょうか。
NO INTERFACEなどが、出てしまい、うまくいきません。おねがいします。
0075デフォルトの名無しさんNGNG
try{
support.QueryInterface(Components.interfaces.xxx);
}catch(e){
if(e.name==" NO INTERFACE"}{
//インターフェイスがないとき

}
}
007674NGNG
nsICollectionの中身が全部欲しいから、
GetElementAt(0)で、かってくる
nsISupportsがもっている、interfacesのリストなどが
わかるといいのですが。。
007773NGNG
もしかして、appendChildとか使わないとダメですか?
0078デフォルトの名無しさんNGNG
俺だったらDOM使うけど他にも方法あると思うよ
0079デフォルトの名無しさんNGNG
>>73
createElementNSで要素を作ってappendChildしていくのも可能だけど
RDFデータソースからテンプレートで生成したほうがいい。
0080デフォルトの名無しさんNGNG
一応、nsIClassInfoっていう専用のインターフェイスがあるから、
それをもってるかどうかをまず確認した方がいいね。
008173NGNG
>>79
その方法は、要素の入れ替わりが頻繁に起こるタイプのプログラムに向いてますかね?
そういうのを作ろうとしてるもので・・・
0082デフォルトの名無しさんNGNG
>>81
そうそう。動的なツリーを作る場合の定石。
0083デフォルトの名無しさんNGNG
要素の入れ替わりが一度でも起こるんならappendChild, removeChildなんてめんどくさくてやってられん。
0084デフォルトの名無しさんNGNG
>>82
おお、そうなんですか。ではその方法で行こうと思います。
0085デフォルトの名無しさんNGNG
binaryStreamをつかって読み書きしたいのですが
ファイルをバイナリで読み込む方法はわかったけど、
nsILocalFileをつかわずにpythonでいうStringIOのような
ものを使うにはどうすればいい?
下のようにすれば、できるかと思ったけど。
nsISimpleStreamListener.init(outputStream,observer)
outputStream.write("hoge",4)
とすると、かならず固まるか、落ちてしまいます。
正しい使い方を、おしえてください;

0086デフォルトの名無しさんNGNG
type="checkbox"にしたtoolbarbuttonやmenuitemで、oncommand時のcheckedプロパティが
MozillaとFirefoxとで逆のようです。
現状ではしかたなくnsPreferencesからapp.idを取得してFirefoxの場合は…としてますが、
他にうまい解決方法はありませんか?
そもそもなぜFirefoxはcheckedが逆になってしまうのか謎。

サンプルコード
<toolbarbutton type="checkbox" oncommand="alert(this.checked);" />
こちらは問題無し
<checkbox oncommand="alert(this.checked);" />
0087デフォルトの名無しさんNGNG
>>86
CSSが正しくプロパティを解釈出来てるんなら、
少なくともアトリビュートは正確、ってことになる。

alert((this.getAttribute("checked") == "true")? "Checked": "Not checked.");
でどうだろうか?
0088デフォルトの名無しさんNGNG
>>87
それでも結果は同じでした。
0089デフォルトの名無しさんNGNG
oncommandとチェックの発生順序かな
是はどうしようもないかと
0090デフォルトの名無しさんNGNG
oncommand="setTimeout(function(){alert(event.originalTarget.checked);}, 0);"
としたらうまくいきました。
Firefoxではoncommandよりもcheckedが先に変更されるということか。
0091デフォルトの名無しさんNGNG
>>90
そうみたいだね。
DOM的に言えば、Semonkeyの方が正しい挙動だと思う。
0092デフォルトの名無しさんNGNG
BookmarkなどのRDFデータソースってどこに置かれてるんでしょう?
0093デフォルトの名無しさんNGNG
htmlに変換されて保存されてる
読み出すときはhtmlからrdfに変換されてる
0094デフォルトの名無しさんNGNG
それにしてもブックマークのHTMLってなんであんなに汚いんだろう
0095デフォルトの名無しさんNGNG
>>93
サンクス
0096デフォルトの名無しさんNGNG
>>94
パーサが古いからだろうな。
どう考えてもソース公開以前のコードをそのまま使ってる。
0097デフォルトの名無しさんNGNG
Firefoxのタブのコンテキストメニューのオーバーレイってどんな感じでやればいいんでしょう?
0098デフォルトの名無しさんNGNG
スクリプトで動的に編集するしかないんじゃない?
0099デフォルトの名無しさんNGNG
mTabContainerのonclickを上書きするとか?

行儀悪・・・
0100デフォルトの名無しさんNGNG
>>99
popupshowingかpopupshownにイベントリスナーを追加したら?
0101デフォルトの名無しさんNGNG
ページがロードされるたびに、WebページのJavaScriptより先にスクリプトを
実行する方法はありますか?
browserにaddEventListener('load')する方式だと遅すぎるようです。
TbEみたいにメソッド乗っ取りするしかないのでしょうか。
■ このスレッドは過去ログ倉庫に格納されています