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

Mozillaでプログラミング(XUL)

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001MozillerNGNG
ム板住人のうちMozilla使ってる人は何%くらいかわかりませんが、
Mozilla 1.0 RC1がリリースされ、
XUL 1.0の仕様が一応フリーズしました。
なので、そろそろXULアプリケーションも出始めることでしょうし(希望的観測)
MozillaでのXULプログラミングについて騙りませんか。

Mozillaスレッド M10
http://pc.2ch.net/test/read.cgi/software/1019550671/
0899デフォルトの名無しさんNGNG
スクリプト上でどうやってバイナリを表現しているかにも拠りますが…

バイナリファイルのことだったら、そこのsisのかわりにnsIFileInputStreamを
もってきて、initすればそのまま使えます。

今日はnsIInputStreamの話ばっかりだな…
0900デフォルトの名無しさんNGNG
>>898
ありがとうございます。FireFTPのソースを見てまいりましたが、根本的にやり方が違うようでした。
ソースが非常に長くて大変ですが、じっくりと読みこなそうと思います。

>>899
BookmarksFTPを参考に以下のように書き換えてみましたが、
アップロード先を見ると、0byteのファイルとなっています。
アスキーのときはきちんとアップロードされたのでパーミッションとかには問題ないと思いますが。
以下、コードの抜粋ですみません。

var fis = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream);
this._channel = IO_SERVICE.newChannelFromURI(aURI).QueryInterface(Components.interfaces.nsIUploadChannel);
try {
fis.init(aBinFile, 1, 0, false);
this._channel.setUploadStream(fStream, "", -1);
this._channel.asyncOpen(this, null);
this._callback("send", status);
return true;
} catch(e) {
}
0901デフォルトの名無しさんNGNG
>>898
ありがとうございます。FireFTPのソースを見てまいりましたが、根本的にやり方が違うようでした。
ソースが非常に長くて大変ですが、じっくりと読みこなそうと思います。

>>899
BookmarksFTPを参考に以下のように書き換えてみましたが、
アップロード先を見ると、0byteのファイルとなっています。
アスキーのときはきちんとアップロードされたのでパーミッションとかには問題ないと思いますが。
以下、コードの抜粋ですみません。

