<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<page id="app-window" title="" width="100%" height="100%" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<iframe flex="1" id="mainFrame" type="content" src="http://www.google.co.jp/"/><!-- 例としてGoogleを用いています -->
<script type="text/javascript"><![CDATA[
const VAL = "test";
var p = document.getElementById("app-window");
var f = document.getElementById("mainFrame");
f.addEventListener("load", function () {
p.setAttribute("title", f.contentDocument.title); // titleを設定する
alert(f.contentWindow.google.toSource()); // ページ中の任意の値を取得する
f.contentWindow.test = VAL; // 任意の値をページ中に設定する
}, false);
]]></script>
</page>
簡単に言えば、セキュリティーの緩いGreasemonkeyをXUL上で行いたいということになると思います。Firefox3.5で動けば問題ないです。
以下のサンプルで動きました。(Firefox3.5.2)
※iframe内の値を取得・設定するにはセキュリティーの制限をなくす必要があるので、XULファイルをchromeドキュメント内に置いてください。
chromeドキュメント内に置く方法:
下記ページの<chrome URIについて>の部分を見てください。
Firefoxからの実行とXULRunnerからの実行の共存 - MEMO:はてな支店
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml" title="" id="app-window"> <browser flex="1" src="http://www.google.co.jp/" type="content-primary" id="mainFrame" /> <script type="application/x-javascript"><![CDATA[ const VAL="test"; var page=document.getElementById("app-window"); var frame=document.getElementById("mainFrame"); frame.addEventListener("load",function(){ var win=frame.contentWindow.wrappedJSObject, //mainFrameのwindowオブジェクト。contentWindowのままだとXPCNativeWrapperに包まれていて変数の設定等ができないので注意。 doc=frame.contentDocument.wrappedJSObject; //mainFrameのdocumentオブジェクト。 page.setAttribute("title",doc.title); alert(win.google.toSource()); win.test=VAL; },false); ]]></script> </page>
<page> 要素を使っているのが敗因ではないでしょうか?
Similar to a window , except it should be used for XUL files that are to be loaded into an iframe .
<iframe> の中に読み込まれる XUL ファイルでないと <page> は使えないような。
<page> 要素ではなく <window> 要素なら、中においた <iframe> 中に任意の URL を読み込める筈です。
<window id="app-window" title="" width="100%" height="100%" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <iframe flex="1" id="mainFrame" type="content" src="http://www.google.co.jp/"/> </window>
ただ、<iframe> 中に読み込んだ文書からデータを取り出したりしてあれこれする、という部分は経験がないと言うか、うまくいっていない部分なので、
(読み込んだページをスクロールダウンしたいんですが)
お力にはなれないかもしれません。
コメント欄を開けておいていただけるとありがたいのですが。
page要素でも<iframe>に任意のURLを読むところまではできますね。
質問の確認になりますが、<iframe>中に読み込んだ文書にあれこれしたいというが今回の質問です。
XULに詳しい方をあまり知らないので、力になってもらえるとうれしいです。というわけで、コメント欄を空けておきました。
以下のサンプルで動きました。(Firefox3.5.2)
※iframe内の値を取得・設定するにはセキュリティーの制限をなくす必要があるので、XULファイルをchromeドキュメント内に置いてください。
chromeドキュメント内に置く方法:
下記ページの<chrome URIについて>の部分を見てください。
Firefoxからの実行とXULRunnerからの実行の共存 - MEMO:はてな支店
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml" title="" id="app-window"> <browser flex="1" src="http://www.google.co.jp/" type="content-primary" id="mainFrame" /> <script type="application/x-javascript"><![CDATA[ const VAL="test"; var page=document.getElementById("app-window"); var frame=document.getElementById("mainFrame"); frame.addEventListener("load",function(){ var win=frame.contentWindow.wrappedJSObject, //mainFrameのwindowオブジェクト。contentWindowのままだとXPCNativeWrapperに包まれていて変数の設定等ができないので注意。 doc=frame.contentDocument.wrappedJSObject; //mainFrameのdocumentオブジェクト。 page.setAttribute("title",doc.title); alert(win.google.toSource()); win.test=VAL; },false); ]]></script> </page>
ありがとうございます! これで動けば、これが求めていた回答です。
しかし、Firefox上での実行に疎く、chromeドキュメントも初耳であったため、現在、動かすことすらままなっていません。
という手順ではchromeドキュメントとして開いていないようで、求めている動作をしませんでした。明らかに間違っている箇所があれば、教えて頂けると助かります。
一応、環境の都合、XULRunnerは無しで模索しています。
自己解決しました。chrome URIなので、chrome://tests/content/test.xulにアクセスしないといけないのですね。
ありがとうございます! これで動けば、これが求めていた回答です。
しかし、Firefox上での実行に疎く、chromeドキュメントも初耳であったため、現在、動かすことすらままなっていません。
という手順ではchromeドキュメントとして開いていないようで、求めている動作をしませんでした。明らかに間違っている箇所があれば、教えて頂けると助かります。
一応、環境の都合、XULRunnerは無しで模索しています。
自己解決しました。chrome URIなので、chrome://tests/content/test.xulにアクセスしないといけないのですね。