トップページ⇒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/
0703デフォルトの名無しさんNGNG
FireFox とか Thunderbird とか結構重いように感じるんだけど(非力なマシンなので)、
XUL で作ったアプリも、ある程度の重量感は覚悟する必要があるのでしょうか?
0704デフォルトの名無しさんNGNG
>703
モノに拠ります。
XPCOMをロードして使うようなタイプのアプリは速いです。
逆にfor文で100万回まわすようなスクリプトを書けば、
重くなります。
インタープリターなので当然ですね。
0705デフォルトの名無しさんNGNG
>>702
XULに関係ない話につっこんで悪いんだけど
parse = 構文解析
っていう翻訳はコンパイラの教科書なんかで昔っから使われているから
日本で計算機科学系の学科に居た人はみんなそう訳すんだと思う…

で,parseに「読み込む」っていう意味が加味されているっていうけど
コンパイラの教科書的には,
【字句解析】→【構文解析】→【意味解析】→【最適化】→【コード生成】
とフェーズを分けて教えるんで「読み込み」は 構文解析器(parser)の
仕事とは考えない傾向がある気がする…
0706デフォルトの名無しさんNGNG
>>704
XUL 分かってなかったです。すまそ。
C からも使える物と思ってた。
0707デフォルトの名無しさんNGNG
>>704
Cからも使えますよ。
Mozilla.orgにも、サンプルコードくらいはあったと思います。
ただ、コンパイルすると、当然プラットフォーム依存になります。
単純にUIがほしいのなら、それとトレードオフで得る速度は釣り合いません。

MFCやGTKのリソースファイルも、
UIの部分はテキストで箇条書き(?)にしてあるだけですよね。
アセンブリングの恩恵は、ほとんどないと思います。

処理が重いなら、スクリプトをC++に移植する、
という手がありますがね。
0708デフォルトの名無しさんNGNG
linuxでアンチエイリアスしないにはどうすればいいんですか?
0709デフォルトの名無しさんNGNG
linuxのアンチエイリアスってxulネタなんでしょうか?
0710デフォルトの名無しさんNGNG
>>704
タブブラウザ拡張も XPCOM/C++ で書き直すと速くなるんだろうなぁ...
0711デフォルトの名無しさんNGNG
>>710
タブ拡が遅いですと?
0712デフォルトの名無しさんNGNG
>>710
全部書き直さなくても、パッチとしてマージするだけでもいくらか速くなると思う。
0713デフォルトの名無しさんNGNG
タブといえば、
Option to determine how other applications open new windows
http://bugzilla.mozilla.org/show_bug.cgi?id=172962
のターゲットマイルストーンがfirefox1.0betaになってますね。
どうやら、本気で実装されそうです。
0714デフォルトの名無しさんNGNG
どうでもいいけど、「呉下の阿蒙に非ず」だけ浮いてるよね。
0715デフォルトの名無しさんNGNG
誤爆か?
0716デフォルトの名無しさんNGNG
Fxの新しいエクステンションマネージャーでは、
32*32のアイコンが指定できるので、
某狐女のトレードマークを世界に向けて発信しようと思ったのですが、
なんか、お下品な連想をしてしまったのでやめました。

ttp://cgi29.plala.or.jp/~mozzarel/addon/aviary/externalapp/icon.png
なんというか、角度も重要なのかなぁ。
0717デフォルトの名無しさんNGNG
基本的なことなんだけど、XULのGUIライブラリって
GTKをラッピングしてるの?
0718デフォルトの名無しさんNGNG
>>717
まあ、100パーセントそうだとは言えないけど、
gtkが使える環境ならそう言って差し支えない程度には使ってるな。
0719デフォルトの名無しさんNGNG
xulから呼び出す外部のJavaScriptファイルに日本語を使いたいとき、
文字コードはどうすべきですか?UTF-8など色々試しましたがどれも化けます。

