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

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

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

前スレ
Mozillaでプログラミング(XUL)
http://pc5.2ch.net/test/read.cgi/tech/1019704370/
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みたいにメソッド乗っ取りするしかないのでしょうか。
0102デフォルトの名無しさんNGNG
RDFデータソースの操作って難すぃね
0103デフォルトの名無しさんNGNG
http://www.kanzaki.com/book/rdf/
そういえばこんどRDFの解説本が出るみたいですよ
0104デフォルトの名無しさんNGNG
>>102
オブジェクト指向じゃなく手続き型だからね
0105デフォルトの名無しさんNGNG
>>103
理論的な部分はともかく、実際に手でコードを書いて遊んでみたほうが
よくわかると思います。

>>104
個人的には究極のオブジェクト指向だと思う。
DOMが子供だましに思えるほど。
0106デフォルトの名無しさんNGNG
>>105
オブジェクト指向について分かってないだろ

例:
オブジェクト指向→
rdf=new 〜();
rdf.delete();
手続き型→
rdfutil=new 〜()
rdfutil.delete(rdf);
0107デフォルトの名無しさんNGNG
>>106
RDFがわかってないだけでしょ
0108102NGNG
難すぃというか面倒くさいね
0109デフォルトの名無しさんNGNG
RDFはデータ構造。
オブジェクト指向はプログラミングの様式。
手続き型なのは、RDFを扱うためのMozillaの実装。
0110デフォルトの名無しさんNGNG
まあSQLでデータベースをいじるのに比べたら全然難しいよね
0111デフォルトの名無しさんNGNG
addEventListenerの第三引数のuseCaptureってのが意味不明なのですが、
これをtrueにするのとfalseにするのとではどう違ってくるのでしょうか?
0112デフォルトの名無しさんNGNG
ttp://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-capture
ttp://www2u.biglobe.ne.jp/~oz-07ams/prog/dom-ref/Events/
trueだと、リスナーが登録されたノードの内部で起こったイベントについて、そのリスナーが真っ先に呼ばれる。
falseだと、イベントが発生したノードからリスナーが登録されたノードまでイベントが伝搬した後で、マターリとそのリスナーが呼ばれる。
0113デフォルトの名無しさんNGNG
>>112
ありがとうございます。
前スレをのぞいたら、具体例が。
なんとなくわかってきました。

902 :デフォルトの名無しさん :04/11/05 09:17:34
現在、Firefoxの拡張作成をちょこちょこ勉強しているのですが、
Tab,Windowの新規作成時のタイミングを得たいのですが、
試してみたaddEventListener("load",では"更新"にも反応してしまいます。
他に何か方法はありますでしょうか?

903 :デフォルトの名無しさん :04/11/05 15:07:29
>>902
window.addEventListener('load', listener, false)

最後のfalseがポイント
0114デフォルトの名無しさんNGNG
>>111-113
XUL Event Propagation
http://www.mozilla-japan.org/docs/xul/xulnotes/xulnote_events.html
ここに詳しく解説してある
0115デフォルトの名無しさんNGNG
開いてるウィンドウをすべて取得したいのですが、RDFデータソース以外から取得できますか?
0116デフォルトの名無しさんNGNG
>>115
http://www.xulplanet.com/references/xpcomref/ifaces/nsIWindowMediator.html
0117デフォルトの名無しさんNGNG
外部ファイルからテキストを一行づつ読み込むことってできますか?
nsILineInputStream というのがありますが、の readLine() を呼び出すとクラッシュしてしまいます。
0118デフォルトの名無しさんNGNG
XULのウィンドウを最前面ではなく背面に表示したいのですが、
openDialog(URL, "", "alwaysLowered")ではもちろん常に背面に表示されてしまいます。
タスクバーを切り替えてフォーカスしたときや必要なときに最前面に出せるようにはできませんか?
nsIWindowMediatorあたりをさぐってみたのですが、get/setZLevelといったメソッドはなぜか使えないようです。
0119デフォルトの名無しさんNGNG
>>117
クラッシュしない。
>>118
noscriptってちゃんと書いてある。
0120デフォルトの名無しさんNGNG
>>117

Firefox 1.0 で nsILineInputStream は問題なくうごくよ。
ただ、readLine はすごく遅いから 全部読み込んで、String.split("\n")
したほうがいい。
0121117NGNG
当方Firefox1.0(Linux i686)で、やはりクラッシュするするのですが、
>>120 の事情もあるので結局 split("\n");を使うことにしました。ありがとうございます。
0122デフォルトの名無しさんNGNG
>やはりクラッシュする
ぶっちゃけ、あんたの書き方が悪いんでしょ。
他人や機械のせいにするくらいなら、掲示板で質問しない方がいい。
0123デフォルトの名無しさんNGNG
むしろJavaScriptでクラッシュなんてどうやったらできるんだ
0124デフォルトの名無しさんNGNG
「あんたの書き方が悪い」で済ませられない重要なものかもしれないぞ
0125デフォルトの名無しさんNGNG
>>123
できる。俺もThunderbirdがクラッシュした。

@mozilla.org/messengercompose/quotingのQuoteMessage()に渡した
nsIStreamListenerで、onStartRequest()が呼ばれた後にonDataAvailable()が
呼ばれる代わりにクラッシュした。コールバックだと、自分のコードのどこが
まずいのかよく分からん。

ソースからデバッグビルドのThunderbirdを作って、Emacs + GDBで追いかけ
ようかと思ったけど、そうなるとXULの範疇越えてるし。
0126デフォルトの名無しさんNGNG
前から疑問に感じていたのですが、XPCOMインターフェースの接頭辞nsは何の略ですか?
0127デフォルトの名無しさんNGNG
ネットスケープじゃないの。
0128デフォルトの名無しさんNGNG
なぜmzじゃないんですか?
0129デフォルトの名無しさんNGNG
Netscape社が作ったからだろ。おまえの頭はカボチャか?


0130デフォルトの名無しさんNGNG
カボチャじゃありません。ウンコです。
 |人
 |___)
 |__)クスクス
 |∀・ )
  ̄ ̄ ̄ ̄
