viking

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

commit 15e543c8ec89f728e6062e1e9a68348dc1b85b57
parent c4418f781d0ecb1e62dc4c801b94de53144e0905
Author: Kyle Milz <kmilz@ucalgary.ca>
Date:   Wed, 10 Oct 2012 14:12:27 -0600

implement link saving/visited links populate

new code in webkit2 allows access to populating the visited links array.
also move some functionality from main into callbacks.

Diffstat:
Msrc/callbacks.c | 92++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
Msrc/callbacks.h | 2+-
Msrc/main.c | 17+++--------------
Msrc/viking.h | 4++--
4 files changed, 72 insertions(+), 43 deletions(-)

diff --git a/src/callbacks.c b/src/callbacks.c @@ -167,22 +167,6 @@ webview_load_finished_cb(void *data, Evas_Object *obj, void *event_info) update_state(wd); - // printf("logging item to history.\n"); - Hist_Item *item; - App_Data *ad = wd->app; - const char *title = ewk_view_title_get(bd->view); - const char *url = ewk_view_url_get(bd->view); - item = hist_items_get(ad->history, url); - - if (item && hist_item_enabled_get(item)) { - hist_item_visit_count_set(item, hist_item_visit_count_get(item) + 1); - hist_item_last_visit_set(item, ecore_time_unix_get()); - hist_item_title_set(item, title); - } - else if (!item && config_enable_history_get(ad->config)) { - hist_items_add(ad->history, url, hist_item_new(EINA_TRUE, title, url, 1, ecore_time_unix_get())); - } - // userscript_hooks_end(elm_web_uri_get(td->web)); elm_object_focus_set(bd->web, EINA_TRUE); @@ -888,23 +872,58 @@ inputbox_changed_cb(void *data, Evas_Object *obj, void *event_info) } } -/* + static void -populate_visited_links_cb(void *data, Evas_Object *obj, void *event_info) +hist_nav_cb(const Evas_Object *view, Ewk_Navigation_Data *nav_data, void *data) { - Buffer_Data *bd = data; - App_Data *ad = bd->window->app; + // printf("logging item to history.\n"); + Hist_Item *item; + App_Data *ad = data; + const char *title = ewk_navigation_data_title_get(nav_data); + const char *url = ewk_navigation_data_url_get(nav_data); + item = hist_items_get(ad->history, url); + if (item && hist_item_enabled_get(item)) { + hist_item_visit_count_set(item, hist_item_visit_count_get(item) + 1); + hist_item_last_visit_set(item, ecore_time_unix_get()); + hist_item_title_set(item, title); + } + else if (!item && config_enable_history_get(ad->config)) { + hist_items_add(ad->history, url, hist_item_new(EINA_TRUE, title, url, 1, ecore_time_unix_get())); + } +} + +static void +hist_client_redir_cb(const Evas_Object *vew, const char *source_url, const char *dest_url, void *data) +{ + printf("client_redirecion() from %s to %s\n", source_url, dest_url); +} + +static void +hist_server_redir_cb(const Evas_Object *vew, const char *source_url, const char *dest_url, void *data) +{ + printf("server_redirecion() from %s to %s\n", source_url, dest_url); +} + +static void +hist_visited_cb(void *data) +{ + App_Data *ad = data; void *hash_data; Eina_Iterator *it = eina_hash_iterator_tuple_new(hist_items_hash_get(ad->history)); while (eina_iterator_next(it, &hash_data)) { Eina_Hash_Tuple *t = hash_data; Hist_Item *hist_item = t->data; - ewk_view_visited_link_add(bd->view, hist_item_url_get(hist_item)); + ewk_context_visited_link_add(ewk_context_default_get(), hist_item_url_get(hist_item)); } } -*/ + +static void +hist_title_updated_cb(const Evas_Object *vew, const char *title, const char *url, void *data) +{ + printf("title_update() %s has new title %s\n", url, title); +} static void _web_free_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) @@ -1004,7 +1023,6 @@ setup_buffer_callbacks(Buffer_Data *td) // evas_object_smart_callback_add(v, "inputmethod,changed", inputmethod_changed_cb, td); // evas_object_smart_callback_add(v, "inspector,view,create", webview_inspector_cb, td); // evas_object_smart_callback_add(v, "inspector,view,close", webview_inspector_close_cb, td); - // evas_object_smart_callback_add(v, "populate,visited,links", populate_visited_links_cb, td); /* input events */ evas_object_event_callback_add(v, EVAS_CALLBACK_FREE, _web_free_cb, td); @@ -1058,9 +1076,31 @@ generic_url_scheme_request_cb(Ewk_Url_Scheme_Request *request, void *user_data) } void -setup_url_scheme_callbacks(Ewk_Context *ewk_context) +setup_main_callbacks(App_Data *ad, const char *cookie_path) { int i; + Ewk_Cookie_Manager *cookie_manager; + Ewk_Context *context = ewk_context_default_get(); + + /* set cookie policy to use text file and no third party cookies */ + cookie_manager = ewk_context_cookie_manager_get(context); + ewk_cookie_manager_persistent_storage_set(cookie_manager, cookie_path, + EWK_COOKIE_PERSISTENT_STORAGE_TEXT); + ewk_cookie_manager_accept_policy_set(cookie_manager, + EWK_COOKIE_ACCEPT_POLICY_NO_THIRD_PARTY); + + /* history hooks */ + ewk_context_history_callbacks_set( + context, + hist_nav_cb, + hist_client_redir_cb, + hist_server_redir_cb, + hist_title_updated_cb, + hist_visited_cb, + ad + ); + + /* url scheme registration */ URIHandler uri_handlers[] = { { "mailto:", "terminology -e mutt %s" }, { "ftp://", "terminology -e wget ftp://%s" }, @@ -1068,9 +1108,9 @@ setup_url_scheme_callbacks(Ewk_Context *ewk_context) }; for (i = 0; i < LENGTH(uri_handlers); i++) - ewk_context_url_scheme_register(ewk_context, uri_handlers[i].handle, + ewk_context_url_scheme_register(context, uri_handlers[i].handle, generic_url_scheme_request_cb, uri_handlers[i].handler); - ewk_context_url_scheme_register(ewk_context, "about:", about_url_scheme_request_cb, NULL); + ewk_context_url_scheme_register(context, "about:", about_url_scheme_request_cb, NULL); } diff --git a/src/callbacks.h b/src/callbacks.h @@ -1,7 +1,7 @@ void setup_buffer_callbacks(Buffer_Data*); void setup_window_callbacks(Window_Data*); -void setup_url_scheme_callbacks(Ewk_Context*); +void setup_main_callbacks(App_Data*, const char*); /* static Eina_Bool webview_mimetype_cb(WebKitWebView *webview, WebKitWebFrame *frame, WebKitNetworkRequest *request, char *mime_type, WebKitWebPolicyDecision *decision, gpointer user_data); diff --git a/src/main.c b/src/main.c @@ -240,8 +240,6 @@ elm_main(int argc, char *argv[]) Session *session; size_t dirlen; int args; - Ewk_Context *ewk_context; - Ewk_Cookie_Manager *cookie_manager; Ecore_Timer *session_save_timer = NULL; Eina_Bool quit_option = EINA_FALSE; Ecore_Con_Server *svr; @@ -298,15 +296,6 @@ elm_main(int argc, char *argv[]) basename++; dirlen++; - ewk_context = ewk_context_default_get(); - - eina_strlcpy(basename, "cookies.txt", sizeof(path) - dirlen); - cookie_manager = ewk_context_cookie_manager_get(ewk_context); - ewk_cookie_manager_persistent_storage_set(cookie_manager, path, - EWK_COOKIE_PERSISTENT_STORAGE_TEXT); - ewk_cookie_manager_accept_policy_set(cookie_manager, - EWK_COOKIE_ACCEPT_POLICY_NO_THIRD_PARTY); - eina_strlcpy(basename, "config.eet", sizeof(path) - dirlen); if (!(config = config_load(path))) { config = config_new(EINA_TRUE /* allow_popup */, @@ -339,20 +328,20 @@ elm_main(int argc, char *argv[]) ERR("Could not save new session file at %s", path); } + eina_strlcpy(basename, "cookies.txt", sizeof(path) - dirlen); + setup_main_callbacks(ad, path); + session_save_timer = ecore_timer_loop_add(30, session_save_cb, ad); if (!session_save_timer) ERR("Could not register session save timer"); make_searchengines_list(searchengines, LENGTH(searchengines)); - setup_url_scheme_callbacks(ewk_context); setup_modkeys(ad); ad->config = config; ad->history = hist; ad->session = session; ad->session_save_timer = session_save_timer; - ad->ewk_context = ewk_context; - ad->cookie_manager = cookie_manager; /* initialize fields that are non-zero */ ad->keylistroot = make_keyslist(); diff --git a/src/viking.h b/src/viking.h @@ -216,8 +216,8 @@ typedef struct Hist *history; Config *config; Session *session; - Ewk_Context *ewk_context; - Ewk_Cookie_Manager *cookie_manager; + // Ewk_Context *ewk_context; + // Ewk_Cookie_Manager *cookie_manager; Eina_Bool exiting : 1; } App_Data;