それともlocaleを使うべきなんでしょうか。
0720デフォルトの名無しさんNGNG
>>719
ファイル名はシステムの文字コードに依存するのでは?
WindowsならShift_JISかUTF-8でしょうか。
うまくいかないのはUConvでの文字コードの変換に失敗しているからではないかと予想。
0721デフォルトの名無しさんNGNG
ファイル名ではなく「ファイル中に」です。
つまり、alert("こんにちは");とかやると文字化けしてウィンドウが表示されます。
0722デフォルトの名無しさんNGNG
>>721
\u3053\u3093\u306b\u3061\u306f
みたいにUnicodeエスケープするしかないかも知れない。
0723デフォルトの名無しさんNGNG
それは面倒ですね。
やはり開発はすべて英語でやって、後からlocaleを付け加えるのが常識的なのでしょうか?
0724デフォルトの名無しさんNGNG
alert("こんにちは")にするなら、UTF-8じゃなくて、UTF-16の方がいい。
でもそうすると、script自体がパースされないだろうから、
クォーテーションの中だけUTF-16という
変則的な文字コードにしなきゃいけない。

結局、localeを追加した方が安上がりなのよ。
0725デフォルトの名無しさんNGNG
なるほど。了解しました。
詳しく教えていただいて、どうもありがとうございました。
0726ヽ(゚∀゚)メ(゚∀゚)ノNGNG
Moz2chのバヤイ、js自体はEUCで統一してるですが、表示すべき文字列を
ハードコーディングしないでlocaleを使用するようにしてるです。
但し、テストコードのような物だといちいちlocaleを書くのがめんどいという
後ろ向きな理由ですが、EUCで文字列を書いてnsIScriptableUnicodeConverter
を使ってEUC→UNICODEしてから表示するようにしてるです。
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/moz2ch/moz2chfirefox/content/moz2ch/charset.js?rev=1.2&content-type=text/vnd.viewcvs-markup
この辺参考にしてくださいです
0727デフォルトの名無しさんNGNG
Firefoxにjarファイルを使わない拡張を
新EMでインストール/アンインストールするパッチを書いてみました。
ttp://cgi29.plala.or.jp/~mozzarel/addon/aviary/FolderExtForNewEM/

0.9の場合、componentsフォルダに入っているnsExtensionManager.jsを
ttp://cgi29.plala.or.jp/~mozzarel/addon/aviary/FolderExtForNewEM/nsExtensionManager.js
と差し替えれば、ちゃんと動くはずです。
ナイトリーに使うのであれば、diff.txtをソースにあててください。

ただ、このバグがfixされた方がいいかどうかは微妙ですね。
もちろん、出来るにこした事はない、とは思いますが、
拡張やテーマを自分で書かない限り不要(いわゆるbloated)な気もします。
0728デフォルトの名無しさんNGNG
今日のチェックインみてたら、こんなバグがありました。

_contentのかわりにcontentを使いましょう
http://bugzilla.mozilla.org/show_bug.cgi?id=240947
0729デフォルトの名無しさんNGNG
もうお気づきかと思いますけど、http://update.mozilla.org/が稼働していますね。
特に何もしていませんが、私の拡張も(なぜか)2つだけ入っています。
新EM対応版を公表(?)した時期に関係がありそうです。
勝手にアップデートしてくれるのなら楽でいいや、
と思っていたのですが、どうやら初回サービスのみのようです。
更新しても、反映してくれません。

うそくさいダウンロード数が少しづつ増えるのをみるのは楽しいですが、
コメントに反論できないのがちょっと。
ちなみに、私の周囲では
"Must Have!"という、おばかなフレーズが流行っています。
0730デフォルトの名無しさんNGNG
Mozilla 1.7のダウンロードマネージャがCtrl+Wで閉じれないのや、
メーラーでアカウントを選択しているとスペースキーやNで次の未読に
移動できないのが不満で、comm.jarやmessenger.jarを直接書き換えて
目的を達成したんだけど、こういうのもxpiで実現可能?

xpiさっぱり分からん。
0731730NGNG
ちなみにダウンロードマネージャの方はこんな感じ。

--- comm/content/communicator/downloadmanager/downloadmanager.xul2003-10-22 00:35:56.000000000 +0900
+++ comm/content/communicator/downloadmanager/downloadmanager.xul2004-06-26 10:33:30.000000000 +0900
@@ -27,9 +27,13 @@

<?xml-stylesheet href="chrome://communicator/skin/"?>

+<?xul-overlay href="chrome://communicator/content/utilityOverlay.xul"?>
+
<!DOCTYPE window [
<!ENTITY % downloadManagerDTD SYSTEM "chrome://communicator/locale/downloadmanager/downloadmanager.dtd">
%downloadManagerDTD;
+<!ENTITY % utilDTD SYSTEM "chrome://communicator/locale/utilityOverlay.dtd" >
+%utilDTD;
<!ENTITY % downloadProgressDTD SYSTEM "chrome://global/locale/nsProgressDialog.dtd" >
%downloadProgressDTD;
]>
0732デフォルトの名無しさんNGNG
>>731
可能です。
空の拡張をつくって、contents.rdfで
chrome://communicator/content/utilityOverlay.xulをoverlayしてやればいいのです。

