日記帳

日記です。

swt と JavaScript で Web ブラウザ

swt が使えるなら org.eclipse.swt.browser.Browser クラスが使えるわけで Web ブラウザくらい書けるはず.

% cat Browser.js
importPackage(Packages.java.lang)
importPackage(Packages.org.eclipse.swt)
importPackage(Packages.org.eclipse.swt.browser)
importPackage(Packages.org.eclipse.swt.layout)
importPackage(Packages.org.eclipse.swt.widgets)

var display = new Display();
var shell = new Shell(display);
shell.setText("Simple SWT Web Browser");
shell.setLayout(new FillLayout(SWT.VERTICAL));

var browser = new Browser(shell, SWT.BORDER)
browser.setUrl("http://www.google.com/")

shell.open();
while (!shell.isDisposed()) {
	if (!display.readAndDispatch()) 
		display.sleep();
}
display.dispose();

動かしてみる.

% rhino Browser.js
Exception in thread "main" org.eclipse.swt.SWTError: No more handles [Unknown Mozilla path (MOZILLA_FIVE_HOME not set)]
   at _ZN4java4lang11VMThrowable16fillInStackTraceEPNS0_9ThrowableE (/usr/lib/libgcj.so.4.0.0)
   <略>
   at JvRunMain (/usr/lib/libgcj.so.4.0.0)
   at main (Unknown Source)
   at __libc_start_main (/lib/libc-2.3.4.so)
   at _start (Unknown Source)

怒られた… 環境変数 MOZILLA_FIVE_HOME が設定されてないといけないらしい.手元の環境では mozilla-1.7.12 が /usr/lib/mozilla-1.7.12 にインストールされてるので以下のように設定して再挑戦.

% env MOZILLA_FIVE_HOME=/usr/lib/mozilla-1.7.12 rhino Browser.js
Exception in thread "main" org.eclipse.swt.SWTError: No more handles (java.lang.UnsatisfiedLinkError: no swt-mozilla-gtk-3346 or swt-mozilla-gtk in swt.library.path, java.library.path or the jar file)
   at _ZN4java4lang11VMThrowable16fillInStackTraceEPNS0_9ThrowableE (/usr/lib/libgcj.so.4.0.0)
   at _ZN4java4lang9Throwable16fillInStackTraceEv (/usr/lib/libgcj.so.4.0.0)
   <略>
   at _ZN3org7eclipse3swt8internal7Library11loadLibraryEPN4java4lang6StringEb (/usr/lib/lib-org-eclipse-swt.so.0.0.0)
   at _ZN3org7eclipse3swt8internal7Library11loadLibraryEPN4java4lang6StringE (/usr/lib/lib-org-eclipse-swt.so.0.0.0)
   ...37 more

また怒られたですよ… swt-mozilla-gtk-3346 をロードできないらしいです. libswt-mozilla-gtk-3346.so は /usr/lib/ にインストールしてあるのでプロパティ java.library.path や環境変数 LD_LIBRARY_PATH に設定しなくてもロードできると思うのですが…?

なんでだろうと思いつつ ldd してみる.

% ldd /usr/lib/libswt-mozilla-gtk-3346.so 
	linux-gate.so.1 =>  (0xffffe000)
	libxpcom.so => not found
	libnspr4.so => /usr/lib/libnspr4.so (0x4002f000)
	libplds4.so => /usr/lib/libplds4.so (0x4005f000)
	libplc4.so => /usr/lib/libplc4.so (0x40062000)
	libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x40066000)
	libm.so.6 => /lib/libm.so.6 (0x40138000)
	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x4015a000)
	libc.so.6 => /lib/libc.so.6 (0x40163000)
	libpthread.so.0 => /lib/libpthread.so.0 (0x4026f000)
	libdl.so.2 => /lib/libdl.so.2 (0x402c1000)
	/lib/ld-linux.so.2 (0x80000000)

libxpcom.so が not found になってる…?なるほどなーとか思いながら以下のようにして実行してみる.

% env MOZILLA_FIVE_HOME=/usr/lib/mozilla-1.7.12 LD_LIBRARY_PATH=/usr/lib/mozilla-1.7.12 rhino Browser.js

動いたっぽい.面倒くさいですね…