0131デフォルトの名無しさんNGNG
>>128
mozITXTToHTMLConv や mozIJSSubScriptLoader とか moz から始まるのがあったりする。
0132デフォルトの名無しさんNGNG
任意のWindowのResourceを取得する方法はありますか?
getWindowForResourceはあるのですが、その逆がありません。
0133デフォルトの名無しさんNGNG
>>131
あるにはあるけどかなりの少数派だね。
いまさらnsをmozに付け替えるわけにはいかないから、
nsの意味を捏造した方が早いと思う。
ネームスペースとか。
COMに全然関係ないな…
0134132NGNG
少し質問を変えます。
getWindowForResourceを使うためにWindowのResourceを取得する方法を模索しているのですが、
http://www.xulplanet.com/tutorials/xultu/xpcomex.html
ここを見ると、templateでなぜかIDが割り当てられていて
そのIDからgetWindowForResourceしてるようなのですが
WindowのResourceを取得する方法は他にないのでしょうか?
0135デフォルトの名無しさんNGNG
>>134
なぜリソースが必要なんだ?
0136デフォルトの名無しさんNGNG
>>135
リソースというかgetWindowForResourceで使う引数が欲しいのです。
0137デフォルトの名無しさんNGNG
普通にwindowがあれば要らないんじゃない?
0138デフォルトの名無しさんNGNG
>>137
それが要るプログラムな訳でして・・
とりあえず>>134のURL先のサンプルソースで割り当てられてあるIDを
RDFデータソースから取得できたらいいのですが。
0139デフォルトの名無しさんNGNG
>>138
多分、かなりアホなことやってると思うよ。
とりあえず、>>134を読んでリソースの受け取り方がわからないようじゃ、
RDFとか口走るのはどうかと思う。

つーか、あなたは>>115でしょ?
データソース、本当に要るのか?
ウィンドウのリストがあれば満足なんじゃないのか?
0140デフォルトの名無しさんNGNG
このスレだけでもずいぶんいろんなプロジェクトが進んでるみたいだけど
完成したら晒してもらえるかな?
たとえば以前あった、Googlebarの検索語を全角空白で区切っても
ちゃんと動作するようにしたのなんかぜひ使ってみたいし、
このスレで出た質問がどう生かされたのか見てみたい。
0141デフォルトの名無しさんNGNG
最近このスレに感じの悪いやつが一人紛れ込んでるな。
0142デフォルトの名無しさんNGNG
>>139
はぁ、説明するのまんどくさいんでもういいです。
0143デフォルトの名無しさんNGNG
むしろ、情報を小出しにしてるやしの方がアレだと思う。
まあ、ムキにならずにタチの悪い質問はスルーした方がお互いの為ではあるな。
0144デフォルトの名無しさんNGNG
強制IDまだ~?と言ってみるテスト。

