From a92edc3f72d839184337ffc6816b2ad2b9c624d8 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Wed, 21 Apr 2010 02:25:15 +0000 Subject: [PATCH] Implemented basic Javascript console --- src/callbacks.c | 19 +++++++++++ src/callbacks.h | 4 +++ src/common.h | 4 +++ src/ghtml-webkit.c | 16 ++++++++++ src/surfer.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++ src/surfer.h | 3 ++ 6 files changed, 126 insertions(+) diff --git a/src/callbacks.c b/src/callbacks.c index 5bf6c62..309b8ea 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -165,6 +165,15 @@ void on_view_force_refresh(gpointer data) } +/* on_view_javascript_console */ +void on_view_javascript_console(gpointer data) +{ + Surfer * surfer = data; + + surfer_show_console(surfer, TRUE); +} + + /* on_view_normal_size */ void on_view_normal_size(gpointer data) { @@ -445,6 +454,16 @@ void on_close(gpointer data) } +/* on_console_closex */ +gboolean on_console_closex(gpointer data) +{ + Surfer * surfer = data; + + surfer_show_console(surfer, FALSE); + return TRUE; +} + + /* on_forward */ void on_forward(gpointer data) { diff --git a/src/callbacks.h b/src/callbacks.h index ff734a0..8fb7585 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -49,6 +49,7 @@ void on_view_refresh(gpointer data); void on_view_force_refresh(gpointer data); void on_view_stop(gpointer data); void on_view_page_source(gpointer data); +void on_view_javascript_console(gpointer data); /* help menu */ void on_help_about(gpointer data); @@ -69,4 +70,7 @@ void on_stop(gpointer data); void on_notebook_close_tab(GtkWidget * widget, gpointer data); void on_notebook_switch_page(gpointer data); +/* console */ +gboolean on_console_closex(gpointer data); + #endif diff --git a/src/common.h b/src/common.h index f129e46..f5e48f4 100644 --- a/src/common.h +++ b/src/common.h @@ -60,6 +60,10 @@ struct _Surfer GtkWidget * fi_text; GtkWidget * fi_case; GtkWidget * fi_wrap; + + /* console */ + GtkWidget * co_window; + GtkListStore * co_store; }; #endif /* !SURFER_COMMON_H */ diff --git a/src/ghtml-webkit.c b/src/ghtml-webkit.c index 5351ce6..c79fcea 100644 --- a/src/ghtml-webkit.c +++ b/src/ghtml-webkit.c @@ -28,6 +28,8 @@ /* prototypes */ /* functions */ /* callbacks */ +static gboolean _on_console_message(WebKitWebView * view, const gchar * message, + guint line, const gchar * source, gpointer data); static WebKitWebView * _on_create_web_view(WebKitWebView * view, WebKitWebFrame * frame, gpointer data); static gboolean _on_download_requested(WebKitWebView * view, @@ -72,6 +74,8 @@ GtkWidget * ghtml_new(Surfer * surfer) g_object_set_data(G_OBJECT(widget), "surfer", surfer); g_object_set_data(G_OBJECT(widget), "view", view); /* view */ + g_signal_connect(G_OBJECT(view), "console-message", G_CALLBACK( + _on_console_message), widget); g_signal_connect(G_OBJECT(view), "create-web-view", G_CALLBACK( _on_create_web_view), widget); g_signal_connect(G_OBJECT(view), "download-requested", G_CALLBACK( @@ -346,6 +350,18 @@ void ghtml_zoom_reset(GtkWidget * ghtml) /* private */ /* functions */ +/* on_console_message */ +static gboolean _on_console_message(WebKitWebView * view, const gchar * message, + guint line, const gchar * source, gpointer data) +{ + Surfer * surfer; + + surfer = g_object_get_data(G_OBJECT(data), "surfer"); + surfer_console_message(surfer, message, source, line); + return TRUE; +} + + /* on_create_web_view */ static WebKitWebView * _on_create_web_view(WebKitWebView * view, WebKitWebFrame * frame, gpointer data) diff --git a/src/surfer.c b/src/surfer.c index 90db2a3..64ff9a5 100644 --- a/src/surfer.c +++ b/src/surfer.c @@ -38,6 +38,13 @@ typedef struct _SurferIdle char * url; } SurferIdle; +typedef enum _SurferConsoleMessage +{ + SCM_MESSAGE = 0, SCM_SOURCE, SCM_LINE, SCM_DISPLAY_LINE +} SurferConsoleMessage; +#define SCM_LAST SCM_DISPLAY_LINE +#define SCM_COUNT (SCM_LAST + 1) + /* variables */ static DesktopAccel _surfer_accel[] = @@ -112,6 +119,8 @@ static DesktopMenu _menu_view[] = { "", NULL, NULL, 0 }, { N_("Page so_urce"), G_CALLBACK(on_view_page_source), "stock_view-html-source", GDK_U }, + { N_("Javascript _console"), G_CALLBACK(on_view_javascript_console), + NULL, 0 }, { NULL, NULL, NULL, 0 } }; @@ -305,6 +314,10 @@ Surfer * _new_do(char const * url) surfer->pr_window = NULL; /* find dialog */ surfer->fi_dialog = NULL; + /* console window */ + surfer->co_window = NULL; + surfer->co_store = gtk_list_store_new(SCM_COUNT, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING); /* hack to display the statusbar only if necessary */ gtk_box_pack_start(GTK_BOX(vbox), surfer->statusbox, FALSE, FALSE, 0); surfer_set_status(surfer, NULL); @@ -569,6 +582,26 @@ int surfer_confirm(Surfer * surfer, char const * message, gboolean * confirmed) } +/* surfer_console_message */ +void surfer_console_message(Surfer * surfer, char const * message, + char const * source, long line) +{ + GtkTreeIter iter; + char buf[32] = ""; + + if(line < 0) + line = -1; + else + snprintf(buf, sizeof(buf), "%ld", line); + gtk_list_store_append(surfer->co_store, &iter); + gtk_list_store_set(surfer->co_store, &iter, SCM_MESSAGE, message, + SCM_SOURCE, source, + (line >= 0) ? SCM_LINE : -1, line, + SCM_DISPLAY_LINE, buf, + -1); +} + + /* surfer_download */ void surfer_download(Surfer * surfer, char const * url, char const * suggested) { @@ -966,6 +999,53 @@ void surfer_select_all(Surfer * surfer) } +/* surfer_show_console */ +void surfer_show_console(Surfer * surfer, gboolean show) +{ + GtkWidget * vbox; + GtkWidget * widget; + GtkCellRenderer * renderer; + GtkTreeViewColumn * column; + + if(surfer->co_window != NULL) + { + if(show == TRUE) + gtk_widget_show(surfer->co_window); + else + gtk_widget_hide(surfer->co_window); + return; + } + surfer->co_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size(GTK_WINDOW(surfer->co_window), 400, 300); + gtk_window_set_title(GTK_WINDOW(surfer->co_window), + _("Javascript console")); + g_signal_connect_swapped(G_OBJECT(surfer->co_window), "delete-event", + G_CALLBACK(on_console_closex), surfer); + vbox = gtk_vbox_new(FALSE, 0); + widget = gtk_tree_view_new_with_model(GTK_TREE_MODEL( + surfer->co_store)); + /* message */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Message", + renderer, "text", SCM_MESSAGE, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(widget), column); + /* source */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Source", + renderer, "text", SCM_SOURCE, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(widget), column); + /* line */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Line", + renderer, "text", SCM_DISPLAY_LINE, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(widget), column); + gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 0); + gtk_container_add(GTK_CONTAINER(surfer->co_window), vbox); + gtk_widget_show_all(vbox); + surfer_show_console(surfer, show); +} + + /* surfer_show_menubar */ void surfer_show_menubar(Surfer * surfer, gboolean show) { diff --git a/src/surfer.h b/src/surfer.h index 91a238d..2103dc9 100644 --- a/src/surfer.h +++ b/src/surfer.h @@ -66,6 +66,8 @@ int surfer_config_load(Surfer * surfer); int surfer_config_save(Surfer * surfer); int surfer_confirm(Surfer * surfer, char const * message, gboolean * confirmed); +void surfer_console_message(Surfer * surfer, char const * message, + char const * source, long line); int surfer_error(Surfer * surfer, char const * message, int ret); int surfer_prompt(Surfer * surfer, char const * message, char const * default_value, char ** value); @@ -87,6 +89,7 @@ void surfer_download(Surfer * surfer, char const * url, char const * suggested); /* interface */ void surfer_resize(Surfer * surfer, gint width, gint height); +void surfer_show_console(Surfer * surfer, gboolean show); void surfer_show_menubar(Surfer * surfer, gboolean show); void surfer_show_statusbar(Surfer * surfer, gboolean show); void surfer_show_toolbar(Surfer * surfer, gboolean show);