XULで作ったiframeに任意のページを表示させ、そのページの値を取得したり、値を設定したいと思い以下のコードを書きましたが、動きません。


<?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で動けば問題ないです。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/09/07 21:18:17
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kebo987654 No.2

回答回数38ベストアンサー獲得回数10

ポイント60pt

以下のサンプルで動きました。(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>
id:ofk

ありがとうございます! これで動けば、これが求めていた回答です。

しかし、Firefox上での実行に疎く、chromeドキュメントも初耳であったため、現在、動かすことすらままなっていません。

  • firefox/chrome/test.manifestを「content tests file:///C:/testfiles/」という内容で作る。
  • C:/testfiles/test.xulを上記内容で作る。
  • ブラウザでfile:///C:/testfiles/test.xulを開く

という手順ではchromeドキュメントとして開いていないようで、求めている動作をしませんでした。明らかに間違っている箇所があれば、教えて頂けると助かります。

一応、環境の都合、XULRunnerは無しで模索しています。

自己解決しました。chrome URIなので、chrome://tests/content/test.xulにアクセスしないといけないのですね。

2009/09/07 21:17:21

その他の回答1件)

id:meefla No.1

回答回数997ベストアンサー獲得回数472

ポイント10pt

<page> 要素を使っているのが敗因ではないでしょうか?


page - MDC

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> 中に読み込んだ文書からデータを取り出したりしてあれこれする、という部分は経験がないと言うか、うまくいっていない部分なので、

(読み込んだページをスクロールダウンしたいんですが)

お力にはなれないかもしれません。


コメント欄を開けておいていただけるとありがたいのですが。

id:ofk

page要素でも<iframe>に任意のURLを読むところまではできますね。

質問の確認になりますが、<iframe>中に読み込んだ文書にあれこれしたいというが今回の質問です。

XULに詳しい方をあまり知らないので、力になってもらえるとうれしいです。というわけで、コメント欄を空けておきました。

2009/09/07 10:19:03
id:kebo987654 No.2

回答回数38ベストアンサー獲得回数10ここでベストアンサー

ポイント60pt

以下のサンプルで動きました。(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>
id:ofk

ありがとうございます! これで動けば、これが求めていた回答です。

しかし、Firefox上での実行に疎く、chromeドキュメントも初耳であったため、現在、動かすことすらままなっていません。

  • firefox/chrome/test.manifestを「content tests file:///C:/testfiles/」という内容で作る。
  • C:/testfiles/test.xulを上記内容で作る。
  • ブラウザでfile:///C:/testfiles/test.xulを開く

という手順ではchromeドキュメントとして開いていないようで、求めている動作をしませんでした。明らかに間違っている箇所があれば、教えて頂けると助かります。

一応、環境の都合、XULRunnerは無しで模索しています。

自己解決しました。chrome URIなので、chrome://tests/content/test.xulにアクセスしないといけないのですね。

2009/09/07 21:17:21

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません