GNOME の JavaScript 実装は seed と gjs がある。
seed は WebKit の Javascript エンジン。
gjs は Spidermonkey(Firefox) の Javascript エンジン。
であるようだ。
一応書くと Google Chrome のエンジンは V8 なので違います。
ようするに普通に WebKit を GNOME で使うと Seed を利用するということかな。
Python with GTK+3 WebKit Browser 2 | PaePoi
試しに以前作った上記と Google Chrome で V8 ベンチをやってみる。
V8 Benchmark Suite
V8 はやはり早い、圧倒的な差があるのね。
まあそれはよくて、Seed なら imports が使えるはず。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>GtkWindow</title>
<script>
function test() {
try {
var Gtk = imports.gi.Gtk;
}
catch(e) {
alert(e);
}
}
</script>
</head>
<body>
<input type="button" onclick="test()" value="Test">
</body>
</html>
ダメじゃん、ということで。
Blogging in the wind: WebKit: Extending Javascript – Seed (V)
こんなページを見つけた。
これは面白そうだ、ヘッダを揃えてビルドしてみよう。
webkitgtk-devel, seed-devel を入れればいいかな。
環境が揃ったのでビルド、問題なく実行ファイルが作成された。
ということで、GtkWindow を作成する HTML5 ファイルを読み込ませてみる。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>GtkWindow</title>
<script>
var on_clicked = function() {
//
};
function create() {
try {
var Gtk = imports.gi.Gtk;
Gtk.init (null, null);
var gtkwin = new Gtk.Window();
gtkwin.signal.hide.connect(Gtk.main_quit);
var label = new Gtk.Label({label:"Button Click -> WARNING"});
var button = new Gtk.Button({label:"Button Clicked"});
button.signal.clicked.connect(on_clicked);
var vbox = new Gtk.VBox();
vbox.pack_start(label);
vbox.pack_start(button);
gtkwin.add(vbox);
gtkwin.show_all();
Gtk.main()
}
catch(e) {
alert(e);
}
}
</script>
</head>
<body>
<div>First time an error</div>
<input type="button" onclick="create()" value="Do GtkWindow">
</body>
</html>
ボタンの初回クリックで例外を吐く。
けど2回めからは問題なく GtkWindow が作成された。
body.onLoad() で imports なんかも試してみたが同じだった。
それよりシグナルのハンドラがうまくいかない。
RangeError って意味がよく解らないんですけど…
Seed の例外は何が悪いのかが PyGI より理解し辛いのが難点だよな。
うーイマイチだ。
でもとにかくコレで WebKit から imports が使えることは解った。
利用場面があるかどうかは別の話として。




