Fixed handling of Javascript interactions

This commit is contained in:
Pierre Pronchery 2010-04-21 01:30:02 +00:00
parent 9456d61b91
commit 2e3102e0e0
3 changed files with 79 additions and 20 deletions

View File

@ -44,10 +44,13 @@ static void _on_load_progress_changed(WebKitWebView * view, gint progress,
gpointer data);
static void _on_load_started(WebKitWebView * view, WebKitWebFrame * frame,
gpointer data);
static void _on_script_alert(WebKitWebView * view, WebKitWebFrame * frame,
gchar * message, gpointer data);
static gboolean _on_script_alert(WebKitWebView * view, WebKitWebFrame * frame,
const gchar * message, gpointer data);
static gboolean _on_script_confirm(WebKitWebView * view, WebKitWebFrame * frame,
gchar * message, gboolean confirmed, gpointer data);
const gchar * message, gboolean * confirmed, gpointer data);
static gboolean _on_script_prompt(WebKitWebView * view, WebKitWebFrame * frame,
const gchar * message, const gchar * default_value,
gchar ** value, gpointer data);
static void _on_status_bar_text_changed(WebKitWebView * view, gchar * arg1,
gpointer data);
static void _on_title_changed(WebKitWebView * view, WebKitWebFrame * frame,
@ -89,6 +92,8 @@ GtkWidget * ghtml_new(Surfer * surfer)
_on_script_alert), widget);
g_signal_connect(G_OBJECT(view), "script-confirm", G_CALLBACK(
_on_script_confirm), widget);
g_signal_connect(G_OBJECT(view), "script-prompt", G_CALLBACK(
_on_script_prompt), widget);
g_signal_connect(G_OBJECT(view), "status-bar-text-changed", G_CALLBACK(
_on_status_bar_text_changed), widget);
g_signal_connect(G_OBJECT(view), "title-changed", G_CALLBACK(
@ -464,23 +469,39 @@ static void _on_load_started(WebKitWebView * view, WebKitWebFrame * frame,
/* on_script_alert */
static void _on_script_alert(WebKitWebView * view, WebKitWebFrame * frame,
gchar * message, gpointer data)
static gboolean _on_script_alert(WebKitWebView * view, WebKitWebFrame * frame,
const gchar * message, gpointer data)
{
Surfer * surfer;
surfer = g_object_get_data(G_OBJECT(data), "surfer");
surfer_warning(surfer, message);
return TRUE;
}
static gboolean _on_script_confirm(WebKitWebView * view, WebKitWebFrame * frame,
gchar * message, gboolean confirmed, gpointer data)
const gchar * message, gboolean * confirmed, gpointer data)
{
Surfer * surfer;
surfer = g_object_get_data(G_OBJECT(data), "surfer");
return surfer_confirm(surfer, message);
if(surfer_confirm(surfer, message, confirmed) != 0)
*confirmed = FALSE;
return TRUE;
}
static gboolean _on_script_prompt(WebKitWebView * view, WebKitWebFrame * frame,
const gchar * message, const gchar * default_value,
gchar ** value, gpointer data)
{
Surfer * surfer;
surfer = g_object_get_data(G_OBJECT(data), "surfer");
if(surfer_prompt(surfer, message, default_value, value) == 0)
return TRUE;
*value = NULL;
return TRUE;
}

View File

@ -543,10 +543,11 @@ int surfer_config_save(Surfer * surfer)
/* surfer_confirm */
int surfer_confirm(Surfer * surfer, char const * message)
int surfer_confirm(Surfer * surfer, char const * message, gboolean * confirmed)
{
int ret;
int ret = 0;
GtkWidget * dialog;
int res;
dialog = gtk_message_dialog_new((surfer != NULL)
? GTK_WINDOW(surfer->window) : NULL,
@ -556,11 +557,15 @@ int surfer_confirm(Surfer * surfer, char const * message)
gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
"%s", message);
gtk_window_set_title(GTK_WINDOW(dialog), _("Question"));
g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(
gtk_widget_destroy), NULL);
ret = gtk_dialog_run(GTK_DIALOG(dialog));
res = gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
return (ret == GTK_RESPONSE_YES) ? 1 : 0;
if(res == GTK_RESPONSE_YES)
*confirmed = TRUE;
else if(res == GTK_RESPONSE_NO)
*confirmed = FALSE;
else
ret = 1;
return ret;
}
@ -607,9 +612,8 @@ int surfer_error(Surfer * surfer, char const * message, int ret)
gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
"%s", (message != NULL) ? message : _("Unknown error"));
gtk_window_set_title(GTK_WINDOW(dialog), _("Error"));
g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(
gtk_widget_destroy), NULL);
gtk_widget_show(dialog);
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
return ret;
}
@ -843,6 +847,39 @@ void surfer_print(Surfer * surfer)
}
/* surfer_prompt */
int surfer_prompt(Surfer * surfer, char const * message,
char const * default_value, char ** value)
{
int ret = 0;
GtkWidget * dialog;
GtkWidget * vbox;
GtkWidget * entry;
int res;
dialog = gtk_message_dialog_new((surfer != NULL)
? GTK_WINDOW(surfer->window) : NULL,
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, "%s",
_("Question"));
gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
"%s", message);
gtk_window_set_title(GTK_WINDOW(dialog), _("Question"));
vbox = GTK_DIALOG(dialog)->vbox;
entry = gtk_entry_new();
if(default_value != NULL)
gtk_entry_set_text(GTK_ENTRY(entry), default_value);
gtk_widget_show(entry);
gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, TRUE, 0);
if((res = gtk_dialog_run(GTK_DIALOG(dialog))) == GTK_RESPONSE_OK)
*value = strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
else
ret = 1;
gtk_widget_destroy(dialog);
return ret;
}
/* surfer_refresh */
void surfer_refresh(Surfer * surfer)
{
@ -1074,9 +1111,8 @@ void surfer_warning(Surfer * surfer, char const * message)
gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
"%s", message);
gtk_window_set_title(GTK_WINDOW(dialog), _("Warning"));
g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(
gtk_widget_destroy), NULL);
gtk_widget_show(dialog);
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
}

View File

@ -65,8 +65,10 @@ void surfer_set_title(Surfer * surfer, char const * title);
int surfer_config_load(Surfer * surfer);
int surfer_config_save(Surfer * surfer);
int surfer_confirm(Surfer * surfer, char const * message);
int surfer_confirm(Surfer * surfer, char const * message, gboolean * confirmed);
int surfer_error(Surfer * surfer, char const * message, int ret);
int surfer_prompt(Surfer * surfer, char const * message,
char const * default_value, char ** value);
void surfer_warning(Surfer * surfer, char const * message);
void surfer_open(Surfer * surfer, char const * url);