commit 2e62372969239285705504187b0211039b5ae619
parent 3b104416d350f25db098d6c8dc9ddff11311e065
Author: Troels Henriksen <athas@sigkill.dk>
Date:   Thu,  3 Nov 2011 14:09:19 +0100
Add eval() function for executing Javascript.  Handy for keybindings.
Diffstat:
| surf.c | | | 26 | +++++++++++++++++++++----- | 
1 file changed, 21 insertions(+), 5 deletions(-)
diff --git a/surf.c b/surf.c
@@ -102,6 +102,7 @@ static void setup(void);
 static void sigchld(int unused);
 static void source(Client *c, const Arg *arg);
 static void spawn(Client *c, const Arg *arg);
+static void eval(Client *c, const Arg *arg);
 static void stop(Client *c, const Arg *arg);
 static void titlechange(WebKitWebView *v, WebKitWebFrame* frame, const char* title, Client *c);
 static void update(Client *c);
@@ -144,15 +145,24 @@ cleanup(void) {
 }
 
 void
+evalscript(WebKitWebFrame *frame, JSContextRef js, char *script, char* scriptname) {
+	JSStringRef jsscript, jsscriptname;
+	JSValueRef exception = NULL;
+
+	jsscript = JSStringCreateWithUTF8CString(script);
+	jsscriptname = JSStringCreateWithUTF8CString(scriptname);
+	JSEvaluateScript(js, jsscript, JSContextGetGlobalObject(js), jsscriptname, 0, &exception);
+	JSStringRelease(jsscript);
+	JSStringRelease(jsscriptname);
+}
+
+void
 runscript(WebKitWebFrame *frame, JSContextRef js) {
-	JSStringRef jsscript;
 	char *script;
-	JSValueRef exception = NULL;
 	GError *error;
-	
+
 	if(g_file_get_contents(scriptfile, &script, NULL, &error)) {
-		jsscript = JSStringCreateWithUTF8CString(script);
-		JSEvaluateScript(js, jsscript, JSContextGetGlobalObject(js), NULL, 0, &exception);
+		evalscript(frame, webkit_web_frame_get_global_context(frame), script, scriptfile);
 	}
 }
 
@@ -740,6 +750,12 @@ spawn(Client *c, const Arg *arg) {
 }
 
 void
+eval(Client *c, const Arg *arg) {
+	WebKitWebFrame *frame = webkit_web_view_get_main_frame(c->view);
+	evalscript(frame, webkit_web_frame_get_global_context(frame), ((char **)arg->v)[0], "");
+}
+
+void
 stop(Client *c, const Arg *arg) {
 	webkit_web_view_stop_loading(c->view);
 }