WebKitHitTestResult *, gpointer);
static gboolean quit_if_nothing_active(void);
static gboolean remote_msg(GIOChannel *, GIOCondition, gpointer);
+static void run_user_scripts(WebKitWebView *);
static void search(gpointer, gint);
static void show_web_view(WebKitWebView *, gpointer);
-static Window tabbed_launch(void);
static void trust_user_certs(WebKitWebContext *);
static gboolean cooperative_instances = TRUE;
static int cooperative_pipe_fp = 0;
static gchar *download_dir = "/var/tmp";
-static gboolean enable_webgl = FALSE;
static gboolean enable_console_to_stdout = FALSE;
-static Window embed = 0;
static gchar *fifo_suffix = "main";
static gdouble global_zoom = 1.0;
static gchar *history_file = NULL;
static gboolean initial_wc_setup_done = FALSE;
static GHashTable *keywords = NULL;
static gchar *search_text = NULL;
-static gboolean tabbed_automagic = TRUE;
static gchar *user_agent = NULL;
exit(EXIT_FAILURE);
}
- if (embed != 0)
- {
- c->win = gtk_plug_new(embed);
- if (!gtk_plug_get_embedded(GTK_PLUG(c->win)))
- {
- fprintf(stderr, __NAME__": Can't plug-in to XID %ld.\n", embed);
- gtk_widget_destroy(c->win);
- c->win = NULL;
- embed = 0;
- }
- }
-
if (c->win == NULL)
c->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
if (enable_console_to_stdout)
webkit_settings_set_enable_write_console_messages_to_stdout(webkit_web_view_get_settings(WEBKIT_WEB_VIEW(c->web_view)), TRUE);
- if (enable_webgl)
- webkit_settings_set_enable_webgl(webkit_web_view_get_settings(WEBKIT_WEB_VIEW(c->web_view)), TRUE);
+ webkit_settings_set_enable_developer_extras(webkit_web_view_get_settings(WEBKIT_WEB_VIEW(c->web_view)), TRUE);
c->location = gtk_entry_new();
g_signal_connect(G_OBJECT(c->location), "key-press-event",
{
p = 0;
- /* The page has loaded fully. We now run a the short JavaScript
+ /* The page has loaded fully. We now run the short JavaScript
* snippet above that operates on the DOM. It tries to grab all
* occurences of <link rel="alternate" ...>, i.e. RSS/Atom feed
* references. */
webkit_web_view_run_javascript(WEBKIT_WEB_VIEW(c->web_view),
grab_feeds, NULL,
grab_feeds_finished, c);
+
+ run_user_scripts(WEBKIT_WEB_VIEW(c->web_view));
}
gtk_entry_set_progress_fraction(GTK_ENTRY(c->location), p);
}
if (e != NULL)
enable_console_to_stdout = TRUE;
- e = g_getenv(__NAME_UPPERCASE__"_ENABLE_EXPERIMENTAL_WEBGL");
- if (e != NULL)
- enable_webgl = TRUE;
-
e = g_getenv(__NAME_UPPERCASE__"_FIFO_SUFFIX");
if (e != NULL)
fifo_suffix = g_strdup(e);
{
struct Client *c = (struct Client *)data;
WebKitJavascriptResult *js_result;
- JSValueRef value;
- JSGlobalContextRef context;
+ JSCValue *value;
+ JSCException *exception;
GError *err = NULL;
- JSStringRef js_str_value;
- gsize str_length;
+ gchar *str_value;
g_free(c->feed_html);
c->feed_html = NULL;
/* This was taken almost verbatim from the example in WebKit's
- * documentation. */
+ * documentation:
+ *
+ * https://webkitgtk.org/reference/webkit2gtk/stable/WebKitWebView.html#webkit-web-view-run-javascript-finish */
js_result = webkit_web_view_run_javascript_finish(WEBKIT_WEB_VIEW(object),
result, &err);
return;
}
- context = webkit_javascript_result_get_global_context(js_result);
- value = webkit_javascript_result_get_value(js_result);
-
- if (JSValueIsString(context, value))
+ value = webkit_javascript_result_get_js_value(js_result);
+ if (jsc_value_is_string(value))
{
- js_str_value = JSValueToStringCopy(context, value, NULL);
- str_length = JSStringGetMaximumUTF8CStringSize(js_str_value);
- c->feed_html = (gchar *)g_malloc(str_length);
- JSStringGetUTF8CString(js_str_value, c->feed_html, str_length);
- JSStringRelease(js_str_value);
+ str_value = jsc_value_to_string(value);
+ exception = jsc_context_get_exception(jsc_value_get_context(value));
+ if (exception != NULL)
+ {
+ fprintf(stderr, __NAME__": Error running javascript: %s\n",
+ jsc_exception_get_message(exception));
+ }
+ else
+ c->feed_html = str_value;
gtk_entry_set_icon_from_icon_name(GTK_ENTRY(c->location),
GTK_ENTRY_ICON_PRIMARY,
return TRUE;
}
+void
+run_user_scripts(WebKitWebView *web_view)
+{
+ gchar *base = NULL, *path = NULL, *contents = NULL;
+ const gchar *entry = NULL;
+ GDir *scriptdir = NULL;
+
+ base = g_build_filename(g_get_user_config_dir(), __NAME__, "user-scripts", NULL);
+ scriptdir = g_dir_open(base, 0, NULL);
+ if (scriptdir != NULL)
+ {
+ while ((entry = g_dir_read_name(scriptdir)) != NULL)
+ {
+ path = g_build_filename(base, entry, NULL);
+ if (g_str_has_suffix(path, ".js"))
+ {
+ if (g_file_get_contents(path, &contents, NULL, NULL))
+ {
+ webkit_web_view_run_javascript(web_view, contents, NULL, NULL, NULL);
+ g_free(contents);
+ }
+ }
+ g_free(path);
+ }
+ g_dir_close(scriptdir);
+ }
+
+ g_free(base);
+}
+
void
search(gpointer data, gint direction)
{
gtk_widget_show_all(c->win);
}
-Window
-tabbed_launch(void)
-{
- gint tabbed_stdout;
- GIOChannel *tabbed_stdout_channel;
- GError *err = NULL;
- gchar *output = NULL;
- char *argv[] = { "tabbed", "-c", "-d", "-p", "s1", "-n", __NAME__, NULL };
- Window plug_into;
-
- if (!g_spawn_async_with_pipes(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL,
- NULL, NULL, NULL, &tabbed_stdout, NULL,
- &err))
- {
- fprintf(stderr, __NAME__": Could not launch tabbed: %s\n", err->message);
- g_error_free(err);
- return 0;
- }
-
- tabbed_stdout_channel = g_io_channel_unix_new(tabbed_stdout);
- if (tabbed_stdout_channel == NULL)
- {
- fprintf(stderr, __NAME__": Could open tabbed's stdout\n");
- return 0;
- }
- g_io_channel_read_line(tabbed_stdout_channel, &output, NULL, NULL, NULL);
- g_io_channel_shutdown(tabbed_stdout_channel, FALSE, NULL);
- if (output == NULL)
- {
- fprintf(stderr, __NAME__": Could not read XID from tabbed\n");
- return 0;
- }
- g_strstrip(output);
- plug_into = strtol(output, NULL, 16);
- g_free(output);
- if (plug_into == 0)
- fprintf(stderr, __NAME__": The XID from tabbed is 0\n");
- return plug_into;
-}
-
void
trust_user_certs(WebKitWebContext *wc)
{
grab_environment_configuration();
- while ((opt = getopt(argc, argv, "e:CT")) != -1)
+ while ((opt = getopt(argc, argv, "C")) != -1)
{
switch (opt)
{
- case 'e':
- embed = atol(optarg);
- tabbed_automagic = FALSE;
- break;
case 'C':
cooperative_instances = FALSE;
break;
- case 'T':
- tabbed_automagic = FALSE;
- break;
default:
fprintf(stderr, "Usage: "__NAME__" [OPTION]... [URI]...\n");
exit(EXIT_FAILURE);
cooperation_setup();
downloadmanager_setup();
- if (tabbed_automagic && !(cooperative_instances && !cooperative_alone))
- embed = tabbed_launch();
-
if (!cooperative_instances || cooperative_alone)
{
c = g_build_filename(g_get_user_config_dir(), __NAME__, "web_extensions",