Implemented basic Javascript console

This commit is contained in:
Pierre Pronchery 2010-04-21 02:25:15 +00:00
parent 86bee02a06
commit a92edc3f72
6 changed files with 126 additions and 0 deletions

View File

@ -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)
{

View File

@ -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

View File

@ -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 */

View File

@ -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)

View File

@ -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)
{

View File

@ -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);