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