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

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

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

Mozillaスレッド M10
http://pc.2ch.net/test/read.cgi/software/1019550671/
0751デフォルトの名無しさんNGNG
>>750
なるほど。ありがとうございます。
メーラー用の拡張の作成は少し先のことになりそう。
0752デフォルトの名無しさんNGNG
XUL特集、らしい。
http://www.unixuser.jp/next.html
0753デフォルトの名無しさんNGNG
XULチュートリアルを勉強している者です。
http://xul-app.hp.infoseek.co.jp/xultu-janit/rdfscript.html
こちらのRDFデータソースの章に書いてあることを試したところ、
ドロップダウンリストに文字列を入力してボタンを押してアプリを再び開くと
ドロップダウンリストの項目がどんどん増えていくのですが、追加されたデータは
どこに保存されているのでしょうか。
「最後に、Flush 関数を使ってデータソースをディスクに書き出す。」とのことですが、
素人の安直な考えでは初めに読み込んだ recents.rdf ファイルへ書き込まれるのだろう
と思ったけど実際に開いてみると違いました。
0754デフォルトの名無しさんNGNG
要素のdatasourceをとってきてそれを直接編集しようとしていますね。
あまり、いいやり方ではないし、少し古いです。
多分、このスクリプトが書かれたころは、
Flush()で、recents.rdfに書き込まれていた、と想像しています。

