Moved JavaScript related function to own file.
authorDaniel Carl <danielcarl@gmx.de>
Sun, 12 Jan 2014 00:14:39 +0000 (01:14 +0100)
committerDaniel Carl <danielcarl@gmx.de>
Sun, 12 Jan 2014 00:14:39 +0000 (01:14 +0100)
src/ex.c
src/hints.c
src/js.c [new file with mode: 0644]
src/js.h [new file with mode: 0644]
src/main.c
src/main.h
src/setting.c

index fd602ba..2b6c5ab 100644 (file)
--- a/src/ex.c
+++ b/src/ex.c
@@ -38,6 +38,7 @@
 #include "bookmark.h"
 #include "shortcut.h"
 #include "map.h"
+#include "js.h"
 
 typedef enum {
     EX_BMA,
@@ -695,7 +696,7 @@ static gboolean ex_eval(const ExArg *arg)
         return false;
     }
 
-    success = vb_eval_script(
+    success = js_eval(
         webkit_web_view_get_main_frame(vb.gui.webview), arg->rhs->str, NULL, &value
     );
     if (success) {
index 07e4ffd..7e50c1c 100644 (file)
@@ -29,6 +29,7 @@
 #include "mode.h"
 #include "input.h"
 #include "map.h"
+#include "js.h"
 
 #define HINT_FILE "hints.js"
 
@@ -44,10 +45,7 @@ static struct {
 
 extern VbCore vb;
 
-static JSObjectRef create_hints_object(WebKitWebFrame *frame, const char *script);
 static void call_hints_function(const char *func, int count, JSValueRef params[]);
-static char *js_ref_to_string(JSContextRef context, JSValueRef ref);
-static JSValueRef js_string_to_ref(JSContextRef ctx, const char *string);
 
 
 void hints_init(WebKitWebFrame *frame)
@@ -57,7 +55,7 @@ void hints_init(WebKitWebFrame *frame)
         hints.obj = NULL;
     }
     if (!hints.obj) {
-        hints.obj = create_hints_object(frame, HINTS_JS);
+        hints.obj = js_create_object(frame, HINTS_JS);
         hints.ctx = webkit_web_frame_get_global_context(frame);
     }
 }
@@ -246,59 +244,9 @@ gboolean hints_parse_prompt(const char *prompt, char *mode, gboolean *is_gmode)
     return res;
 }
 
