viking

webkit based web browser for Enlightenment
Log | Files | Refs | LICENSE

commit 3128a45380b8bda4308b29194370a72ec34f42b6
parent b35f5861de4438eee7922a598f9b7d226fb4bcaa
Author: Kyle Milz <kmilz@ucalgary.ca>
Date:   Mon,  5 Nov 2012 12:45:05 -0700

auth: use http auth popup from webkit's MiniBrowser

Diffstat:
Msrc/buffer.c | 136+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 136 insertions(+), 0 deletions(-)

diff --git a/src/buffer.c b/src/buffer.c @@ -11,6 +11,13 @@ #include "buffer.h" +typedef struct { + Evas_Object *popup; + Ewk_Auth_Request *request; + Evas_Object *username_entry; + Evas_Object *password_entry; +} AuthData; + static void webprocess_crashed_cb(void *data, Evas_Object *obj, void *event_info) @@ -43,6 +50,134 @@ webprocess_crashed_cb(void *data, Evas_Object *obj, void *event_info) *handled = EINA_TRUE; } +static void +auth_popup_close(AuthData *auth_data) +{ + ewk_auth_request_unref(auth_data->request); + evas_object_del(auth_data->popup); + free(auth_data); +} + +static void +on_auth_cancel(void *user_data, Evas_Object *obj, void *event_info) +{ + AuthData *auth_data = (AuthData *)user_data; + + ewk_auth_request_cancel(auth_data->request); + + auth_popup_close(auth_data); +} + +static void +on_auth_ok(void *user_data, Evas_Object *obj, void *event_info) +{ + AuthData *auth_data = (AuthData *)user_data; + + const char *username = elm_entry_entry_get(auth_data->username_entry); + const char *password = elm_entry_entry_get(auth_data->password_entry); + ewk_auth_request_authenticate(auth_data->request, username, password); + + auth_popup_close(auth_data); +} + +static void +on_authentication_request(void *user_data, Evas_Object *obj, void *event_info) +{ +// Browser_Window *window = (Browser_Window *)user_data; + Window_Data *wd = user_data; + Ewk_Auth_Request *request = ewk_auth_request_ref((Ewk_Auth_Request *)event_info); + + AuthData *auth_data = (AuthData *)malloc(sizeof(AuthData)); + auth_data->request = request; + + Evas_Object *auth_popup = elm_popup_add(wd->win); + auth_data->popup = auth_popup; + evas_object_size_hint_weight_set(auth_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_text_set(auth_popup, "title,text", "Authentication Required"); + + /* Popup Content */ + Evas_Object *vbox = elm_box_add(auth_popup); + elm_box_padding_set(vbox, 0, 4); + evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(vbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(auth_popup, vbox); + evas_object_show(vbox); + + /* Authentication message */ + Evas_Object *label = elm_label_add(auth_popup); + elm_label_line_wrap_set(label, ELM_WRAP_WORD); + Eina_Strbuf *auth_text = eina_strbuf_new(); + const char* host = ewk_auth_request_host_get(request); + const char* realm = ewk_auth_request_realm_get(request); + eina_strbuf_append_printf(auth_text, "A username and password are being requested by %s. The site says: \"%s\"", host, realm ? realm : ""); + elm_object_text_set(label, eina_strbuf_string_get(auth_text)); + eina_strbuf_free(auth_text); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(vbox, label); + evas_object_show(label); + + /* Credential table */ + Evas_Object *table = elm_table_add(auth_popup); + elm_table_padding_set(table, 2, 2); + elm_table_homogeneous_set(table, EINA_TRUE); + evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(vbox, table); + evas_object_show(table); + + /* Username row */ + Evas_Object *username_label = elm_label_add(auth_popup); + elm_object_text_set(username_label, "Username:"); + evas_object_size_hint_weight_set(username_label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(username_label, 1, EVAS_HINT_FILL); + elm_table_pack(table, username_label, 0, 0, 1, 1); + evas_object_show(username_label); + + Evas_Object *username_entry = elm_entry_add(auth_popup); + auth_data->username_entry = username_entry; + elm_entry_scrollable_set(username_entry, EINA_TRUE); + elm_entry_single_line_set(username_entry, EINA_TRUE); + elm_entry_text_style_user_push(username_entry, "DEFAULT='font_size=18'"); + const char *suggested_username = ewk_auth_request_suggested_username_get(request); + elm_entry_entry_set(username_entry, suggested_username ? suggested_username : ""); + evas_object_size_hint_weight_set(username_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(username_entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(table, username_entry, 1, 0, 2, 1); + elm_object_focus_set(username_entry, EINA_TRUE); + evas_object_show(username_entry); + + /* Password row */ + Evas_Object *password_label = elm_label_add(auth_popup); + elm_object_text_set(password_label, "Password:"); + evas_object_size_hint_weight_set(password_label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(password_label, 1, EVAS_HINT_FILL); + elm_table_pack(table, password_label, 0, 1, 1, 1); + evas_object_show(password_label); + + Evas_Object *password_entry = elm_entry_add(auth_popup); + auth_data->password_entry = password_entry; + elm_entry_scrollable_set(password_entry, EINA_TRUE); + elm_entry_single_line_set(password_entry, EINA_TRUE); + elm_entry_password_set(password_entry, EINA_TRUE); + elm_entry_text_style_user_push(password_entry, "DEFAULT='font_size=18'"); + evas_object_size_hint_weight_set(password_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(password_entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(table, password_entry, 1, 1, 2, 1); + evas_object_show(password_entry); + + /* Popup buttons */ + Evas_Object *cancel_button = elm_button_add(auth_popup); + elm_object_text_set(cancel_button, "Cancel"); + elm_object_part_content_set(auth_popup, "button1", cancel_button); + evas_object_smart_callback_add(cancel_button, "clicked", on_auth_cancel, auth_data); + Evas_Object *ok_button = elm_button_add(auth_popup); + elm_object_text_set(ok_button, "OK"); + elm_object_part_content_set(auth_popup, "button2", ok_button); + evas_object_smart_callback_add(ok_button, "clicked", on_auth_ok, auth_data); + evas_object_show(auth_popup); +} + /* static void webview_create_window_cb(void *data, Evas_Object *obj, Eina_Bool js, const Elm_Web_Window_Features *wf) @@ -703,6 +838,7 @@ buffer_add(const unsigned char flags, Window_Data *wd, const char *url, Session_ // elm_web_window_create_hook_set(td->web, webview_create_window_cb, td->window); // elm_web_console_message_hook_set(td->web, webview_console_cb, td); evas_object_smart_callback_add(v, "webprocess,crashed", webprocess_crashed_cb, wd); + evas_object_smart_callback_add(v, "authentication,request", on_authentication_request, wd); /* downloads */ evas_object_smart_callback_add(v, "download,request", download_request_cb, wd);