1 名前:デフォルトの名無しさん mailto:sage [2006/11/27(月) 20:00:38 ] オラ拡張作る。 XULはXMLベースのUI記述言語です。 Mozilla、Firefox、Thunderbird、Netscape等の Gecko系のソフトウェアために開発されました。 このスレはXUL、JavaScriptで利用できるXPCOM、 拡張の作り方などを主に話しあうスレです。 前スレ Mozillaでプログラミング(XUL) その2 pc8.2ch.net/test/read.cgi/tech/1102172958/ 姉妹スレ Geckoベースのブラウザを作ろう pc5.2ch.net/test/read.cgi/tech/1023546699/l50 参考サイト Mozilla Developer Center developer.mozilla.org/ XULPlanet www.xulplanet.com/ 過去スレ Mozillaでプログラミング(XUL) pc5.2ch.net/test/read.cgi/tech/1019704370/ >>2-50 あたりに関連リンク、近況などがあるかも。
428 名前:デフォルトの名無しさん [2009/11/11(水) 23:24:56 ] ffやthunderbirdとは関係ないStandaloneなアプリをXULで開発しようとする場合に 一番参考になる書籍ってなんでしょう?
429 名前:デフォルトの名無しさん mailto:sage [2009/11/11(水) 23:38:20 ] >>428 >ffやthunderbirdとは関係ない 釣り?文盲?白痴?
430 名前:デフォルトの名無しさん mailto:sage [2009/11/12(木) 01:14:05 ] fxなんて数あるGecko搭載アプリの一つでしかねーぞ。
431 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 04:14:24 ] >>428 和書だとFirefox関連しかないみたいだし、 洋書でもEssential XUL Programmingくらいしか見つからなかった 現状では一番参考とかいうレベルではなく、それくらいしか選択肢無いみたい それよりはXULRunnerで動いてるソフトのソースを見た方が参考になると思う ja.wikipedia.org/wiki/XULRunner の動作するアプリケーション等を参考に >>429 無知は罪じゃないから安心していいよ そもそも>>1 にちゃんと説明は書いてあるんだけどね
432 名前:デフォルトの名無しさん [2010/02/07(日) 19:04:19 ] 質問をさせてください。 Firefoxでロケーションが変わるたびにサイドバーに 表示しているxulコントロールの要素の値を変更させるものを作りたいと思っているのですが、 その設定の方法は window.top.document.getElementById("sidebar-box").getElementById("コントロール名").setAttribute(要素名, 設定する値); で良いのでしょうか?
433 名前:432 [2010/02/07(日) 19:19:55 ] すみません、上記の方法で試してみたところうまく動いてくれませんでした。 正しい方法についてご教授願いたく思います。
434 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 11:45:27 ] >432 サイドバーの内容はサブフレーム扱いだからそれでは動かないと思う そのスクリプトが動いてるのはbrowser.xulの名前空間? それともサイドバー内の名前空間? browser.xulの名前空間なんだったらこう。 document.getElementById("browser").contentDocument.getElementById("myControl").setAttribute("attributeName", "value");
435 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 11:54:49 ] すまん間違えた document.getElementById("sidebar").contentDocument.getElementById("myControl").setAttribute("attributeName", "value");
436 名前:432 [2010/02/09(火) 23:46:16 ] >435 ありがとうございます。 しかし試してみましたが期待した動作をしてくれませんでした。 名前空間についてですが、まだそこまでの理解をしておらず、調べながらになりますが、 <overlay id="sidetempOverlay" xmlns="www.mozilla.org/keymaster/gatekeeper/there.is.only.xul "></overlay> 内にスクリプトがあります。名前空間はこのxmlns要素内の事でよろしかったでしょうか? 連続の質問で大変申し訳ありません。
437 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 00:07:59 ] >>436 その<overlay>は何をオーバーレイしてるの? browser.xul? 別の物?
438 名前:432 [2010/02/10(水) 00:51:45 ] オーバーレイをしているファイル内では以下のように記述しています <?xml version="1.0"?> <overlay id="sidetempOverlay" xmlns="www.mozilla.org/keymaster/gatekeeper/there.is.only.xul "> <script type="application/x-javascript" src="locationchange.js"></script> <menupopup id="viewSidebarMenu"> <menuitem observes="side_with_page" /> </menupopup> <broadcasterset> <broadcaster id="side_with_page" label="SIDEBAR" autoCheck="false" type="checkbox" group="sidebar" sidebartitle="SIDEBAR" sidebarurl="chrome://sidebar/content/side_content.xul" oncommand="toggleSidebar('side_with_page');"/> </broadcasterset> </overlay> [表示]→[サイドバー]に表示するボタンと、 それを押すことで表示されるサイドバーです。 サイドバー内には独自に作ったxulが入るようになっています。 これでbrowser.xulを書き換えていると言うことなのでしょうか。
439 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 20:00:36 ] それなら>435でサイドバー内にアクセス出来ると思うんだけどな。 ↓にもそう書いてあるし。 ttps://developer.mozilla.org/en/Code_snippets/Sidebar#Accessing_the_sidebar_from_a_browser.xul_script 「期待した動作をしない」ってのがどういう状況なのか分からないのでなんとも。 そもそも、ロケーションの変更でサイドバーの内容を書き換えるなら、 サイドバーのスクリプトからtabbrowserにProgress Listenerを追加するのが普通だと思うんだが。 ttps://developer.mozilla.org/ja/Code_snippets/Progress_Listeners
440 名前:439 mailto:sage [2010/02/10(水) 20:12:46 ] あ、ProgressListenersの方のURLはサイドバー関連は書かれてないや。間違って張ってしまった。
441 名前:432 [2010/02/10(水) 23:33:52 ] >サイドバーのスクリプトからtabbrowserにProgress Listenerを追加するのが普通だと思うんだが。 一度そうしようとしたことがあるのですが、 <overlay>内でJavaScriptファイルのインポートを記述した場合、 自動でスクリプトが実行されているのか、リスナーに追加されていたのですが、 <window>内でJavaScriptファイルのインポートを記述した場合、 リスナーに追加されていないようでした。 <window>でonload属性でスクリプトを動かせば良いのかと思い試したのですが、 <window>外にインポートの記述をしたところ、エラーを吐かれてしまいました。 以下がエラー文です 「XML パースエラー: ドキュメント要素の後ろに不正な文字列があります。」 サイドバーのスクリプトからリスナーを追加する方法を教えていただきたいです。 長々と質問を続けて大変申し訳ありません。
442 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 00:06:38 ] <window onload="init();" onunload="uninit();"> <script type="application/x-javascript" src="progress.js"/> </window> で、progress.jsに function init() { top.gBrowser.addProgressListener(〜 って書けばいいと思うんだが。
443 名前:432 [2010/02/11(木) 00:37:03 ] >>442 試してみました、しかしどうも動いてくれません。 ちなみにサイドバーのスクリプト内で document.getElementById("sidebar").contentDocument.getElementById("myControl").setAttribute("attributeName", "value"); を動かしてみたところ、コントロールの要素の値は変更されていませんでした。
444 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 01:07:47 ] いやいやいや、そりゃサイドバーのスクリプトから見たら document.getElementById("sidebar").contentDocument が存在するわけないでしょ。もうすこし冷静になって考えようよ。 あと、「動かない」だけじゃなくて、どこまで出来てて、どこから出来ないのか、 どこで詰まっててどういうエラーが出るのか、ちゃんと自分で把握して説明しないと、 エスパーでもないかぎりアドバイスしようがないよ。
445 名前:432 [2010/02/11(木) 03:10:22 ] 申し訳ありません、確かにその通りでした。 ところで急展開申し訳ないのですが、 現在期待した動き(ロケーションが変わったときにサイドバーのコントロールの要素が変更される) が動きました。 どうやらaddEventListenerをしていなかったのが原因だったようです。
446 名前:432 [2010/02/11(木) 03:14:07 ] JavaScriptのソースは以下のとおりです (locationchange.js) const STATE_START = Components.interfaces.nsIWebProgressListener.STATE_START; const STATE_STOP = Components.interfaces.nsIWebProgressListener.STATE_STOP; var bgipeo_Listener = { QueryInterface: function(aIID){ if (aIID.equals(Components.interfaces.nsIWebProgressListener) || aIID.equals(Components.interfaces.nsISupportsWeakReference) || aIID.equals(Components.interfaces.nsISupports)) return this; throw Components.results.NS_NOINTERFACE; }, onStateChange: function(aWebProgress, aRequest, aFlag, aStatus){ if(aFlag & STATE_START){} if(aFlag & STATE_STOP){} return 0; }, onLocationChange: function(aProgress, aRequest, aURI){ document.getElementById(コントロール名).setAttribute(要素名, value); return 0; },
447 名前:432 [2010/02/11(木) 03:15:04 ] 続き onProgressChange: function() {return 0;}, onStatusChange: function() {return 0;}, onSecurityChange: function() {return 0;}, onLinkIconAvailable: function() {return 0;} } function init(){ top.gBrowser.addProgressListener(bgipeo_Listener, Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT); } function uninit(){ top.gBrowser.removeProgressListener(bgipeo_Listener); } var myExtension = { init: function() { top.gBrowser.addProgressListener(Listener, Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT); }, uninit: function() { top.gBrowser.removeProgressListener(Listener); } }; window.addEventListener("load", function() {myExtension.init()}, false); window.addEventListener("unload", function() {myExtension.uninit()}, false); サイドバー <window onload="bgipeo_init();" onunload="bgipeo_uninit();"> <script type="application/x-javascript" src="locationchange.js" /> </window>
448 名前:432 [2010/02/11(木) 03:20:43 ] 親切にお答えいただき誠にありがとうございました。 また大量の投稿大変申し訳ありませんでした。 次からは皆様のお役に立てればと思います。 では失礼いたします。