WebKit JavaScriptCoreで遊んでみる
相変わらず適当に。とりあえずWebKitGTK(3)で表示しているJavaScriptを評価して結果を取得して表示するだけ
JavaScriptは
return "hello world";
な感じで、こういうJavaScriptを評価してC言語側で結果を取得して表示するまで
#include <gtk/gtk.h>
#include <webkit/webkit.h>
#include <JavaScriptCore/JavaScript.h>
static void loaded(WebKitWebView* view, WebKitWebFrame* frame, gpointer data) {
WebKitWebFrame* contentFrame = webkit_web_view_get_main_frame(view);
WebKitWebDataSource* ds = webkit_web_frame_get_data_source(contentFrame);
GString *source = webkit_web_data_source_get_data(ds);
JSGlobalContextRef ctx;
ctx = webkit_web_frame_get_global_context(contentFrame);
JSStringRef script;
script = JSStringCreateWithUTF8CString(source->str);
JSObjectRef fn;
fn = JSObjectMakeFunction(ctx, NULL, 0, NULL, script, NULL, 1, NULL);
JSValueRef value;
value = JSObjectCallAsFunction(ctx, fn, NULL, 0, NULL, NULL);
if (JSValueIsString(ctx,value)) {
JSStringRef jstr;
jstr = JSValueToStringCopy(ctx, value, NULL);
size_t size;
size = JSStringGetMaximumUTF8CStringSize(jstr);
char buf[size];
JSStringGetUTF8CString(jstr, buf, size);
JSStringRelease(jstr);
printf("%sn",buf);
}
JSStringRelease(script);
g_string_free(source,TRUE);
gtk_main_quit();
}
int main(int argc, char* argv) {
gtk_init(&argc, &argv);
GtkWidget* window;
GtkWidget* view;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
view = webkit_web_view_new();
gtk_container_add(GTK_CONTAINER(window), view);
g_signal_connect(view, "load-finished", G_CALLBACK(loaded), NULL);
webkit_web_view_open(view, "http://localhost:5000/test.js");
gtk_widget_show_all(GTK_WIDGET(window));
gtk_main();
return 0;
}
コンパイルは
gcc test.c -o test `pkg-config --cflags --libs webkitgtk-3.0`
な感じで、libwebkitgtk-3-devを入れて実行みたいな感じで。まぁFirst Stepな感じなんでこんなもんで