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)
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);
2334 void Browser_View::__find_word_cb(void *data, Evas_Object *obj, void *event_info)
2336 BROWSER_LOGD("[%s]", __func__);
2340 Browser_View *browser_view = (Browser_View *)data;
2341 browser_view->_destroy_more_context_popup();
2343 if (browser_view->_get_edit_mode() == BR_FIND_WORD_MODE)
2346 /* find word layout is only in naviframe optino header.
2347 * So expand the option header to show find word layout. */
2348 browser_view->_navigationbar_visible_set_signal(EINA_TRUE);
2350 browser_view->_set_edit_mode(BR_FIND_WORD_MODE);
2352 elm_object_focus_set(browser_view->m_find_word_edit_field, EINA_TRUE);
2354 edje_object_part_text_set(elm_layout_edje_get(browser_view->m_option_header_find_word_layout), "elm.index_text", "0/0");
2357 Eina_Bool Browser_View::_call_download_manager(void)
2359 service_h service_handle = NULL;
2360 BROWSER_LOGD("[%s]", __func__);
2362 if (service_create(&service_handle) < 0) {
2363 BROWSER_LOGE("Fail to create service handle");
2367 if (!service_handle) {
2368 BROWSER_LOGE("service handle is NULL");
2372 if (service_set_operation(service_handle, SERVICE_OPERATION_DOWNLOAD) < 0) {
2373 BROWSER_LOGE("Fail to set service operation");
2374 service_destroy(service_handle);
2378 if (service_add_extra_data(service_handle, "mode", "view") < 0) {
2379 BROWSER_LOGE("Fail to set extra data");
2380 service_destroy(service_handle);
2384 if (service_send_launch_request(service_handle, NULL, NULL) < 0) {
2385 BROWSER_LOGE("Fail to launch service operation");
2386 service_destroy(service_handle);
2390 service_destroy(service_handle);
2395 void Browser_View::__download_manager_cb(void *data, Evas_Object *obj, void *event_info)
2397 BROWSER_LOGD("[%s]", __func__);
2401 Browser_View *browser_view = (Browser_View *)data;
2402 browser_view->_destroy_more_context_popup();
2404 if (!browser_view->_call_download_manager())
2405 BROWSER_LOGE("_call_download_manager failed");
2408 void Browser_View::__send_via_message_cb(void *data, Evas_Object *obj, void *event_info)
2410 BROWSER_LOGD("[%s]", __func__);
2414 Browser_View *browser_view = (Browser_View *)data;
2415 browser_view->_destroy_more_context_popup();
2417 if (!browser_view->_send_via_message(browser_view->get_url(), std::string()))
2418 BROWSER_LOGE("_send_via_message failed");
2421 void Browser_View::__send_via_email_cb(void *data, Evas_Object *obj, void *event_info)
2423 BROWSER_LOGD("[%s]", __func__);
2427 Browser_View *browser_view = (Browser_View *)data;
2428 browser_view->_destroy_more_context_popup();
2430 if (!browser_view->_send_via_email(browser_view->get_url()))
2431 BROWSER_LOGE("_send_via_email failed");
2434 void Browser_View::__post_to_sns_cb(void *data, Evas_Object *obj, void *event_info)
2436 BROWSER_LOGD("[%s]", __func__);
2440 Browser_View *browser_view = (Browser_View*)data;
2442 Elm_Object_Item *it = (Elm_Object_Item *)event_info;
2443 const char *label = elm_object_item_text_get(it);
2444 BROWSER_LOGD("label=[%s]", label);
2445 if (label && strlen(label)) {
2446 if (!browser_view->_post_to_sns(std::string(label), browser_view->get_url()))
2447 BROWSER_LOGE("_post_to_sns failed");
2450 browser_view->_destroy_more_context_popup();
2453 void Browser_View::_destroy_more_context_popup(void)
2455 if (m_more_context_popup) {
2456 evas_object_del(m_more_context_popup);
2457 m_more_context_popup = NULL;
2460 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "hide,more_context_bg,signal", "");
2463 void Browser_View::__more_context_popup_dismissed_cb(void *data, Evas_Object *obj,
2466 BROWSER_LOGD("[%s]", __func__);
2470 Browser_View *browser_view = (Browser_View *)data;
2471 browser_view->_destroy_more_context_popup();
2474 void Browser_View::__clean_up_windows_test_cb(void *data, Evas_Object *obj, void *event_info)
2479 Browser_View *browser_view = (Browser_View *)data;
2480 browser_view->_destroy_more_context_popup();
2482 m_browser->clean_up_windows();
2485 Eina_Bool Browser_View::_show_more_context_popup(void)
2487 BROWSER_LOGD("[%s]", __func__);
2489 _destroy_more_context_popup();
2491 m_more_context_popup = elm_ctxpopup_add(m_win);
2492 if (!m_more_context_popup) {
2493 BROWSER_LOGE("elm_ctxpopup_add failed");
2497 elm_object_style_set(m_more_context_popup, "pass_event");
2499 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "show,more_context_bg,signal", "");
2501 evas_object_size_hint_weight_set(m_more_context_popup, EVAS_HINT_EXPAND,
2503 evas_object_smart_callback_add(m_more_context_popup, "dismissed",
2504 __more_context_popup_dismissed_cb, this);
2506 Elm_Object_Item *sub_menu = NULL;
2507 elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_DOWNLOAD_MANAGER, NULL,
2508 __download_manager_cb, this);
2510 sub_menu = elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_FIND_ON_PAGE, NULL,
2511 __find_word_cb, this);
2513 #if defined(FEATURE_MOST_VISITED_SITES)
2514 is_most_visited_sites_running() ||
2517 || _get_edit_mode() == BR_FIND_WORD_MODE)
2518 elm_object_item_disabled_set(sub_menu, EINA_TRUE);
2520 m_bookmark_on_off_icon = elm_icon_add(m_more_context_popup);
2522 if(m_data_manager->get_history_db()->is_in_bookmark(get_url().c_str(), NULL)) {
2523 if (!elm_icon_file_set(m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_on.png", NULL)) {
2524 BROWSER_LOGE("elm_icon_file_set is failed.\n");
2528 if (!elm_icon_file_set(m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_off.png", NULL)) {
2529 BROWSER_LOGE("elm_icon_file_set is failed.\n");
2533 evas_object_size_hint_aspect_set(m_bookmark_on_off_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
2535 evas_object_propagate_events_set(m_bookmark_on_off_icon, EINA_FALSE);
2536 evas_object_repeat_events_set(m_bookmark_on_off_icon, EINA_FALSE);
2537 evas_object_smart_callback_add(m_bookmark_on_off_icon, "clicked", __bookmark_icon_changed_cb, this);
2539 sub_menu = elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_BOOKMARK, m_bookmark_on_off_icon,
2540 __bookmark_cb, this);
2542 #if defined(FEATURE_MOST_VISITED_SITES)
2543 is_most_visited_sites_running() ||
2546 || _get_edit_mode() == BR_FIND_WORD_MODE)
2547 elm_object_item_disabled_set(sub_menu, EINA_TRUE);
2549 m_private_check = elm_check_add(m_more_context_popup);
2550 elm_object_style_set(m_private_check, "on&off");
2551 evas_object_smart_callback_add(m_private_check, "changed", __private_check_change_cb, this);
2553 elm_check_state_set(m_private_check, m_is_private);
2554 evas_object_propagate_events_set(m_private_check, EINA_FALSE);
2555 evas_object_show(m_private_check);
2557 elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_PRIVATE, m_private_check,
2558 __private_cb, this);
2560 elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_SETTINGS, NULL,
2561 __internet_settings_cb, this);
2563 elm_ctxpopup_hover_parent_set(m_more_context_popup, m_navi_bar);
2565 int controlbar_x = 0;
2566 int controlbar_y = 0;
2567 int controlbar_w = 0;
2568 int controlbar_h = 0;
2569 evas_object_geometry_get(m_control_bar, &controlbar_x, &controlbar_y, &controlbar_w, &controlbar_h);
2571 evas_object_move(m_more_context_popup, (controlbar_w / 5) * 3 + controlbar_w / 10, controlbar_y + (controlbar_h / 2));
2573 evas_object_show(m_more_context_popup);
2578 void Browser_View::__more_cb(void *data, Evas_Object *obj, void *event_info)
2580 BROWSER_LOGD("[%s]", __func__);
2584 Browser_View *browser_view = (Browser_View *)data;
2585 if (browser_view->m_more_context_popup == NULL) {
2586 if (!browser_view->_show_more_context_popup())
2587 BROWSER_LOGE("_show_more_context_popup failed");
2589 browser_view->_destroy_more_context_popup();
2592 browser_view->_navigationbar_visible_set(EINA_TRUE);
2595 void Browser_View::_set_controlbar_back_forward_status(void)
2597 BROWSER_LOGD("[%s]", __func__);
2598 Evas_Object *ewk_view = m_focused_window->m_ewk_view;
2603 #if defined(FEATURE_MOST_VISITED_SITES)
2604 is_most_visited_sites_running() ||
2607 elm_object_item_disabled_set(m_share_controlbar_button, EINA_TRUE);
2609 elm_object_item_disabled_set(m_share_controlbar_button, EINA_FALSE);
2612 void Browser_View::_set_multi_window_controlbar_text(int count)
2614 BROWSER_LOGD("[%s]", __func__);
2616 elm_toolbar_item_icon_set(m_multi_window_button, BROWSER_IMAGE_DIR"/01_controlbar_icon_multiview.png");
2618 char icon_path[100] = {0, };
2619 snprintf(icon_path, sizeof(icon_path) - 1, "%s/01_controlbar_icon_multiview_0%d.png", BROWSER_IMAGE_DIR, count);
2620 elm_toolbar_item_icon_set(m_multi_window_button, icon_path);
2624 Evas_Object *Browser_View::_create_control_bar(void)
2626 BROWSER_LOGD("[%s]", __func__);
2627 Evas_Object *controlbar_layout;
2628 controlbar_layout = elm_layout_add(m_navi_bar);
2629 if (!controlbar_layout) {
2630 BROWSER_LOGE("elm_layout_add failed");
2633 if (!elm_layout_file_set(controlbar_layout, BROWSER_EDJE_DIR"/browser-view-control-bar.edj",
2634 "browser-view-controlbar")) {
2635 BROWSER_LOGE("Can not set layout browser-view-controlbar\n");
2638 evas_object_size_hint_weight_set(controlbar_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2639 evas_object_size_hint_align_set(controlbar_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
2640 evas_object_show(controlbar_layout);
2642 Evas_Object *control_bar;
2643 control_bar = elm_toolbar_add(m_navi_bar);
2645 elm_object_style_set(control_bar, "browser/browser-view");
2647 elm_toolbar_shrink_mode_set(control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
2649 /* New Window Button */
2650 m_new_window_button = elm_toolbar_item_append(control_bar,
2651 BROWSER_IMAGE_DIR"/I01_controlbar_icon_new_window.png", NULL, __new_window_cb, this);
2652 if (!m_new_window_button) {
2653 BROWSER_LOGE("elm_toolbar_item_append failed");
2657 /* Multi Window Button */
2658 m_multi_window_button = elm_toolbar_item_append(control_bar,
2659 BROWSER_IMAGE_DIR"/01_controlbar_icon_multiview.png", NULL, __multi_window_cb, this);
2660 /* Bookmark Button */
2661 elm_toolbar_item_append(control_bar, BROWSER_IMAGE_DIR"/I01_controlbar_icon_bookmark.png",
2662 NULL, __go_to_bookmark_cb, this);
2663 /* More menu Button */
2664 m_more_button = elm_toolbar_item_append(control_bar,
2665 BROWSER_IMAGE_DIR"/I01_controlbar_icon_more.png", NULL, __more_cb, this);
2666 if (!m_more_button) {
2667 BROWSER_LOGE("elm_toolbar_item_append failed");
2671 elm_object_part_content_set(controlbar_layout, "elm.swallow.controlbar", control_bar);
2673 m_back_button = elm_button_add(control_bar);
2674 if (!m_back_button) {
2675 BROWSER_LOGE("elm_button_add failed");
2678 elm_object_style_set(m_back_button, "browser/browser_view_controlbar_back");
2680 elm_object_part_content_set(controlbar_layout, "elm.swallow.back_button", m_back_button);
2681 evas_object_smart_callback_add(m_back_button, "clicked", __backward_cb, this);
2682 evas_object_show(m_back_button);
2683 evas_object_show(control_bar);
2686 return controlbar_layout;
2690 * Create two same url layouts similar with other browsers like android & safari.
2691 * The one(by _create_url_layout) is in the browser scroller and
2692 * the other(by _create_option_header_url_layout) is in the navigation bar option header.
2694 Evas_Object *Browser_View::_create_option_header_url_layout(void)
2696 BROWSER_LOGD("[%s]", __func__);
2697 Evas_Object *url_layout;
2698 url_layout = elm_layout_add(m_navi_bar);
2700 if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
2701 "browser/url_layout")) {
2702 BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
2705 evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2706 evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
2707 evas_object_show(url_layout);
2709 m_option_header_url_entry_layout = elm_layout_add(m_navi_bar);
2710 if (!m_option_header_url_entry_layout) {
2711 BROWSER_LOGE("elm_layout_add failed");
2714 if (!elm_layout_file_set(m_option_header_url_entry_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
2715 "elm/browser/urlentry/default")) {
2716 BROWSER_LOGE("Can not set layout theme[browser, urlentry, default]\n");
2719 elm_object_part_content_set(url_layout, "elm.swallow.url", m_option_header_url_entry_layout);
2720 edje_object_signal_callback_add(elm_layout_edje_get(m_option_header_url_entry_layout),
2721 "mouse,clicked,1", "elm.swallow.entry", __url_entry_clicked_cb, this);
2723 edje_object_signal_callback_add(elm_layout_edje_get(m_option_header_url_entry_layout),
2724 "refresh_stop", "*", __refresh_button_clicked_cb, this);
2726 evas_object_show(m_option_header_url_entry_layout);
2728 m_option_header_url_edit_field = br_elm_url_editfield_add(m_navi_bar);
2729 if (!m_option_header_url_edit_field) {
2730 BROWSER_LOGE("elm_editfield_add failed");
2734 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.entry", m_option_header_url_edit_field);
2735 // br_elm_editfield_entry_single_line_set(m_option_header_url_edit_field, EINA_TRUE);
2736 br_elm_editfield_eraser_set(m_option_header_url_edit_field, EINA_FALSE);
2738 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
2739 elm_entry_input_panel_layout_set(edit_field_entry, ELM_INPUT_PANEL_LAYOUT_URL);
2740 ecore_imf_context_input_panel_event_callback_add((Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry),
2741 ECORE_IMF_INPUT_PANEL_STATE_EVENT, __url_entry_imf_event_cb, this);
2743 evas_object_smart_callback_add(edit_field_entry, "activated", __url_entry_enter_key_cb, this);
2744 evas_event_callback_add(evas_object_evas_get(m_option_header_url_edit_field), EVAS_CALLBACK_CANVAS_FOCUS_OUT,
2745 __url_entry_focus_out_cb, this);
2746 evas_object_show(m_option_header_url_edit_field);
2748 m_option_header_url_progressbar = elm_progressbar_add(m_navi_bar);
2749 if (!m_option_header_url_progressbar) {
2750 BROWSER_LOGE("elm_progressbar_add failed");
2753 elm_object_style_set(m_option_header_url_progressbar, "browser/loading");
2754 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.progressbar", m_option_header_url_progressbar);
2755 elm_progressbar_value_set(m_option_header_url_progressbar, 0);
2756 evas_object_show(m_option_header_url_progressbar);
2758 m_option_header_url_progresswheel = elm_progressbar_add(m_navi_bar);
2759 if (!m_option_header_url_progresswheel) {
2760 BROWSER_LOGE("elm_progressbar_add failed");
2764 elm_object_style_set(m_option_header_url_progresswheel, "UIActivityIndicatorStyleWhite");
2766 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
2767 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.progress", m_option_header_url_progresswheel);
2768 evas_object_show(m_option_header_url_progresswheel);
2770 m_option_header_cancel_button = elm_button_add(m_navi_bar);
2771 if (!m_option_header_cancel_button) {
2772 BROWSER_LOGE("elm_button_add failed");
2775 evas_object_size_hint_weight_set(m_option_header_cancel_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2776 evas_object_size_hint_align_set(m_option_header_cancel_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
2777 elm_object_style_set(m_option_header_cancel_button, "browser/cancel_button");
2778 elm_object_text_set(m_option_header_cancel_button, BR_STRING_CANCEL);
2779 elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_option_header_cancel_button);
2780 evas_object_smart_callback_add(m_option_header_cancel_button, "clicked", __cancel_button_clicked_cb, this);
2781 evas_object_show(m_option_header_cancel_button);
2783 m_option_header_title_backward_button = elm_button_add(m_navi_bar);
2784 if (!m_option_header_title_backward_button) {
2785 BROWSER_LOGE("elm_button_add failed");
2788 elm_object_style_set(m_option_header_title_backward_button, "browser/backward");
2789 elm_object_part_content_set(url_layout, "elm.swallow.backward_button", m_option_header_title_backward_button);
2790 evas_object_smart_callback_add(m_option_header_title_backward_button, "clicked", __backward_button_clicked_cb, this);
2791 elm_object_focus_allow_set(m_option_header_title_backward_button, EINA_FALSE);
2792 evas_object_show(m_option_header_title_backward_button);
2793 elm_object_disabled_set(m_option_header_title_backward_button, EINA_TRUE);
2795 m_option_header_title_forward_button = elm_button_add(m_navi_bar);
2796 if (!m_option_header_title_forward_button) {
2797 BROWSER_LOGE("elm_button_add failed");
2800 elm_object_style_set(m_option_header_title_forward_button, "browser/forward");
2801 elm_object_part_content_set(url_layout, "elm.swallow.forward_button", m_option_header_title_forward_button);
2802 evas_object_smart_callback_add(m_option_header_title_forward_button, "clicked", __forward_button_clicked_cb, this);
2803 elm_object_focus_allow_set(m_option_header_title_forward_button, EINA_FALSE);
2804 evas_object_show(m_option_header_title_forward_button);
2805 elm_object_disabled_set(m_option_header_title_forward_button, EINA_TRUE);
2807 /* for jump to top. */
2808 evas_object_event_callback_add(url_layout, EVAS_CALLBACK_MOUSE_DOWN, __option_header_url_layout_mouse_down_cb, this);
2814 Evas_Object *Browser_View::_get_activated_url_entry(void)
2816 /* The edit field in option header url layout is only valid for edit.
2817 * If the edit field in browser scroller can have focus, there is so many focus issue.
2818 * So just make the edit field in option header editable. */
2819 return m_option_header_url_edit_field;
2822 void Browser_View::__url_entry_imf_event_cb(void *data, Ecore_IMF_Context *ctx, int value)
2824 BROWSER_LOGD("value=%d", value);
2828 Browser_View *browser_view = (Browser_View *)data;
2829 if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
2830 Evas_Object *edit_field_entry;
2831 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
2832 elm_object_focus_set(edit_field_entry, EINA_FALSE);
2834 if (browser_view->m_edit_mode != BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF
2835 && browser_view->m_edit_mode != BR_FIND_WORD_MODE)
2836 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2839 } else if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW)
2840 /* If the focus of url entry is set automatically, the keypad is also displayed automatically. */
2841 /* eg. At url edit mode, lock the screen -> then unlock, the url entry will get focus. */
2842 /* The keypad is also invoked, so set the edit mode. */
2843 browser_view->_set_edit_mode(BR_URL_ENTRY_EDIT_MODE);
2846 void Browser_View::__url_entry_focus_out_cb(void *data, Evas *e, void *event_info)
2848 BROWSER_LOGD("[%s]", __func__);
2852 Browser_View *browser_view = (Browser_View *)data;
2853 Evas_Object *edit_field_entry;
2854 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
2856 Ecore_IMF_Context *ic = (Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry);
2860 ecore_imf_context_input_panel_hide(ic);
2862 if (browser_view->m_edit_mode != BR_FIND_WORD_MODE)
2863 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2866 void Browser_View::_set_edit_mode(edit_mode mode)
2868 BROWSER_LOGD("mode = %d", mode);
2870 if (m_edit_mode == mode)
2873 #if defined(FEATURE_MOST_VISITED_SITES)
2874 if (mode == BR_NO_EDIT_MODE) {
2875 if (m_most_visited_sites) {
2876 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,on,signal", "");
2877 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2878 "url_guide_text,on,signal", "");
2881 if (m_most_visited_sites) {
2882 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,off,signal", "");
2883 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2884 "url_guide_text,off,signal", "");
2889 if (mode == BR_URL_ENTRY_EDIT_MODE || mode == BR_FIND_WORD_MODE
2890 || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
2891 #ifdef BROWSER_SCROLLER_BOUNCING
2892 /* If edit mode, lock the browser scroller */
2893 _enable_webview_scroll();
2895 /* Make the browser scroller region y = 0 to show url bar all at edit mode. */
2899 elm_scroller_region_get(m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
2900 elm_scroller_region_show(m_scroller ,scroller_x, 0, scroller_w, scroller_h);
2903 if (mode == BR_URL_ENTRY_EDIT_MODE) {
2904 /* change layout of url layout for edit mode. */
2905 edje_object_signal_emit(elm_layout_edje_get(m_url_layout), "edit,url,on,signal", "");
2906 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2907 "edit,url,on,signal", "");
2909 /* change refresh icon in url entry for edit mode. */
2910 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "edit,url,on,signal", "");
2911 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2912 "edit,url,on,signal", "");
2914 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "hide,favicon,signal", "");
2915 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2916 "hide,favicon,signal", "");
2917 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
2918 "edit,url,on,signal", "");
2919 } else if (mode == BR_NO_EDIT_MODE || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
2920 if (m_edit_mode == BR_FIND_WORD_MODE) {
2921 edje_object_signal_emit(elm_layout_edje_get(m_option_header_layout), "hide,find_word_layout,signal", "");
2922 m_find_word->find_word("", Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
2924 /* change layout of url layout for normal mode. */
2925 edje_object_signal_emit(elm_layout_edje_get(m_url_layout), "edit,url,off,signal", "");
2926 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2927 "edit,url,off,signal", "");
2929 /* change refresh icon in url entry for normal mode. */
2930 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "edit,url,off,signal", "");
2931 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2932 "edit,url,off,signal", "");
2934 #if defined(FEATURE_MOST_VISITED_SITES)
2935 if (!is_most_visited_sites_running())
2938 if (m_focused_window->m_favicon)
2939 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
2940 "show,favicon,signal", "");
2943 if (m_focused_window->m_option_header_favicon) {
2944 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2945 "show,favicon,signal", "");
2949 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
2950 "edit,url,off,signal", "");
2951 if (_is_loading()) {
2952 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,on,signal", "");
2953 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2954 "loading,on,signal", "");
2957 } else if (mode == BR_FIND_WORD_MODE) {
2958 Evas_Object *find_word_edit_field_entry = br_elm_editfield_entry_get(m_find_word_edit_field);
2959 elm_entry_entry_set(find_word_edit_field_entry, "");
2961 evas_object_smart_callback_del(find_word_edit_field_entry, "changed", __find_word_entry_changed_cb);
2962 evas_object_smart_callback_add(find_word_edit_field_entry, "changed", __find_word_entry_changed_cb, this);
2964 edje_object_signal_emit(elm_layout_edje_get(m_option_header_layout), "show,find_word_layout,signal", "");
2969 /* To show favicon, if click url entry while loading, then cancel case. */
2974 * The url entry of option header can't be focusable in case of switch TEXTBLOCK & elm entry.
2975 * So focus the url entry in idler callback.
2977 static Eina_Bool __url_entry_focus_idler_cb(void *data)
2979 Evas_Object *edit_field = (Evas_Object *)data;
2980 elm_object_focus_set(edit_field, EINA_TRUE);
2982 Evas_Object *entry = br_elm_editfield_entry_get(edit_field);
2983 elm_entry_cursor_end_set(entry);
2985 return ECORE_CALLBACK_CANCEL;
2988 void Browser_View::__url_entry_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
2990 BROWSER_LOGD("[%s]", __func__);
2994 Browser_View *browser_view = (Browser_View *)data;
2996 if (browser_view->_is_loading())
2997 browser_view->_stop_loading();
2999 if (!browser_view->_navigationbar_visible_get()) {
3000 /* The edit field in option header is only for edit url. */
3001 browser_view->_navigationbar_visible_set_signal(EINA_TRUE);
3004 browser_view->_destroy_more_context_popup();
3006 edit_mode mode = browser_view->_get_edit_mode();
3008 browser_view->_set_edit_mode(BR_URL_ENTRY_EDIT_MODE);
3010 if (mode == BR_NO_EDIT_MODE) {
3011 Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field);
3013 elm_object_focus_set(browser_view->m_option_header_url_edit_field, EINA_TRUE);
3014 elm_entry_cursor_end_set(entry);
3016 // ecore_idler_add(__url_entry_focus_idler_cb, browser_view->m_option_header_url_edit_field);
3020 Eina_Bool Browser_View::_is_option_header_expanded(void)
3022 return _navigationbar_visible_get();
3025 void Browser_View::__cancel_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3027 BROWSER_LOGD("[%s]", __func__);
3031 Browser_View *browser_view = (Browser_View *)data;
3032 Evas_Object *ewk_view = browser_view->m_focused_window->m_ewk_view;
3036 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
3038 elm_object_signal_emit(browser_view->m_option_header_url_edit_field, "ellipsis_show,signal", "elm");
3039 elm_object_signal_emit(browser_view->m_url_edit_field, "ellipsis_show,signal", "elm");
3041 browser_view->_set_url_entry(browser_view->get_url().c_str());
3044 void Browser_View::__refresh_button_clicked_cb(void *data, Evas_Object *obj,
3045 const char *emission, const char *source)
3047 BROWSER_LOGD("[%s]", __func__);
3051 Browser_View *browser_view = (Browser_View *)data;
3052 if (browser_view->_get_edit_mode() == BR_URL_ENTRY_EDIT_MODE) {
3053 elm_entry_entry_set(br_elm_editfield_entry_get(browser_view->m_url_edit_field), "");
3054 elm_entry_entry_set(br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field), "");
3055 } else if(browser_view->_is_loading())
3056 browser_view->_stop_loading();
3058 browser_view->_reload();
3061 void Browser_View::__url_entry_enter_key_cb(void *data, Evas_Object *obj, void *event_info)
3063 BROWSER_LOGD("[%s]", __func__);
3067 Browser_View *browser_view = (Browser_View *)data;
3068 Evas_Object *ewk_view = browser_view->m_focused_window->m_ewk_view;
3069 Evas_Object *edit_field_entry;
3070 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
3073 * Give focus to option header cancel button to hide imf. */
3074 elm_object_focus_set(browser_view->m_option_header_cancel_button, EINA_TRUE);
3076 char *url = elm_entry_markup_to_utf8(elm_entry_entry_get(edit_field_entry));
3077 BROWSER_LOGD("input url = [%s]", url);
3079 if (url && strlen(url)) {
3080 browser_view->load_url(url);
3086 void Browser_View::__url_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
3088 BROWSER_LOGD("[%s]", __func__);
3091 void Browser_View::__url_layout_mouse_down_cb(void *data, Evas* evas, Evas_Object *obj,
3094 BROWSER_LOGD("[%s]", __func__);
3098 Evas_Event_Mouse_Down event = *(Evas_Event_Mouse_Down *)event_info;
3100 Browser_View *browser_view = (Browser_View *)data;
3102 Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_url_edit_field);
3108 evas_object_geometry_get(browser_view->m_url_edit_field, &entry_x, &entry_y, &entry_w, &entry_h);
3110 if (event.output.x > entry_x && event.output.x < entry_x + entry_w &&
3111 event.output.y > entry_y && event.output.y < entry_y + entry_h) {
3112 elm_object_signal_emit(browser_view->m_option_header_url_edit_field, "ellipsis_hide,signal", "elm");
3113 elm_object_signal_emit(browser_view->m_url_edit_field, "ellipsis_hide,signal", "elm");
3116 edit_mode mode = browser_view->_get_edit_mode();
3117 if (mode == BR_URL_ENTRY_EDIT_MODE || mode == BR_FIND_WORD_MODE
3118 || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
3119 #ifdef BROWSER_SCROLLER_BOUNCING
3120 BROWSER_LOGD("<< lock browser scroller >>");
3121 elm_object_scroll_freeze_pop(browser_view->m_scroller);
3122 elm_object_scroll_freeze_push(browser_view->m_scroller);
3127 void Browser_View::__option_header_url_layout_mouse_down_cb(void *data, Evas* evas, Evas_Object *obj,
3130 BROWSER_LOGD("[%s]", __func__);
3133 Evas_Event_Mouse_Down event = *(Evas_Event_Mouse_Down *)event_info;
3134 Browser_View *browser_view = (Browser_View *)data;
3136 Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field);
3142 evas_object_geometry_get(browser_view->m_option_header_url_edit_field, &entry_x, &entry_y, &entry_w, &entry_h);
3144 if (event.output.x > entry_x && event.output.x < entry_x + entry_w &&
3145 event.output.y > entry_y && event.output.y < entry_y + entry_h) {
3146 elm_object_signal_emit(browser_view->m_option_header_url_edit_field, "ellipsis_hide,signal", "elm");
3147 elm_object_signal_emit(browser_view->m_url_edit_field, "ellipsis_hide,signal", "elm");
3151 if (event.output.y < icon_y)
3152 browser_view->_jump_to_top();
3155 void Browser_View::_update_back_forward_buttons(void)
3157 BROWSER_LOGD("[%s]", __func__);
3158 if (ewk_view_back_possible(m_focused_window->m_ewk_view)) {
3159 elm_object_disabled_set(m_title_backward_button, EINA_FALSE);
3160 elm_object_disabled_set(m_option_header_title_backward_button, EINA_FALSE);
3162 elm_object_disabled_set(m_title_backward_button, EINA_TRUE);
3163 elm_object_disabled_set(m_option_header_title_backward_button, EINA_TRUE);
3166 if (ewk_view_forward_possible(m_focused_window->m_ewk_view)) {
3167 elm_object_disabled_set(m_title_forward_button, EINA_FALSE);
3168 elm_object_disabled_set(m_option_header_title_forward_button, EINA_FALSE);
3170 elm_object_disabled_set(m_title_forward_button, EINA_TRUE);
3171 elm_object_disabled_set(m_option_header_title_forward_button, EINA_TRUE);
3175 void Browser_View::__backward_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3177 BROWSER_LOGD("[%s]", __func__);
3181 Browser_View *browser_view = (Browser_View *)data;
3182 ewk_view_back(browser_view->m_focused_window->m_ewk_view);
3185 void Browser_View::__forward_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3187 BROWSER_LOGD("[%s]", __func__);
3191 Browser_View *browser_view = (Browser_View *)data;
3192 ewk_view_forward(browser_view->m_focused_window->m_ewk_view);
3195 Evas_Object *Browser_View::_create_url_layout(void)
3197 BROWSER_LOGD("[%s]", __func__);
3198 Evas_Object *url_layout;
3199 url_layout = elm_layout_add(m_navi_bar);
3201 if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
3202 "browser/url_layout")) {
3203 BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
3206 evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, 0.0);
3207 evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3208 evas_object_show(url_layout);
3210 /* create url entry layout in url layout */
3211 m_url_entry_layout = elm_layout_add(m_navi_bar);
3212 if (!m_url_entry_layout) {
3213 BROWSER_LOGE("elm_layout_add failed");
3216 if (!elm_layout_file_set(m_url_entry_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
3217 "elm/browser/urlentry/default")) {
3218 BROWSER_LOGE("Can not set layout theme[browser, urlentry, default]\n");
3221 elm_object_part_content_set(url_layout, "elm.swallow.url", m_url_entry_layout);
3222 evas_object_show(m_url_entry_layout);
3224 m_url_edit_field = br_elm_url_editfield_add(m_navi_bar);
3225 if (!m_url_edit_field) {
3226 BROWSER_LOGE("elm_editfield_add failed");
3229 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.entry", m_url_edit_field);
3230 // br_elm_editfield_entry_single_line_set(m_url_edit_field, EINA_TRUE);
3231 br_elm_editfield_eraser_set(m_url_edit_field, EINA_FALSE);
3233 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(m_url_edit_field);
3234 elm_entry_editable_set(edit_field_entry, EINA_FALSE);
3235 /* The edit field in browser scroller is only for display.
3236 * The edit url is only supported in option header url entry. */
3237 elm_object_focus_allow_set(m_url_edit_field, EINA_FALSE);
3238 elm_object_focus_allow_set(edit_field_entry, EINA_FALSE);
3239 elm_entry_input_panel_enabled_set(edit_field_entry, EINA_FALSE);
3241 elm_entry_text_style_user_push(edit_field_entry, "DEFAULT='font_size=35 color=#3C3632 ellipsis=1'");
3242 evas_object_show(m_url_edit_field);
3244 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "disable_entry,signal", "");
3245 edje_object_signal_callback_add(elm_layout_edje_get(m_url_entry_layout), "mouse,clicked,1", "block_entry",
3246 __url_entry_clicked_cb, this);
3248 edje_object_signal_callback_add(elm_layout_edje_get(m_url_entry_layout), "refresh_stop", "*",
3249 __refresh_button_clicked_cb, this);
3251 m_url_progressbar = elm_progressbar_add(m_navi_bar);
3252 if (!m_url_progressbar) {
3253 BROWSER_LOGE("elm_progressbar_add failed");
3256 elm_object_style_set(m_url_progressbar, "browser/loading");
3257 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.progressbar", m_url_progressbar);
3258 elm_progressbar_value_set(m_url_progressbar, 0);
3259 evas_object_show(m_url_progressbar);
3261 m_url_progresswheel = elm_progressbar_add(m_navi_bar);
3262 if (!m_url_progresswheel) {
3263 BROWSER_LOGE("elm_progressbar_add failed");
3267 elm_object_style_set(m_url_progresswheel, "UIActivityIndicatorStyleWhite");
3268 elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
3269 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.progress", m_url_progresswheel);
3270 evas_object_show(m_url_progresswheel);
3272 m_cancel_button = elm_button_add(m_navi_bar);
3273 if (!m_cancel_button) {
3274 BROWSER_LOGE("elm_button_add failed");
3277 evas_object_size_hint_weight_set(m_cancel_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3278 evas_object_size_hint_align_set(m_cancel_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
3279 elm_object_style_set(m_cancel_button, "browser/cancel_button");
3280 elm_object_text_set(m_cancel_button, BR_STRING_CANCEL);
3281 elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_cancel_button);
3282 evas_object_smart_callback_add(m_cancel_button, "clicked", __cancel_button_clicked_cb, this);
3283 evas_object_show(m_cancel_button);
3285 m_title_backward_button = elm_button_add(m_navi_bar);
3286 if (!m_title_backward_button) {
3287 BROWSER_LOGE("elm_button_add failed");
3290 elm_object_style_set(m_title_backward_button, "browser/backward");
3291 elm_object_part_content_set(url_layout, "elm.swallow.backward_button", m_title_backward_button);
3292 evas_object_smart_callback_add(m_title_backward_button, "clicked", __backward_button_clicked_cb, this);
3293 elm_object_focus_allow_set(m_title_backward_button, EINA_FALSE);
3294 evas_object_show(m_title_backward_button);
3295 elm_object_disabled_set(m_title_backward_button, EINA_TRUE);
3297 m_title_forward_button = elm_button_add(m_navi_bar);
3298 if (!m_title_forward_button) {
3299 BROWSER_LOGE("elm_button_add failed");
3302 elm_object_style_set(m_title_forward_button, "browser/forward");
3303 elm_object_part_content_set(url_layout, "elm.swallow.forward_button", m_title_forward_button);
3304 evas_object_smart_callback_add(m_title_forward_button, "clicked", __forward_button_clicked_cb, this);
3305 elm_object_focus_allow_set(m_title_forward_button, EINA_FALSE);
3306 evas_object_show(m_title_forward_button);
3307 elm_object_disabled_set(m_title_forward_button, EINA_TRUE);
3310 * When edit mode, if scroll down on url layout in browser view,
3311 * the browser can be scrolled even though scroll locked.
3312 * So, lock the browser scroller whenever touch on it if edit mode.
3314 evas_object_event_callback_add(url_layout, EVAS_CALLBACK_MOUSE_DOWN, __url_layout_mouse_down_cb, this);
3320 Evas_Object *Browser_View::_create_find_word_layout(void)
3322 BROWSER_LOGD("[%s]", __func__);
3323 Evas_Object *url_layout = elm_layout_add(m_navi_bar);
3325 BROWSER_LOGE("elm_layout_add failed");
3328 if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-find-word-layout.edj",
3329 "browser-view/find_word_layout")) {
3330 BROWSER_LOGE("Can not set layout theme[browser-view/find_word_layout]\n");
3333 evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, 0.0);
3334 evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3335 evas_object_show(url_layout);
3337 /* create url entry layout in url layout */
3338 m_find_word_entry_layout = elm_layout_add(m_navi_bar);
3339 if (!m_find_word_entry_layout) {
3340 BROWSER_LOGE("elm_layout_add failed");
3343 if (!elm_layout_file_set(m_find_word_entry_layout, BROWSER_EDJE_DIR"/browser-view-find-word-layout.edj",
3344 "browser-view/find_word_editfield_layout")) {
3345 BROWSER_LOGE("browser-view/find_word_editfield_layout failed");
3348 elm_object_part_content_set(url_layout, "elm.swallow.url", m_find_word_entry_layout);
3349 evas_object_show(m_find_word_entry_layout);
3351 edje_object_part_text_set(elm_layout_edje_get(url_layout), "title_text", BR_STRING_FIND_ON_PAGE);
3353 m_find_word_edit_field = br_elm_find_word_editfield_add(m_navi_bar);
3354 if (!m_find_word_edit_field) {
3355 BROWSER_LOGE("elm_editfield_add failed");
3358 elm_object_part_content_set(m_find_word_entry_layout, "elm.swallow.entry", m_find_word_edit_field);
3359 evas_object_show(m_find_word_edit_field);
3361 edje_object_signal_emit(elm_layout_edje_get(m_find_word_edit_field), "find_word,signal", "elm");
3363 // br_elm_editfield_entry_single_line_set(m_find_word_edit_field, EINA_TRUE);
3364 br_elm_editfield_eraser_set(m_find_word_edit_field, EINA_TRUE);
3366 elm_object_signal_callback_add(m_find_word_edit_field, "elm,eraser,clicked", "elm",
3367 __find_word_erase_button_clicked_cb, this);
3369 Evas_Object *find_word_edit_field_entry = br_elm_editfield_entry_get(m_find_word_edit_field);
3370 elm_entry_entry_set(find_word_edit_field_entry, "");
3371 evas_object_smart_callback_add(find_word_edit_field_entry, "activated", __find_word_entry_enter_key_cb, this);
3372 elm_entry_input_panel_layout_set(find_word_edit_field_entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
3373 elm_entry_prediction_allow_set(find_word_edit_field_entry, EINA_FALSE);
3374 ecore_imf_context_input_panel_event_callback_add((Ecore_IMF_Context *)elm_entry_imf_context_get(find_word_edit_field_entry),
3375 ECORE_IMF_INPUT_PANEL_STATE_EVENT, __find_word_entry_imf_event_cb, this);
3376 elm_entry_text_style_user_push(find_word_edit_field_entry, "DEFAULT='font_size=35 color=#3C363 2 ellipsis=1'");
3377 evas_object_show(m_find_word_edit_field);
3379 m_find_word_cancel_button = elm_button_add(m_navi_bar);
3380 if (!m_find_word_cancel_button) {
3381 BROWSER_LOGE("elm_button_add failed");
3384 elm_object_style_set(m_find_word_cancel_button, "browser/cancel_button");
3385 elm_object_text_set(m_find_word_cancel_button, BR_STRING_CANCEL);
3386 elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_find_word_cancel_button);
3387 evas_object_show(m_find_word_cancel_button);
3389 evas_object_smart_callback_add(m_find_word_cancel_button, "clicked", __find_word_cancel_button_clicked_cb, this);
3391 m_find_word_prev_button = elm_button_add(m_navi_bar);
3392 if (!m_find_word_prev_button) {
3393 BROWSER_LOGE("elm_button_add failed");
3396 elm_object_style_set(m_find_word_prev_button, "browser/find_word_prev_but");
3397 elm_object_part_content_set(url_layout, "elm.swallow.find_word_prev", m_find_word_prev_button);
3398 evas_object_show(m_find_word_prev_button);
3399 evas_object_smart_callback_add(m_find_word_prev_button, "clicked", __find_word_prev_button_clicked_cb, this);
3401 m_find_word_next_button = elm_button_add(m_navi_bar);
3402 if (!m_find_word_next_button) {
3403 BROWSER_LOGE("elm_button_add failed");
3406 elm_object_style_set(m_find_word_next_button, "browser/find_word_next_but");
3407 elm_object_part_content_set(url_layout, "elm.swallow.find_word_next", m_find_word_next_button);
3408 evas_object_show(m_find_word_next_button);
3409 evas_object_smart_callback_add(m_find_word_next_button, "clicked", __find_word_next_button_clicked_cb, this);
3411 const char *current_theme = elm_theme_get(NULL);
3412 if (current_theme && strstr(current_theme, "white")) {
3414 // edje_object_signal_emit(elm_layout_edje_get(m_find_word_entry_layout),
3415 // "black_theme,signal", "");
3421 void Browser_View::__find_word_erase_button_clicked_cb(void *data, Evas_Object *obj,
3422 const char *emission, const char *source)
3424 BROWSER_LOGD("[%s]", __func__);
3425 Browser_View *browser_view = (Browser_View *)data;
3426 edje_object_part_text_set(elm_layout_edje_get(browser_view->m_option_header_find_word_layout), "elm.index_text", "0/0");
3428 if (elm_object_disabled_get(browser_view->m_find_word_prev_button))
3429 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_FALSE);
3430 if (elm_object_disabled_get(browser_view->m_find_word_next_button))
3431 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_FALSE);
3434 void Browser_View::__find_word_cancel_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3436 BROWSER_LOGD("[%s]", __func__);
3440 Browser_View *browser_view = (Browser_View *)data;
3441 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
3442 browser_view->m_find_word->find_word("", Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3444 if (elm_object_disabled_get(browser_view->m_find_word_prev_button))
3445 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_FALSE);
3446 if (elm_object_disabled_get(browser_view->m_find_word_next_button))
3447 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_FALSE);
3449 void Browser_View::__find_word_prev_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3451 BROWSER_LOGD("[%s]", __func__);
3455 Browser_View *browser_view = (Browser_View *)data;
3456 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3457 const char *find_word = elm_entry_entry_get(edit_field_entry);
3458 if (!find_word || !strlen(find_word))
3461 int index_cnt = browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_BACKWARD);
3462 int match_max_cnt = browser_view->m_find_word->get_match_max_value();
3464 if (index_cnt == 1) {
3465 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_TRUE);
3466 if (index_cnt != match_max_cnt)
3467 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_FALSE);
3469 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_FALSE);
3470 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_FALSE);
3474 void Browser_View::__find_word_next_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3476 BROWSER_LOGD("[%s]", __func__);
3480 Browser_View *browser_view = (Browser_View *)data;
3481 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3482 const char *find_word = elm_entry_entry_get(edit_field_entry);
3483 if (!find_word || !strlen(find_word))
3486 int index_cnt = browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3487 int match_max_cnt = browser_view->m_find_word->get_match_max_value();
3489 if (index_cnt == match_max_cnt) {
3490 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_TRUE);
3491 if (match_max_cnt != 1)
3492 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_FALSE);
3494 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_FALSE);
3495 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_FALSE);
3499 void Browser_View::__find_word_entry_imf_event_cb(void *data, Ecore_IMF_Context *ctx, int value)
3501 BROWSER_LOGD("value=%d", value);
3505 Browser_View *browser_view = (Browser_View *)data;
3506 Evas_Object *find_word_editfield_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3507 elm_object_focus_set(find_word_editfield_entry, EINA_FALSE);
3508 const char *find_word = elm_entry_entry_get(find_word_editfield_entry);
3510 if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
3511 int match_max_cnt = browser_view->m_find_word->get_match_max_value();
3512 if (match_max_cnt == 0 || match_max_cnt == 1) {
3513 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_TRUE);
3514 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_TRUE);
3517 elm_object_focus_set(find_word_editfield_entry, EINA_TRUE);
3520 void Browser_View::_enable_browser_scroller_scroll(void)
3522 #ifdef BROWSER_SCROLLER_BOUNCING
3523 if (!ewk_view_vertical_panning_hold_get(m_focused_window->m_ewk_view)
3524 && !_is_loading() && !m_is_full_screen) {
3525 BROWSER_LOGD("<< unlock browser scroller, lock ewk view >>");
3526 elm_object_scroll_freeze_pop(m_scroller);
3527 ewk_view_vertical_panning_hold_set(m_focused_window->m_ewk_view, EINA_TRUE);
3532 void Browser_View::_enable_webview_scroll(void)
3534 #ifdef BROWSER_SCROLLER_BOUNCING
3535 if (ewk_view_vertical_panning_hold_get(m_focused_window->m_ewk_view)) {
3536 BROWSER_LOGD("<< lock browser scroller, unlock ewk view >>");
3537 elm_object_scroll_freeze_pop(m_scroller);
3538 elm_object_scroll_freeze_push(m_scroller);
3539 ewk_view_vertical_panning_hold_set(m_focused_window->m_ewk_view, EINA_FALSE);
3544 void Browser_View::__find_word_entry_enter_key_cb(void *data, Evas_Object *obj, void *event_info)
3546 BROWSER_LOGD("[%s]", __func__);
3550 Browser_View *browser_view = (Browser_View *)data;
3551 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3552 const char *find_word = elm_entry_entry_get(edit_field_entry);
3553 if (!find_word || !strlen(find_word))
3556 if (elm_object_disabled_get(browser_view->m_find_word_prev_button))
3557 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_FALSE);
3558 if (elm_object_disabled_get(browser_view->m_find_word_next_button))
3559 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_FALSE);
3561 browser_view->m_find_word->init_index();
3562 browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3564 elm_object_focus_set(edit_field_entry, EINA_FALSE);
3565 BROWSER_LOGD("find_word=[%s]", find_word);
3568 void Browser_View::__find_word_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
3570 BROWSER_LOGD("[%s]", __func__);
3574 Browser_View *browser_view = (Browser_View *)data;
3575 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3577 const char *find_word = elm_entry_entry_get(edit_field_entry);
3579 if (elm_object_disabled_get(browser_view->m_find_word_prev_button))
3580 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_FALSE);
3581 if (elm_object_disabled_get(browser_view->m_find_word_next_button))
3582 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_FALSE);
3584 if (!find_word || !strlen(find_word)) {
3585 browser_view->m_find_word->find_word("", Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3587 browser_view->m_find_word->init_index();
3588 browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3592 void Browser_View::_navigationbar_title_clicked(void)
3594 BROWSER_LOGD("[%s]", __func__);
3595 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
3596 Evas_Object *content = elm_object_item_content_get(top_it);
3597 if (content != m_main_layout)
3600 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)
3601 #if defined(FEATURE_MOST_VISITED_SITES)
3602 || is_most_visited_sites_running()
3604 || m_edit_mode != BR_NO_EDIT_MODE)
3611 elm_scroller_region_get(m_scroller, &scroller_x, &scroller_y, &scroller_w, &scroller_h);
3613 if (scroller_y == 0) {
3614 /* scroller is on top, the url bar in scroller is fully being displayed.
3615 * Then, just show/hide the tool bar. */
3616 const char* state = edje_object_part_state_get(elm_layout_edje_get(m_main_layout),
3617 "elm.swallow.control_bar", NULL);
3618 if(state && !strncmp(state, "default", strlen("default")))
3619 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "show,control_bar,signal", "");
3621 #ifdef BROWSER_SCROLLER_BOUNCING
3622 int url_layout_h = 0;
3623 evas_object_geometry_get(m_url_layout, NULL, NULL, NULL, &url_layout_h);
3624 elm_scroller_region_bring_in(m_scroller ,scroller_x, url_layout_h, scroller_w, scroller_h);
3628 if (_is_loading()) {
3630 Eina_Bool visible = _navigationbar_visible_get();
3631 #ifdef BROWSER_SCROLLER_BOUNCING
3632 _navigationbar_visible_set(!visible);
3639 void Browser_View::_jump_to_top(void)
3641 BROWSER_LOGD("[%s]", __func__);
3642 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
3643 Evas_Object *content = elm_object_item_content_get(top_it);
3644 if (content != m_main_layout)
3647 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)
3648 #if defined(FEATURE_MOST_VISITED_SITES)
3649 || is_most_visited_sites_running()
3651 || m_edit_mode != BR_NO_EDIT_MODE)
3654 int browser_scroller_x = 0;
3655 int browser_scroller_w = 0;
3656 int browser_scroller_h = 0;
3657 elm_scroller_region_get(m_scroller, &browser_scroller_x, NULL,
3658 &browser_scroller_w, &browser_scroller_h);
3659 elm_scroller_region_show(m_scroller, browser_scroller_x, 0, browser_scroller_w, browser_scroller_h);
3661 ewk_view_top_of_contents_go(m_focused_window->m_ewk_view);
3664 void Browser_View::delete_non_user_created_windows(void)
3666 BROWSER_LOGD("[%s]", __func__);
3667 /* Delete no-backward history window. */
3668 std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3669 int window_count = window_list.size();
3671 if (window_count <= 1)
3675 for (i = 0 ; i < window_count ; i++) {
3676 BROWSER_LOGD("focusable_window = %d, window[%d]=%d", m_focused_window, i, window_list[i]);
3677 if (window_list[i]->m_ewk_view
3678 &&!ewk_view_back_possible(window_list[i]->m_ewk_view)
3679 && window_list[i] != m_focused_window
3680 && window_list[i]->m_created_by_user == EINA_FALSE) {
3681 BROWSER_LOGD("delete window index=[%d]", i);
3682 m_browser->delete_window(window_list[i]);
3684 /* Set title & url with the focused window. */
3685 _set_navigationbar_title(get_title().c_str());
3686 _set_url_entry(get_url().c_str());
3687 _set_controlbar_back_forward_status();
3688 if (!_set_favicon())
3689 BROWSER_LOGE("_set_favicon failed");
3694 void Browser_View::__title_back_button_clicked_cb(void *data , Evas_Object *obj, void *event_info)
3696 BROWSER_LOGD("[%s]", __func__);
3700 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
3701 BROWSER_LOGD("close multi window");
3702 m_data_manager->get_multi_window_view()->close_multi_window();
3706 Browser_View *browser_view = (Browser_View *)data;
3708 if (browser_view->m_focused_window->m_ewk_view
3709 && ewk_view_back_possible(browser_view->m_focused_window->m_ewk_view))
3710 ewk_view_back(browser_view->m_focused_window->m_ewk_view);
3712 if (browser_view->m_focused_window->m_parent) {
3713 /* Save current window pointer to delete later. */
3714 Browser_Window *delete_window = browser_view->m_focused_window;
3715 browser_view->m_browser->set_focused_window(browser_view->m_focused_window->m_parent);
3716 browser_view->m_browser->delete_window(delete_window);
3718 /* Set title & url with the focused window. */
3719 browser_view->_set_navigationbar_title(browser_view->get_title().c_str());
3720 browser_view->_set_url_entry(browser_view->get_url().c_str());
3721 browser_view->_set_controlbar_back_forward_status();
3722 if (!browser_view->_set_favicon())
3723 BROWSER_LOGE("_set_favicon failed");
3725 elm_win_lower(browser_view->m_win);
3727 browser_view->delete_non_user_created_windows();
3732 void Browser_View::__scroller_scroll_cb(void *data, Evas_Object *obj, void *event_info)
3734 #ifdef BROWSER_SCROLLER_BOUNCING
3738 Browser_View *browser_view = (Browser_View *)data;
3740 int browser_scroller_x = 0;
3741 int browser_scroller_y = 0;
3742 int browser_scroller_w = 0;
3743 int browser_scroller_h = 0;
3744 elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, &browser_scroller_y,
3745 &browser_scroller_w, &browser_scroller_h);
3747 int url_layout_h = 0;
3748 evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
3751 * If user scrolls up/down near the url bar edge, the movement of scroller is not smooth.
3752 * It's because the browser scroller region y is also bouncing.
3753 * So if the scroller region y is bigger than the height of url bar(65 pixel),
3754 * make the region y to url bar height by force. */
3755 if (browser_scroller_y > url_layout_h)
3756 elm_scroller_region_show(browser_view->m_scroller, browser_scroller_x, url_layout_h,
3757 browser_scroller_w, browser_scroller_h);
3761 Eina_Bool Browser_View::_is_loading(void)
3763 if (!m_focused_window || !m_focused_window->m_ewk_view)
3766 double progress = ewk_view_load_progress_get(m_focused_window->m_ewk_view);
3767 // BROWSER_LOGD("progress=%f", progress);
3768 if (progress == 1.0f || progress < 0.05f)
3774 #if defined(HORIZONTAL_UI)
3775 Eina_Bool Browser_View::is_available_to_rotate(void)
3778 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
3779 if (m_data_manager->get_multi_window_view()->is_reordering_mode())
3783 if (m_scissorbox_view)
3789 Eina_Bool Browser_View::__rotate_multi_window_cb(void *data)
3791 BROWSER_LOGD("[%s]", __func__);
3792 Browser_View *browser_view = (Browser_View *)data;
3793 browser_view->m_multi_window_rotate_timer = NULL;
3794 browser_view->_rotate_multi_window();
3796 return ECORE_CALLBACK_CANCEL;
3799 void Browser_View::rotate(int degree)
3802 /* In landscape mode, if the url bar is not displayed -> rotate to portrait mode.
3803 * Then the url bar is displayed. To avoid this issue, remember the scroller region y,
3804 * then restore it at portrait mode. */
3805 int scroller_region_y = 0;
3806 elm_scroller_region_get(m_scroller, NULL, &scroller_region_y, NULL, NULL);
3807 m_scroller_region_y = scroller_region_y;
3809 m_rotate_degree = degree;
3811 #if defined(FEATURE_MOST_VISITED_SITES)
3812 if (m_most_visited_sites)
3813 m_most_visited_sites->rotate();
3815 if (m_scissorbox_view)
3816 _destroy_scissorbox_view();
3819 void Browser_View::suspend_ewk_view(Evas_Object *ewk_view)
3821 BROWSER_LOGD("[%s]", __func__);
3823 std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3824 for (int i = 0 ; i < window_list.size() ; i++) {
3825 if (window_list[i]->m_ewk_view_layout) {
3826 edje_object_signal_emit(elm_layout_edje_get(window_list[i]->m_ewk_view_layout),
3827 "unresizable,signal", "");
3832 ewk_view_suspend(ewk_view);
3833 ewk_view_visibility_set(ewk_view, EINA_FALSE);
3836 void Browser_View::resume_ewk_view(Evas_Object *ewk_view)
3838 BROWSER_LOGD("[%s]", __func__);
3840 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
3843 ewk_view_resume(ewk_view);
3844 ewk_view_visibility_set(ewk_view, EINA_TRUE);
3847 void Browser_View::pause(void)
3849 BROWSER_LOGD("[%s]", __func__);
3850 if (_is_loading()) {
3851 /* Because the progress wheel in url bar has about 15% cpu consumption.
3852 * So, pause the animation when browser goes to background. It's nonsense!*/
3853 if (m_option_header_url_progresswheel)
3854 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
3855 if (m_url_progresswheel)
3856 elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
3859 set_full_sreen(EINA_FALSE);
3863 suspend_ewk_view(m_focused_window->m_ewk_view);
3865 /* stop vibration */
3866 _haptic_device_stop();
3869 void Browser_View::resume(void)
3871 BROWSER_LOGD("[%s]", __func__);
3872 if (_is_loading()) {
3873 /* Because the progress wheel in url bar has about 15% cpu consumption.
3874 * So, pause the animation when browser goes to background. It's nonsense! */
3875 if (m_option_header_url_progresswheel)
3876 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_TRUE);
3877 if (m_url_progresswheel)
3878 elm_progressbar_pulse(m_url_progresswheel, EINA_TRUE);
3883 resume_ewk_view(m_focused_window->m_ewk_view);
3886 void Browser_View::reset(void)
3888 BROWSER_LOGD("[%s]", __func__);
3889 if (m_focused_window && m_focused_window->m_ewk_view)
3893 Eina_Bool Browser_View::__webview_layout_resize_idler_cb(void *data)
3897 return ECORE_CALLBACK_CANCEL;
3899 Browser_View *browser_view = (Browser_View *)data;
3901 browser_view->m_resize_idler = NULL;
3903 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_focused_window->m_ewk_view_layout),
3904 "resizable,signal", "");
3908 #ifdef BROWSER_SCROLLER_BOUNCING
3909 edje_object_part_geometry_get(elm_layout_edje_get(browser_view->m_main_layout),
3910 "elm.swallow.content", NULL, NULL, &content_w, &content_h);
3912 edje_object_part_geometry_get(elm_layout_edje_get(browser_view->m_focused_window->m_ewk_view_layout),
3913 "elm.swallow.webview", NULL, NULL, &content_w, &content_h);
3915 if (browser_view->m_is_full_screen) {
3916 int browser_scroller_y = 0;
3917 evas_object_geometry_get(browser_view->m_scroller, NULL, &browser_scroller_y, NULL, NULL);
3918 evas_object_resize(browser_view->m_focused_window->m_ewk_view,
3919 content_w, content_h + browser_scroller_y);
3921 evas_object_size_hint_min_set(browser_view->m_focused_window->m_ewk_view_layout,
3922 content_w, content_h);
3923 evas_object_resize(browser_view->m_focused_window->m_ewk_view_layout,
3924 content_w, content_h);
3927 return ECORE_CALLBACK_CANCEL;
3930 Eina_Bool Browser_View::__scroller_bring_in_idler_cb(void *data)
3932 BROWSER_LOGD("[%s]", __func__);
3934 return ECORE_CALLBACK_CANCEL;
3935 Browser_View *browser_view = (Browser_View *)data;
3937 int url_layout_h = 0;
3938 evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
3940 BROWSER_LOGD("<< elm_scroller_region_bring_in , url_layout_h=%d >>", url_layout_h);
3941 int browser_scroller_x = 0;
3942 int browser_scroller_w = 0;
3943 int browser_scroller_h = 0;
3944 elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, NULL,
3945 &browser_scroller_w, &browser_scroller_h);
3946 elm_scroller_region_show(browser_view->m_scroller, browser_scroller_x, url_layout_h,
3947 browser_scroller_w, browser_scroller_h);
3949 return ECORE_CALLBACK_CANCEL;
3953 * If user invokes the keypad via input field or url entry, resize the webview.
3954 * The only scroller resize is called when the keypad is launched.
3955 * Other elements like layout, conformant resize event doesn't come. */
3956 void Browser_View::__scroller_resize_cb(void* data, Evas* evas, Evas_Object* obj, void* ev)
3958 BROWSER_LOGD("[%s]", __func__);
3962 Browser_View *browser_view = (Browser_View *)data;
3964 if (browser_view->m_is_full_screen) {
3965 ecore_idler_add(__webview_layout_resize_idler_cb, browser_view);
3971 evas_object_geometry_get(browser_view->m_scroller, NULL, NULL, &scroller_w, &scroller_h);
3972 std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3974 for (int i = 0 ; i < window_list.size() ; i++) {
3975 if (window_list[i]->m_ewk_view_layout) {
3976 edje_object_signal_emit(elm_layout_edje_get(window_list[i]->m_ewk_view_layout),
3977 "resizable,signal", "");
3979 evas_object_size_hint_min_set(window_list[i]->m_ewk_view_layout,
3980 scroller_w, scroller_h);
3981 evas_object_resize(window_list[i]->m_ewk_view_layout,
3982 scroller_w, scroller_h);
3986 #if defined(HORIZONTAL_UI)
3987 Evas_Object *edit_field_entry;
3988 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
3989 Ecore_IMF_Context *ic = (Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry);
3990 /* If the keypad from webkit is invoked in landscape mode, the visible viewport is too narrow.
3991 * So, hide the url bar in browser scroller by bring in.
3992 * The direct bring in call doesn't work, so do it by idler. */
3993 if (ic && browser_view->is_landscape()) {
3994 Ecore_IMF_Input_Panel_State imf_state = ecore_imf_context_input_panel_state_get(ic);
3995 /* Strangley, The state of webkit's imf is show-state even if the ic is url entry.
3996 * However, this is good for browser without webkit's ic get API. */
3997 if (imf_state == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
3998 browser_view->_enable_browser_scroller_scroll();
3999 ecore_idler_add(__scroller_bring_in_idler_cb, browser_view);
4004 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
4005 BROWSER_LOGD("close multi window");
4006 browser_view->m_is_multi_window_grid_mode = m_data_manager->get_multi_window_view()->_is_grid_mode();
4007 m_data_manager->get_multi_window_view()->close_multi_window();
4009 #if defined(HORIZONTAL_UI)
4010 if (browser_view->m_multi_window_rotate_timer)
4011 ecore_timer_del(browser_view->m_multi_window_rotate_timer);
4012 browser_view->m_multi_window_rotate_timer = ecore_timer_add(0.2, __rotate_multi_window_cb, browser_view);
4019 Eina_Bool Browser_View::__zoom_button_timeout_cb(void *data)
4021 BROWSER_LOGD("[%s]", __func__);
4023 return ECORE_CALLBACK_CANCEL;
4025 Browser_View *browser_view = (Browser_View *)data;
4026 browser_view->m_zoom_button_timer = NULL;
4028 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,zoom_buttons,signal", "");
4030 return ECORE_CALLBACK_CANCEL;
4033 void Browser_View::__zoom_out_clicked_cb(void *data, Evas_Object *obj, void *event_info)
4035 BROWSER_LOGD("[%s]", __func__);
4039 Browser_View *browser_view = (Browser_View *)data;
4040 double scale_factor = ewk_view_scale_get(browser_view->m_focused_window->m_ewk_view);
4041 ewk_view_scale_set(browser_view->m_focused_window->m_ewk_view, scale_factor - 0.5f, 0, 0);
4043 if (browser_view->m_zoom_button_timer)
4044 ecore_timer_del(browser_view->m_zoom_button_timer);
4045 browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
4048 void Browser_View::__zoom_in_clicked_cb(void *data, Evas_Object *obj, void *event_info)
4050 BROWSER_LOGD("[%s]", __func__);
4054 Browser_View *browser_view = (Browser_View *)data;
4055 double scale_factor = ewk_view_scale_get(browser_view->m_focused_window->m_ewk_view);
4056 ewk_view_scale_set(browser_view->m_focused_window->m_ewk_view, scale_factor + 0.5f, 0, 0);
4058 if (browser_view->m_zoom_button_timer)
4059 ecore_timer_del(browser_view->m_zoom_button_timer);
4060 browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
4063 Eina_Bool Browser_View::_create_zoom_buttons(void)
4065 BROWSER_LOGD("[%s]", __func__);
4066 m_zoom_out_button = elm_button_add(m_navi_bar);
4067 if (!m_zoom_out_button) {
4068 BROWSER_LOGE("elm_button_add failed");
4071 elm_object_style_set(m_zoom_out_button, "browser/zoom_out");
4072 elm_object_part_content_set(m_main_layout, "elm.swallow.zoom_out_button", m_zoom_out_button);
4073 evas_object_smart_callback_add(m_zoom_out_button, "clicked", __zoom_out_clicked_cb, this);
4074 evas_object_show(m_zoom_out_button);
4076 m_zoom_in_button = elm_button_add(m_navi_bar);
4077 if (!m_zoom_in_button) {
4078 BROWSER_LOGE("elm_button_add failed");
4082 elm_object_style_set(m_zoom_in_button, "browser/zoom_in");
4083 elm_object_part_content_set(m_main_layout, "elm.swallow.zoom_in_button", m_zoom_in_button);
4084 evas_object_smart_callback_add(m_zoom_in_button, "clicked", __zoom_in_clicked_cb, this);
4085 evas_object_show(m_zoom_in_button);
4091 void Browser_View::__naviframe_pop_finished_cb(void *data , Evas_Object *obj, void *event_info)
4093 BROWSER_LOGD("[%s]", __func__);
4097 Browser_View *browser_view = (Browser_View *)data;
4098 Elm_Object_Item *it = (Elm_Object_Item *)event_info;
4100 if (browser_view->m_navi_it != elm_naviframe_top_item_get(m_navi_bar))
4103 m_data_manager->destroy_bookmark_view();
4104 m_data_manager->destroy_history_layout();
4105 /* Add to bookmark, then cancel. */
4106 m_data_manager->destroy_add_to_bookmark_view();
4107 #if defined(FEATURE_MOST_VISITED_SITES)
4108 m_data_manager->destroy_add_to_most_visited_sites_view();
4111 /* If return from browser settings. */
4112 if (browser_view->m_browser_settings) {
4113 delete browser_view->m_browser_settings;
4114 browser_view->m_browser_settings = NULL;
4118 void Browser_View::__dim_area_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
4120 BROWSER_LOGD("[%s]", __func__);
4124 Browser_View *browser_view = (Browser_View *)data;
4126 elm_object_focus_set(m_data_manager->get_browser_view()->m_option_header_cancel_button, EINA_TRUE);
4129 void Browser_View::__context_menu_bg_mouse_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
4131 BROWSER_LOGD("[%s]", __func__);
4135 Browser_View *browser_view = (Browser_View *)data;
4137 browser_view->_destroy_more_context_popup();
4140 Eina_Bool Browser_View::_create_main_layout(void)
4142 BROWSER_LOGD("[%s]", __func__);
4143 m_main_layout = elm_layout_add(m_navi_bar);
4144 if (!m_main_layout) {
4145 BROWSER_LOGE("elm_layout_add failed!");
4149 if (!elm_layout_file_set(m_main_layout, BROWSER_EDJE_DIR"/browser-view-main.edj",
4150 "browser/browser-view-main")) {
4151 BROWSER_LOGE("elm_layout_file_set failed", BROWSER_EDJE_DIR);
4155 evas_object_size_hint_weight_set(m_main_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4156 evas_object_size_hint_align_set(m_main_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
4157 evas_object_show(m_main_layout);
4159 m_title_back_button = elm_button_add(m_navi_bar);
4160 if (!m_title_back_button) {
4161 BROWSER_LOGE("elm_button_add failed!");
4164 evas_object_smart_callback_add(m_title_back_button, "clicked", __title_back_button_clicked_cb, this);
4166 m_navi_it = elm_naviframe_item_push(m_navi_bar, "", NULL, NULL, m_main_layout, NULL);
4168 evas_object_smart_callback_add(m_navi_bar, "transition,finished", __naviframe_pop_finished_cb, this);
4170 elm_object_style_set(m_title_back_button, "browser/title_back");
4171 elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_TITLE_LEFT_BTN, m_title_back_button);
4173 evas_object_show(m_title_back_button);
4174 evas_object_show(m_navi_bar);
4176 m_scroller = elm_scroller_add(m_navi_bar);
4178 BROWSER_LOGE("elm_scroller_add failed!");
4181 /* Do not propagate event to scroller's ancestor */
4182 /* not to call unnecessary other callbacks. */
4183 evas_object_propagate_events_set(m_scroller, EINA_FALSE);
4185 /* Do not use scroller's scrollbar, use webview's scrollbar instead */
4186 elm_scroller_policy_set(m_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
4187 evas_object_size_hint_align_set(m_scroller, EVAS_HINT_FILL, 0.0);
4188 evas_object_size_hint_weight_set(m_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4189 #ifdef BROWSER_SCROLLER_BOUNCING
4190 // elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_TRUE);
4191 elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_FALSE);
4193 elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_FALSE);
4194 elm_object_scroll_freeze_pop(m_scroller);
4195 elm_object_scroll_freeze_push(m_scroller);
4197 evas_object_show(m_scroller);
4199 evas_object_smart_callback_add(m_scroller, "scroll", __scroller_scroll_cb, this);
4200 evas_object_event_callback_add(m_scroller, EVAS_CALLBACK_RESIZE, __scroller_resize_cb, this);
4202 /* create content box which contains navigation layout & webview */
4203 m_content_box = elm_box_add(m_main_layout);
4204 if (!m_content_box) {
4205 BROWSER_LOGE("elm_box_add failed!");
4209 elm_box_horizontal_set(m_content_box, EINA_FALSE);
4210 evas_object_size_hint_weight_set(m_content_box, EVAS_HINT_EXPAND, 0.0);
4211 evas_object_size_hint_align_set(m_content_box, EVAS_HINT_FILL, EVAS_HINT_FILL);
4212 elm_object_content_set(m_scroller, m_content_box);
4213 evas_object_show(m_content_box);
4215 /* create dummy loading progress bar which is displayed at launching time shortly */
4216 m_dummy_loading_progressbar = elm_progressbar_add(m_navi_bar);
4217 if (!m_dummy_loading_progressbar) {
4218 BROWSER_LOGE("elm_progressbar_add failed!");
4222 elm_object_style_set(m_dummy_loading_progressbar, "browser/loading_wheel");
4223 elm_progressbar_pulse(m_dummy_loading_progressbar, EINA_TRUE);
4224 evas_object_size_hint_weight_set(m_dummy_loading_progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4225 evas_object_size_hint_align_set(m_dummy_loading_progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
4226 elm_object_part_content_set(m_main_layout, "elm.swallow.waiting_progress", m_dummy_loading_progressbar);
4227 evas_object_show(m_dummy_loading_progressbar);
4229 /* create conformant */
4230 elm_win_conformant_set(m_win, EINA_TRUE);
4231 m_conformant = elm_conformant_add(m_main_layout);
4232 if (!m_conformant) {
4233 BROWSER_LOGE("elm_conformant_add failed!");
4237 elm_object_style_set(m_conformant, "internal_layout");
4238 evas_object_size_hint_weight_set(m_conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4239 evas_object_size_hint_align_set(m_conformant, EVAS_HINT_FILL, EVAS_HINT_FILL);
4240 elm_object_content_set(m_conformant, m_scroller);
4241 elm_object_part_content_set(m_main_layout, "elm.swallow.content", m_conformant);
4242 evas_object_show(m_conformant);
4244 m_url_layout = _create_url_layout();
4245 if (!m_url_layout) {
4246 BROWSER_LOGE("_create_url_layout failed!");
4249 elm_box_pack_start(m_content_box, m_url_layout);
4251 m_control_bar = _create_control_bar();
4252 if (!m_control_bar) {
4253 BROWSER_LOGE("_create_control_bar failed!");
4256 elm_object_part_content_set(m_main_layout, "elm.swallow.control_bar", m_control_bar);
4258 m_option_header_url_layout = _create_option_header_url_layout();
4259 if (!m_option_header_url_layout) {
4260 BROWSER_LOGE("_create_option_header_url_layout failed!");
4264 m_option_header_layout = elm_layout_add(m_navi_bar);
4265 if (!m_option_header_layout) {
4266 BROWSER_LOGE("elm_layout_add failed!");
4269 if (!elm_layout_file_set(m_option_header_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
4270 "browser-view/option_header")) {
4271 BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
4274 evas_object_size_hint_weight_set(m_option_header_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4275 evas_object_size_hint_align_set(m_option_header_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
4277 elm_object_part_content_set(m_option_header_layout, "elm.swallow.url_layout", m_option_header_url_layout);
4278 evas_object_show(m_option_header_layout);
4280 m_option_header_find_word_layout = _create_find_word_layout();
4281 if (!m_option_header_find_word_layout) {
4282 BROWSER_LOGE("_create_find_word_layout failed");
4285 elm_object_part_content_set(m_option_header_layout, "elm.swallow.find_word_layout", m_option_header_find_word_layout);
4287 elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER, m_option_header_layout);
4288 _navigationbar_visible_set_signal(EINA_FALSE);
4291 if (!_create_zoom_buttons()) {
4292 BROWSER_LOGE("_create_zoom_buttons failed");
4297 edje_object_signal_callback_add(elm_layout_edje_get(m_main_layout),
4298 "mouse,clicked,1", "elm.rect.content_dim", __dim_area_clicked_cb, this);
4300 edje_object_signal_callback_add(elm_layout_edje_get(m_main_layout),
4301 "mouse,down,1", "elm.rect.more_context_bg", __context_menu_bg_mouse_down_cb, this);
4303 const char *current_theme = elm_theme_get(NULL);
4304 if (current_theme && strstr(current_theme, "white")) {
4306 // edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "black_theme,signal", "");
4307 // edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
4308 // "black_theme,signal", "");