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:
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);
+