var fis = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream);
this._channel = IO_SERVICE.newChannelFromURI(aURI).QueryInterface(Components.interfaces.nsIUploadChannel);
try {
fis.init(aBinFile, 1, 0, false);
this._channel.setUploadStream(fis, "", -1);
this._channel.asyncOpen(this, null);
this._callback("send", status);
return true;
} catch(e) {
}
0902デフォルトの名無しさんNGNG
現在、Firefoxの拡張作成をちょこちょこ勉強しているのですが、
Tab,Windowの新規作成時のタイミングを得たいのですが、
試してみたaddEventListener("load",では"更新"にも反応してしまいます。
他に何か方法はありますでしょうか?
0903デフォルトの名無しさんNGNG
>>902
window.addEventListener('load', listener, false)

最後のfalseがポイント
0904デフォルトの名無しさんNGNG
>>903
遅くなりました、情報ありがとうございました。
とても簡単なことだったんですね……。

とりあえず、ここのLogに残ってるLinkを少しづつ読んでいって
もう少しましな知識をつけたいと思います。
0905デフォルトの名無しさんNGNG
このスレが900まで伸びるとは…
0906デフォルトの名無しさんNGNG
Firefox 1.0記念age
0907デフォルトの名無しさんNGNG
flyson氏もplus7氏もやめちゃって、潰える予感
0908デフォルトの名無しさんNGNG
>plus7氏もやめちゃって
誰が何をやめたんですか?
0909デフォルトの名無しさんNGNG
FIreFoxの検索窓を記述するにはどうしたらいいですか?
0910デフォルトの名無しさんNGNG
chrome://browser/content/browser.xulを見てみたらどうです?
0911デフォルトの名無しさんNGNG
gecko を lisp でコントロールしたいです
0912デフォルトの名無しさんNGNG
>>908
Geckoタブブラウザ Bagel 〜ベーグル〜
http://pc5.2ch.net/test/read.cgi/software/1093876991/
>>911
Geckoベースのブラウザを作ろう。
http://pc5.2ch.net/test/read.cgi/tech/1023546699/
0913デフォルトの名無しさんNGNG
Firefoxの拡張って開発中はどこに置いとけばいいんですか?
XULチュートリアルにあるように /chrome の下に置いて
installed-chrome.txt 書き換えて再起動しても読み込まれてない
みたいなんですが…
chrome URL で直接呼び出すとちゃんと出てくるので
文法エラー等はないはずです。
0914デフォルトの名無しさんNGNG
XULのキャッシュが効いている可能性大では?
about:configからnglayout.debug.disable_xul_cacheをtrueにしてみてください。
0915デフォルトの名無しさんNGNG
>>914
だめでした。何でじゃー

>>856-857に類似の質問があったけど肝心のリンク先が消えてる…
0916デフォルトの名無しさんNGNG
chrome.rdfは削除した?

そのページのキャッシュ:http://www.google.co.jp/search?q=cache:uvlvdJ1gfFQJ:fls.moo.jp/wdiary/200406.php+&hl=ja&lr=lang_ja
0917デフォルトの名無しさんNGNG
あるいは再起動したつもりがプロセスが残ってたりとか。
0918デフォルトの名無しさんNGNG
>>913
素直にinstall.rdfを書いたほうがいい。
jarにしなくてもインストールできるので。
http://kb.mozillazine.org/index.phtml?title=Dev_:_Tips_:_Disable_XUL_cache
0919デフォルトの名無しさんNGNG
XULを自分のプログラムに組み込みたいんだが、指針みたいなものってあるかな。
0920デフォルトの名無しさんNGNG
geckoを使わない限り、XULは面白くもなんともないと思う。
0921デフォルトの名無しさんNGNG
XULプログラミング始めたいのですが
読みやすくてシンプルなExampleのおすすめは何ですか?
私のスキルはC,Python,PHP,です
0922デフォルトの名無しさんNGNG
>>921
Sageとかコードが綺麗なのを参考にするといい。
GrepSidebarはお勧めしない。
0923デフォルトの名無しさんNGNG
>>921
いきなりコード見るよりはとりあえずXULチュートリアルから学んでみてはいかがでしょう?
一部古くて使い物にならない部分もありますが。
http://xul-app.hp.infoseek.co.jp/xultu-janit/

あと、Tourisugari氏のコードもきれいです。
0924921NGNG
>>922ー923
ありがとうございます
さっそく始めてみます
0925921NGNG
元のチュートリアルが結構up-to-dateだったので
こちらを読んでみます。
http://xulplanet.com/tutorials/whyxul.html
0926921NGNG
すいません
こっちでした
http://www.xulplanet.com/tutorials/xultu/
0927デフォルトの名無しさんNGNG
ああ、そうそう、英語でいいならぜひそちらを。
0928913NGNG
>>916
一回削除したはずだったのですが
もう一度削除してやり直したらうまくいきました。
ありがとうございます。
0929デフォルトの名無しさんNGNG
Firefoxの拡張のお作法についてcurrent practiceをまとめたページはないですか?
*.xulとか*.jsは書けたのですが、それをxpiにするにはどういうファイルを
用意するかとか、xpi/jar内部のディレクトリ構成とかについて
ちゃんと書いてあるページが知りたいです。
一応、自分が使ってる拡張のソースを参考に見様見真似でinstall.rdfや
install.jsを書いたのですが。
あと拡張の更新情報のためにwebに載せるRDFファイル(update.rdf?)の書き方も。
0930デフォルトの名無しさんNGNG
>>929
http://www.bengoodger.com/software/mb/extensions/packaging/extensions.html
かなぁ。
もっとちゃんとしたドキュメントがあるかもしれない。
0931デフォルトの名無しさんNGNG
http://www.mozilla.org/projects/firefox/extensions/packaging/extensions.html
は?
0932929NGNG
>>930,931
おお、まさにこれです。ありがとうございます。

サイトマップからも探したのですが見付けられませんでした。
mozilla.orgのweb構造は多分に謎です……
0933デフォルトの名無しさんNGNG
>>932
> mozilla.orgのweb構造は多分に謎です……
禿同
0934デフォルトの名無しさんNGNG
>>929
ttp://www.mozilla.orgを
ttp://www.mozilla-japan.orgに変えると和訳ページに。

ちなみに自分もただいま勉強中です。
やっとこさ、Firefox 0.8系の拡張を1.0でInstall/Uninstallができる様になった
ところで、最近、少しづつ中身を書いております。
自分のやりたいことをGoogleで調べながら書いてますが
だいたい、上記の和訳かXULPlanetかPiro氏のページに飛びますね。
ここ共々お世話になっております。
0935デフォルトの名無しさんNGNG
Mozillaの履歴の情報をIEのWinInetのように
外部から操作することはできますか?
XULアプリからでもかまいません
0936デフォルトの名無しさんNGNG
ttp://www.xulplanet.com/references/xpcomref/xpcomref1.0/nsIGlobalHistory.html
ttp://www.xulplanet.com/references/xpcomref/xpcomref1.0/nsISHistory.html
ttp://www.xulplanet.com/references/xpcomref/xpcomref1.0/nsIBrowserHistory.html
XULアプリならこのあたりで操作できます。
0937デフォルトの名無しさんNGNG
>>935
具体的には
var history = Components.classes["@mozilla.org/browser/global-history;2"].
getService(Components.interfaces.nsIGlobalHistory);
history.removeAllPages(); //← >>936 の nsIGlobalHistory.html参照
のように使う。rdf:history というRDFデータベースとしても利用できたはず。
0938デフォルトの名無しさんNGNG
http://mozdev.org/bugs/show_bug.cgi?id=6514
RSSフィードのLink要素などの中に&や'が含まれていても
デコードすべきところでしてくれないてバグだが、拡張機能Sageだけじゃなく
Firefox1.0のライブブックマークにも同じ症状があるぽいよな…
仮に変換だけ実装しても脆弱性起こしそうだし、これはどう直すべきなんだろう。
自分はXULも何もさっぱりなので手も足も出ないがorz
0939デフォルトの名無しさんNGNG
>>938
本当にそんなバグがあるんだったら、
とりあえず、bugzilla.mozilla.orgの方を探してみた方がいいと思うよ。
0940938NGNG
>>939
そういやそうだったな。
とりあえずライブブックマークの方に該当すると思われるバグはこれ。
https://bugzilla.mozilla.org/show_bug.cgi?id=252147
0941デフォルトの名無しさんNGNG
>>940
そのバグで報告されているリンク先は
&となっているので、まともなxmlじゃないと思う。
0942デフォルトの名無しさんNGNG
あ、やられた…
&ね。
0943デフォルトの名無しさんNGNG
0944デフォルトの名無しさんNGNG
二つのRDFをメモリー上で一緒にするスマートな方法ってありませんか?
0945デフォルトの名無しさんNGNG
一緒にするとは?
0946デフォルトの名無しさんNGNG
合成ってことです。
nsIRDFCompositeDataSourceはnsIRDFDataSourceから作れないようなので
0947デフォルトの名無しさんNGNG
var myCDS = Components.classes['@mozilla.org/rdf/datasource;1?name=composite-datasource'].createInstance(Components.interfaces.nsIRDFCompositeDataSource);
myCDS.AddDataSource(myDS1);
myCDS.AddDataSource(myDS2);
ではダメですか?
0948デフォルトの名無しさんNGNG
どちらかと言うと片方のRDFに別のRDFを合成して、OKを押したら合成後のRDFをflushさせて書き出したいんですよね。
まぁrdfのテンポラリファイルを作るか、すべてのリソースを移動すればいいんですけどね
0949デフォルトの名無しさんNGNG
RDFとして扱わずに単純なXMLとして操作してはどうだろう
0950デフォルトの名無しさんNGNG
うほっ良スレ!
0951デフォルトの名無しさんNGNG
http://xulplanet.com/downloads/rdfds/rdfds.js
の copyAllToDataSource とかかな。
0952デフォルトの名無しさんNGNG
>>949
それは昔やってました。
thunderbirdでdocument.evaluateが使えなくRDF化している最中でつまずきました

>>951
それを使えばできそうですね。
ありがとうございます
#というかこんな物があったなんてorz
#独自でラッピング(?)してました。
0953デフォルトの名無しさんNGNG
バリバリにグローバルつかってるのは、
overlayした時に不便だから、結局自分で手書きした方が楽なんだよねぇ。
0954デフォルトの名無しさんNGNG
もう一個質問いいですか?
Seqが削除できません。
Unassertで関連を切っても残ってしまいます。
何か方法ありませんか?
#それともこっちのミスかなぁ
0955デフォルトの名無しさんNGNG
>>954
var ds = RDFContainer.DataSource;
var node = RDFContainer.Resource;

var keys = ds.ArcLabelsOut(node),
key,
value;
while (keys.hasMoreElements())
{
try {
key = keys.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
value = ds.GetTarget(node, key, true);
ds.Unassert(node, key, value);
}
catch(e) {
}
}
みたいにすれば消えるはず
0956デフォルトの名無しさんNGNG
それしてるんですよね。
Seqの中身をすべて削除してunassertしても空のどことも関連がないSeqが残ってしまいます。
#やっぱコードのミスかなぁ
0957デフォルトの名無しさんNGNG
>>956
スクリプトのどこかにミスがあって二重にassertしてるのでは?
>>955の
value = ds.GetTarget(node, key, true);
の代わりに、GetTargetsで全てのノードを取り出してunassertすれば
より確実だと思うけど、野暮ったいから自分のスクリプトではやってない。
0958デフォルトの名無しさんNGNG
assertはしてないです。
元からあるRDFを関数再起呼び出しでunassertするだけなんですが…
GetTargetsでも一つしか帰ってこない気がします。
もしかして削除の順番とかが関係するんでしょうか?
0959デフォルトの名無しさんNGNG
>>955 とか idl 見て今気づいたんだけど、Unassert って引数 3 個だったんだ。

http://piro.sakura.ne.jp/xul/tips/x0025.html
を見てRDFの操作方法を憶えたから、Unassert(aResource,aProperty,aTarget,true);と使ってしまっている。
0960デフォルトの名無しさんNGNG
>>959
え…
本当ですね。
でも最後のboolがないだけなので最後をtrueとしても問題はないですね。
0961デフォルトの名無しさんNGNG
>>959
コピペして書いたので間違えてましたorz
0962デフォルトの名無しさんNGNG
Firefoxのブックマークサイドバーにツールチップを表示する拡張を
作ろうとしているのですが、デフォルトで表示される表示領域より
ツールチップのラベルが長いときのツールチップを消せません。
デフォルトのツールチップはどこで表示されているのでしょうか?
0963デフォルトの名無しさんNGNG
訂正
×ツールチップのラベルが→○ブックマークのラベルが
0964デフォルトの名無しさんNGNG
https://bugzilla.mozilla.org/show_bug.cgi?id=32157
消すのはちょいと難しそう
0965デフォルトの名無しさんNGNG
む、ネイティブ側にあるのか
しかもそのコードが悪さをしてるのかtreecellにtooltip設定しても
まともに動作しない…
0966955NGNG
>>960
問題ないの? じゃあ直さないでいいや。

0967966NGNG
955じゃなくて>>959だった。
0968デフォルトの名無しさんNGNG
XULWiki 発見!
http://wiki.fdiary.net/xul/
0969デフォルトの名無しさんNGNG
GJ
0970デフォルトの名無しさんNGNG
Thunderbirdの返信ヘッダカスタマイズ拡張を作ろうと思ったんだけど、
このコードでThunderbirdが即死する。
XULのプログラムは初めてなんですが、どこが間違ってるんでしょうか…

var quoteListener = {
onStartRequest: function(request , context) {
},

onStopRequest: function(request, context , statusCode) {
},

onDataAvailable: function(request, context, inputStream, offset, count) {
},

QueryInterface: function(iid) {
if (iid.equals(Components.interfaces.nsISupports) ||
iid.equals(Components.interfaces.nsIRequestObserver) ||
iid.equals(Components.interfaces.nsIStreamListener))
return this;

throw Components.results.NS_NOINTERFACE;
}
};

var msgQuote = Components.classes['@mozilla.org/messengercompose/quoting;1'].createInstance().QueryInterface(Components.interfaces.nsIMsgQuote);

if (msgQuote)
msgQuote.QuoteMessage(params.originalMsgURI, false, quoteListener, null, false);
0971デフォルトの名無しさんNGNG
.createInstance().QueryInterface(Components.interfaces.nsIMsgQuote);
->
.createInstance(Components.interfaces.nsIMsgQuote);
0972デフォルトの名無しさんNGNG
つーか、どこで死ぬのかわからないってことは、
これからも手探りでやるつもり?
自分には無理だ…
0973デフォルトの名無しさんNGNG
>>971
ありがとう。でも結果同じでやっぱり死んじゃう。・゚・(ノ∀`)・゚・。

QuoteMessage()の呼出し後に、onStartRequest()は実行されてるけど、
onDataAvailable()が実行されずにアプリケーションエラーで死亡(´・ω・`)

XULでプログラムしてる人って、xulplanet.comとMozillaのソースコード
だけで何とかなってるの?
0974デフォルトの名無しさんNGNG
>>973
あ、それは自分も経験がある。
引数のinputStreamをうそでも触っておいた方がいいみたい。

>xulplanet.comとMozillaのソースコードだけ
まあ、ない袖は振れないってやつですね。
0975デフォルトの名無しさんNGNG
Firefoxの拡張作る際の手順だけ誰か教えて下さい('A`)
0976デフォルトの名無しさんNGNG
>>974
>引数のinputStreamをうそでも触っておいた方がいいみたい。

ぜひ、詳しく(`・ω・´)
0977デフォルトの名無しさんNGNG
>>975
http://www.mozilla.gr.jp/~kazhik/xul/tutorial.html
とか見てみたらどうでしょう。5のインストーラのとこはもはや古くてダメですが。
0978デフォルトの名無しさんNGNG
>>977
ありがとうございます。
そのページはすでに、すべて読みました。
私がやりたいのはFirefoxにメニュー項目を追加したりする、Firefoxの拡張を作る際の手順です。すんません('A`)

0979デフォルトの名無しさんNGNG
そういった親切なリファレンスはないので、
似たようなことをやってる拡張を探して中身を見るのがてっとりばやいのでは?
0980デフォルトの名無しさんNGNG
やっぱりそうですよね。どうもありがとうございました('A...
0981デフォルトの名無しさんNGNG
>>980
あなたが親切なリファレンスを書くとみんなが幸せになれる
0982デフォルトの名無しさんNGNG
>>981
今私もいつかそういう手順を説明した文章を書こうかなと思ってたところです。('...
0983975NGNG
ここがなかなか参考になりそうな予感がします。
http://www.mozilla-japan.org/docs/tutorials/tinderstatus/
0984デフォルトの名無しさんNGNG
RDFの個々の要素についての資料が全然見つからないんですが、
どこかにありますか?
0985デフォルトの名無しさんNGNG
個々の要素とは?
0986デフォルトの名無しさんNGNG
たとえば、他の人が書いたコードを読んでいて、

document.getElementById("messagepane").contentDocument;
document.getElementById("statusbar-icon");

とかあった場合に、messagepaneやstatusbar-iconが何なのか、
ググっても全然見つかりません。
0987デフォルトの名無しさんNGNG
RDFではなくXULではないでしょうか。
XULを見てそのidを探してみてください。
0988デフォルトの名無しさんNGNG
ありがとうございます。XULの中にありました。
0989(盗´ー`盗)<こんばんは、安倍ぬすみだべ。NGNG
           ___
         | 安 |
         | 倍 |    チーン…
         | ぬ |
         | す |         
         | み |
      ,,,.   | 之 |  ,'"';,
    、''゙゙;、).  | 墓 | 、''゙゙;、),、
     ゙''!リ'' i二二二二!゙''l!リ'''゙
     ‖  `i二二二!´ ‖
     昌 |: ̄ ̄ ̄ ̄:| 昌
    | ̄:|_|;;;l"二二゙゙l;;|_| ̄:|
    |  :|::::::| |;;;;;;;;;;| |::::|  :|
    |  :|::::::|┌─┐|::::|  :|
 ./゙゙└‐┴ ┴l,,,,,,,,,,l┴┴‐┘゙゙゙゙\

0990デフォルトの名無しさんNGNG
某拡張のセキュリティホール見ておもったんですが
システムアクセスの権限を放棄するようなことはできないのでしょうか。
>>659にそれっぽいことが書いてるんですが肝心のプロパティやメソッドは
スクリプトからアクセスできないものばかり…
0991デフォルトの名無しさんNGNG
XULといえば

アフリカの、ジンバブエを首都に持つかつての勇猛な民族ズールー族を思い出す。
現在では国名もジンバブエ?



0992デフォルトの名無しさんNGNG
XULってエックスユーエルって読むんじゃねーのかよ!ヽ(`Д´)ノ
0993デフォルトの名無しさんNGNG
XULの読みはズールじゃなくて、クスールだろ?
でも、Xylitolはキシリトールじゃなくて、ザイリトールだ。
0994デフォルトの名無しさんNGNG
↓次スレたのむ
0995デフォルトの名無しさんNGNG
↑テンプレ頼む
0996デフォルトの名無しさんNGNG
責任の擦り付け合い乙
0997デフォルトの名無しさんNGNG
テンプレ必要か?
0998デフォルトの名無しさんNGNG
んじゃ俺がテンプレなしで立てるぞ
レス数が950を超えています。1000を超えると書き込みができなくなります。