- PR -

【SWTでオリジナルブラウザ】遷移先のURLの取得方法

1
投稿者投稿内容
ナスカ
会議室デビュー日: 2007/10/04
投稿数: 7
投稿日時: 2007-10-04 18:14
初めての投稿になります。
よろしくお願いいたします。

SWTにてオリジナルのブラウザを作成しています。
機能が不足している為、「org.eclipse.swt.browser.Browser」クラスは
使用していません。
org.eclipse.swt.ole.win32.OleFrame
org.eclipse.swt.ole.win32.OleControlSite
org.eclipse.swt.ole.win32.OleAutomation
を使用してIEコンポーネントを呼んでいます。

そこで、リクエストを発行する前にそのリクエストURLと、内部に保持している
「ブラックリストURL」とを照合させてヒットする場合は画面遷移させない機能を
実装したいです。


しかし、BeforeNavigate2イベントなどで、そのリクエストURLを取得する事ができません。
何か方法はありますでしょうか?
リクエスト前のイベントであればBeforeNavigate2イベントでなくても構いません。

コード:
public class Browser{

	public Browser(Shell shell){
		final Shell wShell = shell;
		// OleFrameの生成
		OleFrame frame = new OleFrame(shell,SWT.NO_TRIM | SWT.ON_TOP);
		frame.setSize(new Point(1024,768));
		frame.setLocation(new Point(0,0));
		// OleControlSiteの生成
		final OleControlSite ieSite = new OleControlSite(frame,SWT.NO_TRIM | SWT.ON_TOP,"Shell.Explorer");
		ieSite.setLocation(new Point(0,0));
		ieSite.setSize(new Point(1024,768));
		ieSite.doVerb(OLE.OLEIVERB_SHOW);
		// OleAutomationの生成
		final OleAutomation ieAuto = new OleAutomation(ieSite);

		// BeforeNavigate2 = 0x000000faにイベント処理を関連づける
		// リクエスト前イベント
		ieSite.addEventListener(0x000000fa,new OleListener() {
			public void handleEvent(OleEvent event){
				String url = event.arguments[1];	//←これだと遷移前のURL
				//取得したいのはリクエストURL
			}
			
			//ブラックリスト照合処理。。。
			
		});
	}

}



環境は
jdk 1.5.0.11
eclipse 3.2
org.eclipse.swt.win32.win32.x86_3.2.1.v3235.jar
Windows XP Professonal SP2
IE 6.0 SP2
です。

よろしくお願いいたします。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-10-04 19:56
引用:

ナスカさんの書き込み (2007-10-04 18:14) より:
コード:
(略)
		// BeforeNavigate2 = 0x000000faにイベント処理を関連づける
		// リクエスト前イベント
		ieSite.addEventListener(0x000000fa,new OleListener() {
			public void handleEvent(OleEvent event){
				String url = event.arguments[1];	//←これだと遷移前のURL
				//取得したいのはリクエストURL
			}
			
			//ブラックリスト照合処理。。。
			
		});
(略)




VB で、イベントハンドラーを作ると、
コード:
Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
End Sub


となり、URL という引数に、「リクエストURL」が入っているように思います。ちなみに、pDisp という引数の LocationURL というプロパティーのほうには遷移前の URL が入っているような感じです。

Java の swt で Ole を操作するとそうなっていないのでしょうか?まず、IE コンポーネントの問題か、swt の問題か、を調べられてはどうでしょうか。

VB や Excel の VBA が使えれば容易に判別できるだろうと思います。慣れないと使いにくいですが、使えればデバッグの選択肢が増えてデバッグしやすくなりますよ。
(C# などでも VB と Java の中間的に使えてよいかもしれませんが。)

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
ナスカ
会議室デビュー日: 2007/10/04
投稿数: 7
投稿日時: 2007-10-04 21:12
unibonさん
早速の回答をありがとうございます。

引用:

Java の swt で Ole を操作するとそうなっていないのでしょうか?まず、IE コンポーネントの問題か、swt の問題か、を調べられてはどうでしょうか。


引数のOleEventのarguments[]フィールドにBeforeNavigate2イベント情報が入っています。
(BeforeNavigate2の引数分、argumentsの配列になります)

OLEブラウザで調べると
void BeforeNavigate2(
[in] IDispatch* pDisp,
[in] VARIANT* URL,
[in] VARIANT* Flags,
[in] VARIANT* TargetFrameName,
[in] VARIANT* PostData,
[in] VARIANT* Headers,
[in, out] VARIANT_BOOL* Cancel);
となっているので、arguments[1]を取得してみたのですが、遷移前のURLでした。
arguments[4]の中身にあるのかもしれませんが、Variant型から中身を見る方法が
わかりません。

私の調査した結果はここまででした。



<<修正>>
修正前:
コード:
String url = event.arguments[1];	//←これだと遷移前のURL



修正後
コード:
String url = event.arguments[1].getString();	//←これだと遷移前のURL



よろしくお願いいたします。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-10-04 22:59
引用:

ナスカさんの書き込み (2007-10-04 21:12) より:
となっているので、arguments[1]を取得してみたのですが、遷移前のURLでした。


引用:

ナスカさんの書き込み (2007-10-04 21:12) より:
修正後
コード:

String url = event.arguments[1].getString(); //←これだと遷移前のURL




SWT はぜんぜん使ったことがないのですが、提示されたコードをもとにして、ネットから拾ってきたコードを切り貼りして、みようみまねで私も SWT で動かしてみましたが、
event.arguments[1].getString()
で、これから遷移しようとする URL が取得できているように思えます。「遷移前のURL」ではないと思うのですが。
どのようにして「遷移前のURL」であると判断されましたか?

「遷移前」という概念の解釈が違うのでしょうか?

なお、私の環境は、
JRE 1.6.0_02
Eclipse 3.3.1
org.eclipse.swt.win32.win32.x86_3.3.1.v3346i.jar
Windows XP Professional SP2
IE 7.0
です。

#後で環境表記を修正。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}

[ メッセージ編集済み 編集者: unibon 編集日時 2007-10-04 23:02 ]
ナスカ
会議室デビュー日: 2007/10/04
投稿数: 7
投稿日時: 2007-10-05 10:03
unibonさん
回答ありがとうございます。

引用:

「遷移前」という概念の解釈が違うのでしょうか?


例えば現在「http://hogehoge/home/index.html」のページを表示しているとします。
そのページのリンクとして「http://hogehoge/home/link.html」があるとします。
このリンクをクリックした際のBeforeNavigate2イベントにおいて
遷移前のURL
 「http://hogehoge/home/index.html」
リクエストURL
 「http://hogehoge/home/link.html」
という意味で書いております。

unibonさんは上記の意味合いで「リクエストURL」が取得できた、という事ですね?
。。。了解しました。サンプルは実際のソースを簡易化したものなので
サンプルのソースで確認してみます。

ありがとうございました。
ナスカ
会議室デビュー日: 2007/10/04
投稿数: 7
投稿日時: 2007-10-05 10:34
サンプルで確認しました。
。。。。。
「リクエストURL」が取得できていました。

実際のソースで確認しました。
。。。。。
「リクエストURL」が取得できていました。

大変申し訳ございません。
私が見間違えていたようです。。。

とりあえず解決しました。(解決していました)

unibonさんにはご迷惑をおかけいたしました。
丁寧な対応をありがとうございました。

#せめてこの投稿を見た皆様の役に立てますように。。。
1

スキルアップ/キャリアアップ(JOB@IT)