ただ、ロケールはoverlayのdoctypeに完全に依存するので、
utilityOverlayにdoctypeがなかったら、
utilityOverlayを手元にコピーしてdoctypeを追加したものを
あらためてoverlayした方が安全かもしれません。
0733デフォルトの名無しさんNGNG
あ、今みてみたら、ばっちりはいってますね。
http://lxr.mozilla.org/mozilla/source/xpfe/communicator/resources/content/utilityOverlay.xul
0734730NGNG
まいったな。せっかく教えてもらったのにさっぱり分かりませぬ。
一応XULチュートリアルの日本語訳も読んでいるが、分量が多くて
どこが該当するのかも分かりません。参考になりそうな拡張ってありますか?
それはともかく、xpiで実現可能というのが分かったのはありがたいです。
0735デフォルトの名無しさんNGNG
「Ctrl+何々でほげほげできるようにします。」系の拡張を
Firefox Help 日本語版あたりで探してみると良いかも。
やり方はそのままSuiteにフィードバックできるので。
0736デフォルトの名無しさんNGNG
>>735
thanx. 動きますた。

*contents.rdf
<?xml version="1.0"?>

<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns:chrome="http://www.mozilla.org/rdf/chrome#">

  <RDF:Seq about="urn:mozilla:package:root">
    <RDF:li resource="urn:mozilla:package:dmclose"/>
  </RDF:Seq>

  <RDF:Description about="urn:mozilla:package:dmclose"
                  chrome:displayName="dmclose Extensions"
                  chrome:author=""
                  chrome:authorURL=""
                  chrome:name="dmclose"
                  chrome:extension="true"
                  chrome:description="dmclose">
  </RDF:Description>

  <!-- overlay information -->
  <RDF:Seq about="urn:mozilla:overlays">
    <RDF:li resource="chrome://communicator/content/downloadmanager/downloadmanager.xul"/>
  </RDF:Seq>

  <RDF:Seq about="chrome://communicator/content/downloadmanager/downloadmanager.xul">
    <RDF:li>chrome://dmclose/content/dmcloseOverlay.xul</RDF:li>
  </RDF:Seq>

</RDF:RDF>
0737デフォルトの名無しさんNGNG
*dmcloseOverlay.xul
<?xml version="1.0"?>

<?xml-stylesheet href="chrome://communicator/skin/"?>

<?xul-overlay href="chrome://communicator/content/utilityOverlay.xul"?>

<!DOCTYPE window [
<!ENTITY % utilityDTD SYSTEM "chrome://communicator/locale/utilityOverlay.dtd">
%utilityDTD;
]>

<window id="downloadManager">
</window>
0738デフォルトの名無しさんNGNG
なんか変なところありますか? さて、あとはインストーラか。

メーラーの方は、mail3PaneWindowCommands.js, mailWindowOverlay.js, mailWindowOverlay.js を
書き換えて動作を変更しているのですが、こちらは実現できますかね。
一部の関数のみをxpiで差し替えて動作させるようなことはできますか。
それともoncommand=で呼び出される関数から変更した関数に至るまでの部分を
すべてコピーする必要があったりしますか。
0739デフォルトの名無しさんNGNG
これでいいのですが、私が732-733で言いたかったのは、
直接utilityOverlay.xulをoverlayしてみては?ということです。

お分かりかと思いますが、overlayには2通りの方法があります。
ひとつは、「xulに直接<?xul-overlay?>を埋め込む」やりかたで、
もうひとつは「パッケージをインストールする」ことです。

結論から言いますと、この種の拡張(?)ではxulファイルが一切不要です。
0740デフォルトの名無しさんNGNG
>一部の関数のみをxpiで差し替えて動作させるようなことはできますか
できます。
javascriptの面白い点は、関数といえども、オブジェクトのひとつに過ぎない、
と言う点です。
よって、代入できてしまうのです。

