c42f01b23de745c0a0df62a116b053f8cf5890ae
[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 scale_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
1323         ewk_view_scale_range_get(browser_view->m_focused_window->m_ewk_view,
1324                                         &min_scale, &max_scale);
1325         if (scale_factor > min_scale && scale_factor < max_scale) {
1326                 if (browser_view->m_zoom_button_timer)
1327                         ecore_timer_del(browser_view->m_zoom_button_timer);
1328                 browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
1329                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "show,zoom_buttons,signal", "");
1330         }
1331 #endif
1332 }
1333
1334 void Browser_View::__ewk_view_enter_full_screen_cb(void *data, Evas_Object *obj, void *event_info)
1335 {
1336         if (!data)
1337                 return;
1338
1339         Browser_View *browser_view = (Browser_View *)data;
1340         browser_view->set_full_sreen(EINA_TRUE);
1341 }
1342
1343 void Browser_View::__ewk_view_exit_full_screen_cb(void *data, Evas_Object *obj, void *event_info)
1344 {
1345         if (!data)
1346                 return;
1347
1348         Browser_View *browser_view = (Browser_View *)data;
1349         browser_view->set_full_sreen(EINA_FALSE);
1350 }
1351
1352 void Browser_View::__ewk_view_vibration_vibrate_cb(void *data, Evas_Object *obj, void *event_info)
1353 {
1354         Browser_View *browser_view = (Browser_View*)data;
1355         const long vibration_time = *((const long *)event_info);
1356
1357         BROWSER_LOGD("__ewk_view_vibration_vibrate_cb : play time is [%ld]", vibration_time);
1358
1359         browser_view->_haptic_device_play(vibration_time);
1360 }
1361
1362 void Browser_View::__ewk_view_vibration_cancel_cb(void *data, Evas_Object *obj, void *event_info)
1363 {
1364         BROWSER_LOGD("[%s]", __func__);
1365
1366         Browser_View *browser_view = (Browser_View*)data;
1367
1368         browser_view->_haptic_device_stop();
1369 }
1370
1371 void Browser_View::__ewk_view_mouse_up_cb(void* data, Evas* evas, Evas_Object* obj, void* ev)
1372 {
1373         if (!data)
1374                 return;
1375
1376         Browser_View *browser_view = (Browser_View *)data;
1377
1378         browser_view->m_is_scrolling = EINA_FALSE;
1379 }
1380
1381 void Browser_View::__ewk_view_edge_top_cb(void *data, Evas_Object *obj, void *event_info)
1382 {
1383 #ifdef BROWSER_SCROLLER_BOUNCING
1384         BROWSER_LOGD("[%s]", __func__);
1385
1386         if (!data)
1387                 return;
1388         Browser_View *browser_view = (Browser_View *)data;
1389         browser_view->_enable_browser_scroller_scroll();
1390
1391         /* If user do flicking the mouse with scroll up, bring in the browser scroller to y=0.  */
1392         if (!browser_view->m_is_scrolling) {
1393                 BROWSER_LOGD("<< elm_scroller_region_bring_in >>");
1394                 int browser_scroller_x = 0;
1395                 int browser_scroller_w = 0;
1396                 int browser_scroller_h = 0;
1397                 elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, NULL,
1398                                                 &browser_scroller_w, &browser_scroller_h);
1399
1400                 elm_scroller_region_bring_in(browser_view->m_scroller, browser_scroller_x, 0,
1401                                                 browser_scroller_w, browser_scroller_h);
1402         }
1403 #endif
1404 }
1405
1406 void Browser_View::__ewk_view_scroll_down_cb(void *data, Evas_Object *obj, void *event_info)
1407 {
1408 #ifdef BROWSER_SCROLLER_BOUNCING
1409         if (!data)
1410                 return;
1411         Browser_View *browser_view = (Browser_View *)data;
1412
1413         int scroller_x = 0;
1414         int scroller_y = 0;
1415         int scroller_w = 0;
1416         int scroller_h = 0;
1417         int url_layout_h = 0;
1418         elm_scroller_region_get(browser_view->m_scroller, &scroller_x, &scroller_y, &scroller_w, &scroller_h);
1419         evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
1420
1421         if (scroller_y < url_layout_h) {
1422                 /* We have to hide urlbar when webview's contents are scrolled down by flicking. */
1423                 if (!browser_view->m_is_scrolling)
1424                         elm_scroller_region_show(browser_view->m_scroller, scroller_x, url_layout_h, scroller_w, scroller_h);
1425                 else
1426                         browser_view->_enable_browser_scroller_scroll();
1427         } else {
1428                 browser_view->_enable_webview_scroll();
1429         }
1430 #endif
1431 }
1432
1433 void Browser_View::__ewk_view_scroll_up_cb(void *data, Evas_Object *obj, void *event_info)
1434 {
1435 #ifdef BROWSER_SCROLLER_BOUNCING
1436         if (!data)
1437                 return;
1438
1439         Browser_View *browser_view = (Browser_View *)data;
1440         browser_view->_enable_webview_scroll();
1441 #endif
1442 }
1443
1444 void Browser_View::_set_navigationbar_title(const char *title)
1445 {
1446         BROWSER_LOGD("title=[%s]", title);
1447         edje_object_part_text_set(elm_layout_edje_get(m_url_layout),
1448                                         "title_text", title);
1449         edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_layout),
1450                                         "title_text", title);
1451 }
1452
1453
1454 void Browser_View::_set_url_entry(const char *url, Eina_Bool set_secrue_icon)
1455 {
1456         BROWSER_LOGD("url=[%s]", url);
1457         if (url && strlen(url)) {
1458                 std::string url_without_http_scheme;
1459                 if (strstr(url, BROWSER_HTTP_SCHEME) && strlen(url) > strlen(BROWSER_HTTP_SCHEME))
1460                         url_without_http_scheme = std::string(url + strlen(BROWSER_HTTP_SCHEME));
1461                 else
1462                         url_without_http_scheme = std::string(url);
1463
1464                 char *mark_up_url = elm_entry_utf8_to_markup(url_without_http_scheme.c_str());
1465                 if (mark_up_url) {
1466                         Evas_Object *entry = br_elm_editfield_entry_get(m_url_edit_field);
1467                         elm_entry_entry_set(entry, mark_up_url);
1468                         entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
1469                         elm_entry_entry_set(entry, mark_up_url);
1470
1471                         edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_edit_field),
1472                                                         "elm.text.ellipsis", mark_up_url);
1473                         edje_object_part_text_set(elm_layout_edje_get(m_url_edit_field),
1474                                                         "elm.text.ellipsis", mark_up_url);
1475                         free(mark_up_url);
1476                 }
1477         } else {
1478                 Evas_Object *entry = br_elm_editfield_entry_get(m_url_edit_field);
1479 #if defined(FEATURE_MOST_VISITED_SITES)
1480                 elm_entry_entry_set(entry, BROWSER_MOST_VISITED_SITES_URL);
1481 #else
1482                 elm_entry_entry_set(entry, BROWSER_BLANK_PAGE_URL);
1483 #endif
1484                 entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
1485 #if defined(FEATURE_MOST_VISITED_SITES)
1486                 elm_entry_entry_set(entry, BROWSER_MOST_VISITED_SITES_URL);
1487
1488                 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_edit_field),
1489                                                 "elm.text.ellipsis", BROWSER_MOST_VISITED_SITES_URL);
1490                 edje_object_part_text_set(elm_layout_edje_get(m_url_edit_field),
1491                                                 "elm.text.ellipsis", BROWSER_MOST_VISITED_SITES_URL);
1492 #else
1493                 elm_entry_entry_set(entry, BROWSER_BLANK_PAGE_URL);
1494
1495                 edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_edit_field),
1496                                                 "elm.text.ellipsis", BROWSER_BLANK_PAGE_URL);
1497                 edje_object_part_text_set(elm_layout_edje_get(m_url_edit_field),
1498                                                 "elm.text.ellipsis", BROWSER_BLANK_PAGE_URL);
1499 #endif
1500         }
1501
1502         if (set_secrue_icon)
1503                 _set_secure_icon();
1504 }
1505
1506 void Browser_View::_stop_loading(void)
1507 {
1508         BROWSER_LOGD("[%s]", __func__);
1509         if (m_focused_window->m_ewk_view)
1510                 ewk_view_stop(m_focused_window->m_ewk_view);
1511 }
1512
1513 void Browser_View::_reload(void)
1514 {
1515         BROWSER_LOGD("[%s]", __func__);
1516         if (m_focused_window->m_ewk_view)
1517                 ewk_view_reload_bypass_cache(m_focused_window->m_ewk_view);
1518 }
1519
1520 void Browser_View::set_focused_window(Browser_Window *window
1521 #if defined(FEATURE_MOST_VISITED_SITES)
1522         ,Eina_Bool show_most_visited_sites
1523 #endif
1524         )
1525 {
1526         BROWSER_LOGD("[%s]", __func__);
1527         if (m_focused_window && m_focused_window->m_ewk_view_layout) {
1528                 elm_box_unpack(m_content_box, m_focused_window->m_ewk_view_layout);
1529                 evas_object_hide(m_focused_window->m_ewk_view_layout);
1530         }
1531
1532         if (m_focused_window && m_focused_window->m_favicon) {
1533                 if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
1534                         elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
1535
1536                 evas_object_hide(m_focused_window->m_favicon);
1537         }
1538         if (m_focused_window && m_focused_window->m_option_header_favicon) {
1539                 if (elm_object_part_content_get(m_option_header_url_entry_layout, "elm.swallow.favicon"))
1540                         elm_object_part_content_unset(m_option_header_url_entry_layout, "elm.swallow.favicon");
1541
1542                 evas_object_hide(m_focused_window->m_option_header_favicon);
1543         }
1544
1545         m_focused_window = window;
1546
1547         if (!m_focused_window->m_ewk_view_layout) {
1548                 m_focused_window->m_ewk_view_layout = elm_layout_add(m_navi_bar);
1549                 if (!m_focused_window->m_ewk_view_layout) {
1550                         BROWSER_LOGE("elm_layout_add failed!");
1551                         return;
1552                 }
1553                 if (!elm_layout_file_set(m_focused_window->m_ewk_view_layout,
1554                                         BROWSER_EDJE_DIR"/browser-view-main.edj",
1555                                         "browser/browser-view-webview")) {
1556                         BROWSER_LOGE("elm_layout_file_set failed", BROWSER_EDJE_DIR);
1557                         return;
1558                 }
1559                 evas_object_size_hint_weight_set(m_focused_window->m_ewk_view_layout,
1560                                                 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1561                 evas_object_size_hint_align_set(m_focused_window->m_ewk_view_layout,
1562                                                 EVAS_HINT_FILL, EVAS_HINT_FILL);
1563                 elm_box_pack_end(m_content_box, m_focused_window->m_ewk_view_layout);
1564                 evas_object_show(m_focused_window->m_ewk_view_layout);
1565
1566                 elm_object_part_content_set(m_focused_window->m_ewk_view_layout, "elm.swallow.webview",
1567                                         m_focused_window->m_ewk_view);
1568                 evas_object_show(m_focused_window->m_ewk_view);
1569
1570
1571                 /* Workaround.
1572                   * If launch the browser by aul, the grey bg is displayed shortly. */
1573                 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1574                                                 "hide,grey_background,signal", "");
1575                 /* Workaround.
1576                   * The webview layout is not resized whenever repack to content box.
1577                   * So resize the webview layout whenever repack. */
1578                 m_resize_idler = ecore_idler_add(__webview_layout_resize_idler_cb, this);
1579         } else {
1580                 elm_box_pack_end(m_content_box, m_focused_window->m_ewk_view_layout);
1581                 evas_object_show(m_focused_window->m_ewk_view_layout);
1582                 evas_object_show(m_focused_window->m_ewk_view);
1583         }
1584
1585         if (!_is_loading()) {
1586                 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,off,signal", "");
1587                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1588                                         "loading,off,signal", "");
1589                 elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
1590                 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
1591         }
1592
1593         /* show or hide favicon in url layout. */
1594         if (m_focused_window->m_favicon
1595 #if defined(FEATURE_MOST_VISITED_SITES)
1596                 && !is_most_visited_sites_running()
1597 #endif
1598                 ) {
1599                 if (elm_object_part_content_get(m_url_entry_layout, "elm.swallow.favicon"))
1600                         elm_object_part_content_unset(m_url_entry_layout, "elm.swallow.favicon");
1601
1602                 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.favicon",
1603                                                         m_focused_window->m_favicon);
1604                 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1605                                                         "show,favicon,signal", "");
1606                 evas_object_show(m_focused_window->m_favicon);
1607                 _set_secure_icon();
1608         } else {
1609                 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1610                                                         "hide,favicon,signal", "");
1611         }
1612
1613         /* show or hide favicon in option header url layout. */
1614         if (m_focused_window->m_option_header_favicon
1615 #if defined(FEATURE_MOST_VISITED_SITES)
1616                 && !is_most_visited_sites_running()
1617 #endif
1618                 ) {
1619                 if (elm_object_part_content_get(m_option_header_url_entry_layout, "elm.swallow.favicon"))
1620                         elm_object_part_content_unset(m_option_header_url_entry_layout, "elm.swallow.favicon");
1621
1622                 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.favicon",
1623                                                         m_focused_window->m_option_header_favicon);
1624                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1625                                                         "show,favicon,signal", "");
1626                 _set_secure_icon();
1627                 evas_object_show(m_focused_window->m_option_header_favicon);
1628         } else {
1629                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1630                                                         "hide,favicon,signal", "");
1631         }
1632
1633 #if defined(FEATURE_MOST_VISITED_SITES)
1634         if (show_most_visited_sites) {
1635                 if (get_url().empty())
1636                         _show_most_visited_sites(EINA_TRUE);
1637                 else
1638                         _show_most_visited_sites(EINA_FALSE);
1639         }
1640 #endif
1641
1642         std::vector<Browser_Window *> window_list = m_browser->get_window_list();
1643         _set_multi_window_controlbar_text(window_list.size());
1644
1645         if (!_set_favicon())
1646                 BROWSER_LOGE("_set_favicon failed");
1647
1648         _update_back_forward_buttons();
1649
1650         /* Without this code, the url is empty shortly when create deleted-window in multi window. */
1651         if (get_url().empty() && !m_focused_window->m_url.empty())
1652                 _set_url_entry(m_focused_window->m_url.c_str());
1653         else
1654                 _set_url_entry(get_url().c_str());
1655
1656         if (window_list.size() >= BROWSER_MULTI_WINDOW_MAX_COUNT)
1657                 elm_object_item_disabled_set(m_new_window_button, EINA_TRUE);
1658         else
1659                 elm_object_item_disabled_set(m_new_window_button, EINA_FALSE);
1660 }
1661
1662 #if defined(FEATURE_MOST_VISITED_SITES)
1663 Eina_Bool Browser_View::_show_most_visited_sites(Eina_Bool is_show)
1664 {
1665         BROWSER_LOGD("[%s]is_show=%d", __func__, is_show);
1666         if (is_show) {
1667                 m_selected_most_visited_sites_item_info.url.clear();
1668                 m_selected_most_visited_sites_item_info.title.clear();
1669                 m_selected_most_visited_sites_item_info.id.clear();
1670
1671                 if (!m_most_visited_sites) {
1672                         m_most_visited_sites = new(nothrow) Most_Visited_Sites(m_navi_bar, this, m_most_visited_sites_db);
1673                         if (!m_most_visited_sites) {
1674                                 BROWSER_LOGE("new Most_Visited_Sites failed");
1675                                 return EINA_FALSE;
1676                         }
1677
1678                         Evas_Object *most_visited_sites_layout = m_most_visited_sites->create_most_visited_sites_main_layout();
1679                         if (!most_visited_sites_layout) {
1680                                 BROWSER_LOGE("create_most_visited_sites_main_layout failed");
1681                                 if (m_most_visited_sites) {
1682                                         delete m_most_visited_sites;
1683                                         m_most_visited_sites = NULL;
1684                                 }
1685                                 return EINA_FALSE;
1686                         }
1687                         elm_object_part_content_set(m_main_layout, "elm.swallow.most_visited_sites", most_visited_sites_layout);
1688                         edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1689                                                         "show,most_visited_sites,signal", "");
1690                         edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1691                                                         "show,control_bar,no_animation,signal", "");
1692
1693                         /* change the url layout for normal mode. (change the reload icon etc) */
1694                         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,off,signal", "");
1695                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1696                                                 "loading,off,signal", "");
1697
1698                         edje_object_part_text_set(elm_layout_edje_get(m_url_entry_layout),
1699                                                         "url_guide_text", BR_STRING_URL_GUIDE_TEXT);
1700                         edje_object_part_text_set(elm_layout_edje_get(m_option_header_url_entry_layout),
1701                                                         "url_guide_text", BR_STRING_URL_GUIDE_TEXT);
1702
1703                         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,on,signal", "");
1704                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1705                                                                 "url_guide_text,on,signal", "");
1706
1707                         _set_navigationbar_title(BR_STRING_MOST_VISITED_SITES);
1708                         _set_url_entry(BROWSER_MOST_VISITED_SITES_URL);
1709
1710                         /* If the speed dial is displayed for the first time, destroy the progress wheel. */
1711                         if (m_dummy_loading_progressbar) {
1712                                 elm_object_part_content_unset(m_main_layout, "elm.swallow.waiting_progress");
1713                                 evas_object_del(m_dummy_loading_progressbar);
1714                                 m_dummy_loading_progressbar = NULL;
1715                                 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1716                                                         "hide,waiting_progressbar,signal", "");
1717                         }
1718
1719                         elm_object_item_disabled_set(m_add_bookmark_button, EINA_TRUE);
1720                 }
1721
1722                 int scroller_x = 0;
1723                 int scroller_w = 0;
1724                 int scroller_h = 0;
1725                 elm_scroller_region_get(m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
1726                 elm_scroller_region_show(m_scroller ,scroller_x, 0, scroller_w, scroller_h);
1727
1728                 _navigationbar_visible_set_signal(EINA_TRUE);
1729
1730                 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
1731                                                         "hide,favicon,signal", "");
1732                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1733                                                         "hide,favicon,signal", "");
1734
1735 #ifdef BROWSER_SCROLLER_BOUNCING
1736                 BROWSER_LOGD("<< lock browser scroller >>");
1737                 elm_object_scroll_freeze_pop(m_scroller);
1738                 elm_object_scroll_freeze_push(m_scroller);
1739 #endif
1740         } else {
1741                 if (m_most_visited_sites) {
1742                         if (elm_object_part_content_get(m_main_layout, "elm.swallow.most_visited_sites"))
1743                                 elm_object_part_content_unset(m_main_layout, "elm.swallow.most_visited_sites");
1744                         edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1745                                                         "hide,most_visited_sites,signal", "");
1746                         edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
1747                                                 "hide,most_visited_sites_guide_text,signal", "");
1748
1749                         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,off,signal", "");
1750                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
1751                                                                                 "url_guide_text,off,signal", "");
1752
1753                         delete m_most_visited_sites;
1754                         m_most_visited_sites = NULL;
1755
1756                         elm_object_item_disabled_set(m_add_bookmark_button, EINA_FALSE);
1757                 }
1758         }
1759         return EINA_TRUE;
1760 }
1761 #endif
1762
1763 void Browser_View::load_url(const char *url)
1764 {
1765         BROWSER_LOGD("[%s]", __func__);
1766 #if defined(FEATURE_MOST_VISITED_SITES)
1767         if (!url || !strlen(url)) {
1768                 if (!_show_most_visited_sites(EINA_TRUE))
1769                         BROWSER_LOGE("_show_most_visited_sites EINA_TRUE failed");
1770                 return;
1771
1772         } else {
1773                 if (!_show_most_visited_sites(EINA_FALSE))
1774                         BROWSER_LOGE("_show_most_visited_sites EINA_FALSE failed");
1775         }
1776 #endif
1777
1778         Evas_Object *edit_field_entry = br_elm_editfield_entry_get(_get_activated_url_entry());
1779         evas_object_smart_callback_del(edit_field_entry, "changed", __url_entry_changed_cb);
1780
1781         std::string full_url;
1782         if (_has_url_sheme(url))
1783                 full_url = url;
1784         else
1785                 full_url = std::string(BROWSER_HTTP_SCHEME) + std::string(url);
1786
1787         BROWSER_LOGD("full_url = [%s]", full_url.c_str());
1788
1789         _set_url_entry(full_url.c_str());
1790
1791         ewk_view_uri_set(m_focused_window->m_ewk_view, full_url.c_str());
1792 }
1793
1794 string Browser_View::get_title(Browser_Window *window)
1795 {
1796         const char *title = ewk_view_title_get(window->m_ewk_view);
1797         BROWSER_LOGD("title = [%s]", title);
1798
1799         if (!window->m_ewk_view && !window->m_title.empty())
1800                 return window->m_title;
1801
1802         if (!window->m_ewk_view)
1803                 return std::string();
1804
1805         if (!title) {
1806                 if (!window->m_title.empty())
1807                         return window->m_title;
1808                 else
1809                         return std::string();
1810         }
1811
1812         return std::string(title);
1813 }
1814
1815 string Browser_View::get_title(void)
1816 {
1817         const char *title = ewk_view_title_get(m_focused_window->m_ewk_view);
1818         BROWSER_LOGD("title = [%s]", title);
1819
1820         if (!title && m_focused_window->m_title.empty())
1821                 return std::string();
1822         else if (!title && !m_focused_window->m_title.empty())
1823                 return m_focused_window->m_title;
1824
1825         if (title && strlen(title))
1826                 return std::string(title);
1827
1828         return std::string();
1829 }
1830
1831 string Browser_View::get_url(Browser_Window *window)
1832 {
1833         BROWSER_LOGD("[%s]", __func__);
1834
1835         if (!window->m_ewk_view && !window->m_url.empty())
1836                 return window->m_url;
1837
1838         if (!window->m_ewk_view)
1839                 return std::string();
1840
1841         const char *uri = ewk_view_uri_get(window->m_ewk_view);
1842         BROWSER_LOGD("uri = [%s]", uri);
1843
1844         if (!uri || strlen(uri) == 0)
1845                 return std::string();
1846
1847         return std::string(uri);
1848 }
1849
1850 string Browser_View::get_url(void)
1851 {
1852         const char *uri = ewk_view_uri_get(m_focused_window->m_ewk_view);
1853         BROWSER_LOGD("uri = [%s]", uri);
1854
1855         if (!uri || strlen(uri) == 0)
1856                 return std::string();
1857
1858         return std::string(uri);
1859 }
1860
1861 /* If multi window is running, unset the navigation title object,
1862   * else set the navigation title object to show title object arrow.  */
1863 void Browser_View::unset_navigationbar_title_object(Eina_Bool is_unset)
1864 {
1865         BROWSER_LOGD("[%s] is_unset =%d", __func__, is_unset);
1866         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
1867         if (is_unset) {
1868                 _navigationbar_visible_set_signal(EINA_FALSE);
1869                 elm_object_item_part_content_unset(top_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER);
1870                 evas_object_hide(m_option_header_layout);
1871         } else {
1872                 Evas_Object *title_object = NULL;
1873                 title_object = elm_object_item_part_content_get(top_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER);
1874                 if (!title_object) {
1875                         elm_object_item_part_content_set(top_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER,
1876                                                                         m_option_header_layout);
1877                         evas_object_show(m_option_header_layout);
1878                 }
1879 #if defined(FEATURE_MOST_VISITED_SITES)
1880                 if (!is_most_visited_sites_running())
1881                         _navigationbar_visible_set_signal(EINA_FALSE);
1882 #endif
1883         }
1884 }
1885
1886 void Browser_View::__go_to_bookmark_cb(void *data, Evas_Object *obj, void *event_info)
1887 {
1888         BROWSER_LOGD("[%s]", __func__);
1889         if (!data)
1890                 return;
1891
1892         Browser_View *browser_view = (Browser_View *)data;
1893
1894         if (!m_data_manager->create_bookmark_view()) {
1895                 BROWSER_LOGE("m_data_manager->create_bookmark_view failed");
1896                 return;
1897         }
1898
1899         if (!m_data_manager->get_bookmark_view()->init()) {
1900                 BROWSER_LOGE("m_data_manager->get_bookmark_view()->init failed");
1901                 m_data_manager->destroy_bookmark_view();
1902         }
1903
1904         browser_view->_destroy_more_context_popup();
1905 }
1906
1907 void Browser_View::__backward_cb(void *data, Evas_Object *obj, void *event_info)
1908 {
1909         BROWSER_LOGD("[%s]", __func__);
1910         if (!data)
1911                 return;
1912
1913         Browser_View *browser_view = (Browser_View *)data;
1914         __title_back_button_clicked_cb(data, NULL, NULL);
1915
1916         browser_view->_destroy_more_context_popup();
1917 }
1918
1919 void Browser_View::__forward_cb(void *data, Evas_Object *obj, void *event_info)
1920 {
1921         BROWSER_LOGD("[%s]", __func__);
1922         if (!data)
1923                 return;
1924
1925         Browser_View *browser_view = (Browser_View *)data;
1926         browser_view->_destroy_more_context_popup();
1927         if (browser_view->m_focused_window->m_ewk_view
1928                 && ewk_view_forward_possible(browser_view->m_focused_window->m_ewk_view))
1929                 ewk_view_forward(browser_view->m_focused_window->m_ewk_view);
1930 }
1931
1932 #ifdef USE_META_TAG
1933 void Browser_View::__web_app_capable_get_cb(Eina_Bool capable, void* user_data)
1934 {
1935         BROWSER_LOGD("[%s]", __func__);
1936
1937         if (!user_data)
1938                 return;
1939
1940         Browser_View *browser_view = (Browser_View *)user_data;
1941         Evas_Object *webkit = browser_view->m_focused_window->m_ewk_view;
1942         if (capable) {
1943                 ewk_view_web_application_icon_url_get(webkit, __web_app_icon_url_get_cb, browser_view);
1944         }
1945 }
1946
1947 void Browser_View::__web_app_icon_url_get_cb(const char* icon_url, void* user_data)
1948 {
1949         BROWSER_LOGD("icon_url:%s", icon_url);
1950
1951         if (!user_data)
1952                 return;
1953
1954         Browser_View *browser_view = (Browser_View *)user_data;
1955
1956         /* make configure file */
1957         browser_view->m_meta_tag->create_config_xml((browser_view->get_url()).c_str(), browser_view->get_title().c_str(), NULL);
1958         if (!icon_url || strlen(icon_url) == 0) {
1959                 BROWSER_LOGD("Failed to get webapp icon url, make widget with default icon");
1960                 browser_view->m_meta_tag->wgt_install(NULL);
1961         } else {
1962                 BROWSER_LOGD("Succeed to get webapp icon url, make widget after icon downloaded");
1963                 /* get icon */
1964                 browser_view->m_meta_tag->request_download_icon(icon_url);
1965         }
1966 }
1967 #endif
1968
1969 void Browser_View::__url_editfield_share_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1970 {
1971         BROWSER_LOGD("[%s]", __func__);
1972         if (!data)
1973                 return;
1974
1975         Browser_View *browser_view = (Browser_View *)data;
1976         const char *selected_text = elm_entry_selection_get(br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field));
1977
1978         if (browser_view->_show_share_popup(selected_text))
1979                 BROWSER_LOGE("_show_share_popup failed");
1980 }
1981
1982 Eina_Bool Browser_View::__show_scissorbox_view_idler_cb(void *data)
1983 {
1984         if (!data)
1985                 return ECORE_CALLBACK_CANCEL;
1986
1987         Browser_View *browser_view = (Browser_View *)data;
1988
1989         if (browser_view->m_scissorbox_view)
1990                 delete browser_view->m_scissorbox_view;
1991
1992         browser_view->m_scissorbox_view = new(nothrow) Browser_Scissorbox_View(browser_view);
1993         if (!browser_view->m_scissorbox_view) {
1994                 BROWSER_LOGE("new Browser_Scissorbox_View failed");
1995                 return ECORE_CALLBACK_CANCEL;
1996         }
1997         if (!browser_view->m_scissorbox_view->init()) {
1998                 BROWSER_LOGE("m_scissorbox_view->init failed");
1999                 delete browser_view->m_scissorbox_view;
2000                 browser_view->m_scissorbox_view = NULL;
2001                 return ECORE_CALLBACK_CANCEL;
2002         }
2003
2004         elm_object_part_content_set(browser_view->m_main_layout, "elm.swallow.scissorbox",
2005                                                 browser_view->m_scissorbox_view->get_layout());
2006         edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout),
2007                                                         "show,scissorbox,signal", "");
2008
2009         edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_layout),
2010                                                         "show,scissorbox,signal", "");
2011         edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_layout),
2012                                                         "show,scissorbox,signal", "");
2013
2014
2015         elm_object_part_content_unset(browser_view->m_main_layout, "elm.swallow.control_bar");
2016         evas_object_hide(browser_view->m_control_bar);
2017
2018         return ECORE_CALLBACK_CANCEL;
2019 }
2020
2021 Eina_Bool Browser_View::_show_scissorbox_view(void)
2022 {
2023         BROWSER_LOGD("[%s]", __func__);
2024
2025 //      _hide_scroller_url_layout();
2026
2027         ecore_idler_add(__show_scissorbox_view_idler_cb, this);
2028
2029         return EINA_TRUE;
2030 }
2031
2032 void Browser_View::_destroy_scissorbox_view(void)
2033 {
2034         elm_object_part_content_unset(m_main_layout, "elm.swallow.scissorbox");
2035         edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "hide,scissorbox,signal", "");
2036
2037         edje_object_signal_emit(elm_layout_edje_get(m_url_layout),
2038                                                         "hide,scissorbox,signal", "");
2039         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2040                                                         "hide,scissorbox,signal", "");
2041
2042         elm_object_part_content_unset(m_main_layout, "elm.swallow.control_bar");
2043
2044         if (m_scissorbox_view) {
2045                 delete m_scissorbox_view;
2046                 m_scissorbox_view = NULL;
2047         }
2048
2049         elm_object_part_content_set(m_main_layout, "elm.swallow.control_bar", m_control_bar);
2050         evas_object_show(m_control_bar);
2051 }
2052
2053 void Browser_View::__share_cb(void *data, Evas_Object *obj, void *event_info)
2054 {
2055         BROWSER_LOGD("[%s]", __func__);
2056         if (!data)
2057                 return;
2058
2059         Browser_View *browser_view = (Browser_View *)data;
2060         browser_view->_destroy_more_context_popup();
2061         browser_view->_show_share_popup(browser_view->get_url().c_str());
2062 }
2063
2064
2065 void Browser_View::__private_cb(void *data, Evas_Object *obj, void *event_info)
2066 {
2067         BROWSER_LOGD("[%s]", __func__);
2068         if (!data)
2069                 return;
2070
2071         Browser_View *browser_view = (Browser_View *)data;
2072         browser_view->m_is_private = !browser_view->m_is_private;
2073
2074         browser_view->m_is_private_item_pressed = EINA_TRUE;
2075
2076         elm_check_state_set(browser_view->m_private_check, browser_view->m_is_private);
2077
2078         if (browser_view->m_is_private) {
2079                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,on,signal", "");
2080                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,on,signal", "");
2081         } else {
2082                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,off,signal", "");
2083                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,off,signal", "");
2084         }
2085
2086         Ewk_Setting *setting = ewk_view_setting_get(browser_view->m_focused_window->m_ewk_view);
2087         ewk_setting_private_browsing_set(setting, browser_view->m_is_private);
2088 }
2089
2090 void Browser_View::__bookmark_cb(void *data, Evas_Object *obj, void *event_info)
2091 {
2092         BROWSER_LOGD("[%s]", __func__);
2093         if (!data)
2094                 return;
2095
2096         Browser_View *browser_view = (Browser_View *)data;
2097         int bookmark_id = -1;
2098         if(!m_data_manager->get_history_db()->is_in_bookmark(browser_view->get_url().c_str(), &bookmark_id)) {
2099                 if (!elm_icon_file_set(browser_view->m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_on.png", NULL)) {
2100                         BROWSER_LOGE("elm_icon_file_set is failed.\n");
2101                         return;
2102                 }
2103                 m_data_manager->create_bookmark_db()->save_bookmark(BROWSER_BOOKMARK_MAIN_FOLDER_ID,
2104                                         browser_view->get_title().c_str(), browser_view->get_url().c_str());
2105                 browser_view->show_notify_popup(BR_STRING_ADDED_TO_BOOKMARKS, 3, EINA_TRUE);
2106         } else {
2107                 if (!elm_icon_file_set(browser_view->m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_off.png", NULL)) {
2108                         BROWSER_LOGE("elm_icon_file_set is failed.\n");
2109                         return;
2110                 }
2111                 m_data_manager->create_bookmark_db()->delete_bookmark(bookmark_id);
2112                 browser_view->show_notify_popup(BR_STRING_REMOVED_TO_BOOKMARKS, 3, EINA_TRUE);
2113         }
2114
2115         m_data_manager->destroy_bookmark_db();
2116 }
2117
2118 void Browser_View::__bookmark_icon_changed_cb(void *data, Evas_Object *obj, void *event_info)
2119 {
2120         BROWSER_LOGD("[%s]", __func__);
2121         if (!data)
2122                 return;
2123
2124         Browser_View *browser_view = (Browser_View *)data;
2125 }
2126
2127 void Browser_View::__private_check_change_cb(void *data, Evas_Object *obj, void *event_info)
2128 {
2129         BROWSER_LOGD("[%s]", __func__);
2130         if (!data)
2131                 return;
2132
2133         Browser_View *browser_view = (Browser_View *)data;
2134         Eina_Bool state = elm_check_state_get((Evas_Object*)obj);
2135         browser_view->m_is_private = state;
2136
2137         if (browser_view->m_is_private_item_pressed) {
2138                 browser_view->m_is_private = !browser_view->m_is_private;
2139                 elm_check_state_set(browser_view->m_private_check, browser_view->m_is_private);
2140                 browser_view->m_is_private_item_pressed = EINA_FALSE;
2141         }
2142
2143         if (browser_view->m_is_private) {
2144                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,on,signal", "");
2145                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,on,signal", "");
2146         } else {
2147                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_url_entry_layout), "private,off,signal", "");
2148                 edje_object_signal_emit(elm_layout_edje_get(browser_view->m_option_header_url_entry_layout), "private,off,signal", "");
2149         }
2150
2151         Ewk_Setting *setting = ewk_view_setting_get(browser_view->m_focused_window->m_ewk_view);
2152         ewk_setting_private_browsing_set(setting, browser_view->m_is_private);
2153 }
2154
2155 void Browser_View::__expand_option_header_cb(void *data, Evas_Object *obj, void *event_info)
2156 {
2157         BROWSER_LOGD("[%s]", __func__);
2158         if (!data)
2159                 return;
2160
2161         Browser_View *browser_view = (Browser_View *)data;
2162
2163         browser_view->_navigationbar_title_clicked();
2164 }
2165
2166 void Browser_View::__add_bookmark_cb(void *data, Evas_Object *obj, void *event_info)
2167 {
2168         BROWSER_LOGD("[%s]", __func__);
2169         if (!data)
2170                 return;
2171
2172         Browser_View *browser_view = (Browser_View *)data;
2173         if (!m_data_manager->create_add_to_bookmark_view(browser_view->get_title(), browser_view->get_url())) {
2174                 BROWSER_LOGE("m_data_manager->create_add_to_bookmark_view failed");
2175                 return;
2176         }
2177
2178         if (!m_data_manager->get_add_to_bookmark_view()->init())
2179                 m_data_manager->destroy_add_to_bookmark_view();
2180 }
2181
2182 #if defined(HORIZONTAL_UI)
2183 void Browser_View::_rotate_multi_window(void)
2184 {
2185         BROWSER_LOGD("[%s]", __func__);
2186
2187         if (!m_data_manager->create_multi_window_view()) {
2188                 BROWSER_LOGE("m_data_manager->create_multi_window_view failed");
2189                 return;
2190         }
2191
2192         if (!m_data_manager->get_multi_window_view()->init(0.0, m_is_multi_window_grid_mode)) {
2193                 m_data_manager->destroy_multi_window_view();
2194                 BROWSER_LOGE("get_multi_window_view()->init failed");
2195                 return;
2196         }
2197
2198         ewk_view_suspend(m_focused_window->m_ewk_view);
2199
2200         _navigationbar_visible_set_signal(EINA_FALSE);
2201
2202         /* Hide the secure lock icon in title bar. */
2203         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
2204         elm_object_item_part_content_set(top_it, ELM_NAVIFRAME_ITEM_ICON, NULL);
2205
2206         if (_get_edit_mode() != BR_NO_EDIT_MODE)
2207                 _set_edit_mode(BR_NO_EDIT_MODE);
2208
2209         m_is_multi_window_grid_mode = EINA_FALSE;
2210 }
2211 #endif
2212
2213 void Browser_View::__multi_window_cb(void *data, Evas_Object *obj, void *event_info)
2214 {
2215         BROWSER_LOGD("[%s]", __func__);
2216
2217         Browser_View *browser_view = (Browser_View *)data;
2218         browser_view->_destroy_more_context_popup();
2219
2220 #if defined(FEATURE_MOST_VISITED_SITES)
2221         if (browser_view->m_most_visited_sites && browser_view->m_most_visited_sites->is_guide_text_running())
2222                 return;
2223 #endif
2224
2225         if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
2226                 BROWSER_LOGD("close multi window");
2227                 m_data_manager->get_multi_window_view()->close_multi_window();
2228                 return;
2229         }
2230
2231         if (!m_data_manager->create_multi_window_view()) {
2232                 BROWSER_LOGE("m_data_manager->create_multi_window_view failed");
2233                 return;
2234         }
2235
2236         if (!m_data_manager->get_multi_window_view()->init()) {
2237                 m_data_manager->destroy_multi_window_view();
2238                 BROWSER_LOGE("get_multi_window_view()->init failed");
2239                 return;
2240         }
2241
2242         /* Exception case to call ewk_view_suspend directly.
2243           * That's because the webpage is cleared, when call ewk_view_visibility_set suspend_ewk_view */
2244         ewk_view_suspend(browser_view->m_focused_window->m_ewk_view);
2245         ewk_view_visibility_set(browser_view->m_focused_window->m_ewk_view, EINA_FALSE);
2246
2247         browser_view->_navigationbar_visible_set_signal(EINA_FALSE);
2248
2249         /* Hide the secure lock icon in title bar. */
2250         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
2251         elm_object_item_part_content_set(top_it, ELM_NAVIFRAME_ITEM_ICON, NULL);
2252
2253         if (browser_view->_get_edit_mode() != BR_NO_EDIT_MODE)
2254                 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2255 }
2256
2257 void Browser_View::__new_window_cb(void *data, Evas_Object *obj, void *event_info)
2258 {
2259         BROWSER_LOGD("[%s]", __func__);
2260         if (!data)
2261                 return;
2262
2263         Browser_View *browser_view = (Browser_View *)data;
2264         Browser_Class *browser = browser_view->m_browser;
2265
2266         if (browser_view->m_resize_idler)
2267                 return;
2268
2269         std::vector<Browser_Window *> window_list = browser->get_window_list();
2270         if (window_list.size() >= BROWSER_MULTI_WINDOW_MAX_COUNT) {
2271                 /* If the multi window is max, delete the first one. */
2272                 /* if the first window is focused, delete second one(oldest one except first one) */
2273                 if (browser_view->m_focused_window != window_list[0])
2274                         browser->delete_window(window_list[0]);
2275                 else
2276                         browser->delete_window(window_list[1]);
2277         }
2278
2279         browser_view->m_created_new_window = browser->create_new_window(EINA_TRUE);
2280         if (!browser_view->m_created_new_window) {
2281                 BROWSER_LOGE("create_new_window failed");
2282                 return;
2283         }
2284         /* initialize the created webview first to connect ewk event callback functions such as load start, progress etc. */
2285         ewk_view_suspend(browser_view->m_focused_window->m_ewk_view);
2286
2287 #if defined(HORIZONTAL_UI)
2288                 if (browser_view->m_focused_window->m_landscape_snapshot_image) {
2289                         evas_object_del(browser_view->m_focused_window->m_landscape_snapshot_image);
2290                         browser_view->m_focused_window->m_landscape_snapshot_image = NULL;
2291                 }
2292 #endif
2293                 if (browser_view->m_focused_window->m_portrait_snapshot_image) {
2294                         evas_object_del(browser_view->m_focused_window->m_portrait_snapshot_image);
2295                         browser_view->m_focused_window->m_portrait_snapshot_image = NULL;
2296                 }
2297
2298 #if defined(HORIZONTAL_UI)
2299                 if (browser_view->is_landscape())
2300                         browser_view->m_focused_window->m_landscape_snapshot_image = browser_view->_capture_snapshot(browser_view->m_focused_window, BROWSER_MULTI_WINDOW_ITEM_RATIO);
2301                 else
2302 #endif
2303                         browser_view->m_focused_window->m_portrait_snapshot_image = browser_view->_capture_snapshot(browser_view->m_focused_window, BROWSER_MULTI_WINDOW_ITEM_RATIO);
2304
2305 #if defined(FEATURE_MOST_VISITED_SITES)
2306         if (!browser_view->_show_most_visited_sites(EINA_FALSE))
2307                 BROWSER_LOGE("_show_most_visited_sites EINA_FALSE failed");
2308 #endif
2309
2310         /* initialize the created webview first to connect ewk event callback functions such as load start, progress etc. */
2311         browser->ewk_view_init(browser_view->m_created_new_window->m_ewk_view);
2312
2313         if (!browser_view->_show_new_window_effect(browser_view->m_focused_window->m_ewk_view,
2314                                         browser_view->m_created_new_window->m_ewk_view))
2315                 BROWSER_LOGE("_show_new_window_effect failed");
2316
2317 #if defined(FEATURE_MOST_VISITED_SITES)
2318         browser_view->load_url(BROWSER_MOST_VISITED_SITES_URL);
2319 #else
2320         browser_view->load_url(BROWSER_BLANK_PAGE_URL);
2321 #endif
2322         return;
2323 }
2324
2325 Eina_Bool Browser_View::_call_internet_settings(void)
2326 {
2327         BROWSER_LOGD("[%s]", __func__);
2328
2329         m_browser_settings = new(nothrow) Browser_Settings_Class;
2330         if (!m_browser_settings) {
2331                 BROWSER_LOGE("new Browser_Settings_Class failed");
2332                 return EINA_FALSE;
2333         }
2334         if (!m_browser_settings->init()) {
2335                 BROWSER_LOGE("m_browser_settings->init failed");
2336                 delete m_browser_settings;
2337                 m_browser_settings = NULL;
2338
2339                 return EINA_FALSE;
2340         }
2341         return EINA_TRUE;
2342 }
2343
2344 void Browser_View::__internet_settings_cb(void *data, Evas_Object *obj, void *event_info)
2345 {
2346         BROWSER_LOGD("[%s]", __func__);
2347         if (!data)
2348                 return;
2349
2350         Browser_View *browser_view = (Browser_View *)data;
2351         browser_view->_destroy_more_context_popup();
2352
2353         if (!browser_view->_call_internet_settings())
2354                 BROWSER_LOGE("_call_internet_settings failed");
2355 }
2356
2357 void Browser_View::_update_find_word_index_text(const char *index_text, int index, int max_match_cnt)
2358 {
2359         BROWSER_LOGD("[%s]", __func__);
2360
2361         edje_object_part_text_set(elm_layout_edje_get(m_option_header_find_word_layout), "elm.index_text", index_text);
2362
2363         if (max_match_cnt == 0 || max_match_cnt == 1) {
2364                 elm_object_disabled_set(m_find_word_prev_button, EINA_TRUE);
2365                 elm_object_disabled_set(m_find_word_next_button, EINA_TRUE);
2366         } else if (index == 0 || index == 1) {
2367                 elm_object_disabled_set(m_find_word_prev_button, EINA_TRUE);
2368                 elm_object_disabled_set(m_find_word_next_button, EINA_FALSE);
2369                 if (index == 0 || (index == 1 && elm_object_focus_get(m_find_word_cancel_button)))
2370                         elm_object_focus_set(m_find_word_cancel_button, EINA_TRUE);
2371         } else if (index == max_match_cnt) {
2372                 elm_object_disabled_set(m_find_word_prev_button, EINA_FALSE);
2373                 elm_object_disabled_set(m_find_word_next_button, EINA_TRUE);
2374                 elm_object_focus_set(m_find_word_cancel_button, EINA_TRUE);
2375         } else {
2376                 if (elm_object_disabled_get(m_find_word_prev_button))
2377                         elm_object_disabled_set(m_find_word_prev_button, EINA_FALSE);
2378                 if (elm_object_disabled_get(m_find_word_next_button))
2379                         elm_object_disabled_set(m_find_word_next_button, EINA_FALSE);
2380         }
2381 }
2382 void Browser_View::__find_word_cb(void *data, Evas_Object *obj, void *event_info)
2383 {
2384         BROWSER_LOGD("[%s]", __func__);
2385         if (!data)
2386                 return;
2387
2388         Browser_View *browser_view = (Browser_View *)data;
2389         browser_view->_destroy_more_context_popup();
2390
2391         if (browser_view->_get_edit_mode() == BR_FIND_WORD_MODE)
2392                 return;
2393
2394         /* find word layout is only in naviframe optino header.
2395           * So expand the option header to show find word layout. */
2396         browser_view->_navigationbar_visible_set_signal(EINA_TRUE);
2397
2398         browser_view->_set_edit_mode(BR_FIND_WORD_MODE);
2399
2400         elm_object_focus_set(browser_view->m_find_word_edit_field, EINA_TRUE);
2401
2402         edje_object_part_text_set(elm_layout_edje_get(browser_view->m_option_header_find_word_layout), "elm.index_text", "0/0");
2403 }
2404
2405 Eina_Bool Browser_View::_call_download_manager(void)
2406 {
2407         service_h service_handle = NULL;
2408         BROWSER_LOGD("[%s]", __func__);
2409
2410         if (service_create(&service_handle) < 0) {
2411                 BROWSER_LOGE("Fail to create service handle");
2412                 return EINA_FALSE;
2413         }
2414         
2415         if (!service_handle) {
2416                 BROWSER_LOGE("service handle is NULL");
2417                 return EINA_FALSE;
2418         }
2419
2420         if (service_set_operation(service_handle, SERVICE_OPERATION_DOWNLOAD) < 0) {
2421                 BROWSER_LOGE("Fail to set service operation");
2422                 service_destroy(service_handle);
2423                 return EINA_FALSE;
2424         }
2425
2426         if (service_add_extra_data(service_handle, "mode", "view") < 0) {
2427                 BROWSER_LOGE("Fail to set extra data");
2428                 service_destroy(service_handle);
2429                 return EINA_FALSE;
2430         }
2431
2432         if (service_send_launch_request(service_handle, NULL, NULL) < 0) {
2433                 BROWSER_LOGE("Fail to launch service operation");
2434                 service_destroy(service_handle);
2435                 return EINA_FALSE;
2436         }
2437
2438         service_destroy(service_handle);
2439
2440         return EINA_TRUE;
2441 }
2442
2443 void Browser_View::__download_manager_cb(void *data, Evas_Object *obj, void *event_info)
2444 {
2445         BROWSER_LOGD("[%s]", __func__);
2446         if (!data)
2447                 return;
2448
2449         Browser_View *browser_view = (Browser_View *)data;
2450         browser_view->_destroy_more_context_popup();
2451
2452         if (!browser_view->_call_download_manager())
2453                 BROWSER_LOGE("_call_download_manager failed");
2454 }
2455
2456 void Browser_View::__send_via_message_cb(void *data, Evas_Object *obj, void *event_info)
2457 {
2458         BROWSER_LOGD("[%s]", __func__);
2459         if (!data)
2460                 return;
2461
2462         Browser_View *browser_view = (Browser_View *)data;
2463         browser_view->_destroy_more_context_popup();
2464
2465         if (!browser_view->_send_via_message(browser_view->get_url(), std::string()))
2466                 BROWSER_LOGE("_send_via_message failed");
2467 }
2468
2469 void Browser_View::__send_via_email_cb(void *data, Evas_Object *obj, void *event_info)
2470 {
2471         BROWSER_LOGD("[%s]", __func__);
2472         if (!data)
2473                 return;
2474
2475         Browser_View *browser_view = (Browser_View *)data;
2476         browser_view->_destroy_more_context_popup();
2477
2478         if (!browser_view->_send_via_email(browser_view->get_url()))
2479                 BROWSER_LOGE("_send_via_email failed");
2480 }
2481
2482 void Browser_View::__post_to_sns_cb(void *data, Evas_Object *obj, void *event_info)
2483 {
2484         BROWSER_LOGD("[%s]", __func__);
2485         if (!data)
2486                 return;
2487
2488         Browser_View *browser_view = (Browser_View*)data;
2489
2490         Elm_Object_Item *it = (Elm_Object_Item *)event_info;
2491         const char *label = elm_object_item_text_get(it);
2492         BROWSER_LOGD("label=[%s]", label);
2493         if (label && strlen(label)) {
2494                 if (!browser_view->_post_to_sns(std::string(label), browser_view->get_url()))
2495                         BROWSER_LOGE("_post_to_sns failed");
2496         }
2497
2498         browser_view->_destroy_more_context_popup();
2499 }
2500
2501 void Browser_View::_destroy_more_context_popup(void)
2502 {
2503         if (m_more_context_popup) {
2504                 evas_object_del(m_more_context_popup);
2505                 m_more_context_popup = NULL;
2506         }
2507
2508         edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "hide,more_context_bg,signal", "");
2509 }
2510
2511 void Browser_View::__more_context_popup_dismissed_cb(void *data, Evas_Object *obj,
2512                                                                         void *event_info)
2513 {
2514         BROWSER_LOGD("[%s]", __func__);
2515         if (!data)
2516                 return;
2517
2518         Browser_View *browser_view = (Browser_View *)data;
2519         browser_view->_destroy_more_context_popup();
2520 }
2521
2522 void Browser_View::__clean_up_windows_test_cb(void *data, Evas_Object *obj, void *event_info)
2523 {
2524         if (!data)
2525                 return;
2526
2527         Browser_View *browser_view = (Browser_View *)data;
2528         browser_view->_destroy_more_context_popup();
2529
2530         m_browser->clean_up_windows();
2531 }
2532
2533 Eina_Bool Browser_View::_show_more_context_popup(void)
2534 {
2535         BROWSER_LOGD("[%s]", __func__);
2536
2537         _destroy_more_context_popup();
2538
2539         m_more_context_popup = elm_ctxpopup_add(m_win);
2540         if (!m_more_context_popup) {
2541                 BROWSER_LOGE("elm_ctxpopup_add failed");
2542                 return EINA_FALSE;
2543         }
2544
2545         elm_object_style_set(m_more_context_popup, "pass_event");
2546
2547         edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "show,more_context_bg,signal", "");
2548
2549         evas_object_size_hint_weight_set(m_more_context_popup, EVAS_HINT_EXPAND,
2550                                                                 EVAS_HINT_EXPAND);
2551         evas_object_smart_callback_add(m_more_context_popup, "dismissed",
2552                                         __more_context_popup_dismissed_cb, this);
2553
2554         Elm_Object_Item *sub_menu = NULL;
2555         elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_DOWNLOAD_MANAGER, NULL,
2556                                                         __download_manager_cb, this);
2557
2558         sub_menu = elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_FIND_ON_PAGE, NULL,
2559                                                         __find_word_cb, this);
2560         if (
2561 #if defined(FEATURE_MOST_VISITED_SITES)
2562                 is_most_visited_sites_running() ||
2563 #endif
2564                 get_url().empty()
2565             || _get_edit_mode() == BR_FIND_WORD_MODE)
2566                 elm_object_item_disabled_set(sub_menu, EINA_TRUE);
2567
2568         sub_menu = elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_SHARE, NULL,
2569                                                         __share_cb, this);
2570
2571         m_bookmark_on_off_icon = elm_icon_add(m_more_context_popup);
2572
2573         if(m_data_manager->get_history_db()->is_in_bookmark(get_url().c_str(), NULL)) {
2574                 if (!elm_icon_file_set(m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_on.png", NULL)) {
2575                         BROWSER_LOGE("elm_icon_file_set is failed.\n");
2576                         return EINA_FALSE;
2577                 }
2578         } else {
2579                 if (!elm_icon_file_set(m_bookmark_on_off_icon, BROWSER_IMAGE_DIR"/I01_icon_bookmark_off.png", NULL)) {
2580                         BROWSER_LOGE("elm_icon_file_set is failed.\n");
2581                         return EINA_FALSE;
2582                 }
2583         }
2584         evas_object_size_hint_aspect_set(m_bookmark_on_off_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
2585
2586         evas_object_propagate_events_set(m_bookmark_on_off_icon, EINA_FALSE);
2587         evas_object_repeat_events_set(m_bookmark_on_off_icon, EINA_FALSE);
2588         evas_object_smart_callback_add(m_bookmark_on_off_icon, "clicked", __bookmark_icon_changed_cb, this);
2589
2590         sub_menu = elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_BOOKMARK, m_bookmark_on_off_icon,
2591                                                         __bookmark_cb, this);
2592         if (
2593 #if defined(FEATURE_MOST_VISITED_SITES)
2594                 is_most_visited_sites_running() ||
2595 #endif
2596                 get_url().empty()
2597             || _get_edit_mode() == BR_FIND_WORD_MODE)
2598                 elm_object_item_disabled_set(sub_menu, EINA_TRUE);
2599
2600         m_private_check = elm_check_add(m_more_context_popup);
2601         elm_object_style_set(m_private_check, "on&off");
2602         evas_object_smart_callback_add(m_private_check, "changed", __private_check_change_cb, this);
2603
2604         elm_check_state_set(m_private_check, m_is_private);
2605         evas_object_propagate_events_set(m_private_check, EINA_FALSE);
2606         evas_object_show(m_private_check);
2607
2608         elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_PRIVATE, m_private_check,
2609                                                                 __private_cb, this);
2610
2611         elm_ctxpopup_item_append(m_more_context_popup, BR_STRING_SETTINGS, NULL,
2612                                                         __internet_settings_cb, this);
2613
2614         elm_ctxpopup_hover_parent_set(m_more_context_popup, m_navi_bar);
2615
2616         int controlbar_x = 0;
2617         int controlbar_y = 0;
2618         int controlbar_w = 0;
2619         int controlbar_h = 0;
2620         evas_object_geometry_get(m_control_bar, &controlbar_x, &controlbar_y, &controlbar_w, &controlbar_h);
2621
2622         evas_object_move(m_more_context_popup, (controlbar_w / 5) * 3 + controlbar_w / 10, controlbar_y + (controlbar_h / 2));
2623
2624         evas_object_show(m_more_context_popup);
2625
2626         return EINA_TRUE;
2627 }
2628
2629 void Browser_View::__more_cb(void *data, Evas_Object *obj, void *event_info)
2630 {
2631         BROWSER_LOGD("[%s]", __func__);
2632         if (!data)
2633                 return;
2634
2635         Browser_View *browser_view = (Browser_View *)data;
2636         if (browser_view->m_more_context_popup == NULL) {
2637                 if (!browser_view->_show_more_context_popup())
2638                         BROWSER_LOGE("_show_more_context_popup failed");
2639         } else {
2640                 browser_view->_destroy_more_context_popup();
2641         }
2642
2643         browser_view->_navigationbar_visible_set(EINA_TRUE);
2644 }
2645
2646 void Browser_View::_set_controlbar_back_forward_status(void)
2647 {
2648         BROWSER_LOGD("[%s]", __func__);
2649         Evas_Object *ewk_view = m_focused_window->m_ewk_view;
2650         if (!ewk_view)
2651                 return;
2652
2653         if (
2654 #if defined(FEATURE_MOST_VISITED_SITES)
2655                 is_most_visited_sites_running() ||
2656 #endif
2657                 get_url().empty())
2658                 elm_object_item_disabled_set(m_share_controlbar_button, EINA_TRUE);
2659         else
2660                 elm_object_item_disabled_set(m_share_controlbar_button, EINA_FALSE);
2661 }
2662
2663 void Browser_View::_set_multi_window_controlbar_text(int count)
2664 {
2665         BROWSER_LOGD("[%s]", __func__);
2666         if (count == 1) {
2667                 elm_toolbar_item_icon_set(m_multi_window_button, BROWSER_IMAGE_DIR"/01_controlbar_icon_multiview.png");
2668         } else {
2669                 char icon_path[100] = {0, };
2670                 snprintf(icon_path, sizeof(icon_path) - 1, "%s/01_controlbar_icon_multiview_0%d.png", BROWSER_IMAGE_DIR, count);
2671                 elm_toolbar_item_icon_set(m_multi_window_button, icon_path);
2672         }
2673 }
2674
2675 Evas_Object *Browser_View::_create_control_bar(void)
2676 {
2677         BROWSER_LOGD("[%s]", __func__);
2678         Evas_Object *controlbar_layout;
2679         controlbar_layout = elm_layout_add(m_navi_bar);
2680         if (!controlbar_layout) {
2681                 BROWSER_LOGE("elm_layout_add failed");
2682                 return NULL;
2683         }
2684         if (!elm_layout_file_set(controlbar_layout, BROWSER_EDJE_DIR"/browser-view-control-bar.edj",
2685                                 "browser-view-controlbar")) {
2686                 BROWSER_LOGE("Can not set layout browser-view-controlbar\n");
2687                 return NULL;
2688         }
2689         evas_object_size_hint_weight_set(controlbar_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2690         evas_object_size_hint_align_set(controlbar_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
2691         evas_object_show(controlbar_layout);
2692
2693         Evas_Object *control_bar;
2694         control_bar = elm_toolbar_add(m_navi_bar);
2695         if (control_bar) {
2696                 elm_object_style_set(control_bar, "browser/browser-view");
2697
2698                 elm_toolbar_shrink_mode_set(control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
2699
2700                 /* New Window Button */
2701                 m_new_window_button = elm_toolbar_item_append(control_bar,
2702                                         BROWSER_IMAGE_DIR"/I01_controlbar_icon_new_window.png", NULL, __new_window_cb, this);
2703                 if (!m_new_window_button) {
2704                         BROWSER_LOGE("elm_toolbar_item_append failed");
2705                         return NULL;
2706                 }
2707
2708                 /* Multi Window Button */
2709                 m_multi_window_button = elm_toolbar_item_append(control_bar,
2710                                         BROWSER_IMAGE_DIR"/01_controlbar_icon_multiview.png", NULL, __multi_window_cb, this);
2711                 /* Bookmark Button */
2712                 elm_toolbar_item_append(control_bar, BROWSER_IMAGE_DIR"/I01_controlbar_icon_bookmark.png",
2713                                                 NULL, __go_to_bookmark_cb, this);
2714                 /* More menu Button */
2715                 m_more_button = elm_toolbar_item_append(control_bar,
2716                                         BROWSER_IMAGE_DIR"/I01_controlbar_icon_more.png", NULL, __more_cb, this);
2717                 if (!m_more_button) {
2718                         BROWSER_LOGE("elm_toolbar_item_append failed");
2719                         return NULL;
2720                 }
2721
2722                 elm_object_part_content_set(controlbar_layout, "elm.swallow.controlbar", control_bar);
2723
2724                 m_back_button = elm_button_add(control_bar);
2725                 if (!m_back_button) {
2726                         BROWSER_LOGE("elm_button_add failed");
2727                         return NULL;
2728                 }
2729                 elm_object_style_set(m_back_button, "browser/browser_view_controlbar_back");
2730
2731                 elm_object_part_content_set(controlbar_layout, "elm.swallow.back_button", m_back_button);
2732                 evas_object_smart_callback_add(m_back_button, "clicked", __backward_cb, this);
2733                 evas_object_show(m_back_button);
2734                 evas_object_show(control_bar);
2735         }
2736
2737         return controlbar_layout;
2738 }
2739
2740 /* 
2741 * Create two same url layouts similar with other browsers like android & safari.
2742 * The one(by _create_url_layout) is in the browser scroller and
2743 * the other(by _create_option_header_url_layout) is in the navigation bar option header.
2744 */
2745 Evas_Object *Browser_View::_create_option_header_url_layout(void)
2746 {
2747         BROWSER_LOGD("[%s]", __func__);
2748         Evas_Object *url_layout;
2749         url_layout = elm_layout_add(m_navi_bar);
2750         if (url_layout) {
2751                 if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
2752                                         "browser/url_layout")) {
2753                         BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
2754                         return NULL;
2755                 }
2756                 evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2757                 evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
2758                 evas_object_show(url_layout);
2759
2760                 m_option_header_url_entry_layout = elm_layout_add(m_navi_bar);
2761                 if (!m_option_header_url_entry_layout) {
2762                         BROWSER_LOGE("elm_layout_add failed");
2763                         return NULL;
2764                 }
2765                 if (!elm_layout_file_set(m_option_header_url_entry_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
2766                                         "elm/browser/urlentry/default")) {
2767                         BROWSER_LOGE("Can not set layout theme[browser, urlentry, default]\n");
2768                         return NULL;
2769                 }
2770                 elm_object_part_content_set(url_layout, "elm.swallow.url", m_option_header_url_entry_layout);
2771                 edje_object_signal_callback_add(elm_layout_edje_get(m_option_header_url_entry_layout),
2772                                                 "mouse,clicked,1", "elm.swallow.entry", __url_entry_clicked_cb, this);
2773
2774                 edje_object_signal_callback_add(elm_layout_edje_get(m_option_header_url_entry_layout),
2775                                                 "refresh_stop", "*", __refresh_button_clicked_cb, this);
2776
2777                 evas_object_show(m_option_header_url_entry_layout);
2778
2779                 m_option_header_url_edit_field = br_elm_url_editfield_add(m_navi_bar);
2780                 if (!m_option_header_url_edit_field) {
2781                         BROWSER_LOGE("elm_editfield_add failed");
2782                         return NULL;
2783                 }
2784                 elm_entry_context_menu_item_add(br_elm_editfield_entry_get(m_option_header_url_edit_field),
2785                                                                 BR_STRING_CTXMENU_SHARE, NULL, ELM_ICON_NONE, __url_editfield_share_clicked_cb, this);
2786
2787                 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.entry", m_option_header_url_edit_field);
2788 //              br_elm_editfield_entry_single_line_set(m_option_header_url_edit_field, EINA_TRUE);
2789                 br_elm_editfield_eraser_set(m_option_header_url_edit_field, EINA_FALSE);
2790
2791                 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(m_option_header_url_edit_field);
2792                 elm_entry_input_panel_layout_set(edit_field_entry, ELM_INPUT_PANEL_LAYOUT_URL);
2793                 ecore_imf_context_input_panel_event_callback_add((Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry),
2794                                                                 ECORE_IMF_INPUT_PANEL_STATE_EVENT, __url_entry_imf_event_cb, this);
2795
2796                 evas_object_smart_callback_add(edit_field_entry, "activated", __url_entry_enter_key_cb, this);
2797                 evas_event_callback_add(evas_object_evas_get(m_option_header_url_edit_field), EVAS_CALLBACK_CANVAS_FOCUS_OUT,
2798                                         __url_entry_focus_out_cb, this);
2799                 evas_object_show(m_option_header_url_edit_field);
2800
2801                 m_option_header_url_progressbar = elm_progressbar_add(m_navi_bar);
2802                 if (!m_option_header_url_progressbar) {
2803                         BROWSER_LOGE("elm_progressbar_add failed");
2804                         return NULL;
2805                 }
2806                 elm_object_style_set(m_option_header_url_progressbar, "browser/loading");
2807                 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.progressbar", m_option_header_url_progressbar);
2808                 elm_progressbar_value_set(m_option_header_url_progressbar, 0);
2809                 evas_object_show(m_option_header_url_progressbar);
2810
2811                 m_option_header_url_progresswheel = elm_progressbar_add(m_navi_bar);
2812                 if (!m_option_header_url_progresswheel) {
2813                         BROWSER_LOGE("elm_progressbar_add failed");
2814                         return NULL;
2815                 }
2816
2817                 elm_object_style_set(m_option_header_url_progresswheel, "UIActivityIndicatorStyleWhite");
2818
2819                 elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
2820                 elm_object_part_content_set(m_option_header_url_entry_layout, "elm.swallow.progress", m_option_header_url_progresswheel);
2821                 evas_object_show(m_option_header_url_progresswheel);
2822
2823                 m_option_header_cancel_button = elm_button_add(m_navi_bar);
2824                 if (!m_option_header_cancel_button) {
2825                         BROWSER_LOGE("elm_button_add failed");
2826                         return NULL;
2827                 }
2828                 evas_object_size_hint_weight_set(m_option_header_cancel_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2829                 evas_object_size_hint_align_set(m_option_header_cancel_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
2830                 elm_object_style_set(m_option_header_cancel_button, "browser/cancel_button");
2831                 elm_object_text_set(m_option_header_cancel_button, BR_STRING_CANCEL);
2832                 elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_option_header_cancel_button);
2833                 evas_object_smart_callback_add(m_option_header_cancel_button, "clicked", __cancel_button_clicked_cb, this);
2834                 evas_object_show(m_option_header_cancel_button);
2835
2836                 m_option_header_title_backward_button = elm_button_add(m_navi_bar);
2837                 if (!m_option_header_title_backward_button) {
2838                         BROWSER_LOGE("elm_button_add failed");
2839                         return NULL;
2840                 }
2841                 elm_object_style_set(m_option_header_title_backward_button, "browser/backward");
2842                 elm_object_part_content_set(url_layout, "elm.swallow.backward_button", m_option_header_title_backward_button);
2843                 evas_object_smart_callback_add(m_option_header_title_backward_button, "clicked", __backward_button_clicked_cb, this);
2844                 elm_object_focus_allow_set(m_option_header_title_backward_button, EINA_FALSE);
2845                 evas_object_show(m_option_header_title_backward_button);
2846                 elm_object_disabled_set(m_option_header_title_backward_button, EINA_TRUE);
2847
2848                 m_option_header_title_forward_button = elm_button_add(m_navi_bar);
2849                 if (!m_option_header_title_forward_button) {
2850                         BROWSER_LOGE("elm_button_add failed");
2851                         return NULL;
2852                 }
2853                 elm_object_style_set(m_option_header_title_forward_button, "browser/forward");
2854                 elm_object_part_content_set(url_layout, "elm.swallow.forward_button", m_option_header_title_forward_button);
2855                 evas_object_smart_callback_add(m_option_header_title_forward_button, "clicked", __forward_button_clicked_cb, this);
2856                 elm_object_focus_allow_set(m_option_header_title_forward_button, EINA_FALSE);
2857                 evas_object_show(m_option_header_title_forward_button);
2858                 elm_object_disabled_set(m_option_header_title_forward_button, EINA_TRUE);
2859
2860                 /* for jump to top. */
2861                 evas_object_event_callback_add(url_layout, EVAS_CALLBACK_MOUSE_DOWN, __option_header_url_layout_mouse_down_cb, this);
2862         }
2863
2864         return url_layout;
2865 }
2866
2867 Evas_Object *Browser_View::_get_activated_url_entry(void)
2868 {
2869         /* The edit field in option header url layout is only valid for edit. 
2870           * If the edit field in browser scroller can have focus, there is so many focus issue.
2871           * So just make the edit field in option header editable. */
2872         return m_option_header_url_edit_field;
2873 }
2874
2875 void Browser_View::__url_entry_imf_event_cb(void *data, Ecore_IMF_Context *ctx, int value)
2876 {
2877         BROWSER_LOGD("value=%d", value);
2878         if (!data)
2879                 return;
2880
2881         Browser_View *browser_view = (Browser_View *)data;
2882         if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
2883                 Evas_Object *edit_field_entry;
2884                 edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
2885                 elm_object_focus_set(edit_field_entry, EINA_FALSE);
2886
2887                 if (browser_view->m_edit_mode != BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF
2888                     && browser_view->m_edit_mode != BR_FIND_WORD_MODE)
2889                         browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2890                 else
2891                         return;
2892         } else if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW)
2893                 /* If the focus of url entry is set automatically, the keypad is also displayed automatically. */
2894                 /* eg. At url edit mode, lock the screen -> then unlock, the url entry will get focus. */
2895                 /* The keypad is also invoked, so set the edit mode. */
2896                 browser_view->_set_edit_mode(BR_URL_ENTRY_EDIT_MODE);
2897 }
2898
2899 void Browser_View::__url_entry_focus_out_cb(void *data, Evas *e, void *event_info)
2900 {
2901         BROWSER_LOGD("[%s]", __func__);
2902         if (!data)
2903                 return;
2904
2905         Browser_View *browser_view = (Browser_View *)data;
2906         Evas_Object *edit_field_entry;
2907         edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
2908
2909         Ecore_IMF_Context *ic = (Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry);
2910         if (!ic)
2911                 return;
2912
2913         ecore_imf_context_input_panel_hide(ic);
2914
2915         if (browser_view->m_edit_mode != BR_FIND_WORD_MODE)
2916                 browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
2917 }
2918
2919 void Browser_View::_set_edit_mode(edit_mode mode)
2920 {
2921         BROWSER_LOGD("mode = %d", mode);
2922
2923         if (m_edit_mode == mode)
2924                 return;
2925
2926 #if defined(FEATURE_MOST_VISITED_SITES)
2927         if (mode == BR_NO_EDIT_MODE) {
2928                 if (m_most_visited_sites) {
2929                         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,on,signal", "");
2930                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2931                                                                 "url_guide_text,on,signal", "");
2932                 }
2933         } else {
2934                 if (m_most_visited_sites) {
2935                         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "url_guide_text,off,signal", "");
2936                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2937                                                                 "url_guide_text,off,signal", "");
2938                 }
2939         }
2940 #endif
2941
2942         if (mode == BR_URL_ENTRY_EDIT_MODE || mode == BR_FIND_WORD_MODE
2943             || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
2944 #ifdef BROWSER_SCROLLER_BOUNCING
2945                 /* If edit mode, lock the browser scroller */
2946                 _enable_webview_scroll();
2947 #endif
2948                 /* Make the browser scroller region y = 0 to show url bar all at edit mode. */
2949                 int scroller_x = 0;
2950                 int scroller_w = 0;
2951                 int scroller_h = 0;
2952                 elm_scroller_region_get(m_scroller, &scroller_x, NULL, &scroller_w, &scroller_h);
2953                 elm_scroller_region_show(m_scroller ,scroller_x, 0, scroller_w, scroller_h);
2954         }
2955
2956         if (mode == BR_URL_ENTRY_EDIT_MODE) {
2957                 /* change layout of url layout for edit mode. */
2958                 edje_object_signal_emit(elm_layout_edje_get(m_url_layout), "edit,url,on,signal", "");
2959                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2960                                         "edit,url,on,signal", "");
2961
2962                 /* change refresh icon in url entry for edit mode. */
2963                 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "edit,url,on,signal", "");
2964                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2965                                         "edit,url,on,signal", "");
2966
2967                 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "hide,favicon,signal", "");
2968                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2969                                                                                 "hide,favicon,signal", "");
2970                 edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
2971                                                                 "edit,url,on,signal", "");
2972         } else if (mode == BR_NO_EDIT_MODE || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
2973                 if (m_edit_mode == BR_FIND_WORD_MODE) {
2974                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_layout), "hide,find_word_layout,signal", "");
2975                         m_find_word->find_word("", Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
2976                 } else {
2977                         /* change layout of url layout for normal mode. */
2978                         edje_object_signal_emit(elm_layout_edje_get(m_url_layout), "edit,url,off,signal", "");
2979                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_layout),
2980                                                 "edit,url,off,signal", "");
2981
2982                         /* change refresh icon in url entry for normal mode. */
2983                         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "edit,url,off,signal", "");
2984                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2985                                                 "edit,url,off,signal", "");
2986
2987 #if defined(FEATURE_MOST_VISITED_SITES)
2988                         if (!is_most_visited_sites_running())
2989 #endif
2990                         {
2991                                 if (m_focused_window->m_favicon)
2992                                         edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout),
2993                                                                                         "show,favicon,signal", "");
2994                                 if (m_focused_window->m_option_header_favicon)
2995                                         edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
2996                                                                                         "show,favicon,signal", "");
2997                                 _set_secure_icon();
2998                         }
2999
3000                         edje_object_signal_emit(elm_layout_edje_get(m_main_layout),
3001                                                 "edit,url,off,signal", "");
3002                         if (_is_loading()) {
3003                                 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "loading,on,signal", "");
3004                                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
3005                                                         "loading,on,signal", "");
3006                         }
3007                 }
3008         } else if (mode == BR_FIND_WORD_MODE) {
3009                 Evas_Object *find_word_edit_field_entry = br_elm_editfield_entry_get(m_find_word_edit_field);
3010                 elm_entry_entry_set(find_word_edit_field_entry, "");
3011
3012                 evas_object_smart_callback_del(find_word_edit_field_entry, "changed", __find_word_entry_changed_cb);
3013                 evas_object_smart_callback_add(find_word_edit_field_entry, "changed", __find_word_entry_changed_cb, this);
3014
3015                 edje_object_signal_emit(elm_layout_edje_get(m_option_header_layout), "show,find_word_layout,signal", "");
3016         }
3017
3018         m_edit_mode = mode;
3019
3020         /* To show favicon, if click url entry while loading, then cancel case. */
3021         _set_favicon();
3022 }
3023
3024 /* Workaround
3025   * The url entry of option header can't be focusable in case of switch TEXTBLOCK & elm entry.
3026   * So focus the url entry in idler callback.
3027   */
3028 static Eina_Bool __url_entry_focus_idler_cb(void *data)
3029 {
3030         Evas_Object *edit_field = (Evas_Object *)data;
3031         elm_object_focus_set(edit_field, EINA_TRUE);
3032
3033         Evas_Object *entry = br_elm_editfield_entry_get(edit_field);
3034         elm_entry_cursor_end_set(entry);
3035
3036         return ECORE_CALLBACK_CANCEL;
3037 }
3038
3039 void Browser_View::__url_entry_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
3040 {
3041         BROWSER_LOGD("[%s]", __func__);
3042         if (!data)
3043                 return;
3044
3045         Browser_View *browser_view = (Browser_View *)data;
3046
3047         if (browser_view->_is_loading())
3048                 browser_view->_stop_loading();
3049
3050         if (!browser_view->_navigationbar_visible_get()) {
3051                 /* The edit field in option header is only for edit url. */
3052                 browser_view->_navigationbar_visible_set_signal(EINA_TRUE);
3053         }
3054
3055         browser_view->_destroy_more_context_popup();
3056
3057         edit_mode mode = browser_view->_get_edit_mode();
3058
3059         browser_view->_set_edit_mode(BR_URL_ENTRY_EDIT_MODE);
3060
3061         if (mode == BR_NO_EDIT_MODE) {
3062                 Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field);
3063
3064                 elm_object_focus_set(browser_view->m_option_header_url_edit_field, EINA_TRUE);
3065                 elm_entry_cursor_end_set(entry);
3066
3067 //              ecore_idler_add(__url_entry_focus_idler_cb, browser_view->m_option_header_url_edit_field);
3068         }
3069 }
3070
3071 Eina_Bool Browser_View::_is_option_header_expanded(void)
3072 {
3073         return _navigationbar_visible_get();
3074 }
3075
3076 void Browser_View::__cancel_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3077 {
3078         BROWSER_LOGD("[%s]", __func__);
3079         if (!data)
3080                 return;
3081
3082         Browser_View *browser_view = (Browser_View *)data;
3083         Evas_Object *ewk_view = browser_view->m_focused_window->m_ewk_view;
3084         if (!ewk_view)
3085                 return;
3086
3087         browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
3088
3089         elm_object_signal_emit(browser_view->m_option_header_url_edit_field, "ellipsis_show,signal", "elm");
3090         elm_object_signal_emit(browser_view->m_url_edit_field, "ellipsis_show,signal", "elm");
3091
3092         browser_view->_set_url_entry(browser_view->get_url().c_str());
3093 }
3094
3095 void Browser_View::__refresh_button_clicked_cb(void *data, Evas_Object *obj,
3096                                                 const char *emission, const char *source)
3097 {
3098         BROWSER_LOGD("[%s]", __func__);
3099         if (!data)
3100                 return;
3101
3102         Browser_View *browser_view = (Browser_View *)data;
3103         if (browser_view->_get_edit_mode() == BR_URL_ENTRY_EDIT_MODE) {
3104                 elm_entry_entry_set(br_elm_editfield_entry_get(browser_view->m_url_edit_field), "");
3105                 elm_entry_entry_set(br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field), "");
3106         } else if(browser_view->_is_loading())
3107                 browser_view->_stop_loading();
3108         else
3109                 browser_view->_reload();
3110 }
3111
3112 void Browser_View::__url_entry_enter_key_cb(void *data, Evas_Object *obj, void *event_info)
3113 {
3114         BROWSER_LOGD("[%s]", __func__);
3115         if (!data)
3116                 return;
3117
3118         Browser_View *browser_view = (Browser_View *)data;
3119         Evas_Object *ewk_view = browser_view->m_focused_window->m_ewk_view;
3120         Evas_Object *edit_field_entry;
3121         edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
3122
3123         /* Workaround.
3124           * Give focus to option header cancel button to hide imf. */
3125         elm_object_focus_set(browser_view->m_option_header_cancel_button, EINA_TRUE);
3126
3127         char *url = elm_entry_markup_to_utf8(elm_entry_entry_get(edit_field_entry));
3128         BROWSER_LOGD("input url = [%s]", url);
3129
3130         if (url && strlen(url)) {
3131                 browser_view->load_url(url);
3132                 free(url);
3133         }
3134 }
3135
3136
3137 void Browser_View::__url_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
3138 {
3139         BROWSER_LOGD("[%s]", __func__);
3140 }
3141
3142 void Browser_View::__url_layout_mouse_down_cb(void *data, Evas* evas, Evas_Object *obj,
3143                                                                                 void *event_info)
3144 {
3145         BROWSER_LOGD("[%s]", __func__);
3146         if (!data)
3147                 return;
3148
3149         Evas_Event_Mouse_Down event = *(Evas_Event_Mouse_Down *)event_info;
3150
3151         Browser_View *browser_view = (Browser_View *)data;
3152
3153         Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_url_edit_field);
3154
3155         int entry_x = 0;
3156         int entry_y = 0;
3157         int entry_w = 0;
3158         int entry_h = 0;
3159         evas_object_geometry_get(browser_view->m_url_edit_field, &entry_x, &entry_y, &entry_w, &entry_h);
3160
3161         if (event.output.x > entry_x && event.output.x < entry_x + entry_w &&
3162             event.output.y > entry_y && event.output.y < entry_y + entry_h) {
3163                 elm_object_signal_emit(browser_view->m_option_header_url_edit_field, "ellipsis_hide,signal", "elm");
3164                 elm_object_signal_emit(browser_view->m_url_edit_field, "ellipsis_hide,signal", "elm");
3165         }
3166
3167         edit_mode mode = browser_view->_get_edit_mode();
3168         if (mode == BR_URL_ENTRY_EDIT_MODE || mode == BR_FIND_WORD_MODE
3169                     || mode == BR_URL_ENTRY_EDIT_MODE_WITH_NO_IMF) {
3170 #ifdef BROWSER_SCROLLER_BOUNCING
3171                 BROWSER_LOGD("<< lock browser scroller >>");
3172                 elm_object_scroll_freeze_pop(browser_view->m_scroller);
3173                 elm_object_scroll_freeze_push(browser_view->m_scroller);
3174 #endif
3175         }
3176 }
3177
3178 void Browser_View::__option_header_url_layout_mouse_down_cb(void *data, Evas* evas, Evas_Object *obj,
3179                                                                                 void *event_info)
3180 {
3181         BROWSER_LOGD("[%s]", __func__);
3182         if (!data)
3183                 return;
3184         Evas_Event_Mouse_Down event = *(Evas_Event_Mouse_Down *)event_info;
3185         Browser_View *browser_view = (Browser_View *)data;
3186
3187         Evas_Object *entry = br_elm_editfield_entry_get(browser_view->m_option_header_url_edit_field);
3188
3189         int entry_x = 0;
3190         int entry_y = 0;
3191         int entry_w = 0;
3192         int entry_h = 0;
3193         evas_object_geometry_get(browser_view->m_option_header_url_edit_field, &entry_x, &entry_y, &entry_w, &entry_h);
3194
3195         if (event.output.x > entry_x && event.output.x < entry_x + entry_w &&
3196             event.output.y > entry_y && event.output.y < entry_y + entry_h) {
3197                 elm_object_signal_emit(browser_view->m_option_header_url_edit_field, "ellipsis_hide,signal", "elm");
3198                 elm_object_signal_emit(browser_view->m_url_edit_field, "ellipsis_hide,signal", "elm");
3199         }
3200
3201         int icon_y = 0;
3202         if (event.output.y < icon_y)
3203                 browser_view->_jump_to_top();
3204 }
3205
3206 void Browser_View::_update_back_forward_buttons(void)
3207 {
3208         BROWSER_LOGD("[%s]", __func__);
3209         if (ewk_view_back_possible(m_focused_window->m_ewk_view)) {
3210                 elm_object_disabled_set(m_title_backward_button, EINA_FALSE);
3211                 elm_object_disabled_set(m_option_header_title_backward_button, EINA_FALSE);
3212         } else {
3213                 elm_object_disabled_set(m_title_backward_button, EINA_TRUE);
3214                 elm_object_disabled_set(m_option_header_title_backward_button, EINA_TRUE);
3215         }
3216
3217         if (ewk_view_forward_possible(m_focused_window->m_ewk_view)) {
3218                 elm_object_disabled_set(m_title_forward_button, EINA_FALSE);
3219                 elm_object_disabled_set(m_option_header_title_forward_button, EINA_FALSE);
3220         } else {
3221                 elm_object_disabled_set(m_title_forward_button, EINA_TRUE);
3222                 elm_object_disabled_set(m_option_header_title_forward_button, EINA_TRUE);
3223         }
3224 }
3225
3226 void Browser_View::__backward_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3227 {
3228         BROWSER_LOGD("[%s]", __func__);
3229         if (!data)
3230                 return;
3231
3232         Browser_View *browser_view = (Browser_View *)data;
3233         ewk_view_back(browser_view->m_focused_window->m_ewk_view);
3234 }
3235
3236 void Browser_View::__forward_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3237 {
3238         BROWSER_LOGD("[%s]", __func__);
3239         if (!data)
3240                 return;
3241
3242         Browser_View *browser_view = (Browser_View *)data;
3243         ewk_view_forward(browser_view->m_focused_window->m_ewk_view);
3244 }
3245
3246 Evas_Object *Browser_View::_create_url_layout(void)
3247 {
3248         BROWSER_LOGD("[%s]", __func__);
3249         Evas_Object *url_layout;
3250         url_layout = elm_layout_add(m_navi_bar);
3251         if (url_layout) {
3252                 if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
3253                                         "browser/url_layout")) {
3254                         BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
3255                         return NULL;
3256                 }
3257                 evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, 0.0);
3258                 evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3259                 evas_object_show(url_layout);
3260
3261                 /* create url entry layout in url layout */
3262                 m_url_entry_layout = elm_layout_add(m_navi_bar);
3263                 if (!m_url_entry_layout) {
3264                         BROWSER_LOGE("elm_layout_add failed");
3265                         return NULL;
3266                 }
3267                 if (!elm_layout_file_set(m_url_entry_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
3268                                         "elm/browser/urlentry/default")) {
3269                         BROWSER_LOGE("Can not set layout theme[browser, urlentry, default]\n");
3270                         return NULL;
3271                 }
3272                 elm_object_part_content_set(url_layout, "elm.swallow.url", m_url_entry_layout);
3273                 evas_object_show(m_url_entry_layout);
3274
3275                 m_url_edit_field = br_elm_url_editfield_add(m_navi_bar);
3276                 if (!m_url_edit_field) {
3277                         BROWSER_LOGE("elm_editfield_add failed");
3278                         return NULL;
3279                 }
3280                 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.entry", m_url_edit_field);
3281 //              br_elm_editfield_entry_single_line_set(m_url_edit_field, EINA_TRUE);
3282                 br_elm_editfield_eraser_set(m_url_edit_field, EINA_FALSE);
3283
3284                 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(m_url_edit_field);
3285                 elm_entry_editable_set(edit_field_entry, EINA_FALSE);
3286                 /* The edit field in browser scroller is only for display.
3287                   * The edit url is only supported in option header url entry. */
3288                 elm_object_focus_allow_set(m_url_edit_field, EINA_FALSE);
3289                 elm_object_focus_allow_set(edit_field_entry, EINA_FALSE);
3290                 elm_entry_input_panel_enabled_set(edit_field_entry, EINA_FALSE);
3291
3292                 elm_entry_text_style_user_push(edit_field_entry, "DEFAULT='font_size=35 color=#3C3632 ellipsis=1'");
3293                 evas_object_show(m_url_edit_field);
3294
3295                 edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "disable_entry,signal", "");
3296                 edje_object_signal_callback_add(elm_layout_edje_get(m_url_entry_layout), "mouse,clicked,1", "block_entry",
3297                                                 __url_entry_clicked_cb, this);
3298
3299                 edje_object_signal_callback_add(elm_layout_edje_get(m_url_entry_layout), "refresh_stop", "*",
3300                                                 __refresh_button_clicked_cb, this);             
3301
3302                 m_url_progressbar = elm_progressbar_add(m_navi_bar);
3303                 if (!m_url_progressbar) {
3304                         BROWSER_LOGE("elm_progressbar_add failed");
3305                         return NULL;
3306                 }
3307                 elm_object_style_set(m_url_progressbar, "browser/loading");
3308                 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.progressbar", m_url_progressbar);
3309                 elm_progressbar_value_set(m_url_progressbar, 0);
3310                 evas_object_show(m_url_progressbar);
3311
3312                 m_url_progresswheel = elm_progressbar_add(m_navi_bar);
3313                 if (!m_url_progresswheel) {
3314                         BROWSER_LOGE("elm_progressbar_add failed");
3315                         return NULL;
3316                 }
3317
3318                 elm_object_style_set(m_url_progresswheel, "UIActivityIndicatorStyleWhite");
3319                 elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
3320                 elm_object_part_content_set(m_url_entry_layout, "elm.swallow.progress", m_url_progresswheel);
3321                 evas_object_show(m_url_progresswheel);
3322
3323                 m_cancel_button = elm_button_add(m_navi_bar);
3324                 if (!m_cancel_button) {
3325                         BROWSER_LOGE("elm_button_add failed");
3326                         return NULL;
3327                 }
3328                 evas_object_size_hint_weight_set(m_cancel_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3329                 evas_object_size_hint_align_set(m_cancel_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
3330                 elm_object_style_set(m_cancel_button, "browser/cancel_button");
3331                 elm_object_text_set(m_cancel_button, BR_STRING_CANCEL);
3332                 elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_cancel_button);
3333                 evas_object_smart_callback_add(m_cancel_button, "clicked", __cancel_button_clicked_cb, this);
3334                 evas_object_show(m_cancel_button);
3335
3336                 m_title_backward_button = elm_button_add(m_navi_bar);
3337                 if (!m_title_backward_button) {
3338                         BROWSER_LOGE("elm_button_add failed");
3339                         return NULL;
3340                 }
3341                 elm_object_style_set(m_title_backward_button, "browser/backward");
3342                 elm_object_part_content_set(url_layout, "elm.swallow.backward_button", m_title_backward_button);
3343                 evas_object_smart_callback_add(m_title_backward_button, "clicked", __backward_button_clicked_cb, this);
3344                 elm_object_focus_allow_set(m_title_backward_button, EINA_FALSE);
3345                 evas_object_show(m_title_backward_button);
3346                 elm_object_disabled_set(m_title_backward_button, EINA_TRUE);
3347
3348                 m_title_forward_button = elm_button_add(m_navi_bar);
3349                 if (!m_title_forward_button) {
3350                         BROWSER_LOGE("elm_button_add failed");
3351                         return NULL;
3352                 }
3353                 elm_object_style_set(m_title_forward_button, "browser/forward");
3354                 elm_object_part_content_set(url_layout, "elm.swallow.forward_button", m_title_forward_button);
3355                 evas_object_smart_callback_add(m_title_forward_button, "clicked", __forward_button_clicked_cb, this);
3356                 elm_object_focus_allow_set(m_title_forward_button, EINA_FALSE);
3357                 evas_object_show(m_title_forward_button);
3358                 elm_object_disabled_set(m_title_forward_button, EINA_TRUE);
3359
3360                 /* Workaround.
3361                  * When edit mode, if scroll down on url layout in browser view,
3362                  * the browser can be scrolled even though scroll locked.
3363                  * So, lock the browser scroller whenever touch on it if edit mode.
3364                  */
3365                 evas_object_event_callback_add(url_layout, EVAS_CALLBACK_MOUSE_DOWN, __url_layout_mouse_down_cb, this);
3366         }
3367
3368         return url_layout;
3369 }
3370
3371 Evas_Object *Browser_View::_create_find_word_layout(void)
3372 {
3373         BROWSER_LOGD("[%s]", __func__);
3374         Evas_Object *url_layout = elm_layout_add(m_navi_bar);
3375         if (!url_layout) {
3376                 BROWSER_LOGE("elm_layout_add failed");
3377                 return NULL;
3378         }
3379         if (!elm_layout_file_set(url_layout, BROWSER_EDJE_DIR"/browser-view-find-word-layout.edj",
3380                 "browser-view/find_word_layout")) {
3381                 BROWSER_LOGE("Can not set layout theme[browser-view/find_word_layout]\n");
3382                 return NULL;
3383         }
3384         evas_object_size_hint_weight_set(url_layout, EVAS_HINT_EXPAND, 0.0);
3385         evas_object_size_hint_align_set(url_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3386         evas_object_show(url_layout);
3387
3388         /* create url entry layout in url layout */
3389         m_find_word_entry_layout = elm_layout_add(m_navi_bar);
3390         if (!m_find_word_entry_layout) {
3391                 BROWSER_LOGE("elm_layout_add failed");
3392                 return NULL;
3393         }
3394         if (!elm_layout_file_set(m_find_word_entry_layout, BROWSER_EDJE_DIR"/browser-view-find-word-layout.edj",
3395                                 "browser-view/find_word_editfield_layout")) {
3396                 BROWSER_LOGE("browser-view/find_word_editfield_layout failed");
3397                 return NULL;
3398         }
3399         elm_object_part_content_set(url_layout, "elm.swallow.url", m_find_word_entry_layout);
3400         evas_object_show(m_find_word_entry_layout);
3401
3402         edje_object_part_text_set(elm_layout_edje_get(url_layout), "title_text", BR_STRING_FIND_ON_PAGE);
3403
3404         m_find_word_edit_field = br_elm_find_word_editfield_add(m_navi_bar);
3405         if (!m_find_word_edit_field) {
3406                 BROWSER_LOGE("elm_editfield_add failed");
3407                 return NULL;
3408         }
3409         elm_object_part_content_set(m_find_word_entry_layout, "elm.swallow.entry", m_find_word_edit_field);
3410         evas_object_show(m_find_word_edit_field);
3411
3412         edje_object_signal_emit(elm_layout_edje_get(m_find_word_edit_field), "find_word,signal", "elm");
3413
3414 //      br_elm_editfield_entry_single_line_set(m_find_word_edit_field, EINA_TRUE);
3415         br_elm_editfield_eraser_set(m_find_word_edit_field, EINA_TRUE);
3416
3417         elm_object_signal_callback_add(m_find_word_edit_field, "elm,eraser,clicked", "elm",
3418                                                 __find_word_erase_button_clicked_cb, this);
3419
3420         Evas_Object *find_word_edit_field_entry = br_elm_editfield_entry_get(m_find_word_edit_field);
3421         elm_entry_entry_set(find_word_edit_field_entry, "");
3422         evas_object_smart_callback_add(find_word_edit_field_entry, "activated", __find_word_entry_enter_key_cb, this);
3423         elm_entry_input_panel_layout_set(find_word_edit_field_entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
3424         elm_entry_prediction_allow_set(find_word_edit_field_entry, EINA_FALSE);
3425         ecore_imf_context_input_panel_event_callback_add((Ecore_IMF_Context *)elm_entry_imf_context_get(find_word_edit_field_entry),
3426                         ECORE_IMF_INPUT_PANEL_STATE_EVENT, __find_word_entry_imf_event_cb, this);
3427         elm_entry_text_style_user_push(find_word_edit_field_entry, "DEFAULT='font_size=35 color=#3C363 2 ellipsis=1'");
3428         evas_object_show(m_find_word_edit_field);
3429
3430         m_find_word_cancel_button = elm_button_add(m_navi_bar);
3431         if (!m_find_word_cancel_button) {
3432                 BROWSER_LOGE("elm_button_add failed");
3433                 return NULL;
3434         }
3435         elm_object_style_set(m_find_word_cancel_button, "browser/cancel_button");
3436         elm_object_text_set(m_find_word_cancel_button, BR_STRING_CANCEL);
3437         elm_object_part_content_set(url_layout, "elm.swallow.cancel", m_find_word_cancel_button);
3438         evas_object_show(m_find_word_cancel_button);
3439
3440         evas_object_smart_callback_add(m_find_word_cancel_button, "clicked", __find_word_cancel_button_clicked_cb, this);
3441
3442         m_find_word_prev_button = elm_button_add(m_navi_bar);
3443         if (!m_find_word_prev_button) {
3444                 BROWSER_LOGE("elm_button_add failed");
3445                 return NULL;
3446         }
3447         elm_object_style_set(m_find_word_prev_button, "browser/find_word_prev_but");
3448         elm_object_part_content_set(url_layout, "elm.swallow.find_word_prev", m_find_word_prev_button);
3449         evas_object_show(m_find_word_prev_button);
3450         evas_object_smart_callback_add(m_find_word_prev_button, "clicked", __find_word_prev_button_clicked_cb, this);
3451
3452         m_find_word_next_button = elm_button_add(m_navi_bar);
3453         if (!m_find_word_next_button) {
3454                 BROWSER_LOGE("elm_button_add failed");
3455                 return NULL;
3456         }
3457         elm_object_style_set(m_find_word_next_button, "browser/find_word_next_but");
3458         elm_object_part_content_set(url_layout, "elm.swallow.find_word_next", m_find_word_next_button);
3459         evas_object_show(m_find_word_next_button);
3460         evas_object_smart_callback_add(m_find_word_next_button, "clicked", __find_word_next_button_clicked_cb, this);
3461
3462         const char *current_theme = elm_theme_get(NULL);
3463         if (current_theme && strstr(current_theme, "white")) {
3464         } else {
3465 //              edje_object_signal_emit(elm_layout_edje_get(m_find_word_entry_layout),
3466 //                                                                      "black_theme,signal", "");
3467         }
3468
3469         return url_layout;
3470 }
3471
3472 void Browser_View::__find_word_erase_button_clicked_cb(void *data, Evas_Object *obj,
3473                                                                 const char *emission, const char *source)
3474 {
3475         BROWSER_LOGD("[%s]", __func__);
3476         Browser_View *browser_view = (Browser_View *)data;
3477         edje_object_part_text_set(elm_layout_edje_get(browser_view->m_option_header_find_word_layout), "elm.index_text", "0/0");
3478 }
3479
3480 void Browser_View::__find_word_cancel_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3481 {
3482         BROWSER_LOGD("[%s]", __func__);
3483         if (!data)
3484                 return;
3485
3486         Browser_View *browser_view = (Browser_View *)data;
3487         browser_view->_set_edit_mode(BR_NO_EDIT_MODE);
3488         browser_view->m_find_word->find_word("", Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3489 }
3490
3491 void Browser_View::__find_word_prev_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3492 {
3493         BROWSER_LOGD("[%s]", __func__);
3494         if (!data)
3495                 return;
3496
3497         Browser_View *browser_view = (Browser_View *)data;
3498         edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,control_bar,no_animation,signal", "");
3499         Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3500         const char *find_word = elm_entry_entry_get(edit_field_entry);
3501         if (!find_word || !strlen(find_word))
3502                 return;
3503
3504         int index = browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_BACKWARD);
3505         if (index == 1)
3506                 elm_object_focus_set(browser_view->m_find_word_cancel_button, EINA_TRUE);
3507 }
3508 void Browser_View::__find_word_next_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
3509 {
3510         BROWSER_LOGD("[%s]", __func__);
3511         if (!data)
3512                 return;
3513
3514         Browser_View *browser_view = (Browser_View *)data;
3515         edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,control_bar,no_animation,signal", "");
3516         Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3517         const char *find_word = elm_entry_entry_get(edit_field_entry);
3518         if (!find_word || !strlen(find_word))
3519                 return;
3520
3521         int index = browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3522         if (index == browser_view->m_find_word->get_match_max_value())
3523                 elm_object_focus_set(browser_view->m_find_word_cancel_button, EINA_TRUE);
3524 }
3525
3526 void Browser_View::__find_word_entry_imf_event_cb(void *data, Ecore_IMF_Context *ctx, int value)
3527 {
3528         BROWSER_LOGD("value=%d", value);
3529         if (!data)
3530                 return;
3531
3532         Browser_View *browser_view = (Browser_View *)data;
3533         Evas_Object *find_word_editfield_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3534
3535         if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE)
3536                 elm_object_focus_set(find_word_editfield_entry, EINA_FALSE);
3537         else
3538                 elm_object_focus_set(find_word_editfield_entry, EINA_TRUE);
3539 }
3540
3541 void Browser_View::_enable_browser_scroller_scroll(void)
3542 {
3543 #ifdef BROWSER_SCROLLER_BOUNCING
3544         if (!ewk_view_vertical_panning_hold_get(m_focused_window->m_ewk_view)
3545              && !_is_loading() && !m_is_full_screen) {
3546                 BROWSER_LOGD("<< unlock browser scroller, lock ewk view >>");
3547                 elm_object_scroll_freeze_pop(m_scroller);
3548                 ewk_view_vertical_panning_hold_set(m_focused_window->m_ewk_view, EINA_TRUE);
3549         }
3550 #endif
3551 }
3552
3553 void Browser_View::_enable_webview_scroll(void)
3554 {
3555 #ifdef BROWSER_SCROLLER_BOUNCING
3556         if (ewk_view_vertical_panning_hold_get(m_focused_window->m_ewk_view)) {
3557                 BROWSER_LOGD("<< lock browser scroller, unlock ewk view >>");
3558                 elm_object_scroll_freeze_pop(m_scroller);
3559                 elm_object_scroll_freeze_push(m_scroller);
3560                 ewk_view_vertical_panning_hold_set(m_focused_window->m_ewk_view, EINA_FALSE);
3561         }
3562 #endif
3563 }
3564
3565 void Browser_View::__find_word_entry_enter_key_cb(void *data, Evas_Object *obj, void *event_info)
3566 {
3567         BROWSER_LOGD("[%s]", __func__);
3568         if (!data)
3569                 return;
3570
3571         Browser_View *browser_view = (Browser_View *)data;
3572         edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,control_bar,no_animation,signal", "");
3573         Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3574         const char *find_word = elm_entry_entry_get(edit_field_entry);
3575         if (!find_word || !strlen(find_word))
3576                 return;
3577
3578         browser_view->m_find_word->init_index();
3579         browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3580
3581         elm_object_focus_set(edit_field_entry, EINA_FALSE);
3582         BROWSER_LOGD("find_word=[%s]", find_word);
3583 }
3584
3585 void Browser_View::__find_word_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
3586 {
3587         BROWSER_LOGD("[%s]", __func__);
3588         if (!data)
3589                 return;
3590
3591         Browser_View *browser_view = (Browser_View *)data;
3592         Evas_Object *edit_field_entry = br_elm_editfield_entry_get(browser_view->m_find_word_edit_field);
3593         const char *find_word = elm_entry_entry_get(edit_field_entry);
3594
3595         browser_view->m_find_word->init_index();
3596         browser_view->m_find_word->find_word(find_word, Browser_Find_Word::BROWSER_FIND_WORD_FORWARD);
3597 }
3598
3599
3600 void Browser_View::_navigationbar_title_clicked(void)
3601 {
3602         BROWSER_LOGD("[%s]", __func__);
3603         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
3604         Evas_Object *content = elm_object_item_content_get(top_it);
3605         if (content != m_main_layout)
3606                 return;
3607
3608         if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)
3609 #if defined(FEATURE_MOST_VISITED_SITES)
3610             || is_most_visited_sites_running()
3611 #endif
3612             || m_edit_mode != BR_NO_EDIT_MODE)
3613             return;
3614
3615         int scroller_x = 0;
3616         int scroller_y = 0;
3617         int scroller_w = 0;
3618         int scroller_h = 0;
3619         elm_scroller_region_get(m_scroller, &scroller_x, &scroller_y, &scroller_w, &scroller_h);
3620
3621         if (scroller_y == 0) {
3622                 /* scroller is on top, the url bar in scroller is fully being displayed.
3623                  * Then, just show/hide the tool bar. */
3624                 const char* state = edje_object_part_state_get(elm_layout_edje_get(m_main_layout),
3625                                                                 "elm.swallow.control_bar", NULL);
3626                 if(state && !strncmp(state, "default", strlen("default")))
3627                         edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "show,control_bar,signal", "");
3628                 else {
3629 #ifdef BROWSER_SCROLLER_BOUNCING
3630                         int url_layout_h = 0;
3631                         evas_object_geometry_get(m_url_layout, NULL, NULL, NULL, &url_layout_h);
3632                         elm_scroller_region_bring_in(m_scroller ,scroller_x, url_layout_h, scroller_w, scroller_h);
3633 #endif
3634                 }
3635         } else {
3636                 if (_is_loading()) {
3637                 } else {
3638                         Eina_Bool visible = _navigationbar_visible_get();
3639 #ifdef BROWSER_SCROLLER_BOUNCING
3640                         _navigationbar_visible_set(!visible);
3641 #endif
3642                 }
3643         }
3644 }
3645
3646
3647 void Browser_View::_jump_to_top(void)
3648 {
3649         BROWSER_LOGD("[%s]", __func__);
3650         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
3651         Evas_Object *content = elm_object_item_content_get(top_it);
3652         if (content != m_main_layout)
3653                 return;
3654
3655         if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)
3656 #if defined(FEATURE_MOST_VISITED_SITES)
3657             || is_most_visited_sites_running()
3658 #endif
3659             || m_edit_mode != BR_NO_EDIT_MODE)
3660                 return;
3661
3662         int browser_scroller_x = 0;
3663         int browser_scroller_w = 0;
3664         int browser_scroller_h = 0;
3665         elm_scroller_region_get(m_scroller, &browser_scroller_x, NULL,
3666                                 &browser_scroller_w, &browser_scroller_h);
3667         elm_scroller_region_show(m_scroller, browser_scroller_x, 0, browser_scroller_w, browser_scroller_h);
3668
3669         ewk_view_top_of_contents_go(m_focused_window->m_ewk_view);
3670 }
3671
3672 void Browser_View::delete_non_user_created_windows(void)
3673 {
3674         BROWSER_LOGD("[%s]", __func__);
3675         /* Delete no-backward history window. */
3676         std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3677         int window_count = window_list.size();
3678
3679         if (window_count <= 1)
3680                 return;
3681
3682         int i = 0;
3683         for (i = 0 ; i < window_count ; i++) {
3684                 BROWSER_LOGD("focusable_window = %d, window[%d]=%d", m_focused_window, i, window_list[i]);
3685                 if (window_list[i]->m_ewk_view
3686                      &&!ewk_view_back_possible(window_list[i]->m_ewk_view)
3687                      && window_list[i] != m_focused_window
3688                      && window_list[i]->m_created_by_user == EINA_FALSE) {
3689                         BROWSER_LOGD("delete window index=[%d]", i);
3690                         m_browser->delete_window(window_list[i]);
3691
3692                         /* Set title & url with the focused window. */
3693                         _set_navigationbar_title(get_title().c_str());
3694                         _set_url_entry(get_url().c_str());
3695                         _set_controlbar_back_forward_status();
3696                         if (!_set_favicon())
3697                                 BROWSER_LOGE("_set_favicon failed");
3698                 }
3699         }
3700 }
3701
3702 void Browser_View::__title_back_button_clicked_cb(void *data , Evas_Object *obj, void *event_info)
3703 {
3704         BROWSER_LOGD("[%s]", __func__);
3705         if (!data)
3706                 return;
3707
3708         if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
3709                 BROWSER_LOGD("close multi window");
3710                 m_data_manager->get_multi_window_view()->close_multi_window();
3711                 return;
3712         }
3713
3714         Browser_View *browser_view = (Browser_View *)data;
3715
3716         if (browser_view->m_focused_window->m_ewk_view
3717             && ewk_view_back_possible(browser_view->m_focused_window->m_ewk_view))
3718                 ewk_view_back(browser_view->m_focused_window->m_ewk_view);
3719         else {
3720                 if (browser_view->m_focused_window->m_parent) {
3721                         /* Save current window pointer to delete later. */
3722                         Browser_Window *delete_window = browser_view->m_focused_window;
3723                         browser_view->m_browser->set_focused_window(browser_view->m_focused_window->m_parent);
3724                         browser_view->m_browser->delete_window(delete_window);
3725
3726                         /* Set title & url with the focused window. */
3727                         browser_view->_set_navigationbar_title(browser_view->get_title().c_str());
3728                         browser_view->_set_url_entry(browser_view->get_url().c_str());
3729                         browser_view->_set_controlbar_back_forward_status();
3730                         if (!browser_view->_set_favicon())
3731                                 BROWSER_LOGE("_set_favicon failed");
3732                 } else {
3733                         elm_win_lower(browser_view->m_win);
3734
3735                         browser_view->delete_non_user_created_windows();
3736                 }
3737         }
3738 }
3739
3740 void Browser_View::__scroller_scroll_cb(void *data, Evas_Object *obj, void *event_info)
3741 {
3742 #ifdef BROWSER_SCROLLER_BOUNCING
3743         if (!data)
3744                 return;
3745
3746         Browser_View *browser_view = (Browser_View *)data;
3747
3748         int browser_scroller_x = 0;
3749         int browser_scroller_y = 0;
3750         int browser_scroller_w = 0;
3751         int browser_scroller_h = 0;
3752         elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, &browser_scroller_y,
3753                                 &browser_scroller_w, &browser_scroller_h);
3754
3755         int url_layout_h = 0;
3756         evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
3757
3758         /* Workaround.
3759          * If user scrolls up/down near the url bar edge, the movement of scroller is not smooth.
3760          * It's because the browser scroller region y is also bouncing.
3761          * So if the scroller region y is bigger than the height of url bar(65 pixel),
3762          * make the region y to url bar height by force. */
3763         if (browser_scroller_y > url_layout_h)
3764                 elm_scroller_region_show(browser_view->m_scroller, browser_scroller_x, url_layout_h,
3765                                         browser_scroller_w, browser_scroller_h);
3766 #endif
3767 }
3768
3769 Eina_Bool Browser_View::_is_loading(void)
3770 {
3771         if (!m_focused_window || !m_focused_window->m_ewk_view)
3772                 return EINA_FALSE;
3773
3774         double progress = ewk_view_load_progress_get(m_focused_window->m_ewk_view);
3775 //      BROWSER_LOGD("progress=%f", progress);
3776         if (progress == 1.0f || progress < 0.05f)
3777                 return EINA_FALSE;
3778         else
3779                 return EINA_TRUE;
3780 }
3781
3782 #if defined(HORIZONTAL_UI)
3783 Eina_Bool Browser_View::is_available_to_rotate(void)
3784 {
3785         BROWSER_LOGD("\n");
3786         if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
3787                 if (m_data_manager->get_multi_window_view()->is_reordering_mode())
3788                         return EINA_FALSE;
3789         }
3790
3791         if (m_scissorbox_view)
3792                 return EINA_FALSE;
3793
3794         return EINA_TRUE;
3795 }
3796
3797 Eina_Bool Browser_View::__rotate_multi_window_cb(void *data)
3798 {
3799         BROWSER_LOGD("[%s]", __func__);
3800         Browser_View *browser_view = (Browser_View *)data;
3801         browser_view->m_multi_window_rotate_timer = NULL;
3802         browser_view->_rotate_multi_window();
3803
3804         return ECORE_CALLBACK_CANCEL;
3805 }
3806
3807 void Browser_View::rotate(int degree)
3808 {
3809         BROWSER_LOGD("\n");
3810         /* In landscape mode, if the url bar is not displayed -> rotate to portrait mode.
3811          * Then the url bar is displayed. To avoid this issue, remember the scroller region y,
3812          * then restore it at portrait mode. */
3813         int scroller_region_y = 0;
3814         elm_scroller_region_get(m_scroller, NULL, &scroller_region_y, NULL, NULL);
3815         m_scroller_region_y = scroller_region_y;
3816
3817         m_rotate_degree = degree;
3818
3819 #if defined(FEATURE_MOST_VISITED_SITES)
3820         if (m_most_visited_sites)
3821                 m_most_visited_sites->rotate();
3822 #endif
3823         if (m_scissorbox_view)
3824                 _destroy_scissorbox_view();
3825 }
3826 #endif
3827 void Browser_View::suspend_ewk_view(Evas_Object *ewk_view)
3828 {
3829         BROWSER_LOGD("[%s]", __func__);
3830
3831         std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3832         for (int i = 0 ; i < window_list.size() ; i++) {
3833                 if (window_list[i]->m_ewk_view_layout) {
3834                         edje_object_signal_emit(elm_layout_edje_get(window_list[i]->m_ewk_view_layout),
3835                                                                 "unresizable,signal", "");
3836
3837                 }
3838         }
3839
3840         ewk_view_suspend(ewk_view);
3841         ewk_view_visibility_set(ewk_view, EINA_FALSE);
3842 }
3843
3844 void Browser_View::resume_ewk_view(Evas_Object *ewk_view)
3845 {
3846         BROWSER_LOGD("[%s]", __func__);
3847
3848         if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW))
3849                 return;
3850
3851         ewk_view_resume(ewk_view);
3852         ewk_view_visibility_set(ewk_view, EINA_TRUE);
3853 }
3854
3855 void Browser_View::pause(void)
3856 {
3857         BROWSER_LOGD("[%s]", __func__);
3858         if (_is_loading()) {
3859                 /* Because the progress wheel in url bar has about 15% cpu consumption.
3860                   * So, pause the animation when browser goes to background. It's nonsense!*/
3861                 if (m_option_header_url_progresswheel)
3862                         elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_FALSE);
3863                 if (m_url_progresswheel)
3864                         elm_progressbar_pulse(m_url_progresswheel, EINA_FALSE);
3865         }
3866
3867         set_full_sreen(EINA_FALSE);
3868
3869         ug_pause();
3870
3871         suspend_ewk_view(m_focused_window->m_ewk_view);
3872
3873         /* stop vibration */
3874         _haptic_device_stop();
3875 }
3876
3877 void Browser_View::resume(void)
3878 {
3879         BROWSER_LOGD("[%s]", __func__);
3880         if (_is_loading()) {
3881                 /* Because the progress wheel in url bar has about 15% cpu consumption.
3882                   * So, pause the animation when browser goes to background. It's nonsense! */
3883                 if (m_option_header_url_progresswheel)
3884                         elm_progressbar_pulse(m_option_header_url_progresswheel, EINA_TRUE);
3885                 if (m_url_progresswheel)
3886                         elm_progressbar_pulse(m_url_progresswheel, EINA_TRUE);
3887         }
3888
3889         ug_resume();
3890
3891         resume_ewk_view(m_focused_window->m_ewk_view);
3892 }
3893
3894 void Browser_View::reset(void)
3895 {
3896         BROWSER_LOGD("[%s]", __func__);
3897         if (m_focused_window && m_focused_window->m_ewk_view)
3898                 resume();
3899 }
3900
3901 Eina_Bool Browser_View::__webview_layout_resize_idler_cb(void *data)
3902 {
3903         BROWSER_LOGD("\n");
3904         if (!data)
3905                 return ECORE_CALLBACK_CANCEL;
3906
3907         Browser_View *browser_view = (Browser_View *)data;
3908
3909         browser_view->m_resize_idler = NULL;
3910
3911         edje_object_signal_emit(elm_layout_edje_get(browser_view->m_focused_window->m_ewk_view_layout),
3912                                                 "resizable,signal", "");
3913
3914         int content_w = 0;
3915         int content_h = 0;
3916 #ifdef BROWSER_SCROLLER_BOUNCING        
3917         edje_object_part_geometry_get(elm_layout_edje_get(browser_view->m_main_layout),
3918                                 "elm.swallow.content", NULL, NULL, &content_w, &content_h);
3919 #else
3920         edje_object_part_geometry_get(elm_layout_edje_get(browser_view->m_focused_window->m_ewk_view_layout),
3921                                 "elm.swallow.webview", NULL, NULL, &content_w, &content_h);
3922 #endif
3923         if (browser_view->m_is_full_screen) {
3924                 int browser_scroller_y = 0;
3925                 evas_object_geometry_get(browser_view->m_scroller, NULL, &browser_scroller_y, NULL, NULL);
3926                 evas_object_resize(browser_view->m_focused_window->m_ewk_view,
3927                                         content_w, content_h + browser_scroller_y);
3928         } else {
3929                 evas_object_size_hint_min_set(browser_view->m_focused_window->m_ewk_view_layout,
3930                                         content_w, content_h);
3931                 evas_object_resize(browser_view->m_focused_window->m_ewk_view_layout,
3932                                         content_w, content_h);
3933         }
3934
3935         return ECORE_CALLBACK_CANCEL;
3936 }
3937
3938 Eina_Bool Browser_View::__scroller_bring_in_idler_cb(void *data)
3939 {
3940         BROWSER_LOGD("[%s]", __func__);
3941         if (!data)
3942                 return ECORE_CALLBACK_CANCEL;
3943         Browser_View *browser_view = (Browser_View *)data;
3944
3945         int url_layout_h = 0;
3946         evas_object_geometry_get(browser_view->m_url_layout, NULL, NULL, NULL, &url_layout_h);
3947
3948         BROWSER_LOGD("<< elm_scroller_region_bring_in , url_layout_h=%d >>", url_layout_h);
3949         int browser_scroller_x = 0;
3950         int browser_scroller_w = 0;
3951         int browser_scroller_h = 0;                     
3952         elm_scroller_region_get(browser_view->m_scroller, &browser_scroller_x, NULL,
3953                                         &browser_scroller_w, &browser_scroller_h);
3954         elm_scroller_region_show(browser_view->m_scroller, browser_scroller_x, url_layout_h,
3955                                         browser_scroller_w, browser_scroller_h);
3956
3957         return ECORE_CALLBACK_CANCEL;
3958 }
3959
3960 /* Workaround.
3961  * If user invokes the keypad via input field or url entry, resize the webview.
3962  * The only scroller resize is called when the keypad is launched.
3963  * Other elements like layout, conformant resize event doesn't come. */
3964 void Browser_View::__scroller_resize_cb(void* data, Evas* evas, Evas_Object* obj, void* ev)
3965 {
3966         BROWSER_LOGD("[%s]", __func__);
3967         if (!data)
3968                 return;
3969
3970         Browser_View *browser_view = (Browser_View *)data;
3971
3972         if (browser_view->m_is_full_screen) {
3973                 ecore_idler_add(__webview_layout_resize_idler_cb, browser_view);
3974                 return;
3975         }
3976
3977         int scroller_w = 0;
3978         int scroller_h = 0;
3979         evas_object_geometry_get(browser_view->m_scroller, NULL, NULL, &scroller_w, &scroller_h);
3980         std::vector<Browser_Window *> window_list = m_browser->get_window_list();
3981
3982         for (int i = 0 ; i < window_list.size() ; i++) {
3983                 if (window_list[i]->m_ewk_view_layout) {
3984                         edje_object_signal_emit(elm_layout_edje_get(window_list[i]->m_ewk_view_layout),
3985                                                                 "resizable,signal", "");
3986
3987                         evas_object_size_hint_min_set(window_list[i]->m_ewk_view_layout,
3988                                                                                 scroller_w, scroller_h);
3989                         evas_object_resize(window_list[i]->m_ewk_view_layout,
3990                                                                         scroller_w, scroller_h);
3991                 }
3992         }
3993
3994 #if defined(HORIZONTAL_UI)
3995         Evas_Object *edit_field_entry;
3996         edit_field_entry = br_elm_editfield_entry_get(browser_view->_get_activated_url_entry());
3997         Ecore_IMF_Context *ic = (Ecore_IMF_Context *)elm_entry_imf_context_get(edit_field_entry);
3998         /* If the keypad from webkit is invoked in landscape mode, the visible viewport is too narrow.
3999           * So, hide the url bar in browser scroller by bring in.
4000           * The direct bring in call doesn't work, so do it by idler. */
4001         if (ic && browser_view->is_landscape()) {
4002                 Ecore_IMF_Input_Panel_State imf_state = ecore_imf_context_input_panel_state_get(ic);
4003                 /* Strangley, The state of webkit's imf is show-state even if the ic is url entry.
4004                   * However, this is good for browser without webkit's ic get API. */
4005                 if (imf_state == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
4006                         browser_view->_enable_browser_scroller_scroll();
4007                         ecore_idler_add(__scroller_bring_in_idler_cb, browser_view);
4008                 }
4009         }
4010 #endif
4011
4012         if (m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
4013                 BROWSER_LOGD("close multi window");
4014                 browser_view->m_is_multi_window_grid_mode = m_data_manager->get_multi_window_view()->_is_grid_mode();
4015                 m_data_manager->get_multi_window_view()->close_multi_window();
4016
4017 #if defined(HORIZONTAL_UI)
4018                 if (browser_view->m_multi_window_rotate_timer)
4019                         ecore_timer_del(browser_view->m_multi_window_rotate_timer);
4020                 browser_view->m_multi_window_rotate_timer = ecore_timer_add(0.2, __rotate_multi_window_cb, browser_view);
4021 #endif
4022         }
4023 }
4024
4025
4026 #ifdef ZOOM_BUTTON
4027 Eina_Bool Browser_View::__zoom_button_timeout_cb(void *data)
4028 {
4029         BROWSER_LOGD("[%s]", __func__);
4030         if (!data)
4031                 return ECORE_CALLBACK_CANCEL;
4032
4033         Browser_View *browser_view = (Browser_View *)data;
4034         browser_view->m_zoom_button_timer = NULL;
4035
4036         edje_object_signal_emit(elm_layout_edje_get(browser_view->m_main_layout), "hide,zoom_buttons,signal", "");
4037
4038         return ECORE_CALLBACK_CANCEL;
4039 }
4040
4041 void Browser_View::__zoom_out_clicked_cb(void *data, Evas_Object *obj, void *event_info)
4042 {
4043         BROWSER_LOGD("[%s]", __func__);
4044         if (!data)
4045                 return;
4046
4047         Browser_View *browser_view = (Browser_View *)data;
4048         double scale_factor = ewk_view_scale_get(browser_view->m_focused_window->m_ewk_view);
4049         ewk_view_scale_set(browser_view->m_focused_window->m_ewk_view, scale_factor - 0.5f, 0, 0);
4050
4051         if (browser_view->m_zoom_button_timer)
4052                 ecore_timer_del(browser_view->m_zoom_button_timer);
4053         browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
4054 }
4055
4056 void Browser_View::__zoom_in_clicked_cb(void *data, Evas_Object *obj, void *event_info)
4057 {
4058         BROWSER_LOGD("[%s]", __func__);
4059         if (!data)
4060                 return;
4061
4062         Browser_View *browser_view = (Browser_View *)data;
4063         double scale_factor = ewk_view_scale_get(browser_view->m_focused_window->m_ewk_view);
4064         ewk_view_scale_set(browser_view->m_focused_window->m_ewk_view, scale_factor + 0.5f, 0, 0);
4065
4066         if (browser_view->m_zoom_button_timer)
4067                 ecore_timer_del(browser_view->m_zoom_button_timer);
4068         browser_view->m_zoom_button_timer = ecore_timer_add(3, __zoom_button_timeout_cb, browser_view);
4069 }
4070
4071 Eina_Bool Browser_View::_create_zoom_buttons(void)
4072 {
4073         BROWSER_LOGD("[%s]", __func__);
4074         m_zoom_out_button = elm_button_add(m_navi_bar);
4075         if (!m_zoom_out_button) {
4076                 BROWSER_LOGE("elm_button_add failed");
4077                 return EINA_FALSE;
4078         }
4079         elm_object_style_set(m_zoom_out_button, "browser/zoom_out");
4080         elm_object_part_content_set(m_main_layout, "elm.swallow.zoom_out_button", m_zoom_out_button);
4081         evas_object_smart_callback_add(m_zoom_out_button, "clicked", __zoom_out_clicked_cb, this);
4082         evas_object_show(m_zoom_out_button);
4083
4084         m_zoom_in_button = elm_button_add(m_navi_bar);
4085         if (!m_zoom_in_button) {
4086                 BROWSER_LOGE("elm_button_add failed");
4087                 return EINA_FALSE;
4088         }
4089
4090         elm_object_style_set(m_zoom_in_button, "browser/zoom_in");
4091         elm_object_part_content_set(m_main_layout, "elm.swallow.zoom_in_button", m_zoom_in_button);
4092         evas_object_smart_callback_add(m_zoom_in_button, "clicked", __zoom_in_clicked_cb, this);
4093         evas_object_show(m_zoom_in_button);
4094
4095         return EINA_TRUE;
4096 }
4097 #endif
4098
4099 void Browser_View::__naviframe_pop_finished_cb(void *data , Evas_Object *obj, void *event_info)
4100 {
4101         BROWSER_LOGD("[%s]", __func__);
4102         if (!data)
4103                 return;
4104
4105         Browser_View *browser_view = (Browser_View *)data;
4106         Elm_Object_Item *it = (Elm_Object_Item *)event_info;
4107
4108         if (browser_view->m_navi_it != elm_naviframe_top_item_get(m_navi_bar))
4109                 return;
4110
4111         m_data_manager->destroy_bookmark_view();
4112         m_data_manager->destroy_history_layout();
4113         /* Add to bookmark, then cancel. */
4114         m_data_manager->destroy_add_to_bookmark_view();
4115 #if defined(FEATURE_MOST_VISITED_SITES)
4116         m_data_manager->destroy_add_to_most_visited_sites_view();
4117 #endif
4118
4119         /* If return from browser settings. */
4120         if (browser_view->m_browser_settings) {
4121                 delete browser_view->m_browser_settings;
4122                 browser_view->m_browser_settings = NULL;
4123         }
4124 }
4125
4126 void Browser_View::__dim_area_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
4127 {
4128         BROWSER_LOGD("[%s]", __func__);
4129         if (!data)
4130                 return;
4131
4132         Browser_View *browser_view = (Browser_View *)data;
4133
4134         elm_object_focus_set(m_data_manager->get_browser_view()->m_option_header_cancel_button, EINA_TRUE);
4135 }
4136
4137 void Browser_View::__context_menu_bg_mouse_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
4138 {
4139         BROWSER_LOGD("[%s]", __func__);
4140         if (!data)
4141                 return;
4142
4143         Browser_View *browser_view = (Browser_View *)data;
4144
4145         browser_view->_destroy_more_context_popup();
4146 }
4147
4148 Eina_Bool Browser_View::_create_main_layout(void)
4149 {
4150         BROWSER_LOGD("[%s]", __func__);
4151         m_main_layout = elm_layout_add(m_navi_bar);
4152         if (!m_main_layout) {
4153                 BROWSER_LOGE("elm_layout_add failed!");
4154                 return EINA_FALSE;
4155         }
4156
4157         if (!elm_layout_file_set(m_main_layout, BROWSER_EDJE_DIR"/browser-view-main.edj",
4158                                 "browser/browser-view-main")) {
4159                 BROWSER_LOGE("elm_layout_file_set failed", BROWSER_EDJE_DIR);
4160                 return EINA_FALSE;
4161         }
4162
4163         evas_object_size_hint_weight_set(m_main_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4164         evas_object_size_hint_align_set(m_main_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
4165         evas_object_show(m_main_layout);
4166
4167         m_title_back_button = elm_button_add(m_navi_bar);
4168         if (!m_title_back_button) {
4169                 BROWSER_LOGE("elm_button_add failed!");
4170                 return EINA_FALSE;
4171         }
4172         evas_object_smart_callback_add(m_title_back_button, "clicked", __title_back_button_clicked_cb, this);
4173
4174         m_navi_it = elm_naviframe_item_push(m_navi_bar, "", NULL, NULL, m_main_layout, NULL);
4175
4176         evas_object_smart_callback_add(m_navi_bar, "transition,finished", __naviframe_pop_finished_cb, this);
4177
4178         elm_object_style_set(m_title_back_button, "browser/title_back");
4179         elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_TITLE_LEFT_BTN, m_title_back_button);
4180
4181         evas_object_show(m_title_back_button);
4182         evas_object_show(m_navi_bar);
4183
4184         m_scroller = elm_scroller_add(m_navi_bar);
4185         if (!m_scroller) {
4186                 BROWSER_LOGE("elm_scroller_add failed!");
4187                 return EINA_FALSE;
4188         }
4189         /* Do not propagate event to scroller's ancestor */
4190         /* not to call unnecessary other callbacks. */
4191         evas_object_propagate_events_set(m_scroller, EINA_FALSE);
4192
4193         /* Do not use scroller's scrollbar, use webview's scrollbar instead */
4194         elm_scroller_policy_set(m_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
4195         evas_object_size_hint_align_set(m_scroller, EVAS_HINT_FILL, 0.0);
4196         evas_object_size_hint_weight_set(m_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4197 #ifdef BROWSER_SCROLLER_BOUNCING
4198 //      elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_TRUE);
4199         elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_FALSE);
4200 #else
4201         elm_scroller_bounce_set(m_scroller, EINA_FALSE, EINA_FALSE);
4202         elm_object_scroll_freeze_pop(m_scroller);
4203         elm_object_scroll_freeze_push(m_scroller);
4204 #endif
4205         evas_object_show(m_scroller);
4206
4207         evas_object_smart_callback_add(m_scroller, "scroll", __scroller_scroll_cb, this);
4208         evas_object_event_callback_add(m_scroller, EVAS_CALLBACK_RESIZE, __scroller_resize_cb, this);
4209
4210         /* create content box which contains navigation layout & webview */
4211         m_content_box = elm_box_add(m_main_layout);
4212         if (!m_content_box) {
4213                 BROWSER_LOGE("elm_box_add failed!");
4214                 return EINA_FALSE;
4215         }
4216
4217         elm_box_horizontal_set(m_content_box, EINA_FALSE);
4218         evas_object_size_hint_weight_set(m_content_box, EVAS_HINT_EXPAND, 0.0);
4219         evas_object_size_hint_align_set(m_content_box, EVAS_HINT_FILL, EVAS_HINT_FILL);
4220         elm_object_content_set(m_scroller, m_content_box);
4221         evas_object_show(m_content_box);
4222
4223         /* create dummy loading progress bar which is displayed at launching time shortly */
4224         m_dummy_loading_progressbar = elm_progressbar_add(m_navi_bar);
4225         if (!m_dummy_loading_progressbar) {
4226                 BROWSER_LOGE("elm_progressbar_add failed!");
4227                 return EINA_FALSE;
4228         }
4229
4230         elm_object_style_set(m_dummy_loading_progressbar, "browser/loading_wheel");
4231         elm_progressbar_pulse(m_dummy_loading_progressbar, EINA_TRUE);
4232         evas_object_size_hint_weight_set(m_dummy_loading_progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4233         evas_object_size_hint_align_set(m_dummy_loading_progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
4234         elm_object_part_content_set(m_main_layout, "elm.swallow.waiting_progress", m_dummy_loading_progressbar);
4235         evas_object_show(m_dummy_loading_progressbar);
4236
4237         /* create conformant */
4238         elm_win_conformant_set(m_win, EINA_TRUE);
4239         m_conformant = elm_conformant_add(m_main_layout);
4240         if (!m_conformant) {
4241                 BROWSER_LOGE("elm_conformant_add failed!");
4242                 return EINA_FALSE;
4243         }
4244
4245         elm_object_style_set(m_conformant, "internal_layout");
4246         evas_object_size_hint_weight_set(m_conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4247         evas_object_size_hint_align_set(m_conformant, EVAS_HINT_FILL, EVAS_HINT_FILL);
4248         elm_object_content_set(m_conformant, m_scroller);
4249         elm_object_part_content_set(m_main_layout, "elm.swallow.content", m_conformant);
4250         evas_object_show(m_conformant);
4251
4252         m_url_layout = _create_url_layout();
4253         if (!m_url_layout) {
4254                 BROWSER_LOGE("_create_url_layout failed!");
4255                 return EINA_FALSE;
4256         }
4257         elm_box_pack_start(m_content_box, m_url_layout);
4258
4259         m_control_bar = _create_control_bar();
4260         if (!m_control_bar) {
4261                 BROWSER_LOGE("_create_control_bar failed!");
4262                 return EINA_FALSE;
4263         }
4264         elm_object_part_content_set(m_main_layout, "elm.swallow.control_bar", m_control_bar);
4265
4266         m_option_header_url_layout = _create_option_header_url_layout();
4267         if (!m_option_header_url_layout) {
4268                 BROWSER_LOGE("_create_option_header_url_layout failed!");
4269                 return EINA_FALSE;
4270         }
4271
4272         m_option_header_layout = elm_layout_add(m_navi_bar);
4273         if (!m_option_header_layout) {
4274                 BROWSER_LOGE("elm_layout_add failed!");
4275                 return EINA_FALSE;
4276         }
4277         if (!elm_layout_file_set(m_option_header_layout, BROWSER_EDJE_DIR"/browser-view-url-layout.edj",
4278                                 "browser-view/option_header")) {
4279                 BROWSER_LOGE("Can not set layout theme[browser/url_layout]\n");
4280                 return EINA_FALSE;
4281         }
4282         evas_object_size_hint_weight_set(m_option_header_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4283         evas_object_size_hint_align_set(m_option_header_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
4284
4285         elm_object_part_content_set(m_option_header_layout, "elm.swallow.url_layout", m_option_header_url_layout);
4286         evas_object_show(m_option_header_layout);
4287
4288         m_option_header_find_word_layout = _create_find_word_layout();
4289         if (!m_option_header_find_word_layout) {
4290                 BROWSER_LOGE("_create_find_word_layout failed");
4291                 return EINA_FALSE;
4292         }
4293         elm_object_part_content_set(m_option_header_layout, "elm.swallow.find_word_layout", m_option_header_find_word_layout);
4294
4295         elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_OPTIONHEADER, m_option_header_layout);
4296         _navigationbar_visible_set_signal(EINA_FALSE);
4297
4298 #ifdef ZOOM_BUTTON
4299         if (!_create_zoom_buttons()) {
4300                 BROWSER_LOGE("_create_zoom_buttons failed");
4301                 return EINA_FALSE;
4302         }
4303 #endif
4304
4305         edje_object_signal_callback_add(elm_layout_edje_get(m_main_layout),
4306                                         "mouse,clicked,1", "elm.rect.content_dim", __dim_area_clicked_cb, this);
4307
4308         edje_object_signal_callback_add(elm_layout_edje_get(m_main_layout),
4309                                         "mouse,down,1", "elm.rect.more_context_bg", __context_menu_bg_mouse_down_cb, this);
4310
4311         const char *current_theme = elm_theme_get(NULL);
4312         if (current_theme && strstr(current_theme, "white")) {
4313         } else {
4314 //              edje_object_signal_emit(elm_layout_edje_get(m_url_entry_layout), "black_theme,signal", "");
4315 //              edje_object_signal_emit(elm_layout_edje_get(m_option_header_url_entry_layout),
4316 //                                                                              "black_theme,signal", "");
4317         }
4318
4319         return EINA_TRUE;
4320 }
4321