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
動いたっぽい.面倒くさいですね…