値は他の関数でもいいのですが、
名前空間を不必要に汚すよりは、
関数リテラルを代入するほうが望ましい、と思われます。
0741デフォルトの名無しさんNGNG
あっ、こうすればいいのか。
  <RDF:Seq about="urn:mozilla:overlays">
    <RDF:li resource="chrome://communicator/content/downloadmanager/downloadmanager.xul"/>
  </RDF:Seq>

  <RDF:Seq about="chrome://communicator/content/downloadmanager/downloadmanager.xul">
    <RDF:li>chrome://communicator/content/utilityOverlay.xul</RDF:li>
  </RDF:Seq>

>お分かりかと思いますが、overlayには2通りの方法があります。
すんません。よく分かっていません。
0742デフォルトの名無しさんNGNG
>>741
そうです。そういうことです。

>よく分かってない
>>736,>>737では両方使っていたんですよ。
utilityOverlay.xulを736にoverlayして、
736をdowloadmanger.xulにoverlayしていたわけですよね。
>>741は一回しか使わなくて済んでいます。
当然741の方がお薦めです。
0743デフォルトの名無しさんNGNG
http://www.xulplanet.com/tutorials/xulapp/overlays.htmlを見ながら読み直して
ようやく分かってきました。

さて、次は関数の差し替え方法か。
0744デフォルトの名無しさんNGNG
>>743
そんなに難しい事じゃないですよ。
例えば openURI() を乗っ取るなら

window.openURI = function(aURI, aReferrer) {
// hogehoge
}

と書くだけでもOK。
内部で元の関数の機能を呼び出したいなら

var originalOpenURI = window.openURI;
window.openURI = function(aURI, aReferrer) {
// hogehoge
originalOpenURI(aURI, aReferrer);
// foobar
}

という具合です。
元の関数を保持しておくオブジェクトの名前が他とかぶると
いけないからということで、後者についてはいくつかやり方があります。
上は一番単純な例。
0745デフォルトの名無しさんNGNG
メーラーの方はちょっと置いといて、NN4みたいにBackSpaceで上方向へ
スクロールするようにする拡張を作ってみました。上の方法でばっちり動きました。
せっかくですので下の方法についてもう少し解説していただけるとうれしいです。
0746デフォルトの名無しさんNGNG
解説っていっても見たまんまなんですけどね。
>>774後半の例は以下のような内容です。

1. 関数オブジェクト "(window.)openURI" の内容である関数を参照するエイリアスを
  "originalOpenURI" という名前で作成。
2. "(window.)openURI"というエイリアスの参照先として新しい匿名関数を定義する。
3. 省略
4. "originalOpenURI"のエイリアスで参照している関数を実行。
5〜6. 省略

つまり

window.openURI => "function openURI()"

となっていたのを

originalOpenURI => "function openURI()"
window.openURI => "function()"(匿名関数)

に変更するということ。
0747デフォルトの名無しさんNGNG
NortonのAntiVirusかInternetSecurityかどっちのはたらきか知りませんが、
ポップアップ抑止の機能を導入すると、閲覧するWebページの先頭に


var SymRealWinOpen = window.open;

function SymWinOpen(url, name, attributes)
{
return (new Object());
}

window.open = SymWinOpen;


こんな感じのJavaScriptを挿入してきます。
やってることはこれと一緒です。
0748デフォルトの名無しさんNGNG
746はエイリアスとはちょっと違うと思う。
jsにとってのオブジェクトは実体そのものだからね。
本等にエイリアスなんだったら、名前解決が元のままのはずだしね。
0749デフォルトの名無しさんNGNG
>>746
えー、すんません、そういうことではなくて、

>元の関数を保持しておくオブジェクトの名前が他とかぶると
>いけないからということで、

の、回避方法はどういうのがあるのかなーということです。
0750デフォルトの名無しさんNGNG
>>749
その1。一意な名前の変数にする。
名前空間URIのようにすればほぼ確実。

window['http://hoge/fuga:openURI'] = window.openURI;
window.openURI = function(uri, ref) {
// hoge
window['http://hoge/fuga:openURI'](uri, ref);
// fuga
}


その2。クロージャを使う。

function init() {
var originalFunc = window.loadURI;
window.loadURI = function(uri, ref) {
//hove
originalFunc(uri, ref);
//fuga
}
}
init();

この例でいうinit()の部分さえ名前がかぶらなければ、
変数originalFuncは関数外部からはアクセス不可能なので
破壊される恐れもない。
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 を区別する方法ってないですかね??
■ このスレッドは過去ログ倉庫に格納されています