790f7c5b43a168662cea40e81384216497c883e5
[profile/ivi/org.tizen.browser.git] / src / browser-view / browser-view.cpp
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
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
7  *
8  *    http://www.tizenopensource.org/license
9  *
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.
15  *
16  */
17
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"
31 #endif
32 #include "browser-string.h"
33 #include "browser-view.h"
34 #include "browser-window.h"
35 #include <devman.h>
36
37 extern "C" {
38 #include <shortcut.h>
39 }
40
41 Browser_View::Browser_View(Evas_Object *win, Evas_Object *navi_bar, Evas_Object *bg, Browser_Class *browser)
42 :
43         m_main_layout(NULL)
44         ,m_scroller(NULL)
45         ,m_content_box(NULL)
46         ,m_dummy_loading_progressbar(NULL)
47         ,m_conformant(NULL)
48         ,m_url_layout(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)
54         ,m_control_bar(NULL)
55         ,m_back_button(NULL)
56         ,m_forward_button(NULL)
57         ,m_add_bookmark_button(NULL)
58         ,m_more_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)
74         ,m_rotate_degree(0)
75         ,m_multi_window_rotate_timer(NULL)
76         ,m_is_rotated(EINA_FALSE)
77 #endif
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)
85 #endif
86         ,m_new_window_transit(NULL)
87         ,m_created_new_window(NULL)
88         ,m_browser_settings(NULL)
89         ,m_navi_it(NULL)
90         ,m_find_word(NULL)
91         ,m_scissorbox_view(NULL)
92         ,m_share_controlbar_button(NULL)
93 #ifdef USE_META_TAG
94         ,m_meta_tag(NULL)
95 #endif
96         ,m_context_menu(NULL)
97         ,m_multi_window_button(NULL)
98         ,m_new_window_button(NULL)
99         ,m_is_full_screen(EINA_FALSE)
100 #ifdef ZOOM_BUTTON
101         ,m_zoom_in_button(NULL)
102         ,m_zoom_out_button(NULL)
103         ,m_zoom_button_timer(NULL)
104 #endif
105         ,m_title_backward_button(NULL)
106         ,m_title_forward_button(NULL)
107         ,m_option_header_title_backward_button(NULL)
108         ,m_option_header_title_forward_button(NULL)
109         ,m_resize_idler(NULL)
110         ,m_is_private(EINA_FALSE)
111         ,m_private_check(NULL)
112         ,m_is_private_item_pressed(EINA_FALSE)
113         ,m_bookmark_on_off_icon(NULL)
114         ,m_brightness_control_bar(NULL)
115         ,m_brightness_auto_it(NULL)
116         ,m_brightness_manual_it(NULL)
117         ,m_default_seg_it(NULL)
118         ,m_low_seg_it(NULL)
119         ,m_medium_seg_it(NULL)
120         ,m_high_seg_it(NULL)
121         ,m_vibration_device_handle_id(-1)
122         ,m_is_multi_window_grid_mode(EINA_FALSE)
123 {
124         BROWSER_LOGD("[%s]", __func__);
125         m_win = win;
126         m_navi_bar = navi_bar;
127         m_bg = bg;
128         m_browser = browser;
129 }
130
131 Browser_View::~Browser_View()
132 {
133         BROWSER_LOGD("[%s]", __func__);
134         if (m_title_back_button)
135                 evas_object_del(m_title_back_button);
136
137         ug_destroy_all();
138
139         br_preference_set_str(LAST_VISITED_URL_KEY, m_last_visited_url.c_str());
140
141         m_data_manager->destroy_history_db();
142         m_data_manager->destroy_geolocation_db();
143
144         if (m_data_manager) {
145                 delete m_data_manager;
146                 m_data_manager = NULL;
147         }
148 #if defined(FEATURE_MOST_VISITED_SITES)
149         if (m_most_visited_sites) {
150                 delete m_most_visited_sites;
151                 m_most_visited_sites = NULL;
152         }
153         if (m_most_visited_sites_db) {
154                 delete m_most_visited_sites_db;
155                 m_most_visited_sites_db = NULL;
156         }
157 #endif
158         if (m_new_window_transit) {
159                 elm_transit_del(m_new_window_transit);
160                 m_new_window_transit = NULL;
161         }
162         if (m_browser_settings) {
163                 delete m_browser_settings;
164                 m_browser_settings = NULL;
165         }
166         if (m_find_word) {
167                 delete m_find_word;
168                 m_find_word = NULL;
169         }
170         if (m_context_menu) {
171                 delete m_context_menu;
172                 m_context_menu = NULL;
173         }
174         if (m_scissorbox_view) {
175                 delete m_scissorbox_view;
176                 m_scissorbox_view = NULL;
177         }
178 #if defined(HORIZONTAL_UI)
179         if (m_multi_window_rotate_timer) {
180                 ecore_timer_del(m_multi_window_rotate_timer);
181                 m_multi_window_rotate_timer = NULL;
182         }
183 #endif
184 #ifdef USE_META_TAG
185         if (m_meta_tag) {
186                 delete m_meta_tag;
187                 m_meta_tag = NULL;
188         }
189 #endif
190 #ifdef ZOOM_BUTTON
191         if (m_zoom_in_button)
192                 evas_object_del(m_zoom_in_button);
193         if (m_zoom_out_button)
194                 evas_object_del(m_zoom_out_button);
195         if (m_zoom_button_timer) {
196                 ecore_timer_del(m_zoom_button_timer);
197                 m_zoom_button_timer = NULL;
198         }
199 #endif
200 }
201
202 Eina_Bool Browser_View::init(void)
203 {
204         BROWSER_LOGD("[%s]", __func__);
205         /* set homepage from homepage vconf */
206         _set_homepage_mode();
207
208         m_data_manager = new(nothrow) Browser_Data_Manager;
209         if (!m_data_manager) {
210                 BROWSER_LOGE("new Browser_Data_Manager failed");
211                 return EINA_FALSE;
212         }
213
214         m_data_manager->set_browser_view(this);
215
216         if (!m_data_manager->create_history_db()) {
217                 BROWSER_LOGE("m_data_manager->create_history_db failed");
218                 return EINA_FALSE;
219         }
220
221         if (!m_data_manager->create_geolocation_db()) {
222                 BROWSER_LOGE("m_data_manager->create_geolocation_db failed");
223                 return EINA_FALSE;
224         }
225
226 #if defined(FEATURE_MOST_VISITED_SITES)
227         m_most_visited_sites_db = new(nothrow) Most_Visited_Sites_DB;
228         if (!m_most_visited_sites_db) {
229                 BROWSER_LOGE("new Most_Visited_Sites_DB failed");
230                 return EINA_FALSE;
231         }
232 #endif
233
234         m_find_word = new(nothrow) Browser_Find_Word(this);
235         if (!m_find_word) {
236                 BROWSER_LOGE("new Browser_Find_Word failed");
237                 return EINA_FALSE;
238         }
239
240         m_context_menu = new(nothrow) Browser_Context_Menu(this);
241         if (!m_context_menu) {
242                 BROWSER_LOGE("new Browser_Context_Menu failed");
243                 return EINA_FALSE;
244         }
245 #ifdef USE_META_TAG
246         m_meta_tag = new(nothrow) Browser_Meta_Tag();
247         if (!m_meta_tag) {
248                 BROWSER_LOGE("new Browser_Meta_Tag failed");
249                 return EINA_FALSE;
250         }
251 #endif
252         UG_INIT_EFL(m_win, UG_OPT_INDICATOR_ENABLE);
253
254         char *last_url = NULL;
255         if (br_preference_get_str(LAST_VISITED_URL_KEY, &last_url) == false) {
256                 BROWSER_LOGE("failed to get %s preference", LAST_VISITED_URL_KEY);
257                 return EINA_FALSE;
258         }
259         if (last_url) {
260                 m_last_visited_url = std::string(last_url);
261                 free(last_url);
262         }
263         if (_haptic_device_init() == EINA_FALSE) {
264                 BROWSER_LOGE("Failed to init haptic device");
265                 return EINA_FALSE;
266         }
267
268         /* create brower view layout */
269         return _create_main_layout();
270 }
271
272 void Browser_View::launch(const char *url)
273 {
274         /* Destroy all other views except browser view. */
275         _pop_other_views();
276
277         /*Workaround.
278           * When keypad is running via url entry, if browser goes to background by home key.
279           * Then relaunch the browser by aul. The webpage is loading but the keypad is still running.
280           * So give focus to cancel button not to invoke the keypad. */
281         elm_object_focus_set(m_cancel_button, EINA_TRUE);
282
283         if (url && strlen(url))
284                 load_url(url);
285 #if defined(FEATURE_MOST_VISITED_SITES)
286         else if (m_homepage_mode == BR_START_MODE_MOST_VISITED_SITES)
287                 load_url(BROWSER_MOST_VISITED_SITES_URL);
288 #endif
289         else if (m_homepage_mode == BR_START_MODE_RECENTLY_VISITED_SITE) {
290                 char *homepage = NULL;
291                 if (br_preference_get_str(LAST_VISITED_URL_KEY, &homepage) == false) {
292                         BROWSER_LOGD("failed to get %s preference", LAST_VISITED_URL_KEY);
293                         return;
294                 }
295                 if (homepage) {
296                         load_url(homepage);
297                         free(homepage);
298                 } else
299 #if defined(FEATURE_MOST_VISITED_SITES)
300                         load_url(BROWSER_MOST_VISITED_SITES_URL);
301 #else
302                         load_url(BROWSER_BLANK_PAGE_URL);
303 #endif
304         } else if (m_homepage_mode == BR_START_MODE_CUSTOMIZED_URL) {
305                 char *user_homepage = NULL;
306                 if (br_preference_get_str(USER_HOMEPAGE_KEY, &user_homepage) ==false) {
307                         BROWSER_LOGE("failed to get %s preference\n", USER_HOMEPAGE_KEY);
308                         return;
309                 }
310                 if (user_homepage) {
311                         load_url(user_homepage);
312                         free(user_homepage);
313                 } else
314 #if defined(FEATURE_MOST_VISITED_SITES)
315                         load_url(BROWSER_MOST_VISITED_SITES_URL);
316 #else
317                         load_url(BROWSER_BLANK_PAGE_URL);
318 #endif
319         } else if (m_homepage_mode == BR_START_MODE_EMPTY_PAGE) {
320                 load_url(BROWSER_BLANK_PAGE_URL);
321         }
322
323 }
324
325 void Browser_View::set_full_sreen(Eina_Bool enable)
326 {
327         BROWSER_LOGD("[%s]", __func__);
328
329         if (m_is_full_screen == enable)
330                 return;
331
332         m_is_full_screen = enable;
333
334         if (m_is_full_screen) {
335                 elm_win_indicator_mode_set(m_win, ELM_WIN_INDICATOR_HIDE);
336                 _hide_scroller_url_layout();
337                 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "enter,full_screen,signal", "");
338                 _enable_webview_scroll();
339
340                 elm_object_part_content_unset(m_focused_window->m_ewk_view_layout, "elm.swallow.webview");
341
342                 evas_object_move(m_focused_window->m_ewk_view, 0, 0);
343         } else {
344                 elm_win_indicator_mode_set(m_win, ELM_WIN_INDICATOR_SHOW);
345
346                 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "exit,full_screen,signal", "");
347
348                 elm_object_part_content_set(m_focused_window->m_ewk_view_layout, "elm.swallow.webview", m_focused_window->m_ewk_view);
349
350                 _navigationbar_visible_set_signal(EINA_TRUE);
351         }
352
353         ecore_idler_add(__webview_layout_resize_idler_cb, this);
354 }
355
356 #if defined(FEATURE_MOST_VISITED_SITES)
357 Eina_Bool Browser_View::is_most_visited_sites_running(void)
358 {
359         if (m_most_visited_sites)
360                 return EINA_TRUE;
361         else
362                 return EINA_FALSE;
363 }
364 #endif
365
366 void Browser_View::return_to_browser_view(Eina_Bool saved_most_visited_sites_item)
367 {
368         BROWSER_LOGD("[%s]", __func__);
369
370         if (!_is_loading()) {
371                 if (get_title().empty())
372                         _set_navigationbar_title(get_url().c_str());
373                 else
374                         _set_navigationbar_title(get_title().c_str());
375         }
376 #if defined(FEATURE_MOST_VISITED_SITES)
377         if (is_most_visited_sites_running()) {
378                 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
379                                         "show,control_bar,no_animation,signal", "");
380                 _set_navigationbar_title(BR_STRING_MOST_VISITED_SITES);
381         }
382         if (saved_most_visited_sites_item && is_most_visited_sites_running())
383                 /* If longpress on speed dial item, then add to bookmark. */
384                 edje_object_signal_emit(elm_layout_edje_get(m_most_visited_sites->m_selected_item->layout),
385                                                                                 "bookmark_icon", "");
386 #endif
387         _set_secure_icon();
388
389 }
390
391 void Browser_View::_pop_other_views(void)
392 {
393         BROWSER_LOGD("[%s]", __func__);
394         _destroy_more_context_popup();
395
396         /* if browser is runing background behind ug which browser invoked,
397         destroy the previous ug and show the browser view. */
398         ug_destroy_all();
399
400         /* If multi-window is running, destroy it to show browser view. */
401         if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
402                 m_data_manager->get_multi_window_view()->close_multi_window();
403
404         /* Pop all other views except browser view. */
405         elm_naviframe_item_pop_to(m_navi_it);
406
407         if (m_scissorbox_view)
408                 _destroy_scissorbox_view();
409 }
410
411 /* set homepage from homepage vconf */
412 void Browser_View::_set_homepage_mode(void)
413 {
414         char *homepage = NULL;
415         if (br_preference_get_str(HOMEPAGE_KEY, &homepage) == false) {
416                 BROWSER_LOGE("failed to get %s preference\n", HOMEPAGE_KEY);
417                 return;
418         }
419         BROWSER_LOGD("homepage=[%s]", homepage);
420
421         if (!homepage) {
422                 BROWSER_LOGE("homepage is null");
423 #if defined(FEATURE_MOST_VISITED_SITES)
424                 m_homepage_mode = BR_START_MODE_MOST_VISITED_SITES;
425 #else
426                 m_homepage_mode = BR_START_MODE_EMPTY_PAGE;
427 #endif
428                 return;
429         }
430
431 #if defined(FEATURE_MOST_VISITED_SITES)
432         if (!strncmp(homepage, MOST_VISITED_SITES,
433                                 strlen(MOST_VISITED_SITES)))
434                 m_homepage_mode = BR_START_MODE_MOST_VISITED_SITES;
435         else
436 #endif
437         if (!strncmp(homepage, RECENTLY_VISITED_SITE,
438                         strlen(RECENTLY_VISITED_SITE)))
439                 m_homepage_mode = BR_START_MODE_RECENTLY_VISITED_SITE;
440         else if (!strncmp(homepage, EMPTY_PAGE,
441                         strlen(EMPTY_PAGE)))
442                 m_homepage_mode = BR_START_MODE_EMPTY_PAGE;
443         else
444                 m_homepage_mode = BR_START_MODE_CUSTOMIZED_URL;
445
446         free(homepage);
447         BROWSER_LOGD("m_homepage_mode=%d", m_homepage_mode);
448 }
449
450 void Browser_View::__new_window_transit_finished_cb(void *data, Elm_Transit *transit)
451 {
452         BROWSER_LOGD("[%s]", __func__);
453         if (!data)
454                 return;
455
456         Browser_View *browser_view = (Browser_View *)data;
457         if (!browser_view->m_new_window_transit)
458                 return;
459
460         browser_view->m_new_window_transit = NULL;
461         browser_view->m_browser->set_focused_window(browser_view->m_created_new_window
462 #if defined(FEATURE_MOST_VISITED_SITES)
463                         , EINA_FALSE
464 #endif
465                         );
466         browser_view->m_created_new_window = NULL;
467 }
468
469 Eina_Bool Browser_View::_show_new_window_effect(Evas_Object *current_ewk_view,
470                                                                 Evas_Object *new_ewk_view)
471 {
472         int scroller_x = 0;
473         int scroller_y = 0;
474         int scroller_w = 0;
475         int scroller_h = 0;
476         elm_scroller_region_get(m_scroller, &scroller_x, &scroller_y, &scroller_w, &scroller_h);
477         elm_scroller_region_show(m_scroller ,scroller_x, 0, scroller_w, scroller_h);
478
479         m_browser->set_focused_window(m_created_new_window
480 #if defined(FEATURE_MOST_VISITED_SITES)
481                 , EINA_FALSE
482 #endif
483                 );
484
485         return EINA_TRUE;
486 }
487
488 Evas_Object *Browser_View::get_favicon(const char *url)
489 {
490         if (!url || !strlen(url))
491                 return NULL;
492
493         Ewk_Context* context = ewk_view_context_get(m_focused_window->m_ewk_view);
494         Evas_Object *favicon = ewk_context_icon_database_icon_object_add(context, url, evas_object_evas_get(m_focused_window->m_ewk_view));
495
496         return favicon;
497 }
498
499 Eina_Bool Browser_View::_set_favicon(void)
500 {
501         BROWSER_LOGD("[%s]", __func__);
502
503         if (m_edit_mode == BR_URL_ENTRY_EDIT_MODE
504             || m_edit_mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
505                 BROWSER_LOGD("Edit mode");
506                 return EINA_FALSE;
507         }
508
509 #if defined(FEATURE_MOST_VISITED_SITES)
510         if (is_most_visited_sites_running()) {
511                 BROWSER_LOGD("is_most_visited_sites_running");
512                 return EINA_FALSE;
513         }
514 #endif
515
516         double progress = ewk_view_load_progress_get(m_focused_window->m_ewk_view);
517         if (progress < 1.0f && progress > 0.05f) {
518                 BROWSER_LOGD("loadin status");
519                 return EINA_FALSE;
520         }
521
522         Evas_Object *favicon = get_favicon(get_url().c_str());
523         Evas_Object *option_header_favicon = get_favicon(get_url().c_str());
524
525         if (favicon) {
526                 if (m_focused_window->m_favicon)
527                         evas_object_del(m_focused_window->m_favicon);
528
529                 m_focused_window->m_favicon = favicon;
530         } else {
531                 Evas_Object *default_icon = elm_icon_add(m_focused_window->m_ewk_view);
532                 if (!default_icon) {
533                         BROWSER_LOGE("elm_icon_add is failed.");
534                         return EINA_FALSE;
535                 }
536                 if (!elm_icon_file_set(default_icon, BROWSER_IMAGE_DIR"/faviconDefault.png", NULL)) {
537                         BROWSER_LOGE("elm_icon_file_set is failed.");
538                         return EINA_FALSE;
539                 }
540                 evas_object_size_hint_aspect_set(default_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
541                 if (m_focused_window->m_favicon)
542                         evas_object_del(m_focused_window->m_favicon);
543
544                 m_focused_window->m_favicon = default_icon;
545         }
546
547         if (option_header_favicon) {
548                 if (m_focused_window->m_option_header_favicon)
549                         evas_object_del(m_focused_window->m_option_header_favicon);
550
551                 m_focused_window->m_option_header_favicon = option_header_favicon;
552         } else {
553                 Evas_Object *default_icon = elm_icon_add(m_focused_window->m_ewk_view);
554                 if (!default_icon) {
555                         BROWSER_LOGE("elm_icon_add is failed.");
556                         return EINA_FALSE;
557                 }
558                 if (!elm_icon_file_set(default_icon, BROWSER_IMAGE_DIR"/faviconDefault.png", NULL)) {
559                         BROWSER_LOGE("elm_icon_file_set is failed.");
560                         return EINA_FALSE;
561                 }
562                 evas_object_size_hint_aspect_set(default_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
563                 if (m_focused_window->m_option_header_favicon)
564                         evas_object_del(m_focused_window->m_option_header_favicon);
565
566                 m_focused_window->m_option_header_favicon = default_icon;
567         }
568
569         if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
570                 elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
571         if (elm_object_part_content_get(m_option_header_url_entry_layout,
572                                                 "elm.swallow.favicon"))
573                 elm_object_part_content_unset(m_option_header_url_entry_layout,
574                                                 "elm.swallow.favicon");
575
576         elm_object_part_content_set(m_url_entry_layout, "elm.swallow.favicon",
577                                                         m_focused_window->m_favicon);
578         elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.favicon",
579                                                         m_focused_window->m_option_header_favicon);
580
581         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
582                                                                 "show,favicon,signal", "");
583         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
584                                                                 "show,favicon,signal", "");
585
586         _set_secure_icon();
587
588         return EINA_TRUE;
589 }
590
591 Eina_Bool Browser_View::__close_window_idler_cb(void *data)
592 {
593         BROWSER_LOGD("[%s]", __func__);
594         if (!data)
595                 return ECORE_CALLBACK_CANCEL;
596
597         Browser_View *browser_view = (Browser_View *)data;
598         Browser_Class *browser = browser_view->m_browser;
599
600         if (browser_view->m_focused_window->m_parent)
601                 browser->delete_window(browser_view->m_focused_window,
602                                 browser_view->m_focused_window->m_parent);
603         else
604                 browser->delete_window(browser_view->m_focused_window);
605
606         int scroller_x = 0;
607         int scroller_w = 0;
608         int scroller_h = 0;
609         elm_scroller_region_get(browser_view->m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
610         elm_scroller_region_show(browser_view->m_scroller ,scroller_x, 0,
611                                                                 scroller_w, scroller_h);
612         return ECORE_CALLBACK_CANCEL;
613 }
614
615 void Browser_View::__close_window_cb(void *data, Evas_Object *obj, void *event_info)
616 {
617         BROWSER_LOGD("[%s]", __func__);
618         if (!data)
619                 return;
620
621         Browser_View *browser_view = (Browser_View *)data;
622         Browser_Class *browser = browser_view->m_browser;
623
624         /* The window should be deleted by idler. The webkit recommands to delete by idler. */
625         ecore_idler_add(__close_window_idler_cb, browser_view);
626 }
627
628 Eina_Bool Browser_View::_haptic_device_init(void)
629 {
630         BROWSER_LOGD("[%s]", __func__);
631
632         if (m_vibration_device_handle_id == BROWSER_HAPTIC_DEVICE_HANDLE) {
633                 BROWSER_LOGD("device handle for haptic is already set");
634                 return EINA_FALSE;
635         }
636
637         if (haptic_initialize() != HAPTIC_ERROR_NONE) {
638                 BROWSER_LOGD("failed to initiate haptic device");
639                 return EINA_FALSE;
640         }
641
642         m_vibration_device_handle_id = BROWSER_HAPTIC_DEVICE_HANDLE;
643
644         return EINA_TRUE;
645 }
646
647 Eina_Bool Browser_View::_haptic_device_play(long haptic_play_time)
648 {
649         BROWSER_LOGD("[%s], requested time is [%dms]", __func__, haptic_play_time);
650
651         if (m_vibration_device_handle_id != BROWSER_HAPTIC_DEVICE_HANDLE) {
652                 BROWSER_LOGD("device handle for haptic is not set. Unable to play haptic");
653                 return EINA_FALSE;
654         }
655
656         if (haptic_vibrate_monotone(BROWSER_HAPTIC_DEVICE_HANDLE, haptic_play_time, HAPTIC_LEVEL_AUTO) != HAPTIC_ERROR_NONE) {
657                 BROWSER_LOGD("haptic_vibrate_monotone failed.");
658                 return EINA_FALSE;
659         }
660
661         return EINA_TRUE;
662 }
663
664 Eina_Bool Browser_View::_haptic_device_stop(void)
665 {
666         BROWSER_LOGD("[%s]", __func__);
667
668         if (m_vibration_device_handle_id != BROWSER_HAPTIC_DEVICE_HANDLE) {
669                 BROWSER_LOGD("device handle for haptic is not set. Unable to play haptic");
670                 return EINA_FALSE;
671         }
672
673         if (haptic_stop_device(BROWSER_HAPTIC_DEVICE_HANDLE) != HAPTIC_ERROR_NONE) {
674                 BROWSER_LOGD("haptic_stop_device failed.");
675                 return EINA_FALSE;
676         }
677
678         return EINA_TRUE;
679 }
680
681 Eina_Bool Browser_View::_haptic_device_close(void)
682 {
683         BROWSER_LOGD("[%s]", __func__);
684
685         if (haptic_deinitialize() != HAPTIC_ERROR_NONE) {
686                 BROWSER_LOGD("haptic_deinitialize failed.");
687                 return EINA_FALSE;
688         }
689
690         return EINA_TRUE;
691 }
692
693 void Browser_View::__create_window_cb(void *data, Evas_Object *obj, void *event_info)
694 {
695         BROWSER_LOGD("[%s]", __func__);
696         if (!data)
697                 return;
698
699         Browser_View *browser_view = (Browser_View *)data;
700         Browser_Class *browser = browser_view->m_browser;
701
702         std::vector<Browser_Window *> window_list = browser->get_window_list();
703         if (window_list.size() >= BROWSER_MULTI_WINDOW_MAX_COUNT) {
704                 /* If the multi window is max, delete the first one. */
705                 /* if the first window is focused, delete second one(oldest one except first one) */
706                 if (browser_view->m_focused_window != window_list[0])
707                         browser->delete_window(window_list[0]);
708                 else
709                         browser->delete_window(window_list[1]);
710         }
711
712         browser_view->m_created_new_window = browser->create_new_window();
713         if (!browser_view->m_created_new_window) {
714                 BROWSER_LOGE("create_new_window failed");
715                 return;
716         }
717         /* initialize the created webview first to connect ewk event callback functions such as load start, progress etc. */
718         browser->ewk_view_init(browser_view->m_created_new_window->m_ewk_view);
719
720         /* Set the caller window. */
721         browser_view->m_created_new_window->m_parent = browser_view->m_focused_window;
722
723         /* Destroy previous multi window item snapshot.
724           * This is because the snapshot of multi window item can't be captured in this case. */
725 #if defined(HORIZONTAL_UI)
726         if (browser_view->m_focused_window->m_landscape_snapshot_image) {
727                 evas_object_del(browser_view->m_focused_window->m_landscape_snapshot_image);
728                 browser_view->m_focused_window->m_landscape_snapshot_image = NULL;
729         }
730 #endif
731         if (browser_view->m_focused_window->m_portrait_snapshot_image) {
732                 evas_object_del(browser_view->m_focused_window->m_portrait_snapshot_image);
733                 browser_view->m_focused_window->m_portrait_snapshot_image = NULL;
734         }
735
736         if (!browser_view->_show_new_window_effect(browser_view->m_focused_window->m_ewk_view,
737                                         browser_view->m_created_new_window->m_ewk_view))
738                 BROWSER_LOGE("_show_new_window_effect failed");
739
740         *((Evas_Object **)event_info) = browser_view->m_created_new_window->m_ewk_view;
741 }
742
743 void Browser_View::__load_started_cb(void *data, Evas_Object *obj, void *event_info)
744 {
745         BROWSER_LOGD("[%s]", __func__); 
746         if (!data)
747                 return;
748
749         Browser_View *browser_view = (Browser_View *)data;
750         Evas_Object *url_progressbar = browser_view->m_url_progressbar;
751         Evas_Object *progressbar_wheel = browser_view->m_url_progresswheel;
752         Evas_Object *option_header_url_progressbar = browser_view->m_option_header_url_progressbar;
753         Evas_Object *option_header_progressbar_wheel = browser_view->m_option_header_url_progresswheel;
754
755         double progress = ewk_view_load_progress_get(browser_view->m_focused_window->m_ewk_view);
756         if (progress <= 0.0f)
757                 progress = 0.05f;
758         elm_progressbar_pulse(progressbar_wheel, EINA_TRUE);
759         elm_progressbar_pulse(option_header_progressbar_wheel, EINA_TRUE);
760
761         elm_progressbar_value_set(url_progressbar, progress);
762         elm_progressbar_value_set(option_header_url_progressbar, progress);
763
764         browser_view->_load_start();
765 }
766
767 void Browser_View::_navigationbar_visible_set_signal(Eina_Bool visible)
768 {
769         BROWSER_LOGD("visible=%d", visible);
770
771         if (visible && (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW) || m_is_full_screen || m_brightness_control_bar))
772                 return;
773
774         if (m_navi_it != elm_naviframe_top_item_get(m_navi_bar))
775                 return;
776
777         evas_object_data_set(m_navi_bar, "visible", (Eina_Bool *)visible);
778
779         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
780
781         if (visible)
782                 elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_INSTANT_OPEN);
783         else
784                 elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_INSTANT_CLOSE);
785 }
786
787 void Browser_View::_navigationbar_visible_set(Eina_Bool visible)
788 {
789         if (visible && (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW) || m_is_full_screen))
790                 return;
791
792         if (m_navi_it != elm_naviframe_top_item_get(m_navi_bar))
793                 return;
794
795         evas_object_data_set(m_navi_bar, "visible", (Eina_Bool *)visible);
796
797         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
798         if (visible)
799                 elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_OPEN);
800         else
801                 elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_CLOSE);
802 }
803
804 Eina_Bool Browser_View::_navigationbar_visible_get(void)
805 {
806         Eina_Bool* visible = (Eina_Bool *)evas_object_data_get(m_navi_bar, "visible");
807         BROWSER_LOGD("visible = %d", visible);
808         if (visible == (Eina_Bool *)EINA_TRUE)
809                 return EINA_TRUE;
810         else
811                 return EINA_FALSE;
812 }
813
814 void Browser_View::_load_start(void)
815 {
816         BROWSER_LOGD("[%s]", __func__);
817
818         if (m_dummy_loading_progressbar) {
819                 elm_object_part_content_unset(m_main_layout, "elm.swallow.waiting_progress");
820                 evas_object_del(m_dummy_loading_progressbar);
821                 m_dummy_loading_progressbar = NULL;
822                 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
823                                         "hide,waiting_progressbar,signal", "");
824         }
825
826         if (!m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
827                 _set_navigationbar_title(BR_STRING_LOADING);
828
829         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,on,signal", "");
830         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
831                                 "loading,on,signal", "");
832
833         _navigationbar_visible_set_signal(EINA_TRUE);
834
835         /* Hide the secure lock icon in title bar. */
836         elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_ICON, NULL);
837
838         /* Destroy & hide favicon when load start. */
839         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
840                                                 "hide,favicon,signal", "");
841         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
842                                                 "hide,favicon,signal", "");
843         if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
844                 elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
845         if (elm_object_part_content_get(m_option_header_url_entry_layout,
846                                                 "elm.swallow.favicon"))
847                 elm_object_part_content_unset(m_option_header_url_entry_layout,
848                                                 "elm.swallow.favicon");
849
850         if (m_focused_window->m_favicon) {
851                 evas_object_del(m_focused_window->m_favicon);
852                 m_focused_window->m_favicon = NULL;
853         }
854         if (m_focused_window->m_option_header_favicon) {
855                 evas_object_del(m_focused_window->m_option_header_favicon);
856                 m_focused_window->m_option_header_favicon = NULL;
857         }
858
859         /* This makes the ewk view unfocused so that the ime can't be invoked. */
860         evas_object_focus_set(m_focused_window->m_ewk_view_layout, EINA_TRUE);
861
862         if (_get_edit_mode() != BR_NO_EDIT_MODE)
863                 _set_edit_mode(BR_NO_EDIT_MODE);
864
865         /* For deleted window because of unused case like low memory. */
866         m_focused_window->m_url.clear();
867         m_focused_window->m_title.clear();
868
869         set_full_sreen(EINA_FALSE);
870
871         elm_object_focus_set(m_option_header_cancel_button, EINA_TRUE);
872         elm_object_signal_emit(m_option_header_url_edit_field, "ellipsis_show,signal", "elm");
873         elm_object_signal_emit(m_url_edit_field, "ellipsis_show,signal", "elm");
874
875         if (m_scissorbox_view)
876                 _destroy_scissorbox_view();
877         _destroy_more_context_popup();
878 }
879
880 void Browser_View::__load_committed_cb(void *data, Evas_Object *obj, void *event_info)
881 {
882         BROWSER_LOGD("[%s]", __func__);
883         if (!data)
884                 return;
885
886         Browser_View *browser_view = (Browser_View *)data;
887         if (browser_view->_get_edit_mode() != BR_NO_EDIT_MODE)
888                 return;
889
890         browser_view->_set_url_entry(browser_view->get_url().c_str());
891 }
892
893 void Browser_View::__load_nonempty_layout_finished_cb(void *data, Evas_Object *obj, void *event_info)
894 {
895         BROWSER_LOGD("[%s]", __func__);
896         if (!data)
897                 return;
898
899         Browser_View *browser_view = (Browser_View *)data;
900
901         if (!browser_view->_is_loading())
902                 return;
903
904 #ifdef BROWSER_SCROLLER_BOUNCING
905         /* If the first content is displayed, hide the url layout in browser scroller like safari. */
906         int scroller_x = 0;
907         int scroller_w = 0;
908         int scroller_h = 0;
909         elm_scroller_region_get(browser_view->m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
910         elm_scroller_region_show(browser_view->m_scroller ,scroller_x, 0,
911                                                                 scroller_w, scroller_h);
912 #endif
913 }
914
915 void Browser_View::__title_changed_cb(void *data, Evas_Object *obj, void *event_info)
916 {
917         BROWSER_LOGD("[%s]", __func__);
918         if (!data)
919                 return;
920
921         Browser_View *browser_view = (Browser_View *)data;
922         if (browser_view->_get_edit_mode() != BR_NO_EDIT_MODE)
923                 return;
924
925         if (!m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
926                 browser_view->_set_navigationbar_title(browser_view->get_title().c_str());
927 }
928
929 void Browser_View::__load_finished_cb(void *data, Evas_Object *obj, void *event_info)
930 {
931         BROWSER_LOGD("[%s]", __func__);
932         if (!data)
933                 return;
934
935         Browser_View *browser_view = (Browser_View *)data;
936         Evas_Object *progressbar_wheel = browser_view->m_url_progresswheel;
937         Evas_Object *option_header_progressbar_wheel = browser_view->m_option_header_url_progresswheel;
938
939         elm_progressbar_pulse(progressbar_wheel, EINA_FALSE);
940         elm_progressbar_pulse(option_header_progressbar_wheel, EINA_FALSE);
941
942         /*
943         * For the first time, the background color is white initially.
944         * If the background is not displayed yet, show the grey background.
945         * This code is executed only one time at launching time.
946         */
947         const char* state = edje_object_part_state_get(elm_layout_edje_get(browser_view->m_main_layout),
948                                                         "contents_bg", NULL);
949         if(state && !strncmp(state, "default", strlen("default")))
950                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout),
951                                         "show,grey_background,signal", "");
952
953         if (browser_view->m_edit_mode != BR_URL_ENTRY_EDIT_MODE
954             && browser_view->m_edit_mode != BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
955                 /* change the url layout for normal mode. (change the reload icon etc) */
956                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "loading,off,signal", "");
957                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout),
958                                         "loading,off,signal", "");
959         }
960
961         if (!m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
962                 browser_view->_set_navigationbar_title(browser_view->get_title().c_str());
963
964         /* This is because,
965           * finish progress event can be come after finish progress frame event at some pages.
966           * In this case, the title & favicon display error happens, becaue these are handled in finish progress frame.
967           * So do that again here. */
968         if (!browser_view->_set_favicon())
969                 BROWSER_LOGE("_set_favicon failed");
970         browser_view->_set_secure_icon();
971         browser_view->_load_finished();
972 }
973
974 static Eina_Bool __kill_browser_timer_cb(void *data)
975 {
976         elm_exit();
977         return ECORE_CALLBACK_CANCEL;
978 }
979
980 void Browser_View::__process_crashed_cb(void *data, Evas_Object *obj, void *event_info)
981 {
982         BROWSER_LOGD("[%s]", __func__);
983         if (!data)
984                 return;
985
986         Browser_View *browser_view = (Browser_View *)data;
987         browser_view->show_msg_popup(BR_STRING_WEBPROCESS_CRASH, 3);
988         ecore_timer_add(3, __kill_browser_timer_cb, NULL);
989 }
990
991 void Browser_View::__did_finish_load_for_frame_cb(void *data, Evas_Object *obj, void *event_info)
992 {
993         if (!data)
994                 return;
995
996         Browser_View *browser_view = (Browser_View *)data;
997
998         if (!m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
999                 browser_view->_set_navigationbar_title(browser_view->get_title().c_str());
1000
1001         browser_view->_load_finished();
1002 }
1003
1004 void Browser_View::_set_secure_icon(void)
1005 {
1006         std::string url = get_url();
1007         BROWSER_LOGD("url=[%s]", url.c_str());
1008
1009         if (m_focused_window->m_secure_icon == NULL) {
1010                 m_focused_window->m_secure_icon = elm_icon_add(m_focused_window->m_ewk_view);
1011                 if (!m_focused_window->m_secure_icon) {
1012                         BROWSER_LOGE("elm_icon_add is failed.");
1013                         return;
1014                 }
1015
1016                 if (!elm_icon_file_set(m_focused_window->m_secure_icon, BROWSER_IMAGE_DIR"/lock.png", NULL)) {
1017                         BROWSER_LOGE("elm_icon_file_set is failed.");
1018                         return;
1019                 }
1020                 evas_object_size_hint_aspect_set(m_focused_window->m_secure_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1021                 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.secure_icon",
1022                                 m_focused_window->m_secure_icon);
1023         }
1024
1025         if (m_focused_window->m_option_header_secure_icon == NULL) {
1026                 m_focused_window->m_option_header_secure_icon = elm_icon_add(m_focused_window->m_ewk_view);
1027                 if (!m_focused_window->m_option_header_secure_icon) {
1028                         BROWSER_LOGE("elm_icon_add is failed.");
1029                         return;
1030                 }
1031
1032                 if (!elm_icon_file_set(m_focused_window->m_option_header_secure_icon, BROWSER_IMAGE_DIR"/lock.png", NULL)) {
1033                         BROWSER_LOGE("elm_icon_file_set is failed.");
1034                         return;
1035                 }
1036                 evas_object_size_hint_aspect_set(m_focused_window->m_option_header_secure_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1037                 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.secure_icon",
1038                                 m_focused_window->m_option_header_secure_icon);
1039         }
1040
1041         if (url.c_str() && url.length()) {
1042                 if (!strncmp(url.c_str(), BROWSER_HTTPS_SCHEME, strlen(BROWSER_HTTPS_SCHEME))) {
1043                         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1044                                                                         "show,secure_icon,signal", "");
1045                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1046                                                                         "show,secure_icon,signal", "");
1047                         return;
1048                 }
1049         }
1050         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "hide,secure_icon,signal", "");
1051         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1052                                                                 "hide,secure_icon,signal", "");
1053 }
1054
1055 #if defined(FEATURE_MOST_VISITED_SITES)
1056 Eina_Bool Browser_View::_capture_most_visited_sites_item_screen_shot(void)
1057 {
1058         BROWSER_LOGD("[%s]", __func__);
1059
1060         Eina_Bool is_ranked = EINA_FALSE;
1061         std::string screen_shot_path;
1062         std::string current_url = get_url();
1063         screen_shot_path.clear();
1064
1065         if (!m_selected_most_visited_sites_item_info.url.empty()) {
1066                 std::string history_id;
1067                 history_id = m_most_visited_sites_db->get_history_id_by_url(get_url().c_str());
1068                 if (!history_id.empty()) {
1069                         std::string history_title;
1070                         history_title = m_most_visited_sites_db->get_history_title_by_id(history_id.c_str());
1071                         if (!history_title.empty()) {
1072                                 if (!m_most_visited_sites_db->save_most_visited_sites_item(m_selected_most_visited_sites_item_info.index,
1073                                                 get_url().c_str(), history_title.c_str(), history_id.c_str()))
1074                                         BROWSER_LOGE("save_most_visited_sites_item failed");
1075                         } else {
1076                                 if (!m_most_visited_sites_db->save_most_visited_sites_item(m_selected_most_visited_sites_item_info.index,
1077                                                 get_url().c_str(), m_selected_most_visited_sites_item_info.title.c_str(),
1078                                                 history_id.c_str()))
1079                                         BROWSER_LOGE("save_most_visited_sites_item failed");
1080                         }
1081                 }
1082
1083                 m_selected_most_visited_sites_item_info.url.clear();
1084                 m_selected_most_visited_sites_item_info.title.clear();
1085                 m_selected_most_visited_sites_item_info.id.clear();
1086         }
1087
1088         std::vector<Most_Visited_Sites_DB::most_visited_sites_entry> most_visited_sites_list;
1089         if (!m_most_visited_sites_db->get_most_visited_sites_list(most_visited_sites_list)) {
1090                 BROWSER_LOGE("get_most_visited_sites_list failed");
1091                 return EINA_FALSE;
1092         }
1093
1094         for (int i = 0 ; i < most_visited_sites_list.size() ; i++) {
1095                 if (!current_url.empty() && !most_visited_sites_list[i].url.empty()
1096                      && (current_url.length() == most_visited_sites_list[i].url.length())
1097                      && !strncmp(most_visited_sites_list[i].url.c_str(), current_url.c_str(), current_url.length())) {
1098                         is_ranked = EINA_TRUE;
1099                         screen_shot_path = std::string(BROWSER_SCREEN_SHOT_DIR)
1100                                                         + most_visited_sites_list[i].id;
1101                         if (most_visited_sites_list[i].id.length() > strlen(DEFAULT_ICON_PREFIX) &&
1102                             !strncmp(DEFAULT_ICON_PREFIX, most_visited_sites_list[i].id.c_str(),
1103                                                         strlen(DEFAULT_ICON_PREFIX))) {
1104                                 /* If default icon */
1105                                 std::string history_id;
1106                                 history_id = m_most_visited_sites_db->get_history_id_by_url(most_visited_sites_list[i].url.c_str());
1107                                 if (!history_id.empty()) {
1108                                         if (m_most_visited_sites_db->save_most_visited_sites_item(most_visited_sites_list[i].index,
1109                                                 most_visited_sites_list[i].url.c_str(), most_visited_sites_list[i].title.c_str(),
1110                                                 history_id.c_str())) {
1111                                                 screen_shot_path = std::string(BROWSER_SCREEN_SHOT_DIR)
1112                                                                         + most_visited_sites_list[i].id;
1113                                                 remove(screen_shot_path.c_str());
1114                                                 screen_shot_path = std::string(BROWSER_SCREEN_SHOT_DIR)
1115                                                                         + history_id;
1116                                         }
1117                                 }
1118                         }
1119                         break;
1120                 }
1121         }
1122
1123         if (!is_ranked) {
1124                 std::vector<Most_Visited_Sites_DB::most_visited_sites_entry> most_visited_list;
1125                 if (!m_most_visited_sites_db->get_most_visited_list(most_visited_list, most_visited_sites_list,
1126                                                         BROWSER_MOST_VISITED_SITES_ITEM_MAX * 2)) {
1127                         BROWSER_LOGE("get_most_visited_list failed");
1128                         return EINA_FALSE;
1129                 }
1130                 for (int i = 0; i < most_visited_list.size(); i++)
1131                 {
1132                         if (most_visited_list[i].url == current_url) {
1133                                 is_ranked = EINA_TRUE;
1134                                 screen_shot_path = std::string(BROWSER_SCREEN_SHOT_DIR)
1135                                                                         + most_visited_list[i].id;
1136                                 break;
1137                         }
1138                 }
1139         }
1140
1141         if (is_ranked && screen_shot_path.size() > 0) {
1142                 int focused_ewk_view_w = 0;
1143                 int focused_ewk_view_h = 0;
1144                 evas_object_geometry_get(m_focused_window->m_ewk_view, NULL, NULL,
1145                                                         &focused_ewk_view_w, &focused_ewk_view_h);
1146
1147                 int window_w = 0;
1148                 evas_object_geometry_get(m_win, NULL, NULL, &window_w, NULL);
1149                 int item_w = window_w / 3;
1150                 int item_h = item_w + 10 * elm_scale_get();
1151
1152                 double ratio = (double)((double)item_h / (double)item_w);
1153
1154                 Eina_Rectangle snapshot_rect;
1155                 snapshot_rect.x = snapshot_rect.y = 0;
1156                 snapshot_rect.w = focused_ewk_view_w;
1157                 snapshot_rect.h = focused_ewk_view_w * ratio;
1158
1159                 Evas_Object *snapshot = ewk_view_screenshot_contents_get(m_focused_window->m_ewk_view,
1160                                         snapshot_rect, 0.33, evas_object_evas_get(m_navi_bar));
1161                 if (!snapshot) {
1162                         BROWSER_LOGE("ewk_view_screenshot_contents_get failed");
1163                         return EINA_FALSE;
1164                 }
1165                 uint8_t *pixels = (uint8_t *)(evas_object_image_data_get(snapshot, EINA_TRUE));
1166
1167                 int surface_width = 0;
1168                 int surface_height = 0;
1169                 evas_object_image_size_get(snapshot, &surface_width, &surface_height);
1170                 BROWSER_LOGD("<<<< surface_width = %d, surface_height = %d >>>", surface_width, surface_height);
1171
1172                 cairo_surface_t *snapshot_surface = cairo_image_surface_create_for_data(pixels, CAIRO_FORMAT_RGB24,
1173                                                                 surface_width, surface_height,
1174                                                                 cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, surface_width));
1175                 if (!snapshot_surface) {
1176                         BROWSER_LOGE("cairo_image_surface_create_for_data failed");
1177                         return EINA_FALSE;
1178                 }
1179
1180                 if (cairo_surface_write_to_png(snapshot_surface, screen_shot_path.c_str())
1181                                                         != CAIRO_STATUS_SUCCESS)
1182                         BROWSER_LOGD("cairo_surface_write_to_png FAILED");
1183                 cairo_surface_destroy(snapshot_surface);
1184         }
1185         return EINA_TRUE;
1186 }
1187
1188 Eina_Bool Browser_View::__capture_most_visited_sites_screen_shot_idler_cb(void *data)
1189 {
1190         BROWSER_LOGD("[%s]", __func__);
1191         if (!data)
1192                 return ECORE_CALLBACK_CANCEL;
1193
1194         Browser_View *browser_view = (Browser_View *)data;
1195         if (!browser_view->_capture_most_visited_sites_item_screen_shot())
1196                 BROWSER_LOGE("_capture_most_visited_sites_item_screen_shot failed");
1197
1198         return ECORE_CALLBACK_CANCEL;
1199 }
1200 #endif
1201
1202 void Browser_View::_load_finished(void)
1203 {
1204         BROWSER_LOGD("[%s]", __func__);
1205
1206         /* enable or disable back,forward controlbar buttons */
1207         _set_controlbar_back_forward_status();
1208
1209         if (!_set_favicon())
1210                 BROWSER_LOGE("_set_favicon failed");
1211         _set_secure_icon();
1212
1213         /* Add current url to history */
1214         Eina_Bool is_full = EINA_FALSE;
1215
1216         /* Save last visited url to save this when browser exits. */
1217         m_last_visited_url = get_url();
1218
1219         if (m_data_manager->get_history_db() && !m_is_private) {
1220                 m_data_manager->get_history_db()->save_history(m_last_visited_url.c_str(),
1221                                                         get_title().c_str(), &is_full);
1222                 if (is_full)
1223                         BROWSER_LOGE("history is full, delete the first one");
1224         }
1225
1226         _hide_scroller_url_layout();
1227
1228 #if defined(FEATURE_MOST_VISITED_SITES)
1229         ecore_idler_add(__capture_most_visited_sites_screen_shot_idler_cb, this);
1230 #endif
1231
1232         elm_object_focus_set(m_option_header_cancel_button, EINA_TRUE);
1233         elm_object_signal_emit(m_option_header_url_edit_field, "ellipsis_show,signal", "elm");
1234         elm_object_signal_emit(m_url_edit_field, "ellipsis_show,signal", "elm");
1235
1236         _update_back_forward_buttons();
1237 }
1238
1239 void Browser_View::_hide_scroller_url_layout(void)
1240 {
1241         BROWSER_LOGD("[%s]", __func__);
1242
1243         if (_get_edit_mode() != BR_NO_EDIT_MODE
1244 #if defined(FEATURE_MOST_VISITED_SITES)
1245             || is_most_visited_sites_running()
1246 #endif
1247         )
1248                 return;
1249
1250         _navigationbar_visible_set_signal(EINA_FALSE);
1251
1252         int browser_scroller_x = 0;
1253         int browser_scroller_w = 0;
1254         int browser_scroller_h = 0;
1255         elm_scroller_region_get(m_scroller, &browser_scroller_x, NULL,
1256                                         &browser_scroller_w, &browser_scroller_h);
1257
1258         int url_layout_h = 0;
1259         evas_object_geometry_get(m_url_layout, NULL, NULL, NULL, &url_layout_h);
1260         elm_scroller_region_show(m_scroller, browser_scroller_x, url_layout_h,
1261                                         browser_scroller_w, browser_scroller_h);
1262 }
1263
1264 void Browser_View::__load_progress_cb(void *data, Evas_Object *obj, void *event_info)
1265 {
1266         if (!data)
1267                 return;
1268
1269         Browser_View *browser_view = (Browser_View *)data;
1270         Evas_Object *url_progressbar = browser_view->m_url_progressbar;
1271         Evas_Object *option_header_url_progressbar = browser_view->m_option_header_url_progressbar;
1272
1273         double progress = ewk_view_load_progress_get(browser_view->m_focused_window->m_ewk_view);
1274         elm_progressbar_value_set(url_progressbar, progress);
1275         elm_progressbar_value_set(option_header_url_progressbar, progress);
1276
1277         if (progress == 1.0f)
1278                 __load_finished_cb(data, obj, NULL);
1279 }
1280
1281 void Browser_View::__ewk_view_mouse_down_cb(void* data, Evas* evas, Evas_Object* obj, void* ev)
1282 {
1283         if (!data)
1284                 return;
1285
1286         Browser_View *browser_view = (Browser_View *)data;
1287         Evas_Event_Mouse_Down event = *(Evas_Event_Mouse_Down *)ev;
1288         Evas_Object *main_layout = browser_view->m_main_layout;
1289         Evas_Object *ewk_view = browser_view->m_focused_window->m_ewk_view;
1290
1291 #if defined(FEATURE_MOST_VISITED_SITES)
1292         if (browser_view->is_most_visited_sites_running())
1293                 return;
1294 #endif
1295
1296 #ifdef BROWSER_SCROLLER_BOUNCING
1297         /* activate webview firstly when user starts to touch. */
1298         browser_view->_enable_webview_scroll();
1299 #endif
1300
1301         if (!browser_view->_is_loading() && browser_view->_get_edit_mode() != BR_FIND_WORD_MODE)
1302                 browser_view->_navigationbar_visible_set(EINA_FALSE);
1303
1304         browser_view->m_is_scrolling = EINA_TRUE;
1305
1306         BROWSER_LOGD("__ewk_view_mouse_down_cb");
1307
1308 #ifdef ZOOM_BUTTON
1309         double sacle_factor = ewk_view_scale_get(browser_view->m_focused_window->m_ewk_view);
1310         double min_scale = 0;
1311         double max_scale = 0;
1312
1313         bool zoom_button_flag = true;
1314         if (br_preference_get_bool(ZOOM_BUTTON_KEY, &zoom_button_flag) == false)
1315                 BROWSER_LOGE("failed to get ZOOM_BUTTON_KEY value\n");
1316
1317         BROWSER_LOGD("zoom_button_flag =%d", zoom_button_flag);
1318
1319         if (zoom_button_flag == false)
1320                 return;
1321
1322         if (browser_view->m_zoom_button_timer)
1323                 ecore_timer_del(browser_view->m_zoom_button_timer);
1324         browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
1325         edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "show,zoom_buttons,signal", "");
1326 #endif
1327 }
1328
1329 void Browser_View::__ewk_view_enter_full_screen_cb(void *data, Evas_Object *obj, void *event_info)
1330 {
1331         if (!data)
1332                 return;
1333
1334         Browser_View *browser_view = (Browser_View *)data;
1335         browser_view->set_full_sreen(EINA_TRUE);
1336 }
1337
1338 void Browser_View::__ewk_view_exit_full_screen_cb(void *data, Evas_Object *obj, void *event_info)
1339 {
1340         if (!data)
1341                 return;
1342
1343         Browser_View *browser_view = (Browser_View *)data;
1344         browser_view->set_full_sreen(EINA_FALSE);
1345 }
1346
1347 void Browser_View::__ewk_view_vibration_vibrate_cb(void *data, Evas_Object *obj, void *event_info)
1348 {
1349         Browser_View *browser_view = (Browser_View*)data;
1350         const long vibration_time = *((const long *)event_info);
1351
1352         BROWSER_LOGD("__ewk_view_vibration_vibrate_cb : play time is [%ld]", vibration_time);
1353
1354         browser_view->_haptic_device_play(vibration_time);
1355 }
1356
1357 void Browser_View::__ewk_view_vibration_cancel_cb(void *data, Evas_Object *obj, void *event_info)
1358 {
1359         BROWSER_LOGD("[%s]", __func__);
1360
1361         Browser_View *browser_view = (Browser_View*)data;
1362
1363         browser_view->_haptic_device_stop();
1364 }
1365
1366 void Browser_View::__ewk_view_mouse_up_cb(void* data, Evas* evas, Evas_Object* obj, void* ev)
1367 {
1368         if (!data)
1369                 return;
1370
1371         Browser_View *browser_view = (Browser_View *)data;
1372
1373         browser_view->m_is_scrolling = EINA_FALSE;
1374 }
1375
1376 void Browser_View::__ewk_view_edge_top_cb(void *data, Evas_Object *obj, void *event_info)
1377 {
1378 #ifdef BROWSER_SCROLLER_BOUNCING
1379         BROWSER_LOGD("[%s]", __func__);
1380
1381         if (!data)
1382                 return;
1383         Browser_View *browser_view = (Browser_View *)data;
1384         browser_view->_enable_browser_scroller_scroll();
1385
1386         /* If user do flicking the mouse with scroll up, bring in the browser scroller to y=0.  */
1387         if (!browser_view->m_is_scrolling) {
1388                 BROWSER_LOGD("<< elm_scroller_region_bring_in >>");
1389                 int browser_scroller_x = 0;
1390                 int browser_scroller_w = 0;
1391                 int browser_scroller_h = 0;
1392                 elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, NULL,
1393                                                 &browser_scroller_w, &browser_scroller_h);
1394
1395                 elm_scroller_region_bring_in(browser_view->m_scroller, browser_scroller_x, 0,
1396                                                 browser_scroller_w, browser_scroller_h);
1397         }
1398 #endif
1399 }
1400
1401 void Browser_View::__ewk_view_scroll_down_cb(void *data, Evas_Object *obj, void *event_info)
1402 {
1403 #ifdef BROWSER_SCROLLER_BOUNCING
1404         if (!data)
1405                 return;
1406         Browser_View *browser_view = (Browser_View *)data;
1407
1408         int scroller_x = 0;
1409         int scroller_y = 0;
1410         int scroller_w = 0;
1411         int scroller_h = 0;
1412         int url_layout_h = 0;
1413         elm_scroller_region_get(browser_view->m_scroller, &scroller_x, &scroller_y, &scroller_w, &scroller_h);
1414         evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
1415
1416         if (scroller_y < url_layout_h) {
1417                 /* We have to hide urlbar when webview's contents are scrolled down by flicking. */
1418                 if (!browser_view->m_is_scrolling)
1419                         elm_scroller_region_show(browser_view->m_scroller, scroller_x, url_layout_h, scroller_w, scroller_h);
1420                 else
1421                         browser_view->_enable_browser_scroller_scroll();
1422         } else {
1423                 browser_view->_enable_webview_scroll();
1424         }
1425 #endif
1426 }
1427
1428 void Browser_View::__ewk_view_scroll_up_cb(void *data, Evas_Object *obj, void *event_info)
1429 {
1430 #ifdef BROWSER_SCROLLER_BOUNCING
1431         if (!data)
1432                 return;
1433
1434         Browser_View *browser_view = (Browser_View *)data;
1435         browser_view->_enable_webview_scroll();
1436 #endif
1437 }
1438
1439 void Browser_View::_set_navigationbar_title(const char *title)
1440 {
1441         BROWSER_LOGD("title=[%s]", title);
1442         edje_object_part_text_set(elm_layout_edje_get(m_url_layout),
1443                                         "title_text", title);
1444         edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_layout),
1445                                         "title_text", title);
1446 }
1447
1448
1449 void Browser_View::_set_url_entry(const char *url, Eina_Bool set_secrue_icon)
1450 {
1451         BROWSER_LOGD("url=[%s]", url);
1452         if (url && strlen(url)) {
1453                 std::string url_without_http_scheme;
1454                 if (strstr(url, BROWSER_HTTP_SCHEME) && strlen(url) > strlen(BROWSER_HTTP_SCHEME))
1455                         url_without_http_scheme = std::string(url + strlen(BROWSER_HTTP_SCHEME));
1456                 else
1457                         url_without_http_scheme = std::string(url);
1458
1459                 char *mark_up_url = elm_entry_utf8_to_markup(url_without_http_scheme.c_str());
1460                 if (mark_up_url) {
1461                         Evas_Object *entry = br_elm_editfield_entry_get(m_url_edit_field);
1462                         elm_entry_entry_set(entry, mark_up_url);
1463                         entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
1464                         elm_entry_entry_set(entry, mark_up_url);
1465
1466                         edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_edit_field),
1467                                                         "elm.text.ellipsis", mark_up_url);
1468                         edje_object_part_text_set(elm_layout_edje_get(m_url_edit_field),
1469                                                         "elm.text.ellipsis", mark_up_url);
1470                         free(mark_up_url);
1471                 }
1472         } else {
1473                 Evas_Object *entry = br_elm_editfield_entry_get(m_url_edit_field);
1474 #if defined(FEATURE_MOST_VISITED_SITES)
1475                 elm_entry_entry_set(entry, BROWSER_MOST_VISITED_SITES_URL);
1476 #else
1477                 elm_entry_entry_set(entry, BROWSER_BLANK_PAGE_URL);
1478 #endif
1479                 entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
1480 #if defined(FEATURE_MOST_VISITED_SITES)
1481                 elm_entry_entry_set(entry, BROWSER_MOST_VISITED_SITES_URL);
1482
1483                 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_edit_field),
1484                                                 "elm.text.ellipsis", BROWSER_MOST_VISITED_SITES_URL);
1485                 edje_object_part_text_set(elm_layout_edje_get(m_url_edit_field),
1486                                                 "elm.text.ellipsis", BROWSER_MOST_VISITED_SITES_URL);
1487 #else
1488                 elm_entry_entry_set(entry, BROWSER_BLANK_PAGE_URL);
1489
1490                 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_edit_field),
1491                                                 "elm.text.ellipsis", BROWSER_BLANK_PAGE_URL);
1492                 edje_object_part_text_set(elm_layout_edje_get(m_url_edit_field),
1493                                                 "elm.text.ellipsis", BROWSER_BLANK_PAGE_URL);
1494 #endif
1495         }
1496
1497         if (set_secrue_icon)
1498                 _set_secure_icon();
1499 }
1500
1501 void Browser_View::_stop_loading(void)
1502 {
1503         BROWSER_LOGD("[%s]", __func__);
1504         if (m_focused_window->m_ewk_view)
1505                 ewk_view_stop(m_focused_window->m_ewk_view);
1506 }
1507
1508 void Browser_View::_reload(void)
1509 {
1510         BROWSER_LOGD("[%s]", __func__);
1511         if (m_focused_window->m_ewk_view)
1512                 ewk_view_reload_bypass_cache(m_focused_window->m_ewk_view);
1513 }
1514
1515 void Browser_View::set_focused_window(Browser_Window *window
1516 #if defined(FEATURE_MOST_VISITED_SITES)
1517         ,Eina_Bool show_most_visited_sites
1518 #endif
1519         )
1520 {
1521         BROWSER_LOGD("[%s]", __func__);
1522         if (m_focused_window && m_focused_window->m_ewk_view_layout) {
1523                 elm_box_unpack(m_content_box, m_focused_window->m_ewk_view_layout);
1524                 evas_object_hide(m_focused_window->m_ewk_view_layout);
1525         }
1526
1527         if (m_focused_window && m_focused_window->m_favicon) {
1528                 if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
1529                         elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
1530
1531                 evas_object_hide(m_focused_window->m_favicon);
1532         }
1533         if (m_focused_window && m_focused_window->m_option_header_favicon) {
1534                 if (elm_object_part_content_get(m_option_header_url_entry_layout, "elm.swallow.favicon"))
1535                         elm_object_part_content_unset(m_option_header_url_entry_layout, "elm.swallow.favicon");
1536
1537                 evas_object_hide(m_focused_window->m_option_header_favicon);
1538         }
1539
1540         m_focused_window = window;
1541
1542         if (!m_focused_window->m_ewk_view_layout) {
1543                 m_focused_window->m_ewk_view_layout = elm_layout_add(m_navi_bar);
1544                 if (!m_focused_window->m_ewk_view_layout) {
1545                         BROWSER_LOGE("elm_layout_add failed!");
1546                         return;
1547                 }
1548                 if (!elm_layout_file_set(m_focused_window->m_ewk_view_layout,
1549                                         BROWSER_EDJE_DIR"/browser-view-main.edj",
1550                                         "browser/browser-view-webview")) {
1551                         BROWSER_LOGE("elm_layout_file_set failed", BROWSER_EDJE_DIR);
1552                         return;
1553                 }
1554                 evas_object_size_hint_weight_set(m_focused_window->m_ewk_view_layout,
1555                                                 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1556                 evas_object_size_hint_align_set(m_focused_window->m_ewk_view_layout,
1557                                                 EVAS_HINT_FILL, EVAS_HINT_FILL);
1558                 elm_box_pack_end(m_content_box, m_focused_window->m_ewk_view_layout);
1559                 evas_object_show(m_focused_window->m_ewk_view_layout);
1560
1561                 elm_object_part_content_set(m_focused_window->m_ewk_view_layout, "elm.swallow.webview",
1562                                         m_focused_window->m_ewk_view);
1563                 evas_object_show(m_focused_window->m_ewk_view);
1564
1565
1566                 /* Workaround.
1567                   * If launch the browser by aul, the grey bg is displayed shortly. */
1568                 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1569                                                 "hide,grey_background,signal", "");
1570                 /* Workaround.
1571                   * The webview layout is not resized whenever repack to content box.
1572                   * So resize the webview layout whenever repack. */
1573                 m_resize_idler = ecore_idler_add(__webview_layout_resize_idler_cb, this);
1574         } else {
1575                 elm_box_pack_end(m_content_box, m_focused_window->m_ewk_view_layout);
1576                 evas_object_show(m_focused_window->m_ewk_view_layout);
1577                 evas_object_show(m_focused_window->m_ewk_view);
1578         }
1579
1580         if (!_is_loading()) {
1581                 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,off,signal", "");
1582                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1583                                         "loading,off,signal", "");
1584                 elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
1585                 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
1586         }
1587
1588         /* show or hide favicon in url layout. */
1589         if (m_focused_window->m_favicon
1590 #if defined(FEATURE_MOST_VISITED_SITES)
1591                 && !is_most_visited_sites_running()
1592 #endif
1593                 ) {
1594                 if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
1595                         elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
1596
1597                 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.favicon",
1598                                                         m_focused_window->m_favicon);
1599                 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1600                                                         "show,favicon,signal", "");
1601                 evas_object_show(m_focused_window->m_favicon);
1602                 _set_secure_icon();
1603         } else {
1604                 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1605                                                         "hide,favicon,signal", "");
1606         }
1607
1608         /* show or hide favicon in option header url layout. */
1609         if (m_focused_window->m_option_header_favicon
1610 #if defined(FEATURE_MOST_VISITED_SITES)
1611                 && !is_most_visited_sites_running()
1612 #endif
1613                 ) {
1614                 if (elm_object_part_content_get(m_option_header_url_entry_layout, "elm.swallow.favicon"))
1615                         elm_object_part_content_unset(m_option_header_url_entry_layout, "elm.swallow.favicon");
1616
1617                 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.favicon",
1618                                                         m_focused_window->m_option_header_favicon);
1619                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1620                                                         "show,favicon,signal", "");
1621                 _set_secure_icon();
1622                 evas_object_show(m_focused_window->m_option_header_favicon);
1623         } else {
1624                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1625                                                         "hide,favicon,signal", "");
1626         }
1627
1628 #if defined(FEATURE_MOST_VISITED_SITES)
1629         if (show_most_visited_sites) {
1630                 if (get_url().empty())
1631                         _show_most_visited_sites(EINA_TRUE);
1632                 else
1633                         _show_most_visited_sites(EINA_FALSE);
1634         }
1635 #endif
1636
1637         std::vector<Browser_Window *> window_list = m_browser->get_window_list();
1638         _set_multi_window_controlbar_text(window_list.size());
1639
1640         if (!_set_favicon())
1641                 BROWSER_LOGE("_set_favicon failed");
1642
1643         _update_back_forward_buttons();
1644
1645         /* Without this code, the url is empty shortly when create deleted-window in multi window. */
1646         if (get_url().empty() && !m_focused_window->m_url.empty())
1647                 _set_url_entry(m_focused_window->m_url.c_str());
1648         else
1649                 _set_url_entry(get_url().c_str());
1650
1651         if (window_list.size() >= BROWSER_MULTI_WINDOW_MAX_COUNT)
1652                 elm_object_item_disabled_set(m_new_window_button, EINA_TRUE);
1653         else
1654                 elm_object_item_disabled_set(m_new_window_button, EINA_FALSE);
1655 }
1656
1657 #if defined(FEATURE_MOST_VISITED_SITES)
1658 Eina_Bool Browser_View::_show_most_visited_sites(Eina_Bool is_show)
1659 {
1660         BROWSER_LOGD("[%s]is_show=%d", __func__, is_show);
1661         if (is_show) {
1662                 m_selected_most_visited_sites_item_info.url.clear();
1663                 m_selected_most_visited_sites_item_info.title.clear();
1664                 m_selected_most_visited_sites_item_info.id.clear();
1665
1666                 if (!m_most_visited_sites) {
1667                         m_most_visited_sites = new(nothrow) Most_Visited_Sites(m_navi_bar, this, m_most_visited_sites_db);
1668                         if (!m_most_visited_sites) {
1669                                 BROWSER_LOGE("new Most_Visited_Sites failed");
1670                                 return EINA_FALSE;
1671                         }
1672
1673                         Evas_Object *most_visited_sites_layout = m_most_visited_sites->create_most_visited_sites_main_layout();
1674                         if (!most_visited_sites_layout) {
1675                                 BROWSER_LOGE("create_most_visited_sites_main_layout failed");
1676                                 if (m_most_visited_sites) {
1677                                         delete m_most_visited_sites;
1678                                         m_most_visited_sites = NULL;
1679                                 }
1680                                 return EINA_FALSE;
1681                         }
1682                         elm_object_part_content_set(m_main_layout, "elm.swallow.most_visited_sites", most_visited_sites_layout);
1683                         edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1684                                                         "show,most_visited_sites,signal", "");
1685                         edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1686                                                         "show,control_bar,no_animation,signal", "");
1687
1688                         /* change the url layout for normal mode. (change the reload icon etc) */
1689                         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,off,signal", "");
1690                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1691                                                 "loading,off,signal", "");
1692
1693                         edje_object_part_text_set(elm_layout_edje_get(m_url_entry_layout),
1694                                                         "url_guide_text", BR_STRING_URL_GUIDE_TEXT);
1695                         edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_entry_layout),
1696                                                         "url_guide_text", BR_STRING_URL_GUIDE_TEXT);
1697
1698                         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,on,signal", "");
1699                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1700                                                                 "url_guide_text,on,signal", "");
1701
1702                         _set_navigationbar_title(BR_STRING_MOST_VISITED_SITES);
1703                         _set_url_entry(BROWSER_MOST_VISITED_SITES_URL);
1704
1705                         /* If the speed dial is displayed for the first time, destroy the progress wheel. */
1706                         if (m_dummy_loading_progressbar) {
1707                                 elm_object_part_content_unset(m_main_layout, "elm.swallow.waiting_progress");
1708                                 evas_object_del(m_dummy_loading_progressbar);
1709                                 m_dummy_loading_progressbar = NULL;
1710                                 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1711                                                         "hide,waiting_progressbar,signal", "");
1712                         }
1713
1714                         elm_object_item_disabled_set(m_add_bookmark_button, EINA_TRUE);
1715                 }
1716
1717                 int scroller_x = 0;
1718                 int scroller_w = 0;
1719                 int scroller_h = 0;
1720                 elm_scroller_region_get(m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
1721                 elm_scroller_region_show(m_scroller ,scroller_x, 0, scroller_w, scroller_h);
1722
1723                 _navigationbar_visible_set_signal(EINA_TRUE);
1724
1725                 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1726                                                         "hide,favicon,signal", "");
1727                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1728                                                         "hide,favicon,signal", "");
1729
1730 #ifdef BROWSER_SCROLLER_BOUNCING
1731                 BROWSER_LOGD("<< lock browser scroller >>");
1732                 elm_object_scroll_freeze_pop(m_scroller);
1733                 elm_object_scroll_freeze_push(m_scroller);
1734 #endif
1735         } else {
1736                 if (m_most_visited_sites) {
1737                         if (elm_object_part_content_get(m_main_layout, "elm.swallow.most_visited_sites"))
1738                                 elm_object_part_content_unset(m_main_layout, "elm.swallow.most_visited_sites");
1739                         edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1740                                                         "hide,most_visited_sites,signal", "");
1741                         edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1742                                                 "hide,most_visited_sites_guide_text,signal", "");
1743
1744                         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,off,signal", "");
1745                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1746                                                                                 "url_guide_text,off,signal", "");
1747
1748                         delete m_most_visited_sites;
1749                         m_most_visited_sites = NULL;
1750
1751                         elm_object_item_disabled_set(m_add_bookmark_button, EINA_FALSE);
1752                 }
1753         }
1754         return EINA_TRUE;
1755 }
1756 #endif
1757
1758 void Browser_View::load_url(const char *url)
1759 {
1760         BROWSER_LOGD("[%s]", __func__);
1761 #if defined(FEATURE_MOST_VISITED_SITES)
1762         if (!url || !strlen(url)) {
1763                 if (!_show_most_visited_sites(EINA_TRUE))
1764                         BROWSER_LOGE("_show_most_visited_sites EINA_TRUE failed");
1765                 return;
1766
1767         } else {
1768                 if (!_show_most_visited_sites(EINA_FALSE))
1769                         BROWSER_LOGE("_show_most_visited_sites EINA_FALSE failed");
1770         }
1771 #endif
1772
1773         Evas_Object *edit_field_entry = br_elm_editfield_entry_get(_get_activated_url_entry());
1774         evas_object_smart_callback_del(edit_field_entry, "changed", __url_entry_changed_cb);
1775
1776         std::string full_url;
1777         if (_has_url_sheme(url))
1778                 full_url = url;
1779         else
1780                 full_url = std::string(BROWSER_HTTP_SCHEME) + std::string(url);
1781
1782         BROWSER_LOGD("full_url = [%s]", full_url.c_str());
1783
1784         _set_url_entry(full_url.c_str());
1785
1786         ewk_view_uri_set(m_focused_window->m_ewk_view, full_url.c_str());
1787 }
1788
1789 string Browser_View::get_title(Browser_Window *window)
1790 {
1791         const char *title = ewk_view_title_get(window->m_ewk_view);
1792         BROWSER_LOGD("title = [%s]", title);
1793
1794         if (!window->m_ewk_view && !window->m_title.empty())
1795                 return window->m_title;
1796
1797         if (!window->m_ewk_view)
1798                 return std::string();
1799
1800         if (!title) {
1801                 if (!window->m_title.empty())
1802                         return window->m_title;
1803                 else
1804                         return std::string();
1805         }
1806
1807         return std::string(title);
1808 }
1809
1810 string Browser_View::get_title(void)
1811 {
1812         const char *title = ewk_view_title_get(m_focused_window->m_ewk_view);
1813         BROWSER_LOGD("title = [%s]", title);
1814
1815         if (!title && m_focused_window->m_title.empty())
1816                 return std::string();
1817         else if (!title && !m_focused_window->m_title.empty())
1818                 return m_focused_window->m_title;
1819
1820         if (title && strlen(title))
1821                 return std::string(title);
1822
1823         return std::string();
1824 }
1825
1826 string Browser_View::get_url(Browser_Window *window)
1827 {
1828         BROWSER_LOGD("[%s]", __func__);
1829
1830         if (!window->m_ewk_view && !window->m_url.empty())
1831                 return window->m_url;
1832
1833         if (!window->m_ewk_view)
1834                 return std::string();
1835
1836         const char *uri = ewk_view_uri_get(window->m_ewk_view);
1837         BROWSER_LOGD("uri = [%s]", uri);
1838
1839         if (!uri || strlen(uri) == 0)
1840                 return std::string();
1841
1842         return std::string(uri);
1843 }
1844
1845 string Browser_View::get_url(void)
1846 {
1847         const char *uri = ewk_view_uri_get(m_focused_window->m_ewk_view);
1848         BROWSER_LOGD("uri = [%s]", uri);
1849
1850         if (!uri || strlen(uri) == 0)
1851                 return std::string();
1852
1853         return std::string(uri);
1854 }
1855
1856 /* If multi window is running, unset the navigation title object,
1857   * else set the navigation title object to show title object arrow.  */
1858 void Browser_View::unset_navigationbar_title_object(Eina_Bool is_unset)
1859 {
1860         BROWSER_LOGD("[%s] is_unset =%d", __func__, is_unset);
1861         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
1862         if (is_unset) {
1863                 _navigationbar_visible_set_signal(EINA_FALSE);
1864                 elm_object_item_part_content_unset(top_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER);
1865                 evas_object_hide(m_option_header_layout);
1866         } else {
1867                 Evas_Object *title_object = NULL;
1868                 title_object = elm_object_item_part_content_get(top_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER);
1869                 if (!title_object) {
1870                         elm_object_item_part_content_set(top_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER,
1871                                                                         m_option_header_layout);
1872                         evas_object_show(m_option_header_layout);
1873                 }
1874 #if defined(FEATURE_MOST_VISITED_SITES)
1875                 if (!is_most_visited_sites_running())
1876                         _navigationbar_visible_set_signal(EINA_FALSE);
1877 #endif
1878         }
1879 }
1880
1881 void Browser_View::__go_to_bookmark_cb(void *data, Evas_Object *obj, void *event_info)
1882 {
1883         BROWSER_LOGD("[%s]", __func__);
1884         if (!data)
1885                 return;
1886
1887         Browser_View *browser_view = (Browser_View *)data;
1888
1889         if (!m_data_manager->create_bookmark_view()) {
1890                 BROWSER_LOGE("m_data_manager->create_bookmark_view failed");
1891                 return;
1892         }
1893
1894         if (!m_data_manager->get_bookmark_view()->init()) {
1895                 BROWSER_LOGE("m_data_manager->get_bookmark_view()->init failed");
1896                 m_data_manager->destroy_bookmark_view();
1897         }
1898
1899         browser_view->_destroy_more_context_popup();
1900 }
1901
1902 void Browser_View::__backward_cb(void *data, Evas_Object *obj, void *event_info)
1903 {
1904         BROWSER_LOGD("[%s]", __func__);
1905         if (!data)
1906                 return;
1907
1908         Browser_View *browser_view = (Browser_View *)data;
1909         __title_back_button_clicked_cb(data, NULL, NULL);
1910
1911         browser_view->_destroy_more_context_popup();
1912 }
1913
1914 void Browser_View::__forward_cb(void *data, Evas_Object *obj, void *event_info)
1915 {
1916         BROWSER_LOGD("[%s]", __func__);
1917         if (!data)
1918                 return;
1919
1920         Browser_View *browser_view = (Browser_View *)data;
1921         browser_view->_destroy_more_context_popup();
1922         if (browser_view->m_focused_window->m_ewk_view
1923                 && ewk_view_forward_possible(browser_view->m_focused_window->m_ewk_view))
1924                 ewk_view_forward(browser_view->m_focused_window->m_ewk_view);
1925 }
1926
1927 #ifdef USE_META_TAG
1928 void Browser_View::__web_app_capable_get_cb(Eina_Bool capable, void* user_data)
1929 {
1930         BROWSER_LOGD("[%s]", __func__);
1931
1932         if (!user_data)
1933                 return;
1934
1935         Browser_View *browser_view = (Browser_View *)user_data;
1936         Evas_Object *webkit = browser_view->m_focused_window->m_ewk_view;
1937         if (capable) {
1938                 ewk_view_web_application_icon_url_get(webkit, __web_app_icon_url_get_cb, browser_view);
1939         }
1940 }
1941
1942 void Browser_View::__web_app_icon_url_get_cb(const char* icon_url, void* user_data)
1943 {
1944         BROWSER_LOGD("icon_url:%s", icon_url);
1945
1946         if (!user_data)
1947                 return;
1948
1949         Browser_View *browser_view = (Browser_View *)user_data;
1950
1951         /* make configure file */
1952         browser_view->m_meta_tag->create_config_xml((browser_view->get_url()).c_str(), browser_view->get_title().c_str(), NULL);
1953         if (!icon_url || strlen(icon_url) == 0) {
1954                 BROWSER_LOGD("Failed to get webapp icon url, make widget with default icon");
1955                 browser_view->m_meta_tag->wgt_install(NULL);
1956         } else {
1957                 BROWSER_LOGD("Succeed to get webapp icon url, make widget after icon downloaded");
1958                 /* get icon */
1959                 browser_view->m_meta_tag->request_download_icon(icon_url);
1960         }
1961 }
1962 #endif
1963
1964 Eina_Bool Browser_View::__show_scissorbox_view_idler_cb(void *data)
1965 {
1966         if (!data)
1967                 return ECORE_CALLBACK_CANCEL;
1968
1969         Browser_View *browser_view = (Browser_View *)data;
1970
1971         if (browser_view->m_scissorbox_view)
1972                 delete browser_view->m_scissorbox_view;
1973
1974         browser_view->m_scissorbox_view = new(nothrow) Browser_Scissorbox_View(browser_view);
1975         if (!browser_view->m_scissorbox_view) {
1976                 BROWSER_LOGE("new Browser_Scissorbox_View failed");
1977                 return ECORE_CALLBACK_CANCEL;
1978         }
1979         if (!browser_view->m_scissorbox_view->init()) {
1980                 BROWSER_LOGE("m_scissorbox_view->init failed");
1981                 delete browser_view->m_scissorbox_view;
1982                 browser_view->m_scissorbox_view = NULL;
1983                 return ECORE_CALLBACK_CANCEL;
1984         }
1985
1986         elm_object_part_content_set(browser_view->m_main_layout, "elm.swallow.scissorbox",
1987                                                 browser_view->m_scissorbox_view->get_layout());
1988         edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout),
1989                                                         "show,scissorbox,signal", "");
1990
1991         edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_layout),
1992                                                         "show,scissorbox,signal", "");
1993         edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_layout),
1994                                                         "show,scissorbox,signal", "");
1995
1996
1997         elm_object_part_content_unset(browser_view->m_main_layout, "elm.swallow.control_bar");
1998         evas_object_hide(browser_view->m_control_bar);
1999
2000         return ECORE_CALLBACK_CANCEL;
2001 }
2002
2003 Eina_Bool Browser_View::_show_scissorbox_view(void)
2004 {
2005         BROWSER_LOGD("[%s]", __func__);
2006
2007 //      _hide_scroller_url_layout();
2008
2009         ecore_idler_add(__show_scissorbox_view_idler_cb, this);
2010
2011         return EINA_TRUE;
2012 }
2013
2014 void Browser_View::_destroy_scissorbox_view(void)
2015 {
2016         elm_object_part_content_unset(m_main_layout, "elm.swallow.scissorbox");
2017         edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "hide,scissorbox,signal", "");
2018
2019         edje_object_signal_emit(elm_layout_edje_get(m_url_layout),
2020                                                         "hide,scissorbox,signal", "");
2021         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2022                                                         "hide,scissorbox,signal", "");
2023
2024         elm_object_part_content_unset(m_main_layout, "elm.swallow.control_bar");
2025
2026         if (m_scissorbox_view) {
2027                 delete m_scissorbox_view;
2028                 m_scissorbox_view = NULL;
2029         }
2030
2031         elm_object_part_content_set(m_main_layout, "elm.swallow.control_bar", m_control_bar);
2032         evas_object_show(m_control_bar);
2033 }
2034
2035 void Browser_View::__private_cb(void *data, Evas_Object *obj, void *event_info)
2036 {
2037         BROWSER_LOGD("[%s]", __func__);
2038         if (!data)
2039                 return;
2040
2041         Browser_View *browser_view = (Browser_View *)data;
2042         browser_view->m_is_private = !browser_view->m_is_private;
2043
2044         browser_view->m_is_private_item_pressed = EINA_TRUE;
2045
2046         elm_check_state_set(browser_view->m_private_check, browser_view->m_is_private);
2047
2048         if (browser_view->m_is_private) {
2049                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,on,signal", "");
2050                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,on,signal", "");
2051         } else {
2052                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,off,signal", "");
2053                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,off,signal", "");
2054         }
2055
2056         Ewk_Setting *setting = ewk_view_setting_get(browser_view->m_focused_window->m_ewk_view);
2057         ewk_setting_private_browsing_set(setting, browser_view->m_is_private);
2058 }
2059
2060 void Browser_View::__bookmark_cb(void *data, Evas_Object *obj, void *event_info)
2061 {
2062         BROWSER_LOGD("[%s]", __func__);
2063         if (!data)
2064                 return;
2065
2066         Browser_View *browser_view = (Browser_View *)data;
2067         int bookmark_id = -1;
2068         if(!m_data_manager->get_history_db()->is_in_bookmark(browser_view->get_url().c_str(), &bookmark_id)) {
2069                 if (!elm_icon_file_set(browser_view->m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_on.png", NULL)) {
2070                         BROWSER_LOGE("elm_icon_file_set is failed.\n");
2071                         return;
2072                 }
2073                 m_data_manager->create_bookmark_db()->save_bookmark(BROWSER_BOOKMARK_MAIN_FOLDER_ID,
2074                                         browser_view->get_title().c_str(), browser_view->get_url().c_str());
2075                 browser_view->show_notify_popup(BR_STRING_ADDED_TO_BOOKMARKS, 3, EINA_TRUE);
2076         } else {
2077                 if (!elm_icon_file_set(browser_view->m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_off.png", NULL)) {
2078                         BROWSER_LOGE("elm_icon_file_set is failed.\n");
2079                         return;
2080                 }
2081                 m_data_manager->create_bookmark_db()->delete_bookmark(bookmark_id);
2082                 browser_view->show_notify_popup(BR_STRING_REMOVED_TO_BOOKMARKS, 3, EINA_TRUE);
2083         }
2084
2085         m_data_manager->destroy_bookmark_db();
2086 }
2087
2088 void Browser_View::__bookmark_icon_changed_cb(void *data, Evas_Object *obj, void *event_info)
2089 {
2090         BROWSER_LOGD("[%s]", __func__);
2091         if (!data)
2092                 return;
2093
2094         Browser_View *browser_view = (Browser_View *)data;
2095 }
2096
2097 void Browser_View::__private_check_change_cb(void *data, Evas_Object *obj, void *event_info)
2098 {
2099         BROWSER_LOGD("[%s]", __func__);
2100         if (!data)
2101                 return;
2102
2103         Browser_View *browser_view = (Browser_View *)data;
2104         Eina_Bool state = elm_check_state_get((Evas_Object*)obj);
2105         browser_view->m_is_private = state;
2106
2107         if (browser_view->m_is_private_item_pressed) {
2108                 browser_view->m_is_private = !browser_view->m_is_private;
2109                 elm_check_state_set(browser_view->m_private_check, browser_view->m_is_private);
2110                 browser_view->m_is_private_item_pressed = EINA_FALSE;
2111         }
2112
2113         if (browser_view->m_is_private) {
2114                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,on,signal", "");
2115                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,on,signal", "");
2116         } else {
2117                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,off,signal", "");
2118                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,off,signal", "");
2119         }
2120
2121         Ewk_Setting *setting = ewk_view_setting_get(browser_view->m_focused_window->m_ewk_view);
2122         ewk_setting_private_browsing_set(setting, browser_view->m_is_private);
2123 }
2124
2125 void Browser_View::__expand_option_header_cb(void *data, Evas_Object *obj, void *event_info)
2126 {
2127         BROWSER_LOGD("[%s]", __func__);
2128         if (!data)
2129                 return;
2130
2131         Browser_View *browser_view = (Browser_View *)data;
2132
2133         browser_view->_navigationbar_title_clicked();
2134 }
2135
2136 void Browser_View::__add_bookmark_cb(void *data, Evas_Object *obj, void *event_info)
2137 {
2138         BROWSER_LOGD("[%s]", __func__);
2139         if (!data)
2140                 return;
2141
2142         Browser_View *browser_view = (Browser_View *)data;
2143         if (!m_data_manager->create_add_to_bookmark_view(browser_view->get_title(), browser_view->get_url())) {
2144                 BROWSER_LOGE("m_data_manager->create_add_to_bookmark_view failed");
2145                 return;
2146         }
2147
2148         if (!m_data_manager->get_add_to_bookmark_view()->init())
2149                 m_data_manager->destroy_add_to_bookmark_view();
2150 }
2151
2152 #if defined(HORIZONTAL_UI)
2153 void Browser_View::_rotate_multi_window(void)
2154 {
2155         BROWSER_LOGD("[%s]", __func__);
2156
2157         if (!m_data_manager->create_multi_window_view()) {
2158                 BROWSER_LOGE("m_data_manager->create_multi_window_view failed");
2159                 return;
2160         }
2161
2162         if (!m_data_manager->get_multi_window_view()->init(0.0, m_is_multi_window_grid_mode)) {
2163                 m_data_manager->destroy_multi_window_view();
2164                 BROWSER_LOGE("get_multi_window_view()->init failed");
2165                 return;
2166         }
2167
2168         ewk_view_suspend(m_focused_window->m_ewk_view);
2169
2170         _navigationbar_visible_set_signal(EINA_FALSE);
2171
2172         /* Hide the secure lock icon in title bar. */
2173         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
2174         elm_object_item_part_content_set(top_it, ELM_NAVIFRAME_ITEM_ICON, NULL);
2175
2176         if (_get_edit_mode() != BR_NO_EDIT_MODE)
2177                 _set_edit_mode(BR_NO_EDIT_MODE);
2178
2179         m_is_multi_window_grid_mode = EINA_FALSE;
2180 }
2181 #endif
2182
2183 void Browser_View::__multi_window_cb(void *data, Evas_Object *obj, void *event_info)
2184 {
2185         BROWSER_LOGD("[%s]", __func__);
2186
2187         Browser_View *browser_view = (Browser_View *)data;
2188         browser_view->_destroy_more_context_popup();
2189
2190 #if defined(FEATURE_MOST_VISITED_SITES)
2191         if (browser_view->m_most_visited_sites && browser_view->m_most_visited_sites->is_guide_text_running())
2192                 return;
2193 #endif
2194
2195         if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
2196                 BROWSER_LOGD("close multi window");
2197                 m_data_manager->get_multi_window_view()->close_multi_window();
2198                 return;
2199         }
2200
2201         if (!m_data_manager->create_multi_window_view()) {
2202                 BROWSER_LOGE("m_data_manager->create_multi_window_view failed");
2203                 return;
2204         }
2205
2206         if (!m_data_manager->get_multi_window_view()->init()) {
2207                 m_data_manager->destroy_multi_window_view();
2208                 BROWSER_LOGE("get_multi_window_view()->init failed");
2209                 return;
2210         }
2211
2212         /* Exception case to call ewk_view_suspend directly.
2213           * That's because the webpage is cleared, when call ewk_view_visibility_set suspend_ewk_view */
2214         ewk_view_suspend(browser_view->m_focused_window->m_ewk_view);
2215         ewk_view_visibility_set(browser_view->m_focused_window->m_ewk_view, EINA_FALSE);
2216
2217         browser_view->_navigationbar_visible_set_signal(EINA_FALSE);
2218
2219         /* Hide the secure lock icon in title bar. */
2220         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
2221         elm_object_item_part_content_set(top_it, ELM_NAVIFRAME_ITEM_ICON, NULL);
2222
2223         if (browser_view->_get_edit_mode() != BR_NO_EDIT_MODE)
2224                 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2225 }
2226
2227 void Browser_View::__new_window_cb(void *data, Evas_Object *obj, void *event_info)
2228 {
2229         BROWSER_LOGD("[%s]", __func__);
2230         if (!data)
2231                 return;
2232
2233         Browser_View *browser_view = (Browser_View *)data;
2234         Browser_Class *browser = browser_view->m_browser;
2235
2236         if (browser_view->m_resize_idler)
2237                 return;
2238
2239         std::vector<Browser_Window *> window_list = browser->get_window_list();
2240         if (window_list.size() >= BROWSER_MULTI_WINDOW_MAX_COUNT) {
2241                 /* If the multi window is max, delete the first one. */
2242                 /* if the first window is focused, delete second one(oldest one except first one) */
2243                 if (browser_view->m_focused_window != window_list[0])
2244                         browser->delete_window(window_list[0]);
2245                 else
2246                         browser->delete_window(window_list[1]);
2247         }
2248
2249         browser_view->m_created_new_window = browser->create_new_window(EINA_TRUE);
2250         if (!browser_view->m_created_new_window) {
2251                 BROWSER_LOGE("create_new_window failed");
2252                 return;
2253         }
2254         /* initialize the created webview first to connect ewk event callback functions such as load start, progress etc. */
2255         ewk_view_suspend(browser_view->m_focused_window->m_ewk_view);
2256
2257 #if defined(HORIZONTAL_UI)
2258                 if (browser_view->m_focused_window->m_landscape_snapshot_image) {
2259                         evas_object_del(browser_view->m_focused_window->m_landscape_snapshot_image);
2260                         browser_view->m_focused_window->m_landscape_snapshot_image = NULL;
2261                 }
2262 #endif
2263                 if (browser_view->m_focused_window->m_portrait_snapshot_image) {
2264                         evas_object_del(browser_view->m_focused_window->m_portrait_snapshot_image);
2265                         browser_view->m_focused_window->m_portrait_snapshot_image = NULL;
2266                 }
2267
2268 #if defined(HORIZONTAL_UI)
2269                 if (browser_view->is_landscape())
2270                         browser_view->m_focused_window->m_landscape_snapshot_image = browser_view->_capture_snapshot(browser_view->m_focused_window, BROWSER_MULTI_WINDOW_ITEM_RATIO);
2271                 else
2272 #endif
2273                         browser_view->m_focused_window->m_portrait_snapshot_image = browser_view->_capture_snapshot(browser_view->m_focused_window, BROWSER_MULTI_WINDOW_ITEM_RATIO);
2274
2275 #if defined(FEATURE_MOST_VISITED_SITES)
2276         if (!browser_view->_show_most_visited_sites(EINA_FALSE))
2277                 BROWSER_LOGE("_show_most_visited_sites EINA_FALSE failed");
2278 #endif
2279
2280         /* initialize the created webview first to connect ewk event callback functions such as load start, progress etc. */
2281         browser->ewk_view_init(browser_view->m_created_new_window->m_ewk_view);
2282
2283         if (!browser_view->_show_new_window_effect(browser_view->m_focused_window->m_ewk_view,
2284                                         browser_view->m_created_new_window->m_ewk_view))
2285                 BROWSER_LOGE("_show_new_window_effect failed");
2286
2287 #if defined(FEATURE_MOST_VISITED_SITES)
2288         browser_view->load_url(BROWSER_MOST_VISITED_SITES_URL);
2289 #else
2290         browser_view->load_url(BROWSER_BLANK_PAGE_URL);
2291 #endif
2292         return;
2293 }
2294
2295 Eina_Bool Browser_View::_call_internet_settings(void)
2296 {
2297         BROWSER_LOGD("[%s]", __func__);
2298
2299         m_browser_settings = new(nothrow) Browser_Settings_Class;
2300         if (!m_browser_settings) {
2301                 BROWSER_LOGE("new Browser_Settings_Class failed");
2302                 return EINA_FALSE;
2303         }
2304         if (!m_browser_settings->init()) {
2305                 BROWSER_LOGE("m_browser_settings->init failed");
2306                 delete m_browser_settings;
2307                 m_browser_settings = NULL;
2308
2309                 return EINA_FALSE;
2310         }
2311         return EINA_TRUE;
2312 }
2313
2314 void Browser_View::__internet_settings_cb(void *data, Evas_Object *obj, void *event_info)
2315 {
2316         BROWSER_LOGD("[%s]", __func__);
2317         if (!data)
2318                 return;
2319
2320         Browser_View *browser_view = (Browser_View *)data;
2321         browser_view->_destroy_more_context_popup();
2322
2323         if (!browser_view->_call_internet_settings())
2324                 BROWSER_LOGE("_call_internet_settings failed");
2325 }
2326
2327 void Browser_View::_update_find_word_index_text(const char *index_text)
2328 {
2329         BROWSER_LOGD("[%s]", __func__);
2330
2331         edje_object_part_text_set(elm_layout_edje_get(m_option_header_find_word_layout), "elm.index_text", index_text);
2332 }
2333
2334 void Browser_View::__find_word_cb(void *data, Evas_Object *obj, void *event_info)
2335 {
2336         BROWSER_LOGD("[%s]", __func__);
2337         if (!data)
2338                 return;
2339
2340         Browser_View *browser_view = (Browser_View *)data;
2341         browser_view->_destroy_more_context_popup();
2342
2343         if (browser_view->_get_edit_mode() == BR_FIND_WORD_MODE)
2344                 return;
2345
2346         /* find word layout is only in naviframe optino header.
2347           * So expand the option header to show find word layout. */
2348         browser_view->_navigationbar_visible_set_signal(EINA_TRUE);
2349
2350         browser_view->_set_edit_mode(BR_FIND_WORD_MODE);
2351
2352         elm_object_focus_set(browser_view->m_find_word_edit_field, EINA_TRUE);
2353
2354         edje_object_part_text_set(elm_layout_edje_get(browser_view->m_option_header_find_word_layout), "elm.index_text", "0/0");
2355 }
2356
2357 Eina_Bool Browser_View::_call_download_manager(void)
2358 {
2359         service_h service_handle = NULL;
2360         BROWSER_LOGD("[%s]", __func__);
2361
2362         if (service_create(&service_handle) < 0) {
2363                 BROWSER_LOGE("Fail to create service handle");
2364                 return EINA_FALSE;
2365         }
2366         
2367         if (!service_handle) {
2368                 BROWSER_LOGE("service handle is NULL");
2369                 return EINA_FALSE;
2370         }
2371
2372         if (service_set_operation(service_handle, SERVICE_OPERATION_DOWNLOAD) < 0) {
2373                 BROWSER_LOGE("Fail to set service operation");
2374                 service_destroy(service_handle);
2375                 return EINA_FALSE;
2376         }
2377
2378         if (service_add_extra_data(service_handle, "mode", "view") < 0) {
2379                 BROWSER_LOGE("Fail to set extra data");
2380                 service_destroy(service_handle);
2381                 return EINA_FALSE;
2382         }
2383
2384         if (service_send_launch_request(service_handle, NULL, NULL) < 0) {
2385                 BROWSER_LOGE("Fail to launch service operation");
2386                 service_destroy(service_handle);
2387                 return EINA_FALSE;
2388         }
2389
2390         service_destroy(service_handle);
2391
2392         return EINA_TRUE;
2393 }
2394
2395 void Browser_View::__download_manager_cb(void *data, Evas_Object *obj, void *event_info)
2396 {
2397         BROWSER_LOGD("[%s]", __func__);
2398         if (!data)
2399                 return;
2400
2401         Browser_View *browser_view = (Browser_View *)data;
2402         browser_view->_destroy_more_context_popup();
2403
2404         if (!browser_view->_call_download_manager())
2405                 BROWSER_LOGE("_call_download_manager failed");
2406 }
2407
2408 void Browser_View::__send_via_message_cb(void *data, Evas_Object *obj, void *event_info)
2409 {
2410         BROWSER_LOGD("[%s]", __func__);
2411         if (!data)
2412                 return;
2413
2414         Browser_View *browser_view = (Browser_View *)data;
2415         browser_view->_destroy_more_context_popup();
2416
2417         if (!browser_view->_send_via_message(browser_view->get_url(), std::string()))
2418                 BROWSER_LOGE("_send_via_message failed");
2419 }
2420
2421 void Browser_View::__send_via_email_cb(void *data, Evas_Object *obj, void *event_info)
2422 {
2423         BROWSER_LOGD("[%s]", __func__);
2424         if (!data)
2425                 return;
2426
2427         Browser_View *browser_view = (Browser_View *)data;
2428         browser_view->_destroy_more_context_popup();
2429
2430         if (!browser_view->_send_via_email(browser_view->get_url()))
2431                 BROWSER_LOGE("_send_via_email failed");
2432 }
2433
2434 void Browser_View::__post_to_sns_cb(void *data, Evas_Object *obj, void *event_info)
2435 {
2436         BROWSER_LOGD("[%s]", __func__);
2437         if (!data)
2438                 return;
2439
2440         Browser_View *browser_view = (Browser_View*)data;
2441
2442         Elm_Object_Item *it = (Elm_Object_Item *)event_info;
2443         const char *label = elm_object_item_text_get(it);
2444         BROWSER_LOGD("label=[%s]", label);
2445         if (label && strlen(label)) {
2446                 if (!browser_view->_post_to_sns(std::string(label), browser_view->get_url()))
2447                         BROWSER_LOGE("_post_to_sns failed");
2448         }
2449
2450         browser_view->_destroy_more_context_popup();
2451 }
2452
2453 void Browser_View::_destroy_more_context_popup(void)
2454 {
2455         if (m_more_context_popup) {
2456                 evas_object_del(m_more_context_popup);
2457                 m_more_context_popup = NULL;
2458         }
2459
2460         edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "hide,more_context_bg,signal", "");
2461 }
2462
2463 void Browser_View::__more_context_popup_dismissed_cb(void *data, Evas_Object *obj,
2464                                                                         void *event_info)
2465 {
2466         BROWSER_LOGD("[%s]", __func__);
2467         if (!data)
2468                 return;
2469
2470         Browser_View *browser_view = (Browser_View *)data;
2471         browser_view->_destroy_more_context_popup();
2472 }
2473
2474 void Browser_View::__clean_up_windows_test_cb(void *data, Evas_Object *obj, void *event_info)
2475 {
2476         if (!data)
2477                 return;
2478
2479         Browser_View *browser_view = (Browser_View *)data;
2480         browser_view->_destroy_more_context_popup();
2481
2482         m_browser->clean_up_windows();
2483 }
2484
2485 Eina_Bool Browser_View::_show_more_context_popup(void)
2486 {
2487         BROWSER_LOGD("[%s]", __func__);
2488
2489         _destroy_more_context_popup();
2490
2491         m_more_context_popup = elm_ctxpopup_add(m_win);
2492         if (!m_more_context_popup) {
2493                 BROWSER_LOGE("elm_ctxpopup_add failed");
2494                 return EINA_FALSE;
2495         }
2496
2497         elm_object_style_set(m_more_context_popup, "pass_event");
2498
2499         edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "show,more_context_bg,signal", "");
2500
2501         evas_object_size_hint_weight_set(m_more_context_popup, EVAS_HINT_EXPAND,
2502                                                                 EVAS_HINT_EXPAND);
2503         evas_object_smart_callback_add(m_more_context_popup, "dismissed",
2504                                         __more_context_popup_dismissed_cb, this);
2505
2506         Elm_Object_Item *sub_menu = NULL;
2507         elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_DOWNLOAD_MANAGER, NULL,
2508                                                         __download_manager_cb, this);
2509
2510         sub_menu = elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_FIND_ON_PAGE, NULL,
2511                                                         __find_word_cb, this);
2512         if (
2513 #if defined(FEATURE_MOST_VISITED_SITES)
2514                 is_most_visited_sites_running() ||
2515 #endif
2516                 get_url().empty()
2517             || _get_edit_mode() == BR_FIND_WORD_MODE)
2518                 elm_object_item_disabled_set(sub_menu, EINA_TRUE);
2519
2520         m_bookmark_on_off_icon = elm_icon_add(m_more_context_popup);
2521
2522         if(m_data_manager->get_history_db()->is_in_bookmark(get_url().c_str(), NULL)) {
2523                 if (!elm_icon_file_set(m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_on.png", NULL)) {
2524                         BROWSER_LOGE("elm_icon_file_set is failed.\n");
2525                         return EINA_FALSE;
2526                 }
2527         } else {
2528                 if (!elm_icon_file_set(m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_off.png", NULL)) {
2529                         BROWSER_LOGE("elm_icon_file_set is failed.\n");
2530                         return EINA_FALSE;
2531                 }
2532         }
2533         evas_object_size_hint_aspect_set(m_bookmark_on_off_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
2534
2535         evas_object_propagate_events_set(m_bookmark_on_off_icon, EINA_FALSE);
2536         evas_object_repeat_events_set(m_bookmark_on_off_icon, EINA_FALSE);
2537         evas_object_smart_callback_add(m_bookmark_on_off_icon, "clicked", __bookmark_icon_changed_cb, this);
2538
2539         sub_menu = elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_BOOKMARK, m_bookmark_on_off_icon,
2540                                                         __bookmark_cb, this);
2541         if (
2542 #if defined(FEATURE_MOST_VISITED_SITES)
2543                 is_most_visited_sites_running() ||
2544 #endif
2545                 get_url().empty()
2546             || _get_edit_mode() == BR_FIND_WORD_MODE)
2547                 elm_object_item_disabled_set(sub_menu, EINA_TRUE);
2548
2549         m_private_check = elm_check_add(m_more_context_popup);
2550         elm_object_style_set(m_private_check, "on&off");
2551         evas_object_smart_callback_add(m_private_check, "changed", __private_check_change_cb, this);
2552
2553         elm_check_state_set(m_private_check, m_is_private);
2554         evas_object_propagate_events_set(m_private_check, EINA_FALSE);
2555         evas_object_show(m_private_check);
2556
2557         elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_PRIVATE, m_private_check,
2558                                                                 __private_cb, this);
2559
2560         elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_SETTINGS, NULL,
2561                                                         __internet_settings_cb, this);
2562
2563         elm_ctxpopup_hover_parent_set(m_more_context_popup, m_navi_bar);
2564
2565         int controlbar_x = 0;
2566         int controlbar_y = 0;
2567         int controlbar_w = 0;
2568         int controlbar_h = 0;
2569         evas_object_geometry_get(m_control_bar, &controlbar_x, &controlbar_y, &controlbar_w, &controlbar_h);
2570
2571         evas_object_move(m_more_context_popup, (controlbar_w / 5) * 3 + controlbar_w / 10, controlbar_y + (controlbar_h / 2));
2572
2573         evas_object_show(m_more_context_popup);
2574
2575         return EINA_TRUE;
2576 }
2577
2578 void Browser_View::__more_cb(void *data, Evas_Object *obj, void *event_info)
2579 {
2580         BROWSER_LOGD("[%s]", __func__);
2581         if (!data)
2582                 return;
2583
2584         Browser_View *browser_view = (Browser_View *)data;
2585         if (browser_view->m_more_context_popup == NULL) {
2586                 if (!browser_view->_show_more_context_popup())
2587                         BROWSER_LOGE("_show_more_context_popup failed");
2588         } else {
2589                 browser_view->_destroy_more_context_popup();
2590         }
2591
2592         browser_view->_navigationbar_visible_set(EINA_TRUE);
2593 }
2594
2595 void Browser_View::_set_controlbar_back_forward_status(void)
2596 {
2597         BROWSER_LOGD("[%s]", __func__);
2598         Evas_Object *ewk_view = m_focused_window->m_ewk_view;
2599         if (!ewk_view)
2600                 return;
2601
2602         if (
2603 #if defined(FEATURE_MOST_VISITED_SITES)
2604                 is_most_visited_sites_running() ||
2605 #endif
2606                 get_url().empty())
2607                 elm_object_item_disabled_set(m_share_controlbar_button, EINA_TRUE);
2608         else
2609                 elm_object_item_disabled_set(m_share_controlbar_button, EINA_FALSE);
2610 }
2611
2612 void Browser_View::_set_multi_window_controlbar_text(int count)
2613 {
2614         BROWSER_LOGD("[%s]", __func__);
2615         if (count == 1) {
2616                 elm_toolbar_item_icon_set(m_multi_window_button, BROWSER_IMAGE_DIR"/01_controlbar_icon_multiview.png");
2617         } else {
2618                 char icon_path[100] = {0, };
2619                 snprintf(icon_path, sizeof(icon_path) - 1, "%s/01_controlbar_icon_multiview_0%d.png", BROWSER_IMAGE_DIR, count);
2620                 elm_toolbar_item_icon_set(m_multi_window_button, icon_path);
2621         }
2622 }
2623
2624 Evas_Object *Browser_View::_create_control_bar(void)
2625 {
2626         BROWSER_LOGD("[%s]", __func__);
2627         Evas_Object *controlbar_layout;
2628         controlbar_layout = elm_layout_add(m_navi_bar);
2629         if (!controlbar_layout) {
2630                 BROWSER_LOGE("elm_layout_add failed");
2631                 return NULL;
2632         }
2633         if (!elm_layout_file_set(controlbar_layout, BROWSER_EDJE_DIR"/browser-view-control-bar.edj",
2634                                 "browser-view-controlbar")) {
2635                 BROWSER_LOGE("Can not set layout browser-view-controlbar\n");
2636                 return NULL;
2637         }
2638         evas_object_size_hint_weight_set(controlbar_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2639         evas_object_size_hint_align_set(controlbar_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
2640         evas_object_show(controlbar_layout);
2641
2642         Evas_Object *control_bar;
2643         control_bar = elm_toolbar_add(m_navi_bar);
2644         if (control_bar) {
2645                 elm_object_style_set(control_bar, "browser/browser-view");
2646
2647                 elm_toolbar_shrink_mode_set(control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
2648
2649                 /* New Window Button */
2650                 m_new_window_button = elm_toolbar_item_append(control_bar,
2651                                         BROWSER_IMAGE_DIR"/I01_controlbar_icon_new_window.png", NULL, __new_window_cb, this);
2652                 if (!m_new_window_button) {
2653                         BROWSER_LOGE("elm_toolbar_item_append failed");
2654                         return NULL;
2655                 }
2656
2657                 /* Multi Window Button */
2658                 m_multi_window_button = elm_toolbar_item_append(control_bar,
2659                                         BROWSER_IMAGE_DIR"/01_controlbar_icon_multiview.png", NULL, __multi_window_cb, this);
2660                 /* Bookmark Button */
2661                 elm_toolbar_item_append(control_bar, BROWSER_IMAGE_DIR"/I01_controlbar_icon_bookmark.png",
2662                                                 NULL, __go_to_bookmark_cb, this);
2663                 /* More menu Button */
2664                 m_more_button = elm_toolbar_item_append(control_bar,
2665                                         BROWSER_IMAGE_DIR"/I01_controlbar_icon_more.png", NULL, __more_cb, this);
2666                 if (!m_more_button) {
2667                         BROWSER_LOGE("elm_toolbar_item_append failed");
2668                         return NULL;
2669                 }
2670
2671                 elm_object_part_content_set(controlbar_layout, "elm.swallow.controlbar", control_bar);
2672
2673                 m_back_button = elm_button_add(control_bar);
2674                 if (!m_back_button) {
2675                         BROWSER_LOGE("elm_button_add failed");
2676                         return NULL;
2677                 }
2678                 elm_object_style_set(m_back_button, "browser/browser_view_controlbar_back");
2679
2680                 elm_object_part_content_set(controlbar_layout, "elm.swallow.back_button", m_back_button);
2681                 evas_object_smart_callback_add(m_back_button, "clicked", __backward_cb, this);
2682                 evas_object_show(m_back_button);
2683                 evas_object_show(control_bar);
2684         }
2685
2686         return controlbar_layout;
2687 }
2688
2689 /* 
2690 * Create two same url layouts similar with other browsers like android & safari.
2691 * The one(by _create_url_layout) is in the browser scroller and
2692 * the other(by _create_option_header_url_layout) is in the navigation bar option header.
2693 */
2694 Evas_Object *Browser_View::_create_option_header_url_layout(void)
2695 {
2696         BROWSER_LOGD("[%s]", __func__);
2697         Evas_Object *url_layout;
2698         url_layout = elm_layout_add(m_navi_bar);
2699         if (url_layout) {
2700                 if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
2701                                         "browser/url_layout")) {
2702                         BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
2703                         return NULL;
2704                 }
2705                 evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2706                 evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
2707                 evas_object_show(url_layout);
2708
2709                 m_option_header_url_entry_layout = elm_layout_add(m_navi_bar);
2710                 if (!m_option_header_url_entry_layout) {
2711                         BROWSER_LOGE("elm_layout_add failed");
2712                         return NULL;
2713                 }
2714                 if (!elm_layout_file_set(m_option_header_url_entry_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
2715                                         "elm/browser/urlentry/default")) {
2716                         BROWSER_LOGE("Can not set layout theme[browser, urlentry, default]\n");
2717                         return NULL;
2718                 }
2719                 elm_object_part_content_set(url_layout, "elm.swallow.url", m_option_header_url_entry_layout);
2720                 edje_object_signal_callback_add(elm_layout_edje_get(m_option_header_url_entry_layout),
2721                                                 "mouse,clicked,1", "elm.swallow.entry", __url_entry_clicked_cb, this);
2722
2723                 edje_object_signal_callback_add(elm_layout_edje_get(m_option_header_url_entry_layout),
2724                                                 "refresh_stop", "*", __refresh_button_clicked_cb, this);
2725
2726                 evas_object_show(m_option_header_url_entry_layout);
2727
2728                 m_option_header_url_edit_field = br_elm_url_editfield_add(m_navi_bar);
2729                 if (!m_option_header_url_edit_field) {
2730                         BROWSER_LOGE("elm_editfield_add failed");
2731                         return NULL;
2732                 }
2733
2734                 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.entry", m_option_header_url_edit_field);
2735 //              br_elm_editfield_entry_single_line_set(m_option_header_url_edit_field, EINA_TRUE);
2736                 br_elm_editfield_eraser_set(m_option_header_url_edit_field, EINA_FALSE);
2737
2738                 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
2739                 elm_entry_input_panel_layout_set(edit_field_entry, ELM_INPUT_PANEL_LAYOUT_URL);
2740                 ecore_imf_context_input_panel_event_callback_add((Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry),
2741                                                                 ECORE_IMF_INPUT_PANEL_STATE_EVENT, __url_entry_imf_event_cb, this);
2742
2743                 evas_object_smart_callback_add(edit_field_entry, "activated", __url_entry_enter_key_cb, this);
2744                 evas_event_callback_add(evas_object_evas_get(m_option_header_url_edit_field), EVAS_CALLBACK_CANVAS_FOCUS_OUT,
2745                                         __url_entry_focus_out_cb, this);
2746                 evas_object_show(m_option_header_url_edit_field);
2747
2748                 m_option_header_url_progressbar = elm_progressbar_add(m_navi_bar);
2749                 if (!m_option_header_url_progressbar) {
2750                         BROWSER_LOGE("elm_progressbar_add failed");
2751                         return NULL;
2752                 }
2753                 elm_object_style_set(m_option_header_url_progressbar, "browser/loading");
2754                 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.progressbar", m_option_header_url_progressbar);
2755                 elm_progressbar_value_set(m_option_header_url_progressbar, 0);
2756                 evas_object_show(m_option_header_url_progressbar);
2757
2758                 m_option_header_url_progresswheel = elm_progressbar_add(m_navi_bar);
2759                 if (!m_option_header_url_progresswheel) {
2760                         BROWSER_LOGE("elm_progressbar_add failed");
2761                         return NULL;
2762                 }
2763
2764                 elm_object_style_set(m_option_header_url_progresswheel, "UIActivityIndicatorStyleWhite");
2765
2766                 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
2767                 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.progress", m_option_header_url_progresswheel);
2768                 evas_object_show(m_option_header_url_progresswheel);
2769
2770                 m_option_header_cancel_button = elm_button_add(m_navi_bar);
2771                 if (!m_option_header_cancel_button) {
2772                         BROWSER_LOGE("elm_button_add failed");
2773                         return NULL;
2774                 }
2775                 evas_object_size_hint_weight_set(m_option_header_cancel_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2776                 evas_object_size_hint_align_set(m_option_header_cancel_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
2777                 elm_object_style_set(m_option_header_cancel_button, "browser/cancel_button");
2778                 elm_object_text_set(m_option_header_cancel_button, BR_STRING_CANCEL);
2779                 elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_option_header_cancel_button);
2780                 evas_object_smart_callback_add(m_option_header_cancel_button, "clicked", __cancel_button_clicked_cb, this);
2781                 evas_object_show(m_option_header_cancel_button);
2782
2783                 m_option_header_title_backward_button = elm_button_add(m_navi_bar);
2784                 if (!m_option_header_title_backward_button) {
2785                         BROWSER_LOGE("elm_button_add failed");
2786                         return NULL;
2787                 }
2788                 elm_object_style_set(m_option_header_title_backward_button, "browser/backward");
2789                 elm_object_part_content_set(url_layout, "elm.swallow.backward_button", m_option_header_title_backward_button);
2790                 evas_object_smart_callback_add(m_option_header_title_backward_button, "clicked", __backward_button_clicked_cb, this);
2791                 elm_object_focus_allow_set(m_option_header_title_backward_button, EINA_FALSE);
2792                 evas_object_show(m_option_header_title_backward_button);
2793                 elm_object_disabled_set(m_option_header_title_backward_button, EINA_TRUE);
2794
2795                 m_option_header_title_forward_button = elm_button_add(m_navi_bar);
2796                 if (!m_option_header_title_forward_button) {
2797                         BROWSER_LOGE("elm_button_add failed");
2798                         return NULL;
2799                 }
2800                 elm_object_style_set(m_option_header_title_forward_button, "browser/forward");
2801                 elm_object_part_content_set(url_layout, "elm.swallow.forward_button", m_option_header_title_forward_button);
2802                 evas_object_smart_callback_add(m_option_header_title_forward_button, "clicked", __forward_button_clicked_cb, this);
2803                 elm_object_focus_allow_set(m_option_header_title_forward_button, EINA_FALSE);
2804                 evas_object_show(m_option_header_title_forward_button);
2805                 elm_object_disabled_set(m_option_header_title_forward_button, EINA_TRUE);
2806
2807                 /* for jump to top. */
2808                 evas_object_event_callback_add(url_layout, EVAS_CALLBACK_MOUSE_DOWN, __option_header_url_layout_mouse_down_cb, this);
2809         }
2810
2811         return url_layout;
2812 }
2813
2814 Evas_Object *Browser_View::_get_activated_url_entry(void)
2815 {
2816         /* The edit field in option header url layout is only valid for edit. 
2817           * If the edit field in browser scroller can have focus, there is so many focus issue.
2818           * So just make the edit field in option header editable. */
2819         return m_option_header_url_edit_field;
2820 }
2821
2822 void Browser_View::__url_entry_imf_event_cb(void *data, Ecore_IMF_Context *ctx, int value)
2823 {
2824         BROWSER_LOGD("value=%d", value);
2825         if (!data)
2826                 return;
2827
2828         Browser_View *browser_view = (Browser_View *)data;
2829         if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
2830                 Evas_Object *edit_field_entry;
2831                 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
2832                 elm_object_focus_set(edit_field_entry, EINA_FALSE);
2833
2834                 if (browser_view->m_edit_mode != BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF
2835                     && browser_view->m_edit_mode != BR_FIND_WORD_MODE)
2836                         browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2837                 else
2838                         return;
2839         } else if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW)
2840                 /* If the focus of url entry is set automatically, the keypad is also displayed automatically. */
2841                 /* eg. At url edit mode, lock the screen -> then unlock, the url entry will get focus. */
2842                 /* The keypad is also invoked, so set the edit mode. */
2843                 browser_view->_set_edit_mode(BR_URL_ENTRY_EDIT_MODE);
2844 }
2845
2846 void Browser_View::__url_entry_focus_out_cb(void *data, Evas *e, void *event_info)
2847 {
2848         BROWSER_LOGD("[%s]", __func__);
2849         if (!data)
2850                 return;
2851
2852         Browser_View *browser_view = (Browser_View *)data;
2853         Evas_Object *edit_field_entry;
2854         edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
2855
2856         Ecore_IMF_Context *ic = (Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry);
2857         if (!ic)
2858                 return;
2859
2860         ecore_imf_context_input_panel_hide(ic);
2861
2862         if (browser_view->m_edit_mode != BR_FIND_WORD_MODE)
2863                 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2864 }
2865
2866 void Browser_View::_set_edit_mode(edit_mode mode)
2867 {
2868         BROWSER_LOGD("mode = %d", mode);
2869
2870         if (m_edit_mode == mode)
2871                 return;
2872
2873 #if defined(FEATURE_MOST_VISITED_SITES)
2874         if (mode == BR_NO_EDIT_MODE) {
2875                 if (m_most_visited_sites) {
2876                         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,on,signal", "");
2877                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2878                                                                 "url_guide_text,on,signal", "");
2879                 }
2880         } else {
2881                 if (m_most_visited_sites) {
2882                         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,off,signal", "");
2883                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2884                                                                 "url_guide_text,off,signal", "");
2885                 }
2886         }
2887 #endif
2888
2889         if (mode == BR_URL_ENTRY_EDIT_MODE || mode == BR_FIND_WORD_MODE
2890             || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
2891 #ifdef BROWSER_SCROLLER_BOUNCING
2892                 /* If edit mode, lock the browser scroller */
2893                 _enable_webview_scroll();
2894 #endif
2895                 /* Make the browser scroller region y = 0 to show url bar all at edit mode. */
2896                 int scroller_x = 0;
2897                 int scroller_w = 0;
2898                 int scroller_h = 0;
2899                 elm_scroller_region_get(m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
2900                 elm_scroller_region_show(m_scroller ,scroller_x, 0, scroller_w, scroller_h);
2901         }
2902
2903         if (mode == BR_URL_ENTRY_EDIT_MODE) {
2904                 /* change layout of url layout for edit mode. */
2905                 edje_object_signal_emit(elm_layout_edje_get(m_url_layout), "edit,url,on,signal", "");
2906                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2907                                         "edit,url,on,signal", "");
2908
2909                 /* change refresh icon in url entry for edit mode. */
2910                 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "edit,url,on,signal", "");
2911                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2912                                         "edit,url,on,signal", "");
2913
2914                 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "hide,favicon,signal", "");
2915                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2916                                                                                 "hide,favicon,signal", "");
2917                 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
2918                                                                 "edit,url,on,signal", "");
2919         } else if (mode == BR_NO_EDIT_MODE || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
2920                 if (m_edit_mode == BR_FIND_WORD_MODE) {
2921                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_layout), "hide,find_word_layout,signal", "");
2922                         m_find_word->find_word("", Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
2923                 } else {
2924                         /* change layout of url layout for normal mode. */
2925                         edje_object_signal_emit(elm_layout_edje_get(m_url_layout), "edit,url,off,signal", "");
2926                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2927                                                 "edit,url,off,signal", "");
2928
2929                         /* change refresh icon in url entry for normal mode. */
2930                         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "edit,url,off,signal", "");
2931                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2932                                                 "edit,url,off,signal", "");
2933
2934 #if defined(FEATURE_MOST_VISITED_SITES)
2935                         if (!is_most_visited_sites_running())
2936 #endif
2937                         {
2938                                 if (m_focused_window->m_favicon)
2939                                         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
2940                                                                                         "show,favicon,signal", "");
2941                                 _set_secure_icon();
2942                         }
2943                         if (m_focused_window->m_option_header_favicon) {
2944                                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2945                                                                                 "show,favicon,signal", "");
2946                                 _set_secure_icon();
2947                         }
2948
2949                         edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
2950                                                 "edit,url,off,signal", "");
2951                         if (_is_loading()) {
2952                                 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,on,signal", "");
2953                                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2954                                                         "loading,on,signal", "");
2955                         }
2956                 }
2957         } else if (mode == BR_FIND_WORD_MODE) {
2958                 Evas_Object *find_word_edit_field_entry = br_elm_editfield_entry_get(m_find_word_edit_field);
2959                 elm_entry_entry_set(find_word_edit_field_entry, "");
2960
2961                 evas_object_smart_callback_del(find_word_edit_field_entry, "changed", __find_word_entry_changed_cb);
2962                 evas_object_smart_callback_add(find_word_edit_field_entry, "changed", __find_word_entry_changed_cb, this);
2963
2964                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_layout), "show,find_word_layout,signal", "");
2965         }
2966
2967         m_edit_mode = mode;
2968
2969         /* To show favicon, if click url entry while loading, then cancel case. */
2970         _set_favicon();
2971 }
2972
2973 /* Workaround
2974   * The url entry of option header can't be focusable in case of switch TEXTBLOCK & elm entry.
2975   * So focus the url entry in idler callback.
2976   */
2977 static Eina_Bool __url_entry_focus_idler_cb(void *data)
2978 {
2979         Evas_Object *edit_field = (Evas_Object *)data;
2980         elm_object_focus_set(edit_field, EINA_TRUE);
2981
2982         Evas_Object *entry = br_elm_editfield_entry_get(edit_field);
2983         elm_entry_cursor_end_set(entry);
2984
2985         return ECORE_CALLBACK_CANCEL;
2986 }
2987
2988 void Browser_View::__url_entry_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
2989 {
2990         BROWSER_LOGD("[%s]", __func__);
2991         if (!data)
2992                 return;
2993
2994         Browser_View *browser_view = (Browser_View *)data;
2995
2996         if (browser_view->_is_loading())
2997                 browser_view->_stop_loading();
2998
2999         if (!browser_view->_navigationbar_visible_get()) {
3000                 /* The edit field in option header is only for edit url. */
3001                 browser_view->_navigationbar_visible_set_signal(EINA_TRUE);
3002         }
3003
3004         browser_view->_destroy_more_context_popup();
3005
3006         edit_mode mode = browser_view->_get_edit_mode();
3007
3008         browser_view->_set_edit_mode(BR_URL_ENTRY_EDIT_MODE);
3009
3010         if (mode == BR_NO_EDIT_MODE) {
3011                 Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field);
3012
3013                 elm_object_focus_set(browser_view->m_option_header_url_edit_field, EINA_TRUE);
3014                 elm_entry_cursor_end_set(entry);
3015
3016 //              ecore_idler_add(__url_entry_focus_idler_cb, browser_view->m_option_header_url_edit_field);
3017         }
3018 }
3019
3020 Eina_Bool Browser_View::_is_option_header_expanded(void)
3021 {
3022         return _navigationbar_visible_get();
3023 }
3024
3025 void Browser_View::__cancel_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3026 {
3027         BROWSER_LOGD("[%s]", __func__);
3028         if (!data)
3029                 return;
3030
3031         Browser_View *browser_view = (Browser_View *)data;
3032         Evas_Object *ewk_view = browser_view->m_focused_window->m_ewk_view;
3033         if (!ewk_view)
3034                 return;
3035
3036         browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
3037
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");
3040
3041         browser_view->_set_url_entry(browser_view->get_url().c_str());
3042 }
3043
3044 void Browser_View::__refresh_button_clicked_cb(void *data, Evas_Object *obj,
3045                                                 const char *emission, const char *source)
3046 {
3047         BROWSER_LOGD("[%s]", __func__);
3048         if (!data)
3049                 return;
3050
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();
3057         else
3058                 browser_view->_reload();
3059 }
3060
3061 void Browser_View::__url_entry_enter_key_cb(void *data, Evas_Object *obj, void *event_info)
3062 {
3063         BROWSER_LOGD("[%s]", __func__);
3064         if (!data)
3065                 return;
3066
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());
3071
3072         /* Workaround.
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);
3075
3076         char *url = elm_entry_markup_to_utf8(elm_entry_entry_get(edit_field_entry));
3077         BROWSER_LOGD("input url = [%s]", url);
3078
3079         if (url && strlen(url)) {
3080                 browser_view->load_url(url);
3081                 free(url);
3082         }
3083 }
3084
3085
3086 void Browser_View::__url_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
3087 {
3088         BROWSER_LOGD("[%s]", __func__);
3089 }
3090
3091 void Browser_View::__url_layout_mouse_down_cb(void *data, Evas* evas, Evas_Object *obj,
3092                                                                                 void *event_info)
3093 {
3094         BROWSER_LOGD("[%s]", __func__);
3095         if (!data)
3096                 return;
3097
3098         Evas_Event_Mouse_Down event = *(Evas_Event_Mouse_Down *)event_info;
3099
3100         Browser_View *browser_view = (Browser_View *)data;
3101
3102         Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_url_edit_field);
3103
3104         int entry_x = 0;
3105         int entry_y = 0;
3106         int entry_w = 0;
3107         int entry_h = 0;
3108         evas_object_geometry_get(browser_view->m_url_edit_field, &entry_x, &entry_y, &entry_w, &entry_h);
3109
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");
3114         }
3115
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);
3123 #endif
3124         }
3125 }
3126
3127 void Browser_View::__option_header_url_layout_mouse_down_cb(void *data, Evas* evas, Evas_Object *obj,
3128                                                                                 void *event_info)
3129 {
3130         BROWSER_LOGD("[%s]", __func__);
3131         if (!data)
3132                 return;
3133         Evas_Event_Mouse_Down event = *(Evas_Event_Mouse_Down *)event_info;
3134         Browser_View *browser_view = (Browser_View *)data;
3135
3136         Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field);
3137
3138         int entry_x = 0;
3139         int entry_y = 0;
3140         int entry_w = 0;
3141         int entry_h = 0;
3142         evas_object_geometry_get(browser_view->m_option_header_url_edit_field, &entry_x, &entry_y, &entry_w, &entry_h);
3143
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");
3148         }
3149
3150         int icon_y = 0;
3151         if (event.output.y < icon_y)
3152                 browser_view->_jump_to_top();
3153 }
3154
3155 void Browser_View::_update_back_forward_buttons(void)
3156 {
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);
3161         } else {
3162                 elm_object_disabled_set(m_title_backward_button, EINA_TRUE);
3163                 elm_object_disabled_set(m_option_header_title_backward_button, EINA_TRUE);
3164         }
3165
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);
3169         } else {
3170                 elm_object_disabled_set(m_title_forward_button, EINA_TRUE);
3171                 elm_object_disabled_set(m_option_header_title_forward_button, EINA_TRUE);
3172         }
3173 }
3174
3175 void Browser_View::__backward_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3176 {
3177         BROWSER_LOGD("[%s]", __func__);
3178         if (!data)
3179                 return;
3180
3181         Browser_View *browser_view = (Browser_View *)data;
3182         ewk_view_back(browser_view->m_focused_window->m_ewk_view);
3183 }
3184
3185 void Browser_View::__forward_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3186 {
3187         BROWSER_LOGD("[%s]", __func__);
3188         if (!data)
3189                 return;
3190
3191         Browser_View *browser_view = (Browser_View *)data;
3192         ewk_view_forward(browser_view->m_focused_window->m_ewk_view);
3193 }
3194
3195 Evas_Object *Browser_View::_create_url_layout(void)
3196 {
3197         BROWSER_LOGD("[%s]", __func__);
3198         Evas_Object *url_layout;
3199         url_layout = elm_layout_add(m_navi_bar);
3200         if (url_layout) {
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");
3204                         return NULL;
3205                 }
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);
3209
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");
3214                         return NULL;
3215                 }
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");
3219                         return NULL;
3220                 }
3221                 elm_object_part_content_set(url_layout, "elm.swallow.url", m_url_entry_layout);
3222                 evas_object_show(m_url_entry_layout);
3223
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");
3227                         return NULL;
3228                 }
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);
3232
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);
3240
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);
3243
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);
3247
3248                 edje_object_signal_callback_add(elm_layout_edje_get(m_url_entry_layout), "refresh_stop", "*",
3249                                                 __refresh_button_clicked_cb, this);             
3250
3251                 m_url_progressbar = elm_progressbar_add(m_navi_bar);
3252                 if (!m_url_progressbar) {
3253                         BROWSER_LOGE("elm_progressbar_add failed");
3254                         return NULL;
3255                 }
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);
3260
3261                 m_url_progresswheel = elm_progressbar_add(m_navi_bar);
3262                 if (!m_url_progresswheel) {
3263                         BROWSER_LOGE("elm_progressbar_add failed");
3264                         return NULL;
3265                 }
3266
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);
3271
3272                 m_cancel_button = elm_button_add(m_navi_bar);
3273                 if (!m_cancel_button) {
3274                         BROWSER_LOGE("elm_button_add failed");
3275                         return NULL;
3276                 }
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);
3284
3285                 m_title_backward_button = elm_button_add(m_navi_bar);
3286                 if (!m_title_backward_button) {
3287                         BROWSER_LOGE("elm_button_add failed");
3288                         return NULL;
3289                 }
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);
3296
3297                 m_title_forward_button = elm_button_add(m_navi_bar);
3298                 if (!m_title_forward_button) {
3299                         BROWSER_LOGE("elm_button_add failed");
3300                         return NULL;
3301                 }
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);
3308
3309                 /* Workaround.
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.
3313                  */
3314                 evas_object_event_callback_add(url_layout, EVAS_CALLBACK_MOUSE_DOWN, __url_layout_mouse_down_cb, this);
3315         }
3316
3317         return url_layout;
3318 }
3319
3320 Evas_Object *Browser_View::_create_find_word_layout(void)
3321 {
3322         BROWSER_LOGD("[%s]", __func__);
3323         Evas_Object *url_layout = elm_layout_add(m_navi_bar);
3324         if (!url_layout) {
3325                 BROWSER_LOGE("elm_layout_add failed");
3326                 return NULL;
3327         }
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");
3331                 return NULL;
3332         }
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);
3336
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");
3341                 return NULL;
3342         }
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");
3346                 return NULL;
3347         }
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);
3350
3351         edje_object_part_text_set(elm_layout_edje_get(url_layout), "title_text", BR_STRING_FIND_ON_PAGE);
3352
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");
3356                 return NULL;
3357         }
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);
3360
3361         edje_object_signal_emit(elm_layout_edje_get(m_find_word_edit_field), "find_word,signal", "elm");
3362
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);
3365
3366         elm_object_signal_callback_add(m_find_word_edit_field, "elm,eraser,clicked", "elm",
3367                                                 __find_word_erase_button_clicked_cb, this);
3368
3369         Evas_Object *find_word_edit_field_entry = br_elm_editfield_entry_get(m_find_word_edit_field);
3370         elm_entry_entry_set(find_word_edit_field_entry, "");
3371         evas_object_smart_callback_add(find_word_edit_field_entry, "activated", __find_word_entry_enter_key_cb, this);
3372         elm_entry_input_panel_layout_set(find_word_edit_field_entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
3373         elm_entry_prediction_allow_set(find_word_edit_field_entry, EINA_FALSE);
3374         ecore_imf_context_input_panel_event_callback_add((Ecore_IMF_Context *)elm_entry_imf_context_get(find_word_edit_field_entry),
3375                         ECORE_IMF_INPUT_PANEL_STATE_EVENT, __find_word_entry_imf_event_cb, this);
3376         elm_entry_text_style_user_push(find_word_edit_field_entry, "DEFAULT='font_size=35 color=#3C363 2 ellipsis=1'");
3377         evas_object_show(m_find_word_edit_field);
3378
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");
3382                 return NULL;
3383         }
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);
3388
3389         evas_object_smart_callback_add(m_find_word_cancel_button, "clicked", __find_word_cancel_button_clicked_cb, this);
3390
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");
3394                 return NULL;
3395         }
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);
3400
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");
3404                 return NULL;
3405         }
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);
3410
3411         const char *current_theme = elm_theme_get(NULL);
3412         if (current_theme && strstr(current_theme, "white")) {
3413         } else {
3414 //              edje_object_signal_emit(elm_layout_edje_get(m_find_word_entry_layout),
3415 //                                                                      "black_theme,signal", "");
3416         }
3417
3418         return url_layout;
3419 }
3420
3421 void Browser_View::__find_word_erase_button_clicked_cb(void *data, Evas_Object *obj,
3422                                                                 const char *emission, const char *source)
3423 {
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");
3427
3428         if (elm_object_disabled_get(browser_view->m_find_word_prev_button))
3429                 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_FALSE);
3430         if (elm_object_disabled_get(browser_view->m_find_word_next_button))
3431                 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_FALSE);
3432 }
3433
3434 void Browser_View::__find_word_cancel_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3435 {
3436         BROWSER_LOGD("[%s]", __func__);
3437         if (!data)
3438                 return;
3439
3440         Browser_View *browser_view = (Browser_View *)data;
3441         browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
3442         browser_view->m_find_word->find_word("", Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3443
3444         if (elm_object_disabled_get(browser_view->m_find_word_prev_button))
3445                 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_FALSE);
3446         if (elm_object_disabled_get(browser_view->m_find_word_next_button))
3447                 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_FALSE);
3448 }
3449 void Browser_View::__find_word_prev_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3450 {
3451         BROWSER_LOGD("[%s]", __func__);
3452         if (!data)
3453                 return;
3454
3455         Browser_View *browser_view = (Browser_View *)data;
3456         Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3457         const char *find_word = elm_entry_entry_get(edit_field_entry);
3458         if (!find_word || !strlen(find_word))
3459                 return;
3460
3461         int index_cnt = browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_BACKWARD);
3462         int match_max_cnt = browser_view->m_find_word->get_match_max_value();
3463
3464         if (index_cnt == 1) {
3465                 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_TRUE);
3466                 if (index_cnt != match_max_cnt)
3467                         elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_FALSE);
3468         } else {
3469                 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_FALSE);
3470                 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_FALSE);
3471         }
3472 }
3473
3474 void Browser_View::__find_word_next_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3475 {
3476         BROWSER_LOGD("[%s]", __func__);
3477         if (!data)
3478                 return;
3479
3480         Browser_View *browser_view = (Browser_View *)data;
3481         Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3482         const char *find_word = elm_entry_entry_get(edit_field_entry);
3483         if (!find_word || !strlen(find_word))
3484                 return;
3485
3486         int index_cnt = browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3487         int match_max_cnt = browser_view->m_find_word->get_match_max_value();
3488
3489         if (index_cnt == match_max_cnt) {
3490                 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_TRUE);
3491                 if (match_max_cnt != 1)
3492                         elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_FALSE);
3493         } else {
3494                 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_FALSE);
3495                 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_FALSE);
3496         }
3497 }
3498
3499 void Browser_View::__find_word_entry_imf_event_cb(void *data, Ecore_IMF_Context *ctx, int value)
3500 {
3501         BROWSER_LOGD("value=%d", value);
3502         if (!data)
3503                 return;
3504
3505         Browser_View *browser_view = (Browser_View *)data;
3506         Evas_Object *find_word_editfield_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3507         elm_object_focus_set(find_word_editfield_entry, EINA_FALSE);
3508         const char *find_word = elm_entry_entry_get(find_word_editfield_entry);
3509
3510         if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
3511                 int match_max_cnt = browser_view->m_find_word->get_match_max_value();
3512                 if (match_max_cnt == 0 || match_max_cnt == 1) {
3513                         elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_TRUE);
3514                         elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_TRUE);
3515                 }
3516         } else
3517                 elm_object_focus_set(find_word_editfield_entry, EINA_TRUE);
3518 }
3519
3520 void Browser_View::_enable_browser_scroller_scroll(void)
3521 {
3522 #ifdef BROWSER_SCROLLER_BOUNCING
3523         if (!ewk_view_vertical_panning_hold_get(m_focused_window->m_ewk_view)
3524              && !_is_loading() && !m_is_full_screen) {
3525                 BROWSER_LOGD("<< unlock browser scroller, lock ewk view >>");
3526                 elm_object_scroll_freeze_pop(m_scroller);
3527                 ewk_view_vertical_panning_hold_set(m_focused_window->m_ewk_view, EINA_TRUE);
3528         }
3529 #endif
3530 }
3531
3532 void Browser_View::_enable_webview_scroll(void)
3533 {
3534 #ifdef BROWSER_SCROLLER_BOUNCING
3535         if (ewk_view_vertical_panning_hold_get(m_focused_window->m_ewk_view)) {
3536                 BROWSER_LOGD("<< lock browser scroller, unlock ewk view >>");
3537                 elm_object_scroll_freeze_pop(m_scroller);
3538                 elm_object_scroll_freeze_push(m_scroller);
3539                 ewk_view_vertical_panning_hold_set(m_focused_window->m_ewk_view, EINA_FALSE);
3540         }
3541 #endif
3542 }
3543
3544 void Browser_View::__find_word_entry_enter_key_cb(void *data, Evas_Object *obj, void *event_info)
3545 {
3546         BROWSER_LOGD("[%s]", __func__);
3547         if (!data)
3548                 return;
3549
3550         Browser_View *browser_view = (Browser_View *)data;
3551         Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3552         const char *find_word = elm_entry_entry_get(edit_field_entry);
3553         if (!find_word || !strlen(find_word))
3554                 return;
3555
3556         if (elm_object_disabled_get(browser_view->m_find_word_prev_button))
3557                 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_FALSE);
3558         if (elm_object_disabled_get(browser_view->m_find_word_next_button))
3559                 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_FALSE);
3560
3561         browser_view->m_find_word->init_index();
3562         browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3563
3564         elm_object_focus_set(edit_field_entry, EINA_FALSE);
3565         BROWSER_LOGD("find_word=[%s]", find_word);
3566 }
3567
3568 void Browser_View::__find_word_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
3569 {
3570         BROWSER_LOGD("[%s]", __func__);
3571         if (!data)
3572                 return;
3573
3574         Browser_View *browser_view = (Browser_View *)data;
3575         Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3576
3577         const char *find_word = elm_entry_entry_get(edit_field_entry);
3578
3579         if (elm_object_disabled_get(browser_view->m_find_word_prev_button))
3580                 elm_object_disabled_set(browser_view->m_find_word_prev_button, EINA_FALSE);
3581         if (elm_object_disabled_get(browser_view->m_find_word_next_button))
3582                 elm_object_disabled_set(browser_view->m_find_word_next_button, EINA_FALSE);
3583
3584         if (!find_word || !strlen(find_word)) {
3585                 browser_view->m_find_word->find_word("", Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3586         } else {
3587                 browser_view->m_find_word->init_index();
3588                 browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3589         }
3590 }
3591
3592 void Browser_View::_navigationbar_title_clicked(void)
3593 {
3594         BROWSER_LOGD("[%s]", __func__);
3595         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
3596         Evas_Object *content = elm_object_item_content_get(top_it);
3597         if (content != m_main_layout)
3598                 return;
3599
3600         if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)
3601 #if defined(FEATURE_MOST_VISITED_SITES)
3602             || is_most_visited_sites_running()
3603 #endif
3604             || m_edit_mode != BR_NO_EDIT_MODE)
3605             return;
3606
3607         int scroller_x = 0;
3608         int scroller_y = 0;
3609         int scroller_w = 0;
3610         int scroller_h = 0;
3611         elm_scroller_region_get(m_scroller, &scroller_x, &scroller_y, &scroller_w, &scroller_h);
3612
3613         if (scroller_y == 0) {
3614                 /* scroller is on top, the url bar in scroller is fully being displayed.
3615                  * Then, just show/hide the tool bar. */
3616                 const char* state = edje_object_part_state_get(elm_layout_edje_get(m_main_layout),
3617                                                                 "elm.swallow.control_bar", NULL);
3618                 if(state && !strncmp(state, "default", strlen("default")))
3619                         edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "show,control_bar,signal", "");
3620                 else {
3621 #ifdef BROWSER_SCROLLER_BOUNCING
3622                         int url_layout_h = 0;
3623                         evas_object_geometry_get(m_url_layout, NULL, NULL, NULL, &url_layout_h);
3624                         elm_scroller_region_bring_in(m_scroller ,scroller_x, url_layout_h, scroller_w, scroller_h);
3625 #endif
3626                 }
3627         } else {
3628                 if (_is_loading()) {
3629                 } else {
3630                         Eina_Bool visible = _navigationbar_visible_get();
3631 #ifdef BROWSER_SCROLLER_BOUNCING
3632                         _navigationbar_visible_set(!visible);
3633 #endif
3634                 }
3635         }
3636 }
3637
3638
3639 void Browser_View::_jump_to_top(void)
3640 {
3641         BROWSER_LOGD("[%s]", __func__);
3642         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
3643         Evas_Object *content = elm_object_item_content_get(top_it);
3644         if (content != m_main_layout)
3645                 return;
3646
3647         if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)
3648 #if defined(FEATURE_MOST_VISITED_SITES)
3649             || is_most_visited_sites_running()
3650 #endif
3651             || m_edit_mode != BR_NO_EDIT_MODE)
3652                 return;
3653
3654         int browser_scroller_x = 0;
3655         int browser_scroller_w = 0;
3656         int browser_scroller_h = 0;
3657         elm_scroller_region_get(m_scroller, &browser_scroller_x, NULL,
3658                                 &browser_scroller_w, &browser_scroller_h);
3659         elm_scroller_region_show(m_scroller, browser_scroller_x, 0, browser_scroller_w, browser_scroller_h);
3660
3661         ewk_view_top_of_contents_go(m_focused_window->m_ewk_view);
3662 }
3663
3664 void Browser_View::delete_non_user_created_windows(void)
3665 {
3666         BROWSER_LOGD("[%s]", __func__);
3667         /* Delete no-backward history window. */
3668         std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3669         int window_count = window_list.size();
3670
3671         if (window_count <= 1)
3672                 return;
3673
3674         int i = 0;
3675         for (i = 0 ; i < window_count ; i++) {
3676                 BROWSER_LOGD("focusable_window = %d, window[%d]=%d", m_focused_window, i, window_list[i]);
3677                 if (window_list[i]->m_ewk_view
3678                      &&!ewk_view_back_possible(window_list[i]->m_ewk_view)
3679                      && window_list[i] != m_focused_window
3680                      && window_list[i]->m_created_by_user == EINA_FALSE) {
3681                         BROWSER_LOGD("delete window index=[%d]", i);
3682                         m_browser->delete_window(window_list[i]);
3683
3684                         /* Set title & url with the focused window. */
3685                         _set_navigationbar_title(get_title().c_str());
3686                         _set_url_entry(get_url().c_str());
3687                         _set_controlbar_back_forward_status();
3688                         if (!_set_favicon())
3689                                 BROWSER_LOGE("_set_favicon failed");
3690                 }
3691         }
3692 }
3693
3694 void Browser_View::__title_back_button_clicked_cb(void *data , Evas_Object *obj, void *event_info)
3695 {
3696         BROWSER_LOGD("[%s]", __func__);
3697         if (!data)
3698                 return;
3699
3700         if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
3701                 BROWSER_LOGD("close multi window");
3702                 m_data_manager->get_multi_window_view()->close_multi_window();
3703                 return;
3704         }
3705
3706         Browser_View *browser_view = (Browser_View *)data;
3707
3708         if (browser_view->m_focused_window->m_ewk_view
3709             && ewk_view_back_possible(browser_view->m_focused_window->m_ewk_view))
3710                 ewk_view_back(browser_view->m_focused_window->m_ewk_view);
3711         else {
3712                 if (browser_view->m_focused_window->m_parent) {
3713                         /* Save current window pointer to delete later. */
3714                         Browser_Window *delete_window = browser_view->m_focused_window;
3715                         browser_view->m_browser->set_focused_window(browser_view->m_focused_window->m_parent);
3716                         browser_view->m_browser->delete_window(delete_window);
3717
3718                         /* Set title & url with the focused window. */
3719                         browser_view->_set_navigationbar_title(browser_view->get_title().c_str());
3720                         browser_view->_set_url_entry(browser_view->get_url().c_str());
3721                         browser_view->_set_controlbar_back_forward_status();
3722                         if (!browser_view->_set_favicon())
3723                                 BROWSER_LOGE("_set_favicon failed");
3724                 } else {
3725                         elm_win_lower(browser_view->m_win);
3726
3727                         browser_view->delete_non_user_created_windows();
3728                 }
3729         }
3730 }
3731
3732 void Browser_View::__scroller_scroll_cb(void *data, Evas_Object *obj, void *event_info)
3733 {
3734 #ifdef BROWSER_SCROLLER_BOUNCING
3735         if (!data)
3736                 return;
3737
3738         Browser_View *browser_view = (Browser_View *)data;
3739
3740         int browser_scroller_x = 0;
3741         int browser_scroller_y = 0;
3742         int browser_scroller_w = 0;
3743         int browser_scroller_h = 0;
3744         elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, &browser_scroller_y,
3745                                 &browser_scroller_w, &browser_scroller_h);
3746
3747         int url_layout_h = 0;
3748         evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
3749
3750         /* Workaround.
3751          * If user scrolls up/down near the url bar edge, the movement of scroller is not smooth.
3752          * It's because the browser scroller region y is also bouncing.
3753          * So if the scroller region y is bigger than the height of url bar(65 pixel),
3754          * make the region y to url bar height by force. */
3755         if (browser_scroller_y > url_layout_h)
3756                 elm_scroller_region_show(browser_view->m_scroller, browser_scroller_x, url_layout_h,
3757                                         browser_scroller_w, browser_scroller_h);
3758 #endif
3759 }
3760
3761 Eina_Bool Browser_View::_is_loading(void)
3762 {
3763         if (!m_focused_window || !m_focused_window->m_ewk_view)
3764                 return EINA_FALSE;
3765
3766         double progress = ewk_view_load_progress_get(m_focused_window->m_ewk_view);
3767 //      BROWSER_LOGD("progress=%f", progress);
3768         if (progress == 1.0f || progress < 0.05f)
3769                 return EINA_FALSE;
3770         else
3771                 return EINA_TRUE;
3772 }
3773
3774 #if defined(HORIZONTAL_UI)
3775 Eina_Bool Browser_View::is_available_to_rotate(void)
3776 {
3777         BROWSER_LOGD("\n");
3778         if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
3779                 if (m_data_manager->get_multi_window_view()->is_reordering_mode())
3780                         return EINA_FALSE;
3781         }
3782
3783         if (m_scissorbox_view)
3784                 return EINA_FALSE;
3785
3786         return EINA_TRUE;
3787 }
3788
3789 Eina_Bool Browser_View::__rotate_multi_window_cb(void *data)
3790 {
3791         BROWSER_LOGD("[%s]", __func__);
3792         Browser_View *browser_view = (Browser_View *)data;
3793         browser_view->m_multi_window_rotate_timer = NULL;
3794         browser_view->_rotate_multi_window();
3795
3796         return ECORE_CALLBACK_CANCEL;
3797 }
3798
3799 void Browser_View::rotate(int degree)
3800 {
3801         BROWSER_LOGD("\n");
3802         /* In landscape mode, if the url bar is not displayed -> rotate to portrait mode.
3803          * Then the url bar is displayed. To avoid this issue, remember the scroller region y,
3804          * then restore it at portrait mode. */
3805         int scroller_region_y = 0;
3806         elm_scroller_region_get(m_scroller, NULL, &scroller_region_y, NULL, NULL);
3807         m_scroller_region_y = scroller_region_y;
3808
3809         m_rotate_degree = degree;
3810
3811 #if defined(FEATURE_MOST_VISITED_SITES)
3812         if (m_most_visited_sites)
3813                 m_most_visited_sites->rotate();
3814 #endif
3815         if (m_scissorbox_view)
3816                 _destroy_scissorbox_view();
3817 }
3818 #endif
3819 void Browser_View::suspend_ewk_view(Evas_Object *ewk_view)
3820 {
3821         BROWSER_LOGD("[%s]", __func__);
3822
3823         std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3824         for (int i = 0 ; i < window_list.size() ; i++) {
3825                 if (window_list[i]->m_ewk_view_layout) {
3826                         edje_object_signal_emit(elm_layout_edje_get(window_list[i]->m_ewk_view_layout),
3827                                                                 "unresizable,signal", "");
3828
3829                 }
3830         }
3831
3832         ewk_view_suspend(ewk_view);
3833         ewk_view_visibility_set(ewk_view, EINA_FALSE);
3834 }
3835
3836 void Browser_View::resume_ewk_view(Evas_Object *ewk_view)
3837 {
3838         BROWSER_LOGD("[%s]", __func__);
3839
3840         if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
3841                 return;
3842
3843         ewk_view_resume(ewk_view);
3844         ewk_view_visibility_set(ewk_view, EINA_TRUE);
3845 }
3846
3847 void Browser_View::pause(void)
3848 {
3849         BROWSER_LOGD("[%s]", __func__);
3850         if (_is_loading()) {
3851                 /* Because the progress wheel in url bar has about 15% cpu consumption.
3852                   * So, pause the animation when browser goes to background. It's nonsense!*/
3853                 if (m_option_header_url_progresswheel)
3854                         elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
3855                 if (m_url_progresswheel)
3856                         elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
3857         }
3858
3859         set_full_sreen(EINA_FALSE);
3860
3861         ug_pause();
3862
3863         suspend_ewk_view(m_focused_window->m_ewk_view);
3864
3865         /* stop vibration */
3866         _haptic_device_stop();
3867 }
3868
3869 void Browser_View::resume(void)
3870 {
3871         BROWSER_LOGD("[%s]", __func__);
3872         if (_is_loading()) {
3873                 /* Because the progress wheel in url bar has about 15% cpu consumption.
3874                   * So, pause the animation when browser goes to background. It's nonsense! */
3875                 if (m_option_header_url_progresswheel)
3876                         elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_TRUE);
3877                 if (m_url_progresswheel)
3878                         elm_progressbar_pulse(m_url_progresswheel, EINA_TRUE);
3879         }
3880
3881         ug_resume();
3882
3883         resume_ewk_view(m_focused_window->m_ewk_view);
3884 }
3885
3886 void Browser_View::reset(void)
3887 {
3888         BROWSER_LOGD("[%s]", __func__);
3889         if (m_focused_window && m_focused_window->m_ewk_view)
3890                 resume();
3891 }
3892
3893 Eina_Bool Browser_View::__webview_layout_resize_idler_cb(void *data)
3894 {
3895         BROWSER_LOGD("\n");
3896         if (!data)
3897                 return ECORE_CALLBACK_CANCEL;
3898
3899         Browser_View *browser_view = (Browser_View *)data;
3900
3901         browser_view->m_resize_idler = NULL;
3902
3903         edje_object_signal_emit(elm_layout_edje_get(browser_view->m_focused_window->m_ewk_view_layout),
3904                                                 "resizable,signal", "");
3905
3906         int content_w = 0;
3907         int content_h = 0;
3908 #ifdef BROWSER_SCROLLER_BOUNCING        
3909         edje_object_part_geometry_get(elm_layout_edje_get(browser_view->m_main_layout),
3910                                 "elm.swallow.content", NULL, NULL, &content_w, &content_h);
3911 #else
3912         edje_object_part_geometry_get(elm_layout_edje_get(browser_view->m_focused_window->m_ewk_view_layout),
3913                                 "elm.swallow.webview", NULL, NULL, &content_w, &content_h);
3914 #endif
3915         if (browser_view->m_is_full_screen) {
3916                 int browser_scroller_y = 0;
3917                 evas_object_geometry_get(browser_view->m_scroller, NULL, &browser_scroller_y, NULL, NULL);
3918                 evas_object_resize(browser_view->m_focused_window->m_ewk_view,
3919                                         content_w, content_h + browser_scroller_y);
3920         } else {
3921                 evas_object_size_hint_min_set(browser_view->m_focused_window->m_ewk_view_layout,
3922                                         content_w, content_h);
3923                 evas_object_resize(browser_view->m_focused_window->m_ewk_view_layout,
3924                                         content_w, content_h);
3925         }
3926
3927         return ECORE_CALLBACK_CANCEL;
3928 }
3929
3930 Eina_Bool Browser_View::__scroller_bring_in_idler_cb(void *data)
3931 {
3932         BROWSER_LOGD("[%s]", __func__);
3933         if (!data)
3934                 return ECORE_CALLBACK_CANCEL;
3935         Browser_View *browser_view = (Browser_View *)data;
3936
3937         int url_layout_h = 0;
3938         evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
3939
3940         BROWSER_LOGD("<< elm_scroller_region_bring_in , url_layout_h=%d >>", url_layout_h);
3941         int browser_scroller_x = 0;
3942         int browser_scroller_w = 0;
3943         int browser_scroller_h = 0;                     
3944         elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, NULL,
3945                                         &browser_scroller_w, &browser_scroller_h);
3946         elm_scroller_region_show(browser_view->m_scroller, browser_scroller_x, url_layout_h,
3947                                         browser_scroller_w, browser_scroller_h);
3948
3949         return ECORE_CALLBACK_CANCEL;
3950 }
3951
3952 /* Workaround.
3953  * If user invokes the keypad via input field or url entry, resize the webview.
3954  * The only scroller resize is called when the keypad is launched.
3955  * Other elements like layout, conformant resize event doesn't come. */
3956 void Browser_View::__scroller_resize_cb(void* data, Evas* evas, Evas_Object* obj, void* ev)
3957 {
3958         BROWSER_LOGD("[%s]", __func__);
3959         if (!data)
3960                 return;
3961
3962         Browser_View *browser_view = (Browser_View *)data;
3963
3964         if (browser_view->m_is_full_screen) {
3965                 ecore_idler_add(__webview_layout_resize_idler_cb, browser_view);
3966                 return;
3967         }
3968
3969         int scroller_w = 0;
3970         int scroller_h = 0;
3971         evas_object_geometry_get(browser_view->m_scroller, NULL, NULL, &scroller_w, &scroller_h);
3972         std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3973
3974         for (int i = 0 ; i < window_list.size() ; i++) {
3975                 if (window_list[i]->m_ewk_view_layout) {
3976                         edje_object_signal_emit(elm_layout_edje_get(window_list[i]->m_ewk_view_layout),
3977                                                                 "resizable,signal", "");
3978
3979                         evas_object_size_hint_min_set(window_list[i]->m_ewk_view_layout,
3980                                                                                 scroller_w, scroller_h);
3981                         evas_object_resize(window_list[i]->m_ewk_view_layout,
3982                                                                         scroller_w, scroller_h);
3983                 }
3984         }
3985
3986 #if defined(HORIZONTAL_UI)
3987         Evas_Object *edit_field_entry;
3988         edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
3989         Ecore_IMF_Context *ic = (Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry);
3990         /* If the keypad from webkit is invoked in landscape mode, the visible viewport is too narrow.
3991           * So, hide the url bar in browser scroller by bring in.
3992           * The direct bring in call doesn't work, so do it by idler. */
3993         if (ic && browser_view->is_landscape()) {
3994                 Ecore_IMF_Input_Panel_State imf_state = ecore_imf_context_input_panel_state_get(ic);
3995                 /* Strangley, The state of webkit's imf is show-state even if the ic is url entry.
3996                   * However, this is good for browser without webkit's ic get API. */
3997                 if (imf_state == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
3998                         browser_view->_enable_browser_scroller_scroll();
3999                         ecore_idler_add(__scroller_bring_in_idler_cb, browser_view);
4000                 }
4001         }
4002 #endif
4003
4004         if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
4005                 BROWSER_LOGD("close multi window");
4006                 browser_view->m_is_multi_window_grid_mode = m_data_manager->get_multi_window_view()->_is_grid_mode();
4007                 m_data_manager->get_multi_window_view()->close_multi_window();
4008
4009 #if defined(HORIZONTAL_UI)
4010                 if (browser_view->m_multi_window_rotate_timer)
4011                         ecore_timer_del(browser_view->m_multi_window_rotate_timer);
4012                 browser_view->m_multi_window_rotate_timer = ecore_timer_add(0.2, __rotate_multi_window_cb, browser_view);
4013 #endif
4014         }
4015 }
4016
4017
4018 #ifdef ZOOM_BUTTON
4019 Eina_Bool Browser_View::__zoom_button_timeout_cb(void *data)
4020 {
4021         BROWSER_LOGD("[%s]", __func__);
4022         if (!data)
4023                 return ECORE_CALLBACK_CANCEL;
4024
4025         Browser_View *browser_view = (Browser_View *)data;
4026         browser_view->m_zoom_button_timer = NULL;
4027
4028         edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,zoom_buttons,signal", "");
4029
4030         return ECORE_CALLBACK_CANCEL;
4031 }
4032
4033 void Browser_View::__zoom_out_clicked_cb(void *data, Evas_Object *obj, void *event_info)
4034 {
4035         BROWSER_LOGD("[%s]", __func__);
4036         if (!data)
4037                 return;
4038
4039         Browser_View *browser_view = (Browser_View *)data;
4040         double scale_factor = ewk_view_scale_get(browser_view->m_focused_window->m_ewk_view);
4041         ewk_view_scale_set(browser_view->m_focused_window->m_ewk_view, scale_factor - 0.5f, 0, 0);
4042
4043         if (browser_view->m_zoom_button_timer)
4044                 ecore_timer_del(browser_view->m_zoom_button_timer);
4045         browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
4046 }
4047
4048 void Browser_View::__zoom_in_clicked_cb(void *data, Evas_Object *obj, void *event_info)
4049 {
4050         BROWSER_LOGD("[%s]", __func__);
4051         if (!data)
4052                 return;
4053
4054         Browser_View *browser_view = (Browser_View *)data;
4055         double scale_factor = ewk_view_scale_get(browser_view->m_focused_window->m_ewk_view);
4056         ewk_view_scale_set(browser_view->m_focused_window->m_ewk_view, scale_factor + 0.5f, 0, 0);
4057
4058         if (browser_view->m_zoom_button_timer)
4059                 ecore_timer_del(browser_view->m_zoom_button_timer);
4060         browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
4061 }
4062
4063 Eina_Bool Browser_View::_create_zoom_buttons(void)
4064 {
4065         BROWSER_LOGD("[%s]", __func__);
4066         m_zoom_out_button = elm_button_add(m_navi_bar);
4067         if (!m_zoom_out_button) {
4068                 BROWSER_LOGE("elm_button_add failed");
4069                 return EINA_FALSE;
4070         }
4071         elm_object_style_set(m_zoom_out_button, "browser/zoom_out");
4072         elm_object_part_content_set(m_main_layout, "elm.swallow.zoom_out_button", m_zoom_out_button);
4073         evas_object_smart_callback_add(m_zoom_out_button, "clicked", __zoom_out_clicked_cb, this);
4074         evas_object_show(m_zoom_out_button);
4075
4076         m_zoom_in_button = elm_button_add(m_navi_bar);
4077         if (!m_zoom_in_button) {
4078                 BROWSER_LOGE("elm_button_add failed");
4079                 return EINA_FALSE;
4080         }
4081
4082         elm_object_style_set(m_zoom_in_button, "browser/zoom_in");
4083         elm_object_part_content_set(m_main_layout, "elm.swallow.zoom_in_button", m_zoom_in_button);
4084         evas_object_smart_callback_add(m_zoom_in_button, "clicked", __zoom_in_clicked_cb, this);
4085         evas_object_show(m_zoom_in_button);
4086
4087         return EINA_TRUE;
4088 }
4089 #endif
4090
4091 void Browser_View::__naviframe_pop_finished_cb(void *data , Evas_Object *obj, void *event_info)
4092 {
4093         BROWSER_LOGD("[%s]", __func__);
4094         if (!data)
4095                 return;
4096
4097         Browser_View *browser_view = (Browser_View *)data;
4098         Elm_Object_Item *it = (Elm_Object_Item *)event_info;
4099
4100         if (browser_view->m_navi_it != elm_naviframe_top_item_get(m_navi_bar))
4101                 return;
4102
4103         m_data_manager->destroy_bookmark_view();
4104         m_data_manager->destroy_history_layout();
4105         /* Add to bookmark, then cancel. */
4106         m_data_manager->destroy_add_to_bookmark_view();
4107 #if defined(FEATURE_MOST_VISITED_SITES)
4108         m_data_manager->destroy_add_to_most_visited_sites_view();
4109 #endif
4110
4111         /* If return from browser settings. */
4112         if (browser_view->m_browser_settings) {
4113                 delete browser_view->m_browser_settings;
4114                 browser_view->m_browser_settings = NULL;
4115         }
4116 }
4117
4118 void Browser_View::__dim_area_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
4119 {
4120         BROWSER_LOGD("[%s]", __func__);
4121         if (!data)
4122                 return;
4123
4124         Browser_View *browser_view = (Browser_View *)data;
4125
4126         elm_object_focus_set(m_data_manager->get_browser_view()->m_option_header_cancel_button, EINA_TRUE);
4127 }
4128
4129 void Browser_View::__context_menu_bg_mouse_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
4130 {
4131         BROWSER_LOGD("[%s]", __func__);
4132         if (!data)
4133                 return;
4134
4135         Browser_View *browser_view = (Browser_View *)data;
4136
4137         browser_view->_destroy_more_context_popup();
4138 }
4139
4140 Eina_Bool Browser_View::_create_main_layout(void)
4141 {
4142         BROWSER_LOGD("[%s]", __func__);
4143         m_main_layout = elm_layout_add(m_navi_bar);
4144         if (!m_main_layout) {
4145                 BROWSER_LOGE("elm_layout_add failed!");
4146                 return EINA_FALSE;
4147         }
4148
4149         if (!elm_layout_file_set(m_main_layout, BROWSER_EDJE_DIR"/browser-view-main.edj",
4150                                 "browser/browser-view-main")) {
4151                 BROWSER_LOGE("elm_layout_file_set failed", BROWSER_EDJE_DIR);
4152                 return EINA_FALSE;
4153         }
4154
4155         evas_object_size_hint_weight_set(m_main_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4156         evas_object_size_hint_align_set(m_main_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
4157         evas_object_show(m_main_layout);
4158
4159         m_title_back_button = elm_button_add(m_navi_bar);
4160         if (!m_title_back_button) {
4161                 BROWSER_LOGE("elm_button_add failed!");
4162                 return EINA_FALSE;
4163         }
4164         evas_object_smart_callback_add(m_title_back_button, "clicked", __title_back_button_clicked_cb, this);
4165
4166         m_navi_it = elm_naviframe_item_push(m_navi_bar, "", NULL, NULL, m_main_layout, NULL);
4167
4168         evas_object_smart_callback_add(m_navi_bar, "transition,finished", __naviframe_pop_finished_cb, this);
4169
4170         elm_object_style_set(m_title_back_button, "browser/title_back");
4171         elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_TITLE_LEFT_BTN, m_title_back_button);
4172
4173         evas_object_show(m_title_back_button);
4174         evas_object_show(m_navi_bar);
4175
4176         m_scroller = elm_scroller_add(m_navi_bar);
4177         if (!m_scroller) {
4178                 BROWSER_LOGE("elm_scroller_add failed!");
4179                 return EINA_FALSE;
4180         }
4181         /* Do not propagate event to scroller's ancestor */
4182         /* not to call unnecessary other callbacks. */
4183         evas_object_propagate_events_set(m_scroller, EINA_FALSE);
4184
4185         /* Do not use scroller's scrollbar, use webview's scrollbar instead */
4186         elm_scroller_policy_set(m_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
4187         evas_object_size_hint_align_set(m_scroller, EVAS_HINT_FILL, 0.0);
4188         evas_object_size_hint_weight_set(m_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4189 #ifdef BROWSER_SCROLLER_BOUNCING
4190 //      elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_TRUE);
4191         elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_FALSE);
4192 #else
4193         elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_FALSE);
4194         elm_object_scroll_freeze_pop(m_scroller);
4195         elm_object_scroll_freeze_push(m_scroller);
4196 #endif
4197         evas_object_show(m_scroller);
4198
4199         evas_object_smart_callback_add(m_scroller, "scroll", __scroller_scroll_cb, this);
4200         evas_object_event_callback_add(m_scroller, EVAS_CALLBACK_RESIZE, __scroller_resize_cb, this);
4201
4202         /* create content box which contains navigation layout & webview */
4203         m_content_box = elm_box_add(m_main_layout);
4204         if (!m_content_box) {
4205                 BROWSER_LOGE("elm_box_add failed!");
4206                 return EINA_FALSE;
4207         }
4208
4209         elm_box_horizontal_set(m_content_box, EINA_FALSE);
4210         evas_object_size_hint_weight_set(m_content_box, EVAS_HINT_EXPAND, 0.0);
4211         evas_object_size_hint_align_set(m_content_box, EVAS_HINT_FILL, EVAS_HINT_FILL);
4212         elm_object_content_set(m_scroller, m_content_box);
4213         evas_object_show(m_content_box);
4214
4215         /* create dummy loading progress bar which is displayed at launching time shortly */
4216         m_dummy_loading_progressbar = elm_progressbar_add(m_navi_bar);
4217         if (!m_dummy_loading_progressbar) {
4218                 BROWSER_LOGE("elm_progressbar_add failed!");
4219                 return EINA_FALSE;
4220         }
4221
4222         elm_object_style_set(m_dummy_loading_progressbar, "browser/loading_wheel");
4223         elm_progressbar_pulse(m_dummy_loading_progressbar, EINA_TRUE);
4224         evas_object_size_hint_weight_set(m_dummy_loading_progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4225         evas_object_size_hint_align_set(m_dummy_loading_progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
4226         elm_object_part_content_set(m_main_layout, "elm.swallow.waiting_progress", m_dummy_loading_progressbar);
4227         evas_object_show(m_dummy_loading_progressbar);
4228
4229         /* create conformant */
4230         elm_win_conformant_set(m_win, EINA_TRUE);
4231         m_conformant = elm_conformant_add(m_main_layout);
4232         if (!m_conformant) {
4233                 BROWSER_LOGE("elm_conformant_add failed!");
4234                 return EINA_FALSE;
4235         }
4236
4237         elm_object_style_set(m_conformant, "internal_layout");
4238         evas_object_size_hint_weight_set(m_conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4239         evas_object_size_hint_align_set(m_conformant, EVAS_HINT_FILL, EVAS_HINT_FILL);
4240         elm_object_content_set(m_conformant, m_scroller);
4241         elm_object_part_content_set(m_main_layout, "elm.swallow.content", m_conformant);
4242         evas_object_show(m_conformant);
4243
4244         m_url_layout = _create_url_layout();
4245         if (!m_url_layout) {
4246                 BROWSER_LOGE("_create_url_layout failed!");
4247                 return EINA_FALSE;
4248         }
4249         elm_box_pack_start(m_content_box, m_url_layout);
4250
4251         m_control_bar = _create_control_bar();
4252         if (!m_control_bar) {
4253                 BROWSER_LOGE("_create_control_bar failed!");
4254                 return EINA_FALSE;
4255         }
4256         elm_object_part_content_set(m_main_layout, "elm.swallow.control_bar", m_control_bar);
4257
4258         m_option_header_url_layout = _create_option_header_url_layout();
4259         if (!m_option_header_url_layout) {
4260                 BROWSER_LOGE("_create_option_header_url_layout failed!");
4261                 return EINA_FALSE;
4262         }
4263
4264         m_option_header_layout = elm_layout_add(m_navi_bar);
4265         if (!m_option_header_layout) {
4266                 BROWSER_LOGE("elm_layout_add failed!");
4267                 return EINA_FALSE;
4268         }
4269         if (!elm_layout_file_set(m_option_header_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
4270                                 "browser-view/option_header")) {
4271                 BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
4272                 return EINA_FALSE;
4273         }
4274         evas_object_size_hint_weight_set(m_option_header_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4275         evas_object_size_hint_align_set(m_option_header_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
4276
4277         elm_object_part_content_set(m_option_header_layout, "elm.swallow.url_layout", m_option_header_url_layout);
4278         evas_object_show(m_option_header_layout);
4279
4280         m_option_header_find_word_layout = _create_find_word_layout();
4281         if (!m_option_header_find_word_layout) {
4282                 BROWSER_LOGE("_create_find_word_layout failed");
4283                 return EINA_FALSE;
4284         }
4285         elm_object_part_content_set(m_option_header_layout, "elm.swallow.find_word_layout", m_option_header_find_word_layout);
4286
4287         elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER, m_option_header_layout);
4288         _navigationbar_visible_set_signal(EINA_FALSE);
4289
4290 #ifdef ZOOM_BUTTON
4291         if (!_create_zoom_buttons()) {
4292                 BROWSER_LOGE("_create_zoom_buttons failed");
4293                 return EINA_FALSE;
4294         }
4295 #endif
4296
4297         edje_object_signal_callback_add(elm_layout_edje_get(m_main_layout),
4298                                         "mouse,clicked,1", "elm.rect.content_dim", __dim_area_clicked_cb, this);
4299
4300         edje_object_signal_callback_add(elm_layout_edje_get(m_main_layout),
4301                                         "mouse,down,1", "elm.rect.more_context_bg", __context_menu_bg_mouse_down_cb, this);
4302
4303         const char *current_theme = elm_theme_get(NULL);
4304         if (current_theme && strstr(current_theme, "white")) {
4305         } else {
4306 //              edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "black_theme,signal", "");
4307 //              edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
4308 //                                                                              "black_theme,signal", "");
4309         }
4310
4311         return EINA_TRUE;
4312 }
4313