-static JSObjectRef create_hints_object(WebKitWebFrame *frame, const char *script)
-{
-    if (!script) {
-        return NULL;
-    }
-
-    JSStringRef str, file;
-    JSValueRef result, exc = NULL;
-    JSObjectRef object;
-
-    JSContextRef ctx = webkit_web_frame_get_global_context(frame);
-    str              = JSStringCreateWithUTF8CString(script);
-    file             = JSStringCreateWithUTF8CString(HINT_FILE);
-    result           = JSEvaluateScript(ctx, str, NULL, file, 0, &exc);
-    JSStringRelease(str);
-    JSStringRelease(file);
-    if (exc) {
-        return NULL;
-    }
-
-    object = JSValueToObject(ctx, result, &exc);
-    if (exc) {
-        return NULL;
-    }
-    JSValueProtect(ctx, result);
-
-    return object;
-}
-
 static void call_hints_function(const char *func, int count, JSValueRef params[])
 {
-    JSValueRef js_ret, function;
-    JSObjectRef function_object;
-    JSStringRef js_func = NULL;
-    char *value;
-
-    if (!hints.obj) {
-        return;
-    }
-
-    js_func = JSStringCreateWithUTF8CString(func);
-
-    if (!JSObjectHasProperty(hints.ctx, hints.obj, js_func)) {
-        JSStringRelease(js_func);
-        return;
-    }
-
-    function        = JSObjectGetProperty(hints.ctx, hints.obj, js_func, NULL);
-    function_object = JSValueToObject(hints.ctx, function, NULL);
-    js_ret          = JSObjectCallAsFunction(hints.ctx, function_object, NULL, count, params, NULL);
-    JSStringRelease(js_func);
-
-    value = js_ref_to_string(hints.ctx, js_ret);
+    char *value = js_object_call_function(hints.ctx, hints.obj, func, count, params);
 
     if (!strncmp(value, "OVER:", 5)) {
         g_signal_emit_by_name(
@@ -371,25 +319,3 @@ static void call_hints_function(const char *func, int count, JSValueRef params[]
     }
     g_free(value);
 }
-
-/* FIXME duplicate to main.c */
-static char *js_ref_to_string(JSContextRef ctx, JSValueRef ref)
-{
-    char *string;
-    JSStringRef str_ref = JSValueToStringCopy(ctx, ref, NULL);
-    size_t len          = JSStringGetMaximumUTF8CStringSize(str_ref);
-
-    string = g_new0(char, len);
-    JSStringGetUTF8CString(str_ref, string, len);
-    JSStringRelease(str_ref);
-
-    return string;
-}
-
-static JSValueRef js_string_to_ref(JSContextRef ctx, const char *string)
-{
-    JSStringRef js = JSStringCreateWithUTF8CString(string);
-    JSValueRef ret = JSValueMakeString(ctx, js);
-    JSStringRelease(js);
-    return ret;
-}
diff --git a/src/js.c b/src/js.c
new file mode 100644 (file)
index 0000000..458fdb5
--- /dev/null
+++ b/src/js.c
@@ -0,0 +1,179 @@
+/**
+ * vimb - a webkit based vim like browser.
+ *
+ * Copyright (C) 2012-2014 Daniel Carl
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see http://www.gnu.org/licenses/.
+ */
+
+#include "config.h"
+#include "js.h"
+
+
+static gboolean evaluate_string(JSContextRef ctx, const char *script,
+    const char *file, JSValueRef *result);
+
+/**
+ * Run scripts out of given file in the given frame.
+ */
+gboolean js_eval_file(WebKitWebFrame *frame, const char *file)
+{
+    char *js = NULL, *value = NULL;
+    GError *error = NULL;
+
+    if (g_file_test(file, G_FILE_TEST_IS_REGULAR)
+        && g_file_get_contents(file, &js, NULL, &error)
+    ) {
+        gboolean success = js_eval(frame, js, file, &value);
+        if (!success) {
+            fprintf(stderr, "%s", value);
+        }
+        g_free(value);
+        g_free(js);
+
+        return success;
+    }
+
+    return false;
+}
+
+/**
+ * Evaluates given string as script and return if this call succeed or not.
+ * On success the given **value pointer is filles with the returned string,
+ * else with the exception message. In both cases this must be freed by the
+ * caller if no longer used.
+ */
+gboolean js_eval(WebKitWebFrame *frame, const char *script, const char *file,
+    char **value)
+{
+    gboolean   success;
+    JSValueRef result = NULL;
+    JSContextRef ctx  = webkit_web_frame_get_global_context(frame);
+
+    success = evaluate_string(ctx, script, file, &result);
+    *value  = js_ref_to_string(ctx, result);
+
+    return success;
+}
+
+/**
+ * Creates a JavaScript object in contect of given frame.
+ */
+JSObjectRef js_create_object(WebKitWebFrame *frame, const char *script)
+{
+    JSValueRef result = NULL, exc = NULL;
+    JSObjectRef object;
+    JSContextRef ctx  = webkit_web_frame_get_global_context(frame);
+
+    if (!evaluate_string(ctx, script, NULL, &result)) {
+        return NULL;
+    }
+
+    object = JSValueToObject(ctx, result, &exc);
+    if (exc) {
+        return NULL;
+    }
+    JSValueProtect(ctx, result);
+
+    return object;
+}
+
+/**
+ * Calls a function on object and returns the result as newly allocates
+ * string.
+ * Returned string must be freed after use.
+ */
+char* js_object_call_function(JSContextRef ctx, JSObjectRef obj,
+    const char *func, int count, JSValueRef params[])
+{
+    JSValueRef  js_ret, function;
+    JSObjectRef function_object;
+    JSStringRef js_func = NULL;
+    char *value;
+
+    if (!obj) {
+        return NULL;
+    }
+
+    js_func = JSStringCreateWithUTF8CString(func);
+    if (!JSObjectHasProperty(ctx, obj, js_func)) {
+        JSStringRelease(js_func);
+
+        return NULL;
+    }
+
+    function        = JSObjectGetProperty(ctx, obj, js_func, NULL);
+    function_object = JSValueToObject(ctx, function, NULL);
+    js_ret          = JSObjectCallAsFunction(ctx, function_object, NULL, count, params, NULL);
+    JSStringRelease(js_func);
+
+    value = js_ref_to_string(ctx, js_ret);
+
+    return value;
+}
+
+/**
+ * Retrune a new allocates string for given valeu reference.
+ * String must be freed if not used anymore.
+ */
+char* js_ref_to_string(JSContextRef ctx, JSValueRef ref)
+{
+    char *string;
+    JSStringRef str_ref = JSValueToStringCopy(ctx, ref, NULL);
+    size_t len          = JSStringGetMaximumUTF8CStringSize(str_ref);
+
+    string = g_new0(char, len);
+    JSStringGetUTF8CString(str_ref, string, len);
+    JSStringRelease(str_ref);
+
+    return string;
+}
+
+/**
+ * Retrieves a values reference for given string.
+ */
+JSValueRef js_string_to_ref(JSContextRef ctx, const char *string)
+{
+    JSStringRef js = JSStringCreateWithUTF8CString(string);
+    JSValueRef ref = JSValueMakeString(ctx, js);
+    JSStringRelease(js);
+    return ref;
+}
+
+/**
+ * Runs a string as JavaScript and returns if the call succeed.
+ * In case the call succeed, the given *result is filled with the result
+ * value, else with the value reference of the exception.
+ */
+static gboolean evaluate_string(JSContextRef ctx, const char *script,
+    const char *file, JSValueRef *result)
+{
+    JSStringRef js_str, js_file;
+    JSValueRef exc = NULL, res = NULL;
+
+    js_str  = JSStringCreateWithUTF8CString(script);
+    js_file = JSStringCreateWithUTF8CString(file);
+
+    res = JSEvaluateScript(ctx, js_str, JSContextGetGlobalObject(ctx), js_file, 0, &exc);
+    JSStringRelease(js_file);
+    JSStringRelease(js_str);
+
+    if (exc) {
+        *result = exc;
+        return false;
+    }
+
+    *result = res;
+    return true;
+}
diff --git a/src/js.h b/src/js.h
new file mode 100644 (file)
index 0000000..7ab81c8
--- /dev/null
+++ b/src/js.h
@@ -0,0 +1,34 @@
+/**
+ * vimb - a webkit based vim like browser.
+ *
+ * Copyright (C) 2012-2014 Daniel Carl
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see http://www.gnu.org/licenses/.
+ */
+
+#ifndef _JS_H
+#define _JS_H
+
+#include "main.h"
+
+gboolean js_eval_file(WebKitWebFrame *frame, const char *file);
+gboolean js_eval(WebKitWebFrame *frame, const char *script, const char *file,
+    char **value);
+JSObjectRef js_create_object(WebKitWebFrame *frame, const char *script);
+char* js_object_call_function(JSContextRef ctx, JSObjectRef obj,
+    const char *func, int count, JSValueRef params[]);
+char *js_ref_to_string(JSContextRef ctx, JSValueRef ref);
+JSValueRef js_string_to_ref(JSContextRef ctx, const char *string);
+
+#endif /* end of include guard: _JS_H */
index 6161fcb..14d14ca 100644 (file)
@@ -38,6 +38,7 @@
 #include "default.h"
 #include "pass.h"
 #include "bookmark.h"
+#include "js.h"
 
 /* variables */
 static char **args;
@@ -68,8 +69,6 @@ static void download_progress_cp(WebKitDownload *download, GParamSpec *pspec);
 
 /* functions */
 static void update_title(void);
-static void run_user_script(WebKitWebFrame *frame);
-static char *jsref_to_string(JSContextRef context, JSValueRef ref);
 static void init_core(void);
 static void read_config(void);
 static void setup_signals();
@@ -143,29 +142,6 @@ char *vb_get_input_text(void)
     return gtk_text_buffer_get_text(vb.gui.buffer, &start, &end, false);
 }
 
-gboolean vb_eval_script(WebKitWebFrame *frame, char *script, char *file, char **value)
-{
-    JSStringRef str, file_name;
-    JSValueRef exception = NULL, result = NULL;
-    JSContextRef js;
-
-    js        = webkit_web_frame_get_global_context(frame);
-    str       = JSStringCreateWithUTF8CString(script);
-    file_name = JSStringCreateWithUTF8CString(file);
-
-    result = JSEvaluateScript(js, str, JSContextGetGlobalObject(js), file_name, 0, &exception);
-    JSStringRelease(file_name);
-    JSStringRelease(str);
-
-    if (result) {
-        *value = jsref_to_string(js, result);
-        return true;
-    }
-
-    *value = jsref_to_string(js, exception);
-    return false;
-}
-
 gboolean vb_load_uri(const Arg *arg)
 {
     char *uri = NULL, *rp, *path = NULL;
@@ -421,7 +397,7 @@ static void webview_load_status_cb(WebKitWebView *view, GParamSpec *pspec)
                 hints_init(frame);
 
                 /* run user script file */
-                run_user_script(frame);
+                js_eval_file(frame, vb.files[FILES_SCRIPT]);
             }
 
             /* if we load a page from a submitted form, leafe the insert mode */
@@ -522,36 +498,6 @@ static void set_status(const StatusType status)
     }
 }
 
