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 scale_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)
1323 ewk_view_scale_range_get(browser_view->m_focused_window->m_ewk_view,
1324 &min_scale, &max_scale);
1325 if (scale_factor > min_scale && scale_factor < max_scale) {
1326 if (browser_view->m_zoom_button_timer)
1327 ecore_timer_del(browser_view->m_zoom_button_timer);
1328 browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
1329 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "show,zoom_buttons,signal", "");
1334 void Browser_View::__ewk_view_enter_full_screen_cb(void *data, Evas_Object *obj, void *event_info)
1339 Browser_View *browser_view = (Browser_View *)data;
1340 browser_view->set_full_sreen(EINA_TRUE);
1343 void Browser_View::__ewk_view_exit_full_screen_cb(void *data, Evas_Object *obj, void *event_info)
1348 Browser_View *browser_view = (Browser_View *)data;
1349 browser_view->set_full_sreen(EINA_FALSE);
1352 void Browser_View::__ewk_view_vibration_vibrate_cb(void *data, Evas_Object *obj, void *event_info)
1354 Browser_View *browser_view = (Browser_View*)data;
1355 const long vibration_time = *((const long *)event_info);
1357 BROWSER_LOGD("__ewk_view_vibration_vibrate_cb : play time is [%ld]", vibration_time);
1359 browser_view->_haptic_device_play(vibration_time);
1362 void Browser_View::__ewk_view_vibration_cancel_cb(void *data, Evas_Object *obj, void *event_info)
1364 BROWSER_LOGD("[%s]", __func__);
1366 Browser_View *browser_view = (Browser_View*)data;
1368 browser_view->_haptic_device_stop();
1371 void Browser_View::__ewk_view_mouse_up_cb(void* data, Evas* evas, Evas_Object* obj, void* ev)
1376 Browser_View *browser_view = (Browser_View *)data;
1378 browser_view->m_is_scrolling = EINA_FALSE;
1381 void Browser_View::__ewk_view_edge_top_cb(void *data, Evas_Object *obj, void *event_info)
1383 #ifdef BROWSER_SCROLLER_BOUNCING
1384 BROWSER_LOGD("[%s]", __func__);
1388 Browser_View *browser_view = (Browser_View *)data;
1389 browser_view->_enable_browser_scroller_scroll();
1391 /* If user do flicking the mouse with scroll up, bring in the browser scroller to y=0. */
1392 if (!browser_view->m_is_scrolling) {
1393 BROWSER_LOGD("<< elm_scroller_region_bring_in >>");
1394 int browser_scroller_x = 0;
1395 int browser_scroller_w = 0;
1396 int browser_scroller_h = 0;
1397 elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, NULL,
1398 &browser_scroller_w, &browser_scroller_h);
1400 elm_scroller_region_bring_in(browser_view->m_scroller, browser_scroller_x, 0,
1401 browser_scroller_w, browser_scroller_h);
1406 void Browser_View::__ewk_view_scroll_down_cb(void *data, Evas_Object *obj, void *event_info)
1408 #ifdef BROWSER_SCROLLER_BOUNCING
1411 Browser_View *browser_view = (Browser_View *)data;
1417 int url_layout_h = 0;
1418 elm_scroller_region_get(browser_view->m_scroller, &scroller_x, &scroller_y, &scroller_w, &scroller_h);
1419 evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
1421 if (scroller_y < url_layout_h) {
1422 /* We have to hide urlbar when webview's contents are scrolled down by flicking. */
1423 if (!browser_view->m_is_scrolling)
1424 elm_scroller_region_show(browser_view->m_scroller, scroller_x, url_layout_h, scroller_w, scroller_h);
1426 browser_view->_enable_browser_scroller_scroll();
1428 browser_view->_enable_webview_scroll();
1433 void Browser_View::__ewk_view_scroll_up_cb(void *data, Evas_Object *obj, void *event_info)
1435 #ifdef BROWSER_SCROLLER_BOUNCING
1439 Browser_View *browser_view = (Browser_View *)data;
1440 browser_view->_enable_webview_scroll();
1444 void Browser_View::_set_navigationbar_title(const char *title)
1446 BROWSER_LOGD("title=[%s]", title);
1447 edje_object_part_text_set(elm_layout_edje_get(m_url_layout),
1448 "title_text", title);
1449 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_layout),
1450 "title_text", title);
1454 void Browser_View::_set_url_entry(const char *url, Eina_Bool set_secrue_icon)
1456 BROWSER_LOGD("url=[%s]", url);
1457 if (url && strlen(url)) {
1458 std::string url_without_http_scheme;
1459 if (strstr(url, BROWSER_HTTP_SCHEME) && strlen(url) > strlen(BROWSER_HTTP_SCHEME))
1460 url_without_http_scheme = std::string(url + strlen(BROWSER_HTTP_SCHEME));
1462 url_without_http_scheme = std::string(url);
1464 char *mark_up_url = elm_entry_utf8_to_markup(url_without_http_scheme.c_str());
1466 Evas_Object *entry = br_elm_editfield_entry_get(m_url_edit_field);
1467 elm_entry_entry_set(entry, mark_up_url);
1468 entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
1469 elm_entry_entry_set(entry, mark_up_url);
1471 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_edit_field),
1472 "elm.text.ellipsis", mark_up_url);
1473 edje_object_part_text_set(elm_layout_edje_get(m_url_edit_field),
1474 "elm.text.ellipsis", mark_up_url);
1478 Evas_Object *entry = br_elm_editfield_entry_get(m_url_edit_field);
1479 #if defined(FEATURE_MOST_VISITED_SITES)
1480 elm_entry_entry_set(entry, BROWSER_MOST_VISITED_SITES_URL);
1482 elm_entry_entry_set(entry, BROWSER_BLANK_PAGE_URL);
1484 entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
1485 #if defined(FEATURE_MOST_VISITED_SITES)
1486 elm_entry_entry_set(entry, BROWSER_MOST_VISITED_SITES_URL);
1488 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_edit_field),
1489 "elm.text.ellipsis", BROWSER_MOST_VISITED_SITES_URL);
1490 edje_object_part_text_set(elm_layout_edje_get(m_url_edit_field),
1491 "elm.text.ellipsis", BROWSER_MOST_VISITED_SITES_URL);
1493 elm_entry_entry_set(entry, BROWSER_BLANK_PAGE_URL);
1495 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_edit_field),
1496 "elm.text.ellipsis", BROWSER_BLANK_PAGE_URL);
1497 edje_object_part_text_set(elm_layout_edje_get(m_url_edit_field),
1498 "elm.text.ellipsis", BROWSER_BLANK_PAGE_URL);
1502 if (set_secrue_icon)
1506 void Browser_View::_stop_loading(void)
1508 BROWSER_LOGD("[%s]", __func__);
1509 if (m_focused_window->m_ewk_view)
1510 ewk_view_stop(m_focused_window->m_ewk_view);
1513 void Browser_View::_reload(void)
1515 BROWSER_LOGD("[%s]", __func__);
1516 if (m_focused_window->m_ewk_view)
1517 ewk_view_reload_bypass_cache(m_focused_window->m_ewk_view);
1520 void Browser_View::set_focused_window(Browser_Window *window
1521 #if defined(FEATURE_MOST_VISITED_SITES)
1522 ,Eina_Bool show_most_visited_sites
1526 BROWSER_LOGD("[%s]", __func__);
1527 if (m_focused_window && m_focused_window->m_ewk_view_layout) {
1528 elm_box_unpack(m_content_box, m_focused_window->m_ewk_view_layout);
1529 evas_object_hide(m_focused_window->m_ewk_view_layout);
1532 if (m_focused_window && m_focused_window->m_favicon) {
1533 if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
1534 elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
1536 evas_object_hide(m_focused_window->m_favicon);
1538 if (m_focused_window && m_focused_window->m_option_header_favicon) {
1539 if (elm_object_part_content_get(m_option_header_url_entry_layout, "elm.swallow.favicon"))
1540 elm_object_part_content_unset(m_option_header_url_entry_layout, "elm.swallow.favicon");
1542 evas_object_hide(m_focused_window->m_option_header_favicon);
1545 m_focused_window = window;
1547 if (!m_focused_window->m_ewk_view_layout) {
1548 m_focused_window->m_ewk_view_layout = elm_layout_add(m_navi_bar);
1549 if (!m_focused_window->m_ewk_view_layout) {
1550 BROWSER_LOGE("elm_layout_add failed!");
1553 if (!elm_layout_file_set(m_focused_window->m_ewk_view_layout,
1554 BROWSER_EDJE_DIR"/browser-view-main.edj",
1555 "browser/browser-view-webview")) {
1556 BROWSER_LOGE("elm_layout_file_set failed", BROWSER_EDJE_DIR);
1559 evas_object_size_hint_weight_set(m_focused_window->m_ewk_view_layout,
1560 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1561 evas_object_size_hint_align_set(m_focused_window->m_ewk_view_layout,
1562 EVAS_HINT_FILL, EVAS_HINT_FILL);
1563 elm_box_pack_end(m_content_box, m_focused_window->m_ewk_view_layout);
1564 evas_object_show(m_focused_window->m_ewk_view_layout);
1566 elm_object_part_content_set(m_focused_window->m_ewk_view_layout, "elm.swallow.webview",
1567 m_focused_window->m_ewk_view);
1568 evas_object_show(m_focused_window->m_ewk_view);
1572 * If launch the browser by aul, the grey bg is displayed shortly. */
1573 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1574 "hide,grey_background,signal", "");
1576 * The webview layout is not resized whenever repack to content box.
1577 * So resize the webview layout whenever repack. */
1578 m_resize_idler = ecore_idler_add(__webview_layout_resize_idler_cb, this);
1580 elm_box_pack_end(m_content_box, m_focused_window->m_ewk_view_layout);
1581 evas_object_show(m_focused_window->m_ewk_view_layout);
1582 evas_object_show(m_focused_window->m_ewk_view);
1585 if (!_is_loading()) {
1586 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,off,signal", "");
1587 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1588 "loading,off,signal", "");
1589 elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
1590 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
1593 /* show or hide favicon in url layout. */
1594 if (m_focused_window->m_favicon
1595 #if defined(FEATURE_MOST_VISITED_SITES)
1596 && !is_most_visited_sites_running()
1599 if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
1600 elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
1602 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.favicon",
1603 m_focused_window->m_favicon);
1604 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1605 "show,favicon,signal", "");
1606 evas_object_show(m_focused_window->m_favicon);
1609 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1610 "hide,favicon,signal", "");
1613 /* show or hide favicon in option header url layout. */
1614 if (m_focused_window->m_option_header_favicon
1615 #if defined(FEATURE_MOST_VISITED_SITES)
1616 && !is_most_visited_sites_running()
1619 if (elm_object_part_content_get(m_option_header_url_entry_layout, "elm.swallow.favicon"))
1620 elm_object_part_content_unset(m_option_header_url_entry_layout, "elm.swallow.favicon");
1622 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.favicon",
1623 m_focused_window->m_option_header_favicon);
1624 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1625 "show,favicon,signal", "");
1627 evas_object_show(m_focused_window->m_option_header_favicon);
1629 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1630 "hide,favicon,signal", "");
1633 #if defined(FEATURE_MOST_VISITED_SITES)
1634 if (show_most_visited_sites) {
1635 if (get_url().empty())
1636 _show_most_visited_sites(EINA_TRUE);
1638 _show_most_visited_sites(EINA_FALSE);
1642 std::vector<Browser_Window *> window_list = m_browser->get_window_list();
1643 _set_multi_window_controlbar_text(window_list.size());
1645 if (!_set_favicon())
1646 BROWSER_LOGE("_set_favicon failed");
1648 _update_back_forward_buttons();
1650 /* Without this code, the url is empty shortly when create deleted-window in multi window. */
1651 if (get_url().empty() && !m_focused_window->m_url.empty())
1652 _set_url_entry(m_focused_window->m_url.c_str());
1654 _set_url_entry(get_url().c_str());
1656 if (window_list.size() >= BROWSER_MULTI_WINDOW_MAX_COUNT)
1657 elm_object_item_disabled_set(m_new_window_button, EINA_TRUE);
1659 elm_object_item_disabled_set(m_new_window_button, EINA_FALSE);
1662 #if defined(FEATURE_MOST_VISITED_SITES)
1663 Eina_Bool Browser_View::_show_most_visited_sites(Eina_Bool is_show)
1665 BROWSER_LOGD("[%s]is_show=%d", __func__, is_show);
1667 m_selected_most_visited_sites_item_info.url.clear();
1668 m_selected_most_visited_sites_item_info.title.clear();
1669 m_selected_most_visited_sites_item_info.id.clear();
1671 if (!m_most_visited_sites) {
1672 m_most_visited_sites = new(nothrow) Most_Visited_Sites(m_navi_bar, this, m_most_visited_sites_db);
1673 if (!m_most_visited_sites) {
1674 BROWSER_LOGE("new Most_Visited_Sites failed");
1678 Evas_Object *most_visited_sites_layout = m_most_visited_sites->create_most_visited_sites_main_layout();
1679 if (!most_visited_sites_layout) {
1680 BROWSER_LOGE("create_most_visited_sites_main_layout failed");
1681 if (m_most_visited_sites) {
1682 delete m_most_visited_sites;
1683 m_most_visited_sites = NULL;
1687 elm_object_part_content_set(m_main_layout, "elm.swallow.most_visited_sites", most_visited_sites_layout);
1688 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1689 "show,most_visited_sites,signal", "");
1690 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1691 "show,control_bar,no_animation,signal", "");
1693 /* change the url layout for normal mode. (change the reload icon etc) */
1694 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,off,signal", "");
1695 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1696 "loading,off,signal", "");
1698 edje_object_part_text_set(elm_layout_edje_get(m_url_entry_layout),
1699 "url_guide_text", BR_STRING_URL_GUIDE_TEXT);
1700 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_entry_layout),
1701 "url_guide_text", BR_STRING_URL_GUIDE_TEXT);
1703 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,on,signal", "");
1704 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1705 "url_guide_text,on,signal", "");
1707 _set_navigationbar_title(BR_STRING_MOST_VISITED_SITES);
1708 _set_url_entry(BROWSER_MOST_VISITED_SITES_URL);
1710 /* If the speed dial is displayed for the first time, destroy the progress wheel. */
1711 if (m_dummy_loading_progressbar) {
1712 elm_object_part_content_unset(m_main_layout, "elm.swallow.waiting_progress");
1713 evas_object_del(m_dummy_loading_progressbar);
1714 m_dummy_loading_progressbar = NULL;
1715 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1716 "hide,waiting_progressbar,signal", "");
1719 elm_object_item_disabled_set(m_add_bookmark_button, EINA_TRUE);
1725 elm_scroller_region_get(m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
1726 elm_scroller_region_show(m_scroller ,scroller_x, 0, scroller_w, scroller_h);
1728 _navigationbar_visible_set_signal(EINA_TRUE);
1730 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1731 "hide,favicon,signal", "");
1732 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1733 "hide,favicon,signal", "");
1735 #ifdef BROWSER_SCROLLER_BOUNCING
1736 BROWSER_LOGD("<< lock browser scroller >>");
1737 elm_object_scroll_freeze_pop(m_scroller);
1738 elm_object_scroll_freeze_push(m_scroller);
1741 if (m_most_visited_sites) {
1742 if (elm_object_part_content_get(m_main_layout, "elm.swallow.most_visited_sites"))
1743 elm_object_part_content_unset(m_main_layout, "elm.swallow.most_visited_sites");
1744 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1745 "hide,most_visited_sites,signal", "");
1746 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1747 "hide,most_visited_sites_guide_text,signal", "");
1749 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,off,signal", "");
1750 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1751 "url_guide_text,off,signal", "");
1753 delete m_most_visited_sites;
1754 m_most_visited_sites = NULL;
1756 elm_object_item_disabled_set(m_add_bookmark_button, EINA_FALSE);
1763 void Browser_View::load_url(const char *url)
1765 BROWSER_LOGD("[%s]", __func__);
1766 #if defined(FEATURE_MOST_VISITED_SITES)
1767 if (!url || !strlen(url)) {
1768 if (!_show_most_visited_sites(EINA_TRUE))
1769 BROWSER_LOGE("_show_most_visited_sites EINA_TRUE failed");
1773 if (!_show_most_visited_sites(EINA_FALSE))
1774 BROWSER_LOGE("_show_most_visited_sites EINA_FALSE failed");
1778 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(_get_activated_url_entry());
1779 evas_object_smart_callback_del(edit_field_entry, "changed", __url_entry_changed_cb);
1781 std::string full_url;
1782 if (_has_url_sheme(url))
1785 full_url = std::string(BROWSER_HTTP_SCHEME) + std::string(url);
1787 BROWSER_LOGD("full_url = [%s]", full_url.c_str());
1789 _set_url_entry(full_url.c_str());
1791 ewk_view_uri_set(m_focused_window->m_ewk_view, full_url.c_str());
1794 string Browser_View::get_title(Browser_Window *window)
1796 const char *title = ewk_view_title_get(window->m_ewk_view);
1797 BROWSER_LOGD("title = [%s]", title);
1799 if (!window->m_ewk_view && !window->m_title.empty())
1800 return window->m_title;
1802 if (!window->m_ewk_view)
1803 return std::string();
1806 if (!window->m_title.empty())
1807 return window->m_title;
1809 return std::string();
1812 return std::string(title);
1815 string Browser_View::get_title(void)
1817 const char *title = ewk_view_title_get(m_focused_window->m_ewk_view);
1818 BROWSER_LOGD("title = [%s]", title);
1820 if (!title && m_focused_window->m_title.empty())
1821 return std::string();
1822 else if (!title && !m_focused_window->m_title.empty())
1823 return m_focused_window->m_title;
1825 if (title && strlen(title))
1826 return std::string(title);
1828 return std::string();
1831 string Browser_View::get_url(Browser_Window *window)
1833 BROWSER_LOGD("[%s]", __func__);
1835 if (!window->m_ewk_view && !window->m_url.empty())
1836 return window->m_url;
1838 if (!window->m_ewk_view)
1839 return std::string();
1841 const char *uri = ewk_view_uri_get(window->m_ewk_view);
1842 BROWSER_LOGD("uri = [%s]", uri);
1844 if (!uri || strlen(uri) == 0)
1845 return std::string();
1847 return std::string(uri);
1850 string Browser_View::get_url(void)
1852 const char *uri = ewk_view_uri_get(m_focused_window->m_ewk_view);
1853 BROWSER_LOGD("uri = [%s]", uri);
1855 if (!uri || strlen(uri) == 0)
1856 return std::string();
1858 return std::string(uri);
1861 /* If multi window is running, unset the navigation title object,
1862 * else set the navigation title object to show title object arrow. */
1863 void Browser_View::unset_navigationbar_title_object(Eina_Bool is_unset)
1865 BROWSER_LOGD("[%s] is_unset =%d", __func__, is_unset);
1866 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
1868 _navigationbar_visible_set_signal(EINA_FALSE);
1869 elm_object_item_part_content_unset(top_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER);
1870 evas_object_hide(m_option_header_layout);
1872 Evas_Object *title_object = NULL;
1873 title_object = elm_object_item_part_content_get(top_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER);
1874 if (!title_object) {
1875 elm_object_item_part_content_set(top_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER,
1876 m_option_header_layout);
1877 evas_object_show(m_option_header_layout);
1879 #if defined(FEATURE_MOST_VISITED_SITES)
1880 if (!is_most_visited_sites_running())
1881 _navigationbar_visible_set_signal(EINA_FALSE);
1886 void Browser_View::__go_to_bookmark_cb(void *data, Evas_Object *obj, void *event_info)
1888 BROWSER_LOGD("[%s]", __func__);
1892 Browser_View *browser_view = (Browser_View *)data;
1894 if (!m_data_manager->create_bookmark_view()) {
1895 BROWSER_LOGE("m_data_manager->create_bookmark_view failed");
1899 if (!m_data_manager->get_bookmark_view()->init()) {
1900 BROWSER_LOGE("m_data_manager->get_bookmark_view()->init failed");
1901 m_data_manager->destroy_bookmark_view();
1904 browser_view->_destroy_more_context_popup();
1907 void Browser_View::__backward_cb(void *data, Evas_Object *obj, void *event_info)
1909 BROWSER_LOGD("[%s]", __func__);
1913 Browser_View *browser_view = (Browser_View *)data;
1914 __title_back_button_clicked_cb(data, NULL, NULL);
1916 browser_view->_destroy_more_context_popup();
1919 void Browser_View::__forward_cb(void *data, Evas_Object *obj, void *event_info)
1921 BROWSER_LOGD("[%s]", __func__);
1925 Browser_View *browser_view = (Browser_View *)data;
1926 browser_view->_destroy_more_context_popup();
1927 if (browser_view->m_focused_window->m_ewk_view
1928 && ewk_view_forward_possible(browser_view->m_focused_window->m_ewk_view))
1929 ewk_view_forward(browser_view->m_focused_window->m_ewk_view);
1933 void Browser_View::__web_app_capable_get_cb(Eina_Bool capable, void* user_data)
1935 BROWSER_LOGD("[%s]", __func__);
1940 Browser_View *browser_view = (Browser_View *)user_data;
1941 Evas_Object *webkit = browser_view->m_focused_window->m_ewk_view;
1943 ewk_view_web_application_icon_url_get(webkit, __web_app_icon_url_get_cb, browser_view);
1947 void Browser_View::__web_app_icon_url_get_cb(const char* icon_url, void* user_data)
1949 BROWSER_LOGD("icon_url:%s", icon_url);
1954 Browser_View *browser_view = (Browser_View *)user_data;
1956 /* make configure file */
1957 browser_view->m_meta_tag->create_config_xml((browser_view->get_url()).c_str(), browser_view->get_title().c_str(), NULL);
1958 if (!icon_url || strlen(icon_url) == 0) {
1959 BROWSER_LOGD("Failed to get webapp icon url, make widget with default icon");
1960 browser_view->m_meta_tag->wgt_install(NULL);
1962 BROWSER_LOGD("Succeed to get webapp icon url, make widget after icon downloaded");
1964 browser_view->m_meta_tag->request_download_icon(icon_url);
1969 void Browser_View::__url_editfield_share_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1971 BROWSER_LOGD("[%s]", __func__);
1975 Browser_View *browser_view = (Browser_View *)data;
1976 const char *selected_text = elm_entry_selection_get(br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field));
1978 if (browser_view->_show_share_popup(selected_text))
1979 BROWSER_LOGE("_show_share_popup failed");
1982 Eina_Bool Browser_View::__show_scissorbox_view_idler_cb(void *data)
1985 return ECORE_CALLBACK_CANCEL;
1987 Browser_View *browser_view = (Browser_View *)data;
1989 if (browser_view->m_scissorbox_view)
1990 delete browser_view->m_scissorbox_view;
1992 browser_view->m_scissorbox_view = new(nothrow) Browser_Scissorbox_View(browser_view);
1993 if (!browser_view->m_scissorbox_view) {
1994 BROWSER_LOGE("new Browser_Scissorbox_View failed");
1995 return ECORE_CALLBACK_CANCEL;
1997 if (!browser_view->m_scissorbox_view->init()) {
1998 BROWSER_LOGE("m_scissorbox_view->init failed");
1999 delete browser_view->m_scissorbox_view;
2000 browser_view->m_scissorbox_view = NULL;
2001 return ECORE_CALLBACK_CANCEL;
2004 elm_object_part_content_set(browser_view->m_main_layout, "elm.swallow.scissorbox",
2005 browser_view->m_scissorbox_view->get_layout());
2006 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout),
2007 "show,scissorbox,signal", "");
2009 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_layout),
2010 "show,scissorbox,signal", "");
2011 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_layout),
2012 "show,scissorbox,signal", "");
2015 elm_object_part_content_unset(browser_view->m_main_layout, "elm.swallow.control_bar");
2016 evas_object_hide(browser_view->m_control_bar);
2018 return ECORE_CALLBACK_CANCEL;
2021 Eina_Bool Browser_View::_show_scissorbox_view(void)
2023 BROWSER_LOGD("[%s]", __func__);
2025 // _hide_scroller_url_layout();
2027 ecore_idler_add(__show_scissorbox_view_idler_cb, this);
2032 void Browser_View::_destroy_scissorbox_view(void)
2034 elm_object_part_content_unset(m_main_layout, "elm.swallow.scissorbox");
2035 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "hide,scissorbox,signal", "");
2037 edje_object_signal_emit(elm_layout_edje_get(m_url_layout),
2038 "hide,scissorbox,signal", "");
2039 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2040 "hide,scissorbox,signal", "");
2042 elm_object_part_content_unset(m_main_layout, "elm.swallow.control_bar");
2044 if (m_scissorbox_view) {
2045 delete m_scissorbox_view;
2046 m_scissorbox_view = NULL;
2049 elm_object_part_content_set(m_main_layout, "elm.swallow.control_bar", m_control_bar);
2050 evas_object_show(m_control_bar);
2053 void Browser_View::__share_cb(void *data, Evas_Object *obj, void *event_info)
2055 BROWSER_LOGD("[%s]", __func__);
2059 Browser_View *browser_view = (Browser_View *)data;
2060 browser_view->_destroy_more_context_popup();
2061 browser_view->_show_share_popup(browser_view->get_url().c_str());
2065 void Browser_View::__private_cb(void *data, Evas_Object *obj, void *event_info)
2067 BROWSER_LOGD("[%s]", __func__);
2071 Browser_View *browser_view = (Browser_View *)data;
2072 browser_view->m_is_private = !browser_view->m_is_private;
2074 browser_view->m_is_private_item_pressed = EINA_TRUE;
2076 elm_check_state_set(browser_view->m_private_check, browser_view->m_is_private);
2078 if (browser_view->m_is_private) {
2079 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,on,signal", "");
2080 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,on,signal", "");
2082 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,off,signal", "");
2083 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,off,signal", "");
2086 Ewk_Setting *setting = ewk_view_setting_get(browser_view->m_focused_window->m_ewk_view);
2087 ewk_setting_private_browsing_set(setting, browser_view->m_is_private);
2090 void Browser_View::__bookmark_cb(void *data, Evas_Object *obj, void *event_info)
2092 BROWSER_LOGD("[%s]", __func__);
2096 Browser_View *browser_view = (Browser_View *)data;
2097 int bookmark_id = -1;
2098 if(!m_data_manager->get_history_db()->is_in_bookmark(browser_view->get_url().c_str(), &bookmark_id)) {
2099 if (!elm_icon_file_set(browser_view->m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_on.png", NULL)) {
2100 BROWSER_LOGE("elm_icon_file_set is failed.\n");
2103 m_data_manager->create_bookmark_db()->save_bookmark(BROWSER_BOOKMARK_MAIN_FOLDER_ID,
2104 browser_view->get_title().c_str(), browser_view->get_url().c_str());
2105 browser_view->show_notify_popup(BR_STRING_ADDED_TO_BOOKMARKS, 3, EINA_TRUE);
2107 if (!elm_icon_file_set(browser_view->m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_off.png", NULL)) {
2108 BROWSER_LOGE("elm_icon_file_set is failed.\n");
2111 m_data_manager->create_bookmark_db()->delete_bookmark(bookmark_id);
2112 browser_view->show_notify_popup(BR_STRING_REMOVED_TO_BOOKMARKS, 3, EINA_TRUE);
2115 m_data_manager->destroy_bookmark_db();
2118 void Browser_View::__bookmark_icon_changed_cb(void *data, Evas_Object *obj, void *event_info)
2120 BROWSER_LOGD("[%s]", __func__);
2124 Browser_View *browser_view = (Browser_View *)data;
2127 void Browser_View::__private_check_change_cb(void *data, Evas_Object *obj, void *event_info)
2129 BROWSER_LOGD("[%s]", __func__);
2133 Browser_View *browser_view = (Browser_View *)data;
2134 Eina_Bool state = elm_check_state_get((Evas_Object*)obj);
2135 browser_view->m_is_private = state;
2137 if (browser_view->m_is_private_item_pressed) {
2138 browser_view->m_is_private = !browser_view->m_is_private;
2139 elm_check_state_set(browser_view->m_private_check, browser_view->m_is_private);
2140 browser_view->m_is_private_item_pressed = EINA_FALSE;
2143 if (browser_view->m_is_private) {
2144 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,on,signal", "");
2145 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,on,signal", "");
2147 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,off,signal", "");
2148 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,off,signal", "");
2151 Ewk_Setting *setting = ewk_view_setting_get(browser_view->m_focused_window->m_ewk_view);
2152 ewk_setting_private_browsing_set(setting, browser_view->m_is_private);
2155 void Browser_View::__expand_option_header_cb(void *data, Evas_Object *obj, void *event_info)
2157 BROWSER_LOGD("[%s]", __func__);
2161 Browser_View *browser_view = (Browser_View *)data;
2163 browser_view->_navigationbar_title_clicked();
2166 void Browser_View::__add_bookmark_cb(void *data, Evas_Object *obj, void *event_info)
2168 BROWSER_LOGD("[%s]", __func__);
2172 Browser_View *browser_view = (Browser_View *)data;
2173 if (!m_data_manager->create_add_to_bookmark_view(browser_view->get_title(), browser_view->get_url())) {
2174 BROWSER_LOGE("m_data_manager->create_add_to_bookmark_view failed");
2178 if (!m_data_manager->get_add_to_bookmark_view()->init())
2179 m_data_manager->destroy_add_to_bookmark_view();
2182 #if defined(HORIZONTAL_UI)
2183 void Browser_View::_rotate_multi_window(void)
2185 BROWSER_LOGD("[%s]", __func__);
2187 if (!m_data_manager->create_multi_window_view()) {
2188 BROWSER_LOGE("m_data_manager->create_multi_window_view failed");
2192 if (!m_data_manager->get_multi_window_view()->init(0.0, m_is_multi_window_grid_mode)) {
2193 m_data_manager->destroy_multi_window_view();
2194 BROWSER_LOGE("get_multi_window_view()->init failed");
2198 ewk_view_suspend(m_focused_window->m_ewk_view);
2200 _navigationbar_visible_set_signal(EINA_FALSE);
2202 /* Hide the secure lock icon in title bar. */
2203 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
2204 elm_object_item_part_content_set(top_it, ELM_NAVIFRAME_ITEM_ICON, NULL);
2206 if (_get_edit_mode() != BR_NO_EDIT_MODE)
2207 _set_edit_mode(BR_NO_EDIT_MODE);
2209 m_is_multi_window_grid_mode = EINA_FALSE;
2213 void Browser_View::__multi_window_cb(void *data, Evas_Object *obj, void *event_info)
2215 BROWSER_LOGD("[%s]", __func__);
2217 Browser_View *browser_view = (Browser_View *)data;
2218 browser_view->_destroy_more_context_popup();
2220 #if defined(FEATURE_MOST_VISITED_SITES)
2221 if (browser_view->m_most_visited_sites && browser_view->m_most_visited_sites->is_guide_text_running())
2225 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
2226 BROWSER_LOGD("close multi window");
2227 m_data_manager->get_multi_window_view()->close_multi_window();
2231 if (!m_data_manager->create_multi_window_view()) {
2232 BROWSER_LOGE("m_data_manager->create_multi_window_view failed");
2236 if (!m_data_manager->get_multi_window_view()->init()) {
2237 m_data_manager->destroy_multi_window_view();
2238 BROWSER_LOGE("get_multi_window_view()->init failed");
2242 /* Exception case to call ewk_view_suspend directly.
2243 * That's because the webpage is cleared, when call ewk_view_visibility_set suspend_ewk_view */
2244 ewk_view_suspend(browser_view->m_focused_window->m_ewk_view);
2245 ewk_view_visibility_set(browser_view->m_focused_window->m_ewk_view, EINA_FALSE);
2247 browser_view->_navigationbar_visible_set_signal(EINA_FALSE);
2249 /* Hide the secure lock icon in title bar. */
2250 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
2251 elm_object_item_part_content_set(top_it, ELM_NAVIFRAME_ITEM_ICON, NULL);
2253 if (browser_view->_get_edit_mode() != BR_NO_EDIT_MODE)
2254 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2257 void Browser_View::__new_window_cb(void *data, Evas_Object *obj, void *event_info)
2259 BROWSER_LOGD("[%s]", __func__);
2263 Browser_View *browser_view = (Browser_View *)data;
2264 Browser_Class *browser = browser_view->m_browser;
2266 if (browser_view->m_resize_idler)
2269 std::vector<Browser_Window *> window_list = browser->get_window_list();
2270 if (window_list.size() >= BROWSER_MULTI_WINDOW_MAX_COUNT) {
2271 /* If the multi window is max, delete the first one. */
2272 /* if the first window is focused, delete second one(oldest one except first one) */
2273 if (browser_view->m_focused_window != window_list[0])
2274 browser->delete_window(window_list[0]);
2276 browser->delete_window(window_list[1]);
2279 browser_view->m_created_new_window = browser->create_new_window(EINA_TRUE);
2280 if (!browser_view->m_created_new_window) {
2281 BROWSER_LOGE("create_new_window failed");
2284 /* initialize the created webview first to connect ewk event callback functions such as load start, progress etc. */
2285 ewk_view_suspend(browser_view->m_focused_window->m_ewk_view);
2287 #if defined(HORIZONTAL_UI)
2288 if (browser_view->m_focused_window->m_landscape_snapshot_image) {
2289 evas_object_del(browser_view->m_focused_window->m_landscape_snapshot_image);
2290 browser_view->m_focused_window->m_landscape_snapshot_image = NULL;
2293 if (browser_view->m_focused_window->m_portrait_snapshot_image) {
2294 evas_object_del(browser_view->m_focused_window->m_portrait_snapshot_image);
2295 browser_view->m_focused_window->m_portrait_snapshot_image = NULL;
2298 #if defined(HORIZONTAL_UI)
2299 if (browser_view->is_landscape())
2300 browser_view->m_focused_window->m_landscape_snapshot_image = browser_view->_capture_snapshot(browser_view->m_focused_window, BROWSER_MULTI_WINDOW_ITEM_RATIO);
2303 browser_view->m_focused_window->m_portrait_snapshot_image = browser_view->_capture_snapshot(browser_view->m_focused_window, BROWSER_MULTI_WINDOW_ITEM_RATIO);
2305 #if defined(FEATURE_MOST_VISITED_SITES)
2306 if (!browser_view->_show_most_visited_sites(EINA_FALSE))
2307 BROWSER_LOGE("_show_most_visited_sites EINA_FALSE failed");
2310 /* initialize the created webview first to connect ewk event callback functions such as load start, progress etc. */
2311 browser->ewk_view_init(browser_view->m_created_new_window->m_ewk_view);
2313 if (!browser_view->_show_new_window_effect(browser_view->m_focused_window->m_ewk_view,
2314 browser_view->m_created_new_window->m_ewk_view))
2315 BROWSER_LOGE("_show_new_window_effect failed");
2317 #if defined(FEATURE_MOST_VISITED_SITES)
2318 browser_view->load_url(BROWSER_MOST_VISITED_SITES_URL);
2320 browser_view->load_url(BROWSER_BLANK_PAGE_URL);
2325 Eina_Bool Browser_View::_call_internet_settings(void)
2327 BROWSER_LOGD("[%s]", __func__);
2329 m_browser_settings = new(nothrow) Browser_Settings_Class;
2330 if (!m_browser_settings) {
2331 BROWSER_LOGE("new Browser_Settings_Class failed");
2334 if (!m_browser_settings->init()) {
2335 BROWSER_LOGE("m_browser_settings->init failed");
2336 delete m_browser_settings;
2337 m_browser_settings = NULL;
2344 void Browser_View::__internet_settings_cb(void *data, Evas_Object *obj, void *event_info)
2346 BROWSER_LOGD("[%s]", __func__);
2350 Browser_View *browser_view = (Browser_View *)data;
2351 browser_view->_destroy_more_context_popup();
2353 if (!browser_view->_call_internet_settings())
2354 BROWSER_LOGE("_call_internet_settings failed");
2357 void Browser_View::_update_find_word_index_text(const char *index_text, int index, int max_match_cnt)
2359 BROWSER_LOGD("[%s]", __func__);
2361 edje_object_part_text_set(elm_layout_edje_get(m_option_header_find_word_layout), "elm.index_text", index_text);
2363 if (max_match_cnt == 0 || max_match_cnt == 1) {
2364 elm_object_disabled_set(m_find_word_prev_button, EINA_TRUE);
2365 elm_object_disabled_set(m_find_word_next_button, EINA_TRUE);
2366 } else if (index == 0 || index == 1) {
2367 elm_object_disabled_set(m_find_word_prev_button, EINA_TRUE);
2368 elm_object_disabled_set(m_find_word_next_button, EINA_FALSE);
2369 if (index == 0 || (index == 1 && elm_object_focus_get(m_find_word_cancel_button)))
2370 elm_object_focus_set(m_find_word_cancel_button, EINA_TRUE);
2371 } else if (index == max_match_cnt) {
2372 elm_object_disabled_set(m_find_word_prev_button, EINA_FALSE);
2373 elm_object_disabled_set(m_find_word_next_button, EINA_TRUE);
2374 elm_object_focus_set(m_find_word_cancel_button, EINA_TRUE);
2376 if (elm_object_disabled_get(m_find_word_prev_button))
2377 elm_object_disabled_set(m_find_word_prev_button, EINA_FALSE);
2378 if (elm_object_disabled_get(m_find_word_next_button))
2379 elm_object_disabled_set(m_find_word_next_button, EINA_FALSE);
2382 void Browser_View::__find_word_cb(void *data, Evas_Object *obj, void *event_info)
2384 BROWSER_LOGD("[%s]", __func__);
2388 Browser_View *browser_view = (Browser_View *)data;
2389 browser_view->_destroy_more_context_popup();
2391 if (browser_view->_get_edit_mode() == BR_FIND_WORD_MODE)
2394 /* find word layout is only in naviframe optino header.
2395 * So expand the option header to show find word layout. */
2396 browser_view->_navigationbar_visible_set_signal(EINA_TRUE);
2398 browser_view->_set_edit_mode(BR_FIND_WORD_MODE);
2400 elm_object_focus_set(browser_view->m_find_word_edit_field, EINA_TRUE);
2402 edje_object_part_text_set(elm_layout_edje_get(browser_view->m_option_header_find_word_layout), "elm.index_text", "0/0");
2405 Eina_Bool Browser_View::_call_download_manager(void)
2407 service_h service_handle = NULL;
2408 BROWSER_LOGD("[%s]", __func__);
2410 if (service_create(&service_handle) < 0) {
2411 BROWSER_LOGE("Fail to create service handle");
2415 if (!service_handle) {
2416 BROWSER_LOGE("service handle is NULL");
2420 if (service_set_operation(service_handle, SERVICE_OPERATION_DOWNLOAD) < 0) {
2421 BROWSER_LOGE("Fail to set service operation");
2422 service_destroy(service_handle);
2426 if (service_add_extra_data(service_handle, "mode", "view") < 0) {
2427 BROWSER_LOGE("Fail to set extra data");
2428 service_destroy(service_handle);
2432 if (service_send_launch_request(service_handle, NULL, NULL) < 0) {
2433 BROWSER_LOGE("Fail to launch service operation");
2434 service_destroy(service_handle);
2438 service_destroy(service_handle);
2443 void Browser_View::__download_manager_cb(void *data, Evas_Object *obj, void *event_info)
2445 BROWSER_LOGD("[%s]", __func__);
2449 Browser_View *browser_view = (Browser_View *)data;
2450 browser_view->_destroy_more_context_popup();
2452 if (!browser_view->_call_download_manager())
2453 BROWSER_LOGE("_call_download_manager failed");
2456 void Browser_View::__send_via_message_cb(void *data, Evas_Object *obj, void *event_info)
2458 BROWSER_LOGD("[%s]", __func__);
2462 Browser_View *browser_view = (Browser_View *)data;
2463 browser_view->_destroy_more_context_popup();
2465 if (!browser_view->_send_via_message(browser_view->get_url(), std::string()))
2466 BROWSER_LOGE("_send_via_message failed");
2469 void Browser_View::__send_via_email_cb(void *data, Evas_Object *obj, void *event_info)
2471 BROWSER_LOGD("[%s]", __func__);
2475 Browser_View *browser_view = (Browser_View *)data;
2476 browser_view->_destroy_more_context_popup();
2478 if (!browser_view->_send_via_email(browser_view->get_url()))
2479 BROWSER_LOGE("_send_via_email failed");
2482 void Browser_View::__post_to_sns_cb(void *data, Evas_Object *obj, void *event_info)
2484 BROWSER_LOGD("[%s]", __func__);
2488 Browser_View *browser_view = (Browser_View*)data;
2490 Elm_Object_Item *it = (Elm_Object_Item *)event_info;
2491 const char *label = elm_object_item_text_get(it);
2492 BROWSER_LOGD("label=[%s]", label);
2493 if (label && strlen(label)) {
2494 if (!browser_view->_post_to_sns(std::string(label), browser_view->get_url()))
2495 BROWSER_LOGE("_post_to_sns failed");
2498 browser_view->_destroy_more_context_popup();
2501 void Browser_View::_destroy_more_context_popup(void)
2503 if (m_more_context_popup) {
2504 evas_object_del(m_more_context_popup);
2505 m_more_context_popup = NULL;
2508 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "hide,more_context_bg,signal", "");
2511 void Browser_View::__more_context_popup_dismissed_cb(void *data, Evas_Object *obj,
2514 BROWSER_LOGD("[%s]", __func__);
2518 Browser_View *browser_view = (Browser_View *)data;
2519 browser_view->_destroy_more_context_popup();
2522 void Browser_View::__clean_up_windows_test_cb(void *data, Evas_Object *obj, void *event_info)
2527 Browser_View *browser_view = (Browser_View *)data;
2528 browser_view->_destroy_more_context_popup();
2530 m_browser->clean_up_windows();
2533 Eina_Bool Browser_View::_show_more_context_popup(void)
2535 BROWSER_LOGD("[%s]", __func__);
2537 _destroy_more_context_popup();
2539 m_more_context_popup = elm_ctxpopup_add(m_win);
2540 if (!m_more_context_popup) {
2541 BROWSER_LOGE("elm_ctxpopup_add failed");
2545 elm_object_style_set(m_more_context_popup, "pass_event");
2547 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "show,more_context_bg,signal", "");
2549 evas_object_size_hint_weight_set(m_more_context_popup, EVAS_HINT_EXPAND,
2551 evas_object_smart_callback_add(m_more_context_popup, "dismissed",
2552 __more_context_popup_dismissed_cb, this);
2554 Elm_Object_Item *sub_menu = NULL;
2555 elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_DOWNLOAD_MANAGER, NULL,
2556 __download_manager_cb, this);
2558 sub_menu = elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_FIND_ON_PAGE, NULL,
2559 __find_word_cb, this);
2561 #if defined(FEATURE_MOST_VISITED_SITES)
2562 is_most_visited_sites_running() ||
2565 || _get_edit_mode() == BR_FIND_WORD_MODE)
2566 elm_object_item_disabled_set(sub_menu, EINA_TRUE);
2568 sub_menu = elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_SHARE, NULL,
2571 m_bookmark_on_off_icon = elm_icon_add(m_more_context_popup);
2573 if(m_data_manager->get_history_db()->is_in_bookmark(get_url().c_str(), NULL)) {
2574 if (!elm_icon_file_set(m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_on.png", NULL)) {
2575 BROWSER_LOGE("elm_icon_file_set is failed.\n");
2579 if (!elm_icon_file_set(m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_off.png", NULL)) {
2580 BROWSER_LOGE("elm_icon_file_set is failed.\n");
2584 evas_object_size_hint_aspect_set(m_bookmark_on_off_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
2586 evas_object_propagate_events_set(m_bookmark_on_off_icon, EINA_FALSE);
2587 evas_object_repeat_events_set(m_bookmark_on_off_icon, EINA_FALSE);
2588 evas_object_smart_callback_add(m_bookmark_on_off_icon, "clicked", __bookmark_icon_changed_cb, this);
2590 sub_menu = elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_BOOKMARK, m_bookmark_on_off_icon,
2591 __bookmark_cb, this);
2593 #if defined(FEATURE_MOST_VISITED_SITES)
2594 is_most_visited_sites_running() ||
2597 || _get_edit_mode() == BR_FIND_WORD_MODE)
2598 elm_object_item_disabled_set(sub_menu, EINA_TRUE);
2600 m_private_check = elm_check_add(m_more_context_popup);
2601 elm_object_style_set(m_private_check, "on&off");
2602 evas_object_smart_callback_add(m_private_check, "changed", __private_check_change_cb, this);
2604 elm_check_state_set(m_private_check, m_is_private);
2605 evas_object_propagate_events_set(m_private_check, EINA_FALSE);
2606 evas_object_show(m_private_check);
2608 elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_PRIVATE, m_private_check,
2609 __private_cb, this);
2611 elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_SETTINGS, NULL,
2612 __internet_settings_cb, this);
2614 elm_ctxpopup_hover_parent_set(m_more_context_popup, m_navi_bar);
2616 int controlbar_x = 0;
2617 int controlbar_y = 0;
2618 int controlbar_w = 0;
2619 int controlbar_h = 0;
2620 evas_object_geometry_get(m_control_bar, &controlbar_x, &controlbar_y, &controlbar_w, &controlbar_h);
2622 evas_object_move(m_more_context_popup, (controlbar_w / 5) * 3 + controlbar_w / 10, controlbar_y + (controlbar_h / 2));
2624 evas_object_show(m_more_context_popup);
2629 void Browser_View::__more_cb(void *data, Evas_Object *obj, void *event_info)
2631 BROWSER_LOGD("[%s]", __func__);
2635 Browser_View *browser_view = (Browser_View *)data;
2636 if (browser_view->m_more_context_popup == NULL) {
2637 if (!browser_view->_show_more_context_popup())
2638 BROWSER_LOGE("_show_more_context_popup failed");
2640 browser_view->_destroy_more_context_popup();
2643 browser_view->_navigationbar_visible_set(EINA_TRUE);
2646 void Browser_View::_set_controlbar_back_forward_status(void)
2648 BROWSER_LOGD("[%s]", __func__);
2649 Evas_Object *ewk_view = m_focused_window->m_ewk_view;
2654 #if defined(FEATURE_MOST_VISITED_SITES)
2655 is_most_visited_sites_running() ||
2658 elm_object_item_disabled_set(m_share_controlbar_button, EINA_TRUE);
2660 elm_object_item_disabled_set(m_share_controlbar_button, EINA_FALSE);
2663 void Browser_View::_set_multi_window_controlbar_text(int count)
2665 BROWSER_LOGD("[%s]", __func__);
2667 elm_toolbar_item_icon_set(m_multi_window_button, BROWSER_IMAGE_DIR"/01_controlbar_icon_multiview.png");
2669 char icon_path[100] = {0, };
2670 snprintf(icon_path, sizeof(icon_path) - 1, "%s/01_controlbar_icon_multiview_0%d.png", BROWSER_IMAGE_DIR, count);
2671 elm_toolbar_item_icon_set(m_multi_window_button, icon_path);
2675 Evas_Object *Browser_View::_create_control_bar(void)
2677 BROWSER_LOGD("[%s]", __func__);
2678 Evas_Object *controlbar_layout;
2679 controlbar_layout = elm_layout_add(m_navi_bar);
2680 if (!controlbar_layout) {
2681 BROWSER_LOGE("elm_layout_add failed");
2684 if (!elm_layout_file_set(controlbar_layout, BROWSER_EDJE_DIR"/browser-view-control-bar.edj",
2685 "browser-view-controlbar")) {
2686 BROWSER_LOGE("Can not set layout browser-view-controlbar\n");
2689 evas_object_size_hint_weight_set(controlbar_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2690 evas_object_size_hint_align_set(controlbar_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
2691 evas_object_show(controlbar_layout);
2693 Evas_Object *control_bar;
2694 control_bar = elm_toolbar_add(m_navi_bar);
2696 elm_object_style_set(control_bar, "browser/browser-view");
2698 elm_toolbar_shrink_mode_set(control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
2700 /* New Window Button */
2701 m_new_window_button = elm_toolbar_item_append(control_bar,
2702 BROWSER_IMAGE_DIR"/I01_controlbar_icon_new_window.png", NULL, __new_window_cb, this);
2703 if (!m_new_window_button) {
2704 BROWSER_LOGE("elm_toolbar_item_append failed");
2708 /* Multi Window Button */
2709 m_multi_window_button = elm_toolbar_item_append(control_bar,
2710 BROWSER_IMAGE_DIR"/01_controlbar_icon_multiview.png", NULL, __multi_window_cb, this);
2711 /* Bookmark Button */
2712 elm_toolbar_item_append(control_bar, BROWSER_IMAGE_DIR"/I01_controlbar_icon_bookmark.png",
2713 NULL, __go_to_bookmark_cb, this);
2714 /* More menu Button */
2715 m_more_button = elm_toolbar_item_append(control_bar,
2716 BROWSER_IMAGE_DIR"/I01_controlbar_icon_more.png", NULL, __more_cb, this);
2717 if (!m_more_button) {
2718 BROWSER_LOGE("elm_toolbar_item_append failed");
2722 elm_object_part_content_set(controlbar_layout, "elm.swallow.controlbar", control_bar);
2724 m_back_button = elm_button_add(control_bar);
2725 if (!m_back_button) {
2726 BROWSER_LOGE("elm_button_add failed");
2729 elm_object_style_set(m_back_button, "browser/browser_view_controlbar_back");
2731 elm_object_part_content_set(controlbar_layout, "elm.swallow.back_button", m_back_button);
2732 evas_object_smart_callback_add(m_back_button, "clicked", __backward_cb, this);
2733 evas_object_show(m_back_button);
2734 evas_object_show(control_bar);
2737 return controlbar_layout;
2741 * Create two same url layouts similar with other browsers like android & safari.
2742 * The one(by _create_url_layout) is in the browser scroller and
2743 * the other(by _create_option_header_url_layout) is in the navigation bar option header.
2745 Evas_Object *Browser_View::_create_option_header_url_layout(void)
2747 BROWSER_LOGD("[%s]", __func__);
2748 Evas_Object *url_layout;
2749 url_layout = elm_layout_add(m_navi_bar);
2751 if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
2752 "browser/url_layout")) {
2753 BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
2756 evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2757 evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
2758 evas_object_show(url_layout);
2760 m_option_header_url_entry_layout = elm_layout_add(m_navi_bar);
2761 if (!m_option_header_url_entry_layout) {
2762 BROWSER_LOGE("elm_layout_add failed");
2765 if (!elm_layout_file_set(m_option_header_url_entry_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
2766 "elm/browser/urlentry/default")) {
2767 BROWSER_LOGE("Can not set layout theme[browser, urlentry, default]\n");
2770 elm_object_part_content_set(url_layout, "elm.swallow.url", m_option_header_url_entry_layout);
2771 edje_object_signal_callback_add(elm_layout_edje_get(m_option_header_url_entry_layout),
2772 "mouse,clicked,1", "elm.swallow.entry", __url_entry_clicked_cb, this);
2774 edje_object_signal_callback_add(elm_layout_edje_get(m_option_header_url_entry_layout),
2775 "refresh_stop", "*", __refresh_button_clicked_cb, this);
2777 evas_object_show(m_option_header_url_entry_layout);
2779 m_option_header_url_edit_field = br_elm_url_editfield_add(m_navi_bar);
2780 if (!m_option_header_url_edit_field) {
2781 BROWSER_LOGE("elm_editfield_add failed");
2784 elm_entry_context_menu_item_add(br_elm_editfield_entry_get(m_option_header_url_edit_field),
2785 BR_STRING_CTXMENU_SHARE, NULL, ELM_ICON_NONE, __url_editfield_share_clicked_cb, this);
2787 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.entry", m_option_header_url_edit_field);
2788 // br_elm_editfield_entry_single_line_set(m_option_header_url_edit_field, EINA_TRUE);
2789 br_elm_editfield_eraser_set(m_option_header_url_edit_field, EINA_FALSE);
2791 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
2792 elm_entry_input_panel_layout_set(edit_field_entry, ELM_INPUT_PANEL_LAYOUT_URL);
2793 ecore_imf_context_input_panel_event_callback_add((Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry),
2794 ECORE_IMF_INPUT_PANEL_STATE_EVENT, __url_entry_imf_event_cb, this);
2796 evas_object_smart_callback_add(edit_field_entry, "activated", __url_entry_enter_key_cb, this);
2797 evas_event_callback_add(evas_object_evas_get(m_option_header_url_edit_field), EVAS_CALLBACK_CANVAS_FOCUS_OUT,
2798 __url_entry_focus_out_cb, this);
2799 evas_object_show(m_option_header_url_edit_field);
2801 m_option_header_url_progressbar = elm_progressbar_add(m_navi_bar);
2802 if (!m_option_header_url_progressbar) {
2803 BROWSER_LOGE("elm_progressbar_add failed");
2806 elm_object_style_set(m_option_header_url_progressbar, "browser/loading");
2807 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.progressbar", m_option_header_url_progressbar);
2808 elm_progressbar_value_set(m_option_header_url_progressbar, 0);
2809 evas_object_show(m_option_header_url_progressbar);
2811 m_option_header_url_progresswheel = elm_progressbar_add(m_navi_bar);
2812 if (!m_option_header_url_progresswheel) {
2813 BROWSER_LOGE("elm_progressbar_add failed");
2817 elm_object_style_set(m_option_header_url_progresswheel, "UIActivityIndicatorStyleWhite");
2819 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
2820 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.progress", m_option_header_url_progresswheel);
2821 evas_object_show(m_option_header_url_progresswheel);
2823 m_option_header_cancel_button = elm_button_add(m_navi_bar);
2824 if (!m_option_header_cancel_button) {
2825 BROWSER_LOGE("elm_button_add failed");
2828 evas_object_size_hint_weight_set(m_option_header_cancel_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2829 evas_object_size_hint_align_set(m_option_header_cancel_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
2830 elm_object_style_set(m_option_header_cancel_button, "browser/cancel_button");
2831 elm_object_text_set(m_option_header_cancel_button, BR_STRING_CANCEL);
2832 elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_option_header_cancel_button);
2833 evas_object_smart_callback_add(m_option_header_cancel_button, "clicked", __cancel_button_clicked_cb, this);
2834 evas_object_show(m_option_header_cancel_button);
2836 m_option_header_title_backward_button = elm_button_add(m_navi_bar);
2837 if (!m_option_header_title_backward_button) {
2838 BROWSER_LOGE("elm_button_add failed");
2841 elm_object_style_set(m_option_header_title_backward_button, "browser/backward");
2842 elm_object_part_content_set(url_layout, "elm.swallow.backward_button", m_option_header_title_backward_button);
2843 evas_object_smart_callback_add(m_option_header_title_backward_button, "clicked", __backward_button_clicked_cb, this);
2844 elm_object_focus_allow_set(m_option_header_title_backward_button, EINA_FALSE);
2845 evas_object_show(m_option_header_title_backward_button);
2846 elm_object_disabled_set(m_option_header_title_backward_button, EINA_TRUE);
2848 m_option_header_title_forward_button = elm_button_add(m_navi_bar);
2849 if (!m_option_header_title_forward_button) {
2850 BROWSER_LOGE("elm_button_add failed");
2853 elm_object_style_set(m_option_header_title_forward_button, "browser/forward");
2854 elm_object_part_content_set(url_layout, "elm.swallow.forward_button", m_option_header_title_forward_button);
2855 evas_object_smart_callback_add(m_option_header_title_forward_button, "clicked", __forward_button_clicked_cb, this);
2856 elm_object_focus_allow_set(m_option_header_title_forward_button, EINA_FALSE);
2857 evas_object_show(m_option_header_title_forward_button);
2858 elm_object_disabled_set(m_option_header_title_forward_button, EINA_TRUE);
2860 /* for jump to top. */
2861 evas_object_event_callback_add(url_layout, EVAS_CALLBACK_MOUSE_DOWN, __option_header_url_layout_mouse_down_cb, this);
2867 Evas_Object *Browser_View::_get_activated_url_entry(void)
2869 /* The edit field in option header url layout is only valid for edit.
2870 * If the edit field in browser scroller can have focus, there is so many focus issue.
2871 * So just make the edit field in option header editable. */
2872 return m_option_header_url_edit_field;
2875 void Browser_View::__url_entry_imf_event_cb(void *data, Ecore_IMF_Context *ctx, int value)
2877 BROWSER_LOGD("value=%d", value);
2881 Browser_View *browser_view = (Browser_View *)data;
2882 if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
2883 Evas_Object *edit_field_entry;
2884 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
2885 elm_object_focus_set(edit_field_entry, EINA_FALSE);
2887 if (browser_view->m_edit_mode != BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF
2888 && browser_view->m_edit_mode != BR_FIND_WORD_MODE)
2889 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2892 } else if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW)
2893 /* If the focus of url entry is set automatically, the keypad is also displayed automatically. */
2894 /* eg. At url edit mode, lock the screen -> then unlock, the url entry will get focus. */
2895 /* The keypad is also invoked, so set the edit mode. */
2896 browser_view->_set_edit_mode(BR_URL_ENTRY_EDIT_MODE);
2899 void Browser_View::__url_entry_focus_out_cb(void *data, Evas *e, void *event_info)
2901 BROWSER_LOGD("[%s]", __func__);
2905 Browser_View *browser_view = (Browser_View *)data;
2906 Evas_Object *edit_field_entry;
2907 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
2909 Ecore_IMF_Context *ic = (Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry);
2913 ecore_imf_context_input_panel_hide(ic);
2915 if (browser_view->m_edit_mode != BR_FIND_WORD_MODE)
2916 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2919 void Browser_View::_set_edit_mode(edit_mode mode)
2921 BROWSER_LOGD("mode = %d", mode);
2923 if (m_edit_mode == mode)
2926 #if defined(FEATURE_MOST_VISITED_SITES)
2927 if (mode == BR_NO_EDIT_MODE) {
2928 if (m_most_visited_sites) {
2929 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,on,signal", "");
2930 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2931 "url_guide_text,on,signal", "");
2934 if (m_most_visited_sites) {
2935 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,off,signal", "");
2936 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2937 "url_guide_text,off,signal", "");
2942 if (mode == BR_URL_ENTRY_EDIT_MODE || mode == BR_FIND_WORD_MODE
2943 || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
2944 #ifdef BROWSER_SCROLLER_BOUNCING
2945 /* If edit mode, lock the browser scroller */
2946 _enable_webview_scroll();
2948 /* Make the browser scroller region y = 0 to show url bar all at edit mode. */
2952 elm_scroller_region_get(m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
2953 elm_scroller_region_show(m_scroller ,scroller_x, 0, scroller_w, scroller_h);
2956 if (mode == BR_URL_ENTRY_EDIT_MODE) {
2957 /* change layout of url layout for edit mode. */
2958 edje_object_signal_emit(elm_layout_edje_get(m_url_layout), "edit,url,on,signal", "");
2959 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2960 "edit,url,on,signal", "");
2962 /* change refresh icon in url entry for edit mode. */
2963 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "edit,url,on,signal", "");
2964 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2965 "edit,url,on,signal", "");
2967 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "hide,favicon,signal", "");
2968 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2969 "hide,favicon,signal", "");
2970 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
2971 "edit,url,on,signal", "");
2972 } else if (mode == BR_NO_EDIT_MODE || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
2973 if (m_edit_mode == BR_FIND_WORD_MODE) {
2974 edje_object_signal_emit(elm_layout_edje_get(m_option_header_layout), "hide,find_word_layout,signal", "");
2975 m_find_word->find_word("", Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
2977 /* change layout of url layout for normal mode. */
2978 edje_object_signal_emit(elm_layout_edje_get(m_url_layout), "edit,url,off,signal", "");
2979 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2980 "edit,url,off,signal", "");
2982 /* change refresh icon in url entry for normal mode. */
2983 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "edit,url,off,signal", "");
2984 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2985 "edit,url,off,signal", "");
2987 #if defined(FEATURE_MOST_VISITED_SITES)
2988 if (!is_most_visited_sites_running())
2991 if (m_focused_window->m_favicon)
2992 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
2993 "show,favicon,signal", "");
2996 if (m_focused_window->m_option_header_favicon) {
2997 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2998 "show,favicon,signal", "");
3002 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
3003 "edit,url,off,signal", "");
3004 if (_is_loading()) {
3005 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,on,signal", "");
3006 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
3007 "loading,on,signal", "");
3010 } else if (mode == BR_FIND_WORD_MODE) {
3011 Evas_Object *find_word_edit_field_entry = br_elm_editfield_entry_get(m_find_word_edit_field);
3012 elm_entry_entry_set(find_word_edit_field_entry, "");
3014 evas_object_smart_callback_del(find_word_edit_field_entry, "changed", __find_word_entry_changed_cb);
3015 evas_object_smart_callback_add(find_word_edit_field_entry, "changed", __find_word_entry_changed_cb, this);
3017 edje_object_signal_emit(elm_layout_edje_get(m_option_header_layout), "show,find_word_layout,signal", "");
3022 /* To show favicon, if click url entry while loading, then cancel case. */
3027 * The url entry of option header can't be focusable in case of switch TEXTBLOCK & elm entry.
3028 * So focus the url entry in idler callback.
3030 static Eina_Bool __url_entry_focus_idler_cb(void *data)
3032 Evas_Object *edit_field = (Evas_Object *)data;
3033 elm_object_focus_set(edit_field, EINA_TRUE);
3035 Evas_Object *entry = br_elm_editfield_entry_get(edit_field);
3036 elm_entry_cursor_end_set(entry);
3038 return ECORE_CALLBACK_CANCEL;
3041 void Browser_View::__url_entry_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
3043 BROWSER_LOGD("[%s]", __func__);
3047 Browser_View *browser_view = (Browser_View *)data;
3049 if (browser_view->_is_loading())
3050 browser_view->_stop_loading();
3052 if (!browser_view->_navigationbar_visible_get()) {
3053 /* The edit field in option header is only for edit url. */
3054 browser_view->_navigationbar_visible_set_signal(EINA_TRUE);
3057 browser_view->_destroy_more_context_popup();
3059 edit_mode mode = browser_view->_get_edit_mode();
3061 browser_view->_set_edit_mode(BR_URL_ENTRY_EDIT_MODE);
3063 if (mode == BR_NO_EDIT_MODE) {
3064 Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field);
3066 elm_object_focus_set(browser_view->m_option_header_url_edit_field, EINA_TRUE);
3067 elm_entry_cursor_end_set(entry);
3069 // ecore_idler_add(__url_entry_focus_idler_cb, browser_view->m_option_header_url_edit_field);
3073 Eina_Bool Browser_View::_is_option_header_expanded(void)
3075 return _navigationbar_visible_get();
3078 void Browser_View::__cancel_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3080 BROWSER_LOGD("[%s]", __func__);
3084 Browser_View *browser_view = (Browser_View *)data;
3085 Evas_Object *ewk_view = browser_view->m_focused_window->m_ewk_view;
3089 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
3091 elm_object_signal_emit(browser_view->m_option_header_url_edit_field, "ellipsis_show,signal", "elm");
3092 elm_object_signal_emit(browser_view->m_url_edit_field, "ellipsis_show,signal", "elm");
3094 browser_view->_set_url_entry(browser_view->get_url().c_str());
3097 void Browser_View::__refresh_button_clicked_cb(void *data, Evas_Object *obj,
3098 const char *emission, const char *source)
3100 BROWSER_LOGD("[%s]", __func__);
3104 Browser_View *browser_view = (Browser_View *)data;
3105 if (browser_view->_get_edit_mode() == BR_URL_ENTRY_EDIT_MODE) {
3106 elm_entry_entry_set(br_elm_editfield_entry_get(browser_view->m_url_edit_field), "");
3107 elm_entry_entry_set(br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field), "");
3108 } else if(browser_view->_is_loading())
3109 browser_view->_stop_loading();
3111 browser_view->_reload();
3114 void Browser_View::__url_entry_enter_key_cb(void *data, Evas_Object *obj, void *event_info)
3116 BROWSER_LOGD("[%s]", __func__);
3120 Browser_View *browser_view = (Browser_View *)data;
3121 Evas_Object *ewk_view = browser_view->m_focused_window->m_ewk_view;
3122 Evas_Object *edit_field_entry;
3123 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
3126 * Give focus to option header cancel button to hide imf. */
3127 elm_object_focus_set(browser_view->m_option_header_cancel_button, EINA_TRUE);
3129 char *url = elm_entry_markup_to_utf8(elm_entry_entry_get(edit_field_entry));
3130 BROWSER_LOGD("input url = [%s]", url);
3132 if (url && strlen(url)) {
3133 browser_view->load_url(url);
3139 void Browser_View::__url_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
3141 BROWSER_LOGD("[%s]", __func__);
3144 void Browser_View::__url_layout_mouse_down_cb(void *data, Evas* evas, Evas_Object *obj,
3147 BROWSER_LOGD("[%s]", __func__);
3151 Evas_Event_Mouse_Down event = *(Evas_Event_Mouse_Down *)event_info;
3153 Browser_View *browser_view = (Browser_View *)data;
3155 Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_url_edit_field);
3161 evas_object_geometry_get(browser_view->m_url_edit_field, &entry_x, &entry_y, &entry_w, &entry_h);
3163 if (event.output.x > entry_x && event.output.x < entry_x + entry_w &&
3164 event.output.y > entry_y && event.output.y < entry_y + entry_h) {
3165 elm_object_signal_emit(browser_view->m_option_header_url_edit_field, "ellipsis_hide,signal", "elm");
3166 elm_object_signal_emit(browser_view->m_url_edit_field, "ellipsis_hide,signal", "elm");
3169 edit_mode mode = browser_view->_get_edit_mode();
3170 if (mode == BR_URL_ENTRY_EDIT_MODE || mode == BR_FIND_WORD_MODE
3171 || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
3172 #ifdef BROWSER_SCROLLER_BOUNCING
3173 BROWSER_LOGD("<< lock browser scroller >>");
3174 elm_object_scroll_freeze_pop(browser_view->m_scroller);
3175 elm_object_scroll_freeze_push(browser_view->m_scroller);
3180 void Browser_View::__option_header_url_layout_mouse_down_cb(void *data, Evas* evas, Evas_Object *obj,
3183 BROWSER_LOGD("[%s]", __func__);
3186 Evas_Event_Mouse_Down event = *(Evas_Event_Mouse_Down *)event_info;
3187 Browser_View *browser_view = (Browser_View *)data;
3189 Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field);
3195 evas_object_geometry_get(browser_view->m_option_header_url_edit_field, &entry_x, &entry_y, &entry_w, &entry_h);
3197 if (event.output.x > entry_x && event.output.x < entry_x + entry_w &&
3198 event.output.y > entry_y && event.output.y < entry_y + entry_h) {
3199 elm_object_signal_emit(browser_view->m_option_header_url_edit_field, "ellipsis_hide,signal", "elm");
3200 elm_object_signal_emit(browser_view->m_url_edit_field, "ellipsis_hide,signal", "elm");
3204 if (event.output.y < icon_y)
3205 browser_view->_jump_to_top();
3208 void Browser_View::_update_back_forward_buttons(void)
3210 BROWSER_LOGD("[%s]", __func__);
3211 if (ewk_view_back_possible(m_focused_window->m_ewk_view)) {
3212 elm_object_disabled_set(m_title_backward_button, EINA_FALSE);
3213 elm_object_disabled_set(m_option_header_title_backward_button, EINA_FALSE);
3215 elm_object_disabled_set(m_title_backward_button, EINA_TRUE);
3216 elm_object_disabled_set(m_option_header_title_backward_button, EINA_TRUE);
3219 if (ewk_view_forward_possible(m_focused_window->m_ewk_view)) {
3220 elm_object_disabled_set(m_title_forward_button, EINA_FALSE);
3221 elm_object_disabled_set(m_option_header_title_forward_button, EINA_FALSE);
3223 elm_object_disabled_set(m_title_forward_button, EINA_TRUE);
3224 elm_object_disabled_set(m_option_header_title_forward_button, EINA_TRUE);
3228 void Browser_View::__backward_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3230 BROWSER_LOGD("[%s]", __func__);
3234 Browser_View *browser_view = (Browser_View *)data;
3235 ewk_view_back(browser_view->m_focused_window->m_ewk_view);
3238 void Browser_View::__forward_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3240 BROWSER_LOGD("[%s]", __func__);
3244 Browser_View *browser_view = (Browser_View *)data;
3245 ewk_view_forward(browser_view->m_focused_window->m_ewk_view);
3248 Evas_Object *Browser_View::_create_url_layout(void)
3250 BROWSER_LOGD("[%s]", __func__);
3251 Evas_Object *url_layout;
3252 url_layout = elm_layout_add(m_navi_bar);
3254 if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
3255 "browser/url_layout")) {
3256 BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
3259 evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, 0.0);
3260 evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3261 evas_object_show(url_layout);
3263 /* create url entry layout in url layout */
3264 m_url_entry_layout = elm_layout_add(m_navi_bar);
3265 if (!m_url_entry_layout) {
3266 BROWSER_LOGE("elm_layout_add failed");
3269 if (!elm_layout_file_set(m_url_entry_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
3270 "elm/browser/urlentry/default")) {
3271 BROWSER_LOGE("Can not set layout theme[browser, urlentry, default]\n");
3274 elm_object_part_content_set(url_layout, "elm.swallow.url", m_url_entry_layout);
3275 evas_object_show(m_url_entry_layout);
3277 m_url_edit_field = br_elm_url_editfield_add(m_navi_bar);
3278 if (!m_url_edit_field) {
3279 BROWSER_LOGE("elm_editfield_add failed");
3282 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.entry", m_url_edit_field);
3283 // br_elm_editfield_entry_single_line_set(m_url_edit_field, EINA_TRUE);
3284 br_elm_editfield_eraser_set(m_url_edit_field, EINA_FALSE);
3286 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(m_url_edit_field);
3287 elm_entry_editable_set(edit_field_entry, EINA_FALSE);
3288 /* The edit field in browser scroller is only for display.
3289 * The edit url is only supported in option header url entry. */
3290 elm_object_focus_allow_set(m_url_edit_field, EINA_FALSE);
3291 elm_object_focus_allow_set(edit_field_entry, EINA_FALSE);
3292 elm_entry_input_panel_enabled_set(edit_field_entry, EINA_FALSE);
3294 elm_entry_text_style_user_push(edit_field_entry, "DEFAULT='font_size=35 color=#3C3632 ellipsis=1'");
3295 evas_object_show(m_url_edit_field);
3297 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "disable_entry,signal", "");
3298 edje_object_signal_callback_add(elm_layout_edje_get(m_url_entry_layout), "mouse,clicked,1", "block_entry",
3299 __url_entry_clicked_cb, this);
3301 edje_object_signal_callback_add(elm_layout_edje_get(m_url_entry_layout), "refresh_stop", "*",
3302 __refresh_button_clicked_cb, this);
3304 m_url_progressbar = elm_progressbar_add(m_navi_bar);
3305 if (!m_url_progressbar) {
3306 BROWSER_LOGE("elm_progressbar_add failed");
3309 elm_object_style_set(m_url_progressbar, "browser/loading");
3310 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.progressbar", m_url_progressbar);
3311 elm_progressbar_value_set(m_url_progressbar, 0);
3312 evas_object_show(m_url_progressbar);
3314 m_url_progresswheel = elm_progressbar_add(m_navi_bar);
3315 if (!m_url_progresswheel) {
3316 BROWSER_LOGE("elm_progressbar_add failed");
3320 elm_object_style_set(m_url_progresswheel, "UIActivityIndicatorStyleWhite");
3321 elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
3322 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.progress", m_url_progresswheel);
3323 evas_object_show(m_url_progresswheel);
3325 m_cancel_button = elm_button_add(m_navi_bar);
3326 if (!m_cancel_button) {
3327 BROWSER_LOGE("elm_button_add failed");
3330 evas_object_size_hint_weight_set(m_cancel_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3331 evas_object_size_hint_align_set(m_cancel_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
3332 elm_object_style_set(m_cancel_button, "browser/cancel_button");
3333 elm_object_text_set(m_cancel_button, BR_STRING_CANCEL);
3334 elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_cancel_button);
3335 evas_object_smart_callback_add(m_cancel_button, "clicked", __cancel_button_clicked_cb, this);
3336 evas_object_show(m_cancel_button);
3338 m_title_backward_button = elm_button_add(m_navi_bar);
3339 if (!m_title_backward_button) {
3340 BROWSER_LOGE("elm_button_add failed");
3343 elm_object_style_set(m_title_backward_button, "browser/backward");
3344 elm_object_part_content_set(url_layout, "elm.swallow.backward_button", m_title_backward_button);
3345 evas_object_smart_callback_add(m_title_backward_button, "clicked", __backward_button_clicked_cb, this);
3346 elm_object_focus_allow_set(m_title_backward_button, EINA_FALSE);
3347 evas_object_show(m_title_backward_button);
3348 elm_object_disabled_set(m_title_backward_button, EINA_TRUE);
3350 m_title_forward_button = elm_button_add(m_navi_bar);
3351 if (!m_title_forward_button) {
3352 BROWSER_LOGE("elm_button_add failed");
3355 elm_object_style_set(m_title_forward_button, "browser/forward");
3356 elm_object_part_content_set(url_layout, "elm.swallow.forward_button", m_title_forward_button);
3357 evas_object_smart_callback_add(m_title_forward_button, "clicked", __forward_button_clicked_cb, this);
3358 elm_object_focus_allow_set(m_title_forward_button, EINA_FALSE);
3359 evas_object_show(m_title_forward_button);
3360 elm_object_disabled_set(m_title_forward_button, EINA_TRUE);
3363 * When edit mode, if scroll down on url layout in browser view,
3364 * the browser can be scrolled even though scroll locked.
3365 * So, lock the browser scroller whenever touch on it if edit mode.
3367 evas_object_event_callback_add(url_layout, EVAS_CALLBACK_MOUSE_DOWN, __url_layout_mouse_down_cb, this);
3373 Evas_Object *Browser_View::_create_find_word_layout(void)
3375 BROWSER_LOGD("[%s]", __func__);
3376 Evas_Object *url_layout = elm_layout_add(m_navi_bar);
3378 BROWSER_LOGE("elm_layout_add failed");
3381 if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-find-word-layout.edj",
3382 "browser-view/find_word_layout")) {
3383 BROWSER_LOGE("Can not set layout theme[browser-view/find_word_layout]\n");
3386 evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, 0.0);
3387 evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3388 evas_object_show(url_layout);
3390 /* create url entry layout in url layout */
3391 m_find_word_entry_layout = elm_layout_add(m_navi_bar);
3392 if (!m_find_word_entry_layout) {
3393 BROWSER_LOGE("elm_layout_add failed");
3396 if (!elm_layout_file_set(m_find_word_entry_layout, BROWSER_EDJE_DIR"/browser-view-find-word-layout.edj",
3397 "browser-view/find_word_editfield_layout")) {
3398 BROWSER_LOGE("browser-view/find_word_editfield_layout failed");
3401 elm_object_part_content_set(url_layout, "elm.swallow.url", m_find_word_entry_layout);
3402 evas_object_show(m_find_word_entry_layout);
3404 edje_object_part_text_set(elm_layout_edje_get(url_layout), "title_text", BR_STRING_FIND_ON_PAGE);
3406 m_find_word_edit_field = br_elm_find_word_editfield_add(m_navi_bar);
3407 if (!m_find_word_edit_field) {
3408 BROWSER_LOGE("elm_editfield_add failed");
3411 elm_object_part_content_set(m_find_word_entry_layout, "elm.swallow.entry", m_find_word_edit_field);
3412 evas_object_show(m_find_word_edit_field);
3414 edje_object_signal_emit(elm_layout_edje_get(m_find_word_edit_field), "find_word,signal", "elm");
3416 // br_elm_editfield_entry_single_line_set(m_find_word_edit_field, EINA_TRUE);
3417 br_elm_editfield_eraser_set(m_find_word_edit_field, EINA_TRUE);
3419 elm_object_signal_callback_add(m_find_word_edit_field, "elm,eraser,clicked", "elm",
3420 __find_word_erase_button_clicked_cb, this);
3422 Evas_Object *find_word_edit_field_entry = br_elm_editfield_entry_get(m_find_word_edit_field);
3423 elm_entry_entry_set(find_word_edit_field_entry, "");
3424 evas_object_smart_callback_add(find_word_edit_field_entry, "activated", __find_word_entry_enter_key_cb, this);
3425 elm_entry_input_panel_layout_set(find_word_edit_field_entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
3426 elm_entry_prediction_allow_set(find_word_edit_field_entry, EINA_FALSE);
3427 ecore_imf_context_input_panel_event_callback_add((Ecore_IMF_Context *)elm_entry_imf_context_get(find_word_edit_field_entry),
3428 ECORE_IMF_INPUT_PANEL_STATE_EVENT, __find_word_entry_imf_event_cb, this);
3429 elm_entry_text_style_user_push(find_word_edit_field_entry, "DEFAULT='font_size=35 color=#3C363 2 ellipsis=1'");
3430 evas_object_show(m_find_word_edit_field);
3432 m_find_word_cancel_button = elm_button_add(m_navi_bar);
3433 if (!m_find_word_cancel_button) {
3434 BROWSER_LOGE("elm_button_add failed");
3437 elm_object_style_set(m_find_word_cancel_button, "browser/cancel_button");
3438 elm_object_text_set(m_find_word_cancel_button, BR_STRING_CANCEL);
3439 elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_find_word_cancel_button);
3440 evas_object_show(m_find_word_cancel_button);
3442 evas_object_smart_callback_add(m_find_word_cancel_button, "clicked", __find_word_cancel_button_clicked_cb, this);
3444 m_find_word_prev_button = elm_button_add(m_navi_bar);
3445 if (!m_find_word_prev_button) {
3446 BROWSER_LOGE("elm_button_add failed");
3449 elm_object_style_set(m_find_word_prev_button, "browser/find_word_prev_but");
3450 elm_object_part_content_set(url_layout, "elm.swallow.find_word_prev", m_find_word_prev_button);
3451 evas_object_show(m_find_word_prev_button);
3452 evas_object_smart_callback_add(m_find_word_prev_button, "clicked", __find_word_prev_button_clicked_cb, this);
3454 m_find_word_next_button = elm_button_add(m_navi_bar);
3455 if (!m_find_word_next_button) {
3456 BROWSER_LOGE("elm_button_add failed");
3459 elm_object_style_set(m_find_word_next_button, "browser/find_word_next_but");
3460 elm_object_part_content_set(url_layout, "elm.swallow.find_word_next", m_find_word_next_button);
3461 evas_object_show(m_find_word_next_button);
3462 evas_object_smart_callback_add(m_find_word_next_button, "clicked", __find_word_next_button_clicked_cb, this);
3464 const char *current_theme = elm_theme_get(NULL);
3465 if (current_theme && strstr(current_theme, "white")) {
3467 // edje_object_signal_emit(elm_layout_edje_get(m_find_word_entry_layout),
3468 // "black_theme,signal", "");
3474 void Browser_View::__find_word_erase_button_clicked_cb(void *data, Evas_Object *obj,
3475 const char *emission, const char *source)
3477 BROWSER_LOGD("[%s]", __func__);
3478 Browser_View *browser_view = (Browser_View *)data;
3479 edje_object_part_text_set(elm_layout_edje_get(browser_view->m_option_header_find_word_layout), "elm.index_text", "0/0");
3482 void Browser_View::__find_word_cancel_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3484 BROWSER_LOGD("[%s]", __func__);
3488 Browser_View *browser_view = (Browser_View *)data;
3489 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
3490 browser_view->m_find_word->find_word("", Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3493 void Browser_View::__find_word_prev_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3495 BROWSER_LOGD("[%s]", __func__);
3499 Browser_View *browser_view = (Browser_View *)data;
3500 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,control_bar,no_animation,signal", "");
3501 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3502 const char *find_word = elm_entry_entry_get(edit_field_entry);
3503 if (!find_word || !strlen(find_word))
3506 int index = browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_BACKWARD);
3508 elm_object_focus_set(browser_view->m_find_word_cancel_button, EINA_TRUE);
3510 void Browser_View::__find_word_next_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3512 BROWSER_LOGD("[%s]", __func__);
3516 Browser_View *browser_view = (Browser_View *)data;
3517 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,control_bar,no_animation,signal", "");
3518 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3519 const char *find_word = elm_entry_entry_get(edit_field_entry);
3520 if (!find_word || !strlen(find_word))
3523 int index = browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3524 if (index == browser_view->m_find_word->get_match_max_value())
3525 elm_object_focus_set(browser_view->m_find_word_cancel_button, EINA_TRUE);
3528 void Browser_View::__find_word_entry_imf_event_cb(void *data, Ecore_IMF_Context *ctx, int value)
3530 BROWSER_LOGD("value=%d", value);
3534 Browser_View *browser_view = (Browser_View *)data;
3535 Evas_Object *find_word_editfield_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3537 if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE)
3538 elm_object_focus_set(find_word_editfield_entry, EINA_FALSE);
3540 elm_object_focus_set(find_word_editfield_entry, EINA_TRUE);
3543 void Browser_View::_enable_browser_scroller_scroll(void)
3545 #ifdef BROWSER_SCROLLER_BOUNCING
3546 if (!ewk_view_vertical_panning_hold_get(m_focused_window->m_ewk_view)
3547 && !_is_loading() && !m_is_full_screen) {
3548 BROWSER_LOGD("<< unlock browser scroller, lock ewk view >>");
3549 elm_object_scroll_freeze_pop(m_scroller);
3550 ewk_view_vertical_panning_hold_set(m_focused_window->m_ewk_view, EINA_TRUE);
3555 void Browser_View::_enable_webview_scroll(void)
3557 #ifdef BROWSER_SCROLLER_BOUNCING
3558 if (ewk_view_vertical_panning_hold_get(m_focused_window->m_ewk_view)) {
3559 BROWSER_LOGD("<< lock browser scroller, unlock ewk view >>");
3560 elm_object_scroll_freeze_pop(m_scroller);
3561 elm_object_scroll_freeze_push(m_scroller);
3562 ewk_view_vertical_panning_hold_set(m_focused_window->m_ewk_view, EINA_FALSE);
3567 void Browser_View::__find_word_entry_enter_key_cb(void *data, Evas_Object *obj, void *event_info)
3569 BROWSER_LOGD("[%s]", __func__);
3573 Browser_View *browser_view = (Browser_View *)data;
3574 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,control_bar,no_animation,signal", "");
3575 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3576 const char *find_word = elm_entry_entry_get(edit_field_entry);
3577 if (!find_word || !strlen(find_word))
3580 browser_view->m_find_word->init_index();
3581 browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3583 elm_object_focus_set(edit_field_entry, EINA_FALSE);
3584 BROWSER_LOGD("find_word=[%s]", find_word);
3587 void Browser_View::__find_word_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
3589 BROWSER_LOGD("[%s]", __func__);
3593 Browser_View *browser_view = (Browser_View *)data;
3594 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3595 const char *find_word = elm_entry_entry_get(edit_field_entry);
3597 browser_view->m_find_word->init_index();
3598 browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3602 void Browser_View::_navigationbar_title_clicked(void)
3604 BROWSER_LOGD("[%s]", __func__);
3605 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
3606 Evas_Object *content = elm_object_item_content_get(top_it);
3607 if (content != m_main_layout)
3610 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)
3611 #if defined(FEATURE_MOST_VISITED_SITES)
3612 || is_most_visited_sites_running()
3614 || m_edit_mode != BR_NO_EDIT_MODE)
3621 elm_scroller_region_get(m_scroller, &scroller_x, &scroller_y, &scroller_w, &scroller_h);
3623 if (scroller_y == 0) {
3624 /* scroller is on top, the url bar in scroller is fully being displayed.
3625 * Then, just show/hide the tool bar. */
3626 const char* state = edje_object_part_state_get(elm_layout_edje_get(m_main_layout),
3627 "elm.swallow.control_bar", NULL);
3628 if(state && !strncmp(state, "default", strlen("default")))
3629 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "show,control_bar,signal", "");
3631 #ifdef BROWSER_SCROLLER_BOUNCING
3632 int url_layout_h = 0;
3633 evas_object_geometry_get(m_url_layout, NULL, NULL, NULL, &url_layout_h);
3634 elm_scroller_region_bring_in(m_scroller ,scroller_x, url_layout_h, scroller_w, scroller_h);
3638 if (_is_loading()) {
3640 Eina_Bool visible = _navigationbar_visible_get();
3641 #ifdef BROWSER_SCROLLER_BOUNCING
3642 _navigationbar_visible_set(!visible);
3649 void Browser_View::_jump_to_top(void)
3651 BROWSER_LOGD("[%s]", __func__);
3652 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
3653 Evas_Object *content = elm_object_item_content_get(top_it);
3654 if (content != m_main_layout)
3657 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)
3658 #if defined(FEATURE_MOST_VISITED_SITES)
3659 || is_most_visited_sites_running()
3661 || m_edit_mode != BR_NO_EDIT_MODE)
3664 int browser_scroller_x = 0;
3665 int browser_scroller_w = 0;
3666 int browser_scroller_h = 0;
3667 elm_scroller_region_get(m_scroller, &browser_scroller_x, NULL,
3668 &browser_scroller_w, &browser_scroller_h);
3669 elm_scroller_region_show(m_scroller, browser_scroller_x, 0, browser_scroller_w, browser_scroller_h);
3671 ewk_view_top_of_contents_go(m_focused_window->m_ewk_view);
3674 void Browser_View::delete_non_user_created_windows(void)
3676 BROWSER_LOGD("[%s]", __func__);
3677 /* Delete no-backward history window. */
3678 std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3679 int window_count = window_list.size();
3681 if (window_count <= 1)
3685 for (i = 0 ; i < window_count ; i++) {
3686 BROWSER_LOGD("focusable_window = %d, window[%d]=%d", m_focused_window, i, window_list[i]);
3687 if (window_list[i]->m_ewk_view
3688 &&!ewk_view_back_possible(window_list[i]->m_ewk_view)
3689 && window_list[i] != m_focused_window
3690 && window_list[i]->m_created_by_user == EINA_FALSE) {
3691 BROWSER_LOGD("delete window index=[%d]", i);
3692 m_browser->delete_window(window_list[i]);
3694 /* Set title & url with the focused window. */
3695 _set_navigationbar_title(get_title().c_str());
3696 _set_url_entry(get_url().c_str());
3697 _set_controlbar_back_forward_status();
3698 if (!_set_favicon())
3699 BROWSER_LOGE("_set_favicon failed");
3704 void Browser_View::__title_back_button_clicked_cb(void *data , Evas_Object *obj, void *event_info)
3706 BROWSER_LOGD("[%s]", __func__);
3710 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
3711 BROWSER_LOGD("close multi window");
3712 m_data_manager->get_multi_window_view()->close_multi_window();
3716 Browser_View *browser_view = (Browser_View *)data;
3718 if (browser_view->m_focused_window->m_ewk_view
3719 && ewk_view_back_possible(browser_view->m_focused_window->m_ewk_view))
3720 ewk_view_back(browser_view->m_focused_window->m_ewk_view);
3722 if (browser_view->m_focused_window->m_parent) {
3723 /* Save current window pointer to delete later. */
3724 Browser_Window *delete_window = browser_view->m_focused_window;
3725 browser_view->m_browser->set_focused_window(browser_view->m_focused_window->m_parent);
3726 browser_view->m_browser->delete_window(delete_window);
3728 /* Set title & url with the focused window. */
3729 browser_view->_set_navigationbar_title(browser_view->get_title().c_str());
3730 browser_view->_set_url_entry(browser_view->get_url().c_str());
3731 browser_view->_set_controlbar_back_forward_status();
3732 if (!browser_view->_set_favicon())
3733 BROWSER_LOGE("_set_favicon failed");
3735 elm_win_lower(browser_view->m_win);
3737 browser_view->delete_non_user_created_windows();
3742 void Browser_View::__scroller_scroll_cb(void *data, Evas_Object *obj, void *event_info)
3744 #ifdef BROWSER_SCROLLER_BOUNCING
3748 Browser_View *browser_view = (Browser_View *)data;
3750 int browser_scroller_x = 0;
3751 int browser_scroller_y = 0;
3752 int browser_scroller_w = 0;
3753 int browser_scroller_h = 0;
3754 elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, &browser_scroller_y,
3755 &browser_scroller_w, &browser_scroller_h);
3757 int url_layout_h = 0;
3758 evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
3761 * If user scrolls up/down near the url bar edge, the movement of scroller is not smooth.
3762 * It's because the browser scroller region y is also bouncing.
3763 * So if the scroller region y is bigger than the height of url bar(65 pixel),
3764 * make the region y to url bar height by force. */
3765 if (browser_scroller_y > url_layout_h)
3766 elm_scroller_region_show(browser_view->m_scroller, browser_scroller_x, url_layout_h,
3767 browser_scroller_w, browser_scroller_h);
3771 Eina_Bool Browser_View::_is_loading(void)
3773 if (!m_focused_window || !m_focused_window->m_ewk_view)
3776 double progress = ewk_view_load_progress_get(m_focused_window->m_ewk_view);
3777 // BROWSER_LOGD("progress=%f", progress);
3778 if (progress == 1.0f || progress < 0.05f)
3784 #if defined(HORIZONTAL_UI)
3785 Eina_Bool Browser_View::is_available_to_rotate(void)
3788 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
3789 if (m_data_manager->get_multi_window_view()->is_reordering_mode())
3793 if (m_scissorbox_view)
3799 Eina_Bool Browser_View::__rotate_multi_window_cb(void *data)
3801 BROWSER_LOGD("[%s]", __func__);
3802 Browser_View *browser_view = (Browser_View *)data;
3803 browser_view->m_multi_window_rotate_timer = NULL;
3804 browser_view->_rotate_multi_window();
3806 return ECORE_CALLBACK_CANCEL;
3809 void Browser_View::rotate(int degree)
3812 /* In landscape mode, if the url bar is not displayed -> rotate to portrait mode.
3813 * Then the url bar is displayed. To avoid this issue, remember the scroller region y,
3814 * then restore it at portrait mode. */
3815 int scroller_region_y = 0;
3816 elm_scroller_region_get(m_scroller, NULL, &scroller_region_y, NULL, NULL);
3817 m_scroller_region_y = scroller_region_y;
3819 m_rotate_degree = degree;
3821 #if defined(FEATURE_MOST_VISITED_SITES)
3822 if (m_most_visited_sites)
3823 m_most_visited_sites->rotate();
3825 if (m_scissorbox_view)
3826 _destroy_scissorbox_view();
3829 void Browser_View::suspend_ewk_view(Evas_Object *ewk_view)
3831 BROWSER_LOGD("[%s]", __func__);
3833 std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3834 for (int i = 0 ; i < window_list.size() ; i++) {
3835 if (window_list[i]->m_ewk_view_layout) {
3836 edje_object_signal_emit(elm_layout_edje_get(window_list[i]->m_ewk_view_layout),
3837 "unresizable,signal", "");
3842 ewk_view_suspend(ewk_view);
3843 ewk_view_visibility_set(ewk_view, EINA_FALSE);
3846 void Browser_View::resume_ewk_view(Evas_Object *ewk_view)
3848 BROWSER_LOGD("[%s]", __func__);
3850 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
3853 ewk_view_resume(ewk_view);
3854 ewk_view_visibility_set(ewk_view, EINA_TRUE);
3857 void Browser_View::pause(void)
3859 BROWSER_LOGD("[%s]", __func__);
3860 if (_is_loading()) {
3861 /* Because the progress wheel in url bar has about 15% cpu consumption.
3862 * So, pause the animation when browser goes to background. It's nonsense!*/
3863 if (m_option_header_url_progresswheel)
3864 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
3865 if (m_url_progresswheel)
3866 elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
3869 set_full_sreen(EINA_FALSE);
3873 suspend_ewk_view(m_focused_window->m_ewk_view);
3875 /* stop vibration */
3876 _haptic_device_stop();
3879 void Browser_View::resume(void)
3881 BROWSER_LOGD("[%s]", __func__);
3882 if (_is_loading()) {
3883 /* Because the progress wheel in url bar has about 15% cpu consumption.
3884 * So, pause the animation when browser goes to background. It's nonsense! */
3885 if (m_option_header_url_progresswheel)
3886 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_TRUE);
3887 if (m_url_progresswheel)
3888 elm_progressbar_pulse(m_url_progresswheel, EINA_TRUE);
3893 resume_ewk_view(m_focused_window->m_ewk_view);
3896 void Browser_View::reset(void)
3898 BROWSER_LOGD("[%s]", __func__);
3899 if (m_focused_window && m_focused_window->m_ewk_view)
3903 Eina_Bool Browser_View::__webview_layout_resize_idler_cb(void *data)
3907 return ECORE_CALLBACK_CANCEL;
3909 Browser_View *browser_view = (Browser_View *)data;
3911 browser_view->m_resize_idler = NULL;
3913 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_focused_window->m_ewk_view_layout),
3914 "resizable,signal", "");
3918 #ifdef BROWSER_SCROLLER_BOUNCING
3919 edje_object_part_geometry_get(elm_layout_edje_get(browser_view->m_main_layout),
3920 "elm.swallow.content", NULL, NULL, &content_w, &content_h);
3922 edje_object_part_geometry_get(elm_layout_edje_get(browser_view->m_focused_window->m_ewk_view_layout),
3923 "elm.swallow.webview", NULL, NULL, &content_w, &content_h);
3925 if (browser_view->m_is_full_screen) {
3926 int browser_scroller_y = 0;
3927 evas_object_geometry_get(browser_view->m_scroller, NULL, &browser_scroller_y, NULL, NULL);
3928 evas_object_resize(browser_view->m_focused_window->m_ewk_view,
3929 content_w, content_h + browser_scroller_y);
3931 evas_object_size_hint_min_set(browser_view->m_focused_window->m_ewk_view_layout,
3932 content_w, content_h);
3933 evas_object_resize(browser_view->m_focused_window->m_ewk_view_layout,
3934 content_w, content_h);
3937 return ECORE_CALLBACK_CANCEL;
3940 Eina_Bool Browser_View::__scroller_bring_in_idler_cb(void *data)
3942 BROWSER_LOGD("[%s]", __func__);
3944 return ECORE_CALLBACK_CANCEL;
3945 Browser_View *browser_view = (Browser_View *)data;
3947 int url_layout_h = 0;
3948 evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
3950 BROWSER_LOGD("<< elm_scroller_region_bring_in , url_layout_h=%d >>", url_layout_h);
3951 int browser_scroller_x = 0;
3952 int browser_scroller_w = 0;
3953 int browser_scroller_h = 0;
3954 elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, NULL,
3955 &browser_scroller_w, &browser_scroller_h);
3956 elm_scroller_region_show(browser_view->m_scroller, browser_scroller_x, url_layout_h,
3957 browser_scroller_w, browser_scroller_h);
3959 return ECORE_CALLBACK_CANCEL;
3963 * If user invokes the keypad via input field or url entry, resize the webview.
3964 * The only scroller resize is called when the keypad is launched.
3965 * Other elements like layout, conformant resize event doesn't come. */
3966 void Browser_View::__scroller_resize_cb(void* data, Evas* evas, Evas_Object* obj, void* ev)
3968 BROWSER_LOGD("[%s]", __func__);
3972 Browser_View *browser_view = (Browser_View *)data;
3974 if (browser_view->m_is_full_screen) {
3975 ecore_idler_add(__webview_layout_resize_idler_cb, browser_view);
3981 evas_object_geometry_get(browser_view->m_scroller, NULL, NULL, &scroller_w, &scroller_h);
3982 std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3984 for (int i = 0 ; i < window_list.size() ; i++) {
3985 if (window_list[i]->m_ewk_view_layout) {
3986 edje_object_signal_emit(elm_layout_edje_get(window_list[i]->m_ewk_view_layout),
3987 "resizable,signal", "");
3989 evas_object_size_hint_min_set(window_list[i]->m_ewk_view_layout,
3990 scroller_w, scroller_h);
3991 evas_object_resize(window_list[i]->m_ewk_view_layout,
3992 scroller_w, scroller_h);
3996 #if defined(HORIZONTAL_UI)
3997 Evas_Object *edit_field_entry;
3998 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
3999 Ecore_IMF_Context *ic = (Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry);
4000 /* If the keypad from webkit is invoked in landscape mode, the visible viewport is too narrow.
4001 * So, hide the url bar in browser scroller by bring in.
4002 * The direct bring in call doesn't work, so do it by idler. */
4003 if (ic && browser_view->is_landscape()) {
4004 Ecore_IMF_Input_Panel_State imf_state = ecore_imf_context_input_panel_state_get(ic);
4005 /* Strangley, The state of webkit's imf is show-state even if the ic is url entry.
4006 * However, this is good for browser without webkit's ic get API. */
4007 if (imf_state == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
4008 browser_view->_enable_browser_scroller_scroll();
4009 ecore_idler_add(__scroller_bring_in_idler_cb, browser_view);
4014 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
4015 BROWSER_LOGD("close multi window");
4016 browser_view->m_is_multi_window_grid_mode = m_data_manager->get_multi_window_view()->_is_grid_mode();
4017 m_data_manager->get_multi_window_view()->close_multi_window();
4019 #if defined(HORIZONTAL_UI)
4020 if (browser_view->m_multi_window_rotate_timer)
4021 ecore_timer_del(browser_view->m_multi_window_rotate_timer);
4022 browser_view->m_multi_window_rotate_timer = ecore_timer_add(0.2, __rotate_multi_window_cb, browser_view);
4029 Eina_Bool Browser_View::__zoom_button_timeout_cb(void *data)
4031 BROWSER_LOGD("[%s]", __func__);
4033 return ECORE_CALLBACK_CANCEL;
4035 Browser_View *browser_view = (Browser_View *)data;
4036 browser_view->m_zoom_button_timer = NULL;
4038 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,zoom_buttons,signal", "");
4040 return ECORE_CALLBACK_CANCEL;
4043 void Browser_View::__zoom_out_clicked_cb(void *data, Evas_Object *obj, void *event_info)
4045 BROWSER_LOGD("[%s]", __func__);
4049 Browser_View *browser_view = (Browser_View *)data;
4050 double scale_factor = ewk_view_scale_get(browser_view->m_focused_window->m_ewk_view);
4051 ewk_view_scale_set(browser_view->m_focused_window->m_ewk_view, scale_factor - 0.5f, 0, 0);
4053 if (browser_view->m_zoom_button_timer)
4054 ecore_timer_del(browser_view->m_zoom_button_timer);
4055 browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
4058 void Browser_View::__zoom_in_clicked_cb(void *data, Evas_Object *obj, void *event_info)
4060 BROWSER_LOGD("[%s]", __func__);
4064 Browser_View *browser_view = (Browser_View *)data;
4065 double scale_factor = ewk_view_scale_get(browser_view->m_focused_window->m_ewk_view);
4066 ewk_view_scale_set(browser_view->m_focused_window->m_ewk_view, scale_factor + 0.5f, 0, 0);
4068 if (browser_view->m_zoom_button_timer)
4069 ecore_timer_del(browser_view->m_zoom_button_timer);
4070 browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
4073 Eina_Bool Browser_View::_create_zoom_buttons(void)
4075 BROWSER_LOGD("[%s]", __func__);
4076 m_zoom_out_button = elm_button_add(m_navi_bar);
4077 if (!m_zoom_out_button) {
4078 BROWSER_LOGE("elm_button_add failed");
4081 elm_object_style_set(m_zoom_out_button, "browser/zoom_out");
4082 elm_object_part_content_set(m_main_layout, "elm.swallow.zoom_out_button", m_zoom_out_button);
4083 evas_object_smart_callback_add(m_zoom_out_button, "clicked", __zoom_out_clicked_cb, this);
4084 evas_object_show(m_zoom_out_button);
4086 m_zoom_in_button = elm_button_add(m_navi_bar);
4087 if (!m_zoom_in_button) {
4088 BROWSER_LOGE("elm_button_add failed");
4092 elm_object_style_set(m_zoom_in_button, "browser/zoom_in");
4093 elm_object_part_content_set(m_main_layout, "elm.swallow.zoom_in_button", m_zoom_in_button);
4094 evas_object_smart_callback_add(m_zoom_in_button, "clicked", __zoom_in_clicked_cb, this);
4095 evas_object_show(m_zoom_in_button);
4101 void Browser_View::__naviframe_pop_finished_cb(void *data , Evas_Object *obj, void *event_info)
4103 BROWSER_LOGD("[%s]", __func__);
4107 Browser_View *browser_view = (Browser_View *)data;
4108 Elm_Object_Item *it = (Elm_Object_Item *)event_info;
4110 if (browser_view->m_navi_it != elm_naviframe_top_item_get(m_navi_bar))
4113 m_data_manager->destroy_bookmark_view();
4114 m_data_manager->destroy_history_layout();
4115 /* Add to bookmark, then cancel. */
4116 m_data_manager->destroy_add_to_bookmark_view();
4117 #if defined(FEATURE_MOST_VISITED_SITES)
4118 m_data_manager->destroy_add_to_most_visited_sites_view();
4121 /* If return from browser settings. */
4122 if (browser_view->m_browser_settings) {
4123 delete browser_view->m_browser_settings;
4124 browser_view->m_browser_settings = NULL;
4128 void Browser_View::__dim_area_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
4130 BROWSER_LOGD("[%s]", __func__);
4134 Browser_View *browser_view = (Browser_View *)data;
4136 elm_object_focus_set(m_data_manager->get_browser_view()->m_option_header_cancel_button, EINA_TRUE);
4139 void Browser_View::__context_menu_bg_mouse_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
4141 BROWSER_LOGD("[%s]", __func__);
4145 Browser_View *browser_view = (Browser_View *)data;
4147 browser_view->_destroy_more_context_popup();
4150 Eina_Bool Browser_View::_create_main_layout(void)
4152 BROWSER_LOGD("[%s]", __func__);
4153 m_main_layout = elm_layout_add(m_navi_bar);
4154 if (!m_main_layout) {
4155 BROWSER_LOGE("elm_layout_add failed!");
4159 if (!elm_layout_file_set(m_main_layout, BROWSER_EDJE_DIR"/browser-view-main.edj",
4160 "browser/browser-view-main")) {
4161 BROWSER_LOGE("elm_layout_file_set failed", BROWSER_EDJE_DIR);
4165 evas_object_size_hint_weight_set(m_main_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4166 evas_object_size_hint_align_set(m_main_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
4167 evas_object_show(m_main_layout);
4169 m_title_back_button = elm_button_add(m_navi_bar);
4170 if (!m_title_back_button) {
4171 BROWSER_LOGE("elm_button_add failed!");
4174 evas_object_smart_callback_add(m_title_back_button, "clicked", __title_back_button_clicked_cb, this);
4176 m_navi_it = elm_naviframe_item_push(m_navi_bar, "", NULL, NULL, m_main_layout, NULL);
4178 evas_object_smart_callback_add(m_navi_bar, "transition,finished", __naviframe_pop_finished_cb, this);
4180 elm_object_style_set(m_title_back_button, "browser/title_back");
4181 elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_TITLE_LEFT_BTN, m_title_back_button);
4183 evas_object_show(m_title_back_button);
4184 evas_object_show(m_navi_bar);
4186 m_scroller = elm_scroller_add(m_navi_bar);
4188 BROWSER_LOGE("elm_scroller_add failed!");
4191 /* Do not propagate event to scroller's ancestor */
4192 /* not to call unnecessary other callbacks. */
4193 evas_object_propagate_events_set(m_scroller, EINA_FALSE);
4195 /* Do not use scroller's scrollbar, use webview's scrollbar instead */
4196 elm_scroller_policy_set(m_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
4197 evas_object_size_hint_align_set(m_scroller, EVAS_HINT_FILL, 0.0);
4198 evas_object_size_hint_weight_set(m_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4199 #ifdef BROWSER_SCROLLER_BOUNCING
4200 // elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_TRUE);
4201 elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_FALSE);
4203 elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_FALSE);
4204 elm_object_scroll_freeze_pop(m_scroller);
4205 elm_object_scroll_freeze_push(m_scroller);
4207 evas_object_show(m_scroller);
4209 evas_object_smart_callback_add(m_scroller, "scroll", __scroller_scroll_cb, this);
4210 evas_object_event_callback_add(m_scroller, EVAS_CALLBACK_RESIZE, __scroller_resize_cb, this);
4212 /* create content box which contains navigation layout & webview */
4213 m_content_box = elm_box_add(m_main_layout);
4214 if (!m_content_box) {
4215 BROWSER_LOGE("elm_box_add failed!");
4219 elm_box_horizontal_set(m_content_box, EINA_FALSE);
4220 evas_object_size_hint_weight_set(m_content_box, EVAS_HINT_EXPAND, 0.0);
4221 evas_object_size_hint_align_set(m_content_box, EVAS_HINT_FILL, EVAS_HINT_FILL);
4222 elm_object_content_set(m_scroller, m_content_box);
4223 evas_object_show(m_content_box);
4225 /* create dummy loading progress bar which is displayed at launching time shortly */
4226 m_dummy_loading_progressbar = elm_progressbar_add(m_navi_bar);
4227 if (!m_dummy_loading_progressbar) {
4228 BROWSER_LOGE("elm_progressbar_add failed!");
4232 elm_object_style_set(m_dummy_loading_progressbar, "browser/loading_wheel");
4233 elm_progressbar_pulse(m_dummy_loading_progressbar, EINA_TRUE);
4234 evas_object_size_hint_weight_set(m_dummy_loading_progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4235 evas_object_size_hint_align_set(m_dummy_loading_progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
4236 elm_object_part_content_set(m_main_layout, "elm.swallow.waiting_progress", m_dummy_loading_progressbar);
4237 evas_object_show(m_dummy_loading_progressbar);
4239 /* create conformant */
4240 elm_win_conformant_set(m_win, EINA_TRUE);
4241 m_conformant = elm_conformant_add(m_main_layout);
4242 if (!m_conformant) {
4243 BROWSER_LOGE("elm_conformant_add failed!");
4247 elm_object_style_set(m_conformant, "internal_layout");
4248 evas_object_size_hint_weight_set(m_conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4249 evas_object_size_hint_align_set(m_conformant, EVAS_HINT_FILL, EVAS_HINT_FILL);
4250 elm_object_content_set(m_conformant, m_scroller);
4251 elm_object_part_content_set(m_main_layout, "elm.swallow.content", m_conformant);
4252 evas_object_show(m_conformant);
4254 m_url_layout = _create_url_layout();
4255 if (!m_url_layout) {
4256 BROWSER_LOGE("_create_url_layout failed!");
4259 elm_box_pack_start(m_content_box, m_url_layout);
4261 m_control_bar = _create_control_bar();
4262 if (!m_control_bar) {
4263 BROWSER_LOGE("_create_control_bar failed!");
4266 elm_object_part_content_set(m_main_layout, "elm.swallow.control_bar", m_control_bar);
4268 m_option_header_url_layout = _create_option_header_url_layout();
4269 if (!m_option_header_url_layout) {
4270 BROWSER_LOGE("_create_option_header_url_layout failed!");
4274 m_option_header_layout = elm_layout_add(m_navi_bar);
4275 if (!m_option_header_layout) {
4276 BROWSER_LOGE("elm_layout_add failed!");
4279 if (!elm_layout_file_set(m_option_header_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
4280 "browser-view/option_header")) {
4281 BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
4284 evas_object_size_hint_weight_set(m_option_header_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4285 evas_object_size_hint_align_set(m_option_header_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
4287 elm_object_part_content_set(m_option_header_layout, "elm.swallow.url_layout", m_option_header_url_layout);
4288 evas_object_show(m_option_header_layout);
4290 m_option_header_find_word_layout = _create_find_word_layout();
4291 if (!m_option_header_find_word_layout) {
4292 BROWSER_LOGE("_create_find_word_layout failed");
4295 elm_object_part_content_set(m_option_header_layout, "elm.swallow.find_word_layout", m_option_header_find_word_layout);
4297 elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER, m_option_header_layout);
4298 _navigationbar_visible_set_signal(EINA_FALSE);
4301 if (!_create_zoom_buttons()) {
4302 BROWSER_LOGE("_create_zoom_buttons failed");
4307 edje_object_signal_callback_add(elm_layout_edje_get(m_main_layout),
4308 "mouse,clicked,1", "elm.rect.content_dim", __dim_area_clicked_cb, this);
4310 edje_object_signal_callback_add(elm_layout_edje_get(m_main_layout),
4311 "mouse,down,1", "elm.rect.more_context_bg", __context_menu_bg_mouse_down_cb, this);
4313 const char *current_theme = elm_theme_get(NULL);
4314 if (current_theme && strstr(current_theme, "white")) {
4316 // edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "black_theme,signal", "");
4317 // edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
4318 // "black_theme,signal", "");