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)
94 ,m_multi_window_button(NULL)
95 ,m_new_window_button(NULL)
96 ,m_is_full_screen(EINA_FALSE)
98 ,m_zoom_in_button(NULL)
99 ,m_zoom_out_button(NULL)
100 ,m_zoom_button_timer(NULL)
102 ,m_title_backward_button(NULL)
103 ,m_title_forward_button(NULL)
104 ,m_option_header_title_backward_button(NULL)
105 ,m_option_header_title_forward_button(NULL)
106 ,m_resize_idler(NULL)
107 ,m_is_private(EINA_FALSE)
108 ,m_private_check(NULL)
109 ,m_is_private_item_pressed(EINA_FALSE)
110 ,m_bookmark_on_off_icon(NULL)
111 ,m_brightness_control_bar(NULL)
112 ,m_brightness_auto_it(NULL)
113 ,m_brightness_manual_it(NULL)
114 ,m_default_seg_it(NULL)
116 ,m_medium_seg_it(NULL)
118 ,m_vibration_device_handle_id(-1)
119 ,m_is_multi_window_grid_mode(EINA_FALSE)
121 BROWSER_LOGD("[%s]", __func__);
123 m_navi_bar = navi_bar;
128 Browser_View::~Browser_View()
130 BROWSER_LOGD("[%s]", __func__);
131 if (m_title_back_button)
132 evas_object_del(m_title_back_button);
136 br_preference_set_str(LAST_VISITED_URL_KEY, m_last_visited_url.c_str());
138 m_data_manager->destroy_history_db();
139 m_data_manager->destroy_geolocation_db();
141 if (m_data_manager) {
142 delete m_data_manager;
143 m_data_manager = NULL;
145 #if defined(FEATURE_MOST_VISITED_SITES)
146 if (m_most_visited_sites) {
147 delete m_most_visited_sites;
148 m_most_visited_sites = NULL;
150 if (m_most_visited_sites_db) {
151 delete m_most_visited_sites_db;
152 m_most_visited_sites_db = NULL;
155 if (m_new_window_transit) {
156 elm_transit_del(m_new_window_transit);
157 m_new_window_transit = NULL;
159 if (m_browser_settings) {
160 delete m_browser_settings;
161 m_browser_settings = NULL;
167 if (m_context_menu) {
168 delete m_context_menu;
169 m_context_menu = NULL;
171 if (m_scissorbox_view) {
172 delete m_scissorbox_view;
173 m_scissorbox_view = NULL;
175 #if defined(HORIZONTAL_UI)
176 if (m_multi_window_rotate_timer) {
177 ecore_timer_del(m_multi_window_rotate_timer);
178 m_multi_window_rotate_timer = NULL;
182 if (m_zoom_in_button)
183 evas_object_del(m_zoom_in_button);
184 if (m_zoom_out_button)
185 evas_object_del(m_zoom_out_button);
186 if (m_zoom_button_timer) {
187 ecore_timer_del(m_zoom_button_timer);
188 m_zoom_button_timer = NULL;
193 Eina_Bool Browser_View::init(void)
195 BROWSER_LOGD("[%s]", __func__);
196 /* set homepage from homepage vconf */
197 _set_homepage_mode();
199 m_data_manager = new(nothrow) Browser_Data_Manager;
200 if (!m_data_manager) {
201 BROWSER_LOGE("new Browser_Data_Manager failed");
205 m_data_manager->set_browser_view(this);
207 if (!m_data_manager->create_history_db()) {
208 BROWSER_LOGE("m_data_manager->create_history_db failed");
212 if (!m_data_manager->create_geolocation_db()) {
213 BROWSER_LOGE("m_data_manager->create_geolocation_db failed");
217 #if defined(FEATURE_MOST_VISITED_SITES)
218 m_most_visited_sites_db = new(nothrow) Most_Visited_Sites_DB;
219 if (!m_most_visited_sites_db) {
220 BROWSER_LOGE("new Most_Visited_Sites_DB failed");
225 m_find_word = new(nothrow) Browser_Find_Word(this);
227 BROWSER_LOGE("new Browser_Find_Word failed");
231 m_context_menu = new(nothrow) Browser_Context_Menu(this);
232 if (!m_context_menu) {
233 BROWSER_LOGE("new Browser_Context_Menu failed");
237 UG_INIT_EFL(m_win, UG_OPT_INDICATOR_ENABLE);
239 char *last_url = NULL;
240 if (br_preference_get_str(LAST_VISITED_URL_KEY, &last_url) == false) {
241 BROWSER_LOGE("failed to get %s preference", LAST_VISITED_URL_KEY);
245 m_last_visited_url = std::string(last_url);
248 if (_haptic_device_init() == EINA_FALSE) {
249 BROWSER_LOGE("Failed to init haptic device");
253 /* create brower view layout */
254 return _create_main_layout();
257 void Browser_View::launch(const char *url)
259 /* Destroy all other views except browser view. */
263 * When keypad is running via url entry, if browser goes to background by home key.
264 * Then relaunch the browser by aul. The webpage is loading but the keypad is still running.
265 * So give focus to cancel button not to invoke the keypad. */
266 elm_object_focus_set(m_cancel_button, EINA_TRUE);
268 if (url && strlen(url))
270 #if defined(FEATURE_MOST_VISITED_SITES)
271 else if (m_homepage_mode == BR_START_MODE_MOST_VISITED_SITES)
272 load_url(BROWSER_MOST_VISITED_SITES_URL);
274 else if (m_homepage_mode == BR_START_MODE_RECENTLY_VISITED_SITE) {
275 char *homepage = NULL;
276 if (br_preference_get_str(LAST_VISITED_URL_KEY, &homepage) == false) {
277 BROWSER_LOGD("failed to get %s preference", LAST_VISITED_URL_KEY);
284 #if defined(FEATURE_MOST_VISITED_SITES)
285 load_url(BROWSER_MOST_VISITED_SITES_URL);
287 load_url(BROWSER_BLANK_PAGE_URL);
289 } else if (m_homepage_mode == BR_START_MODE_CUSTOMIZED_URL) {
290 char *user_homepage = NULL;
291 if (br_preference_get_str(USER_HOMEPAGE_KEY, &user_homepage) ==false) {
292 BROWSER_LOGE("failed to get %s preference\n", USER_HOMEPAGE_KEY);
296 load_url(user_homepage);
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_EMPTY_PAGE) {
305 load_url(BROWSER_BLANK_PAGE_URL);
310 void Browser_View::set_full_sreen(Eina_Bool enable)
312 BROWSER_LOGD("[%s]", __func__);
314 if (m_is_full_screen == enable)
317 m_is_full_screen = enable;
319 if (m_is_full_screen) {
320 elm_win_indicator_mode_set(m_win, ELM_WIN_INDICATOR_HIDE);
321 _hide_scroller_url_layout();
322 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "enter,full_screen,signal", "");
323 _enable_webview_scroll();
325 elm_object_part_content_unset(m_focused_window->m_ewk_view_layout, "elm.swallow.webview");
327 evas_object_move(m_focused_window->m_ewk_view, 0, 0);
329 elm_win_indicator_mode_set(m_win, ELM_WIN_INDICATOR_SHOW);
331 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "exit,full_screen,signal", "");
333 elm_object_part_content_set(m_focused_window->m_ewk_view_layout, "elm.swallow.webview", m_focused_window->m_ewk_view);
335 _navigationbar_visible_set_signal(EINA_TRUE);
338 ecore_idler_add(__webview_layout_resize_idler_cb, this);
341 #if defined(FEATURE_MOST_VISITED_SITES)
342 Eina_Bool Browser_View::is_most_visited_sites_running(void)
344 if (m_most_visited_sites)
351 void Browser_View::return_to_browser_view(Eina_Bool saved_most_visited_sites_item)
353 BROWSER_LOGD("[%s]", __func__);
355 if (!_is_loading()) {
356 if (get_title().empty())
357 _set_navigationbar_title(get_url().c_str());
359 _set_navigationbar_title(get_title().c_str());
361 #if defined(FEATURE_MOST_VISITED_SITES)
362 if (is_most_visited_sites_running()) {
363 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
364 "show,control_bar,no_animation,signal", "");
365 _set_navigationbar_title(BR_STRING_MOST_VISITED_SITES);
367 if (saved_most_visited_sites_item && is_most_visited_sites_running())
368 /* If longpress on speed dial item, then add to bookmark. */
369 edje_object_signal_emit(elm_layout_edje_get(m_most_visited_sites->m_selected_item->layout),
370 "bookmark_icon", "");
376 void Browser_View::_pop_other_views(void)
378 BROWSER_LOGD("[%s]", __func__);
379 _destroy_more_context_popup();
381 /* if browser is runing background behind ug which browser invoked,
382 destroy the previous ug and show the browser view. */
385 /* If multi-window is running, destroy it to show browser view. */
386 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
387 m_data_manager->get_multi_window_view()->close_multi_window();
389 /* Pop all other views except browser view. */
390 elm_naviframe_item_pop_to(m_navi_it);
392 if (m_scissorbox_view)
393 _destroy_scissorbox_view();
396 /* set homepage from homepage vconf */
397 void Browser_View::_set_homepage_mode(void)
399 char *homepage = NULL;
400 if (br_preference_get_str(HOMEPAGE_KEY, &homepage) == false) {
401 BROWSER_LOGE("failed to get %s preference\n", HOMEPAGE_KEY);
404 BROWSER_LOGD("homepage=[%s]", homepage);
407 BROWSER_LOGE("homepage is null");
408 #if defined(FEATURE_MOST_VISITED_SITES)
409 m_homepage_mode = BR_START_MODE_MOST_VISITED_SITES;
411 m_homepage_mode = BR_START_MODE_EMPTY_PAGE;
416 #if defined(FEATURE_MOST_VISITED_SITES)
417 if (!strncmp(homepage, MOST_VISITED_SITES,
418 strlen(MOST_VISITED_SITES)))
419 m_homepage_mode = BR_START_MODE_MOST_VISITED_SITES;
422 if (!strncmp(homepage, RECENTLY_VISITED_SITE,
423 strlen(RECENTLY_VISITED_SITE)))
424 m_homepage_mode = BR_START_MODE_RECENTLY_VISITED_SITE;
425 else if (!strncmp(homepage, EMPTY_PAGE,
427 m_homepage_mode = BR_START_MODE_EMPTY_PAGE;
429 m_homepage_mode = BR_START_MODE_CUSTOMIZED_URL;
432 BROWSER_LOGD("m_homepage_mode=%d", m_homepage_mode);
435 void Browser_View::__new_window_transit_finished_cb(void *data, Elm_Transit *transit)
437 BROWSER_LOGD("[%s]", __func__);
441 Browser_View *browser_view = (Browser_View *)data;
442 if (!browser_view->m_new_window_transit)
445 browser_view->m_new_window_transit = NULL;
446 browser_view->m_browser->set_focused_window(browser_view->m_created_new_window
447 #if defined(FEATURE_MOST_VISITED_SITES)
451 browser_view->m_created_new_window = NULL;
454 Eina_Bool Browser_View::_show_new_window_effect(Evas_Object *current_ewk_view,
455 Evas_Object *new_ewk_view)
461 elm_scroller_region_get(m_scroller, &scroller_x, &scroller_y, &scroller_w, &scroller_h);
462 elm_scroller_region_show(m_scroller ,scroller_x, 0, scroller_w, scroller_h);
464 m_browser->set_focused_window(m_created_new_window
465 #if defined(FEATURE_MOST_VISITED_SITES)
473 Evas_Object *Browser_View::get_favicon(const char *url)
475 if (!url || !strlen(url))
478 Ewk_Context* context = ewk_view_context_get(m_focused_window->m_ewk_view);
479 Evas_Object *favicon = ewk_context_icon_database_icon_object_add(context, url, evas_object_evas_get(m_focused_window->m_ewk_view));
484 Eina_Bool Browser_View::_set_favicon(void)
486 BROWSER_LOGD("[%s]", __func__);
488 if (m_edit_mode == BR_URL_ENTRY_EDIT_MODE
489 || m_edit_mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
490 BROWSER_LOGD("Edit mode");
494 #if defined(FEATURE_MOST_VISITED_SITES)
495 if (is_most_visited_sites_running()) {
496 BROWSER_LOGD("is_most_visited_sites_running");
501 double progress = ewk_view_load_progress_get(m_focused_window->m_ewk_view);
502 if (progress < 1.0f && progress > 0.05f) {
503 BROWSER_LOGD("loadin status");
507 Evas_Object *favicon = get_favicon(get_url().c_str());
508 Evas_Object *option_header_favicon = get_favicon(get_url().c_str());
511 if (m_focused_window->m_favicon)
512 evas_object_del(m_focused_window->m_favicon);
514 m_focused_window->m_favicon = favicon;
516 Evas_Object *default_icon = elm_icon_add(m_focused_window->m_ewk_view);
518 BROWSER_LOGE("elm_icon_add is failed.");
521 if (!elm_icon_file_set(default_icon, BROWSER_IMAGE_DIR"/faviconDefault.png", NULL)) {
522 BROWSER_LOGE("elm_icon_file_set is failed.");
525 evas_object_size_hint_aspect_set(default_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
526 if (m_focused_window->m_favicon)
527 evas_object_del(m_focused_window->m_favicon);
529 m_focused_window->m_favicon = default_icon;
532 if (option_header_favicon) {
533 if (m_focused_window->m_option_header_favicon)
534 evas_object_del(m_focused_window->m_option_header_favicon);
536 m_focused_window->m_option_header_favicon = option_header_favicon;
538 Evas_Object *default_icon = elm_icon_add(m_focused_window->m_ewk_view);
540 BROWSER_LOGE("elm_icon_add is failed.");
543 if (!elm_icon_file_set(default_icon, BROWSER_IMAGE_DIR"/faviconDefault.png", NULL)) {
544 BROWSER_LOGE("elm_icon_file_set is failed.");
547 evas_object_size_hint_aspect_set(default_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
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 = default_icon;
554 if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
555 elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
556 if (elm_object_part_content_get(m_option_header_url_entry_layout,
557 "elm.swallow.favicon"))
558 elm_object_part_content_unset(m_option_header_url_entry_layout,
559 "elm.swallow.favicon");
561 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.favicon",
562 m_focused_window->m_favicon);
563 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.favicon",
564 m_focused_window->m_option_header_favicon);
566 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
567 "show,favicon,signal", "");
568 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
569 "show,favicon,signal", "");
576 Eina_Bool Browser_View::__close_window_idler_cb(void *data)
578 BROWSER_LOGD("[%s]", __func__);
580 return ECORE_CALLBACK_CANCEL;
582 Browser_View *browser_view = (Browser_View *)data;
583 Browser_Class *browser = browser_view->m_browser;
585 if (browser_view->m_focused_window->m_parent)
586 browser->delete_window(browser_view->m_focused_window,
587 browser_view->m_focused_window->m_parent);
589 browser->delete_window(browser_view->m_focused_window);
594 elm_scroller_region_get(browser_view->m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
595 elm_scroller_region_show(browser_view->m_scroller ,scroller_x, 0,
596 scroller_w, scroller_h);
597 return ECORE_CALLBACK_CANCEL;
600 void Browser_View::__close_window_cb(void *data, Evas_Object *obj, void *event_info)
602 BROWSER_LOGD("[%s]", __func__);
606 Browser_View *browser_view = (Browser_View *)data;
607 Browser_Class *browser = browser_view->m_browser;
609 /* The window should be deleted by idler. The webkit recommands to delete by idler. */
610 ecore_idler_add(__close_window_idler_cb, browser_view);
613 Eina_Bool Browser_View::_haptic_device_init(void)
615 BROWSER_LOGD("[%s]", __func__);
617 if (m_vibration_device_handle_id == BROWSER_HAPTIC_DEVICE_HANDLE) {
618 BROWSER_LOGD("device handle for haptic is already set");
622 if (haptic_initialize() != HAPTIC_ERROR_NONE) {
623 BROWSER_LOGD("failed to initiate haptic device");
627 m_vibration_device_handle_id = BROWSER_HAPTIC_DEVICE_HANDLE;
632 Eina_Bool Browser_View::_haptic_device_play(long haptic_play_time)
634 BROWSER_LOGD("[%s], requested time is [%dms]", __func__, haptic_play_time);
636 if (m_vibration_device_handle_id != BROWSER_HAPTIC_DEVICE_HANDLE) {
637 BROWSER_LOGD("device handle for haptic is not set. Unable to play haptic");
641 if (haptic_vibrate_monotone(BROWSER_HAPTIC_DEVICE_HANDLE, haptic_play_time, HAPTIC_LEVEL_AUTO) != HAPTIC_ERROR_NONE) {
642 BROWSER_LOGD("haptic_vibrate_monotone failed.");
649 Eina_Bool Browser_View::_haptic_device_stop(void)
651 BROWSER_LOGD("[%s]", __func__);
653 if (m_vibration_device_handle_id != BROWSER_HAPTIC_DEVICE_HANDLE) {
654 BROWSER_LOGD("device handle for haptic is not set. Unable to play haptic");
658 if (haptic_stop_device(BROWSER_HAPTIC_DEVICE_HANDLE) != HAPTIC_ERROR_NONE) {
659 BROWSER_LOGD("haptic_stop_device failed.");
666 Eina_Bool Browser_View::_haptic_device_close(void)
668 BROWSER_LOGD("[%s]", __func__);
670 if (haptic_deinitialize() != HAPTIC_ERROR_NONE) {
671 BROWSER_LOGD("haptic_deinitialize failed.");
678 void Browser_View::__create_window_cb(void *data, Evas_Object *obj, void *event_info)
680 BROWSER_LOGD("[%s]", __func__);
684 Browser_View *browser_view = (Browser_View *)data;
685 Browser_Class *browser = browser_view->m_browser;
687 std::vector<Browser_Window *> window_list = browser->get_window_list();
688 if (window_list.size() >= BROWSER_MULTI_WINDOW_MAX_COUNT) {
689 /* If the multi window is max, delete the first one. */
690 /* if the first window is focused, delete second one(oldest one except first one) */
691 if (browser_view->m_focused_window != window_list[0])
692 browser->delete_window(window_list[0]);
694 browser->delete_window(window_list[1]);
697 browser_view->m_created_new_window = browser->create_new_window();
698 if (!browser_view->m_created_new_window) {
699 BROWSER_LOGE("create_new_window failed");
702 /* initialize the created webview first to connect ewk event callback functions such as load start, progress etc. */
703 browser->ewk_view_init(browser_view->m_created_new_window->m_ewk_view);
705 /* Set the caller window. */
706 browser_view->m_created_new_window->m_parent = browser_view->m_focused_window;
708 /* Destroy previous multi window item snapshot.
709 * This is because the snapshot of multi window item can't be captured in this case. */
710 #if defined(HORIZONTAL_UI)
711 if (browser_view->m_focused_window->m_landscape_snapshot_image) {
712 evas_object_del(browser_view->m_focused_window->m_landscape_snapshot_image);
713 browser_view->m_focused_window->m_landscape_snapshot_image = NULL;
716 if (browser_view->m_focused_window->m_portrait_snapshot_image) {
717 evas_object_del(browser_view->m_focused_window->m_portrait_snapshot_image);
718 browser_view->m_focused_window->m_portrait_snapshot_image = NULL;
721 if (!browser_view->_show_new_window_effect(browser_view->m_focused_window->m_ewk_view,
722 browser_view->m_created_new_window->m_ewk_view))
723 BROWSER_LOGE("_show_new_window_effect failed");
725 *((Evas_Object **)event_info) = browser_view->m_created_new_window->m_ewk_view;
728 void Browser_View::__load_started_cb(void *data, Evas_Object *obj, void *event_info)
730 BROWSER_LOGD("[%s]", __func__);
734 Browser_View *browser_view = (Browser_View *)data;
735 Evas_Object *url_progressbar = browser_view->m_url_progressbar;
736 Evas_Object *progressbar_wheel = browser_view->m_url_progresswheel;
737 Evas_Object *option_header_url_progressbar = browser_view->m_option_header_url_progressbar;
738 Evas_Object *option_header_progressbar_wheel = browser_view->m_option_header_url_progresswheel;
740 double progress = ewk_view_load_progress_get(browser_view->m_focused_window->m_ewk_view);
741 if (progress <= 0.0f)
743 elm_progressbar_pulse(progressbar_wheel, EINA_TRUE);
744 elm_progressbar_pulse(option_header_progressbar_wheel, EINA_TRUE);
746 elm_progressbar_value_set(url_progressbar, progress);
747 elm_progressbar_value_set(option_header_url_progressbar, progress);
749 browser_view->_load_start();
752 void Browser_View::_navigationbar_visible_set_signal(Eina_Bool visible)
754 BROWSER_LOGD("visible=%d", visible);
756 if (visible && (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW) || m_is_full_screen || m_brightness_control_bar))
759 if (m_navi_it != elm_naviframe_top_item_get(m_navi_bar))
762 evas_object_data_set(m_navi_bar, "visible", (Eina_Bool *)visible);
764 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
767 elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_INSTANT_OPEN);
769 elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_INSTANT_CLOSE);
772 void Browser_View::_navigationbar_visible_set(Eina_Bool visible)
774 if (visible && (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW) || m_is_full_screen))
777 if (m_navi_it != elm_naviframe_top_item_get(m_navi_bar))
780 evas_object_data_set(m_navi_bar, "visible", (Eina_Bool *)visible);
782 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
784 elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_OPEN);
786 elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_CLOSE);
789 Eina_Bool Browser_View::_navigationbar_visible_get(void)
791 Eina_Bool* visible = (Eina_Bool *)evas_object_data_get(m_navi_bar, "visible");
792 BROWSER_LOGD("visible = %d", visible);
793 if (visible == (Eina_Bool *)EINA_TRUE)
799 void Browser_View::_load_start(void)
801 BROWSER_LOGD("[%s]", __func__);
803 if (m_dummy_loading_progressbar) {
804 elm_object_part_content_unset(m_main_layout, "elm.swallow.waiting_progress");
805 evas_object_del(m_dummy_loading_progressbar);
806 m_dummy_loading_progressbar = NULL;
807 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
808 "hide,waiting_progressbar,signal", "");
811 if (!m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
812 _set_navigationbar_title(BR_STRING_LOADING);
814 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,on,signal", "");
815 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
816 "loading,on,signal", "");
818 _navigationbar_visible_set_signal(EINA_TRUE);
820 /* Hide the secure lock icon in title bar. */
821 elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_ICON, NULL);
823 /* Destroy & hide favicon when load start. */
824 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
825 "hide,favicon,signal", "");
826 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
827 "hide,favicon,signal", "");
828 if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
829 elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
830 if (elm_object_part_content_get(m_option_header_url_entry_layout,
831 "elm.swallow.favicon"))
832 elm_object_part_content_unset(m_option_header_url_entry_layout,
833 "elm.swallow.favicon");
835 if (m_focused_window->m_favicon) {
836 evas_object_del(m_focused_window->m_favicon);
837 m_focused_window->m_favicon = NULL;
839 if (m_focused_window->m_option_header_favicon) {
840 evas_object_del(m_focused_window->m_option_header_favicon);
841 m_focused_window->m_option_header_favicon = NULL;
844 /* This makes the ewk view unfocused so that the ime can't be invoked. */
845 evas_object_focus_set(m_focused_window->m_ewk_view_layout, EINA_TRUE);
847 if (_get_edit_mode() != BR_NO_EDIT_MODE)
848 _set_edit_mode(BR_NO_EDIT_MODE);
850 /* For deleted window because of unused case like low memory. */
851 m_focused_window->m_url.clear();
852 m_focused_window->m_title.clear();
854 set_full_sreen(EINA_FALSE);
856 elm_object_focus_set(m_option_header_cancel_button, EINA_TRUE);
857 elm_object_signal_emit(m_option_header_url_edit_field, "ellipsis_show,signal", "elm");
858 elm_object_signal_emit(m_url_edit_field, "ellipsis_show,signal", "elm");
860 if (m_scissorbox_view)
861 _destroy_scissorbox_view();
862 _destroy_more_context_popup();
865 void Browser_View::__load_committed_cb(void *data, Evas_Object *obj, void *event_info)
867 BROWSER_LOGD("[%s]", __func__);
871 Browser_View *browser_view = (Browser_View *)data;
872 if (browser_view->_get_edit_mode() != BR_NO_EDIT_MODE)
875 browser_view->_set_url_entry(browser_view->get_url().c_str());
878 void Browser_View::__load_nonempty_layout_finished_cb(void *data, Evas_Object *obj, void *event_info)
880 BROWSER_LOGD("[%s]", __func__);
884 Browser_View *browser_view = (Browser_View *)data;
886 if (!browser_view->_is_loading())
889 #ifdef BROWSER_SCROLLER_BOUNCING
890 /* If the first content is displayed, hide the url layout in browser scroller like safari. */
894 elm_scroller_region_get(browser_view->m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
895 elm_scroller_region_show(browser_view->m_scroller ,scroller_x, 0,
896 scroller_w, scroller_h);
900 void Browser_View::__title_changed_cb(void *data, Evas_Object *obj, void *event_info)
902 BROWSER_LOGD("[%s]", __func__);
906 Browser_View *browser_view = (Browser_View *)data;
907 if (browser_view->_get_edit_mode() != BR_NO_EDIT_MODE)
910 if (!m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
911 browser_view->_set_navigationbar_title(browser_view->get_title().c_str());
914 void Browser_View::__load_finished_cb(void *data, Evas_Object *obj, void *event_info)
916 BROWSER_LOGD("[%s]", __func__);
920 Browser_View *browser_view = (Browser_View *)data;
921 Evas_Object *progressbar_wheel = browser_view->m_url_progresswheel;
922 Evas_Object *option_header_progressbar_wheel = browser_view->m_option_header_url_progresswheel;
924 elm_progressbar_pulse(progressbar_wheel, EINA_FALSE);
925 elm_progressbar_pulse(option_header_progressbar_wheel, EINA_FALSE);
928 * For the first time, the background color is white initially.
929 * If the background is not displayed yet, show the grey background.
930 * This code is executed only one time at launching time.
932 const char* state = edje_object_part_state_get(elm_layout_edje_get(browser_view->m_main_layout),
933 "contents_bg", NULL);
934 if(state && !strncmp(state, "default", strlen("default")))
935 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout),
936 "show,grey_background,signal", "");
938 if (browser_view->m_edit_mode != BR_URL_ENTRY_EDIT_MODE
939 && browser_view->m_edit_mode != BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
940 /* change the url layout for normal mode. (change the reload icon etc) */
941 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "loading,off,signal", "");
942 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout),
943 "loading,off,signal", "");
946 if (!m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
947 browser_view->_set_navigationbar_title(browser_view->get_title().c_str());
950 * finish progress event can be come after finish progress frame event at some pages.
951 * In this case, the title & favicon display error happens, becaue these are handled in finish progress frame.
952 * So do that again here. */
953 if (!browser_view->_set_favicon())
954 BROWSER_LOGE("_set_favicon failed");
955 browser_view->_set_secure_icon();
956 browser_view->_load_finished();
959 static Eina_Bool __kill_browser_timer_cb(void *data)
962 return ECORE_CALLBACK_CANCEL;
965 void Browser_View::__process_crashed_cb(void *data, Evas_Object *obj, void *event_info)
967 BROWSER_LOGD("[%s]", __func__);
971 Browser_View *browser_view = (Browser_View *)data;
972 browser_view->show_msg_popup(BR_STRING_WEBPROCESS_CRASH, 3);
973 ecore_timer_add(3, __kill_browser_timer_cb, NULL);
976 void Browser_View::__did_finish_load_for_frame_cb(void *data, Evas_Object *obj, void *event_info)
981 Browser_View *browser_view = (Browser_View *)data;
983 if (!m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
984 browser_view->_set_navigationbar_title(browser_view->get_title().c_str());
986 browser_view->_load_finished();
989 void Browser_View::_set_secure_icon(void)
991 std::string url = get_url();
992 BROWSER_LOGD("url=[%s]", url.c_str());
994 if (m_focused_window->m_secure_icon == NULL) {
995 m_focused_window->m_secure_icon = elm_icon_add(m_focused_window->m_ewk_view);
996 if (!m_focused_window->m_secure_icon) {
997 BROWSER_LOGE("elm_icon_add is failed.");
1001 if (!elm_icon_file_set(m_focused_window->m_secure_icon, BROWSER_IMAGE_DIR"/lock.png", NULL)) {
1002 BROWSER_LOGE("elm_icon_file_set is failed.");
1005 evas_object_size_hint_aspect_set(m_focused_window->m_secure_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1006 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.secure_icon",
1007 m_focused_window->m_secure_icon);
1010 if (m_focused_window->m_option_header_secure_icon == NULL) {
1011 m_focused_window->m_option_header_secure_icon = elm_icon_add(m_focused_window->m_ewk_view);
1012 if (!m_focused_window->m_option_header_secure_icon) {
1013 BROWSER_LOGE("elm_icon_add is failed.");
1017 if (!elm_icon_file_set(m_focused_window->m_option_header_secure_icon, BROWSER_IMAGE_DIR"/lock.png", NULL)) {
1018 BROWSER_LOGE("elm_icon_file_set is failed.");
1021 evas_object_size_hint_aspect_set(m_focused_window->m_option_header_secure_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1022 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.secure_icon",
1023 m_focused_window->m_option_header_secure_icon);
1026 if (url.c_str() && url.length()) {
1027 if (!strncmp(url.c_str(), BROWSER_HTTPS_SCHEME, strlen(BROWSER_HTTPS_SCHEME))) {
1028 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1029 "show,secure_icon,signal", "");
1030 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1031 "show,secure_icon,signal", "");
1035 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "hide,secure_icon,signal", "");
1036 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1037 "hide,secure_icon,signal", "");
1040 #if defined(FEATURE_MOST_VISITED_SITES)
1041 Eina_Bool Browser_View::_capture_most_visited_sites_item_screen_shot(void)
1043 BROWSER_LOGD("[%s]", __func__);
1045 Eina_Bool is_ranked = EINA_FALSE;
1046 std::string screen_shot_path;
1047 std::string current_url = get_url();
1048 screen_shot_path.clear();
1050 if (!m_selected_most_visited_sites_item_info.url.empty()) {
1051 std::string history_id;
1052 history_id = m_most_visited_sites_db->get_history_id_by_url(get_url().c_str());
1053 if (!history_id.empty()) {
1054 std::string history_title;
1055 history_title = m_most_visited_sites_db->get_history_title_by_id(history_id.c_str());
1056 if (!history_title.empty()) {
1057 if (!m_most_visited_sites_db->save_most_visited_sites_item(m_selected_most_visited_sites_item_info.index,
1058 get_url().c_str(), history_title.c_str(), history_id.c_str()))
1059 BROWSER_LOGE("save_most_visited_sites_item failed");
1061 if (!m_most_visited_sites_db->save_most_visited_sites_item(m_selected_most_visited_sites_item_info.index,
1062 get_url().c_str(), m_selected_most_visited_sites_item_info.title.c_str(),
1063 history_id.c_str()))
1064 BROWSER_LOGE("save_most_visited_sites_item failed");
1068 m_selected_most_visited_sites_item_info.url.clear();
1069 m_selected_most_visited_sites_item_info.title.clear();
1070 m_selected_most_visited_sites_item_info.id.clear();
1073 std::vector<Most_Visited_Sites_DB::most_visited_sites_entry> most_visited_sites_list;
1074 if (!m_most_visited_sites_db->get_most_visited_sites_list(most_visited_sites_list)) {
1075 BROWSER_LOGE("get_most_visited_sites_list failed");
1079 for (int i = 0 ; i < most_visited_sites_list.size() ; i++) {
1080 if (!current_url.empty() && !most_visited_sites_list[i].url.empty()
1081 && (current_url.length() == most_visited_sites_list[i].url.length())
1082 && !strncmp(most_visited_sites_list[i].url.c_str(), current_url.c_str(), current_url.length())) {
1083 is_ranked = EINA_TRUE;
1084 screen_shot_path = std::string(BROWSER_SCREEN_SHOT_DIR)
1085 + most_visited_sites_list[i].id;
1086 if (most_visited_sites_list[i].id.length() > strlen(DEFAULT_ICON_PREFIX) &&
1087 !strncmp(DEFAULT_ICON_PREFIX, most_visited_sites_list[i].id.c_str(),
1088 strlen(DEFAULT_ICON_PREFIX))) {
1089 /* If default icon */
1090 std::string history_id;
1091 history_id = m_most_visited_sites_db->get_history_id_by_url(most_visited_sites_list[i].url.c_str());
1092 if (!history_id.empty()) {
1093 if (m_most_visited_sites_db->save_most_visited_sites_item(most_visited_sites_list[i].index,
1094 most_visited_sites_list[i].url.c_str(), most_visited_sites_list[i].title.c_str(),
1095 history_id.c_str())) {
1096 screen_shot_path = std::string(BROWSER_SCREEN_SHOT_DIR)
1097 + most_visited_sites_list[i].id;
1098 remove(screen_shot_path.c_str());
1099 screen_shot_path = std::string(BROWSER_SCREEN_SHOT_DIR)
1109 std::vector<Most_Visited_Sites_DB::most_visited_sites_entry> most_visited_list;
1110 if (!m_most_visited_sites_db->get_most_visited_list(most_visited_list, most_visited_sites_list,
1111 BROWSER_MOST_VISITED_SITES_ITEM_MAX * 2)) {
1112 BROWSER_LOGE("get_most_visited_list failed");
1115 for (int i = 0; i < most_visited_list.size(); i++)
1117 if (most_visited_list[i].url == current_url) {
1118 is_ranked = EINA_TRUE;
1119 screen_shot_path = std::string(BROWSER_SCREEN_SHOT_DIR)
1120 + most_visited_list[i].id;
1126 if (is_ranked && screen_shot_path.size() > 0) {
1127 int focused_ewk_view_w = 0;
1128 int focused_ewk_view_h = 0;
1129 evas_object_geometry_get(m_focused_window->m_ewk_view, NULL, NULL,
1130 &focused_ewk_view_w, &focused_ewk_view_h);
1133 evas_object_geometry_get(m_win, NULL, NULL, &window_w, NULL);
1134 int item_w = window_w / 3;
1135 int item_h = item_w + 10 * elm_scale_get();
1137 double ratio = (double)((double)item_h / (double)item_w);
1139 Eina_Rectangle snapshot_rect;
1140 snapshot_rect.x = snapshot_rect.y = 0;
1141 snapshot_rect.w = focused_ewk_view_w;
1142 snapshot_rect.h = focused_ewk_view_w * ratio;
1144 Evas_Object *snapshot = ewk_view_screenshot_contents_get(m_focused_window->m_ewk_view,
1145 snapshot_rect, 0.33, evas_object_evas_get(m_navi_bar));
1147 BROWSER_LOGE("ewk_view_screenshot_contents_get failed");
1150 uint8_t *pixels = (uint8_t *)(evas_object_image_data_get(snapshot, EINA_TRUE));
1152 int surface_width = 0;
1153 int surface_height = 0;
1154 evas_object_image_size_get(snapshot, &surface_width, &surface_height);
1155 BROWSER_LOGD("<<<< surface_width = %d, surface_height = %d >>>", surface_width, surface_height);
1157 cairo_surface_t *snapshot_surface = cairo_image_surface_create_for_data(pixels, CAIRO_FORMAT_RGB24,
1158 surface_width, surface_height,
1159 cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, surface_width));
1160 if (!snapshot_surface) {
1161 BROWSER_LOGE("cairo_image_surface_create_for_data failed");
1165 if (cairo_surface_write_to_png(snapshot_surface, screen_shot_path.c_str())
1166 != CAIRO_STATUS_SUCCESS)
1167 BROWSER_LOGD("cairo_surface_write_to_png FAILED");
1168 cairo_surface_destroy(snapshot_surface);
1173 Eina_Bool Browser_View::__capture_most_visited_sites_screen_shot_idler_cb(void *data)
1175 BROWSER_LOGD("[%s]", __func__);
1177 return ECORE_CALLBACK_CANCEL;
1179 Browser_View *browser_view = (Browser_View *)data;
1180 if (!browser_view->_capture_most_visited_sites_item_screen_shot())
1181 BROWSER_LOGE("_capture_most_visited_sites_item_screen_shot failed");
1183 return ECORE_CALLBACK_CANCEL;
1187 void Browser_View::_load_finished(void)
1189 BROWSER_LOGD("[%s]", __func__);
1191 /* enable or disable back,forward controlbar buttons */
1192 _set_controlbar_back_forward_status();
1194 if (!_set_favicon())
1195 BROWSER_LOGE("_set_favicon failed");
1198 /* Add current url to history */
1199 Eina_Bool is_full = EINA_FALSE;
1201 /* Save last visited url to save this when browser exits. */
1202 m_last_visited_url = get_url();
1204 if (m_data_manager->get_history_db() && !m_is_private) {
1205 m_data_manager->get_history_db()->save_history(m_last_visited_url.c_str(),
1206 get_title().c_str(), &is_full);
1208 BROWSER_LOGE("history is full, delete the first one");
1211 _hide_scroller_url_layout();
1213 #if defined(FEATURE_MOST_VISITED_SITES)
1214 ecore_idler_add(__capture_most_visited_sites_screen_shot_idler_cb, this);
1217 elm_object_focus_set(m_option_header_cancel_button, EINA_TRUE);
1218 elm_object_signal_emit(m_option_header_url_edit_field, "ellipsis_show,signal", "elm");
1219 elm_object_signal_emit(m_url_edit_field, "ellipsis_show,signal", "elm");
1221 _update_back_forward_buttons();
1224 void Browser_View::_hide_scroller_url_layout(void)
1226 BROWSER_LOGD("[%s]", __func__);
1228 if (_get_edit_mode() != BR_NO_EDIT_MODE
1229 #if defined(FEATURE_MOST_VISITED_SITES)
1230 || is_most_visited_sites_running()
1235 _navigationbar_visible_set_signal(EINA_FALSE);
1237 int browser_scroller_x = 0;
1238 int browser_scroller_w = 0;
1239 int browser_scroller_h = 0;
1240 elm_scroller_region_get(m_scroller, &browser_scroller_x, NULL,
1241 &browser_scroller_w, &browser_scroller_h);
1243 int url_layout_h = 0;
1244 evas_object_geometry_get(m_url_layout, NULL, NULL, NULL, &url_layout_h);
1245 elm_scroller_region_show(m_scroller, browser_scroller_x, url_layout_h,
1246 browser_scroller_w, browser_scroller_h);
1249 void Browser_View::__load_progress_cb(void *data, Evas_Object *obj, void *event_info)
1254 Browser_View *browser_view = (Browser_View *)data;
1255 Evas_Object *url_progressbar = browser_view->m_url_progressbar;
1256 Evas_Object *option_header_url_progressbar = browser_view->m_option_header_url_progressbar;
1258 double progress = ewk_view_load_progress_get(browser_view->m_focused_window->m_ewk_view);
1259 elm_progressbar_value_set(url_progressbar, progress);
1260 elm_progressbar_value_set(option_header_url_progressbar, progress);
1262 if (progress == 1.0f)
1263 __load_finished_cb(data, obj, NULL);
1266 void Browser_View::__ewk_view_mouse_down_cb(void* data, Evas* evas, Evas_Object* obj, void* ev)
1271 Browser_View *browser_view = (Browser_View *)data;
1272 Evas_Event_Mouse_Down event = *(Evas_Event_Mouse_Down *)ev;
1273 Evas_Object *main_layout = browser_view->m_main_layout;
1274 Evas_Object *ewk_view = browser_view->m_focused_window->m_ewk_view;
1276 browser_view->m_context_menu->set_pressed_position_x(event.output.x);
1277 browser_view->m_context_menu->set_pressed_position_y(event.output.y);
1279 #if defined(FEATURE_MOST_VISITED_SITES)
1280 if (browser_view->is_most_visited_sites_running())
1284 #ifdef BROWSER_SCROLLER_BOUNCING
1285 /* activate webview firstly when user starts to touch. */
1286 browser_view->_enable_webview_scroll();
1289 if (!browser_view->_is_loading() && browser_view->_get_edit_mode() != BR_FIND_WORD_MODE)
1290 browser_view->_navigationbar_visible_set(EINA_FALSE);
1292 browser_view->m_is_scrolling = EINA_TRUE;
1294 BROWSER_LOGD("__ewk_view_mouse_down_cb");
1297 double scale_factor = ewk_view_scale_get(browser_view->m_focused_window->m_ewk_view);
1298 double min_scale = 0;
1299 double max_scale = 0;
1301 bool zoom_button_flag = true;
1302 if (br_preference_get_bool(ZOOM_BUTTON_KEY, &zoom_button_flag) == false)
1303 BROWSER_LOGE("failed to get ZOOM_BUTTON_KEY value\n");
1305 BROWSER_LOGD("zoom_button_flag =%d", zoom_button_flag);
1307 if (zoom_button_flag == false)
1311 ewk_view_scale_range_get(browser_view->m_focused_window->m_ewk_view,
1312 &min_scale, &max_scale);
1313 if (browser_view->m_zoom_button_timer)
1314 ecore_timer_del(browser_view->m_zoom_button_timer);
1315 browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
1316 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "show,zoom_buttons,signal", "");
1320 void Browser_View::__ewk_view_enter_full_screen_cb(void *data, Evas_Object *obj, void *event_info)
1325 Browser_View *browser_view = (Browser_View *)data;
1326 browser_view->set_full_sreen(EINA_TRUE);
1329 void Browser_View::__ewk_view_exit_full_screen_cb(void *data, Evas_Object *obj, void *event_info)
1334 Browser_View *browser_view = (Browser_View *)data;
1335 browser_view->set_full_sreen(EINA_FALSE);
1338 void Browser_View::__ewk_view_vibration_vibrate_cb(void *data, Evas_Object *obj, void *event_info)
1340 Browser_View *browser_view = (Browser_View*)data;
1341 const long vibration_time = *((const long *)event_info);
1343 BROWSER_LOGD("__ewk_view_vibration_vibrate_cb : play time is [%ld]", vibration_time);
1345 browser_view->_haptic_device_play(vibration_time);
1348 void Browser_View::__ewk_view_vibration_cancel_cb(void *data, Evas_Object *obj, void *event_info)
1350 BROWSER_LOGD("[%s]", __func__);
1352 Browser_View *browser_view = (Browser_View*)data;
1354 browser_view->_haptic_device_stop();
1357 void Browser_View::__ewk_view_mouse_up_cb(void* data, Evas* evas, Evas_Object* obj, void* ev)
1362 Browser_View *browser_view = (Browser_View *)data;
1364 browser_view->m_is_scrolling = EINA_FALSE;
1367 void Browser_View::__ewk_view_edge_top_cb(void *data, Evas_Object *obj, void *event_info)
1369 #ifdef BROWSER_SCROLLER_BOUNCING
1370 BROWSER_LOGD("[%s]", __func__);
1374 Browser_View *browser_view = (Browser_View *)data;
1375 browser_view->_enable_browser_scroller_scroll();
1377 /* If user do flicking the mouse with scroll up, bring in the browser scroller to y=0. */
1378 if (!browser_view->m_is_scrolling) {
1379 BROWSER_LOGD("<< elm_scroller_region_bring_in >>");
1380 int browser_scroller_x = 0;
1381 int browser_scroller_w = 0;
1382 int browser_scroller_h = 0;
1383 elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, NULL,
1384 &browser_scroller_w, &browser_scroller_h);
1386 elm_scroller_region_bring_in(browser_view->m_scroller, browser_scroller_x, 0,
1387 browser_scroller_w, browser_scroller_h);
1392 void Browser_View::__ewk_view_scroll_down_cb(void *data, Evas_Object *obj, void *event_info)
1394 #ifdef BROWSER_SCROLLER_BOUNCING
1397 Browser_View *browser_view = (Browser_View *)data;
1403 int url_layout_h = 0;
1404 elm_scroller_region_get(browser_view->m_scroller, &scroller_x, &scroller_y, &scroller_w, &scroller_h);
1405 evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
1407 if (scroller_y < url_layout_h) {
1408 /* We have to hide urlbar when webview's contents are scrolled down by flicking. */
1409 if (!browser_view->m_is_scrolling)
1410 elm_scroller_region_show(browser_view->m_scroller, scroller_x, url_layout_h, scroller_w, scroller_h);
1412 browser_view->_enable_browser_scroller_scroll();
1414 browser_view->_enable_webview_scroll();
1419 void Browser_View::__ewk_view_scroll_up_cb(void *data, Evas_Object *obj, void *event_info)
1421 #ifdef BROWSER_SCROLLER_BOUNCING
1425 Browser_View *browser_view = (Browser_View *)data;
1426 browser_view->_enable_webview_scroll();
1430 void Browser_View::_set_navigationbar_title(const char *title)
1432 BROWSER_LOGD("title=[%s]", title);
1433 edje_object_part_text_set(elm_layout_edje_get(m_url_layout),
1434 "title_text", title);
1435 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_layout),
1436 "title_text", title);
1440 void Browser_View::_set_url_entry(const char *url, Eina_Bool set_secrue_icon)
1442 BROWSER_LOGD("url=[%s]", url);
1443 if (url && strlen(url)) {
1444 std::string url_without_http_scheme;
1445 if (strstr(url, BROWSER_HTTP_SCHEME) && strlen(url) > strlen(BROWSER_HTTP_SCHEME))
1446 url_without_http_scheme = std::string(url + strlen(BROWSER_HTTP_SCHEME));
1448 url_without_http_scheme = std::string(url);
1450 char *mark_up_url = elm_entry_utf8_to_markup(url_without_http_scheme.c_str());
1452 Evas_Object *entry = br_elm_editfield_entry_get(m_url_edit_field);
1453 elm_entry_entry_set(entry, mark_up_url);
1454 entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
1455 elm_entry_entry_set(entry, mark_up_url);
1457 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_edit_field),
1458 "elm.text.ellipsis", mark_up_url);
1459 edje_object_part_text_set(elm_layout_edje_get(m_url_edit_field),
1460 "elm.text.ellipsis", mark_up_url);
1464 Evas_Object *entry = br_elm_editfield_entry_get(m_url_edit_field);
1465 #if defined(FEATURE_MOST_VISITED_SITES)
1466 elm_entry_entry_set(entry, BROWSER_MOST_VISITED_SITES_URL);
1468 elm_entry_entry_set(entry, BROWSER_BLANK_PAGE_URL);
1470 entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
1471 #if defined(FEATURE_MOST_VISITED_SITES)
1472 elm_entry_entry_set(entry, BROWSER_MOST_VISITED_SITES_URL);
1474 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_edit_field),
1475 "elm.text.ellipsis", BROWSER_MOST_VISITED_SITES_URL);
1476 edje_object_part_text_set(elm_layout_edje_get(m_url_edit_field),
1477 "elm.text.ellipsis", BROWSER_MOST_VISITED_SITES_URL);
1479 elm_entry_entry_set(entry, BROWSER_BLANK_PAGE_URL);
1481 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_edit_field),
1482 "elm.text.ellipsis", BROWSER_BLANK_PAGE_URL);
1483 edje_object_part_text_set(elm_layout_edje_get(m_url_edit_field),
1484 "elm.text.ellipsis", BROWSER_BLANK_PAGE_URL);
1488 if (set_secrue_icon)
1492 void Browser_View::_stop_loading(void)
1494 BROWSER_LOGD("[%s]", __func__);
1495 if (m_focused_window->m_ewk_view)
1496 ewk_view_stop(m_focused_window->m_ewk_view);
1499 void Browser_View::_reload(void)
1501 BROWSER_LOGD("[%s]", __func__);
1502 if (m_focused_window->m_ewk_view)
1503 ewk_view_reload_bypass_cache(m_focused_window->m_ewk_view);
1506 void Browser_View::set_focused_window(Browser_Window *window
1507 #if defined(FEATURE_MOST_VISITED_SITES)
1508 ,Eina_Bool show_most_visited_sites
1512 BROWSER_LOGD("[%s]", __func__);
1513 if (m_focused_window && m_focused_window->m_ewk_view_layout) {
1514 elm_box_unpack(m_content_box, m_focused_window->m_ewk_view_layout);
1515 evas_object_hide(m_focused_window->m_ewk_view_layout);
1518 if (m_focused_window && m_focused_window->m_favicon) {
1519 if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
1520 elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
1522 evas_object_hide(m_focused_window->m_favicon);
1524 if (m_focused_window && m_focused_window->m_option_header_favicon) {
1525 if (elm_object_part_content_get(m_option_header_url_entry_layout, "elm.swallow.favicon"))
1526 elm_object_part_content_unset(m_option_header_url_entry_layout, "elm.swallow.favicon");
1528 evas_object_hide(m_focused_window->m_option_header_favicon);
1531 m_focused_window = window;
1533 if (!m_focused_window->m_ewk_view_layout) {
1534 m_focused_window->m_ewk_view_layout = elm_layout_add(m_navi_bar);
1535 if (!m_focused_window->m_ewk_view_layout) {
1536 BROWSER_LOGE("elm_layout_add failed!");
1539 if (!elm_layout_file_set(m_focused_window->m_ewk_view_layout,
1540 BROWSER_EDJE_DIR"/browser-view-main.edj",
1541 "browser/browser-view-webview")) {
1542 BROWSER_LOGE("elm_layout_file_set failed", BROWSER_EDJE_DIR);
1545 evas_object_size_hint_weight_set(m_focused_window->m_ewk_view_layout,
1546 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1547 evas_object_size_hint_align_set(m_focused_window->m_ewk_view_layout,
1548 EVAS_HINT_FILL, EVAS_HINT_FILL);
1549 elm_box_pack_end(m_content_box, m_focused_window->m_ewk_view_layout);
1550 evas_object_show(m_focused_window->m_ewk_view_layout);
1552 elm_object_part_content_set(m_focused_window->m_ewk_view_layout, "elm.swallow.webview",
1553 m_focused_window->m_ewk_view);
1554 evas_object_show(m_focused_window->m_ewk_view);
1558 * If launch the browser by aul, the grey bg is displayed shortly. */
1559 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1560 "hide,grey_background,signal", "");
1562 * The webview layout is not resized whenever repack to content box.
1563 * So resize the webview layout whenever repack. */
1564 m_resize_idler = ecore_idler_add(__webview_layout_resize_idler_cb, this);
1566 elm_box_pack_end(m_content_box, m_focused_window->m_ewk_view_layout);
1567 evas_object_show(m_focused_window->m_ewk_view_layout);
1568 evas_object_show(m_focused_window->m_ewk_view);
1571 if (!_is_loading()) {
1572 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,off,signal", "");
1573 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1574 "loading,off,signal", "");
1575 elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
1576 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
1579 /* show or hide favicon in url layout. */
1580 if (m_focused_window->m_favicon
1581 #if defined(FEATURE_MOST_VISITED_SITES)
1582 && !is_most_visited_sites_running()
1585 if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
1586 elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
1588 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.favicon",
1589 m_focused_window->m_favicon);
1590 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1591 "show,favicon,signal", "");
1592 evas_object_show(m_focused_window->m_favicon);
1595 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1596 "hide,favicon,signal", "");
1599 /* show or hide favicon in option header url layout. */
1600 if (m_focused_window->m_option_header_favicon
1601 #if defined(FEATURE_MOST_VISITED_SITES)
1602 && !is_most_visited_sites_running()
1605 if (elm_object_part_content_get(m_option_header_url_entry_layout, "elm.swallow.favicon"))
1606 elm_object_part_content_unset(m_option_header_url_entry_layout, "elm.swallow.favicon");
1608 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.favicon",
1609 m_focused_window->m_option_header_favicon);
1610 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1611 "show,favicon,signal", "");
1613 evas_object_show(m_focused_window->m_option_header_favicon);
1615 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1616 "hide,favicon,signal", "");
1619 #if defined(FEATURE_MOST_VISITED_SITES)
1620 if (show_most_visited_sites) {
1621 if (get_url().empty())
1622 _show_most_visited_sites(EINA_TRUE);
1624 _show_most_visited_sites(EINA_FALSE);
1628 std::vector<Browser_Window *> window_list = m_browser->get_window_list();
1629 _set_multi_window_controlbar_text(window_list.size());
1631 if (!_set_favicon())
1632 BROWSER_LOGE("_set_favicon failed");
1634 _update_back_forward_buttons();
1636 /* Without this code, the url is empty shortly when create deleted-window in multi window. */
1637 if (get_url().empty() && !m_focused_window->m_url.empty())
1638 _set_url_entry(m_focused_window->m_url.c_str());
1640 _set_url_entry(get_url().c_str());
1642 if (window_list.size() >= BROWSER_MULTI_WINDOW_MAX_COUNT)
1643 elm_object_item_disabled_set(m_new_window_button, EINA_TRUE);
1645 elm_object_item_disabled_set(m_new_window_button, EINA_FALSE);
1648 #if defined(FEATURE_MOST_VISITED_SITES)
1649 Eina_Bool Browser_View::_show_most_visited_sites(Eina_Bool is_show)
1651 BROWSER_LOGD("[%s]is_show=%d", __func__, is_show);
1653 m_selected_most_visited_sites_item_info.url.clear();
1654 m_selected_most_visited_sites_item_info.title.clear();
1655 m_selected_most_visited_sites_item_info.id.clear();
1657 if (!m_most_visited_sites) {
1658 m_most_visited_sites = new(nothrow) Most_Visited_Sites(m_navi_bar, this, m_most_visited_sites_db);
1659 if (!m_most_visited_sites) {
1660 BROWSER_LOGE("new Most_Visited_Sites failed");
1664 Evas_Object *most_visited_sites_layout = m_most_visited_sites->create_most_visited_sites_main_layout();
1665 if (!most_visited_sites_layout) {
1666 BROWSER_LOGE("create_most_visited_sites_main_layout failed");
1667 if (m_most_visited_sites) {
1668 delete m_most_visited_sites;
1669 m_most_visited_sites = NULL;
1673 elm_object_part_content_set(m_main_layout, "elm.swallow.most_visited_sites", most_visited_sites_layout);
1674 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1675 "show,most_visited_sites,signal", "");
1676 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1677 "show,control_bar,no_animation,signal", "");
1679 /* change the url layout for normal mode. (change the reload icon etc) */
1680 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,off,signal", "");
1681 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1682 "loading,off,signal", "");
1684 edje_object_part_text_set(elm_layout_edje_get(m_url_entry_layout),
1685 "url_guide_text", BR_STRING_URL_GUIDE_TEXT);
1686 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_entry_layout),
1687 "url_guide_text", BR_STRING_URL_GUIDE_TEXT);
1689 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,on,signal", "");
1690 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1691 "url_guide_text,on,signal", "");
1693 _set_navigationbar_title(BR_STRING_MOST_VISITED_SITES);
1694 _set_url_entry(BROWSER_MOST_VISITED_SITES_URL);
1696 /* If the speed dial is displayed for the first time, destroy the progress wheel. */
1697 if (m_dummy_loading_progressbar) {
1698 elm_object_part_content_unset(m_main_layout, "elm.swallow.waiting_progress");
1699 evas_object_del(m_dummy_loading_progressbar);
1700 m_dummy_loading_progressbar = NULL;
1701 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1702 "hide,waiting_progressbar,signal", "");
1705 elm_object_item_disabled_set(m_add_bookmark_button, EINA_TRUE);
1711 elm_scroller_region_get(m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
1712 elm_scroller_region_show(m_scroller ,scroller_x, 0, scroller_w, scroller_h);
1714 _navigationbar_visible_set_signal(EINA_TRUE);
1716 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1717 "hide,favicon,signal", "");
1718 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1719 "hide,favicon,signal", "");
1721 #ifdef BROWSER_SCROLLER_BOUNCING
1722 BROWSER_LOGD("<< lock browser scroller >>");
1723 elm_object_scroll_freeze_pop(m_scroller);
1724 elm_object_scroll_freeze_push(m_scroller);
1727 if (m_most_visited_sites) {
1728 if (elm_object_part_content_get(m_main_layout, "elm.swallow.most_visited_sites"))
1729 elm_object_part_content_unset(m_main_layout, "elm.swallow.most_visited_sites");
1730 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1731 "hide,most_visited_sites,signal", "");
1732 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1733 "hide,most_visited_sites_guide_text,signal", "");
1735 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,off,signal", "");
1736 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1737 "url_guide_text,off,signal", "");
1739 delete m_most_visited_sites;
1740 m_most_visited_sites = NULL;
1742 elm_object_item_disabled_set(m_add_bookmark_button, EINA_FALSE);
1749 void Browser_View::load_url(const char *url)
1751 BROWSER_LOGD("[%s]", __func__);
1752 #if defined(FEATURE_MOST_VISITED_SITES)
1753 if (!url || !strlen(url)) {
1754 if (!_show_most_visited_sites(EINA_TRUE))
1755 BROWSER_LOGE("_show_most_visited_sites EINA_TRUE failed");
1759 if (!_show_most_visited_sites(EINA_FALSE))
1760 BROWSER_LOGE("_show_most_visited_sites EINA_FALSE failed");
1764 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(_get_activated_url_entry());
1765 evas_object_smart_callback_del(edit_field_entry, "changed", __url_entry_changed_cb);
1767 std::string full_url;
1768 if (_has_url_sheme(url))
1771 full_url = std::string(BROWSER_HTTP_SCHEME) + std::string(url);
1773 BROWSER_LOGD("full_url = [%s]", full_url.c_str());
1775 _set_url_entry(full_url.c_str());
1777 ewk_view_uri_set(m_focused_window->m_ewk_view, full_url.c_str());
1780 string Browser_View::get_title(Browser_Window *window)
1782 const char *title = ewk_view_title_get(window->m_ewk_view);
1783 BROWSER_LOGD("title = [%s]", title);
1785 if (!window->m_ewk_view && !window->m_title.empty())
1786 return window->m_title;
1788 if (!window->m_ewk_view)
1789 return std::string();
1792 if (!window->m_title.empty())
1793 return window->m_title;
1795 return std::string();
1798 return std::string(title);
1801 string Browser_View::get_title(void)
1803 const char *title = ewk_view_title_get(m_focused_window->m_ewk_view);
1804 BROWSER_LOGD("title = [%s]", title);
1806 if (!title && m_focused_window->m_title.empty())
1807 return std::string();
1808 else if (!title && !m_focused_window->m_title.empty())
1809 return m_focused_window->m_title;
1811 if (title && strlen(title))
1812 return std::string(title);
1814 return std::string();
1817 string Browser_View::get_url(Browser_Window *window)
1819 BROWSER_LOGD("[%s]", __func__);
1821 if (!window->m_ewk_view && !window->m_url.empty())
1822 return window->m_url;
1824 if (!window->m_ewk_view)
1825 return std::string();
1827 const char *uri = ewk_view_uri_get(window->m_ewk_view);
1828 BROWSER_LOGD("uri = [%s]", uri);
1830 if (!uri || strlen(uri) == 0)
1831 return std::string();
1833 return std::string(uri);
1836 string Browser_View::get_url(void)
1838 if (!m_focused_window) {
1839 BROWSER_LOGE("m_focused_window is NULL");
1840 return std::string();
1843 const char *uri = ewk_view_uri_get(m_focused_window->m_ewk_view);
1844 BROWSER_LOGD("uri = [%s]", uri);
1846 if (!uri || strlen(uri) == 0)
1847 return std::string();
1849 return std::string(uri);
1852 /* If multi window is running, unset the navigation title object,
1853 * else set the navigation title object to show title object arrow. */
1854 void Browser_View::unset_navigationbar_title_object(Eina_Bool is_unset)
1856 BROWSER_LOGD("[%s] is_unset =%d", __func__, is_unset);
1857 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
1859 _navigationbar_visible_set_signal(EINA_FALSE);
1860 elm_object_item_part_content_unset(top_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER);
1861 evas_object_hide(m_option_header_layout);
1863 Evas_Object *title_object = NULL;
1864 title_object = elm_object_item_part_content_get(top_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER);
1865 if (!title_object) {
1866 elm_object_item_part_content_set(top_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER,
1867 m_option_header_layout);
1868 evas_object_show(m_option_header_layout);
1870 #if defined(FEATURE_MOST_VISITED_SITES)
1871 if (!is_most_visited_sites_running())
1872 _navigationbar_visible_set_signal(EINA_FALSE);
1877 void Browser_View::__go_to_bookmark_cb(void *data, Evas_Object *obj, void *event_info)
1879 BROWSER_LOGD("[%s]", __func__);
1883 Browser_View *browser_view = (Browser_View *)data;
1885 if (!m_data_manager->create_bookmark_view()) {
1886 BROWSER_LOGE("m_data_manager->create_bookmark_view failed");
1890 if (!m_data_manager->get_bookmark_view()->init()) {
1891 BROWSER_LOGE("m_data_manager->get_bookmark_view()->init failed");
1892 m_data_manager->destroy_bookmark_view();
1895 browser_view->_destroy_more_context_popup();
1898 void Browser_View::__backward_cb(void *data, Evas_Object *obj, void *event_info)
1900 BROWSER_LOGD("[%s]", __func__);
1904 Browser_View *browser_view = (Browser_View *)data;
1905 __title_back_button_clicked_cb(data, NULL, NULL);
1907 browser_view->_destroy_more_context_popup();
1910 void Browser_View::__forward_cb(void *data, Evas_Object *obj, void *event_info)
1912 BROWSER_LOGD("[%s]", __func__);
1916 Browser_View *browser_view = (Browser_View *)data;
1917 browser_view->_destroy_more_context_popup();
1918 if (browser_view->m_focused_window->m_ewk_view
1919 && ewk_view_forward_possible(browser_view->m_focused_window->m_ewk_view))
1920 ewk_view_forward(browser_view->m_focused_window->m_ewk_view);
1923 void Browser_View::__url_editfield_share_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1925 BROWSER_LOGD("[%s]", __func__);
1929 Browser_View *browser_view = (Browser_View *)data;
1930 const char *selected_text = elm_entry_selection_get(br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field));
1932 if (!selected_text || !strlen(selected_text)) {
1933 BROWSER_LOGD("There is no selected_text. Share the URL");
1934 selected_text = (const char *)browser_view->get_url().c_str();
1937 if (browser_view->_show_share_popup(selected_text))
1938 BROWSER_LOGE("_show_share_popup failed");
1941 Eina_Bool Browser_View::__show_scissorbox_view_idler_cb(void *data)
1944 return ECORE_CALLBACK_CANCEL;
1946 Browser_View *browser_view = (Browser_View *)data;
1948 if (browser_view->m_scissorbox_view)
1949 delete browser_view->m_scissorbox_view;
1951 browser_view->m_scissorbox_view = new(nothrow) Browser_Scissorbox_View(browser_view);
1952 if (!browser_view->m_scissorbox_view) {
1953 BROWSER_LOGE("new Browser_Scissorbox_View failed");
1954 return ECORE_CALLBACK_CANCEL;
1956 if (!browser_view->m_scissorbox_view->init()) {
1957 BROWSER_LOGE("m_scissorbox_view->init failed");
1958 delete browser_view->m_scissorbox_view;
1959 browser_view->m_scissorbox_view = NULL;
1960 return ECORE_CALLBACK_CANCEL;
1963 elm_object_part_content_set(browser_view->m_main_layout, "elm.swallow.scissorbox",
1964 browser_view->m_scissorbox_view->get_layout());
1965 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout),
1966 "show,scissorbox,signal", "");
1968 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_layout),
1969 "show,scissorbox,signal", "");
1970 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_layout),
1971 "show,scissorbox,signal", "");
1974 elm_object_part_content_unset(browser_view->m_main_layout, "elm.swallow.control_bar");
1975 evas_object_hide(browser_view->m_control_bar);
1977 return ECORE_CALLBACK_CANCEL;
1980 Eina_Bool Browser_View::_show_scissorbox_view(void)
1982 BROWSER_LOGD("[%s]", __func__);
1984 ecore_idler_add(__show_scissorbox_view_idler_cb, this);
1989 void Browser_View::_destroy_scissorbox_view(void)
1991 elm_object_part_content_unset(m_main_layout, "elm.swallow.scissorbox");
1992 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "hide,scissorbox,signal", "");
1994 edje_object_signal_emit(elm_layout_edje_get(m_url_layout),
1995 "hide,scissorbox,signal", "");
1996 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
1997 "hide,scissorbox,signal", "");
1999 elm_object_part_content_unset(m_main_layout, "elm.swallow.control_bar");
2001 if (m_scissorbox_view) {
2002 delete m_scissorbox_view;
2003 m_scissorbox_view = NULL;
2006 elm_object_part_content_set(m_main_layout, "elm.swallow.control_bar", m_control_bar);
2007 evas_object_show(m_control_bar);
2010 void Browser_View::__private_cb(void *data, Evas_Object *obj, void *event_info)
2012 BROWSER_LOGD("[%s]", __func__);
2016 Browser_View *browser_view = (Browser_View *)data;
2017 browser_view->m_is_private = !browser_view->m_is_private;
2019 browser_view->m_is_private_item_pressed = EINA_TRUE;
2021 elm_check_state_set(browser_view->m_private_check, browser_view->m_is_private);
2023 if (browser_view->m_is_private) {
2024 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,on,signal", "");
2025 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,on,signal", "");
2027 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,off,signal", "");
2028 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,off,signal", "");
2031 Ewk_Setting *setting = ewk_view_setting_get(browser_view->m_focused_window->m_ewk_view);
2032 ewk_setting_private_browsing_set(setting, browser_view->m_is_private);
2035 void Browser_View::__bookmark_cb(void *data, Evas_Object *obj, void *event_info)
2037 BROWSER_LOGD("[%s]", __func__);
2041 Browser_View *browser_view = (Browser_View *)data;
2042 int bookmark_id = -1;
2043 if(!m_data_manager->get_history_db()->is_in_bookmark(browser_view->get_url().c_str(), &bookmark_id)) {
2044 if (!elm_icon_file_set(browser_view->m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_on.png", NULL)) {
2045 BROWSER_LOGE("elm_icon_file_set is failed.\n");
2048 m_data_manager->create_bookmark_db()->save_bookmark(BROWSER_BOOKMARK_MAIN_FOLDER_ID,
2049 browser_view->get_title().c_str(), browser_view->get_url().c_str());
2050 browser_view->show_notify_popup(BR_STRING_ADDED_TO_BOOKMARKS, 3, EINA_TRUE);
2052 if (!elm_icon_file_set(browser_view->m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_off.png", NULL)) {
2053 BROWSER_LOGE("elm_icon_file_set is failed.\n");
2056 m_data_manager->create_bookmark_db()->delete_bookmark(bookmark_id);
2057 browser_view->show_notify_popup(BR_STRING_REMOVED_TO_BOOKMARKS, 3, EINA_TRUE);
2060 m_data_manager->destroy_bookmark_db();
2063 void Browser_View::__bookmark_icon_changed_cb(void *data, Evas_Object *obj, void *event_info)
2065 BROWSER_LOGD("[%s]", __func__);
2069 Browser_View *browser_view = (Browser_View *)data;
2072 void Browser_View::__private_check_change_cb(void *data, Evas_Object *obj, void *event_info)
2074 BROWSER_LOGD("[%s]", __func__);
2078 Browser_View *browser_view = (Browser_View *)data;
2079 Eina_Bool state = elm_check_state_get((Evas_Object*)obj);
2080 browser_view->m_is_private = state;
2082 if (browser_view->m_is_private_item_pressed) {
2083 browser_view->m_is_private = !browser_view->m_is_private;
2084 elm_check_state_set(browser_view->m_private_check, browser_view->m_is_private);
2085 browser_view->m_is_private_item_pressed = EINA_FALSE;
2088 if (browser_view->m_is_private) {
2089 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,on,signal", "");
2090 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,on,signal", "");
2092 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,off,signal", "");
2093 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,off,signal", "");
2096 Ewk_Setting *setting = ewk_view_setting_get(browser_view->m_focused_window->m_ewk_view);
2097 ewk_setting_private_browsing_set(setting, browser_view->m_is_private);
2100 void Browser_View::__expand_option_header_cb(void *data, Evas_Object *obj, void *event_info)
2102 BROWSER_LOGD("[%s]", __func__);
2106 Browser_View *browser_view = (Browser_View *)data;
2108 browser_view->_navigationbar_title_clicked();
2111 void Browser_View::__add_bookmark_cb(void *data, Evas_Object *obj, void *event_info)
2113 BROWSER_LOGD("[%s]", __func__);
2117 Browser_View *browser_view = (Browser_View *)data;
2118 if (!m_data_manager->create_add_to_bookmark_view(browser_view->get_title(), browser_view->get_url())) {
2119 BROWSER_LOGE("m_data_manager->create_add_to_bookmark_view failed");
2123 if (!m_data_manager->get_add_to_bookmark_view()->init())
2124 m_data_manager->destroy_add_to_bookmark_view();
2127 #if defined(HORIZONTAL_UI)
2128 void Browser_View::_rotate_multi_window(void)
2130 BROWSER_LOGD("[%s]", __func__);
2132 if (!m_data_manager->create_multi_window_view()) {
2133 BROWSER_LOGE("m_data_manager->create_multi_window_view failed");
2137 if (!m_data_manager->get_multi_window_view()->init(0.0, m_is_multi_window_grid_mode)) {
2138 m_data_manager->destroy_multi_window_view();
2139 BROWSER_LOGE("get_multi_window_view()->init failed");
2143 ewk_view_suspend(m_focused_window->m_ewk_view);
2145 _navigationbar_visible_set_signal(EINA_FALSE);
2147 /* Hide the secure lock icon in title bar. */
2148 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
2149 elm_object_item_part_content_set(top_it, ELM_NAVIFRAME_ITEM_ICON, NULL);
2151 if (_get_edit_mode() != BR_NO_EDIT_MODE)
2152 _set_edit_mode(BR_NO_EDIT_MODE);
2154 m_is_multi_window_grid_mode = EINA_FALSE;
2158 void Browser_View::__multi_window_cb(void *data, Evas_Object *obj, void *event_info)
2160 BROWSER_LOGD("[%s]", __func__);
2162 Browser_View *browser_view = (Browser_View *)data;
2163 browser_view->_destroy_more_context_popup();
2165 #if defined(FEATURE_MOST_VISITED_SITES)
2166 if (browser_view->m_most_visited_sites && browser_view->m_most_visited_sites->is_guide_text_running())
2170 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
2171 BROWSER_LOGD("close multi window");
2172 m_data_manager->get_multi_window_view()->close_multi_window();
2176 if (!m_data_manager->create_multi_window_view()) {
2177 BROWSER_LOGE("m_data_manager->create_multi_window_view failed");
2181 if (!m_data_manager->get_multi_window_view()->init()) {
2182 m_data_manager->destroy_multi_window_view();
2183 BROWSER_LOGE("get_multi_window_view()->init failed");
2187 /* Exception case to call ewk_view_suspend directly.
2188 * That's because the webpage is cleared, when call ewk_view_visibility_set suspend_ewk_view */
2189 ewk_view_suspend(browser_view->m_focused_window->m_ewk_view);
2190 ewk_view_visibility_set(browser_view->m_focused_window->m_ewk_view, EINA_FALSE);
2192 browser_view->_navigationbar_visible_set_signal(EINA_FALSE);
2194 /* Hide the secure lock icon in title bar. */
2195 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
2196 elm_object_item_part_content_set(top_it, ELM_NAVIFRAME_ITEM_ICON, NULL);
2198 if (browser_view->_get_edit_mode() != BR_NO_EDIT_MODE)
2199 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2202 void Browser_View::__new_window_cb(void *data, Evas_Object *obj, void *event_info)
2204 BROWSER_LOGD("[%s]", __func__);
2208 Browser_View *browser_view = (Browser_View *)data;
2209 Browser_Class *browser = browser_view->m_browser;
2211 if (browser_view->m_resize_idler)
2214 std::vector<Browser_Window *> window_list = browser->get_window_list();
2215 if (window_list.size() >= BROWSER_MULTI_WINDOW_MAX_COUNT) {
2216 /* If the multi window is max, delete the first one. */
2217 /* if the first window is focused, delete second one(oldest one except first one) */
2218 if (browser_view->m_focused_window != window_list[0])
2219 browser->delete_window(window_list[0]);
2221 browser->delete_window(window_list[1]);
2224 browser_view->m_created_new_window = browser->create_new_window(EINA_TRUE);
2225 if (!browser_view->m_created_new_window) {
2226 BROWSER_LOGE("create_new_window failed");
2229 /* initialize the created webview first to connect ewk event callback functions such as load start, progress etc. */
2230 ewk_view_suspend(browser_view->m_focused_window->m_ewk_view);
2232 #if defined(HORIZONTAL_UI)
2233 if (browser_view->m_focused_window->m_landscape_snapshot_image) {
2234 evas_object_del(browser_view->m_focused_window->m_landscape_snapshot_image);
2235 browser_view->m_focused_window->m_landscape_snapshot_image = NULL;
2238 if (browser_view->m_focused_window->m_portrait_snapshot_image) {
2239 evas_object_del(browser_view->m_focused_window->m_portrait_snapshot_image);
2240 browser_view->m_focused_window->m_portrait_snapshot_image = NULL;
2243 #if defined(HORIZONTAL_UI)
2244 if (browser_view->is_landscape())
2245 browser_view->m_focused_window->m_landscape_snapshot_image = browser_view->_capture_snapshot(browser_view->m_focused_window, BROWSER_MULTI_WINDOW_ITEM_RATIO);
2248 browser_view->m_focused_window->m_portrait_snapshot_image = browser_view->_capture_snapshot(browser_view->m_focused_window, BROWSER_MULTI_WINDOW_ITEM_RATIO);
2250 #if defined(FEATURE_MOST_VISITED_SITES)
2251 if (!browser_view->_show_most_visited_sites(EINA_FALSE))
2252 BROWSER_LOGE("_show_most_visited_sites EINA_FALSE failed");
2255 /* initialize the created webview first to connect ewk event callback functions such as load start, progress etc. */
2256 browser->ewk_view_init(browser_view->m_created_new_window->m_ewk_view);
2258 if (!browser_view->_show_new_window_effect(browser_view->m_focused_window->m_ewk_view,
2259 browser_view->m_created_new_window->m_ewk_view))
2260 BROWSER_LOGE("_show_new_window_effect failed");
2262 #if defined(FEATURE_MOST_VISITED_SITES)
2263 browser_view->load_url(BROWSER_MOST_VISITED_SITES_URL);
2265 browser_view->load_url(BROWSER_BLANK_PAGE_URL);
2270 Eina_Bool Browser_View::_call_internet_settings(void)
2272 BROWSER_LOGD("[%s]", __func__);
2274 m_browser_settings = new(nothrow) Browser_Settings_Class;
2275 if (!m_browser_settings) {
2276 BROWSER_LOGE("new Browser_Settings_Class failed");
2279 if (!m_browser_settings->init()) {
2280 BROWSER_LOGE("m_browser_settings->init failed");
2281 delete m_browser_settings;
2282 m_browser_settings = NULL;
2289 void Browser_View::__internet_settings_cb(void *data, Evas_Object *obj, void *event_info)
2291 BROWSER_LOGD("[%s]", __func__);
2295 Browser_View *browser_view = (Browser_View *)data;
2296 browser_view->_destroy_more_context_popup();
2298 if (!browser_view->_call_internet_settings())
2299 BROWSER_LOGE("_call_internet_settings failed");
2302 void Browser_View::_update_find_word_index_text(const char *index_text, int index, int max_match_cnt)
2304 BROWSER_LOGD("[%s]", __func__);
2306 edje_object_part_text_set(elm_layout_edje_get(m_option_header_find_word_layout), "elm.index_text", index_text);
2308 if (max_match_cnt == 0 || max_match_cnt == 1) {
2309 elm_object_disabled_set(m_find_word_prev_button, EINA_TRUE);
2310 elm_object_disabled_set(m_find_word_next_button, EINA_TRUE);
2311 } else if (index == 0 || index == 1) {
2312 elm_object_disabled_set(m_find_word_prev_button, EINA_TRUE);
2313 elm_object_disabled_set(m_find_word_next_button, EINA_FALSE);
2314 if (index == 0 || (index == 1 && elm_object_focus_get(m_find_word_cancel_button)))
2315 elm_object_focus_set(m_find_word_cancel_button, EINA_TRUE);
2316 } else if (index == max_match_cnt) {
2317 elm_object_disabled_set(m_find_word_prev_button, EINA_FALSE);
2318 elm_object_disabled_set(m_find_word_next_button, EINA_TRUE);
2319 elm_object_focus_set(m_find_word_cancel_button, EINA_TRUE);
2321 if (elm_object_disabled_get(m_find_word_prev_button))
2322 elm_object_disabled_set(m_find_word_prev_button, EINA_FALSE);
2323 if (elm_object_disabled_get(m_find_word_next_button))
2324 elm_object_disabled_set(m_find_word_next_button, EINA_FALSE);
2327 void Browser_View::__find_word_cb(void *data, Evas_Object *obj, void *event_info)
2329 BROWSER_LOGD("[%s]", __func__);
2333 Browser_View *browser_view = (Browser_View *)data;
2334 browser_view->_destroy_more_context_popup();
2336 if (browser_view->_get_edit_mode() == BR_FIND_WORD_MODE)
2339 /* find word layout is only in naviframe optino header.
2340 * So expand the option header to show find word layout. */
2341 browser_view->_navigationbar_visible_set_signal(EINA_TRUE);
2343 browser_view->_set_edit_mode(BR_FIND_WORD_MODE);
2345 elm_object_focus_set(browser_view->m_find_word_edit_field, EINA_TRUE);
2347 edje_object_part_text_set(elm_layout_edje_get(browser_view->m_option_header_find_word_layout), "elm.index_text", "0/0");
2350 Eina_Bool Browser_View::_call_download_manager(void)
2352 service_h service_handle = NULL;
2353 BROWSER_LOGD("[%s]", __func__);
2355 if (service_create(&service_handle) < 0) {
2356 BROWSER_LOGE("Fail to create service handle");
2360 if (!service_handle) {
2361 BROWSER_LOGE("service handle is NULL");
2365 if (service_set_operation(service_handle, SERVICE_OPERATION_DOWNLOAD) < 0) {
2366 BROWSER_LOGE("Fail to set service operation");
2367 service_destroy(service_handle);
2371 if (service_add_extra_data(service_handle, "mode", "view") < 0) {
2372 BROWSER_LOGE("Fail to set extra data");
2373 service_destroy(service_handle);
2377 if (service_send_launch_request(service_handle, NULL, NULL) < 0) {
2378 BROWSER_LOGE("Fail to launch service operation");
2379 service_destroy(service_handle);
2383 service_destroy(service_handle);
2388 void Browser_View::__download_manager_cb(void *data, Evas_Object *obj, void *event_info)
2390 BROWSER_LOGD("[%s]", __func__);
2394 Browser_View *browser_view = (Browser_View *)data;
2395 browser_view->_destroy_more_context_popup();
2397 if (!browser_view->_call_download_manager())
2398 BROWSER_LOGE("_call_download_manager failed");
2401 void Browser_View::__send_via_message_cb(void *data, Evas_Object *obj, void *event_info)
2403 BROWSER_LOGD("[%s]", __func__);
2407 Browser_View *browser_view = (Browser_View *)data;
2408 browser_view->_destroy_more_context_popup();
2410 if (!browser_view->_send_via_message(browser_view->get_url(), std::string()))
2411 BROWSER_LOGE("_send_via_message failed");
2414 void Browser_View::__send_via_email_cb(void *data, Evas_Object *obj, void *event_info)
2416 BROWSER_LOGD("[%s]", __func__);
2420 Browser_View *browser_view = (Browser_View *)data;
2421 browser_view->_destroy_more_context_popup();
2423 if (!browser_view->_send_via_email(browser_view->get_url()))
2424 BROWSER_LOGE("_send_via_email failed");
2427 void Browser_View::__post_to_sns_cb(void *data, Evas_Object *obj, void *event_info)
2429 BROWSER_LOGD("[%s]", __func__);
2433 Browser_View *browser_view = (Browser_View*)data;
2435 Elm_Object_Item *it = (Elm_Object_Item *)event_info;
2436 const char *label = elm_object_item_text_get(it);
2437 BROWSER_LOGD("label=[%s]", label);
2438 if (label && strlen(label)) {
2439 if (!browser_view->_post_to_sns(std::string(label), browser_view->get_url()))
2440 BROWSER_LOGE("_post_to_sns failed");
2443 browser_view->_destroy_more_context_popup();
2446 void Browser_View::_destroy_more_context_popup(void)
2448 if (m_more_context_popup) {
2449 evas_object_del(m_more_context_popup);
2450 m_more_context_popup = NULL;
2453 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "hide,more_context_bg,signal", "");
2456 void Browser_View::__more_context_popup_dismissed_cb(void *data, Evas_Object *obj,
2459 BROWSER_LOGD("[%s]", __func__);
2463 Browser_View *browser_view = (Browser_View *)data;
2464 browser_view->_destroy_more_context_popup();
2467 void Browser_View::__clean_up_windows_test_cb(void *data, Evas_Object *obj, void *event_info)
2472 Browser_View *browser_view = (Browser_View *)data;
2473 browser_view->_destroy_more_context_popup();
2475 m_browser->clean_up_windows();
2478 Eina_Bool Browser_View::_show_more_context_popup(void)
2480 BROWSER_LOGD("[%s]", __func__);
2482 _destroy_more_context_popup();
2484 m_more_context_popup = elm_ctxpopup_add(m_win);
2485 if (!m_more_context_popup) {
2486 BROWSER_LOGE("elm_ctxpopup_add failed");
2490 elm_object_style_set(m_more_context_popup, "pass_event");
2492 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "show,more_context_bg,signal", "");
2494 evas_object_size_hint_weight_set(m_more_context_popup, EVAS_HINT_EXPAND,
2496 evas_object_smart_callback_add(m_more_context_popup, "dismissed",
2497 __more_context_popup_dismissed_cb, this);
2499 Elm_Object_Item *sub_menu = NULL;
2500 elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_DOWNLOAD_MANAGER, NULL,
2501 __download_manager_cb, this);
2503 sub_menu = elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_FIND_ON_PAGE, NULL,
2504 __find_word_cb, this);
2506 #if defined(FEATURE_MOST_VISITED_SITES)
2507 is_most_visited_sites_running() ||
2510 || _get_edit_mode() == BR_FIND_WORD_MODE)
2511 elm_object_item_disabled_set(sub_menu, EINA_TRUE);
2513 m_bookmark_on_off_icon = elm_icon_add(m_more_context_popup);
2515 if(m_data_manager->get_history_db()->is_in_bookmark(get_url().c_str(), NULL)) {
2516 if (!elm_icon_file_set(m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_on.png", NULL)) {
2517 BROWSER_LOGE("elm_icon_file_set is failed.\n");
2521 if (!elm_icon_file_set(m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_off.png", NULL)) {
2522 BROWSER_LOGE("elm_icon_file_set is failed.\n");
2526 evas_object_size_hint_aspect_set(m_bookmark_on_off_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
2528 evas_object_propagate_events_set(m_bookmark_on_off_icon, EINA_FALSE);
2529 evas_object_repeat_events_set(m_bookmark_on_off_icon, EINA_FALSE);
2530 evas_object_smart_callback_add(m_bookmark_on_off_icon, "clicked", __bookmark_icon_changed_cb, this);
2532 sub_menu = elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_BOOKMARK, m_bookmark_on_off_icon,
2533 __bookmark_cb, this);
2535 #if defined(FEATURE_MOST_VISITED_SITES)
2536 is_most_visited_sites_running() ||
2539 || _get_edit_mode() == BR_FIND_WORD_MODE)
2540 elm_object_item_disabled_set(sub_menu, EINA_TRUE);
2542 m_private_check = elm_check_add(m_more_context_popup);
2543 elm_object_style_set(m_private_check, "on&off");
2544 evas_object_smart_callback_add(m_private_check, "changed", __private_check_change_cb, this);
2546 elm_check_state_set(m_private_check, m_is_private);
2547 evas_object_propagate_events_set(m_private_check, EINA_FALSE);
2548 evas_object_show(m_private_check);
2550 elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_PRIVATE, m_private_check,
2551 __private_cb, this);
2553 elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_SETTINGS, NULL,
2554 __internet_settings_cb, this);
2556 elm_ctxpopup_hover_parent_set(m_more_context_popup, m_navi_bar);
2558 int controlbar_x = 0;
2559 int controlbar_y = 0;
2560 int controlbar_w = 0;
2561 int controlbar_h = 0;
2562 evas_object_geometry_get(m_control_bar, &controlbar_x, &controlbar_y, &controlbar_w, &controlbar_h);
2564 evas_object_move(m_more_context_popup, (controlbar_w / 5) * 3 + controlbar_w / 10, controlbar_y + (controlbar_h / 2));
2566 evas_object_show(m_more_context_popup);
2571 void Browser_View::__more_cb(void *data, Evas_Object *obj, void *event_info)
2573 BROWSER_LOGD("[%s]", __func__);
2577 Browser_View *browser_view = (Browser_View *)data;
2578 if (browser_view->m_more_context_popup == NULL) {
2579 if (!browser_view->_show_more_context_popup())
2580 BROWSER_LOGE("_show_more_context_popup failed");
2582 browser_view->_destroy_more_context_popup();
2584 /* To give focus out signal to webkit(for destructing webkit context menu), give focus set in unvisible button */
2585 elm_object_focus_set(browser_view->m_option_header_cancel_button, EINA_TRUE);
2587 browser_view->_navigationbar_visible_set(EINA_TRUE);
2590 void Browser_View::_set_controlbar_back_forward_status(void)
2592 BROWSER_LOGD("[%s]", __func__);
2593 Evas_Object *ewk_view = m_focused_window->m_ewk_view;
2598 #if defined(FEATURE_MOST_VISITED_SITES)
2599 is_most_visited_sites_running() ||
2602 elm_object_item_disabled_set(m_share_controlbar_button, EINA_TRUE);
2604 elm_object_item_disabled_set(m_share_controlbar_button, EINA_FALSE);
2607 void Browser_View::_set_multi_window_controlbar_text(int count)
2609 BROWSER_LOGD("[%s]", __func__);
2611 elm_toolbar_item_icon_set(m_multi_window_button, BROWSER_IMAGE_DIR"/01_controlbar_icon_multiview.png");
2613 char icon_path[100] = {0, };
2614 snprintf(icon_path, sizeof(icon_path) - 1, "%s/01_controlbar_icon_multiview_0%d.png", BROWSER_IMAGE_DIR, count);
2615 elm_toolbar_item_icon_set(m_multi_window_button, icon_path);
2619 Evas_Object *Browser_View::_create_control_bar(void)
2621 BROWSER_LOGD("[%s]", __func__);
2622 Evas_Object *controlbar_layout;
2623 controlbar_layout = elm_layout_add(m_navi_bar);
2624 if (!controlbar_layout) {
2625 BROWSER_LOGE("elm_layout_add failed");
2628 if (!elm_layout_file_set(controlbar_layout, BROWSER_EDJE_DIR"/browser-view-control-bar.edj",
2629 "browser-view-controlbar")) {
2630 BROWSER_LOGE("Can not set layout browser-view-controlbar\n");
2633 evas_object_size_hint_weight_set(controlbar_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2634 evas_object_size_hint_align_set(controlbar_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
2635 evas_object_show(controlbar_layout);
2637 Evas_Object *control_bar;
2638 control_bar = elm_toolbar_add(m_navi_bar);
2640 elm_object_style_set(control_bar, "browser/browser-view");
2642 elm_toolbar_shrink_mode_set(control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
2644 /* New Window Button */
2645 m_new_window_button = elm_toolbar_item_append(control_bar,
2646 BROWSER_IMAGE_DIR"/I01_controlbar_icon_new_window.png", NULL, __new_window_cb, this);
2647 if (!m_new_window_button) {
2648 BROWSER_LOGE("elm_toolbar_item_append failed");
2652 /* Multi Window Button */
2653 m_multi_window_button = elm_toolbar_item_append(control_bar,
2654 BROWSER_IMAGE_DIR"/01_controlbar_icon_multiview.png", NULL, __multi_window_cb, this);
2655 /* Bookmark Button */
2656 elm_toolbar_item_append(control_bar, BROWSER_IMAGE_DIR"/I01_controlbar_icon_bookmark.png",
2657 NULL, __go_to_bookmark_cb, this);
2658 /* More menu Button */
2659 m_more_button = elm_toolbar_item_append(control_bar,
2660 BROWSER_IMAGE_DIR"/I01_controlbar_icon_more.png", NULL, __more_cb, this);
2661 if (!m_more_button) {
2662 BROWSER_LOGE("elm_toolbar_item_append failed");
2666 elm_object_part_content_set(controlbar_layout, "elm.swallow.controlbar", control_bar);
2668 m_back_button = elm_button_add(control_bar);
2669 if (!m_back_button) {
2670 BROWSER_LOGE("elm_button_add failed");
2673 elm_object_style_set(m_back_button, "browser/browser_view_controlbar_back");
2675 elm_object_part_content_set(controlbar_layout, "elm.swallow.back_button", m_back_button);
2676 evas_object_smart_callback_add(m_back_button, "clicked", __backward_cb, this);
2677 evas_object_show(m_back_button);
2678 evas_object_show(control_bar);
2681 return controlbar_layout;
2685 * Create two same url layouts similar with other browsers like android & safari.
2686 * The one(by _create_url_layout) is in the browser scroller and
2687 * the other(by _create_option_header_url_layout) is in the navigation bar option header.
2689 Evas_Object *Browser_View::_create_option_header_url_layout(void)
2691 BROWSER_LOGD("[%s]", __func__);
2692 Evas_Object *url_layout;
2693 url_layout = elm_layout_add(m_navi_bar);
2695 if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
2696 "browser/url_layout")) {
2697 BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
2700 evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2701 evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
2702 evas_object_show(url_layout);
2704 m_option_header_url_entry_layout = elm_layout_add(m_navi_bar);
2705 if (!m_option_header_url_entry_layout) {
2706 BROWSER_LOGE("elm_layout_add failed");
2709 if (!elm_layout_file_set(m_option_header_url_entry_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
2710 "elm/browser/urlentry/default")) {
2711 BROWSER_LOGE("Can not set layout theme[browser, urlentry, default]\n");
2714 elm_object_part_content_set(url_layout, "elm.swallow.url", m_option_header_url_entry_layout);
2715 edje_object_signal_callback_add(elm_layout_edje_get(m_option_header_url_entry_layout),
2716 "mouse,clicked,1", "elm.swallow.entry", __url_entry_clicked_cb, this);
2718 edje_object_signal_callback_add(elm_layout_edje_get(m_option_header_url_entry_layout),
2719 "refresh_stop", "*", __refresh_button_clicked_cb, this);
2721 evas_object_show(m_option_header_url_entry_layout);
2723 m_option_header_url_edit_field = br_elm_url_editfield_add(m_navi_bar);
2724 if (!m_option_header_url_edit_field) {
2725 BROWSER_LOGE("elm_editfield_add failed");
2728 elm_entry_context_menu_item_add(br_elm_editfield_entry_get(m_option_header_url_edit_field),
2729 BR_STRING_CTXMENU_SHARE, NULL, ELM_ICON_NONE, __url_editfield_share_clicked_cb, this);
2731 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.entry", m_option_header_url_edit_field);
2732 // br_elm_editfield_entry_single_line_set(m_option_header_url_edit_field, EINA_TRUE);
2733 br_elm_editfield_eraser_set(m_option_header_url_edit_field, EINA_FALSE);
2735 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
2736 elm_entry_input_panel_layout_set(edit_field_entry, ELM_INPUT_PANEL_LAYOUT_URL);
2737 ecore_imf_context_input_panel_event_callback_add((Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry),
2738 ECORE_IMF_INPUT_PANEL_STATE_EVENT, __url_entry_imf_event_cb, this);
2740 evas_object_smart_callback_add(edit_field_entry, "activated", __url_entry_enter_key_cb, this);
2741 evas_event_callback_add(evas_object_evas_get(m_option_header_url_edit_field), EVAS_CALLBACK_CANVAS_FOCUS_OUT,
2742 __url_entry_focus_out_cb, this);
2743 evas_object_show(m_option_header_url_edit_field);
2745 m_option_header_url_progressbar = elm_progressbar_add(m_navi_bar);
2746 if (!m_option_header_url_progressbar) {
2747 BROWSER_LOGE("elm_progressbar_add failed");
2750 elm_object_style_set(m_option_header_url_progressbar, "browser/loading");
2751 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.progressbar", m_option_header_url_progressbar);
2752 elm_progressbar_value_set(m_option_header_url_progressbar, 0);
2753 evas_object_show(m_option_header_url_progressbar);
2755 m_option_header_url_progresswheel = elm_progressbar_add(m_navi_bar);
2756 if (!m_option_header_url_progresswheel) {
2757 BROWSER_LOGE("elm_progressbar_add failed");
2761 elm_object_style_set(m_option_header_url_progresswheel, "UIActivityIndicatorStyleWhite");
2763 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
2764 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.progress", m_option_header_url_progresswheel);
2765 evas_object_show(m_option_header_url_progresswheel);
2767 m_option_header_cancel_button = elm_button_add(m_navi_bar);
2768 if (!m_option_header_cancel_button) {
2769 BROWSER_LOGE("elm_button_add failed");
2772 evas_object_size_hint_weight_set(m_option_header_cancel_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2773 evas_object_size_hint_align_set(m_option_header_cancel_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
2774 elm_object_style_set(m_option_header_cancel_button, "browser/cancel_button");
2775 elm_object_text_set(m_option_header_cancel_button, BR_STRING_CANCEL);
2776 elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_option_header_cancel_button);
2777 evas_object_smart_callback_add(m_option_header_cancel_button, "clicked", __cancel_button_clicked_cb, this);
2778 evas_object_show(m_option_header_cancel_button);
2780 m_option_header_title_backward_button = elm_button_add(m_navi_bar);
2781 if (!m_option_header_title_backward_button) {
2782 BROWSER_LOGE("elm_button_add failed");
2785 elm_object_style_set(m_option_header_title_backward_button, "browser/backward");
2786 elm_object_part_content_set(url_layout, "elm.swallow.backward_button", m_option_header_title_backward_button);
2787 evas_object_smart_callback_add(m_option_header_title_backward_button, "clicked", __backward_button_clicked_cb, this);
2788 elm_object_focus_allow_set(m_option_header_title_backward_button, EINA_FALSE);
2789 evas_object_show(m_option_header_title_backward_button);
2790 elm_object_disabled_set(m_option_header_title_backward_button, EINA_TRUE);
2792 m_option_header_title_forward_button = elm_button_add(m_navi_bar);
2793 if (!m_option_header_title_forward_button) {
2794 BROWSER_LOGE("elm_button_add failed");
2797 elm_object_style_set(m_option_header_title_forward_button, "browser/forward");
2798 elm_object_part_content_set(url_layout, "elm.swallow.forward_button", m_option_header_title_forward_button);
2799 evas_object_smart_callback_add(m_option_header_title_forward_button, "clicked", __forward_button_clicked_cb, this);
2800 elm_object_focus_allow_set(m_option_header_title_forward_button, EINA_FALSE);
2801 evas_object_show(m_option_header_title_forward_button);
2802 elm_object_disabled_set(m_option_header_title_forward_button, EINA_TRUE);
2804 /* for jump to top. */
2805 evas_object_event_callback_add(url_layout, EVAS_CALLBACK_MOUSE_DOWN, __option_header_url_layout_mouse_down_cb, this);
2811 Evas_Object *Browser_View::_get_activated_url_entry(void)
2813 /* The edit field in option header url layout is only valid for edit.
2814 * If the edit field in browser scroller can have focus, there is so many focus issue.
2815 * So just make the edit field in option header editable. */
2816 return m_option_header_url_edit_field;
2819 void Browser_View::__url_entry_imf_event_cb(void *data, Ecore_IMF_Context *ctx, int value)
2821 BROWSER_LOGD("value=%d", value);
2825 Browser_View *browser_view = (Browser_View *)data;
2826 if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
2827 Evas_Object *edit_field_entry;
2828 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
2829 elm_object_focus_set(edit_field_entry, EINA_FALSE);
2831 if (browser_view->m_edit_mode != BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF
2832 && browser_view->m_edit_mode != BR_FIND_WORD_MODE)
2833 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2836 } else if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW)
2837 /* If the focus of url entry is set automatically, the keypad is also displayed automatically. */
2838 /* eg. At url edit mode, lock the screen -> then unlock, the url entry will get focus. */
2839 /* The keypad is also invoked, so set the edit mode. */
2840 browser_view->_set_edit_mode(BR_URL_ENTRY_EDIT_MODE);
2843 void Browser_View::__url_entry_focus_out_cb(void *data, Evas *e, void *event_info)
2845 BROWSER_LOGD("[%s]", __func__);
2849 Browser_View *browser_view = (Browser_View *)data;
2850 Evas_Object *edit_field_entry;
2851 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
2853 Ecore_IMF_Context *ic = (Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry);
2857 ecore_imf_context_input_panel_hide(ic);
2859 if (browser_view->m_edit_mode != BR_FIND_WORD_MODE)
2860 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2863 void Browser_View::_set_edit_mode(edit_mode mode)
2865 BROWSER_LOGD("mode = %d", mode);
2867 if (m_edit_mode == mode)
2870 #if defined(FEATURE_MOST_VISITED_SITES)
2871 if (mode == BR_NO_EDIT_MODE) {
2872 if (m_most_visited_sites) {
2873 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,on,signal", "");
2874 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2875 "url_guide_text,on,signal", "");
2878 if (m_most_visited_sites) {
2879 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,off,signal", "");
2880 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2881 "url_guide_text,off,signal", "");
2886 if (mode == BR_URL_ENTRY_EDIT_MODE || mode == BR_FIND_WORD_MODE
2887 || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
2888 #ifdef BROWSER_SCROLLER_BOUNCING
2889 /* If edit mode, lock the browser scroller */
2890 _enable_webview_scroll();
2892 /* Make the browser scroller region y = 0 to show url bar all at edit mode. */
2896 elm_scroller_region_get(m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
2897 elm_scroller_region_show(m_scroller ,scroller_x, 0, scroller_w, scroller_h);
2900 if (mode == BR_URL_ENTRY_EDIT_MODE) {
2901 /* change layout of url layout for edit mode. */
2902 edje_object_signal_emit(elm_layout_edje_get(m_url_layout), "edit,url,on,signal", "");
2903 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2904 "edit,url,on,signal", "");
2906 /* change refresh icon in url entry for edit mode. */
2907 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "edit,url,on,signal", "");
2908 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2909 "edit,url,on,signal", "");
2911 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "hide,favicon,signal", "");
2912 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2913 "hide,favicon,signal", "");
2914 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
2915 "edit,url,on,signal", "");
2916 } else if (mode == BR_NO_EDIT_MODE || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
2917 if (m_edit_mode == BR_FIND_WORD_MODE) {
2918 edje_object_signal_emit(elm_layout_edje_get(m_option_header_layout), "hide,find_word_layout,signal", "");
2919 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "show,control_bar,no_animation,signal", "");
2920 m_find_word->find_word("", Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
2922 /* change layout of url layout for normal mode. */
2923 edje_object_signal_emit(elm_layout_edje_get(m_url_layout), "edit,url,off,signal", "");
2924 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2925 "edit,url,off,signal", "");
2927 /* change refresh icon in url entry for normal mode. */
2928 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "edit,url,off,signal", "");
2929 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2930 "edit,url,off,signal", "");
2932 #if defined(FEATURE_MOST_VISITED_SITES)
2933 if (!is_most_visited_sites_running())
2936 if (m_focused_window->m_favicon)
2937 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
2938 "show,favicon,signal", "");
2939 if (m_focused_window->m_option_header_favicon)
2940 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2941 "show,favicon,signal", "");
2945 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
2946 "edit,url,off,signal", "");
2947 if (_is_loading()) {
2948 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,on,signal", "");
2949 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2950 "loading,on,signal", "");
2953 } else if (mode == BR_FIND_WORD_MODE) {
2954 Evas_Object *find_word_edit_field_entry = br_elm_editfield_entry_get(m_find_word_edit_field);
2955 elm_entry_entry_set(find_word_edit_field_entry, "");
2957 evas_object_smart_callback_del(find_word_edit_field_entry, "changed", __find_word_entry_changed_cb);
2958 evas_object_smart_callback_add(find_word_edit_field_entry, "changed", __find_word_entry_changed_cb, this);
2960 edje_object_signal_emit(elm_layout_edje_get(m_option_header_layout), "show,find_word_layout,signal", "");
2965 /* To show favicon, if click url entry while loading, then cancel case. */
2970 * The url entry of option header can't be focusable in case of switch TEXTBLOCK & elm entry.
2971 * So focus the url entry in idler callback.
2973 static Eina_Bool __url_entry_focus_idler_cb(void *data)
2975 Evas_Object *edit_field = (Evas_Object *)data;
2976 elm_object_focus_set(edit_field, EINA_TRUE);
2978 Evas_Object *entry = br_elm_editfield_entry_get(edit_field);
2979 elm_entry_cursor_end_set(entry);
2981 return ECORE_CALLBACK_CANCEL;
2984 void Browser_View::__url_entry_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
2986 BROWSER_LOGD("[%s]", __func__);
2990 Browser_View *browser_view = (Browser_View *)data;
2992 if (browser_view->_is_loading())
2993 browser_view->_stop_loading();
2995 if (!browser_view->_navigationbar_visible_get()) {
2996 /* The edit field in option header is only for edit url. */
2997 browser_view->_navigationbar_visible_set_signal(EINA_TRUE);
3000 browser_view->_destroy_more_context_popup();
3002 edit_mode mode = browser_view->_get_edit_mode();
3004 browser_view->_set_edit_mode(BR_URL_ENTRY_EDIT_MODE);
3006 if (mode == BR_NO_EDIT_MODE) {
3007 Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field);
3009 elm_object_focus_set(browser_view->m_option_header_url_edit_field, EINA_TRUE);
3011 const char *url_text = elm_entry_entry_get(entry);
3012 if (url_text && strlen(url_text))
3013 elm_entry_select_all(entry);
3014 elm_entry_cursor_end_set(entry);
3016 // ecore_idler_add(__url_entry_focus_idler_cb, browser_view->m_option_header_url_edit_field);
3020 Eina_Bool Browser_View::_is_option_header_expanded(void)
3022 return _navigationbar_visible_get();
3025 void Browser_View::__cancel_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3027 BROWSER_LOGD("[%s]", __func__);
3031 Browser_View *browser_view = (Browser_View *)data;
3032 Evas_Object *ewk_view = browser_view->m_focused_window->m_ewk_view;
3036 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
3038 elm_object_signal_emit(browser_view->m_option_header_url_edit_field, "ellipsis_show,signal", "elm");
3039 elm_object_signal_emit(browser_view->m_url_edit_field, "ellipsis_show,signal", "elm");
3041 browser_view->_set_url_entry(browser_view->get_url().c_str());
3044 void Browser_View::__refresh_button_clicked_cb(void *data, Evas_Object *obj,
3045 const char *emission, const char *source)
3047 BROWSER_LOGD("[%s]", __func__);
3051 Browser_View *browser_view = (Browser_View *)data;
3052 if (browser_view->_get_edit_mode() == BR_URL_ENTRY_EDIT_MODE) {
3053 elm_entry_entry_set(br_elm_editfield_entry_get(browser_view->m_url_edit_field), "");
3054 elm_entry_entry_set(br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field), "");
3055 } else if(browser_view->_is_loading())
3056 browser_view->_stop_loading();
3058 browser_view->_reload();
3061 void Browser_View::__url_entry_enter_key_cb(void *data, Evas_Object *obj, void *event_info)
3063 BROWSER_LOGD("[%s]", __func__);
3067 Browser_View *browser_view = (Browser_View *)data;
3068 Evas_Object *ewk_view = browser_view->m_focused_window->m_ewk_view;
3069 Evas_Object *edit_field_entry;
3070 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
3073 * Give focus to option header cancel button to hide imf. */
3074 elm_object_focus_set(browser_view->m_option_header_cancel_button, EINA_TRUE);
3076 char *url = elm_entry_markup_to_utf8(elm_entry_entry_get(edit_field_entry));
3077 BROWSER_LOGD("input url = [%s]", url);
3079 if (url && strlen(url)) {
3080 browser_view->load_url(url);
3086 void Browser_View::__url_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
3088 BROWSER_LOGD("[%s]", __func__);
3091 void Browser_View::__url_layout_mouse_down_cb(void *data, Evas* evas, Evas_Object *obj,
3094 BROWSER_LOGD("[%s]", __func__);
3098 Evas_Event_Mouse_Down event = *(Evas_Event_Mouse_Down *)event_info;
3100 Browser_View *browser_view = (Browser_View *)data;
3102 Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_url_edit_field);
3108 evas_object_geometry_get(browser_view->m_url_edit_field, &entry_x, &entry_y, &entry_w, &entry_h);
3110 if (event.output.x > entry_x && event.output.x < entry_x + entry_w &&
3111 event.output.y > entry_y && event.output.y < entry_y + entry_h) {
3112 elm_object_signal_emit(browser_view->m_option_header_url_edit_field, "ellipsis_hide,signal", "elm");
3113 elm_object_signal_emit(browser_view->m_url_edit_field, "ellipsis_hide,signal", "elm");
3116 edit_mode mode = browser_view->_get_edit_mode();
3117 if (mode == BR_URL_ENTRY_EDIT_MODE || mode == BR_FIND_WORD_MODE
3118 || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
3119 #ifdef BROWSER_SCROLLER_BOUNCING
3120 BROWSER_LOGD("<< lock browser scroller >>");
3121 elm_object_scroll_freeze_pop(browser_view->m_scroller);
3122 elm_object_scroll_freeze_push(browser_view->m_scroller);
3127 void Browser_View::__option_header_url_layout_mouse_down_cb(void *data, Evas* evas, Evas_Object *obj,
3130 BROWSER_LOGD("[%s]", __func__);
3133 Evas_Event_Mouse_Down event = *(Evas_Event_Mouse_Down *)event_info;
3134 Browser_View *browser_view = (Browser_View *)data;
3136 Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field);
3142 evas_object_geometry_get(browser_view->m_option_header_url_edit_field, &entry_x, &entry_y, &entry_w, &entry_h);
3144 if (event.output.x > entry_x && event.output.x < entry_x + entry_w &&
3145 event.output.y > entry_y && event.output.y < entry_y + entry_h) {
3146 elm_object_signal_emit(browser_view->m_option_header_url_edit_field, "ellipsis_hide,signal", "elm");
3147 elm_object_signal_emit(browser_view->m_url_edit_field, "ellipsis_hide,signal", "elm");
3151 if (event.output.y < icon_y)
3152 browser_view->_jump_to_top();
3155 void Browser_View::_update_back_forward_buttons(void)
3157 BROWSER_LOGD("[%s]", __func__);
3158 if (ewk_view_back_possible(m_focused_window->m_ewk_view)) {
3159 elm_object_disabled_set(m_title_backward_button, EINA_FALSE);
3160 elm_object_disabled_set(m_option_header_title_backward_button, EINA_FALSE);
3162 elm_object_disabled_set(m_title_backward_button, EINA_TRUE);
3163 elm_object_disabled_set(m_option_header_title_backward_button, EINA_TRUE);
3166 if (ewk_view_forward_possible(m_focused_window->m_ewk_view)) {
3167 elm_object_disabled_set(m_title_forward_button, EINA_FALSE);
3168 elm_object_disabled_set(m_option_header_title_forward_button, EINA_FALSE);
3170 elm_object_disabled_set(m_title_forward_button, EINA_TRUE);
3171 elm_object_disabled_set(m_option_header_title_forward_button, EINA_TRUE);
3175 void Browser_View::__backward_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3177 BROWSER_LOGD("[%s]", __func__);
3181 Browser_View *browser_view = (Browser_View *)data;
3182 ewk_view_back(browser_view->m_focused_window->m_ewk_view);
3185 void Browser_View::__forward_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3187 BROWSER_LOGD("[%s]", __func__);
3191 Browser_View *browser_view = (Browser_View *)data;
3192 ewk_view_forward(browser_view->m_focused_window->m_ewk_view);
3195 Evas_Object *Browser_View::_create_url_layout(void)
3197 BROWSER_LOGD("[%s]", __func__);
3198 Evas_Object *url_layout;
3199 url_layout = elm_layout_add(m_navi_bar);
3201 if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
3202 "browser/url_layout")) {
3203 BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
3206 evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, 0.0);
3207 evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3208 evas_object_show(url_layout);
3210 /* create url entry layout in url layout */
3211 m_url_entry_layout = elm_layout_add(m_navi_bar);
3212 if (!m_url_entry_layout) {
3213 BROWSER_LOGE("elm_layout_add failed");
3216 if (!elm_layout_file_set(m_url_entry_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
3217 "elm/browser/urlentry/default")) {
3218 BROWSER_LOGE("Can not set layout theme[browser, urlentry, default]\n");
3221 elm_object_part_content_set(url_layout, "elm.swallow.url", m_url_entry_layout);
3222 evas_object_show(m_url_entry_layout);
3224 m_url_edit_field = br_elm_url_editfield_add(m_navi_bar);
3225 if (!m_url_edit_field) {
3226 BROWSER_LOGE("elm_editfield_add failed");
3229 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.entry", m_url_edit_field);
3230 // br_elm_editfield_entry_single_line_set(m_url_edit_field, EINA_TRUE);
3231 br_elm_editfield_eraser_set(m_url_edit_field, EINA_FALSE);
3233 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(m_url_edit_field);
3234 elm_entry_editable_set(edit_field_entry, EINA_FALSE);
3235 /* The edit field in browser scroller is only for display.
3236 * The edit url is only supported in option header url entry. */
3237 elm_object_focus_allow_set(m_url_edit_field, EINA_FALSE);
3238 elm_object_focus_allow_set(edit_field_entry, EINA_FALSE);
3239 elm_entry_input_panel_enabled_set(edit_field_entry, EINA_FALSE);
3241 elm_entry_text_style_user_push(edit_field_entry, "DEFAULT='font_size=35 color=#3C3632 ellipsis=1'");
3242 evas_object_show(m_url_edit_field);
3244 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "disable_entry,signal", "");
3245 edje_object_signal_callback_add(elm_layout_edje_get(m_url_entry_layout), "mouse,clicked,1", "block_entry",
3246 __url_entry_clicked_cb, this);
3248 edje_object_signal_callback_add(elm_layout_edje_get(m_url_entry_layout), "refresh_stop", "*",
3249 __refresh_button_clicked_cb, this);
3251 m_url_progressbar = elm_progressbar_add(m_navi_bar);
3252 if (!m_url_progressbar) {
3253 BROWSER_LOGE("elm_progressbar_add failed");
3256 elm_object_style_set(m_url_progressbar, "browser/loading");
3257 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.progressbar", m_url_progressbar);
3258 elm_progressbar_value_set(m_url_progressbar, 0);
3259 evas_object_show(m_url_progressbar);
3261 m_url_progresswheel = elm_progressbar_add(m_navi_bar);
3262 if (!m_url_progresswheel) {
3263 BROWSER_LOGE("elm_progressbar_add failed");
3267 elm_object_style_set(m_url_progresswheel, "UIActivityIndicatorStyleWhite");
3268 elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
3269 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.progress", m_url_progresswheel);
3270 evas_object_show(m_url_progresswheel);
3272 m_cancel_button = elm_button_add(m_navi_bar);
3273 if (!m_cancel_button) {
3274 BROWSER_LOGE("elm_button_add failed");
3277 evas_object_size_hint_weight_set(m_cancel_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3278 evas_object_size_hint_align_set(m_cancel_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
3279 elm_object_style_set(m_cancel_button, "browser/cancel_button");
3280 elm_object_text_set(m_cancel_button, BR_STRING_CANCEL);
3281 elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_cancel_button);
3282 evas_object_smart_callback_add(m_cancel_button, "clicked", __cancel_button_clicked_cb, this);
3283 evas_object_show(m_cancel_button);
3285 m_title_backward_button = elm_button_add(m_navi_bar);
3286 if (!m_title_backward_button) {
3287 BROWSER_LOGE("elm_button_add failed");
3290 elm_object_style_set(m_title_backward_button, "browser/backward");
3291 elm_object_part_content_set(url_layout, "elm.swallow.backward_button", m_title_backward_button);
3292 evas_object_smart_callback_add(m_title_backward_button, "clicked", __backward_button_clicked_cb, this);
3293 elm_object_focus_allow_set(m_title_backward_button, EINA_FALSE);
3294 evas_object_show(m_title_backward_button);
3295 elm_object_disabled_set(m_title_backward_button, EINA_TRUE);
3297 m_title_forward_button = elm_button_add(m_navi_bar);
3298 if (!m_title_forward_button) {
3299 BROWSER_LOGE("elm_button_add failed");
3302 elm_object_style_set(m_title_forward_button, "browser/forward");
3303 elm_object_part_content_set(url_layout, "elm.swallow.forward_button", m_title_forward_button);
3304 evas_object_smart_callback_add(m_title_forward_button, "clicked", __forward_button_clicked_cb, this);
3305 elm_object_focus_allow_set(m_title_forward_button, EINA_FALSE);
3306 evas_object_show(m_title_forward_button);
3307 elm_object_disabled_set(m_title_forward_button, EINA_TRUE);
3310 * When edit mode, if scroll down on url layout in browser view,
3311 * the browser can be scrolled even though scroll locked.
3312 * So, lock the browser scroller whenever touch on it if edit mode.
3314 evas_object_event_callback_add(url_layout, EVAS_CALLBACK_MOUSE_DOWN, __url_layout_mouse_down_cb, this);
3320 Evas_Object *Browser_View::_create_find_word_layout(void)
3322 BROWSER_LOGD("[%s]", __func__);
3323 Evas_Object *url_layout = elm_layout_add(m_navi_bar);
3325 BROWSER_LOGE("elm_layout_add failed");
3328 if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-find-word-layout.edj",
3329 "browser-view/find_word_layout")) {
3330 BROWSER_LOGE("Can not set layout theme[browser-view/find_word_layout]\n");
3333 evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, 0.0);
3334 evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3335 evas_object_show(url_layout);
3337 /* create url entry layout in url layout */
3338 m_find_word_entry_layout = elm_layout_add(m_navi_bar);
3339 if (!m_find_word_entry_layout) {
3340 BROWSER_LOGE("elm_layout_add failed");
3343 if (!elm_layout_file_set(m_find_word_entry_layout, BROWSER_EDJE_DIR"/browser-view-find-word-layout.edj",
3344 "browser-view/find_word_editfield_layout")) {
3345 BROWSER_LOGE("browser-view/find_word_editfield_layout failed");
3348 elm_object_part_content_set(url_layout, "elm.swallow.url", m_find_word_entry_layout);
3349 evas_object_show(m_find_word_entry_layout);
3351 edje_object_part_text_set(elm_layout_edje_get(url_layout), "title_text", BR_STRING_FIND_ON_PAGE);
3353 m_find_word_edit_field = br_elm_find_word_editfield_add(m_navi_bar);
3354 if (!m_find_word_edit_field) {
3355 BROWSER_LOGE("elm_editfield_add failed");
3358 elm_object_part_content_set(m_find_word_entry_layout, "elm.swallow.entry", m_find_word_edit_field);
3359 evas_object_show(m_find_word_edit_field);
3361 edje_object_signal_emit(elm_layout_edje_get(m_find_word_edit_field), "find_word,signal", "elm");
3363 // br_elm_editfield_entry_single_line_set(m_find_word_edit_field, EINA_TRUE);
3364 br_elm_editfield_eraser_set(m_find_word_edit_field, EINA_TRUE);
3366 elm_object_signal_callback_add(m_find_word_edit_field, "elm,eraser,clicked", "elm",
3367 __find_word_erase_button_clicked_cb, this);
3369 Evas_Object *find_word_edit_field_entry = br_elm_editfield_entry_get(m_find_word_edit_field);
3370 elm_entry_entry_set(find_word_edit_field_entry, "");
3371 evas_object_smart_callback_add(find_word_edit_field_entry, "activated", __find_word_entry_enter_key_cb, this);
3372 elm_entry_input_panel_layout_set(find_word_edit_field_entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
3373 elm_entry_prediction_allow_set(find_word_edit_field_entry, EINA_FALSE);
3374 ecore_imf_context_input_panel_event_callback_add((Ecore_IMF_Context *)elm_entry_imf_context_get(find_word_edit_field_entry),
3375 ECORE_IMF_INPUT_PANEL_STATE_EVENT, __find_word_entry_imf_event_cb, this);
3376 elm_entry_text_style_user_push(find_word_edit_field_entry, "DEFAULT='font_size=35 color=#3C3632 ellipsis=1'");
3377 evas_object_show(m_find_word_edit_field);
3379 m_find_word_cancel_button = elm_button_add(m_navi_bar);
3380 if (!m_find_word_cancel_button) {
3381 BROWSER_LOGE("elm_button_add failed");
3384 elm_object_style_set(m_find_word_cancel_button, "browser/cancel_button");
3385 elm_object_text_set(m_find_word_cancel_button, BR_STRING_CANCEL);
3386 elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_find_word_cancel_button);
3387 evas_object_show(m_find_word_cancel_button);
3389 evas_object_smart_callback_add(m_find_word_cancel_button, "clicked", __find_word_cancel_button_clicked_cb, this);
3391 m_find_word_prev_button = elm_button_add(m_navi_bar);
3392 if (!m_find_word_prev_button) {
3393 BROWSER_LOGE("elm_button_add failed");
3396 elm_object_style_set(m_find_word_prev_button, "browser/find_word_prev_but");
3397 elm_object_part_content_set(url_layout, "elm.swallow.find_word_prev", m_find_word_prev_button);
3398 evas_object_show(m_find_word_prev_button);
3399 evas_object_smart_callback_add(m_find_word_prev_button, "clicked", __find_word_prev_button_clicked_cb, this);
3401 m_find_word_next_button = elm_button_add(m_navi_bar);
3402 if (!m_find_word_next_button) {
3403 BROWSER_LOGE("elm_button_add failed");
3406 elm_object_style_set(m_find_word_next_button, "browser/find_word_next_but");
3407 elm_object_part_content_set(url_layout, "elm.swallow.find_word_next", m_find_word_next_button);
3408 evas_object_show(m_find_word_next_button);
3409 evas_object_smart_callback_add(m_find_word_next_button, "clicked", __find_word_next_button_clicked_cb, this);
3411 const char *current_theme = elm_theme_get(NULL);
3412 if (current_theme && strstr(current_theme, "white")) {
3414 // edje_object_signal_emit(elm_layout_edje_get(m_find_word_entry_layout),
3415 // "black_theme,signal", "");
3421 void Browser_View::__find_word_erase_button_clicked_cb(void *data, Evas_Object *obj,
3422 const char *emission, const char *source)
3424 BROWSER_LOGD("[%s]", __func__);
3425 Browser_View *browser_view = (Browser_View *)data;
3426 edje_object_part_text_set(elm_layout_edje_get(browser_view->m_option_header_find_word_layout), "elm.index_text", "0/0");
3429 void Browser_View::__find_word_cancel_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3431 BROWSER_LOGD("[%s]", __func__);
3435 Browser_View *browser_view = (Browser_View *)data;
3436 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
3437 browser_view->m_find_word->find_word("", Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3440 void Browser_View::__find_word_prev_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3442 BROWSER_LOGD("[%s]", __func__);
3446 Browser_View *browser_view = (Browser_View *)data;
3447 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,control_bar,no_animation,signal", "");
3448 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3449 const char *find_word = elm_entry_entry_get(edit_field_entry);
3450 if (!find_word || !strlen(find_word))
3453 int index = browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_BACKWARD);
3455 elm_object_focus_set(browser_view->m_find_word_cancel_button, EINA_TRUE);
3457 void Browser_View::__find_word_next_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3459 BROWSER_LOGD("[%s]", __func__);
3463 Browser_View *browser_view = (Browser_View *)data;
3464 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,control_bar,no_animation,signal", "");
3465 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3466 const char *find_word = elm_entry_entry_get(edit_field_entry);
3467 if (!find_word || !strlen(find_word))
3470 int index = browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3471 if (index == browser_view->m_find_word->get_match_max_value())
3472 elm_object_focus_set(browser_view->m_find_word_cancel_button, EINA_TRUE);
3475 void Browser_View::__find_word_entry_imf_event_cb(void *data, Ecore_IMF_Context *ctx, int value)
3477 BROWSER_LOGD("value=%d", value);
3481 Browser_View *browser_view = (Browser_View *)data;
3482 Evas_Object *find_word_editfield_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3484 if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE)
3485 elm_object_focus_set(find_word_editfield_entry, EINA_FALSE);
3487 elm_object_focus_set(find_word_editfield_entry, EINA_TRUE);
3490 void Browser_View::_enable_browser_scroller_scroll(void)
3492 #ifdef BROWSER_SCROLLER_BOUNCING
3493 if (!ewk_view_vertical_panning_hold_get(m_focused_window->m_ewk_view)
3494 && !_is_loading() && !m_is_full_screen) {
3495 BROWSER_LOGD("<< unlock browser scroller, lock ewk view >>");
3496 elm_object_scroll_freeze_pop(m_scroller);
3497 ewk_view_vertical_panning_hold_set(m_focused_window->m_ewk_view, EINA_TRUE);
3502 void Browser_View::_enable_webview_scroll(void)
3504 #ifdef BROWSER_SCROLLER_BOUNCING
3505 if (ewk_view_vertical_panning_hold_get(m_focused_window->m_ewk_view)) {
3506 BROWSER_LOGD("<< lock browser scroller, unlock ewk view >>");
3507 elm_object_scroll_freeze_pop(m_scroller);
3508 elm_object_scroll_freeze_push(m_scroller);
3509 ewk_view_vertical_panning_hold_set(m_focused_window->m_ewk_view, EINA_FALSE);
3514 void Browser_View::__find_word_entry_enter_key_cb(void *data, Evas_Object *obj, void *event_info)
3516 BROWSER_LOGD("[%s]", __func__);
3520 Browser_View *browser_view = (Browser_View *)data;
3521 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,control_bar,no_animation,signal", "");
3522 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3523 const char *find_word = elm_entry_entry_get(edit_field_entry);
3524 if (!find_word || !strlen(find_word))
3527 browser_view->m_find_word->init_index();
3528 browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3530 elm_object_focus_set(edit_field_entry, EINA_FALSE);
3531 BROWSER_LOGD("find_word=[%s]", find_word);
3534 void Browser_View::__find_word_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
3536 BROWSER_LOGD("[%s]", __func__);
3540 Browser_View *browser_view = (Browser_View *)data;
3541 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3542 const char *find_word = elm_entry_entry_get(edit_field_entry);
3544 browser_view->m_find_word->init_index();
3545 browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3549 void Browser_View::_navigationbar_title_clicked(void)
3551 BROWSER_LOGD("[%s]", __func__);
3552 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
3553 Evas_Object *content = elm_object_item_content_get(top_it);
3554 if (content != m_main_layout)
3557 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)
3558 #if defined(FEATURE_MOST_VISITED_SITES)
3559 || is_most_visited_sites_running()
3561 || m_edit_mode != BR_NO_EDIT_MODE)
3568 elm_scroller_region_get(m_scroller, &scroller_x, &scroller_y, &scroller_w, &scroller_h);
3570 if (scroller_y == 0) {
3571 /* scroller is on top, the url bar in scroller is fully being displayed.
3572 * Then, just show/hide the tool bar. */
3573 const char* state = edje_object_part_state_get(elm_layout_edje_get(m_main_layout),
3574 "elm.swallow.control_bar", NULL);
3575 if(state && !strncmp(state, "default", strlen("default")))
3576 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "show,control_bar,signal", "");
3578 #ifdef BROWSER_SCROLLER_BOUNCING
3579 int url_layout_h = 0;
3580 evas_object_geometry_get(m_url_layout, NULL, NULL, NULL, &url_layout_h);
3581 elm_scroller_region_bring_in(m_scroller ,scroller_x, url_layout_h, scroller_w, scroller_h);
3585 if (_is_loading()) {
3587 Eina_Bool visible = _navigationbar_visible_get();
3588 #ifdef BROWSER_SCROLLER_BOUNCING
3589 _navigationbar_visible_set(!visible);
3596 void Browser_View::_jump_to_top(void)
3598 BROWSER_LOGD("[%s]", __func__);
3599 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
3600 Evas_Object *content = elm_object_item_content_get(top_it);
3601 if (content != m_main_layout)
3604 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)
3605 #if defined(FEATURE_MOST_VISITED_SITES)
3606 || is_most_visited_sites_running()
3608 || m_edit_mode != BR_NO_EDIT_MODE)
3611 int browser_scroller_x = 0;
3612 int browser_scroller_w = 0;
3613 int browser_scroller_h = 0;
3614 elm_scroller_region_get(m_scroller, &browser_scroller_x, NULL,
3615 &browser_scroller_w, &browser_scroller_h);
3616 elm_scroller_region_show(m_scroller, browser_scroller_x, 0, browser_scroller_w, browser_scroller_h);
3618 ewk_view_top_of_contents_go(m_focused_window->m_ewk_view);
3621 void Browser_View::delete_non_user_created_windows(void)
3623 BROWSER_LOGD("[%s]", __func__);
3624 /* Delete no-backward history window. */
3625 std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3626 int window_count = window_list.size();
3628 if (window_count <= 1)
3632 for (i = 0 ; i < window_count ; i++) {
3633 BROWSER_LOGD("focusable_window = %d, window[%d]=%d", m_focused_window, i, window_list[i]);
3634 if (window_list[i]->m_ewk_view
3635 &&!ewk_view_back_possible(window_list[i]->m_ewk_view)
3636 && window_list[i] != m_focused_window
3637 && window_list[i]->m_created_by_user == EINA_FALSE) {
3638 BROWSER_LOGD("delete window index=[%d]", i);
3639 m_browser->delete_window(window_list[i]);
3641 /* Set title & url with the focused window. */
3642 _set_navigationbar_title(get_title().c_str());
3643 _set_url_entry(get_url().c_str());
3644 _set_controlbar_back_forward_status();
3645 if (!_set_favicon())
3646 BROWSER_LOGE("_set_favicon failed");
3651 void Browser_View::__title_back_button_clicked_cb(void *data , Evas_Object *obj, void *event_info)
3653 BROWSER_LOGD("[%s]", __func__);
3657 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
3658 BROWSER_LOGD("close multi window");
3659 m_data_manager->get_multi_window_view()->close_multi_window();
3663 Browser_View *browser_view = (Browser_View *)data;
3665 if (browser_view->m_focused_window->m_ewk_view
3666 && ewk_view_back_possible(browser_view->m_focused_window->m_ewk_view))
3667 ewk_view_back(browser_view->m_focused_window->m_ewk_view);
3669 if (browser_view->m_focused_window->m_parent) {
3670 /* Save current window pointer to delete later. */
3671 Browser_Window *delete_window = browser_view->m_focused_window;
3672 browser_view->m_browser->set_focused_window(browser_view->m_focused_window->m_parent);
3673 browser_view->m_browser->delete_window(delete_window);
3675 /* Set title & url with the focused window. */
3676 browser_view->_set_navigationbar_title(browser_view->get_title().c_str());
3677 browser_view->_set_url_entry(browser_view->get_url().c_str());
3678 browser_view->_set_controlbar_back_forward_status();
3679 if (!browser_view->_set_favicon())
3680 BROWSER_LOGE("_set_favicon failed");
3682 elm_win_lower(browser_view->m_win);
3684 browser_view->delete_non_user_created_windows();
3689 void Browser_View::__scroller_scroll_cb(void *data, Evas_Object *obj, void *event_info)
3691 #ifdef BROWSER_SCROLLER_BOUNCING
3695 Browser_View *browser_view = (Browser_View *)data;
3697 int browser_scroller_x = 0;
3698 int browser_scroller_y = 0;
3699 int browser_scroller_w = 0;
3700 int browser_scroller_h = 0;
3701 elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, &browser_scroller_y,
3702 &browser_scroller_w, &browser_scroller_h);
3704 int url_layout_h = 0;
3705 evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
3708 * If user scrolls up/down near the url bar edge, the movement of scroller is not smooth.
3709 * It's because the browser scroller region y is also bouncing.
3710 * So if the scroller region y is bigger than the height of url bar(65 pixel),
3711 * make the region y to url bar height by force. */
3712 if (browser_scroller_y > url_layout_h)
3713 elm_scroller_region_show(browser_view->m_scroller, browser_scroller_x, url_layout_h,
3714 browser_scroller_w, browser_scroller_h);
3718 Eina_Bool Browser_View::_is_loading(void)
3720 if (!m_focused_window || !m_focused_window->m_ewk_view)
3723 double progress = ewk_view_load_progress_get(m_focused_window->m_ewk_view);
3724 // BROWSER_LOGD("progress=%f", progress);
3725 if (progress == 1.0f || progress < 0.05f)
3731 Eina_Bool Browser_View::launch_find_word_with_text(const char *text_to_find)
3735 if (_get_edit_mode() == BR_FIND_WORD_MODE)
3738 _navigationbar_visible_set_signal(EINA_TRUE);
3739 _set_edit_mode(BR_FIND_WORD_MODE);
3741 if (!text_to_find || !strlen(text_to_find))
3742 elm_object_focus_set(m_find_word_edit_field, EINA_TRUE);
3744 elm_object_focus_set(m_find_word_edit_field, EINA_FALSE);
3745 edje_object_part_text_set(elm_layout_edje_get(m_option_header_find_word_layout), "elm.index_text", "0/0");
3747 Evas_Object *find_word_edit_field_entry = br_elm_editfield_entry_get(m_find_word_edit_field);
3748 elm_entry_entry_set(find_word_edit_field_entry, text_to_find);
3753 #if defined(HORIZONTAL_UI)
3754 Eina_Bool Browser_View::is_available_to_rotate(void)
3757 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
3758 if (m_data_manager->get_multi_window_view()->is_reordering_mode())
3762 if (m_scissorbox_view)
3768 Eina_Bool Browser_View::__rotate_multi_window_cb(void *data)
3770 BROWSER_LOGD("[%s]", __func__);
3771 Browser_View *browser_view = (Browser_View *)data;
3772 browser_view->m_multi_window_rotate_timer = NULL;
3773 browser_view->_rotate_multi_window();
3775 return ECORE_CALLBACK_CANCEL;
3778 void Browser_View::rotate(int degree)
3781 /* In landscape mode, if the url bar is not displayed -> rotate to portrait mode.
3782 * Then the url bar is displayed. To avoid this issue, remember the scroller region y,
3783 * then restore it at portrait mode. */
3784 int scroller_region_y = 0;
3785 elm_scroller_region_get(m_scroller, NULL, &scroller_region_y, NULL, NULL);
3786 m_scroller_region_y = scroller_region_y;
3788 m_rotate_degree = degree;
3790 #if defined(FEATURE_MOST_VISITED_SITES)
3791 if (m_most_visited_sites)
3792 m_most_visited_sites->rotate();
3794 if (m_scissorbox_view)
3795 _destroy_scissorbox_view();
3798 void Browser_View::suspend_ewk_view(Evas_Object *ewk_view)
3800 BROWSER_LOGD("[%s]", __func__);
3802 std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3803 for (int i = 0 ; i < window_list.size() ; i++) {
3804 if (window_list[i]->m_ewk_view_layout) {
3805 edje_object_signal_emit(elm_layout_edje_get(window_list[i]->m_ewk_view_layout),
3806 "unresizable,signal", "");
3811 ewk_view_suspend(ewk_view);
3812 ewk_view_visibility_set(ewk_view, EINA_FALSE);
3815 void Browser_View::resume_ewk_view(Evas_Object *ewk_view)
3817 BROWSER_LOGD("[%s]", __func__);
3819 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
3822 ewk_view_resume(ewk_view);
3823 ewk_view_visibility_set(ewk_view, EINA_TRUE);
3826 void Browser_View::pause(void)
3828 BROWSER_LOGD("[%s]", __func__);
3829 if (_is_loading()) {
3830 /* Because the progress wheel in url bar has about 15% cpu consumption.
3831 * So, pause the animation when browser goes to background. It's nonsense!*/
3832 if (m_option_header_url_progresswheel)
3833 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
3834 if (m_url_progresswheel)
3835 elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
3838 set_full_sreen(EINA_FALSE);
3842 suspend_ewk_view(m_focused_window->m_ewk_view);
3844 /* stop vibration */
3845 _haptic_device_stop();
3848 void Browser_View::resume(void)
3850 BROWSER_LOGD("[%s]", __func__);
3851 if (_is_loading()) {
3852 /* Because the progress wheel in url bar has about 15% cpu consumption.
3853 * So, pause the animation when browser goes to background. It's nonsense! */
3854 if (m_option_header_url_progresswheel)
3855 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_TRUE);
3856 if (m_url_progresswheel)
3857 elm_progressbar_pulse(m_url_progresswheel, EINA_TRUE);
3862 resume_ewk_view(m_focused_window->m_ewk_view);
3865 void Browser_View::reset(void)
3867 BROWSER_LOGD("[%s]", __func__);
3868 if (m_focused_window && m_focused_window->m_ewk_view)
3872 Eina_Bool Browser_View::__webview_layout_resize_idler_cb(void *data)
3876 return ECORE_CALLBACK_CANCEL;
3878 Browser_View *browser_view = (Browser_View *)data;
3880 browser_view->m_resize_idler = NULL;
3882 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_focused_window->m_ewk_view_layout),
3883 "resizable,signal", "");
3887 #ifdef BROWSER_SCROLLER_BOUNCING
3888 edje_object_part_geometry_get(elm_layout_edje_get(browser_view->m_main_layout),
3889 "elm.swallow.content", NULL, NULL, &content_w, &content_h);
3891 edje_object_part_geometry_get(elm_layout_edje_get(browser_view->m_focused_window->m_ewk_view_layout),
3892 "elm.swallow.webview", NULL, NULL, &content_w, &content_h);
3894 if (browser_view->m_is_full_screen) {
3895 int browser_scroller_y = 0;
3896 evas_object_geometry_get(browser_view->m_scroller, NULL, &browser_scroller_y, NULL, NULL);
3897 evas_object_resize(browser_view->m_focused_window->m_ewk_view,
3898 content_w, content_h + browser_scroller_y);
3900 evas_object_size_hint_min_set(browser_view->m_focused_window->m_ewk_view_layout,
3901 content_w, content_h);
3902 evas_object_resize(browser_view->m_focused_window->m_ewk_view_layout,
3903 content_w, content_h);
3906 return ECORE_CALLBACK_CANCEL;
3909 Eina_Bool Browser_View::__scroller_bring_in_idler_cb(void *data)
3911 BROWSER_LOGD("[%s]", __func__);
3913 return ECORE_CALLBACK_CANCEL;
3914 Browser_View *browser_view = (Browser_View *)data;
3916 int url_layout_h = 0;
3917 evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
3919 BROWSER_LOGD("<< elm_scroller_region_bring_in , url_layout_h=%d >>", url_layout_h);
3920 int browser_scroller_x = 0;
3921 int browser_scroller_w = 0;
3922 int browser_scroller_h = 0;
3923 elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, NULL,
3924 &browser_scroller_w, &browser_scroller_h);
3925 elm_scroller_region_show(browser_view->m_scroller, browser_scroller_x, url_layout_h,
3926 browser_scroller_w, browser_scroller_h);
3928 return ECORE_CALLBACK_CANCEL;
3932 * If user invokes the keypad via input field or url entry, resize the webview.
3933 * The only scroller resize is called when the keypad is launched.
3934 * Other elements like layout, conformant resize event doesn't come. */
3935 void Browser_View::__scroller_resize_cb(void* data, Evas* evas, Evas_Object* obj, void* ev)
3937 BROWSER_LOGD("[%s]", __func__);
3941 Browser_View *browser_view = (Browser_View *)data;
3943 if (browser_view->m_is_full_screen) {
3944 ecore_idler_add(__webview_layout_resize_idler_cb, browser_view);
3950 evas_object_geometry_get(browser_view->m_scroller, NULL, NULL, &scroller_w, &scroller_h);
3951 std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3953 for (int i = 0 ; i < window_list.size() ; i++) {
3954 if (window_list[i]->m_ewk_view_layout) {
3955 edje_object_signal_emit(elm_layout_edje_get(window_list[i]->m_ewk_view_layout),
3956 "resizable,signal", "");
3958 evas_object_size_hint_min_set(window_list[i]->m_ewk_view_layout,
3959 scroller_w, scroller_h);
3960 evas_object_resize(window_list[i]->m_ewk_view_layout,
3961 scroller_w, scroller_h);
3965 #if defined(HORIZONTAL_UI)
3966 Evas_Object *edit_field_entry;
3967 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
3968 Ecore_IMF_Context *ic = (Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry);
3969 /* If the keypad from webkit is invoked in landscape mode, the visible viewport is too narrow.
3970 * So, hide the url bar in browser scroller by bring in.
3971 * The direct bring in call doesn't work, so do it by idler. */
3972 if (ic && browser_view->is_landscape()) {
3973 Ecore_IMF_Input_Panel_State imf_state = ecore_imf_context_input_panel_state_get(ic);
3974 /* Strangley, The state of webkit's imf is show-state even if the ic is url entry.
3975 * However, this is good for browser without webkit's ic get API. */
3976 if (imf_state == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
3977 browser_view->_enable_browser_scroller_scroll();
3978 ecore_idler_add(__scroller_bring_in_idler_cb, browser_view);
3983 if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
3984 BROWSER_LOGD("close multi window");
3985 browser_view->m_is_multi_window_grid_mode = m_data_manager->get_multi_window_view()->_is_grid_mode();
3986 m_data_manager->get_multi_window_view()->close_multi_window();
3988 #if defined(HORIZONTAL_UI)
3989 if (browser_view->m_multi_window_rotate_timer)
3990 ecore_timer_del(browser_view->m_multi_window_rotate_timer);
3991 browser_view->m_multi_window_rotate_timer = ecore_timer_add(0.2, __rotate_multi_window_cb, browser_view);
3998 Eina_Bool Browser_View::__zoom_button_timeout_cb(void *data)
4000 BROWSER_LOGD("[%s]", __func__);
4002 return ECORE_CALLBACK_CANCEL;
4004 Browser_View *browser_view = (Browser_View *)data;
4005 browser_view->m_zoom_button_timer = NULL;
4007 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,zoom_buttons,signal", "");
4009 return ECORE_CALLBACK_CANCEL;
4012 void Browser_View::__zoom_out_clicked_cb(void *data, Evas_Object *obj, void *event_info)
4014 BROWSER_LOGD("[%s]", __func__);
4018 Browser_View *browser_view = (Browser_View *)data;
4019 double scale_factor = ewk_view_scale_get(browser_view->m_focused_window->m_ewk_view);
4020 ewk_view_scale_set(browser_view->m_focused_window->m_ewk_view, scale_factor - 0.5f, 0, 0);
4022 if (browser_view->m_zoom_button_timer)
4023 ecore_timer_del(browser_view->m_zoom_button_timer);
4024 browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
4027 void Browser_View::__zoom_in_clicked_cb(void *data, Evas_Object *obj, void *event_info)
4029 BROWSER_LOGD("[%s]", __func__);
4033 Browser_View *browser_view = (Browser_View *)data;
4034 double scale_factor = ewk_view_scale_get(browser_view->m_focused_window->m_ewk_view);
4035 ewk_view_scale_set(browser_view->m_focused_window->m_ewk_view, scale_factor + 0.5f, 0, 0);
4037 if (browser_view->m_zoom_button_timer)
4038 ecore_timer_del(browser_view->m_zoom_button_timer);
4039 browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
4042 Eina_Bool Browser_View::_create_zoom_buttons(void)
4044 BROWSER_LOGD("[%s]", __func__);
4045 m_zoom_out_button = elm_button_add(m_navi_bar);
4046 if (!m_zoom_out_button) {
4047 BROWSER_LOGE("elm_button_add failed");
4050 elm_object_style_set(m_zoom_out_button, "browser/zoom_out");
4051 elm_object_part_content_set(m_main_layout, "elm.swallow.zoom_out_button", m_zoom_out_button);
4052 evas_object_smart_callback_add(m_zoom_out_button, "clicked", __zoom_out_clicked_cb, this);
4053 evas_object_show(m_zoom_out_button);
4055 m_zoom_in_button = elm_button_add(m_navi_bar);
4056 if (!m_zoom_in_button) {
4057 BROWSER_LOGE("elm_button_add failed");
4061 elm_object_style_set(m_zoom_in_button, "browser/zoom_in");
4062 elm_object_part_content_set(m_main_layout, "elm.swallow.zoom_in_button", m_zoom_in_button);
4063 evas_object_smart_callback_add(m_zoom_in_button, "clicked", __zoom_in_clicked_cb, this);
4064 evas_object_show(m_zoom_in_button);
4070 void Browser_View::__naviframe_pop_finished_cb(void *data , Evas_Object *obj, void *event_info)
4072 BROWSER_LOGD("[%s]", __func__);
4076 Browser_View *browser_view = (Browser_View *)data;
4077 Elm_Object_Item *it = (Elm_Object_Item *)event_info;
4079 if (browser_view->m_navi_it != elm_naviframe_top_item_get(m_navi_bar))
4082 m_data_manager->destroy_bookmark_view();
4083 m_data_manager->destroy_history_layout();
4084 /* Add to bookmark, then cancel. */
4085 m_data_manager->destroy_add_to_bookmark_view();
4086 #if defined(FEATURE_MOST_VISITED_SITES)
4087 m_data_manager->destroy_add_to_most_visited_sites_view();
4090 /* If return from browser settings. */
4091 if (browser_view->m_browser_settings) {
4092 delete browser_view->m_browser_settings;
4093 browser_view->m_browser_settings = NULL;
4097 void Browser_View::__dim_area_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
4099 BROWSER_LOGD("[%s]", __func__);
4103 Browser_View *browser_view = (Browser_View *)data;
4105 elm_object_focus_set(m_data_manager->get_browser_view()->m_option_header_cancel_button, EINA_TRUE);
4108 void Browser_View::__context_menu_bg_mouse_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
4110 BROWSER_LOGD("[%s]", __func__);
4114 Browser_View *browser_view = (Browser_View *)data;
4116 browser_view->_destroy_more_context_popup();
4119 Eina_Bool Browser_View::_create_main_layout(void)
4121 BROWSER_LOGD("[%s]", __func__);
4122 m_main_layout = elm_layout_add(m_navi_bar);
4123 if (!m_main_layout) {
4124 BROWSER_LOGE("elm_layout_add failed!");
4128 if (!elm_layout_file_set(m_main_layout, BROWSER_EDJE_DIR"/browser-view-main.edj",
4129 "browser/browser-view-main")) {
4130 BROWSER_LOGE("elm_layout_file_set failed", BROWSER_EDJE_DIR);
4134 evas_object_size_hint_weight_set(m_main_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4135 evas_object_size_hint_align_set(m_main_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
4136 evas_object_show(m_main_layout);
4138 m_title_back_button = elm_button_add(m_navi_bar);
4139 if (!m_title_back_button) {
4140 BROWSER_LOGE("elm_button_add failed!");
4143 evas_object_smart_callback_add(m_title_back_button, "clicked", __title_back_button_clicked_cb, this);
4145 m_navi_it = elm_naviframe_item_push(m_navi_bar, "", NULL, NULL, m_main_layout, NULL);
4147 evas_object_smart_callback_add(m_navi_bar, "transition,finished", __naviframe_pop_finished_cb, this);
4149 elm_object_style_set(m_title_back_button, "browser/title_back");
4150 elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_TITLE_LEFT_BTN, m_title_back_button);
4152 evas_object_show(m_title_back_button);
4153 evas_object_show(m_navi_bar);
4155 m_scroller = elm_scroller_add(m_navi_bar);
4157 BROWSER_LOGE("elm_scroller_add failed!");
4160 /* Do not propagate event to scroller's ancestor */
4161 /* not to call unnecessary other callbacks. */
4162 evas_object_propagate_events_set(m_scroller, EINA_FALSE);
4164 /* Do not use scroller's scrollbar, use webview's scrollbar instead */
4165 elm_scroller_policy_set(m_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
4166 evas_object_size_hint_align_set(m_scroller, EVAS_HINT_FILL, 0.0);
4167 evas_object_size_hint_weight_set(m_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4168 #ifdef BROWSER_SCROLLER_BOUNCING
4169 // elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_TRUE);
4170 elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_FALSE);
4172 elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_FALSE);
4173 elm_object_scroll_freeze_pop(m_scroller);
4174 elm_object_scroll_freeze_push(m_scroller);
4176 evas_object_show(m_scroller);
4178 evas_object_smart_callback_add(m_scroller, "scroll", __scroller_scroll_cb, this);
4179 evas_object_event_callback_add(m_scroller, EVAS_CALLBACK_RESIZE, __scroller_resize_cb, this);
4181 /* create content box which contains navigation layout & webview */
4182 m_content_box = elm_box_add(m_main_layout);
4183 if (!m_content_box) {
4184 BROWSER_LOGE("elm_box_add failed!");
4188 elm_box_horizontal_set(m_content_box, EINA_FALSE);
4189 evas_object_size_hint_weight_set(m_content_box, EVAS_HINT_EXPAND, 0.0);
4190 evas_object_size_hint_align_set(m_content_box, EVAS_HINT_FILL, EVAS_HINT_FILL);
4191 elm_object_content_set(m_scroller, m_content_box);
4192 evas_object_show(m_content_box);
4194 /* create dummy loading progress bar which is displayed at launching time shortly */
4195 m_dummy_loading_progressbar = elm_progressbar_add(m_navi_bar);
4196 if (!m_dummy_loading_progressbar) {
4197 BROWSER_LOGE("elm_progressbar_add failed!");
4201 elm_object_style_set(m_dummy_loading_progressbar, "browser/loading_wheel");
4202 elm_progressbar_pulse(m_dummy_loading_progressbar, EINA_TRUE);
4203 evas_object_size_hint_weight_set(m_dummy_loading_progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4204 evas_object_size_hint_align_set(m_dummy_loading_progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
4205 elm_object_part_content_set(m_main_layout, "elm.swallow.waiting_progress", m_dummy_loading_progressbar);
4206 evas_object_show(m_dummy_loading_progressbar);
4208 /* create conformant */
4209 elm_win_conformant_set(m_win, EINA_TRUE);
4210 m_conformant = elm_conformant_add(m_main_layout);
4211 if (!m_conformant) {
4212 BROWSER_LOGE("elm_conformant_add failed!");
4216 elm_object_style_set(m_conformant, "internal_layout");
4217 evas_object_size_hint_weight_set(m_conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4218 evas_object_size_hint_align_set(m_conformant, EVAS_HINT_FILL, EVAS_HINT_FILL);
4219 elm_object_content_set(m_conformant, m_scroller);
4220 elm_object_part_content_set(m_main_layout, "elm.swallow.content", m_conformant);
4221 evas_object_show(m_conformant);
4223 m_url_layout = _create_url_layout();
4224 if (!m_url_layout) {
4225 BROWSER_LOGE("_create_url_layout failed!");
4228 elm_box_pack_start(m_content_box, m_url_layout);
4230 m_control_bar = _create_control_bar();
4231 if (!m_control_bar) {
4232 BROWSER_LOGE("_create_control_bar failed!");
4235 elm_object_part_content_set(m_main_layout, "elm.swallow.control_bar", m_control_bar);
4237 m_option_header_url_layout = _create_option_header_url_layout();
4238 if (!m_option_header_url_layout) {
4239 BROWSER_LOGE("_create_option_header_url_layout failed!");
4243 m_option_header_layout = elm_layout_add(m_navi_bar);
4244 if (!m_option_header_layout) {
4245 BROWSER_LOGE("elm_layout_add failed!");
4248 if (!elm_layout_file_set(m_option_header_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
4249 "browser-view/option_header")) {
4250 BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
4253 evas_object_size_hint_weight_set(m_option_header_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4254 evas_object_size_hint_align_set(m_option_header_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
4256 elm_object_part_content_set(m_option_header_layout, "elm.swallow.url_layout", m_option_header_url_layout);
4257 evas_object_show(m_option_header_layout);
4259 m_option_header_find_word_layout = _create_find_word_layout();
4260 if (!m_option_header_find_word_layout) {
4261 BROWSER_LOGE("_create_find_word_layout failed");
4264 elm_object_part_content_set(m_option_header_layout, "elm.swallow.find_word_layout", m_option_header_find_word_layout);
4266 elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER, m_option_header_layout);
4267 _navigationbar_visible_set_signal(EINA_FALSE);
4270 if (!_create_zoom_buttons()) {
4271 BROWSER_LOGE("_create_zoom_buttons failed");
4276 edje_object_signal_callback_add(elm_layout_edje_get(m_main_layout),
4277 "mouse,clicked,1", "elm.rect.content_dim", __dim_area_clicked_cb, this);
4279 edje_object_signal_callback_add(elm_layout_edje_get(m_main_layout),
4280 "mouse,down,1", "elm.rect.more_context_bg", __context_menu_bg_mouse_down_cb, this);
4282 const char *current_theme = elm_theme_get(NULL);
4283 if (current_theme && strstr(current_theme, "white")) {
4285 // edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "black_theme,signal", "");
4286 // edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
4287 // "black_theme,signal", "");