2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.tizenopensource.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include "browser-add-to-bookmark-view.h"
19 #include "browser-bookmark-view.h"
20 #include "browser-class.h"
21 #include "browser-config.h"
22 #include "browser-context-menu.h"
23 #include "browser-history-db.h"
24 #include "browser-find-word.h"
25 #include "browser-multi-window-view.h"
26 #include "browser-scissorbox-view.h"
27 #include "browser-settings-class.h"
28 #if defined(FEATURE_MOST_VISITED_SITES)
29 #include "most-visited-sites.h"
30 #include "most-visited-sites-db.h"
32 #include "browser-string.h"
33 #include "browser-view.h"
34 #include "browser-window.h"
41 Browser_View::Browser_View(Evas_Object *win, Evas_Object *navi_bar, Evas_Object *bg, Browser_Class *browser)
46 ,m_dummy_loading_progressbar(NULL)
49 ,m_url_entry_layout(NULL)
50 ,m_url_edit_field(NULL)
51 ,m_url_progressbar(NULL)
52 ,m_url_progresswheel(NULL)
53 ,m_cancel_button(NULL)
56 ,m_forward_button(NULL)
57 ,m_add_bookmark_button(NULL)
59 ,m_option_header_url_layout(NULL)
60 ,m_find_word_entry_layout(NULL)
61 ,m_find_word_edit_field(NULL)
62 ,m_option_header_layout(NULL)
63 ,m_find_word_cancel_button(NULL)
64 ,m_option_header_find_word_layout(NULL)
65 ,m_option_header_url_entry_layout(NULL)
66 ,m_option_header_cancel_button(NULL)
67 ,m_find_word_prev_button(NULL)
68 ,m_find_word_next_button(NULL)
69 ,m_option_header_url_progressbar(NULL)
70 ,m_option_header_url_progresswheel(NULL)
71 ,m_edit_mode(BR_NO_EDIT_MODE)
72 ,m_homepage_mode(BR_START_MODE_UNKOWN)
73 #if defined(HORIZONTAL_UI)
75 ,m_multi_window_rotate_timer(NULL)
76 ,m_is_rotated(EINA_FALSE)
78 ,m_scroller_region_y(0)
79 ,m_is_scrolling(EINA_FALSE)
80 ,m_focused_window(NULL)
81 ,m_more_context_popup(NULL)
82 #if defined(FEATURE_MOST_VISITED_SITES)
83 ,m_most_visited_sites(NULL)
84 ,m_most_visited_sites_db(NULL)
86 ,m_new_window_transit(NULL)
87 ,m_created_new_window(NULL)
88 ,m_browser_settings(NULL)
91 ,m_scissorbox_view(NULL)
92 ,m_share_controlbar_button(NULL)
97 ,m_multi_window_button(NULL)
98 ,m_new_window_button(NULL)
99 ,m_is_full_screen(EINA_FALSE)
101 ,m_zoom_in_button(NULL)
102 ,m_zoom_out_button(NULL)
103 ,m_zoom_button_timer(NULL)
105 ,m_title_backward_button(NULL)
106 ,m_title_forward_button(NULL)
107 ,m_option_header_title_backward_button(NULL)
108 ,m_option_header_title_forward_button(NULL)
109 ,m_resize_idler(NULL)
110 ,m_is_private(EINA_FALSE)
111 ,m_private_check(NULL)
112 ,m_is_private_item_pressed(EINA_FALSE)
113 ,m_bookmark_on_off_icon(NULL)
114 ,m_brightness_control_bar(NULL)
115 ,m_brightness_auto_it(NULL)
116 ,m_brightness_manual_it(NULL)
117 ,m_default_seg_it(NULL)
119 ,m_medium_seg_it(NULL)
121 ,m_vibration_device_handle_id(-1)
122 ,m_is_multi_window_grid_mode(EINA_FALSE)
124 BROWSER_LOGD("[%s]", __func__);
126 m_navi_bar = navi_bar;
131 Browser_View::~Browser_View()
133 BROWSER_LOGD("[%s]", __func__);
134 if (m_title_back_button)
135 evas_object_del(m_title_back_button);
139 br_preference_set_str(LAST_VISITED_URL_KEY, m_last_visited_url.c_str());
141 m_data_manager->destroy_history_db();
142 m_data_manager->destroy_geolocation_db();
144 if (m_data_manager) {
145 delete m_data_manager;
146 m_data_manager = NULL;
148 #if defined(FEATURE_MOST_VISITED_SITES)
149 if (m_most_visited_sites) {
150 delete m_most_visited_sites;
151 m_most_visited_sites = NULL;
153 if (m_most_visited_sites_db) {
154 delete m_most_visited_sites_db;
155 m_most_visited_sites_db = NULL;
158 if (m_new_window_transit) {
159 elm_transit_del(m_new_window_transit);
160 m_new_window_transit = NULL;
162 if (m_browser_settings) {
163 delete m_browser_settings;
164 m_browser_settings = NULL;
170 if (m_context_menu) {
171 delete m_context_menu;
172 m_context_menu = NULL;
174 if (m_scissorbox_view) {
175 delete m_scissorbox_view;
176 m_scissorbox_view = NULL;
178 #if defined(HORIZONTAL_UI)
179 if (m_multi_window_rotate_timer) {
180 ecore_timer_del(m_multi_window_rotate_timer);
181 m_multi_window_rotate_timer = NULL;
191 if (m_zoom_in_button)
192 evas_object_del(m_zoom_in_button);
193 if (m_zoom_out_button)
194 evas_object_del(m_zoom_out_button);
195 if (m_zoom_button_timer) {
196 ecore_timer_del(m_zoom_button_timer);
197 m_zoom_button_timer = NULL;
202 Eina_Bool Browser_View::init(void)
204 BROWSER_LOGD("[%s]", __func__);
205 /* set homepage from homepage vconf */
206 _set_homepage_mode();
208 m_data_manager = new(nothrow) Browser_Data_Manager;
209 if (!m_data_manager) {
210 BROWSER_LOGE("new Browser_Data_Manager failed");
214 m_data_manager->set_browser_view(this);
216 if (!m_data_manager->create_history_db()) {
217 BROWSER_LOGE("m_data_manager->create_history_db failed");
221 if (!m_data_manager->create_geolocation_db()) {
222 BROWSER_LOGE("m_data_manager->create_geolocation_db failed");
226 #if defined(FEATURE_MOST_VISITED_SITES)
227 m_most_visited_sites_db = new(nothrow) Most_Visited_Sites_DB;
228 if (!m_most_visited_sites_db) {
229 BROWSER_LOGE("new Most_Visited_Sites_DB failed");
234 m_find_word = new(nothrow) Browser_Find_Word(this);
236 BROWSER_LOGE("new Browser_Find_Word failed");
240 m_context_menu = new(nothrow) Browser_Context_Menu(this);
241 if (!m_context_menu) {
242 BROWSER_LOGE("new Browser_Context_Menu failed");
246 m_meta_tag = new(nothrow) Browser_Meta_Tag();
248 BROWSER_LOGE("new Browser_Meta_Tag failed");
252 UG_INIT_EFL(m_win, UG_OPT_INDICATOR_ENABLE);
254 char *last_url = NULL;
255 if (br_preference_get_str(LAST_VISITED_URL_KEY, &last_url) == false) {
256 BROWSER_LOGE("failed to get %s preference", LAST_VISITED_URL_KEY);
260 m_last_visited_url = std::string(last_url);
263 if (_haptic_device_init() == EINA_FALSE) {
264 BROWSER_LOGE("Failed to init haptic device");
268 /* create brower view layout */
269 return _create_main_layout();
272 void Browser_View::launch(const char *url)
274 /* Destroy all other views except browser view. */
278 * When keypad is running via url entry, if browser goes to background by home key.
279 * Then relaunch the browser by aul. The webpage is loading but the keypad is still running.
280 * So give focus to cancel button not to invoke the keypad. */
281 elm_object_focus_set(m_cancel_button, EINA_TRUE);
283 if (url && strlen(url))
285 #if defined(FEATURE_MOST_VISITED_SITES)
286 else if (m_homepage_mode == BR_START_MODE_MOST_VISITED_SITES)
287 load_url(BROWSER_MOST_VISITED_SITES_URL);
289 else if (m_homepage_mode == BR_START_MODE_RECENTLY_VISITED_SITE) {
290 char *homepage = NULL;
291 if (br_preference_get_str(LAST_VISITED_URL_KEY, &homepage) == false) {
292 BROWSER_LOGD("failed to get %s preference", LAST_VISITED_URL_KEY);
299 #if defined(FEATURE_MOST_VISITED_SITES)
300 load_url(BROWSER_MOST_VISITED_SITES_URL);
302 load_url(BROWSER_BLANK_PAGE_URL);
304 } else if (m_homepage_mode == BR_START_MODE_CUSTOMIZED_URL) {
305 char *user_homepage = NULL;
306 if (br_preference_get_str(USER_HOMEPAGE_KEY, &user_homepage) ==false) {
307 BROWSER_LOGE("failed to get %s preference\n", USER_HOMEPAGE_KEY);
311 load_url(user_homepage);
314 #if defined(FEATURE_MOST_VISITED_SITES)
315 load_url(BROWSER_MOST_VISITED_SITES_URL);
317 load_url(BROWSER_BLANK_PAGE_URL);
319 } else if (m_homepage_mode == BR_START_MODE_EMPTY_PAGE) {
320 load_url(BROWSER_BLANK_PAGE_URL);
325 void Browser_View::set_full_sreen(Eina_Bool enable)
327 BROWSER_LOGD("[%s]", __func__);
329 if (m_is_full_screen == enable)
332 m_is_full_screen = enable;
334 if (m_is_full_screen) {
335 elm_win_indicator_mode_set(m_win, ELM_WIN_INDICATOR_HIDE);
336 _hide_scroller_url_layout();
337 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "enter,full_screen,signal", "");
338 _enable_webview_scroll();
340 elm_object_part_content_unset(m_focused_window->m_ewk_view_layout, "elm.swallow.webview");
342 evas_object_move(m_focused_window->m_ewk_view, 0, 0);
344 elm_win_indicator_mode_set(m_win, ELM_WIN_INDICATOR_SHOW);
346 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "exit,full_screen,signal", "");
348 elm_object_part_content_set(m_focused_window->m_ewk_view_layout, "elm.swallow.webview", m_focused_window->m_ewk_view);
350 _navigationbar_visible_set_signal(EINA_TRUE);
353 ecore_idler_add(__webview_layout_resize_idler_cb, this);
356 #if defined(FEATURE_MOST_VISITED_SITES)
357 Eina_Bool Browser_View::is_most_visited_sites_running(void)
359 if (m_most_visited_sites)
366 void Browser_View::return_to_browser_view(Eina_Bool saved_most_visited_sites_item)
368 BROWSER_LOGD("[%s]", __func__);
370 if (!_is_loading()) {
371 if (get_title().empty())
372 _set_navigationbar_title(get_url().c_str());
374 _set_navigationbar_title(get_title().c_str());
376 #if defined(FEATURE_MOST_VISITED_SITES)
377 if (is_most_visited_sites_running()) {
378 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
379 "show,control_bar,no_animation,signal", "");
380 _set_navigationbar_title(BR_STRING_MOST_VISITED_SITES);
382 if (saved_most_visited_sites_item && is_most_visited_sites_running())
383 /* If longpress on speed dial item, then add to bookmark. */
384 edje_object_signal_emit(elm_layout_edje_get(m_most_visited_sites->m_selected_item->layout),
385 "bookmark_icon", "");
391 void Browser_View::_pop_other_views(void)
393 BROWSER_LOGD("[%s]", __func__);
394 _destroy_more_context_popup();
396 /* if browser is runing background behind ug which browser invoked,
397 destroy the previous ug and show the browser view. */
400 /* If multi-window is running, destroy it to show browser view. */
401 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
402 m_data_manager->get_multi_window_view()->close_multi_window();
404 /* Pop all other views except browser view. */
405 elm_naviframe_item_pop_to(m_navi_it);
407 if (m_scissorbox_view)
408 _destroy_scissorbox_view();
411 /* set homepage from homepage vconf */
412 void Browser_View::_set_homepage_mode(void)
414 char *homepage = NULL;
415 if (br_preference_get_str(HOMEPAGE_KEY, &homepage) == false) {
416 BROWSER_LOGE("failed to get %s preference\n", HOMEPAGE_KEY);
419 BROWSER_LOGD("homepage=[%s]", homepage);
422 BROWSER_LOGE("homepage is null");
423 #if defined(FEATURE_MOST_VISITED_SITES)
424 m_homepage_mode = BR_START_MODE_MOST_VISITED_SITES;
426 m_homepage_mode = BR_START_MODE_EMPTY_PAGE;
431 #if defined(FEATURE_MOST_VISITED_SITES)
432 if (!strncmp(homepage, MOST_VISITED_SITES,
433 strlen(MOST_VISITED_SITES)))
434 m_homepage_mode = BR_START_MODE_MOST_VISITED_SITES;
437 if (!strncmp(homepage, RECENTLY_VISITED_SITE,
438 strlen(RECENTLY_VISITED_SITE)))
439 m_homepage_mode = BR_START_MODE_RECENTLY_VISITED_SITE;
440 else if (!strncmp(homepage, EMPTY_PAGE,
442 m_homepage_mode = BR_START_MODE_EMPTY_PAGE;
444 m_homepage_mode = BR_START_MODE_CUSTOMIZED_URL;
447 BROWSER_LOGD("m_homepage_mode=%d", m_homepage_mode);
450 void Browser_View::__new_window_transit_finished_cb(void *data, Elm_Transit *transit)
452 BROWSER_LOGD("[%s]", __func__);
456 Browser_View *browser_view = (Browser_View *)data;
457 if (!browser_view->m_new_window_transit)
460 browser_view->m_new_window_transit = NULL;
461 browser_view->m_browser->set_focused_window(browser_view->m_created_new_window
462 #if defined(FEATURE_MOST_VISITED_SITES)
466 browser_view->m_created_new_window = NULL;
469 Eina_Bool Browser_View::_show_new_window_effect(Evas_Object *current_ewk_view,
470 Evas_Object *new_ewk_view)
476 elm_scroller_region_get(m_scroller, &scroller_x, &scroller_y, &scroller_w, &scroller_h);
477 elm_scroller_region_show(m_scroller ,scroller_x, 0, scroller_w, scroller_h);
479 m_browser->set_focused_window(m_created_new_window
480 #if defined(FEATURE_MOST_VISITED_SITES)
488 Evas_Object *Browser_View::get_favicon(const char *url)
490 if (!url || !strlen(url))
493 Ewk_Context* context = ewk_view_context_get(m_focused_window->m_ewk_view);
494 Evas_Object *favicon = ewk_context_icon_database_icon_object_add(context, url, evas_object_evas_get(m_focused_window->m_ewk_view));
499 Eina_Bool Browser_View::_set_favicon(void)
501 BROWSER_LOGD("[%s]", __func__);
503 if (m_edit_mode == BR_URL_ENTRY_EDIT_MODE
504 || m_edit_mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
505 BROWSER_LOGD("Edit mode");
509 #if defined(FEATURE_MOST_VISITED_SITES)
510 if (is_most_visited_sites_running()) {
511 BROWSER_LOGD("is_most_visited_sites_running");
516 double progress = ewk_view_load_progress_get(m_focused_window->m_ewk_view);
517 if (progress < 1.0f && progress > 0.05f) {
518 BROWSER_LOGD("loadin status");
522 Evas_Object *favicon = get_favicon(get_url().c_str());
523 Evas_Object *option_header_favicon = get_favicon(get_url().c_str());
526 if (m_focused_window->m_favicon)
527 evas_object_del(m_focused_window->m_favicon);
529 m_focused_window->m_favicon = favicon;
531 Evas_Object *default_icon = elm_icon_add(m_focused_window->m_ewk_view);
533 BROWSER_LOGE("elm_icon_add is failed.");
536 if (!elm_icon_file_set(default_icon, BROWSER_IMAGE_DIR"/faviconDefault.png", NULL)) {
537 BROWSER_LOGE("elm_icon_file_set is failed.");
540 evas_object_size_hint_aspect_set(default_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
541 if (m_focused_window->m_favicon)
542 evas_object_del(m_focused_window->m_favicon);
544 m_focused_window->m_favicon = default_icon;
547 if (option_header_favicon) {
548 if (m_focused_window->m_option_header_favicon)
549 evas_object_del(m_focused_window->m_option_header_favicon);
551 m_focused_window->m_option_header_favicon = option_header_favicon;
553 Evas_Object *default_icon = elm_icon_add(m_focused_window->m_ewk_view);
555 BROWSER_LOGE("elm_icon_add is failed.");
558 if (!elm_icon_file_set(default_icon, BROWSER_IMAGE_DIR"/faviconDefault.png", NULL)) {
559 BROWSER_LOGE("elm_icon_file_set is failed.");
562 evas_object_size_hint_aspect_set(default_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
563 if (m_focused_window->m_option_header_favicon)
564 evas_object_del(m_focused_window->m_option_header_favicon);
566 m_focused_window->m_option_header_favicon = default_icon;
569 if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
570 elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
571 if (elm_object_part_content_get(m_option_header_url_entry_layout,
572 "elm.swallow.favicon"))
573 elm_object_part_content_unset(m_option_header_url_entry_layout,
574 "elm.swallow.favicon");
576 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.favicon",
577 m_focused_window->m_favicon);
578 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.favicon",
579 m_focused_window->m_option_header_favicon);
581 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
582 "show,favicon,signal", "");
583 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
584 "show,favicon,signal", "");
591 Eina_Bool Browser_View::__close_window_idler_cb(void *data)
593 BROWSER_LOGD("[%s]", __func__);
595 return ECORE_CALLBACK_CANCEL;
597 Browser_View *browser_view = (Browser_View *)data;
598 Browser_Class *browser = browser_view->m_browser;
600 if (browser_view->m_focused_window->m_parent)
601 browser->delete_window(browser_view->m_focused_window,
602 browser_view->m_focused_window->m_parent);
604 browser->delete_window(browser_view->m_focused_window);
609 elm_scroller_region_get(browser_view->m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
610 elm_scroller_region_show(browser_view->m_scroller ,scroller_x, 0,
611 scroller_w, scroller_h);
612 return ECORE_CALLBACK_CANCEL;
615 void Browser_View::__close_window_cb(void *data, Evas_Object *obj, void *event_info)
617 BROWSER_LOGD("[%s]", __func__);
621 Browser_View *browser_view = (Browser_View *)data;
622 Browser_Class *browser = browser_view->m_browser;
624 /* The window should be deleted by idler. The webkit recommands to delete by idler. */
625 ecore_idler_add(__close_window_idler_cb, browser_view);
628 Eina_Bool Browser_View::_haptic_device_init(void)
630 BROWSER_LOGD("[%s]", __func__);
632 if (m_vibration_device_handle_id == BROWSER_HAPTIC_DEVICE_HANDLE) {
633 BROWSER_LOGD("device handle for haptic is already set");
637 if (haptic_initialize() != HAPTIC_ERROR_NONE) {
638 BROWSER_LOGD("failed to initiate haptic device");
642 m_vibration_device_handle_id = BROWSER_HAPTIC_DEVICE_HANDLE;
647 Eina_Bool Browser_View::_haptic_device_play(long haptic_play_time)
649 BROWSER_LOGD("[%s], requested time is [%dms]", __func__, haptic_play_time);
651 if (m_vibration_device_handle_id != BROWSER_HAPTIC_DEVICE_HANDLE) {
652 BROWSER_LOGD("device handle for haptic is not set. Unable to play haptic");
656 if (haptic_vibrate_monotone(BROWSER_HAPTIC_DEVICE_HANDLE, haptic_play_time, HAPTIC_LEVEL_AUTO) != HAPTIC_ERROR_NONE) {
657 BROWSER_LOGD("haptic_vibrate_monotone failed.");
664 Eina_Bool Browser_View::_haptic_device_stop(void)
666 BROWSER_LOGD("[%s]", __func__);
668 if (m_vibration_device_handle_id != BROWSER_HAPTIC_DEVICE_HANDLE) {
669 BROWSER_LOGD("device handle for haptic is not set. Unable to play haptic");
673 if (haptic_stop_device(BROWSER_HAPTIC_DEVICE_HANDLE) != HAPTIC_ERROR_NONE) {
674 BROWSER_LOGD("haptic_stop_device failed.");
681 Eina_Bool Browser_View::_haptic_device_close(void)
683 BROWSER_LOGD("[%s]", __func__);
685 if (haptic_deinitialize() != HAPTIC_ERROR_NONE) {
686 BROWSER_LOGD("haptic_deinitialize failed.");
693 void Browser_View::__create_window_cb(void *data, Evas_Object *obj, void *event_info)
695 BROWSER_LOGD("[%s]", __func__);
699 Browser_View *browser_view = (Browser_View *)data;
700 Browser_Class *browser = browser_view->m_browser;
702 std::vector<Browser_Window *> window_list = browser->get_window_list();
703 if (window_list.size() >= BROWSER_MULTI_WINDOW_MAX_COUNT) {
704 /* If the multi window is max, delete the first one. */
705 /* if the first window is focused, delete second one(oldest one except first one) */
706 if (browser_view->m_focused_window != window_list[0])
707 browser->delete_window(window_list[0]);
709 browser->delete_window(window_list[1]);
712 browser_view->m_created_new_window = browser->create_new_window();
713 if (!browser_view->m_created_new_window) {
714 BROWSER_LOGE("create_new_window failed");
717 /* initialize the created webview first to connect ewk event callback functions such as load start, progress etc. */
718 browser->ewk_view_init(browser_view->m_created_new_window->m_ewk_view);
720 /* Set the caller window. */
721 browser_view->m_created_new_window->m_parent = browser_view->m_focused_window;
723 /* Destroy previous multi window item snapshot.
724 * This is because the snapshot of multi window item can't be captured in this case. */
725 #if defined(HORIZONTAL_UI)
726 if (browser_view->m_focused_window->m_landscape_snapshot_image) {
727 evas_object_del(browser_view->m_focused_window->m_landscape_snapshot_image);
728 browser_view->m_focused_window->m_landscape_snapshot_image = NULL;
731 if (browser_view->m_focused_window->m_portrait_snapshot_image) {
732 evas_object_del(browser_view->m_focused_window->m_portrait_snapshot_image);
733 browser_view->m_focused_window->m_portrait_snapshot_image = NULL;
736 if (!browser_view->_show_new_window_effect(browser_view->m_focused_window->m_ewk_view,
737 browser_view->m_created_new_window->m_ewk_view))
738 BROWSER_LOGE("_show_new_window_effect failed");
740 *((Evas_Object **)event_info) = browser_view->m_created_new_window->m_ewk_view;
743 void Browser_View::__load_started_cb(void *data, Evas_Object *obj, void *event_info)
745 BROWSER_LOGD("[%s]", __func__);
749 Browser_View *browser_view = (Browser_View *)data;
750 Evas_Object *url_progressbar = browser_view->m_url_progressbar;
751 Evas_Object *progressbar_wheel = browser_view->m_url_progresswheel;
752 Evas_Object *option_header_url_progressbar = browser_view->m_option_header_url_progressbar;
753 Evas_Object *option_header_progressbar_wheel = browser_view->m_option_header_url_progresswheel;
755 double progress = ewk_view_load_progress_get(browser_view->m_focused_window->m_ewk_view);
756 if (progress <= 0.0f)
758 elm_progressbar_pulse(progressbar_wheel, EINA_TRUE);
759 elm_progressbar_pulse(option_header_progressbar_wheel, EINA_TRUE);
761 elm_progressbar_value_set(url_progressbar, progress);
762 elm_progressbar_value_set(option_header_url_progressbar, progress);
764 browser_view->_load_start();
767 void Browser_View::_navigationbar_visible_set_signal(Eina_Bool visible)
769 BROWSER_LOGD("visible=%d", visible);
771 if (visible && (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW) || m_is_full_screen || m_brightness_control_bar))
774 if (m_navi_it != elm_naviframe_top_item_get(m_navi_bar))
777 evas_object_data_set(m_navi_bar, "visible", (Eina_Bool *)visible);
779 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
782 elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_INSTANT_OPEN);
784 elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_INSTANT_CLOSE);
787 void Browser_View::_navigationbar_visible_set(Eina_Bool visible)
789 if (visible && (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW) || m_is_full_screen))
792 if (m_navi_it != elm_naviframe_top_item_get(m_navi_bar))
795 evas_object_data_set(m_navi_bar, "visible", (Eina_Bool *)visible);
797 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
799 elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_OPEN);
801 elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_CLOSE);
804 Eina_Bool Browser_View::_navigationbar_visible_get(void)
806 Eina_Bool* visible = (Eina_Bool *)evas_object_data_get(m_navi_bar, "visible");
807 BROWSER_LOGD("visible = %d", visible);
808 if (visible == (Eina_Bool *)EINA_TRUE)
814 void Browser_View::_load_start(void)
816 BROWSER_LOGD("[%s]", __func__);
818 if (m_dummy_loading_progressbar) {
819 elm_object_part_content_unset(m_main_layout, "elm.swallow.waiting_progress");
820 evas_object_del(m_dummy_loading_progressbar);
821 m_dummy_loading_progressbar = NULL;
822 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
823 "hide,waiting_progressbar,signal", "");
826 if (!m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
827 _set_navigationbar_title(BR_STRING_LOADING);
829 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,on,signal", "");
830 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
831 "loading,on,signal", "");
833 _navigationbar_visible_set_signal(EINA_TRUE);
835 /* Hide the secure lock icon in title bar. */
836 elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_ICON, NULL);
838 /* Destroy & hide favicon when load start. */
839 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
840 "hide,favicon,signal", "");
841 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
842 "hide,favicon,signal", "");
843 if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
844 elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
845 if (elm_object_part_content_get(m_option_header_url_entry_layout,
846 "elm.swallow.favicon"))
847 elm_object_part_content_unset(m_option_header_url_entry_layout,
848 "elm.swallow.favicon");
850 if (m_focused_window->m_favicon) {
851 evas_object_del(m_focused_window->m_favicon);
852 m_focused_window->m_favicon = NULL;
854 if (m_focused_window->m_option_header_favicon) {
855 evas_object_del(m_focused_window->m_option_header_favicon);
856 m_focused_window->m_option_header_favicon = NULL;
859 /* This makes the ewk view unfocused so that the ime can't be invoked. */
860 evas_object_focus_set(m_focused_window->m_ewk_view_layout, EINA_TRUE);
862 if (_get_edit_mode() != BR_NO_EDIT_MODE)
863 _set_edit_mode(BR_NO_EDIT_MODE);
865 /* For deleted window because of unused case like low memory. */
866 m_focused_window->m_url.clear();
867 m_focused_window->m_title.clear();
869 set_full_sreen(EINA_FALSE);
871 elm_object_focus_set(m_option_header_cancel_button, EINA_TRUE);
872 elm_object_signal_emit(m_option_header_url_edit_field, "ellipsis_show,signal", "elm");
873 elm_object_signal_emit(m_url_edit_field, "ellipsis_show,signal", "elm");
875 if (m_scissorbox_view)
876 _destroy_scissorbox_view();
877 _destroy_more_context_popup();
880 void Browser_View::__load_committed_cb(void *data, Evas_Object *obj, void *event_info)
882 BROWSER_LOGD("[%s]", __func__);
886 Browser_View *browser_view = (Browser_View *)data;
887 if (browser_view->_get_edit_mode() != BR_NO_EDIT_MODE)
890 browser_view->_set_url_entry(browser_view->get_url().c_str());
893 void Browser_View::__load_nonempty_layout_finished_cb(void *data, Evas_Object *obj, void *event_info)
895 BROWSER_LOGD("[%s]", __func__);
899 Browser_View *browser_view = (Browser_View *)data;
901 if (!browser_view->_is_loading())
904 #ifdef BROWSER_SCROLLER_BOUNCING
905 /* If the first content is displayed, hide the url layout in browser scroller like safari. */
909 elm_scroller_region_get(browser_view->m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
910 elm_scroller_region_show(browser_view->m_scroller ,scroller_x, 0,
911 scroller_w, scroller_h);
915 void Browser_View::__title_changed_cb(void *data, Evas_Object *obj, void *event_info)
917 BROWSER_LOGD("[%s]", __func__);
921 Browser_View *browser_view = (Browser_View *)data;
922 if (browser_view->_get_edit_mode() != BR_NO_EDIT_MODE)
925 if (!m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
926 browser_view->_set_navigationbar_title(browser_view->get_title().c_str());
929 void Browser_View::__load_finished_cb(void *data, Evas_Object *obj, void *event_info)
931 BROWSER_LOGD("[%s]", __func__);
935 Browser_View *browser_view = (Browser_View *)data;
936 Evas_Object *progressbar_wheel = browser_view->m_url_progresswheel;
937 Evas_Object *option_header_progressbar_wheel = browser_view->m_option_header_url_progresswheel;
939 elm_progressbar_pulse(progressbar_wheel, EINA_FALSE);
940 elm_progressbar_pulse(option_header_progressbar_wheel, EINA_FALSE);
943 * For the first time, the background color is white initially.
944 * If the background is not displayed yet, show the grey background.
945 * This code is executed only one time at launching time.
947 const char* state = edje_object_part_state_get(elm_layout_edje_get(browser_view->m_main_layout),
948 "contents_bg", NULL);
949 if(state && !strncmp(state, "default", strlen("default")))
950 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout),
951 "show,grey_background,signal", "");
953 if (browser_view->m_edit_mode != BR_URL_ENTRY_EDIT_MODE
954 && browser_view->m_edit_mode != BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
955 /* change the url layout for normal mode. (change the reload icon etc) */
956 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "loading,off,signal", "");
957 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout),
958 "loading,off,signal", "");
961 if (!m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
962 browser_view->_set_navigationbar_title(browser_view->get_title().c_str());
965 * finish progress event can be come after finish progress frame event at some pages.
966 * In this case, the title & favicon display error happens, becaue these are handled in finish progress frame.
967 * So do that again here. */
968 if (!browser_view->_set_favicon())
969 BROWSER_LOGE("_set_favicon failed");
970 browser_view->_set_secure_icon();
971 browser_view->_load_finished();
974 static Eina_Bool __kill_browser_timer_cb(void *data)
977 return ECORE_CALLBACK_CANCEL;
980 void Browser_View::__process_crashed_cb(void *data, Evas_Object *obj, void *event_info)
982 BROWSER_LOGD("[%s]", __func__);
986 Browser_View *browser_view = (Browser_View *)data;
987 browser_view->show_msg_popup(BR_STRING_WEBPROCESS_CRASH, 3);
988 ecore_timer_add(3, __kill_browser_timer_cb, NULL);
991 void Browser_View::__did_finish_load_for_frame_cb(void *data, Evas_Object *obj, void *event_info)
996 Browser_View *browser_view = (Browser_View *)data;
998 if (!m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
999 browser_view->_set_navigationbar_title(browser_view->get_title().c_str());
1001 browser_view->_load_finished();
1004 void Browser_View::_set_secure_icon(void)
1006 std::string url = get_url();
1007 BROWSER_LOGD("url=[%s]", url.c_str());
1009 if (m_focused_window->m_secure_icon == NULL) {
1010 m_focused_window->m_secure_icon = elm_icon_add(m_focused_window->m_ewk_view);
1011 if (!m_focused_window->m_secure_icon) {
1012 BROWSER_LOGE("elm_icon_add is failed.");
1016 if (!elm_icon_file_set(m_focused_window->m_secure_icon, BROWSER_IMAGE_DIR"/lock.png", NULL)) {
1017 BROWSER_LOGE("elm_icon_file_set is failed.");
1020 evas_object_size_hint_aspect_set(m_focused_window->m_secure_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1021 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.secure_icon",
1022 m_focused_window->m_secure_icon);
1025 if (m_focused_window->m_option_header_secure_icon == NULL) {
1026 m_focused_window->m_option_header_secure_icon = elm_icon_add(m_focused_window->m_ewk_view);
1027 if (!m_focused_window->m_option_header_secure_icon) {
1028 BROWSER_LOGE("elm_icon_add is failed.");
1032 if (!elm_icon_file_set(m_focused_window->m_option_header_secure_icon, BROWSER_IMAGE_DIR"/lock.png", NULL)) {
1033 BROWSER_LOGE("elm_icon_file_set is failed.");
1036 evas_object_size_hint_aspect_set(m_focused_window->m_option_header_secure_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1037 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.secure_icon",
1038 m_focused_window->m_option_header_secure_icon);
1041 if (url.c_str() && url.length()) {
1042 if (!strncmp(url.c_str(), BROWSER_HTTPS_SCHEME, strlen(BROWSER_HTTPS_SCHEME))) {
1043 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1044 "show,secure_icon,signal", "");
1045 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1046 "show,secure_icon,signal", "");
1050 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "hide,secure_icon,signal", "");
1051 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1052 "hide,secure_icon,signal", "");
1055 #if defined(FEATURE_MOST_VISITED_SITES)
1056 Eina_Bool Browser_View::_capture_most_visited_sites_item_screen_shot(void)
1058 BROWSER_LOGD("[%s]", __func__);
1060 Eina_Bool is_ranked = EINA_FALSE;
1061 std::string screen_shot_path;
1062 std::string current_url = get_url();
1063 screen_shot_path.clear();
1065 if (!m_selected_most_visited_sites_item_info.url.empty()) {
1066 std::string history_id;
1067 history_id = m_most_visited_sites_db->get_history_id_by_url(get_url().c_str());
1068 if (!history_id.empty()) {
1069 std::string history_title;
1070 history_title = m_most_visited_sites_db->get_history_title_by_id(history_id.c_str());
1071 if (!history_title.empty()) {
1072 if (!m_most_visited_sites_db->save_most_visited_sites_item(m_selected_most_visited_sites_item_info.index,
1073 get_url().c_str(), history_title.c_str(), history_id.c_str()))
1074 BROWSER_LOGE("save_most_visited_sites_item failed");
1076 if (!m_most_visited_sites_db->save_most_visited_sites_item(m_selected_most_visited_sites_item_info.index,
1077 get_url().c_str(), m_selected_most_visited_sites_item_info.title.c_str(),
1078 history_id.c_str()))
1079 BROWSER_LOGE("save_most_visited_sites_item failed");
1083 m_selected_most_visited_sites_item_info.url.clear();
1084 m_selected_most_visited_sites_item_info.title.clear();
1085 m_selected_most_visited_sites_item_info.id.clear();
1088 std::vector<Most_Visited_Sites_DB::most_visited_sites_entry> most_visited_sites_list;
1089 if (!m_most_visited_sites_db->get_most_visited_sites_list(most_visited_sites_list)) {
1090 BROWSER_LOGE("get_most_visited_sites_list failed");
1094 for (int i = 0 ; i < most_visited_sites_list.size() ; i++) {
1095 if (!current_url.empty() && !most_visited_sites_list[i].url.empty()
1096 && (current_url.length() == most_visited_sites_list[i].url.length())
1097 && !strncmp(most_visited_sites_list[i].url.c_str(), current_url.c_str(), current_url.length())) {
1098 is_ranked = EINA_TRUE;
1099 screen_shot_path = std::string(BROWSER_SCREEN_SHOT_DIR)
1100 + most_visited_sites_list[i].id;
1101 if (most_visited_sites_list[i].id.length() > strlen(DEFAULT_ICON_PREFIX) &&
1102 !strncmp(DEFAULT_ICON_PREFIX, most_visited_sites_list[i].id.c_str(),
1103 strlen(DEFAULT_ICON_PREFIX))) {
1104 /* If default icon */
1105 std::string history_id;
1106 history_id = m_most_visited_sites_db->get_history_id_by_url(most_visited_sites_list[i].url.c_str());
1107 if (!history_id.empty()) {
1108 if (m_most_visited_sites_db->save_most_visited_sites_item(most_visited_sites_list[i].index,
1109 most_visited_sites_list[i].url.c_str(), most_visited_sites_list[i].title.c_str(),
1110 history_id.c_str())) {
1111 screen_shot_path = std::string(BROWSER_SCREEN_SHOT_DIR)
1112 + most_visited_sites_list[i].id;
1113 remove(screen_shot_path.c_str());
1114 screen_shot_path = std::string(BROWSER_SCREEN_SHOT_DIR)
1124 std::vector<Most_Visited_Sites_DB::most_visited_sites_entry> most_visited_list;
1125 if (!m_most_visited_sites_db->get_most_visited_list(most_visited_list, most_visited_sites_list,
1126 BROWSER_MOST_VISITED_SITES_ITEM_MAX * 2)) {
1127 BROWSER_LOGE("get_most_visited_list failed");
1130 for (int i = 0; i < most_visited_list.size(); i++)
1132 if (most_visited_list[i].url == current_url) {
1133 is_ranked = EINA_TRUE;
1134 screen_shot_path = std::string(BROWSER_SCREEN_SHOT_DIR)
1135 + most_visited_list[i].id;
1141 if (is_ranked && screen_shot_path.size() > 0) {
1142 int focused_ewk_view_w = 0;
1143 int focused_ewk_view_h = 0;
1144 evas_object_geometry_get(m_focused_window->m_ewk_view, NULL, NULL,
1145 &focused_ewk_view_w, &focused_ewk_view_h);
1148 evas_object_geometry_get(m_win, NULL, NULL, &window_w, NULL);
1149 int item_w = window_w / 3;
1150 int item_h = item_w + 10 * elm_scale_get();
1152 double ratio = (double)((double)item_h / (double)item_w);
1154 Eina_Rectangle snapshot_rect;
1155 snapshot_rect.x = snapshot_rect.y = 0;
1156 snapshot_rect.w = focused_ewk_view_w;
1157 snapshot_rect.h = focused_ewk_view_w * ratio;
1159 Evas_Object *snapshot = ewk_view_screenshot_contents_get(m_focused_window->m_ewk_view,
1160 snapshot_rect, 0.33, evas_object_evas_get(m_navi_bar));
1162 BROWSER_LOGE("ewk_view_screenshot_contents_get failed");
1165 uint8_t *pixels = (uint8_t *)(evas_object_image_data_get(snapshot, EINA_TRUE));
1167 int surface_width = 0;
1168 int surface_height = 0;
1169 evas_object_image_size_get(snapshot, &surface_width, &surface_height);
1170 BROWSER_LOGD("<<<< surface_width = %d, surface_height = %d >>>", surface_width, surface_height);
1172 cairo_surface_t *snapshot_surface = cairo_image_surface_create_for_data(pixels, CAIRO_FORMAT_RGB24,
1173 surface_width, surface_height,
1174 cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, surface_width));
1175 if (!snapshot_surface) {
1176 BROWSER_LOGE("cairo_image_surface_create_for_data failed");
1180 if (cairo_surface_write_to_png(snapshot_surface, screen_shot_path.c_str())
1181 != CAIRO_STATUS_SUCCESS)
1182 BROWSER_LOGD("cairo_surface_write_to_png FAILED");
1183 cairo_surface_destroy(snapshot_surface);
1188 Eina_Bool Browser_View::__capture_most_visited_sites_screen_shot_idler_cb(void *data)
1190 BROWSER_LOGD("[%s]", __func__);
1192 return ECORE_CALLBACK_CANCEL;
1194 Browser_View *browser_view = (Browser_View *)data;
1195 if (!browser_view->_capture_most_visited_sites_item_screen_shot())
1196 BROWSER_LOGE("_capture_most_visited_sites_item_screen_shot failed");
1198 return ECORE_CALLBACK_CANCEL;
1202 void Browser_View::_load_finished(void)
1204 BROWSER_LOGD("[%s]", __func__);
1206 /* enable or disable back,forward controlbar buttons */
1207 _set_controlbar_back_forward_status();
1209 if (!_set_favicon())
1210 BROWSER_LOGE("_set_favicon failed");
1213 /* Add current url to history */
1214 Eina_Bool is_full = EINA_FALSE;
1216 /* Save last visited url to save this when browser exits. */
1217 m_last_visited_url = get_url();
1219 if (m_data_manager->get_history_db() && !m_is_private) {
1220 m_data_manager->get_history_db()->save_history(m_last_visited_url.c_str(),
1221 get_title().c_str(), &is_full);
1223 BROWSER_LOGE("history is full, delete the first one");
1226 _hide_scroller_url_layout();
1228 #if defined(FEATURE_MOST_VISITED_SITES)
1229 ecore_idler_add(__capture_most_visited_sites_screen_shot_idler_cb, this);
1232 elm_object_focus_set(m_option_header_cancel_button, EINA_TRUE);
1233 elm_object_signal_emit(m_option_header_url_edit_field, "ellipsis_show,signal", "elm");
1234 elm_object_signal_emit(m_url_edit_field, "ellipsis_show,signal", "elm");
1236 _update_back_forward_buttons();
1239 void Browser_View::_hide_scroller_url_layout(void)
1241 BROWSER_LOGD("[%s]", __func__);
1243 if (_get_edit_mode() != BR_NO_EDIT_MODE
1244 #if defined(FEATURE_MOST_VISITED_SITES)
1245 || is_most_visited_sites_running()
1250 _navigationbar_visible_set_signal(EINA_FALSE);
1252 int browser_scroller_x = 0;
1253 int browser_scroller_w = 0;
1254 int browser_scroller_h = 0;
1255 elm_scroller_region_get(m_scroller, &browser_scroller_x, NULL,
1256 &browser_scroller_w, &browser_scroller_h);
1258 int url_layout_h = 0;
1259 evas_object_geometry_get(m_url_layout, NULL, NULL, NULL, &url_layout_h);
1260 elm_scroller_region_show(m_scroller, browser_scroller_x, url_layout_h,
1261 browser_scroller_w, browser_scroller_h);
1264 void Browser_View::__load_progress_cb(void *data, Evas_Object *obj, void *event_info)
1269 Browser_View *browser_view = (Browser_View *)data;
1270 Evas_Object *url_progressbar = browser_view->m_url_progressbar;
1271 Evas_Object *option_header_url_progressbar = browser_view->m_option_header_url_progressbar;
1273 double progress = ewk_view_load_progress_get(browser_view->m_focused_window->m_ewk_view);
1274 elm_progressbar_value_set(url_progressbar, progress);
1275 elm_progressbar_value_set(option_header_url_progressbar, progress);
1277 if (progress == 1.0f)
1278 __load_finished_cb(data, obj, NULL);
1281 void Browser_View::__ewk_view_mouse_down_cb(void* data, Evas* evas, Evas_Object* obj, void* ev)
1286 Browser_View *browser_view = (Browser_View *)data;
1287 Evas_Event_Mouse_Down event = *(Evas_Event_Mouse_Down *)ev;
1288 Evas_Object *main_layout = browser_view->m_main_layout;
1289 Evas_Object *ewk_view = browser_view->m_focused_window->m_ewk_view;
1291 #if defined(FEATURE_MOST_VISITED_SITES)
1292 if (browser_view->is_most_visited_sites_running())
1296 #ifdef BROWSER_SCROLLER_BOUNCING
1297 /* activate webview firstly when user starts to touch. */
1298 browser_view->_enable_webview_scroll();
1301 if (!browser_view->_is_loading() && browser_view->_get_edit_mode() != BR_FIND_WORD_MODE)
1302 browser_view->_navigationbar_visible_set(EINA_FALSE);
1304 browser_view->m_is_scrolling = EINA_TRUE;
1306 BROWSER_LOGD("__ewk_view_mouse_down_cb");
1309 double sacle_factor = ewk_view_scale_get(browser_view->m_focused_window->m_ewk_view);
1310 double min_scale = 0;
1311 double max_scale = 0;
1313 bool zoom_button_flag = true;
1314 if (br_preference_get_bool(ZOOM_BUTTON_KEY, &zoom_button_flag) == false)
1315 BROWSER_LOGE("failed to get ZOOM_BUTTON_KEY value\n");
1317 BROWSER_LOGD("zoom_button_flag =%d", zoom_button_flag);
1319 if (zoom_button_flag == false)
1322 if (browser_view->m_zoom_button_timer)
1323 ecore_timer_del(browser_view->m_zoom_button_timer);
1324 browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
1325 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "show,zoom_buttons,signal", "");
1329 void Browser_View::__ewk_view_enter_full_screen_cb(void *data, Evas_Object *obj, void *event_info)
1334 Browser_View *browser_view = (Browser_View *)data;
1335 browser_view->set_full_sreen(EINA_TRUE);
1338 void Browser_View::__ewk_view_exit_full_screen_cb(void *data, Evas_Object *obj, void *event_info)
1343 Browser_View *browser_view = (Browser_View *)data;
1344 browser_view->set_full_sreen(EINA_FALSE);
1347 void Browser_View::__ewk_view_vibration_vibrate_cb(void *data, Evas_Object *obj, void *event_info)
1349 Browser_View *browser_view = (Browser_View*)data;
1350 const long vibration_time = *((const long *)event_info);
1352 BROWSER_LOGD("__ewk_view_vibration_vibrate_cb : play time is [%ld]", vibration_time);
1354 browser_view->_haptic_device_play(vibration_time);
1357 void Browser_View::__ewk_view_vibration_cancel_cb(void *data, Evas_Object *obj, void *event_info)
1359 BROWSER_LOGD("[%s]", __func__);
1361 Browser_View *browser_view = (Browser_View*)data;
1363 browser_view->_haptic_device_stop();
1366 void Browser_View::__ewk_view_mouse_up_cb(void* data, Evas* evas, Evas_Object* obj, void* ev)
1371 Browser_View *browser_view = (Browser_View *)data;
1373 browser_view->m_is_scrolling = EINA_FALSE;
1376 void Browser_View::__ewk_view_edge_top_cb(void *data, Evas_Object *obj, void *event_info)
1378 #ifdef BROWSER_SCROLLER_BOUNCING
1379 BROWSER_LOGD("[%s]", __func__);
1383 Browser_View *browser_view = (Browser_View *)data;
1384 browser_view->_enable_browser_scroller_scroll();
1386 /* If user do flicking the mouse with scroll up, bring in the browser scroller to y=0. */
1387 if (!browser_view->m_is_scrolling) {
1388 BROWSER_LOGD("<< elm_scroller_region_bring_in >>");
1389 int browser_scroller_x = 0;
1390 int browser_scroller_w = 0;
1391 int browser_scroller_h = 0;
1392 elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, NULL,
1393 &browser_scroller_w, &browser_scroller_h);
1395 elm_scroller_region_bring_in(browser_view->m_scroller, browser_scroller_x, 0,
1396 browser_scroller_w, browser_scroller_h);
1401 void Browser_View::__ewk_view_scroll_down_cb(void *data, Evas_Object *obj, void *event_info)
1403 #ifdef BROWSER_SCROLLER_BOUNCING
1406 Browser_View *browser_view = (Browser_View *)data;
1412 int url_layout_h = 0;
1413 elm_scroller_region_get(browser_view->m_scroller, &scroller_x, &scroller_y, &scroller_w, &scroller_h);
1414 evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
1416 if (scroller_y < url_layout_h) {
1417 /* We have to hide urlbar when webview's contents are scrolled down by flicking. */
1418 if (!browser_view->m_is_scrolling)
1419 elm_scroller_region_show(browser_view->m_scroller, scroller_x, url_layout_h, scroller_w, scroller_h);
1421 browser_view->_enable_browser_scroller_scroll();
1423 browser_view->_enable_webview_scroll();
1428 void Browser_View::__ewk_view_scroll_up_cb(void *data, Evas_Object *obj, void *event_info)
1430 #ifdef BROWSER_SCROLLER_BOUNCING
1434 Browser_View *browser_view = (Browser_View *)data;
1435 browser_view->_enable_webview_scroll();
1439 void Browser_View::_set_navigationbar_title(const char *title)
1441 BROWSER_LOGD("title=[%s]", title);
1442 edje_object_part_text_set(elm_layout_edje_get(m_url_layout),
1443 "title_text", title);
1444 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_layout),
1445 "title_text", title);
1449 void Browser_View::_set_url_entry(const char *url, Eina_Bool set_secrue_icon)
1451 BROWSER_LOGD("url=[%s]", url);
1452 if (url && strlen(url)) {
1453 std::string url_without_http_scheme;
1454 if (strstr(url, BROWSER_HTTP_SCHEME) && strlen(url) > strlen(BROWSER_HTTP_SCHEME))
1455 url_without_http_scheme = std::string(url + strlen(BROWSER_HTTP_SCHEME));
1457 url_without_http_scheme = std::string(url);
1459 char *mark_up_url = elm_entry_utf8_to_markup(url_without_http_scheme.c_str());
1461 Evas_Object *entry = br_elm_editfield_entry_get(m_url_edit_field);
1462 elm_entry_entry_set(entry, mark_up_url);
1463 entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
1464 elm_entry_entry_set(entry, mark_up_url);
1466 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_edit_field),
1467 "elm.text.ellipsis", mark_up_url);
1468 edje_object_part_text_set(elm_layout_edje_get(m_url_edit_field),
1469 "elm.text.ellipsis", mark_up_url);
1473 Evas_Object *entry = br_elm_editfield_entry_get(m_url_edit_field);
1474 #if defined(FEATURE_MOST_VISITED_SITES)
1475 elm_entry_entry_set(entry, BROWSER_MOST_VISITED_SITES_URL);
1477 elm_entry_entry_set(entry, BROWSER_BLANK_PAGE_URL);
1479 entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
1480 #if defined(FEATURE_MOST_VISITED_SITES)
1481 elm_entry_entry_set(entry, BROWSER_MOST_VISITED_SITES_URL);
1483 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_edit_field),
1484 "elm.text.ellipsis", BROWSER_MOST_VISITED_SITES_URL);
1485 edje_object_part_text_set(elm_layout_edje_get(m_url_edit_field),
1486 "elm.text.ellipsis", BROWSER_MOST_VISITED_SITES_URL);
1488 elm_entry_entry_set(entry, BROWSER_BLANK_PAGE_URL);
1490 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_edit_field),
1491 "elm.text.ellipsis", BROWSER_BLANK_PAGE_URL);
1492 edje_object_part_text_set(elm_layout_edje_get(m_url_edit_field),
1493 "elm.text.ellipsis", BROWSER_BLANK_PAGE_URL);
1497 if (set_secrue_icon)
1501 void Browser_View::_stop_loading(void)
1503 BROWSER_LOGD("[%s]", __func__);
1504 if (m_focused_window->m_ewk_view)
1505 ewk_view_stop(m_focused_window->m_ewk_view);
1508 void Browser_View::_reload(void)
1510 BROWSER_LOGD("[%s]", __func__);
1511 if (m_focused_window->m_ewk_view)
1512 ewk_view_reload_bypass_cache(m_focused_window->m_ewk_view);
1515 void Browser_View::set_focused_window(Browser_Window *window
1516 #if defined(FEATURE_MOST_VISITED_SITES)
1517 ,Eina_Bool show_most_visited_sites
1521 BROWSER_LOGD("[%s]", __func__);
1522 if (m_focused_window && m_focused_window->m_ewk_view_layout) {
1523 elm_box_unpack(m_content_box, m_focused_window->m_ewk_view_layout);
1524 evas_object_hide(m_focused_window->m_ewk_view_layout);
1527 if (m_focused_window && m_focused_window->m_favicon) {
1528 if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
1529 elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
1531 evas_object_hide(m_focused_window->m_favicon);
1533 if (m_focused_window && m_focused_window->m_option_header_favicon) {
1534 if (elm_object_part_content_get(m_option_header_url_entry_layout, "elm.swallow.favicon"))
1535 elm_object_part_content_unset(m_option_header_url_entry_layout, "elm.swallow.favicon");
1537 evas_object_hide(m_focused_window->m_option_header_favicon);
1540 m_focused_window = window;
1542 if (!m_focused_window->m_ewk_view_layout) {
1543 m_focused_window->m_ewk_view_layout = elm_layout_add(m_navi_bar);
1544 if (!m_focused_window->m_ewk_view_layout) {
1545 BROWSER_LOGE("elm_layout_add failed!");
1548 if (!elm_layout_file_set(m_focused_window->m_ewk_view_layout,
1549 BROWSER_EDJE_DIR"/browser-view-main.edj",
1550 "browser/browser-view-webview")) {
1551 BROWSER_LOGE("elm_layout_file_set failed", BROWSER_EDJE_DIR);
1554 evas_object_size_hint_weight_set(m_focused_window->m_ewk_view_layout,
1555 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1556 evas_object_size_hint_align_set(m_focused_window->m_ewk_view_layout,
1557 EVAS_HINT_FILL, EVAS_HINT_FILL);
1558 elm_box_pack_end(m_content_box, m_focused_window->m_ewk_view_layout);
1559 evas_object_show(m_focused_window->m_ewk_view_layout);
1561 elm_object_part_content_set(m_focused_window->m_ewk_view_layout, "elm.swallow.webview",
1562 m_focused_window->m_ewk_view);
1563 evas_object_show(m_focused_window->m_ewk_view);
1567 * If launch the browser by aul, the grey bg is displayed shortly. */
1568 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1569 "hide,grey_background,signal", "");
1571 * The webview layout is not resized whenever repack to content box.
1572 * So resize the webview layout whenever repack. */
1573 m_resize_idler = ecore_idler_add(__webview_layout_resize_idler_cb, this);
1575 elm_box_pack_end(m_content_box, m_focused_window->m_ewk_view_layout);
1576 evas_object_show(m_focused_window->m_ewk_view_layout);
1577 evas_object_show(m_focused_window->m_ewk_view);
1580 if (!_is_loading()) {
1581 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,off,signal", "");
1582 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1583 "loading,off,signal", "");
1584 elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
1585 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
1588 /* show or hide favicon in url layout. */
1589 if (m_focused_window->m_favicon
1590 #if defined(FEATURE_MOST_VISITED_SITES)
1591 && !is_most_visited_sites_running()
1594 if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
1595 elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
1597 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.favicon",
1598 m_focused_window->m_favicon);
1599 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1600 "show,favicon,signal", "");
1601 evas_object_show(m_focused_window->m_favicon);
1604 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1605 "hide,favicon,signal", "");
1608 /* show or hide favicon in option header url layout. */
1609 if (m_focused_window->m_option_header_favicon
1610 #if defined(FEATURE_MOST_VISITED_SITES)
1611 && !is_most_visited_sites_running()
1614 if (elm_object_part_content_get(m_option_header_url_entry_layout, "elm.swallow.favicon"))
1615 elm_object_part_content_unset(m_option_header_url_entry_layout, "elm.swallow.favicon");
1617 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.favicon",
1618 m_focused_window->m_option_header_favicon);
1619 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1620 "show,favicon,signal", "");
1622 evas_object_show(m_focused_window->m_option_header_favicon);
1624 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1625 "hide,favicon,signal", "");
1628 #if defined(FEATURE_MOST_VISITED_SITES)
1629 if (show_most_visited_sites) {
1630 if (get_url().empty())
1631 _show_most_visited_sites(EINA_TRUE);
1633 _show_most_visited_sites(EINA_FALSE);
1637 std::vector<Browser_Window *> window_list = m_browser->get_window_list();
1638 _set_multi_window_controlbar_text(window_list.size());
1640 if (!_set_favicon())
1641 BROWSER_LOGE("_set_favicon failed");
1643 _update_back_forward_buttons();
1645 /* Without this code, the url is empty shortly when create deleted-window in multi window. */
1646 if (get_url().empty() && !m_focused_window->m_url.empty())
1647 _set_url_entry(m_focused_window->m_url.c_str());
1649 _set_url_entry(get_url().c_str());
1651 if (window_list.size() >= BROWSER_MULTI_WINDOW_MAX_COUNT)
1652 elm_object_item_disabled_set(m_new_window_button, EINA_TRUE);
1654 elm_object_item_disabled_set(m_new_window_button, EINA_FALSE);
1657 #if defined(FEATURE_MOST_VISITED_SITES)
1658 Eina_Bool Browser_View::_show_most_visited_sites(Eina_Bool is_show)
1660 BROWSER_LOGD("[%s]is_show=%d", __func__, is_show);
1662 m_selected_most_visited_sites_item_info.url.clear();
1663 m_selected_most_visited_sites_item_info.title.clear();
1664 m_selected_most_visited_sites_item_info.id.clear();
1666 if (!m_most_visited_sites) {
1667 m_most_visited_sites = new(nothrow) Most_Visited_Sites(m_navi_bar, this, m_most_visited_sites_db);
1668 if (!m_most_visited_sites) {
1669 BROWSER_LOGE("new Most_Visited_Sites failed");
1673 Evas_Object *most_visited_sites_layout = m_most_visited_sites->create_most_visited_sites_main_layout();
1674 if (!most_visited_sites_layout) {
1675 BROWSER_LOGE("create_most_visited_sites_main_layout failed");
1676 if (m_most_visited_sites) {
1677 delete m_most_visited_sites;
1678 m_most_visited_sites = NULL;
1682 elm_object_part_content_set(m_main_layout, "elm.swallow.most_visited_sites", most_visited_sites_layout);
1683 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1684 "show,most_visited_sites,signal", "");
1685 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1686 "show,control_bar,no_animation,signal", "");
1688 /* change the url layout for normal mode. (change the reload icon etc) */
1689 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,off,signal", "");
1690 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1691 "loading,off,signal", "");
1693 edje_object_part_text_set(elm_layout_edje_get(m_url_entry_layout),
1694 "url_guide_text", BR_STRING_URL_GUIDE_TEXT);
1695 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_entry_layout),
1696 "url_guide_text", BR_STRING_URL_GUIDE_TEXT);
1698 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,on,signal", "");
1699 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1700 "url_guide_text,on,signal", "");
1702 _set_navigationbar_title(BR_STRING_MOST_VISITED_SITES);
1703 _set_url_entry(BROWSER_MOST_VISITED_SITES_URL);
1705 /* If the speed dial is displayed for the first time, destroy the progress wheel. */
1706 if (m_dummy_loading_progressbar) {
1707 elm_object_part_content_unset(m_main_layout, "elm.swallow.waiting_progress");
1708 evas_object_del(m_dummy_loading_progressbar);
1709 m_dummy_loading_progressbar = NULL;
1710 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1711 "hide,waiting_progressbar,signal", "");
1714 elm_object_item_disabled_set(m_add_bookmark_button, EINA_TRUE);
1720 elm_scroller_region_get(m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
1721 elm_scroller_region_show(m_scroller ,scroller_x, 0, scroller_w, scroller_h);
1723 _navigationbar_visible_set_signal(EINA_TRUE);
1725 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1726 "hide,favicon,signal", "");
1727 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1728 "hide,favicon,signal", "");
1730 #ifdef BROWSER_SCROLLER_BOUNCING
1731 BROWSER_LOGD("<< lock browser scroller >>");
1732 elm_object_scroll_freeze_pop(m_scroller);
1733 elm_object_scroll_freeze_push(m_scroller);
1736 if (m_most_visited_sites) {
1737 if (elm_object_part_content_get(m_main_layout, "elm.swallow.most_visited_sites"))
1738 elm_object_part_content_unset(m_main_layout, "elm.swallow.most_visited_sites");
1739 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1740 "hide,most_visited_sites,signal", "");
1741 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1742 "hide,most_visited_sites_guide_text,signal", "");
1744 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,off,signal", "");
1745 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1746 "url_guide_text,off,signal", "");
1748 delete m_most_visited_sites;
1749 m_most_visited_sites = NULL;
1751 elm_object_item_disabled_set(m_add_bookmark_button, EINA_FALSE);
1758 void Browser_View::load_url(const char *url)
1760 BROWSER_LOGD("[%s]", __func__);
1761 #if defined(FEATURE_MOST_VISITED_SITES)
1762 if (!url || !strlen(url)) {
1763 if (!_show_most_visited_sites(EINA_TRUE))
1764 BROWSER_LOGE("_show_most_visited_sites EINA_TRUE failed");
1768 if (!_show_most_visited_sites(EINA_FALSE))
1769 BROWSER_LOGE("_show_most_visited_sites EINA_FALSE failed");
1773 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(_get_activated_url_entry());
1774 evas_object_smart_callback_del(edit_field_entry, "changed", __url_entry_changed_cb);
1776 std::string full_url;
1777 if (_has_url_sheme(url))
1780 full_url = std::string(BROWSER_HTTP_SCHEME) + std::string(url);
1782 BROWSER_LOGD("full_url = [%s]", full_url.c_str());
1784 _set_url_entry(full_url.c_str());
1786 ewk_view_uri_set(m_focused_window->m_ewk_view, full_url.c_str());
1789 string Browser_View::get_title(Browser_Window *window)
1791 const char *title = ewk_view_title_get(window->m_ewk_view);
1792 BROWSER_LOGD("title = [%s]", title);
1794 if (!window->m_ewk_view && !window->m_title.empty())
1795 return window->m_title;
1797 if (!window->m_ewk_view)
1798 return std::string();
1801 if (!window->m_title.empty())
1802 return window->m_title;
1804 return std::string();
1807 return std::string(title);
1810 string Browser_View::get_title(void)
1812 const char *title = ewk_view_title_get(m_focused_window->m_ewk_view);
1813 BROWSER_LOGD("title = [%s]", title);
1815 if (!title && m_focused_window->m_title.empty())
1816 return std::string();
1817 else if (!title && !m_focused_window->m_title.empty())
1818 return m_focused_window->m_title;
1820 if (title && strlen(title))
1821 return std::string(title);
1823 return std::string();
1826 string Browser_View::get_url(Browser_Window *window)
1828 BROWSER_LOGD("[%s]", __func__);
1830 if (!window->m_ewk_view && !window->m_url.empty())
1831 return window->m_url;
1833 if (!window->m_ewk_view)
1834 return std::string();
1836 const char *uri = ewk_view_uri_get(window->m_ewk_view);
1837 BROWSER_LOGD("uri = [%s]", uri);
1839 if (!uri || strlen(uri) == 0)
1840 return std::string();
1842 return std::string(uri);
1845 string Browser_View::get_url(void)
1847 const char *uri = ewk_view_uri_get(m_focused_window->m_ewk_view);
1848 BROWSER_LOGD("uri = [%s]", uri);
1850 if (!uri || strlen(uri) == 0)
1851 return std::string();
1853 return std::string(uri);
1856 /* If multi window is running, unset the navigation title object,
1857 * else set the navigation title object to show title object arrow. */
1858 void Browser_View::unset_navigationbar_title_object(Eina_Bool is_unset)
1860 BROWSER_LOGD("[%s] is_unset =%d", __func__, is_unset);
1861 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
1863 _navigationbar_visible_set_signal(EINA_FALSE);
1864 elm_object_item_part_content_unset(top_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER);
1865 evas_object_hide(m_option_header_layout);
1867 Evas_Object *title_object = NULL;
1868 title_object = elm_object_item_part_content_get(top_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER);
1869 if (!title_object) {
1870 elm_object_item_part_content_set(top_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER,
1871 m_option_header_layout);
1872 evas_object_show(m_option_header_layout);
1874 #if defined(FEATURE_MOST_VISITED_SITES)
1875 if (!is_most_visited_sites_running())
1876 _navigationbar_visible_set_signal(EINA_FALSE);
1881 void Browser_View::__go_to_bookmark_cb(void *data, Evas_Object *obj, void *event_info)
1883 BROWSER_LOGD("[%s]", __func__);
1887 Browser_View *browser_view = (Browser_View *)data;
1889 if (!m_data_manager->create_bookmark_view()) {
1890 BROWSER_LOGE("m_data_manager->create_bookmark_view failed");
1894 if (!m_data_manager->get_bookmark_view()->init()) {
1895 BROWSER_LOGE("m_data_manager->get_bookmark_view()->init failed");
1896 m_data_manager->destroy_bookmark_view();
1899 browser_view->_destroy_more_context_popup();
1902 void Browser_View::__backward_cb(void *data, Evas_Object *obj, void *event_info)
1904 BROWSER_LOGD("[%s]", __func__);
1908 Browser_View *browser_view = (Browser_View *)data;
1909 __title_back_button_clicked_cb(data, NULL, NULL);
1911 browser_view->_destroy_more_context_popup();
1914 void Browser_View::__forward_cb(void *data, Evas_Object *obj, void *event_info)
1916 BROWSER_LOGD("[%s]", __func__);
1920 Browser_View *browser_view = (Browser_View *)data;
1921 browser_view->_destroy_more_context_popup();
1922 if (browser_view->m_focused_window->m_ewk_view
1923 && ewk_view_forward_possible(browser_view->m_focused_window->m_ewk_view))
1924 ewk_view_forward(browser_view->m_focused_window->m_ewk_view);
1928 void Browser_View::__web_app_capable_get_cb(Eina_Bool capable, void* user_data)
1930 BROWSER_LOGD("[%s]", __func__);
1935 Browser_View *browser_view = (Browser_View *)user_data;
1936 Evas_Object *webkit = browser_view->m_focused_window->m_ewk_view;
1938 ewk_view_web_application_icon_url_get(webkit, __web_app_icon_url_get_cb, browser_view);
1942 void Browser_View::__web_app_icon_url_get_cb(const char* icon_url, void* user_data)
1944 BROWSER_LOGD("icon_url:%s", icon_url);
1949 Browser_View *browser_view = (Browser_View *)user_data;
1951 /* make configure file */
1952 browser_view->m_meta_tag->create_config_xml((browser_view->get_url()).c_str(), browser_view->get_title().c_str(), NULL);
1953 if (!icon_url || strlen(icon_url) == 0) {
1954 BROWSER_LOGD("Failed to get webapp icon url, make widget with default icon");
1955 browser_view->m_meta_tag->wgt_install(NULL);
1957 BROWSER_LOGD("Succeed to get webapp icon url, make widget after icon downloaded");
1959 browser_view->m_meta_tag->request_download_icon(icon_url);
1964 Eina_Bool Browser_View::__show_scissorbox_view_idler_cb(void *data)
1967 return ECORE_CALLBACK_CANCEL;
1969 Browser_View *browser_view = (Browser_View *)data;
1971 if (browser_view->m_scissorbox_view)
1972 delete browser_view->m_scissorbox_view;
1974 browser_view->m_scissorbox_view = new(nothrow) Browser_Scissorbox_View(browser_view);
1975 if (!browser_view->m_scissorbox_view) {
1976 BROWSER_LOGE("new Browser_Scissorbox_View failed");
1977 return ECORE_CALLBACK_CANCEL;
1979 if (!browser_view->m_scissorbox_view->init()) {
1980 BROWSER_LOGE("m_scissorbox_view->init failed");
1981 delete browser_view->m_scissorbox_view;
1982 browser_view->m_scissorbox_view = NULL;
1983 return ECORE_CALLBACK_CANCEL;
1986 elm_object_part_content_set(browser_view->m_main_layout, "elm.swallow.scissorbox",
1987 browser_view->m_scissorbox_view->get_layout());
1988 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout),
1989 "show,scissorbox,signal", "");
1991 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_layout),
1992 "show,scissorbox,signal", "");
1993 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_layout),
1994 "show,scissorbox,signal", "");
1997 elm_object_part_content_unset(browser_view->m_main_layout, "elm.swallow.control_bar");
1998 evas_object_hide(browser_view->m_control_bar);
2000 return ECORE_CALLBACK_CANCEL;
2003 Eina_Bool Browser_View::_show_scissorbox_view(void)
2005 BROWSER_LOGD("[%s]", __func__);
2007 // _hide_scroller_url_layout();
2009 ecore_idler_add(__show_scissorbox_view_idler_cb, this);
2014 void Browser_View::_destroy_scissorbox_view(void)
2016 elm_object_part_content_unset(m_main_layout, "elm.swallow.scissorbox");
2017 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "hide,scissorbox,signal", "");
2019 edje_object_signal_emit(elm_layout_edje_get(m_url_layout),
2020 "hide,scissorbox,signal", "");
2021 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2022 "hide,scissorbox,signal", "");
2024 elm_object_part_content_unset(m_main_layout, "elm.swallow.control_bar");
2026 if (m_scissorbox_view) {
2027 delete m_scissorbox_view;
2028 m_scissorbox_view = NULL;
2031 elm_object_part_content_set(m_main_layout, "elm.swallow.control_bar", m_control_bar);
2032 evas_object_show(m_control_bar);
2035 void Browser_View::__private_cb(void *data, Evas_Object *obj, void *event_info)
2037 BROWSER_LOGD("[%s]", __func__);
2041 Browser_View *browser_view = (Browser_View *)data;
2042 browser_view->m_is_private = !browser_view->m_is_private;
2044 browser_view->m_is_private_item_pressed = EINA_TRUE;
2046 elm_check_state_set(browser_view->m_private_check, browser_view->m_is_private);
2048 if (browser_view->m_is_private) {
2049 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,on,signal", "");
2050 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,on,signal", "");
2052 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,off,signal", "");
2053 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,off,signal", "");
2056 Ewk_Setting *setting = ewk_view_setting_get(browser_view->m_focused_window->m_ewk_view);
2057 ewk_setting_private_browsing_set(setting, browser_view->m_is_private);
2060 void Browser_View::__bookmark_cb(void *data, Evas_Object *obj, void *event_info)
2062 BROWSER_LOGD("[%s]", __func__);
2066 Browser_View *browser_view = (Browser_View *)data;
2067 int bookmark_id = -1;
2068 if(!m_data_manager->get_history_db()->is_in_bookmark(browser_view->get_url().c_str(), &bookmark_id)) {
2069 if (!elm_icon_file_set(browser_view->m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_on.png", NULL)) {
2070 BROWSER_LOGE("elm_icon_file_set is failed.\n");
2073 m_data_manager->create_bookmark_db()->save_bookmark(BROWSER_BOOKMARK_MAIN_FOLDER_ID,
2074 browser_view->get_title().c_str(), browser_view->get_url().c_str());
2075 browser_view->show_notify_popup(BR_STRING_ADDED_TO_BOOKMARKS, 3, EINA_TRUE);
2077 if (!elm_icon_file_set(browser_view->m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_off.png", NULL)) {
2078 BROWSER_LOGE("elm_icon_file_set is failed.\n");
2081 m_data_manager->create_bookmark_db()->delete_bookmark(bookmark_id);
2082 browser_view->show_notify_popup(BR_STRING_REMOVED_TO_BOOKMARKS, 3, EINA_TRUE);
2085 m_data_manager->destroy_bookmark_db();
2088 void Browser_View::__bookmark_icon_changed_cb(void *data, Evas_Object *obj, void *event_info)
2090 BROWSER_LOGD("[%s]", __func__);
2094 Browser_View *browser_view = (Browser_View *)data;
2097 void Browser_View::__private_check_change_cb(void *data, Evas_Object *obj, void *event_info)
2099 BROWSER_LOGD("[%s]", __func__);
2103 Browser_View *browser_view = (Browser_View *)data;
2104 Eina_Bool state = elm_check_state_get((Evas_Object*)obj);
2105 browser_view->m_is_private = state;
2107 if (browser_view->m_is_private_item_pressed) {
2108 browser_view->m_is_private = !browser_view->m_is_private;
2109 elm_check_state_set(browser_view->m_private_check, browser_view->m_is_private);
2110 browser_view->m_is_private_item_pressed = EINA_FALSE;
2113 if (browser_view->m_is_private) {
2114 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,on,signal", "");
2115 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,on,signal", "");
2117 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,off,signal", "");
2118 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,off,signal", "");
2121 Ewk_Setting *setting = ewk_view_setting_get(browser_view->m_focused_window->m_ewk_view);
2122 ewk_setting_private_browsing_set(setting, browser_view->m_is_private);
2125 void Browser_View::__expand_option_header_cb(void *data, Evas_Object *obj, void *event_info)
2127 BROWSER_LOGD("[%s]", __func__);
2131 Browser_View *browser_view = (Browser_View *)data;
2133 browser_view->_navigationbar_title_clicked();
2136 void Browser_View::__add_bookmark_cb(void *data, Evas_Object *obj, void *event_info)
2138 BROWSER_LOGD("[%s]", __func__);
2142 Browser_View *browser_view = (Browser_View *)data;
2143 if (!m_data_manager->create_add_to_bookmark_view(browser_view->get_title(), browser_view->get_url())) {
2144 BROWSER_LOGE("m_data_manager->create_add_to_bookmark_view failed");
2148 if (!m_data_manager->get_add_to_bookmark_view()->init())
2149 m_data_manager->destroy_add_to_bookmark_view();
2152 #if defined(HORIZONTAL_UI)
2153 void Browser_View::_rotate_multi_window(void)
2155 BROWSER_LOGD("[%s]", __func__);
2157 if (!m_data_manager->create_multi_window_view()) {
2158 BROWSER_LOGE("m_data_manager->create_multi_window_view failed");
2162 if (!m_data_manager->get_multi_window_view()->init(0.0, m_is_multi_window_grid_mode)) {
2163 m_data_manager->destroy_multi_window_view();
2164 BROWSER_LOGE("get_multi_window_view()->init failed");
2168 ewk_view_suspend(m_focused_window->m_ewk_view);
2170 _navigationbar_visible_set_signal(EINA_FALSE);
2172 /* Hide the secure lock icon in title bar. */
2173 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
2174 elm_object_item_part_content_set(top_it, ELM_NAVIFRAME_ITEM_ICON, NULL);
2176 if (_get_edit_mode() != BR_NO_EDIT_MODE)
2177 _set_edit_mode(BR_NO_EDIT_MODE);
2179 m_is_multi_window_grid_mode = EINA_FALSE;
2183 void Browser_View::__multi_window_cb(void *data, Evas_Object *obj, void *event_info)
2185 BROWSER_LOGD("[%s]", __func__);
2187 Browser_View *browser_view = (Browser_View *)data;
2188 browser_view->_destroy_more_context_popup();
2190 #if defined(FEATURE_MOST_VISITED_SITES)
2191 if (browser_view->m_most_visited_sites && browser_view->m_most_visited_sites->is_guide_text_running())
2195 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
2196 BROWSER_LOGD("close multi window");
2197 m_data_manager->get_multi_window_view()->close_multi_window();
2201 if (!m_data_manager->create_multi_window_view()) {
2202 BROWSER_LOGE("m_data_manager->create_multi_window_view failed");
2206 if (!m_data_manager->get_multi_window_view()->init()) {
2207 m_data_manager->destroy_multi_window_view();
2208 BROWSER_LOGE("get_multi_window_view()->init failed");
2212 /* Exception case to call ewk_view_suspend directly.
2213 * That's because the webpage is cleared, when call ewk_view_visibility_set suspend_ewk_view */
2214 ewk_view_suspend(browser_view->m_focused_window->m_ewk_view);
2215 ewk_view_visibility_set(browser_view->m_focused_window->m_ewk_view, EINA_FALSE);
2217 browser_view->_navigationbar_visible_set_signal(EINA_FALSE);
2219 /* Hide the secure lock icon in title bar. */
2220 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
2221 elm_object_item_part_content_set(top_it, ELM_NAVIFRAME_ITEM_ICON, NULL);
2223 if (browser_view->_get_edit_mode() != BR_NO_EDIT_MODE)
2224 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2227 void Browser_View::__new_window_cb(void *data, Evas_Object *obj, void *event_info)
2229 BROWSER_LOGD("[%s]", __func__);
2233 Browser_View *browser_view = (Browser_View *)data;
2234 Browser_Class *browser = browser_view->m_browser;
2236 if (browser_view->m_resize_idler)
2239 std::vector<Browser_Window *> window_list = browser->get_window_list();
2240 if (window_list.size() >= BROWSER_MULTI_WINDOW_MAX_COUNT) {
2241 /* If the multi window is max, delete the first one. */
2242 /* if the first window is focused, delete second one(oldest one except first one) */
2243 if (browser_view->m_focused_window != window_list[0])
2244 browser->delete_window(window_list[0]);
2246 browser->delete_window(window_list[1]);
2249 browser_view->m_created_new_window = browser->create_new_window(EINA_TRUE);
2250 if (!browser_view->m_created_new_window) {
2251 BROWSER_LOGE("create_new_window failed");
2254 /* initialize the created webview first to connect ewk event callback functions such as load start, progress etc. */
2255 ewk_view_suspend(browser_view->m_focused_window->m_ewk_view);
2257 #if defined(HORIZONTAL_UI)
2258 if (browser_view->m_focused_window->m_landscape_snapshot_image) {
2259 evas_object_del(browser_view->m_focused_window->m_landscape_snapshot_image);
2260 browser_view->m_focused_window->m_landscape_snapshot_image = NULL;
2263 if (browser_view->m_focused_window->m_portrait_snapshot_image) {
2264 evas_object_del(browser_view->m_focused_window->m_portrait_snapshot_image);
2265 browser_view->m_focused_window->m_portrait_snapshot_image = NULL;
2268 #if defined(HORIZONTAL_UI)
2269 if (browser_view->is_landscape())
2270 browser_view->m_focused_window->m_landscape_snapshot_image = browser_view->_capture_snapshot(browser_view->m_focused_window, BROWSER_MULTI_WINDOW_ITEM_RATIO);
2273 browser_view->m_focused_window->m_portrait_snapshot_image = browser_view->_capture_snapshot(browser_view->m_focused_window, BROWSER_MULTI_WINDOW_ITEM_RATIO);
2275 #if defined(FEATURE_MOST_VISITED_SITES)
2276 if (!browser_view->_show_most_visited_sites(EINA_FALSE))
2277 BROWSER_LOGE("_show_most_visited_sites EINA_FALSE failed");
2280 /* initialize the created webview first to connect ewk event callback functions such as load start, progress etc. */
2281 browser->ewk_view_init(browser_view->m_created_new_window->m_ewk_view);
2283 if (!browser_view->_show_new_window_effect(browser_view->m_focused_window->m_ewk_view,
2284 browser_view->m_created_new_window->m_ewk_view))
2285 BROWSER_LOGE("_show_new_window_effect failed");
2287 #if defined(FEATURE_MOST_VISITED_SITES)
2288 browser_view->load_url(BROWSER_MOST_VISITED_SITES_URL);
2290 browser_view->load_url(BROWSER_BLANK_PAGE_URL);
2295 Eina_Bool Browser_View::_call_internet_settings(void)
2297 BROWSER_LOGD("[%s]", __func__);
2299 m_browser_settings = new(nothrow) Browser_Settings_Class;
2300 if (!m_browser_settings) {
2301 BROWSER_LOGE("new Browser_Settings_Class failed");
2304 if (!m_browser_settings->init()) {
2305 BROWSER_LOGE("m_browser_settings->init failed");
2306 delete m_browser_settings;
2307 m_browser_settings = NULL;
2314 void Browser_View::__internet_settings_cb(void *data, Evas_Object *obj, void *event_info)
2316 BROWSER_LOGD("[%s]", __func__);
2320 Browser_View *browser_view = (Browser_View *)data;
2321 browser_view->_destroy_more_context_popup();
2323 if (!browser_view->_call_internet_settings())
2324 BROWSER_LOGE("_call_internet_settings failed");
2327 void Browser_View::_update_find_word_index_text(const char *index_text, int index, int max_match_cnt)
2329 BROWSER_LOGD("[%s]", __func__);
2331 edje_object_part_text_set(elm_layout_edje_get(m_option_header_find_word_layout), "elm.index_text", index_text);
2333 if (max_match_cnt == 0 || max_match_cnt == 1) {
2334 elm_object_disabled_set(m_find_word_prev_button, EINA_TRUE);
2335 elm_object_disabled_set(m_find_word_next_button, EINA_TRUE);
2336 } else if (index == 0 || index == 1) {
2337 elm_object_disabled_set(m_find_word_prev_button, EINA_TRUE);
2338 elm_object_disabled_set(m_find_word_next_button, EINA_FALSE);
2339 if (index == 0 || (index == 1 && elm_object_focus_get(m_find_word_cancel_button)))
2340 elm_object_focus_set(m_find_word_cancel_button, EINA_TRUE);
2341 } else if (index == max_match_cnt) {
2342 elm_object_disabled_set(m_find_word_prev_button, EINA_FALSE);
2343 elm_object_disabled_set(m_find_word_next_button, EINA_TRUE);
2344 elm_object_focus_set(m_find_word_cancel_button, EINA_TRUE);
2346 if (elm_object_disabled_get(m_find_word_prev_button))
2347 elm_object_disabled_set(m_find_word_prev_button, EINA_FALSE);
2348 if (elm_object_disabled_get(m_find_word_next_button))
2349 elm_object_disabled_set(m_find_word_next_button, EINA_FALSE);
2352 void Browser_View::__find_word_cb(void *data, Evas_Object *obj, void *event_info)
2354 BROWSER_LOGD("[%s]", __func__);
2358 Browser_View *browser_view = (Browser_View *)data;
2359 browser_view->_destroy_more_context_popup();
2361 if (browser_view->_get_edit_mode() == BR_FIND_WORD_MODE)
2364 /* find word layout is only in naviframe optino header.
2365 * So expand the option header to show find word layout. */
2366 browser_view->_navigationbar_visible_set_signal(EINA_TRUE);
2368 browser_view->_set_edit_mode(BR_FIND_WORD_MODE);
2370 elm_object_focus_set(browser_view->m_find_word_edit_field, EINA_TRUE);
2372 edje_object_part_text_set(elm_layout_edje_get(browser_view->m_option_header_find_word_layout), "elm.index_text", "0/0");
2375 Eina_Bool Browser_View::_call_download_manager(void)
2377 service_h service_handle = NULL;
2378 BROWSER_LOGD("[%s]", __func__);
2380 if (service_create(&service_handle) < 0) {
2381 BROWSER_LOGE("Fail to create service handle");
2385 if (!service_handle) {
2386 BROWSER_LOGE("service handle is NULL");
2390 if (service_set_operation(service_handle, SERVICE_OPERATION_DOWNLOAD) < 0) {
2391 BROWSER_LOGE("Fail to set service operation");
2392 service_destroy(service_handle);
2396 if (service_add_extra_data(service_handle, "mode", "view") < 0) {
2397 BROWSER_LOGE("Fail to set extra data");
2398 service_destroy(service_handle);
2402 if (service_send_launch_request(service_handle, NULL, NULL) < 0) {
2403 BROWSER_LOGE("Fail to launch service operation");
2404 service_destroy(service_handle);
2408 service_destroy(service_handle);
2413 void Browser_View::__download_manager_cb(void *data, Evas_Object *obj, void *event_info)
2415 BROWSER_LOGD("[%s]", __func__);
2419 Browser_View *browser_view = (Browser_View *)data;
2420 browser_view->_destroy_more_context_popup();
2422 if (!browser_view->_call_download_manager())
2423 BROWSER_LOGE("_call_download_manager failed");
2426 void Browser_View::__send_via_message_cb(void *data, Evas_Object *obj, void *event_info)
2428 BROWSER_LOGD("[%s]", __func__);
2432 Browser_View *browser_view = (Browser_View *)data;
2433 browser_view->_destroy_more_context_popup();
2435 if (!browser_view->_send_via_message(browser_view->get_url(), std::string()))
2436 BROWSER_LOGE("_send_via_message failed");
2439 void Browser_View::__send_via_email_cb(void *data, Evas_Object *obj, void *event_info)
2441 BROWSER_LOGD("[%s]", __func__);
2445 Browser_View *browser_view = (Browser_View *)data;
2446 browser_view->_destroy_more_context_popup();
2448 if (!browser_view->_send_via_email(browser_view->get_url()))
2449 BROWSER_LOGE("_send_via_email failed");
2452 void Browser_View::__post_to_sns_cb(void *data, Evas_Object *obj, void *event_info)
2454 BROWSER_LOGD("[%s]", __func__);
2458 Browser_View *browser_view = (Browser_View*)data;
2460 Elm_Object_Item *it = (Elm_Object_Item *)event_info;
2461 const char *label = elm_object_item_text_get(it);
2462 BROWSER_LOGD("label=[%s]", label);
2463 if (label && strlen(label)) {
2464 if (!browser_view->_post_to_sns(std::string(label), browser_view->get_url()))
2465 BROWSER_LOGE("_post_to_sns failed");
2468 browser_view->_destroy_more_context_popup();
2471 void Browser_View::_destroy_more_context_popup(void)
2473 if (m_more_context_popup) {
2474 evas_object_del(m_more_context_popup);
2475 m_more_context_popup = NULL;
2478 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "hide,more_context_bg,signal", "");
2481 void Browser_View::__more_context_popup_dismissed_cb(void *data, Evas_Object *obj,
2484 BROWSER_LOGD("[%s]", __func__);
2488 Browser_View *browser_view = (Browser_View *)data;
2489 browser_view->_destroy_more_context_popup();
2492 void Browser_View::__clean_up_windows_test_cb(void *data, Evas_Object *obj, void *event_info)
2497 Browser_View *browser_view = (Browser_View *)data;
2498 browser_view->_destroy_more_context_popup();
2500 m_browser->clean_up_windows();
2503 Eina_Bool Browser_View::_show_more_context_popup(void)
2505 BROWSER_LOGD("[%s]", __func__);
2507 _destroy_more_context_popup();
2509 m_more_context_popup = elm_ctxpopup_add(m_win);
2510 if (!m_more_context_popup) {
2511 BROWSER_LOGE("elm_ctxpopup_add failed");
2515 elm_object_style_set(m_more_context_popup, "pass_event");
2517 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "show,more_context_bg,signal", "");
2519 evas_object_size_hint_weight_set(m_more_context_popup, EVAS_HINT_EXPAND,
2521 evas_object_smart_callback_add(m_more_context_popup, "dismissed",
2522 __more_context_popup_dismissed_cb, this);
2524 Elm_Object_Item *sub_menu = NULL;
2525 elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_DOWNLOAD_MANAGER, NULL,
2526 __download_manager_cb, this);
2528 sub_menu = elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_FIND_ON_PAGE, NULL,
2529 __find_word_cb, this);
2531 #if defined(FEATURE_MOST_VISITED_SITES)
2532 is_most_visited_sites_running() ||
2535 || _get_edit_mode() == BR_FIND_WORD_MODE)
2536 elm_object_item_disabled_set(sub_menu, EINA_TRUE);
2538 m_bookmark_on_off_icon = elm_icon_add(m_more_context_popup);
2540 if(m_data_manager->get_history_db()->is_in_bookmark(get_url().c_str(), NULL)) {
2541 if (!elm_icon_file_set(m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_on.png", NULL)) {
2542 BROWSER_LOGE("elm_icon_file_set is failed.\n");
2546 if (!elm_icon_file_set(m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_off.png", NULL)) {
2547 BROWSER_LOGE("elm_icon_file_set is failed.\n");
2551 evas_object_size_hint_aspect_set(m_bookmark_on_off_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
2553 evas_object_propagate_events_set(m_bookmark_on_off_icon, EINA_FALSE);
2554 evas_object_repeat_events_set(m_bookmark_on_off_icon, EINA_FALSE);
2555 evas_object_smart_callback_add(m_bookmark_on_off_icon, "clicked", __bookmark_icon_changed_cb, this);
2557 sub_menu = elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_BOOKMARK, m_bookmark_on_off_icon,
2558 __bookmark_cb, this);
2560 #if defined(FEATURE_MOST_VISITED_SITES)
2561 is_most_visited_sites_running() ||
2564 || _get_edit_mode() == BR_FIND_WORD_MODE)
2565 elm_object_item_disabled_set(sub_menu, EINA_TRUE);
2567 m_private_check = elm_check_add(m_more_context_popup);
2568 elm_object_style_set(m_private_check, "on&off");
2569 evas_object_smart_callback_add(m_private_check, "changed", __private_check_change_cb, this);
2571 elm_check_state_set(m_private_check, m_is_private);
2572 evas_object_propagate_events_set(m_private_check, EINA_FALSE);
2573 evas_object_show(m_private_check);
2575 elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_PRIVATE, m_private_check,
2576 __private_cb, this);
2578 elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_SETTINGS, NULL,
2579 __internet_settings_cb, this);
2581 elm_ctxpopup_hover_parent_set(m_more_context_popup, m_navi_bar);
2583 int controlbar_x = 0;
2584 int controlbar_y = 0;
2585 int controlbar_w = 0;
2586 int controlbar_h = 0;
2587 evas_object_geometry_get(m_control_bar, &controlbar_x, &controlbar_y, &controlbar_w, &controlbar_h);
2589 evas_object_move(m_more_context_popup, (controlbar_w / 5) * 3 + controlbar_w / 10, controlbar_y + (controlbar_h / 2));
2591 evas_object_show(m_more_context_popup);
2596 void Browser_View::__more_cb(void *data, Evas_Object *obj, void *event_info)
2598 BROWSER_LOGD("[%s]", __func__);
2602 Browser_View *browser_view = (Browser_View *)data;
2603 if (browser_view->m_more_context_popup == NULL) {
2604 if (!browser_view->_show_more_context_popup())
2605 BROWSER_LOGE("_show_more_context_popup failed");
2607 browser_view->_destroy_more_context_popup();
2610 browser_view->_navigationbar_visible_set(EINA_TRUE);
2613 void Browser_View::_set_controlbar_back_forward_status(void)
2615 BROWSER_LOGD("[%s]", __func__);
2616 Evas_Object *ewk_view = m_focused_window->m_ewk_view;
2621 #if defined(FEATURE_MOST_VISITED_SITES)
2622 is_most_visited_sites_running() ||
2625 elm_object_item_disabled_set(m_share_controlbar_button, EINA_TRUE);
2627 elm_object_item_disabled_set(m_share_controlbar_button, EINA_FALSE);
2630 void Browser_View::_set_multi_window_controlbar_text(int count)
2632 BROWSER_LOGD("[%s]", __func__);
2634 elm_toolbar_item_icon_set(m_multi_window_button, BROWSER_IMAGE_DIR"/01_controlbar_icon_multiview.png");
2636 char icon_path[100] = {0, };
2637 snprintf(icon_path, sizeof(icon_path) - 1, "%s/01_controlbar_icon_multiview_0%d.png", BROWSER_IMAGE_DIR, count);
2638 elm_toolbar_item_icon_set(m_multi_window_button, icon_path);
2642 Evas_Object *Browser_View::_create_control_bar(void)
2644 BROWSER_LOGD("[%s]", __func__);
2645 Evas_Object *controlbar_layout;
2646 controlbar_layout = elm_layout_add(m_navi_bar);
2647 if (!controlbar_layout) {
2648 BROWSER_LOGE("elm_layout_add failed");
2651 if (!elm_layout_file_set(controlbar_layout, BROWSER_EDJE_DIR"/browser-view-control-bar.edj",
2652 "browser-view-controlbar")) {
2653 BROWSER_LOGE("Can not set layout browser-view-controlbar\n");
2656 evas_object_size_hint_weight_set(controlbar_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2657 evas_object_size_hint_align_set(controlbar_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
2658 evas_object_show(controlbar_layout);
2660 Evas_Object *control_bar;
2661 control_bar = elm_toolbar_add(m_navi_bar);
2663 elm_object_style_set(control_bar, "browser/browser-view");
2665 elm_toolbar_shrink_mode_set(control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
2667 /* New Window Button */
2668 m_new_window_button = elm_toolbar_item_append(control_bar,
2669 BROWSER_IMAGE_DIR"/I01_controlbar_icon_new_window.png", NULL, __new_window_cb, this);
2670 if (!m_new_window_button) {
2671 BROWSER_LOGE("elm_toolbar_item_append failed");
2675 /* Multi Window Button */
2676 m_multi_window_button = elm_toolbar_item_append(control_bar,
2677 BROWSER_IMAGE_DIR"/01_controlbar_icon_multiview.png", NULL, __multi_window_cb, this);
2678 /* Bookmark Button */
2679 elm_toolbar_item_append(control_bar, BROWSER_IMAGE_DIR"/I01_controlbar_icon_bookmark.png",
2680 NULL, __go_to_bookmark_cb, this);
2681 /* More menu Button */
2682 m_more_button = elm_toolbar_item_append(control_bar,
2683 BROWSER_IMAGE_DIR"/I01_controlbar_icon_more.png", NULL, __more_cb, this);
2684 if (!m_more_button) {
2685 BROWSER_LOGE("elm_toolbar_item_append failed");
2689 elm_object_part_content_set(controlbar_layout, "elm.swallow.controlbar", control_bar);
2691 m_back_button = elm_button_add(control_bar);
2692 if (!m_back_button) {
2693 BROWSER_LOGE("elm_button_add failed");
2696 elm_object_style_set(m_back_button, "browser/browser_view_controlbar_back");
2698 elm_object_part_content_set(controlbar_layout, "elm.swallow.back_button", m_back_button);
2699 evas_object_smart_callback_add(m_back_button, "clicked", __backward_cb, this);
2700 evas_object_show(m_back_button);
2701 evas_object_show(control_bar);
2704 return controlbar_layout;
2708 * Create two same url layouts similar with other browsers like android & safari.
2709 * The one(by _create_url_layout) is in the browser scroller and
2710 * the other(by _create_option_header_url_layout) is in the navigation bar option header.
2712 Evas_Object *Browser_View::_create_option_header_url_layout(void)
2714 BROWSER_LOGD("[%s]", __func__);
2715 Evas_Object *url_layout;
2716 url_layout = elm_layout_add(m_navi_bar);
2718 if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
2719 "browser/url_layout")) {
2720 BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
2723 evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2724 evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
2725 evas_object_show(url_layout);
2727 m_option_header_url_entry_layout = elm_layout_add(m_navi_bar);
2728 if (!m_option_header_url_entry_layout) {
2729 BROWSER_LOGE("elm_layout_add failed");
2732 if (!elm_layout_file_set(m_option_header_url_entry_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
2733 "elm/browser/urlentry/default")) {
2734 BROWSER_LOGE("Can not set layout theme[browser, urlentry, default]\n");
2737 elm_object_part_content_set(url_layout, "elm.swallow.url", m_option_header_url_entry_layout);
2738 edje_object_signal_callback_add(elm_layout_edje_get(m_option_header_url_entry_layout),
2739 "mouse,clicked,1", "elm.swallow.entry", __url_entry_clicked_cb, this);
2741 edje_object_signal_callback_add(elm_layout_edje_get(m_option_header_url_entry_layout),
2742 "refresh_stop", "*", __refresh_button_clicked_cb, this);
2744 evas_object_show(m_option_header_url_entry_layout);
2746 m_option_header_url_edit_field = br_elm_url_editfield_add(m_navi_bar);
2747 if (!m_option_header_url_edit_field) {
2748 BROWSER_LOGE("elm_editfield_add failed");
2752 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.entry", m_option_header_url_edit_field);
2753 // br_elm_editfield_entry_single_line_set(m_option_header_url_edit_field, EINA_TRUE);
2754 br_elm_editfield_eraser_set(m_option_header_url_edit_field, EINA_FALSE);
2756 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
2757 elm_entry_input_panel_layout_set(edit_field_entry, ELM_INPUT_PANEL_LAYOUT_URL);
2758 ecore_imf_context_input_panel_event_callback_add((Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry),
2759 ECORE_IMF_INPUT_PANEL_STATE_EVENT, __url_entry_imf_event_cb, this);
2761 evas_object_smart_callback_add(edit_field_entry, "activated", __url_entry_enter_key_cb, this);
2762 evas_event_callback_add(evas_object_evas_get(m_option_header_url_edit_field), EVAS_CALLBACK_CANVAS_FOCUS_OUT,
2763 __url_entry_focus_out_cb, this);
2764 evas_object_show(m_option_header_url_edit_field);
2766 m_option_header_url_progressbar = elm_progressbar_add(m_navi_bar);
2767 if (!m_option_header_url_progressbar) {
2768 BROWSER_LOGE("elm_progressbar_add failed");
2771 elm_object_style_set(m_option_header_url_progressbar, "browser/loading");
2772 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.progressbar", m_option_header_url_progressbar);
2773 elm_progressbar_value_set(m_option_header_url_progressbar, 0);
2774 evas_object_show(m_option_header_url_progressbar);
2776 m_option_header_url_progresswheel = elm_progressbar_add(m_navi_bar);
2777 if (!m_option_header_url_progresswheel) {
2778 BROWSER_LOGE("elm_progressbar_add failed");
2782 elm_object_style_set(m_option_header_url_progresswheel, "UIActivityIndicatorStyleWhite");
2784 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
2785 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.progress", m_option_header_url_progresswheel);
2786 evas_object_show(m_option_header_url_progresswheel);
2788 m_option_header_cancel_button = elm_button_add(m_navi_bar);
2789 if (!m_option_header_cancel_button) {
2790 BROWSER_LOGE("elm_button_add failed");
2793 evas_object_size_hint_weight_set(m_option_header_cancel_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2794 evas_object_size_hint_align_set(m_option_header_cancel_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
2795 elm_object_style_set(m_option_header_cancel_button, "browser/cancel_button");
2796 elm_object_text_set(m_option_header_cancel_button, BR_STRING_CANCEL);
2797 elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_option_header_cancel_button);
2798 evas_object_smart_callback_add(m_option_header_cancel_button, "clicked", __cancel_button_clicked_cb, this);
2799 evas_object_show(m_option_header_cancel_button);
2801 m_option_header_title_backward_button = elm_button_add(m_navi_bar);
2802 if (!m_option_header_title_backward_button) {
2803 BROWSER_LOGE("elm_button_add failed");
2806 elm_object_style_set(m_option_header_title_backward_button, "browser/backward");
2807 elm_object_part_content_set(url_layout, "elm.swallow.backward_button", m_option_header_title_backward_button);
2808 evas_object_smart_callback_add(m_option_header_title_backward_button, "clicked", __backward_button_clicked_cb, this);
2809 elm_object_focus_allow_set(m_option_header_title_backward_button, EINA_FALSE);
2810 evas_object_show(m_option_header_title_backward_button);
2811 elm_object_disabled_set(m_option_header_title_backward_button, EINA_TRUE);
2813 m_option_header_title_forward_button = elm_button_add(m_navi_bar);
2814 if (!m_option_header_title_forward_button) {
2815 BROWSER_LOGE("elm_button_add failed");
2818 elm_object_style_set(m_option_header_title_forward_button, "browser/forward");
2819 elm_object_part_content_set(url_layout, "elm.swallow.forward_button", m_option_header_title_forward_button);
2820 evas_object_smart_callback_add(m_option_header_title_forward_button, "clicked", __forward_button_clicked_cb, this);
2821 elm_object_focus_allow_set(m_option_header_title_forward_button, EINA_FALSE);
2822 evas_object_show(m_option_header_title_forward_button);
2823 elm_object_disabled_set(m_option_header_title_forward_button, EINA_TRUE);
2825 /* for jump to top. */
2826 evas_object_event_callback_add(url_layout, EVAS_CALLBACK_MOUSE_DOWN, __option_header_url_layout_mouse_down_cb, this);
2832 Evas_Object *Browser_View::_get_activated_url_entry(void)
2834 /* The edit field in option header url layout is only valid for edit.
2835 * If the edit field in browser scroller can have focus, there is so many focus issue.
2836 * So just make the edit field in option header editable. */
2837 return m_option_header_url_edit_field;
2840 void Browser_View::__url_entry_imf_event_cb(void *data, Ecore_IMF_Context *ctx, int value)
2842 BROWSER_LOGD("value=%d", value);
2846 Browser_View *browser_view = (Browser_View *)data;
2847 if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
2848 Evas_Object *edit_field_entry;
2849 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
2850 elm_object_focus_set(edit_field_entry, EINA_FALSE);
2852 if (browser_view->m_edit_mode != BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF
2853 && browser_view->m_edit_mode != BR_FIND_WORD_MODE)
2854 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2857 } else if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW)
2858 /* If the focus of url entry is set automatically, the keypad is also displayed automatically. */
2859 /* eg. At url edit mode, lock the screen -> then unlock, the url entry will get focus. */
2860 /* The keypad is also invoked, so set the edit mode. */
2861 browser_view->_set_edit_mode(BR_URL_ENTRY_EDIT_MODE);
2864 void Browser_View::__url_entry_focus_out_cb(void *data, Evas *e, void *event_info)
2866 BROWSER_LOGD("[%s]", __func__);
2870 Browser_View *browser_view = (Browser_View *)data;
2871 Evas_Object *edit_field_entry;
2872 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
2874 Ecore_IMF_Context *ic = (Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry);
2878 ecore_imf_context_input_panel_hide(ic);
2880 if (browser_view->m_edit_mode != BR_FIND_WORD_MODE)
2881 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2884 void Browser_View::_set_edit_mode(edit_mode mode)
2886 BROWSER_LOGD("mode = %d", mode);
2888 if (m_edit_mode == mode)
2891 #if defined(FEATURE_MOST_VISITED_SITES)
2892 if (mode == BR_NO_EDIT_MODE) {
2893 if (m_most_visited_sites) {
2894 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,on,signal", "");
2895 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2896 "url_guide_text,on,signal", "");
2899 if (m_most_visited_sites) {
2900 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,off,signal", "");
2901 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2902 "url_guide_text,off,signal", "");
2907 if (mode == BR_URL_ENTRY_EDIT_MODE || mode == BR_FIND_WORD_MODE
2908 || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
2909 #ifdef BROWSER_SCROLLER_BOUNCING
2910 /* If edit mode, lock the browser scroller */
2911 _enable_webview_scroll();
2913 /* Make the browser scroller region y = 0 to show url bar all at edit mode. */
2917 elm_scroller_region_get(m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
2918 elm_scroller_region_show(m_scroller ,scroller_x, 0, scroller_w, scroller_h);
2921 if (mode == BR_URL_ENTRY_EDIT_MODE) {
2922 /* change layout of url layout for edit mode. */
2923 edje_object_signal_emit(elm_layout_edje_get(m_url_layout), "edit,url,on,signal", "");
2924 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2925 "edit,url,on,signal", "");
2927 /* change refresh icon in url entry for edit mode. */
2928 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "edit,url,on,signal", "");
2929 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2930 "edit,url,on,signal", "");
2932 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "hide,favicon,signal", "");
2933 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2934 "hide,favicon,signal", "");
2935 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
2936 "edit,url,on,signal", "");
2937 } else if (mode == BR_NO_EDIT_MODE || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
2938 if (m_edit_mode == BR_FIND_WORD_MODE) {
2939 edje_object_signal_emit(elm_layout_edje_get(m_option_header_layout), "hide,find_word_layout,signal", "");
2940 m_find_word->find_word("", Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
2942 /* change layout of url layout for normal mode. */
2943 edje_object_signal_emit(elm_layout_edje_get(m_url_layout), "edit,url,off,signal", "");
2944 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2945 "edit,url,off,signal", "");
2947 /* change refresh icon in url entry for normal mode. */
2948 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "edit,url,off,signal", "");
2949 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2950 "edit,url,off,signal", "");
2952 #if defined(FEATURE_MOST_VISITED_SITES)
2953 if (!is_most_visited_sites_running())
2956 if (m_focused_window->m_favicon)
2957 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
2958 "show,favicon,signal", "");
2961 if (m_focused_window->m_option_header_favicon) {
2962 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2963 "show,favicon,signal", "");
2967 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
2968 "edit,url,off,signal", "");
2969 if (_is_loading()) {
2970 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,on,signal", "");
2971 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2972 "loading,on,signal", "");
2975 } else if (mode == BR_FIND_WORD_MODE) {
2976 Evas_Object *find_word_edit_field_entry = br_elm_editfield_entry_get(m_find_word_edit_field);
2977 elm_entry_entry_set(find_word_edit_field_entry, "");
2979 evas_object_smart_callback_del(find_word_edit_field_entry, "changed", __find_word_entry_changed_cb);
2980 evas_object_smart_callback_add(find_word_edit_field_entry, "changed", __find_word_entry_changed_cb, this);
2982 edje_object_signal_emit(elm_layout_edje_get(m_option_header_layout), "show,find_word_layout,signal", "");
2987 /* To show favicon, if click url entry while loading, then cancel case. */
2992 * The url entry of option header can't be focusable in case of switch TEXTBLOCK & elm entry.
2993 * So focus the url entry in idler callback.
2995 static Eina_Bool __url_entry_focus_idler_cb(void *data)
2997 Evas_Object *edit_field = (Evas_Object *)data;
2998 elm_object_focus_set(edit_field, EINA_TRUE);
3000 Evas_Object *entry = br_elm_editfield_entry_get(edit_field);
3001 elm_entry_cursor_end_set(entry);
3003 return ECORE_CALLBACK_CANCEL;
3006 void Browser_View::__url_entry_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
3008 BROWSER_LOGD("[%s]", __func__);
3012 Browser_View *browser_view = (Browser_View *)data;
3014 if (browser_view->_is_loading())
3015 browser_view->_stop_loading();
3017 if (!browser_view->_navigationbar_visible_get()) {
3018 /* The edit field in option header is only for edit url. */
3019 browser_view->_navigationbar_visible_set_signal(EINA_TRUE);
3022 browser_view->_destroy_more_context_popup();
3024 edit_mode mode = browser_view->_get_edit_mode();
3026 browser_view->_set_edit_mode(BR_URL_ENTRY_EDIT_MODE);
3028 if (mode == BR_NO_EDIT_MODE) {
3029 Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field);
3031 elm_object_focus_set(browser_view->m_option_header_url_edit_field, EINA_TRUE);
3032 elm_entry_cursor_end_set(entry);
3034 // ecore_idler_add(__url_entry_focus_idler_cb, browser_view->m_option_header_url_edit_field);
3038 Eina_Bool Browser_View::_is_option_header_expanded(void)
3040 return _navigationbar_visible_get();
3043 void Browser_View::__cancel_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3045 BROWSER_LOGD("[%s]", __func__);
3049 Browser_View *browser_view = (Browser_View *)data;
3050 Evas_Object *ewk_view = browser_view->m_focused_window->m_ewk_view;
3054 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
3056 elm_object_signal_emit(browser_view->m_option_header_url_edit_field, "ellipsis_show,signal", "elm");
3057 elm_object_signal_emit(browser_view->m_url_edit_field, "ellipsis_show,signal", "elm");
3059 browser_view->_set_url_entry(browser_view->get_url().c_str());
3062 void Browser_View::__refresh_button_clicked_cb(void *data, Evas_Object *obj,
3063 const char *emission, const char *source)
3065 BROWSER_LOGD("[%s]", __func__);
3069 Browser_View *browser_view = (Browser_View *)data;
3070 if (browser_view->_get_edit_mode() == BR_URL_ENTRY_EDIT_MODE) {
3071 elm_entry_entry_set(br_elm_editfield_entry_get(browser_view->m_url_edit_field), "");
3072 elm_entry_entry_set(br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field), "");
3073 } else if(browser_view->_is_loading())
3074 browser_view->_stop_loading();
3076 browser_view->_reload();
3079 void Browser_View::__url_entry_enter_key_cb(void *data, Evas_Object *obj, void *event_info)
3081 BROWSER_LOGD("[%s]", __func__);
3085 Browser_View *browser_view = (Browser_View *)data;
3086 Evas_Object *ewk_view = browser_view->m_focused_window->m_ewk_view;
3087 Evas_Object *edit_field_entry;
3088 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
3091 * Give focus to option header cancel button to hide imf. */
3092 elm_object_focus_set(browser_view->m_option_header_cancel_button, EINA_TRUE);
3094 char *url = elm_entry_markup_to_utf8(elm_entry_entry_get(edit_field_entry));
3095 BROWSER_LOGD("input url = [%s]", url);
3097 if (url && strlen(url)) {
3098 browser_view->load_url(url);
3104 void Browser_View::__url_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
3106 BROWSER_LOGD("[%s]", __func__);
3109 void Browser_View::__url_layout_mouse_down_cb(void *data, Evas* evas, Evas_Object *obj,
3112 BROWSER_LOGD("[%s]", __func__);
3116 Evas_Event_Mouse_Down event = *(Evas_Event_Mouse_Down *)event_info;
3118 Browser_View *browser_view = (Browser_View *)data;
3120 Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_url_edit_field);
3126 evas_object_geometry_get(browser_view->m_url_edit_field, &entry_x, &entry_y, &entry_w, &entry_h);
3128 if (event.output.x > entry_x && event.output.x < entry_x + entry_w &&
3129 event.output.y > entry_y && event.output.y < entry_y + entry_h) {
3130 elm_object_signal_emit(browser_view->m_option_header_url_edit_field, "ellipsis_hide,signal", "elm");
3131 elm_object_signal_emit(browser_view->m_url_edit_field, "ellipsis_hide,signal", "elm");
3134 edit_mode mode = browser_view->_get_edit_mode();
3135 if (mode == BR_URL_ENTRY_EDIT_MODE || mode == BR_FIND_WORD_MODE
3136 || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
3137 #ifdef BROWSER_SCROLLER_BOUNCING
3138 BROWSER_LOGD("<< lock browser scroller >>");
3139 elm_object_scroll_freeze_pop(browser_view->m_scroller);
3140 elm_object_scroll_freeze_push(browser_view->m_scroller);
3145 void Browser_View::__option_header_url_layout_mouse_down_cb(void *data, Evas* evas, Evas_Object *obj,
3148 BROWSER_LOGD("[%s]", __func__);
3151 Evas_Event_Mouse_Down event = *(Evas_Event_Mouse_Down *)event_info;
3152 Browser_View *browser_view = (Browser_View *)data;
3154 Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field);
3160 evas_object_geometry_get(browser_view->m_option_header_url_edit_field, &entry_x, &entry_y, &entry_w, &entry_h);
3162 if (event.output.x > entry_x && event.output.x < entry_x + entry_w &&
3163 event.output.y > entry_y && event.output.y < entry_y + entry_h) {
3164 elm_object_signal_emit(browser_view->m_option_header_url_edit_field, "ellipsis_hide,signal", "elm");
3165 elm_object_signal_emit(browser_view->m_url_edit_field, "ellipsis_hide,signal", "elm");
3169 if (event.output.y < icon_y)
3170 browser_view->_jump_to_top();
3173 void Browser_View::_update_back_forward_buttons(void)
3175 BROWSER_LOGD("[%s]", __func__);
3176 if (ewk_view_back_possible(m_focused_window->m_ewk_view)) {
3177 elm_object_disabled_set(m_title_backward_button, EINA_FALSE);
3178 elm_object_disabled_set(m_option_header_title_backward_button, EINA_FALSE);
3180 elm_object_disabled_set(m_title_backward_button, EINA_TRUE);
3181 elm_object_disabled_set(m_option_header_title_backward_button, EINA_TRUE);
3184 if (ewk_view_forward_possible(m_focused_window->m_ewk_view)) {
3185 elm_object_disabled_set(m_title_forward_button, EINA_FALSE);
3186 elm_object_disabled_set(m_option_header_title_forward_button, EINA_FALSE);
3188 elm_object_disabled_set(m_title_forward_button, EINA_TRUE);
3189 elm_object_disabled_set(m_option_header_title_forward_button, EINA_TRUE);
3193 void Browser_View::__backward_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3195 BROWSER_LOGD("[%s]", __func__);
3199 Browser_View *browser_view = (Browser_View *)data;
3200 ewk_view_back(browser_view->m_focused_window->m_ewk_view);
3203 void Browser_View::__forward_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3205 BROWSER_LOGD("[%s]", __func__);
3209 Browser_View *browser_view = (Browser_View *)data;
3210 ewk_view_forward(browser_view->m_focused_window->m_ewk_view);
3213 Evas_Object *Browser_View::_create_url_layout(void)
3215 BROWSER_LOGD("[%s]", __func__);
3216 Evas_Object *url_layout;
3217 url_layout = elm_layout_add(m_navi_bar);
3219 if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
3220 "browser/url_layout")) {
3221 BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
3224 evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, 0.0);
3225 evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3226 evas_object_show(url_layout);
3228 /* create url entry layout in url layout */
3229 m_url_entry_layout = elm_layout_add(m_navi_bar);
3230 if (!m_url_entry_layout) {
3231 BROWSER_LOGE("elm_layout_add failed");
3234 if (!elm_layout_file_set(m_url_entry_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
3235 "elm/browser/urlentry/default")) {
3236 BROWSER_LOGE("Can not set layout theme[browser, urlentry, default]\n");
3239 elm_object_part_content_set(url_layout, "elm.swallow.url", m_url_entry_layout);
3240 evas_object_show(m_url_entry_layout);
3242 m_url_edit_field = br_elm_url_editfield_add(m_navi_bar);
3243 if (!m_url_edit_field) {
3244 BROWSER_LOGE("elm_editfield_add failed");
3247 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.entry", m_url_edit_field);
3248 // br_elm_editfield_entry_single_line_set(m_url_edit_field, EINA_TRUE);
3249 br_elm_editfield_eraser_set(m_url_edit_field, EINA_FALSE);
3251 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(m_url_edit_field);
3252 elm_entry_editable_set(edit_field_entry, EINA_FALSE);
3253 /* The edit field in browser scroller is only for display.
3254 * The edit url is only supported in option header url entry. */
3255 elm_object_focus_allow_set(m_url_edit_field, EINA_FALSE);
3256 elm_object_focus_allow_set(edit_field_entry, EINA_FALSE);
3257 elm_entry_input_panel_enabled_set(edit_field_entry, EINA_FALSE);
3259 elm_entry_text_style_user_push(edit_field_entry, "DEFAULT='font_size=35 color=#3C3632 ellipsis=1'");
3260 evas_object_show(m_url_edit_field);
3262 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "disable_entry,signal", "");
3263 edje_object_signal_callback_add(elm_layout_edje_get(m_url_entry_layout), "mouse,clicked,1", "block_entry",
3264 __url_entry_clicked_cb, this);
3266 edje_object_signal_callback_add(elm_layout_edje_get(m_url_entry_layout), "refresh_stop", "*",
3267 __refresh_button_clicked_cb, this);
3269 m_url_progressbar = elm_progressbar_add(m_navi_bar);
3270 if (!m_url_progressbar) {
3271 BROWSER_LOGE("elm_progressbar_add failed");
3274 elm_object_style_set(m_url_progressbar, "browser/loading");
3275 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.progressbar", m_url_progressbar);
3276 elm_progressbar_value_set(m_url_progressbar, 0);
3277 evas_object_show(m_url_progressbar);
3279 m_url_progresswheel = elm_progressbar_add(m_navi_bar);
3280 if (!m_url_progresswheel) {
3281 BROWSER_LOGE("elm_progressbar_add failed");
3285 elm_object_style_set(m_url_progresswheel, "UIActivityIndicatorStyleWhite");
3286 elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
3287 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.progress", m_url_progresswheel);
3288 evas_object_show(m_url_progresswheel);
3290 m_cancel_button = elm_button_add(m_navi_bar);
3291 if (!m_cancel_button) {
3292 BROWSER_LOGE("elm_button_add failed");
3295 evas_object_size_hint_weight_set(m_cancel_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3296 evas_object_size_hint_align_set(m_cancel_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
3297 elm_object_style_set(m_cancel_button, "browser/cancel_button");
3298 elm_object_text_set(m_cancel_button, BR_STRING_CANCEL);
3299 elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_cancel_button);
3300 evas_object_smart_callback_add(m_cancel_button, "clicked", __cancel_button_clicked_cb, this);
3301 evas_object_show(m_cancel_button);
3303 m_title_backward_button = elm_button_add(m_navi_bar);
3304 if (!m_title_backward_button) {
3305 BROWSER_LOGE("elm_button_add failed");
3308 elm_object_style_set(m_title_backward_button, "browser/backward");
3309 elm_object_part_content_set(url_layout, "elm.swallow.backward_button", m_title_backward_button);
3310 evas_object_smart_callback_add(m_title_backward_button, "clicked", __backward_button_clicked_cb, this);
3311 elm_object_focus_allow_set(m_title_backward_button, EINA_FALSE);
3312 evas_object_show(m_title_backward_button);
3313 elm_object_disabled_set(m_title_backward_button, EINA_TRUE);
3315 m_title_forward_button = elm_button_add(m_navi_bar);
3316 if (!m_title_forward_button) {
3317 BROWSER_LOGE("elm_button_add failed");
3320 elm_object_style_set(m_title_forward_button, "browser/forward");
3321 elm_object_part_content_set(url_layout, "elm.swallow.forward_button", m_title_forward_button);
3322 evas_object_smart_callback_add(m_title_forward_button, "clicked", __forward_button_clicked_cb, this);
3323 elm_object_focus_allow_set(m_title_forward_button, EINA_FALSE);
3324 evas_object_show(m_title_forward_button);
3325 elm_object_disabled_set(m_title_forward_button, EINA_TRUE);
3328 * When edit mode, if scroll down on url layout in browser view,
3329 * the browser can be scrolled even though scroll locked.
3330 * So, lock the browser scroller whenever touch on it if edit mode.
3332 evas_object_event_callback_add(url_layout, EVAS_CALLBACK_MOUSE_DOWN, __url_layout_mouse_down_cb, this);
3338 Evas_Object *Browser_View::_create_find_word_layout(void)
3340 BROWSER_LOGD("[%s]", __func__);
3341 Evas_Object *url_layout = elm_layout_add(m_navi_bar);
3343 BROWSER_LOGE("elm_layout_add failed");
3346 if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-find-word-layout.edj",
3347 "browser-view/find_word_layout")) {
3348 BROWSER_LOGE("Can not set layout theme[browser-view/find_word_layout]\n");
3351 evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, 0.0);
3352 evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3353 evas_object_show(url_layout);
3355 /* create url entry layout in url layout */
3356 m_find_word_entry_layout = elm_layout_add(m_navi_bar);
3357 if (!m_find_word_entry_layout) {
3358 BROWSER_LOGE("elm_layout_add failed");
3361 if (!elm_layout_file_set(m_find_word_entry_layout, BROWSER_EDJE_DIR"/browser-view-find-word-layout.edj",
3362 "browser-view/find_word_editfield_layout")) {
3363 BROWSER_LOGE("browser-view/find_word_editfield_layout failed");
3366 elm_object_part_content_set(url_layout, "elm.swallow.url", m_find_word_entry_layout);
3367 evas_object_show(m_find_word_entry_layout);
3369 edje_object_part_text_set(elm_layout_edje_get(url_layout), "title_text", BR_STRING_FIND_ON_PAGE);
3371 m_find_word_edit_field = br_elm_find_word_editfield_add(m_navi_bar);
3372 if (!m_find_word_edit_field) {
3373 BROWSER_LOGE("elm_editfield_add failed");
3376 elm_object_part_content_set(m_find_word_entry_layout, "elm.swallow.entry", m_find_word_edit_field);
3377 evas_object_show(m_find_word_edit_field);
3379 edje_object_signal_emit(elm_layout_edje_get(m_find_word_edit_field), "find_word,signal", "elm");
3381 // br_elm_editfield_entry_single_line_set(m_find_word_edit_field, EINA_TRUE);
3382 br_elm_editfield_eraser_set(m_find_word_edit_field, EINA_TRUE);
3384 elm_object_signal_callback_add(m_find_word_edit_field, "elm,eraser,clicked", "elm",
3385 __find_word_erase_button_clicked_cb, this);
3387 Evas_Object *find_word_edit_field_entry = br_elm_editfield_entry_get(m_find_word_edit_field);
3388 elm_entry_entry_set(find_word_edit_field_entry, "");
3389 evas_object_smart_callback_add(find_word_edit_field_entry, "activated", __find_word_entry_enter_key_cb, this);
3390 elm_entry_input_panel_layout_set(find_word_edit_field_entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
3391 elm_entry_prediction_allow_set(find_word_edit_field_entry, EINA_FALSE);
3392 ecore_imf_context_input_panel_event_callback_add((Ecore_IMF_Context *)elm_entry_imf_context_get(find_word_edit_field_entry),
3393 ECORE_IMF_INPUT_PANEL_STATE_EVENT, __find_word_entry_imf_event_cb, this);
3394 elm_entry_text_style_user_push(find_word_edit_field_entry, "DEFAULT='font_size=35 color=#3C363 2 ellipsis=1'");
3395 evas_object_show(m_find_word_edit_field);
3397 m_find_word_cancel_button = elm_button_add(m_navi_bar);
3398 if (!m_find_word_cancel_button) {
3399 BROWSER_LOGE("elm_button_add failed");
3402 elm_object_style_set(m_find_word_cancel_button, "browser/cancel_button");
3403 elm_object_text_set(m_find_word_cancel_button, BR_STRING_CANCEL);
3404 elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_find_word_cancel_button);
3405 evas_object_show(m_find_word_cancel_button);
3407 evas_object_smart_callback_add(m_find_word_cancel_button, "clicked", __find_word_cancel_button_clicked_cb, this);
3409 m_find_word_prev_button = elm_button_add(m_navi_bar);
3410 if (!m_find_word_prev_button) {
3411 BROWSER_LOGE("elm_button_add failed");
3414 elm_object_style_set(m_find_word_prev_button, "browser/find_word_prev_but");
3415 elm_object_part_content_set(url_layout, "elm.swallow.find_word_prev", m_find_word_prev_button);
3416 evas_object_show(m_find_word_prev_button);
3417 evas_object_smart_callback_add(m_find_word_prev_button, "clicked", __find_word_prev_button_clicked_cb, this);
3419 m_find_word_next_button = elm_button_add(m_navi_bar);
3420 if (!m_find_word_next_button) {
3421 BROWSER_LOGE("elm_button_add failed");
3424 elm_object_style_set(m_find_word_next_button, "browser/find_word_next_but");
3425 elm_object_part_content_set(url_layout, "elm.swallow.find_word_next", m_find_word_next_button);
3426 evas_object_show(m_find_word_next_button);
3427 evas_object_smart_callback_add(m_find_word_next_button, "clicked", __find_word_next_button_clicked_cb, this);
3429 const char *current_theme = elm_theme_get(NULL);
3430 if (current_theme && strstr(current_theme, "white")) {
3432 // edje_object_signal_emit(elm_layout_edje_get(m_find_word_entry_layout),
3433 // "black_theme,signal", "");
3439 void Browser_View::__find_word_erase_button_clicked_cb(void *data, Evas_Object *obj,
3440 const char *emission, const char *source)
3442 BROWSER_LOGD("[%s]", __func__);
3443 Browser_View *browser_view = (Browser_View *)data;
3444 edje_object_part_text_set(elm_layout_edje_get(browser_view->m_option_header_find_word_layout), "elm.index_text", "0/0");
3447 void Browser_View::__find_word_cancel_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3449 BROWSER_LOGD("[%s]", __func__);
3453 Browser_View *browser_view = (Browser_View *)data;
3454 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
3455 browser_view->m_find_word->find_word("", Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3458 void Browser_View::__find_word_prev_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3460 BROWSER_LOGD("[%s]", __func__);
3464 Browser_View *browser_view = (Browser_View *)data;
3465 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,control_bar,no_animation,signal", "");
3466 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3467 const char *find_word = elm_entry_entry_get(edit_field_entry);
3468 if (!find_word || !strlen(find_word))
3471 int index = browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_BACKWARD);
3473 elm_object_focus_set(browser_view->m_find_word_cancel_button, EINA_TRUE);
3475 void Browser_View::__find_word_next_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3477 BROWSER_LOGD("[%s]", __func__);
3481 Browser_View *browser_view = (Browser_View *)data;
3482 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,control_bar,no_animation,signal", "");
3483 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3484 const char *find_word = elm_entry_entry_get(edit_field_entry);
3485 if (!find_word || !strlen(find_word))
3488 int index = browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3489 if (index == browser_view->m_find_word->get_match_max_value())
3490 elm_object_focus_set(browser_view->m_find_word_cancel_button, EINA_TRUE);
3493 void Browser_View::__find_word_entry_imf_event_cb(void *data, Ecore_IMF_Context *ctx, int value)
3495 BROWSER_LOGD("value=%d", value);
3499 Browser_View *browser_view = (Browser_View *)data;
3500 Evas_Object *find_word_editfield_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3502 if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE)
3503 elm_object_focus_set(find_word_editfield_entry, EINA_FALSE);
3505 elm_object_focus_set(find_word_editfield_entry, EINA_TRUE);
3508 void Browser_View::_enable_browser_scroller_scroll(void)
3510 #ifdef BROWSER_SCROLLER_BOUNCING
3511 if (!ewk_view_vertical_panning_hold_get(m_focused_window->m_ewk_view)
3512 && !_is_loading() && !m_is_full_screen) {
3513 BROWSER_LOGD("<< unlock browser scroller, lock ewk view >>");
3514 elm_object_scroll_freeze_pop(m_scroller);
3515 ewk_view_vertical_panning_hold_set(m_focused_window->m_ewk_view, EINA_TRUE);
3520 void Browser_View::_enable_webview_scroll(void)
3522 #ifdef BROWSER_SCROLLER_BOUNCING
3523 if (ewk_view_vertical_panning_hold_get(m_focused_window->m_ewk_view)) {
3524 BROWSER_LOGD("<< lock browser scroller, unlock ewk view >>");
3525 elm_object_scroll_freeze_pop(m_scroller);
3526 elm_object_scroll_freeze_push(m_scroller);
3527 ewk_view_vertical_panning_hold_set(m_focused_window->m_ewk_view, EINA_FALSE);
3532 void Browser_View::__find_word_entry_enter_key_cb(void *data, Evas_Object *obj, void *event_info)
3534 BROWSER_LOGD("[%s]", __func__);
3538 Browser_View *browser_view = (Browser_View *)data;
3539 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,control_bar,no_animation,signal", "");
3540 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3541 const char *find_word = elm_entry_entry_get(edit_field_entry);
3542 if (!find_word || !strlen(find_word))
3545 browser_view->m_find_word->init_index();
3546 browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3548 elm_object_focus_set(edit_field_entry, EINA_FALSE);
3549 BROWSER_LOGD("find_word=[%s]", find_word);
3552 void Browser_View::__find_word_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
3554 BROWSER_LOGD("[%s]", __func__);
3558 Browser_View *browser_view = (Browser_View *)data;
3559 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3560 const char *find_word = elm_entry_entry_get(edit_field_entry);
3562 browser_view->m_find_word->init_index();
3563 browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3567 void Browser_View::_navigationbar_title_clicked(void)
3569 BROWSER_LOGD("[%s]", __func__);
3570 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
3571 Evas_Object *content = elm_object_item_content_get(top_it);
3572 if (content != m_main_layout)
3575 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)
3576 #if defined(FEATURE_MOST_VISITED_SITES)
3577 || is_most_visited_sites_running()
3579 || m_edit_mode != BR_NO_EDIT_MODE)
3586 elm_scroller_region_get(m_scroller, &scroller_x, &scroller_y, &scroller_w, &scroller_h);
3588 if (scroller_y == 0) {
3589 /* scroller is on top, the url bar in scroller is fully being displayed.
3590 * Then, just show/hide the tool bar. */
3591 const char* state = edje_object_part_state_get(elm_layout_edje_get(m_main_layout),
3592 "elm.swallow.control_bar", NULL);
3593 if(state && !strncmp(state, "default", strlen("default")))
3594 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "show,control_bar,signal", "");
3596 #ifdef BROWSER_SCROLLER_BOUNCING
3597 int url_layout_h = 0;
3598 evas_object_geometry_get(m_url_layout, NULL, NULL, NULL, &url_layout_h);
3599 elm_scroller_region_bring_in(m_scroller ,scroller_x, url_layout_h, scroller_w, scroller_h);
3603 if (_is_loading()) {
3605 Eina_Bool visible = _navigationbar_visible_get();
3606 #ifdef BROWSER_SCROLLER_BOUNCING
3607 _navigationbar_visible_set(!visible);
3614 void Browser_View::_jump_to_top(void)
3616 BROWSER_LOGD("[%s]", __func__);
3617 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
3618 Evas_Object *content = elm_object_item_content_get(top_it);
3619 if (content != m_main_layout)
3622 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)
3623 #if defined(FEATURE_MOST_VISITED_SITES)
3624 || is_most_visited_sites_running()
3626 || m_edit_mode != BR_NO_EDIT_MODE)
3629 int browser_scroller_x = 0;
3630 int browser_scroller_w = 0;
3631 int browser_scroller_h = 0;
3632 elm_scroller_region_get(m_scroller, &browser_scroller_x, NULL,
3633 &browser_scroller_w, &browser_scroller_h);
3634 elm_scroller_region_show(m_scroller, browser_scroller_x, 0, browser_scroller_w, browser_scroller_h);
3636 ewk_view_top_of_contents_go(m_focused_window->m_ewk_view);
3639 void Browser_View::delete_non_user_created_windows(void)
3641 BROWSER_LOGD("[%s]", __func__);
3642 /* Delete no-backward history window. */
3643 std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3644 int window_count = window_list.size();
3646 if (window_count <= 1)
3650 for (i = 0 ; i < window_count ; i++) {
3651 BROWSER_LOGD("focusable_window = %d, window[%d]=%d", m_focused_window, i, window_list[i]);
3652 if (window_list[i]->m_ewk_view
3653 &&!ewk_view_back_possible(window_list[i]->m_ewk_view)
3654 && window_list[i] != m_focused_window
3655 && window_list[i]->m_created_by_user == EINA_FALSE) {
3656 BROWSER_LOGD("delete window index=[%d]", i);
3657 m_browser->delete_window(window_list[i]);
3659 /* Set title & url with the focused window. */
3660 _set_navigationbar_title(get_title().c_str());
3661 _set_url_entry(get_url().c_str());
3662 _set_controlbar_back_forward_status();
3663 if (!_set_favicon())
3664 BROWSER_LOGE("_set_favicon failed");
3669 void Browser_View::__title_back_button_clicked_cb(void *data , Evas_Object *obj, void *event_info)
3671 BROWSER_LOGD("[%s]", __func__);
3675 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
3676 BROWSER_LOGD("close multi window");
3677 m_data_manager->get_multi_window_view()->close_multi_window();
3681 Browser_View *browser_view = (Browser_View *)data;
3683 if (browser_view->m_focused_window->m_ewk_view
3684 && ewk_view_back_possible(browser_view->m_focused_window->m_ewk_view))
3685 ewk_view_back(browser_view->m_focused_window->m_ewk_view);
3687 if (browser_view->m_focused_window->m_parent) {
3688 /* Save current window pointer to delete later. */
3689 Browser_Window *delete_window = browser_view->m_focused_window;
3690 browser_view->m_browser->set_focused_window(browser_view->m_focused_window->m_parent);
3691 browser_view->m_browser->delete_window(delete_window);
3693 /* Set title & url with the focused window. */
3694 browser_view->_set_navigationbar_title(browser_view->get_title().c_str());
3695 browser_view->_set_url_entry(browser_view->get_url().c_str());
3696 browser_view->_set_controlbar_back_forward_status();
3697 if (!browser_view->_set_favicon())
3698 BROWSER_LOGE("_set_favicon failed");
3700 elm_win_lower(browser_view->m_win);
3702 browser_view->delete_non_user_created_windows();
3707 void Browser_View::__scroller_scroll_cb(void *data, Evas_Object *obj, void *event_info)
3709 #ifdef BROWSER_SCROLLER_BOUNCING
3713 Browser_View *browser_view = (Browser_View *)data;
3715 int browser_scroller_x = 0;
3716 int browser_scroller_y = 0;
3717 int browser_scroller_w = 0;
3718 int browser_scroller_h = 0;
3719 elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, &browser_scroller_y,
3720 &browser_scroller_w, &browser_scroller_h);
3722 int url_layout_h = 0;
3723 evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
3726 * If user scrolls up/down near the url bar edge, the movement of scroller is not smooth.
3727 * It's because the browser scroller region y is also bouncing.
3728 * So if the scroller region y is bigger than the height of url bar(65 pixel),
3729 * make the region y to url bar height by force. */
3730 if (browser_scroller_y > url_layout_h)
3731 elm_scroller_region_show(browser_view->m_scroller, browser_scroller_x, url_layout_h,
3732 browser_scroller_w, browser_scroller_h);
3736 Eina_Bool Browser_View::_is_loading(void)
3738 if (!m_focused_window || !m_focused_window->m_ewk_view)
3741 double progress = ewk_view_load_progress_get(m_focused_window->m_ewk_view);
3742 // BROWSER_LOGD("progress=%f", progress);
3743 if (progress == 1.0f || progress < 0.05f)
3749 #if defined(HORIZONTAL_UI)
3750 Eina_Bool Browser_View::is_available_to_rotate(void)
3753 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
3754 if (m_data_manager->get_multi_window_view()->is_reordering_mode())
3758 if (m_scissorbox_view)
3764 Eina_Bool Browser_View::__rotate_multi_window_cb(void *data)
3766 BROWSER_LOGD("[%s]", __func__);
3767 Browser_View *browser_view = (Browser_View *)data;
3768 browser_view->m_multi_window_rotate_timer = NULL;
3769 browser_view->_rotate_multi_window();
3771 return ECORE_CALLBACK_CANCEL;
3774 void Browser_View::rotate(int degree)
3777 /* In landscape mode, if the url bar is not displayed -> rotate to portrait mode.
3778 * Then the url bar is displayed. To avoid this issue, remember the scroller region y,
3779 * then restore it at portrait mode. */
3780 int scroller_region_y = 0;
3781 elm_scroller_region_get(m_scroller, NULL, &scroller_region_y, NULL, NULL);
3782 m_scroller_region_y = scroller_region_y;
3784 m_rotate_degree = degree;
3786 #if defined(FEATURE_MOST_VISITED_SITES)
3787 if (m_most_visited_sites)
3788 m_most_visited_sites->rotate();
3790 if (m_scissorbox_view)
3791 _destroy_scissorbox_view();
3794 void Browser_View::suspend_ewk_view(Evas_Object *ewk_view)
3796 BROWSER_LOGD("[%s]", __func__);
3798 std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3799 for (int i = 0 ; i < window_list.size() ; i++) {
3800 if (window_list[i]->m_ewk_view_layout) {
3801 edje_object_signal_emit(elm_layout_edje_get(window_list[i]->m_ewk_view_layout),
3802 "unresizable,signal", "");
3807 ewk_view_suspend(ewk_view);
3808 ewk_view_visibility_set(ewk_view, EINA_FALSE);
3811 void Browser_View::resume_ewk_view(Evas_Object *ewk_view)
3813 BROWSER_LOGD("[%s]", __func__);
3815 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
3818 ewk_view_resume(ewk_view);
3819 ewk_view_visibility_set(ewk_view, EINA_TRUE);
3822 void Browser_View::pause(void)
3824 BROWSER_LOGD("[%s]", __func__);
3825 if (_is_loading()) {
3826 /* Because the progress wheel in url bar has about 15% cpu consumption.
3827 * So, pause the animation when browser goes to background. It's nonsense!*/
3828 if (m_option_header_url_progresswheel)
3829 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
3830 if (m_url_progresswheel)
3831 elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
3834 set_full_sreen(EINA_FALSE);
3838 suspend_ewk_view(m_focused_window->m_ewk_view);
3840 /* stop vibration */
3841 _haptic_device_stop();
3844 void Browser_View::resume(void)
3846 BROWSER_LOGD("[%s]", __func__);
3847 if (_is_loading()) {
3848 /* Because the progress wheel in url bar has about 15% cpu consumption.
3849 * So, pause the animation when browser goes to background. It's nonsense! */
3850 if (m_option_header_url_progresswheel)
3851 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_TRUE);
3852 if (m_url_progresswheel)
3853 elm_progressbar_pulse(m_url_progresswheel, EINA_TRUE);
3858 resume_ewk_view(m_focused_window->m_ewk_view);
3861 void Browser_View::reset(void)
3863 BROWSER_LOGD("[%s]", __func__);
3864 if (m_focused_window && m_focused_window->m_ewk_view)
3868 Eina_Bool Browser_View::__webview_layout_resize_idler_cb(void *data)
3872 return ECORE_CALLBACK_CANCEL;
3874 Browser_View *browser_view = (Browser_View *)data;
3876 browser_view->m_resize_idler = NULL;
3878 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_focused_window->m_ewk_view_layout),
3879 "resizable,signal", "");
3883 #ifdef BROWSER_SCROLLER_BOUNCING
3884 edje_object_part_geometry_get(elm_layout_edje_get(browser_view->m_main_layout),
3885 "elm.swallow.content", NULL, NULL, &content_w, &content_h);
3887 edje_object_part_geometry_get(elm_layout_edje_get(browser_view->m_focused_window->m_ewk_view_layout),
3888 "elm.swallow.webview", NULL, NULL, &content_w, &content_h);
3890 if (browser_view->m_is_full_screen) {
3891 int browser_scroller_y = 0;
3892 evas_object_geometry_get(browser_view->m_scroller, NULL, &browser_scroller_y, NULL, NULL);
3893 evas_object_resize(browser_view->m_focused_window->m_ewk_view,
3894 content_w, content_h + browser_scroller_y);
3896 evas_object_size_hint_min_set(browser_view->m_focused_window->m_ewk_view_layout,
3897 content_w, content_h);
3898 evas_object_resize(browser_view->m_focused_window->m_ewk_view_layout,
3899 content_w, content_h);
3902 return ECORE_CALLBACK_CANCEL;
3905 Eina_Bool Browser_View::__scroller_bring_in_idler_cb(void *data)
3907 BROWSER_LOGD("[%s]", __func__);
3909 return ECORE_CALLBACK_CANCEL;
3910 Browser_View *browser_view = (Browser_View *)data;
3912 int url_layout_h = 0;
3913 evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
3915 BROWSER_LOGD("<< elm_scroller_region_bring_in , url_layout_h=%d >>", url_layout_h);
3916 int browser_scroller_x = 0;
3917 int browser_scroller_w = 0;
3918 int browser_scroller_h = 0;
3919 elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, NULL,
3920 &browser_scroller_w, &browser_scroller_h);
3921 elm_scroller_region_show(browser_view->m_scroller, browser_scroller_x, url_layout_h,
3922 browser_scroller_w, browser_scroller_h);
3924 return ECORE_CALLBACK_CANCEL;
3928 * If user invokes the keypad via input field or url entry, resize the webview.
3929 * The only scroller resize is called when the keypad is launched.
3930 * Other elements like layout, conformant resize event doesn't come. */
3931 void Browser_View::__scroller_resize_cb(void* data, Evas* evas, Evas_Object* obj, void* ev)
3933 BROWSER_LOGD("[%s]", __func__);
3937 Browser_View *browser_view = (Browser_View *)data;
3939 if (browser_view->m_is_full_screen) {
3940 ecore_idler_add(__webview_layout_resize_idler_cb, browser_view);
3946 evas_object_geometry_get(browser_view->m_scroller, NULL, NULL, &scroller_w, &scroller_h);
3947 std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3949 for (int i = 0 ; i < window_list.size() ; i++) {
3950 if (window_list[i]->m_ewk_view_layout) {
3951 edje_object_signal_emit(elm_layout_edje_get(window_list[i]->m_ewk_view_layout),
3952 "resizable,signal", "");
3954 evas_object_size_hint_min_set(window_list[i]->m_ewk_view_layout,
3955 scroller_w, scroller_h);
3956 evas_object_resize(window_list[i]->m_ewk_view_layout,
3957 scroller_w, scroller_h);
3961 #if defined(HORIZONTAL_UI)
3962 Evas_Object *edit_field_entry;
3963 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
3964 Ecore_IMF_Context *ic = (Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry);
3965 /* If the keypad from webkit is invoked in landscape mode, the visible viewport is too narrow.
3966 * So, hide the url bar in browser scroller by bring in.
3967 * The direct bring in call doesn't work, so do it by idler. */
3968 if (ic && browser_view->is_landscape()) {
3969 Ecore_IMF_Input_Panel_State imf_state = ecore_imf_context_input_panel_state_get(ic);
3970 /* Strangley, The state of webkit's imf is show-state even if the ic is url entry.
3971 * However, this is good for browser without webkit's ic get API. */
3972 if (imf_state == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
3973 browser_view->_enable_browser_scroller_scroll();
3974 ecore_idler_add(__scroller_bring_in_idler_cb, browser_view);
3979 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
3980 BROWSER_LOGD("close multi window");
3981 browser_view->m_is_multi_window_grid_mode = m_data_manager->get_multi_window_view()->_is_grid_mode();
3982 m_data_manager->get_multi_window_view()->close_multi_window();
3984 #if defined(HORIZONTAL_UI)
3985 if (browser_view->m_multi_window_rotate_timer)
3986 ecore_timer_del(browser_view->m_multi_window_rotate_timer);
3987 browser_view->m_multi_window_rotate_timer = ecore_timer_add(0.2, __rotate_multi_window_cb, browser_view);
3994 Eina_Bool Browser_View::__zoom_button_timeout_cb(void *data)
3996 BROWSER_LOGD("[%s]", __func__);
3998 return ECORE_CALLBACK_CANCEL;
4000 Browser_View *browser_view = (Browser_View *)data;
4001 browser_view->m_zoom_button_timer = NULL;
4003 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,zoom_buttons,signal", "");
4005 return ECORE_CALLBACK_CANCEL;
4008 void Browser_View::__zoom_out_clicked_cb(void *data, Evas_Object *obj, void *event_info)
4010 BROWSER_LOGD("[%s]", __func__);
4014 Browser_View *browser_view = (Browser_View *)data;
4015 double scale_factor = ewk_view_scale_get(browser_view->m_focused_window->m_ewk_view);
4016 ewk_view_scale_set(browser_view->m_focused_window->m_ewk_view, scale_factor - 0.5f, 0, 0);
4018 if (browser_view->m_zoom_button_timer)
4019 ecore_timer_del(browser_view->m_zoom_button_timer);
4020 browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
4023 void Browser_View::__zoom_in_clicked_cb(void *data, Evas_Object *obj, void *event_info)
4025 BROWSER_LOGD("[%s]", __func__);
4029 Browser_View *browser_view = (Browser_View *)data;
4030 double scale_factor = ewk_view_scale_get(browser_view->m_focused_window->m_ewk_view);
4031 ewk_view_scale_set(browser_view->m_focused_window->m_ewk_view, scale_factor + 0.5f, 0, 0);
4033 if (browser_view->m_zoom_button_timer)
4034 ecore_timer_del(browser_view->m_zoom_button_timer);
4035 browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
4038 Eina_Bool Browser_View::_create_zoom_buttons(void)
4040 BROWSER_LOGD("[%s]", __func__);
4041 m_zoom_out_button = elm_button_add(m_navi_bar);
4042 if (!m_zoom_out_button) {
4043 BROWSER_LOGE("elm_button_add failed");
4046 elm_object_style_set(m_zoom_out_button, "browser/zoom_out");
4047 elm_object_part_content_set(m_main_layout, "elm.swallow.zoom_out_button", m_zoom_out_button);
4048 evas_object_smart_callback_add(m_zoom_out_button, "clicked", __zoom_out_clicked_cb, this);
4049 evas_object_show(m_zoom_out_button);
4051 m_zoom_in_button = elm_button_add(m_navi_bar);
4052 if (!m_zoom_in_button) {
4053 BROWSER_LOGE("elm_button_add failed");
4057 elm_object_style_set(m_zoom_in_button, "browser/zoom_in");
4058 elm_object_part_content_set(m_main_layout, "elm.swallow.zoom_in_button", m_zoom_in_button);
4059 evas_object_smart_callback_add(m_zoom_in_button, "clicked", __zoom_in_clicked_cb, this);
4060 evas_object_show(m_zoom_in_button);
4066 void Browser_View::__naviframe_pop_finished_cb(void *data , Evas_Object *obj, void *event_info)
4068 BROWSER_LOGD("[%s]", __func__);
4072 Browser_View *browser_view = (Browser_View *)data;
4073 Elm_Object_Item *it = (Elm_Object_Item *)event_info;
4075 if (browser_view->m_navi_it != elm_naviframe_top_item_get(m_navi_bar))
4078 m_data_manager->destroy_bookmark_view();
4079 m_data_manager->destroy_history_layout();
4080 /* Add to bookmark, then cancel. */
4081 m_data_manager->destroy_add_to_bookmark_view();
4082 #if defined(FEATURE_MOST_VISITED_SITES)
4083 m_data_manager->destroy_add_to_most_visited_sites_view();
4086 /* If return from browser settings. */
4087 if (browser_view->m_browser_settings) {
4088 delete browser_view->m_browser_settings;
4089 browser_view->m_browser_settings = NULL;
4093 void Browser_View::__dim_area_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
4095 BROWSER_LOGD("[%s]", __func__);
4099 Browser_View *browser_view = (Browser_View *)data;
4101 elm_object_focus_set(m_data_manager->get_browser_view()->m_option_header_cancel_button, EINA_TRUE);
4104 void Browser_View::__context_menu_bg_mouse_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
4106 BROWSER_LOGD("[%s]", __func__);
4110 Browser_View *browser_view = (Browser_View *)data;
4112 browser_view->_destroy_more_context_popup();
4115 Eina_Bool Browser_View::_create_main_layout(void)
4117 BROWSER_LOGD("[%s]", __func__);
4118 m_main_layout = elm_layout_add(m_navi_bar);
4119 if (!m_main_layout) {
4120 BROWSER_LOGE("elm_layout_add failed!");
4124 if (!elm_layout_file_set(m_main_layout, BROWSER_EDJE_DIR"/browser-view-main.edj",
4125 "browser/browser-view-main")) {
4126 BROWSER_LOGE("elm_layout_file_set failed", BROWSER_EDJE_DIR);
4130 evas_object_size_hint_weight_set(m_main_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4131 evas_object_size_hint_align_set(m_main_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
4132 evas_object_show(m_main_layout);
4134 m_title_back_button = elm_button_add(m_navi_bar);
4135 if (!m_title_back_button) {
4136 BROWSER_LOGE("elm_button_add failed!");
4139 evas_object_smart_callback_add(m_title_back_button, "clicked", __title_back_button_clicked_cb, this);
4141 m_navi_it = elm_naviframe_item_push(m_navi_bar, "", NULL, NULL, m_main_layout, NULL);
4143 evas_object_smart_callback_add(m_navi_bar, "transition,finished", __naviframe_pop_finished_cb, this);
4145 elm_object_style_set(m_title_back_button, "browser/title_back");
4146 elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_TITLE_LEFT_BTN, m_title_back_button);
4148 evas_object_show(m_title_back_button);
4149 evas_object_show(m_navi_bar);
4151 m_scroller = elm_scroller_add(m_navi_bar);
4153 BROWSER_LOGE("elm_scroller_add failed!");
4156 /* Do not propagate event to scroller's ancestor */
4157 /* not to call unnecessary other callbacks. */
4158 evas_object_propagate_events_set(m_scroller, EINA_FALSE);
4160 /* Do not use scroller's scrollbar, use webview's scrollbar instead */
4161 elm_scroller_policy_set(m_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
4162 evas_object_size_hint_align_set(m_scroller, EVAS_HINT_FILL, 0.0);
4163 evas_object_size_hint_weight_set(m_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4164 #ifdef BROWSER_SCROLLER_BOUNCING
4165 // elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_TRUE);
4166 elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_FALSE);
4168 elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_FALSE);
4169 elm_object_scroll_freeze_pop(m_scroller);
4170 elm_object_scroll_freeze_push(m_scroller);
4172 evas_object_show(m_scroller);
4174 evas_object_smart_callback_add(m_scroller, "scroll", __scroller_scroll_cb, this);
4175 evas_object_event_callback_add(m_scroller, EVAS_CALLBACK_RESIZE, __scroller_resize_cb, this);
4177 /* create content box which contains navigation layout & webview */
4178 m_content_box = elm_box_add(m_main_layout);
4179 if (!m_content_box) {
4180 BROWSER_LOGE("elm_box_add failed!");
4184 elm_box_horizontal_set(m_content_box, EINA_FALSE);
4185 evas_object_size_hint_weight_set(m_content_box, EVAS_HINT_EXPAND, 0.0);
4186 evas_object_size_hint_align_set(m_content_box, EVAS_HINT_FILL, EVAS_HINT_FILL);
4187 elm_object_content_set(m_scroller, m_content_box);
4188 evas_object_show(m_content_box);
4190 /* create dummy loading progress bar which is displayed at launching time shortly */
4191 m_dummy_loading_progressbar = elm_progressbar_add(m_navi_bar);
4192 if (!m_dummy_loading_progressbar) {
4193 BROWSER_LOGE("elm_progressbar_add failed!");
4197 elm_object_style_set(m_dummy_loading_progressbar, "browser/loading_wheel");
4198 elm_progressbar_pulse(m_dummy_loading_progressbar, EINA_TRUE);
4199 evas_object_size_hint_weight_set(m_dummy_loading_progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4200 evas_object_size_hint_align_set(m_dummy_loading_progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
4201 elm_object_part_content_set(m_main_layout, "elm.swallow.waiting_progress", m_dummy_loading_progressbar);
4202 evas_object_show(m_dummy_loading_progressbar);
4204 /* create conformant */
4205 elm_win_conformant_set(m_win, EINA_TRUE);
4206 m_conformant = elm_conformant_add(m_main_layout);
4207 if (!m_conformant) {
4208 BROWSER_LOGE("elm_conformant_add failed!");
4212 elm_object_style_set(m_conformant, "internal_layout");
4213 evas_object_size_hint_weight_set(m_conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4214 evas_object_size_hint_align_set(m_conformant, EVAS_HINT_FILL, EVAS_HINT_FILL);
4215 elm_object_content_set(m_conformant, m_scroller);
4216 elm_object_part_content_set(m_main_layout, "elm.swallow.content", m_conformant);
4217 evas_object_show(m_conformant);
4219 m_url_layout = _create_url_layout();
4220 if (!m_url_layout) {
4221 BROWSER_LOGE("_create_url_layout failed!");
4224 elm_box_pack_start(m_content_box, m_url_layout);
4226 m_control_bar = _create_control_bar();
4227 if (!m_control_bar) {
4228 BROWSER_LOGE("_create_control_bar failed!");
4231 elm_object_part_content_set(m_main_layout, "elm.swallow.control_bar", m_control_bar);
4233 m_option_header_url_layout = _create_option_header_url_layout();
4234 if (!m_option_header_url_layout) {
4235 BROWSER_LOGE("_create_option_header_url_layout failed!");
4239 m_option_header_layout = elm_layout_add(m_navi_bar);
4240 if (!m_option_header_layout) {
4241 BROWSER_LOGE("elm_layout_add failed!");
4244 if (!elm_layout_file_set(m_option_header_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
4245 "browser-view/option_header")) {
4246 BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
4249 evas_object_size_hint_weight_set(m_option_header_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4250 evas_object_size_hint_align_set(m_option_header_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
4252 elm_object_part_content_set(m_option_header_layout, "elm.swallow.url_layout", m_option_header_url_layout);
4253 evas_object_show(m_option_header_layout);
4255 m_option_header_find_word_layout = _create_find_word_layout();
4256 if (!m_option_header_find_word_layout) {
4257 BROWSER_LOGE("_create_find_word_layout failed");
4260 elm_object_part_content_set(m_option_header_layout, "elm.swallow.find_word_layout", m_option_header_find_word_layout);
4262 elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER, m_option_header_layout);
4263 _navigationbar_visible_set_signal(EINA_FALSE);
4266 if (!_create_zoom_buttons()) {
4267 BROWSER_LOGE("_create_zoom_buttons failed");
4272 edje_object_signal_callback_add(elm_layout_edje_get(m_main_layout),
4273 "mouse,clicked,1", "elm.rect.content_dim", __dim_area_clicked_cb, this);
4275 edje_object_signal_callback_add(elm_layout_edje_get(m_main_layout),
4276 "mouse,down,1", "elm.rect.more_context_bg", __context_menu_bg_mouse_down_cb, this);
4278 const char *current_theme = elm_theme_get(NULL);
4279 if (current_theme && strstr(current_theme, "white")) {
4281 // edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "black_theme,signal", "");
4282 // edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
4283 // "black_theme,signal", "");