ま、当世流とはちょっと違う、ということで。
0755753NGNG
よく調べたらプロファイルdirのlocalstore.rdfに保存されていました。
0756デフォルトの名無しさんNGNG
ま、そうだろうね。datasourcesで明示してなくても、rdf:localstoreは、
どの要素でも使用している。
というのは、persist属性とかで、値を保存しておいて、
長さや位置を覚えておくために必要だからだ。
0757デフォルトの名無しさんNGNG
firefox0.9でXULMAKER0.5使おうとしたら起動すら出来ないんだが
誰かやってない?
0758デフォルトの名無しさんNGNG
age
0759デフォルトの名無しさんNGNG
moz2chをインスコしたら、
mozillaのbookmarkが消失したぞ(゚Д゚)ゴルァ
0760plus7 ◆XULQA16CSE NGNG
http://tkm.s31.xrea.com/xulmigemo021.xpi
XUL/Migemoの正規表現を外部から使えるようにしてみました。
var re = window.xulMigemoCore.getRegExp("unko")
てな感じで正規表現オブジェクトを得られます。
もしよろしければお使い下さい。
0761デフォルトの名無しさんNGNG
>>752
買いに行ったらXULは来月号に飛ばされていた。
代わりにwxWidgetsとかいうやつが特集されていた。これはこれでおもしろそうではあるが。
0762デフォルトの名無しさんNGNG
拡張を作る上で、今までは、プログラムフォルダの下にあるchromeに
フォルダをつくって、appname.jarなどに固めずやってたのですが、
新しい仕様でも、extensionsの下にフォルダを置いてできるんですかねぇ?
about="urn:mozilla:extension:file:appname.jar"
のところをいじったら出来そうな気もするんですが・・・。
0763デフォルトの名無しさんNGNG
>>762
>>727
0764デフォルトの名無しさんNGNG
>>761
(´・ω・`)ショボーン
0765デフォルトの名無しさんNGNG
こっちに聞いた方が良いと思い書きます。
mozilla updateに登録ってどうすればいいのですか?

以下とマルチポスト
http://pc5.2ch.net/test/read.cgi/software/1088635005/383
0766デフォルトの名無しさんNGNG
XULチュートリアルのバインディングのサンプルがうまく動きません(バインディングが反映されない)。
http://xul-app.hp.infoseek.co.jp/xultu-janit/introxbl.html
このサンプルに何か問題点ありますでしょうか?

XUL (example.xul):

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://example/skin/example.css" type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<box class="okcancelbuttons"/>
</window>

CSS (example.css):

box.okcancelbuttons {
-moz-binding: url('chrome://example/skin/example.xbl#okcancel');
}

XBL (example.xbl):

<?xml version="1.0"?>
<bindings xmlns="http://www.mozilla.org/xbl"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<binding id="okcancel">
<content>
<xul:button label="OK"/>
<xul:button label="Cancel"/>
</content>
</binding>
</bindings>
0767デフォルトの名無しさんNGNG
>>766
"example"はパッケージとして登録されてる?
0768デフォルトの名無しさんNGNG
>>766
ええ、もちろんです。
installed-chrome.txt :

content,install,url,resource:/chrome/example/content/
skin,install,url,resource:/chrome/example/skin/classic/

ブラウザに直接クロムURLを打ち込めば一応ウィンドウは表示されます。
バインディングが成功すればそこにボタンも出るはずなのですが...
0769デフォルトの名無しさんNGNG
>>765
bugzillaに拡張を登録しろ、ってFAQに書いてあるが?
0770デフォルトの名無しさんNGNG
>>768
色々試してみたところ、ファイル名の拡張子がxblでは動かないようです。
xmlにすれば動きました。
私がこのチュートリアルをやってた頃はxblで問題なかったんですがねぇ。

XULPlanetのリファレンスはわりと頻繁に更新されていますが、
チュートリアルの方はMozilla1.0のころから更新されていないようです。
それをさらに和訳してあるわけですから、例が現実に追いついてないのも
仕方のないことなのでしょう。
0771デフォルトの名無しさんNGNG
>>770
うほほーー!xmlにしたら無事に出来ました!サンクスです。
0772デフォルトの名無しさんNGNG
>>757
こんなんどうでしょうか?
http://forums.mozillazine.org/viewtopic.php?t=96578
0773デフォルトの名無しさんNGNG
ttp://www.mozilla.gr.jp/~kazu/kazude/
これのコピーもっている人くれ
0774デフォルトの名無しさんNGNG
>>773
φ( ゜゜)ノ ゜
ttp://web.archive.org/web/20030625150958/http://www.mozilla.gr.jp/~kazu/kazude/
0775デフォルトの名無しさんNGNG
>>733
が言ってるのはサイトじゃなくてxpiのことじゃない?
0776773NGNG
>>774
xpiダウソできました。
ありがとうございました。
0777デフォルトの名無しさんNGNG
スクロールバーの付いたbox要素などでもマウスホイールが効くようにはできますでしょうか?
0778plus7 ◆XULQA16CSE NGNG
>>777
http://white.sakura.ne.jp/~piro/latest/2004/02.html
かな?
0779デフォルトの名無しさんNGNG
>>778
まさにそれです!しかしかなり難しそうなのであきらめまつ...
0780デフォルトの名無しさんNGNG
>>779
そんな難しくないと思いますよ。
>>766の例の状況で示すと、こんな感じでしょうか。動作確認はしてませんが。

XUL (example.xul):

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://example/common/example.css" type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<box class="scrollbox"/>
</window>


CSS (example.css):

box.scrollbox {
-moz-binding: url('chrome://example/content/example.xml#scrollbox');
}
box.scrollbox scrollbar {
-moz-binding: url('chrome://example/content/example.xml#scrollbar');
}


0781デフォルトの名無しさんNGNG
つづき。

XBL (example.xml):

<?xml version="1.0"?>
<bindings xmlns="http://www.mozilla.org/xbl"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<binding id="scrollbox">
<implementation>
<handler event="DOMMouseScroll"><![CDATA[
var count = event.detail > 0 ? 50 : -50 ;
this.mScrollbar.setAttribute('curpos', Math.min(Math.max(0, Number(this.mScrollbar.getAttribute('curpos'))+count), Number(this.mScrollbar.getAttribute('maxpos'))));
]]></handler>
</implementation>
</binding>
<binding id="scrollbar" extends="chrome://global/content/bindings/scrollbar.xml#scrollbar">
<implementation>
<constructor><![CDATA[
if (navigator.platform.indexOf('Mac') != -1) this.initScrollbar();
this.parentNode.mScrollbar = this;
]]></constructor>
</implementation>
</binding>
</bindings>

TBEの /content/tabextensions/scrollableTabBar.xml も参考にしてみて下さい。
0782デフォルトの名無しさんNGNG
すみません。
<?xml-stylesheet href="chrome://example/common/example.css" type="text/css"?>
じゃなくて
<?xml-stylesheet href="chrome://example/content/example.css" type="text/css"?>
ですね。

あと、水平スクロールバーと垂直スクロールバーのそれぞれについて
処理を振り分けるのも忘れてました。まあその辺は適当に。
0783名無しさん@そうだ選挙に行こうNGNG
もう一つミスが……

<implementation>
<handler event="DOMMouseScroll">(略)</handler>
</implementation>

ここは
<implementation>〜</implementation>
ではなくて
<handlers>〜</handlers>
です。
0784名無しさん@そうだ選挙に行こうNGNG
解説も含めてまとめときました。もしよろしければどうぞ。
ttp://white.sakura.ne.jp/~piro/xul/tips/x0030.html
0785名無しさん@そうだ選挙に行こうNGNG
>>780-784
丁寧にありがとうございます!さっそく今試してみます。
このスレは親切な方が多くて助かります。
0786名無しさん@そうだ選挙に行こうNGNG
window内にiframeがあるようなxulページを表示させると、
windowのonloadイベントが二度発生しますが、これはなぜなんでしょう??
たとえば下のコードを表示させると、alertウィンドウが二度出てきます。
環境:Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040614 Firefox/0.9

<?xml version="1.0"?>

<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" onload="alert('onload');">
<iframe />
</window>
0787名無しさん@そうだ選挙に行こうNGNG
>>786
iframe内のページのonloadイベントがバブリングで伝搬するからですな。
http://www2u.biglobe.ne.jp/~oz-07ams/prog/dom-ref/Events/
0788名無しさん@そうだ選挙に行こうNGNG
プロパゲーションが止められないのって、
実は結構不便な気もするな。

こんな感じでイベントハンドラを書けば済むのだが。
function myOnLoad(event){
 if(event.target.localName=="window")
  alert('onload');
}
0789デフォルトの名無しさんNGNG
イベントバブルで制御できるんでは
0790786NGNG
>>787-789
なるほど、なぞがわかってすっきりしました。
0791デフォルトの名無しさんNGNG
preventBubbleって、そんなに便利でもないんだよなぁ。
一つのイベントに複数のリスナがある時とか。
0792デフォルトの名無しさんNGNG
ローカルに保存されたHTMLファイルを読み込み、パースしてDOMとして利用することは可能でしょうか??

var doc = (new DOMParser()).parseFromString(fileContent, "text/html");
alert(doc.title);

とやってみたのですが、1行目でエラーとなります...
0793デフォルトの名無しさんNGNG
>>792
実はdomparserのtext/htmlモードは未実装なのです。
かわりに、innerHTMLを使ってください。
0794デフォルトの名無しさんNGNG
あるいは、>>650とか。
0795デフォルトの名無しさんNGNG
var URI = "http://jt.mozilla.gr.jp/";
var doc = document.implementation.createDocument('', '', null);
doc.load(URI);
doc.addEventListener('load', docLoaded, false);

function docLoaded() {
alert(doc.title);
}

これでは何も表示されませんですけど、何か間違っているようですね。。
0796デフォルトの名無しさんNGNG
>>795
mozilla 1.6 で試してみたけど…
doc.async = false;
var result = doc.load(URI);
alert(result);
してみると doc.load(URI) が false が返してくるみたいね… なんでだろ??

XUL内に不可視のbrowser要素を配置してそこにloadURI()で読み込んだら
だめかな?
0797デフォルトの名無しさんNGNG
>>795
ありがちなミスだけど、ひょっとして、XULでやってる?
createDocumentのnamespaceを無指定にすると、実行環境に影響されるから、
HTMLDocumentではなく、XULDocumentになって、htmlファイルをロードできない。
0798デフォルトの名無しさんNGNG
>>796
hidden=trueなbrowserに対してloadURIでHTMLをロードさせたら
Type Error: this.docShell has no properties
と怒られました。

>>797
なるほど、確かにXULでやってました。
0799デフォルトの名無しさんNGNG
>>798
hidden="true" (displaynone)だと初期化がされないので注意が必要。
collapsed="true" (visibility:collapse)なら動くはず。
0800デフォルトの名無しさんNGNG
>>799
なるほど、それでうまくいきました。
0801デフォルトの名無しさんNGNG
>>797

>createDocumentのnamespaceを無指定にすると、
ってことは正しい(?)指定をするとXULでもHTMLDocumentが返ってくる
ようになるんでしょうか?
0802デフォルトの名無しさんNGNG
>>801
いろいろ探してみたけど、HTMLDocumentを作るのって意外に難しい。
doctypeを決め打ちしてしまうと本末転倒だから、やっぱ無理かも。
xhtmlならとても簡単なのに、この差は一体…
0803デフォルトの名無しさんNGNG
XULアプリ内で mozilla と firefox を区別する方法ってないですかね??
0804デフォルトの名無しさんNGNG
>>803
browser.jarのあるなしを見るとか、

function browserURI()
{
var handler = Components.classes['@mozilla.org/commandlinehandler/general-startup;1?type=browser'].getService(Components.interfaces.nsICmdLineHandler);
var uri = handler.chromeUrlForTask;
if (uri.charAt(uri.length-1) == '/')
uri = uri.replace(/chrome:\/\/([^\/]+)\/content\//, 'chrome://$1/content/$1.xul');
return uri;
}
でchrome://browser/content/browser.xulが帰ってくるかどうかを調べるとか。
0805デフォルトの名無しさんNGNG
piro氏のTBEはインスコ時に判定しとくって手を使ってるみたいね
0806デフォルトの名無しさんNGNG
インスコ時はbrowser.jarを見て、
インストール後の動作では>804の後者の方法を使ってます。
0807デフォルトの名無しさんNGNG
>>803
firefox 0.9以上なら新しいEM用なのか
about:configのapp:idにFirefoxのGUIDが書き込まれてます
インストール後なら、これを見て判断するというのはどうでしょう?
0808デフォルトの名無しさんNGNG
fileスキームのURIで示されたローカルファイルを削除する方法はありませんか?
たとえばfile:///C:/foo/bar.jpgだったり、file:///home/nanashi/bar.jpgだったり、
OSに依存しない方法があればいいのですが。
0809デフォルトの名無しさんNGNG
jslib使うとかそこからコードをぱくるとか
0810デフォルトの名無しさんNGNG
ってかただaFile.remove(true)でいいっぽい
0811デフォルトの名無しさんNGNG
ファイルのURIからnsIFileは作れないようです。
var aFile = Components.classes['@mozilla.org/file/local;1']
.createInstance(Components.interfaces.nsILocalFile);
aFile.initWithPath("file:///C:/foo/bar.jpg");

で、パスが認識できないと怒られます。
0812デフォルトの名無しさんNGNG
>>811
ttp://white.sakura.ne.jp/~piro/xul/tips/x0011.html
0813デフォルトの名無しさんNGNG
>>812
ああ、まさにそちらに書いてあるとおりのことでした!
ありがとうございました。
0814デフォルトの名無しさんNGNG
で、だれか
http://www.unixuser.jp/magazine/2004/200409.html
買ってないの?
0815デフォルトの名無しさんNGNG
仲村直人って意外な趣味持ってるんだな。
http://www.jbl.or.jp/allstar/200304/member/b09_nakamura.html
0816デフォルトの名無しさんNGNG
見事に同姓同名だな
0817デフォルトの名無しさんNGNG
ttp://nazo.europe.webmatrixhosting.net/mimetype.aspx/newEmFolder?name=newEmFolder.xpi&type=application/x-xpinstall&location=http://nazo.europe.webmatrixhosting.net/ex/newEmFolder.zip
0818デフォルトの名無しさんNGNG
保守
0819デフォルトの名無しさんNGNG
現在フォーカスしているブラウザタブのアイコン(いわゆるfavicon)のURLを得る方法を模索しています。
top.window.document.getElementById("page-proxy-favicon").src
でとりあえずそれらしいものは得られるのですが…
0820デフォルトの名無しさんNGNG
>>819
gBrowser.selectedTab.getAttribute('image')でどうでしょう。
空以外ならfaviconと判断できそうな。
0821819NGNG
>>820
それでばっちりでした。どうもありがとうございました。
0822デフォルトの名無しさんNGNG
a.xulからopenDialog('b.xul')でダイアログを開き、そこでの入力結果をa.xulに返す
というかb.xulでの入力結果をa.xulで受け取る方法はありますでしょうか?

ただの文字列を入力させるだけなら、a.xulでvar input = prompt(...)で入力を受け取れますが、
今回はユーザに入力させたい項目が複数あるという状況であります。
0823デフォルトの名無しさんNGNG
>>822
b.xul から window.opener で a.xul にアクセスできるようだ。

使用例(JavaScript の詳細設定ダイアログ):
http://lxr.mozilla.org/mozilla/source/browser/components/prefwindow/content/pref-advancedscripts.xul#56
0824デフォルトの名無しさんNGNG
>>823
今試してできました。見事に簡単ですね!
0825デフォルトの名無しさんNGNG
>>822
openDialogは4番目以降の引数に任意のものを渡せます。
オブジェクトを渡せば処理結果を得ることもできます。

//a.xul
var obj = {};
window.openDialog('b.xul', '_blank', 'chrome,dialog,modal', obj);
alert(obj.result);

//b.xul
<dialog onaccept="window.arguments[0].result = document.getElemenntById('input').value; window.close()">
<textbox id="input"/>
</dialog>

モーダルダイアログにしないと処理結果を返す前にa.xulの処理が先に進んでしまうので注意。
0826デフォルトの名無しさんNGNG
//a.xul
var input = {};
window.openDialog('b.xul',...);

//b.xul
<dialog onaccept="window.opener.input.hoge = ...">

と書きましたが825さんの書き方もいいですね。
0827デフォルトの名無しさんNGNG
初めまして。
「ブラウジングの際に次ページをポップアップ表示する」という機能を作成しようとしています。
そこで質問なのですが、createElementNS()で作成したウインドウ(例えばAltポップアップのようなもの)の中に
Webページを表示することは可能でしょうか?
Elementをポップアップするより、window.openしちゃったほうがいいのかなぁ・・・
0828デフォルトの名無しさんNGNG
http://patsis.edula.com/extxpi.html
このLink Previewという拡張が似てますが、これはOpen Thumbshotsのサムネイル画像を
表示させているみたいです。ごく一部のサイトしかサムネイルが表示されません。
XUL側でWebページのサムネイル画像を作れたらいいですけど、ちょっと無理そうですね。
0829デフォルトの名無しさんNGNG
>>827,828
<button tooltip="hogetip" label="hoge" />
<tooltip id="hogetip"><iframe src="about:mozilla" /></tooltip>
とやってやれば、別ページをポップアップ表示することは"一応"できるようだが、
サムネイルを作る方法 or ページ表示を縮小する方法を知らないので教えられない。
0830デフォルトの名無しさんNGNG
ttp://multiscroll.mozdev.org/
これの縮小表示機能が参考になるかも
0831デフォルトの名無しさんNGNG
>>828, >>829, >>830
ありがとうございます! 参考にさせていただきます!

>>828の拡張は画像で表示するんですよね。
ポップアップしたページからまたポップアップ……と階層的に表示したいと考えているので確かにそれだと無理そうです。

>>830のようにページ表示を縮小する方向で作ってみることにします。
0832デフォルトの名無しさんNGNG
overlayで存続の要素を削除できますか?
0833デフォルトの名無しさんNGNG
>>832
存続の要素って?
0834デフォルトの名無しさんNGNG
既存の間違い?
0835デフォルトの名無しさんNGNG
>>834
そうです。
結局styleでdisplay:noneにして解決しました。
0836デフォルトの名無しさんNGNG
拡張でstyleを指定するのは、あまりよろしくない。
hiddenプロパティの方がいい。
0837デフォルトの名無しさんNGNG
xul.cssには

*[hidden="true"] { display: none; }

と書いてあるんだけどね。
0838デフォルトの名無しさんNGNG
>>837
そういう問題ではない。
0839デフォルトの名無しさんNGNG
>>836
何故でしょうか?
stylesheetをオーバーレイさせて、ほぼ一意性があるようにセレクタを設定しました。
そこを追加・削除できる拡張とバッティングするはずですが、hiddenプロパティーでも同じはずなので一番いいのはDOMで要素ごと削除だと思いますが、ちょっとめんどくさい…

#日本語って難しい
0840デフォルトの名無しさんNGNG
ほぼ一意性があると思ってるんならそれでいいんじゃない?
DOMで要素を削除するのはやめた方がいい。
0841デフォルトの名無しさんNGNG
0.9対応の拡張を1.0対応にさせるにあたって、変更すべきところは
install.rdfの対応バージョンのところだけでしょうか。
0842デフォルトの名無しさんNGNG
ローカルファイルの変更を監視してイベントを発せさせるようなことはできますか?
0843デフォルトの名無しさんNGNG
>>802
いまのところ、URLからHTMLDocumentオブジェクトを作るのはできないのでしょうか?
browser要素などを隠してdocumentを得るのはダサいですよね。
HTMLDocumentからanchorエレメントを得て先読みするものを作りたいのですが
何かいい方法内でしょうか?
あと、DOMImplementationのcreateDocumentからHTMLDocumentが返ってくることって
あるんですかねぇ。
XMLDocumentだとできるようだが・・・。
0844デフォルトの名無しさんNGNG
>>828-829
サムネイルを作るというかスクリーンキャプチャ撮影のインターフェースならあるようなのですが、
実装はされていないようですね。

http://xulplanet.com/references/xpcomref/ifaces/inIScreenCapturer.html
0845デフォルトの名無しさんNGNG
>>795-802, >>843
nsIDocumentLoaderFactory というのを発見したので、試しに
Components.classes["@mozilla.org/content-viewer-factory/view;1?type=text/html"]
を呼んでみたが、実装されていないのか動かない。
0846845NGNG
Components.classes["@mozilla.org/content/document-loader-factory;1"].createInstance(Components.interfaces.nsIDocumentLoaderFactory)
はきちんと返しているみたいだけれども、
nsIDocumentLoaderFactory::createBlankDocument(in nsILoadGroup, out retval nsISomething);
の引数である nsILoadGroup の扱い方がわからなかった。
0847845NGNG
開きなおって、webShell から作ってしまうことにしたら HTMLDocument が得られるm模様。すなわち:

var webnavi = Components.classes["@mozilla.org/webshell;1"]
.createInstance(Components.interfaces.nsIWebNavigation);
webnavi.loadURI("about:blank", 0, null, null, null);
webnavi.document;

を JavaScript Console に投げ込むと、[object HTMLDocument] が手に入れられた。

>>353
こういうのをまとめる Wiki みたいのがあると便利だな...
0848デフォルトの名無しさんNGNG
>>847
Firefoxまとめサイトにそういうページを作ればいいのでは?
wikiの乱立はやめてほしい
0849デフォルトの名無しさんNGNG
あまり知られてないけど、mozilla.orgにもwikiあるんだよね。
http://wiki.mozilla.org/
0850デフォルトの名無しさんNGNG
>>847
確かに返ってきますね。
でも、loadURIでuriを指定してもダウンロードはしている様だけど
中身が入ってないっぽい?
■ このスレッドは過去ログ倉庫に格納されています