-static void run_user_script(WebKitWebFrame *frame)
-{
-    char *js = NULL, *value = NULL;
-    GError *error = NULL;
-
-    if (g_file_test(vb.files[FILES_SCRIPT], G_FILE_TEST_IS_REGULAR)
-        && g_file_get_contents(vb.files[FILES_SCRIPT], &js, NULL, &error)
-    ) {
-        gboolean success = vb_eval_script(frame, js, vb.files[FILES_SCRIPT], &value);
-        if (!success) {
-            fprintf(stderr, "%s", value);
-        }
-        g_free(value);
-        g_free(js);
-    }
-}
-
-static char *jsref_to_string(JSContextRef context, JSValueRef ref)
-{
-    char *string;
-    JSStringRef str_ref = JSValueToStringCopy(context, ref, NULL);
-    size_t len          = JSStringGetMaximumUTF8CStringSize(str_ref);
-
-    string = g_new0(char, len);
-    JSStringGetUTF8CString(str_ref, string, len);
-    JSStringRelease(str_ref);
-
-    return string;
-}
-
 static void init_core(void)
 {
     Gui *gui = &vb.gui;
index 2c44ac7..3148506 100644 (file)
@@ -330,7 +330,6 @@ void vb_echo(const MessageType type, gboolean hide, const char *error, ...);
 void vb_set_input_text(const char *text);
 char *vb_get_input_text(void);
 void vb_input_activate(void);
-gboolean vb_eval_script(WebKitWebFrame *frame, char *script, char *file, char **value);
 gboolean vb_load_uri(const Arg *arg);
 gboolean vb_set_clipboard(const Arg *arg);
 void vb_set_widget_font(GtkWidget *widget, const VbColor *fg, const VbColor *bg, PangoFontDescription *font);
index bf03451..a94e417 100644 (file)
@@ -21,6 +21,7 @@
 #include "setting.h"
 #include "util.h"
 #include "completion.h"
+#include "js.h"
 
 static GHashTable *settings;
 
@@ -865,9 +866,7 @@ static gboolean validate_js_regexp_list(const char *pattern)
     char *js, *value = NULL;
 
     js     = g_strdup_printf("var i;for(i=0;i<[%s].length;i++);", pattern);
-    result = vb_eval_script(
-        webkit_web_view_get_main_frame(vb.gui.webview), js, NULL, &value
-    );
+    result = js_eval(webkit_web_view_get_main_frame(vb.gui.webview), js, NULL, &value);
     g_free(js);
     if (!result) {
         vb_echo(VB_MSG_ERROR, true, "%s", value);