viking

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

commit 2f048f324efd79e1a0b74535aeaf677e9934694f
parent 094fb4db8c6b03dc41ee1859d1de91f10caf5096
Author: Kyle Milz <kmilz@ucalgary.ca>
Date:   Mon, 17 Dec 2012 14:21:34 -0700

buffer: split out callbacks into seperate file

Diffstat:
Msrc/Makefile | 2+-
Msrc/buffer.c | 422++-----------------------------------------------------------------------------
Asrc/buffer_callback.c | 481+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/buffer_callback.h | 14++++++++++++++
4 files changed, 504 insertions(+), 415 deletions(-)

diff --git a/src/Makefile b/src/Makefile @@ -1,7 +1,7 @@ TARGET = viking # Objectfiles, needed for $(TARGET) -OBJ = main.o utilities.o commands.o jsmn.o viking_state.o window.o buffer.o download.o +OBJ = main.o utilities.o commands.o jsmn.o viking_state.o window.o buffer.o download.o buffer_callback.o # Manpages MAN1 = evi2.1 MAN5 = evirc.5 diff --git a/src/buffer.c b/src/buffer.c @@ -9,37 +9,16 @@ #include "commands.h" #include "window.h" #include "buffer.h" +#include "buffer_callback.h" #include "download.h" -typedef struct { - Evas_Object *popup; - Ewk_Auth_Request *request; - Evas_Object *username_entry; - Evas_Object *password_entry; -} AuthData; - Ewk_View_Smart_Class* miniBrowserViewSmartClass(void) { static Ewk_View_Smart_Class ewkViewClass = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("MiniBrowser_View"); return &ewkViewClass; } - static void -quit_event_loop(void *user_data, Evas_Object *obj, void *event_info) -{ - ecore_main_loop_quit(); -} - - static void -on_ok_clicked(void *user_data, Evas_Object *obj, void *event_info) -{ - Eina_Bool *confirmed = (Eina_Bool *)user_data; - *confirmed = EINA_TRUE; - - ecore_main_loop_quit(); -} - /* static Browser_Window *browser_view_find(Evas_Object *view) { @@ -58,398 +37,6 @@ static Browser_Window *browser_view_find(Evas_Object *view) } */ -static void -on_javascript_alert(Ewk_View_Smart_Data *smartData, const char *message) -{ - // Browser_Window *window = browser_view_find(smartData->self); - Evas_Object *win = smartData->self; - - Evas_Object *alert_popup = elm_popup_add(win); - evas_object_size_hint_weight_set(alert_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_text_set(alert_popup, message); - elm_object_part_text_set(alert_popup, "title,text", "Alert"); - - /* Popup buttons */ - Evas_Object *button = elm_button_add(alert_popup); - elm_object_text_set(button, "OK"); - elm_object_part_content_set(alert_popup, "button1", button); - evas_object_smart_callback_add(button, "clicked", quit_event_loop, NULL); - elm_object_focus_set(button, EINA_TRUE); - evas_object_show(alert_popup); - - /* Make modal */ - ecore_main_loop_begin(); - - evas_object_del(alert_popup); -} - -static Eina_Bool -on_javascript_confirm(Ewk_View_Smart_Data *smartData, const char *message) -{ - // Browser_Window *window = browser_view_find(smartData->self); - Evas_Object *win = smartData->self; - - Eina_Bool ok = EINA_FALSE; - - Evas_Object *confirm_popup = elm_popup_add(win); - evas_object_size_hint_weight_set(confirm_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_text_set(confirm_popup, message); - elm_object_part_text_set(confirm_popup, "title,text", "Confirmation"); - - /* Popup buttons */ - Evas_Object *cancel_button = elm_button_add(confirm_popup); - elm_object_text_set(cancel_button, "Cancel"); - elm_object_part_content_set(confirm_popup, "button1", cancel_button); - evas_object_smart_callback_add(cancel_button, "clicked", quit_event_loop, NULL); - Evas_Object *ok_button = elm_button_add(confirm_popup); - elm_object_text_set(ok_button, "OK"); - elm_object_part_content_set(confirm_popup, "button2", ok_button); - evas_object_smart_callback_add(ok_button, "clicked", on_ok_clicked, &ok); - elm_object_focus_set(ok_button, EINA_TRUE); - evas_object_show(confirm_popup); - - /* Make modal */ - ecore_main_loop_begin(); - - evas_object_del(confirm_popup); - - return ok; -} - -static const char * -on_javascript_prompt(Ewk_View_Smart_Data *smartData, const char *message, const char *default_value) -{ - // Browser_Window *window = browser_view_find(smartData->self); - Evas_Object *win = smartData->self; - - Eina_Bool ok = EINA_FALSE; - - Evas_Object *prompt_popup = elm_popup_add(win); - evas_object_size_hint_weight_set(prompt_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_part_text_set(prompt_popup, "title,text", "Prompt"); - - /* Popup Content */ - Evas_Object *box = elm_box_add(win); - elm_box_padding_set(box, 0, 4); - evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(box); - - Evas_Object *prompt = elm_label_add(win); - elm_object_text_set(prompt, message); - evas_object_size_hint_weight_set(prompt, EVAS_HINT_EXPAND, 0.0); - evas_object_size_hint_align_set(prompt, EVAS_HINT_FILL, 0.5); - elm_box_pack_end(box, prompt); - evas_object_show(prompt); - - Evas_Object *entry = elm_entry_add(win); - elm_entry_scrollable_set(entry, EINA_TRUE); - elm_entry_single_line_set(entry, EINA_TRUE); - elm_entry_text_style_user_push(entry, "DEFAULT='font_size=18'"); - elm_entry_entry_set(entry, default_value ? default_value : ""); - elm_entry_select_all(entry); - evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0); - evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.5); - elm_box_pack_end(box, entry); - elm_object_focus_set(entry, EINA_TRUE); - evas_object_show(entry); - - elm_object_content_set(prompt_popup, box); - - /* Popup buttons */ - Evas_Object *cancel_button = elm_button_add(prompt_popup); - elm_object_text_set(cancel_button, "Cancel"); - elm_object_part_content_set(prompt_popup, "button1", cancel_button); - evas_object_smart_callback_add(cancel_button, "clicked", quit_event_loop, NULL); - Evas_Object *ok_button = elm_button_add(prompt_popup); - elm_object_text_set(ok_button, "OK"); - elm_object_part_content_set(prompt_popup, "button2", ok_button); - evas_object_smart_callback_add(ok_button, "clicked", on_ok_clicked, &ok); - evas_object_show(prompt_popup); - - /* Make modal */ - ecore_main_loop_begin(); - - /* The return string need to be stringshared */ - const char *prompt_text = ok ? eina_stringshare_add(elm_entry_entry_get(entry)) : NULL; - evas_object_del(prompt_popup); - - return prompt_text; -} - -static Eina_Bool on_window_geometry_get(Ewk_View_Smart_Data *sd, Evas_Coord *x, Evas_Coord *y, Evas_Coord *width, Evas_Coord *height) -{ - // Browser_Window *window = browser_view_find(sd->self); - Evas_Object *win = sd->self; - - evas_object_geometry_get(win, x, y, width, height); - - return EINA_TRUE; -} - -static Eina_Bool on_window_geometry_set(Ewk_View_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_Coord width, Evas_Coord height) -{ - // Browser_Window *window = browser_view_find(sd->self); - Evas_Object *win = sd->self; - - evas_object_move(win, x, y); - evas_object_resize(win, width, height); - - return EINA_TRUE; -} - -static void -webprocess_crashed_cb(void *data, Evas_Object *obj, void *event_info) -{ - Window_Data *wd = data; - Eina_Bool *handled = event_info; - - const char html[] = "\ -<html>\ - <head>\ - <style type=\"text/css\">\ - body {\ - background-color: #660000;\ - color: white;\ - font-family: monospace;\ - font-size: 36px;\ - position: absolute;\ - top: 50%;\ - }\ - </style>\ - </head>\ - <body>\ - <h1>\ - Uh oh web process crashed!\ - </h1>\ - </body>\ -</html>"; - - ewk_view_html_string_load(wd->cur_buf->view, html, NULL, ewk_view_url_get(wd->cur_buf->view)); - *handled = EINA_TRUE; -} - -static void -auth_popup_close(AuthData *auth_data) -{ - ewk_object_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_object_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 -on_tooltip_text_set(void *user_data, Evas_Object *obj, void *event_info) -{ - Window_Data *wd = user_data; - const char* message = (const char*)event_info; - - elm_object_tooltip_text_set(wd->cur_buf->view, message); - elm_object_tooltip_show(wd->cur_buf->view); -} - -static void -on_tooltip_text_unset(void *user_data, Evas_Object *obj, void *event_info) -{ - Window_Data *wd = user_data; - - elm_object_tooltip_unset(wd->cur_buf->view); -} - -typedef struct { - Evas_Object *parent; - Evas_Object *window; - Ewk_File_Chooser_Request *request; -} FileSelectorData; - -static void on_filepicker_parent_deletion(void *user_data, Evas *evas, Evas_Object *window, void *event); - -static void close_file_picker(FileSelectorData* fs_data) -{ - evas_object_event_callback_del(fs_data->parent, EVAS_CALLBACK_DEL, on_filepicker_parent_deletion); - evas_object_del(fs_data->window); - ewk_object_unref(fs_data->request); - free(fs_data); -} - - static void -on_filepicker_parent_deletion(void *user_data, Evas *evas, Evas_Object *window, void *event) -{ - close_file_picker((FileSelectorData *)user_data); -} - - static void -on_filepicker_deletion(void *user_data, Evas_Object *window, void *event_info) -{ - close_file_picker((FileSelectorData *)user_data); -} - - static void -on_fileselector_done(void *user_data, Evas_Object *file_selector, void *event_info) -{ - FileSelectorData *fs_data = (FileSelectorData *)user_data; - - const char *selected = (const char *)event_info; - if (selected && *selected) - ewk_file_chooser_request_file_choose(fs_data->request, selected); - - close_file_picker(fs_data); -} - - static void -on_file_chooser_request(void *user_data, Evas_Object *webview, void *event_info) -{ - // Browser_Window *app_data = (Browser_Window *)user_data; - Window_Data *wd = user_data; - Ewk_File_Chooser_Request *request = (Ewk_File_Chooser_Request *)event_info; - - // Show basic file picker which does not currently support multiple files - // or MIME type filtering. - Evas_Object *window = elm_win_add(wd->win, "file-picker-window", ELM_WIN_DIALOG_BASIC); - elm_win_title_set(window, "File picker"); - elm_win_modal_set(window, EINA_TRUE); - - FileSelectorData* fs_data = (FileSelectorData*)malloc(sizeof(FileSelectorData)); - fs_data->parent = wd->win; - fs_data->window = window; - fs_data->request = ewk_object_ref(request); - evas_object_smart_callback_add(window, "delete,request", on_filepicker_deletion, fs_data); - evas_object_event_callback_add(wd->win, EVAS_CALLBACK_DEL, on_filepicker_parent_deletion, fs_data); - - Evas_Object *file_selector = elm_fileselector_add(window); - const char *home_path = getenv("HOME"); - elm_fileselector_path_set(file_selector, home_path ? home_path : "/home"); - evas_object_size_hint_weight_set(file_selector, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_win_resize_object_add(window, file_selector); - evas_object_show(file_selector); - - evas_object_smart_callback_add(file_selector, "done", on_fileselector_done, fs_data); - - evas_object_resize(window, 400, 400); - elm_win_center(window, EINA_TRUE, EINA_TRUE); - evas_object_show(window); -} - - /* static void @@ -965,11 +552,14 @@ buffer_add(const unsigned char flags, Window_Data *wd, const char *url, Session_ #if 1 Ewk_View_Smart_Class *ewkViewClass = miniBrowserViewSmartClass(); + /* located in buffer_callback.c */ ewkViewClass->run_javascript_alert = on_javascript_alert; ewkViewClass->run_javascript_confirm = on_javascript_confirm; ewkViewClass->run_javascript_prompt = on_javascript_prompt; ewkViewClass->window_geometry_get = on_window_geometry_get; ewkViewClass->window_geometry_set = on_window_geometry_set; + // ewkViewClass->fullscreen_enter = on_fullscreen_enter; + // ewkViewClass->fullscreen_exit = on_fullscreen_exit; Evas *evas = evas_object_evas_get(wd->win); Evas_Smart *smart = evas_smart_class_new(&ewkViewClass->sc); @@ -982,9 +572,11 @@ buffer_add(const unsigned char flags, Window_Data *wd, const char *url, Session_ #endif settings = ewk_view_settings_get(bd->view); + ewk_settings_file_access_from_file_urls_allowed_set(settings, EINA_TRUE); ewk_settings_dns_prefetching_enabled_set(settings, EINA_TRUE); ewk_settings_developer_extras_enabled_set(settings, EINA_TRUE); ewk_settings_frame_flattening_enabled_set(settings, EINA_TRUE); + ewk_settings_preferred_minimum_contents_width_set(settings, 0); ewk_settings_continuous_spell_checking_enabled_set(EINA_TRUE); evas_object_size_hint_weight_set(bd->view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -999,6 +591,8 @@ 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); + + /* misc callbacks - buffer_callback.c */ evas_object_smart_callback_add(v, "webprocess,crashed", webprocess_crashed_cb, wd); evas_object_smart_callback_add(v, "authentication,request", on_authentication_request, wd); evas_object_smart_callback_add(v, "tooltip,text,set", on_tooltip_text_set, wd); diff --git a/src/buffer_callback.c b/src/buffer_callback.c @@ -0,0 +1,481 @@ + +#include <Elementary.h> +#include <EWebKit2.h> + +#include "viking_state.h" +#include "viking.h" +#include "buffer_callback.h" + + +typedef struct { + Evas_Object *popup; + Ewk_Auth_Request *request; + Evas_Object *username_entry; + Evas_Object *password_entry; +} AuthData; + +static void +on_ok_clicked(void *user_data, Evas_Object *obj, void *event_info) +{ + Eina_Bool *confirmed = (Eina_Bool *)user_data; + *confirmed = EINA_TRUE; + + ecore_main_loop_quit(); +} + +static void +quit_event_loop(void *user_data, Evas_Object *obj, void *event_info) +{ + ecore_main_loop_quit(); +} + +void +on_javascript_alert(Ewk_View_Smart_Data *smartData, const char *message) +{ + // Browser_Window *window = browser_view_find(smartData->self); + Evas_Object *win = smartData->self; + + Evas_Object *alert_popup = elm_popup_add(win); + evas_object_size_hint_weight_set(alert_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(alert_popup, message); + elm_object_part_text_set(alert_popup, "title,text", "Alert"); + + /* Popup buttons */ + Evas_Object *button = elm_button_add(alert_popup); + elm_object_text_set(button, "OK"); + elm_object_part_content_set(alert_popup, "button1", button); + evas_object_smart_callback_add(button, "clicked", quit_event_loop, NULL); + elm_object_focus_set(button, EINA_TRUE); + evas_object_show(alert_popup); + + /* Make modal */ + ecore_main_loop_begin(); + + evas_object_del(alert_popup); +} + +Eina_Bool +on_javascript_confirm(Ewk_View_Smart_Data *smartData, const char *message) +{ + // Browser_Window *window = browser_view_find(smartData->self); + Evas_Object *win = smartData->self; + + Eina_Bool ok = EINA_FALSE; + + Evas_Object *confirm_popup = elm_popup_add(win); + evas_object_size_hint_weight_set(confirm_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(confirm_popup, message); + elm_object_part_text_set(confirm_popup, "title,text", "Confirmation"); + + /* Popup buttons */ + Evas_Object *cancel_button = elm_button_add(confirm_popup); + elm_object_text_set(cancel_button, "Cancel"); + elm_object_part_content_set(confirm_popup, "button1", cancel_button); + evas_object_smart_callback_add(cancel_button, "clicked", quit_event_loop, NULL); + Evas_Object *ok_button = elm_button_add(confirm_popup); + elm_object_text_set(ok_button, "OK"); + elm_object_part_content_set(confirm_popup, "button2", ok_button); + evas_object_smart_callback_add(ok_button, "clicked", on_ok_clicked, &ok); + elm_object_focus_set(ok_button, EINA_TRUE); + evas_object_show(confirm_popup); + + /* Make modal */ + ecore_main_loop_begin(); + + evas_object_del(confirm_popup); + + return ok; +} + +const char * +on_javascript_prompt(Ewk_View_Smart_Data *smartData, const char *message, const char *default_value) +{ + // Browser_Window *window = browser_view_find(smartData->self); + Evas_Object *win = smartData->self; + + Eina_Bool ok = EINA_FALSE; + + Evas_Object *prompt_popup = elm_popup_add(win); + evas_object_size_hint_weight_set(prompt_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_text_set(prompt_popup, "title,text", "Prompt"); + + /* Popup Content */ + Evas_Object *box = elm_box_add(win); + elm_box_padding_set(box, 0, 4); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + Evas_Object *prompt = elm_label_add(win); + elm_object_text_set(prompt, message); + evas_object_size_hint_weight_set(prompt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(prompt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(box, prompt); + evas_object_show(prompt); + + Evas_Object *entry = elm_entry_add(win); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_text_style_user_push(entry, "DEFAULT='font_size=18'"); + elm_entry_entry_set(entry, default_value ? default_value : ""); + elm_entry_select_all(entry); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(box, entry); + elm_object_focus_set(entry, EINA_TRUE); + evas_object_show(entry); + + elm_object_content_set(prompt_popup, box); + + /* Popup buttons */ + Evas_Object *cancel_button = elm_button_add(prompt_popup); + elm_object_text_set(cancel_button, "Cancel"); + elm_object_part_content_set(prompt_popup, "button1", cancel_button); + evas_object_smart_callback_add(cancel_button, "clicked", quit_event_loop, NULL); + Evas_Object *ok_button = elm_button_add(prompt_popup); + elm_object_text_set(ok_button, "OK"); + elm_object_part_content_set(prompt_popup, "button2", ok_button); + evas_object_smart_callback_add(ok_button, "clicked", on_ok_clicked, &ok); + evas_object_show(prompt_popup); + + /* Make modal */ + ecore_main_loop_begin(); + + /* The return string need to be stringshared */ + const char *prompt_text = ok ? eina_stringshare_add(elm_entry_entry_get(entry)) : NULL; + evas_object_del(prompt_popup); + + return prompt_text; +} + +Eina_Bool +on_window_geometry_get(Ewk_View_Smart_Data *sd, Evas_Coord *x, Evas_Coord *y, Evas_Coord *width, Evas_Coord *height) +{ + // Browser_Window *window = browser_view_find(sd->self); + Evas_Object *win = sd->self; + + evas_object_geometry_get(win, x, y, width, height); + + return EINA_TRUE; +} + +Eina_Bool +on_window_geometry_set(Ewk_View_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_Coord width, Evas_Coord height) +{ + // Browser_Window *window = browser_view_find(sd->self); + Evas_Object *win = sd->self; + + evas_object_move(win, x, y); + evas_object_resize(win, width, height); + + return EINA_TRUE; +} + +#if 0 +typedef struct { + Evas_Object *webview; + Evas_Object *permission_popup; +} PermissionData; + + static void +on_fullscreen_accept(void *user_data, Evas_Object *obj, void *event_info) +{ + PermissionData *permission_data = (PermissionData *)user_data; + + evas_object_del(permission_data->permission_popup); + free(permission_data); +} + + static void +on_fullscreen_deny(void *user_data, Evas_Object *obj, void *event_info) +{ + PermissionData *permission_data = (PermissionData *)user_data; + + ewk_view_fullscreen_exit(permission_data->webview); + evas_object_del(permission_data->permission_popup); + free(permission_data); +} + +static Eina_Bool on_fullscreen_enter(Ewk_View_Smart_Data *sd, Ewk_Security_Origin *origin) +{ + // Browser_Window *window = browser_view_find(sd->self); + Evas_Object *win = sd->self; + + /* Go fullscreen */ + elm_win_fullscreen_set(win, EINA_TRUE); + + /* Show user popup */ + Evas_Object *permission_popup = elm_popup_add(win); + evas_object_size_hint_weight_set(permission_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + Eina_Strbuf *message = eina_strbuf_new(); + eina_strbuf_append_printf(message, "%s is now fullscreen.<br>Press ESC at any time to exit fullscreen.<br>Allow fullscreen?", ewk_security_origin_host_get(origin)); + elm_object_text_set(permission_popup, eina_strbuf_string_get(message)); + eina_strbuf_free(message); + elm_object_part_text_set(permission_popup, "title,text", "Fullscreen Permission"); + + /* Popup buttons */ + PermissionData *permission_data = (PermissionData *)malloc(sizeof(PermissionData)); + permission_data->webview = window->webview; + permission_data->permission_popup = permission_popup; + Evas_Object *accept_button = elm_button_add(permission_popup); + elm_object_text_set(accept_button, "Accept"); + elm_object_part_content_set(permission_popup, "button1", accept_button); + evas_object_smart_callback_add(accept_button, "clicked", on_fullscreen_accept, permission_data); + + Evas_Object *deny_button = elm_button_add(permission_popup); + elm_object_text_set(deny_button, "Deny"); + elm_object_part_content_set(permission_popup, "button2", deny_button); + evas_object_smart_callback_add(deny_button, "clicked", on_fullscreen_deny, permission_data); + + evas_object_show(permission_popup); + + return EINA_TRUE; +} + +static Eina_Bool on_fullscreen_exit(Ewk_View_Smart_Data *sd) +{ + // Browser_Window *window = browser_view_find(sd->self); + Evas_Object *win = sd->self; + + elm_win_fullscreen_set(win, EINA_FALSE); + + return EINA_TRUE; +} +#endif + +void +webprocess_crashed_cb(void *data, Evas_Object *obj, void *event_info) +{ + Window_Data *wd = data; + // Eina_Bool *handled = event_info; + + const char script[] = "\ + var txtNode = document.createTextNode(\"Helllllllllllllllllloooooooooo\");\ + document.appendChild(txtNode);"; + + ewk_view_script_execute(wd->cur_buf->view, script, NULL, NULL); + /* *handled = EINA_TRUE; try this in callback maybe? */ +} + +static void +auth_popup_close(AuthData *auth_data) +{ + ewk_object_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); +} + +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_object_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); +} + +void +on_tooltip_text_set(void *user_data, Evas_Object *obj, void *event_info) +{ + Window_Data *wd = user_data; + const char* message = (const char*)event_info; + + elm_object_tooltip_text_set(wd->cur_buf->view, message); + elm_object_tooltip_show(wd->cur_buf->view); +} + +void +on_tooltip_text_unset(void *user_data, Evas_Object *obj, void *event_info) +{ + Window_Data *wd = user_data; + + elm_object_tooltip_unset(wd->cur_buf->view); +} + +typedef struct { + Evas_Object *parent; + Evas_Object *window; + Ewk_File_Chooser_Request *request; +} FileSelectorData; + +static void on_filepicker_parent_deletion(void *user_data, Evas *evas, Evas_Object *window, void *event); + +static void close_file_picker(FileSelectorData* fs_data) +{ + evas_object_event_callback_del(fs_data->parent, EVAS_CALLBACK_DEL, on_filepicker_parent_deletion); + evas_object_del(fs_data->window); + ewk_object_unref(fs_data->request); + free(fs_data); +} + +static void +on_filepicker_parent_deletion(void *user_data, Evas *evas, Evas_Object *window, void *event) +{ + close_file_picker((FileSelectorData *)user_data); +} + +static void +on_filepicker_deletion(void *user_data, Evas_Object *window, void *event_info) +{ + close_file_picker((FileSelectorData *)user_data); +} + +static void +on_fileselector_done(void *user_data, Evas_Object *file_selector, void *event_info) +{ + FileSelectorData *fs_data = (FileSelectorData *)user_data; + + const char *selected = (const char *)event_info; + if (selected && *selected) + ewk_file_chooser_request_file_choose(fs_data->request, selected); + + close_file_picker(fs_data); +} + +void +on_file_chooser_request(void *user_data, Evas_Object *webview, void *event_info) +{ + // Browser_Window *app_data = (Browser_Window *)user_data; + Window_Data *wd = user_data; + Ewk_File_Chooser_Request *request = (Ewk_File_Chooser_Request *)event_info; + + // Show basic file picker which does not currently support multiple files + // or MIME type filtering. + Evas_Object *window = elm_win_add(wd->win, "file-picker-window", ELM_WIN_DIALOG_BASIC); + elm_win_title_set(window, "File picker"); + elm_win_modal_set(window, EINA_TRUE); + + FileSelectorData* fs_data = (FileSelectorData*)malloc(sizeof(FileSelectorData)); + fs_data->parent = wd->win; + fs_data->window = window; + fs_data->request = ewk_object_ref(request); + evas_object_smart_callback_add(window, "delete,request", on_filepicker_deletion, fs_data); + evas_object_event_callback_add(wd->win, EVAS_CALLBACK_DEL, on_filepicker_parent_deletion, fs_data); + + Evas_Object *file_selector = elm_fileselector_add(window); + const char *home_path = getenv("HOME"); + elm_fileselector_path_set(file_selector, home_path ? home_path : "/home"); + evas_object_size_hint_weight_set(file_selector, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(window, file_selector); + evas_object_show(file_selector); + + evas_object_smart_callback_add(file_selector, "done", on_fileselector_done, fs_data); + + evas_object_resize(window, 400, 400); + elm_win_center(window, EINA_TRUE, EINA_TRUE); + evas_object_show(window); +} + + diff --git a/src/buffer_callback.h b/src/buffer_callback.h @@ -0,0 +1,14 @@ + + +void on_javascript_alert(Ewk_View_Smart_Data *smartData, const char *message); +Eina_Bool on_javascript_confirm(Ewk_View_Smart_Data *smartData, const char *message); +const char *on_javascript_prompt(Ewk_View_Smart_Data *smartData, const char *message, const char *default_value); +Eina_Bool on_window_geometry_get(Ewk_View_Smart_Data *sd, Evas_Coord *x, Evas_Coord *y, Evas_Coord *width, Evas_Coord *height); +Eina_Bool on_window_geometry_set(Ewk_View_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_Coord width, Evas_Coord height); + +void webprocess_crashed_cb(void *data, Evas_Object *obj, void *event_info); +void on_authentication_request(void *user_data, Evas_Object *obj, void *event_info); +void on_tooltip_text_set(void *user_data, Evas_Object *obj, void *event_info); +void on_tooltip_text_unset(void *user_data, Evas_Object *obj, void *event_info); +void on_file_chooser_request(void *user_data, Evas_Object *webview, void *event_info); +