>>140
>いろんなプロジェクトが進んでるみたい
公開されているのがほとんどです。(ScrapBookとかMoz2chとか)
>Googlebarの検索語を全角空白で区切ってもちゃんと動作するようにしたの
是は簡単にできる気がします。

>>134
resourceという変数はDOMの(要素の)ノードが入っていますのでそれを入れればいいかと
0145144NGNG
というかgetWindowForResourceからノード返せといっているのか。
window.document.getElementsByTagName("*")でいいかと
0146デフォルトの名無しさんNGNG
>>145
多分違う。
0147144NGNG
いや、>>132のやりたい事
0148デフォルトの名無しさんNGNG
>resourceという変数はDOMの(要素の)ノードが入っています
そもそもこれが間違い
0149144NGNG
あ…
属性ノードの間違いorz
スマソ
0150デフォルトの名無しさんNGNG
混沌としてきたなぁ。
もしDOMの話をしてるんだったら、属性じゃなくて、要素のID属性だから、
それでいいんだけど、多分、>>132のやりたいことは
コンテナからRDFResouceを直に取り出すことじゃないかな。
0151デフォルトの名無しさんNGNG
んでリファレンス見たら単にID渡せば良いだけという罠
0152デフォルトの名無しさんNGNG
とりあえず、>>134 は勘違いをしている確立が高いと。
何をしたいかがわからないと答えようがないなぁ
0153132NGNG
皆さん、すいません。
IDを渡せばいいってのは分かるんですが、Window Mediatorデータソースから
直接getWindowForResourceの引数に使う値を取り出したいのです。
0154デフォルトの名無しさんNGNG
データソースってとこ良く分からんがWindow MediatorはXPCOMをインスタンス化しただけだから引数に使う値はない。
#ウインドウ一覧が欲しいという事なのかな
#もうちょっと具体的にお願いします。
0155デフォルトの名無しさんNGNG
>>154
>>139-142
0156デフォルトの名無しさんNGNG
>>154
http://xulplanet.com/references/xpcomref/comps/c_rdfdatasource1namewindowmediator.html
このコンポーネントを使用してるのですが

>ウインドウ一覧が欲しいという事なのかな
はい、とりあえずそうです。
0157デフォルトの名無しさんNGNG
んでID付けたくない理由は?
0158デフォルトの名無しさんNGNG
というかRDFの奴が一通り使えるしRDFについて学ぶのが良いと思う。
でも単純なリストではないって事???
0159デフォルトの名無しさんNGNG
データソースから取り出すには、コンテナを初期化して、
Enumeratorを回すのが定石。
でも、ウィンドウのリストがほしいだけだったら、mediatorでも出来る上に
どっちみちSimpleEnumeratorの説明をしなくちゃならんから、
遠回りしてるだけなんだよ。

だから、情報を小出しにすんな、って言われてるでしょ?
0160デフォルトの名無しさんNGNG
>>156
頼むから、getEnumeratorを使ってくれ。
RDFは、もうちょっと知識が身に付いたあとでも遅くないから。
0161デフォルトの名無しさんNGNG
>>115-116
実は2分で結論が出てることを、ここまで引っ張ってきてるわけだ…
0162132NGNG
いや、単純にウィンドウのリストを取得するだけなら分かりますし、できるんですが。
ていうか、説明が難しい上にスレも荒れるので、自力で解決したいと思います・・
今後自分に対するレスはもう不要です、いやほんとに。
0163デフォルトの名無しさんNGNG
やり方 http://wiki.fdiary.net/xul/ に書いてきた
0164デフォルトの名無しさんNGNG
ところで、>>132 さんが使おうとしているgetWindowForResourceって使えます?

Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getWindowForResource("window-1");
エラー: Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getWindowForResource is not a function
0165デフォルトの名無しさんNGNG
>>164
>>66
http://www.xulplanet.com/references/xpcomref/ifaces/nsIWindowDataSource.html
0166デフォルトの名無しさんNGNG
厨房もじらーさんってまだ生きてるのかな?(・∀・)
■ このスレッドは過去ログ倉庫に格納されています