[Title] Fix build error.
[profile/ivi/org.tizen.browser.git] / src / browser-class.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-class.h"
19 #include "browser-context-menu.h"
20 #include "browser-find-word.h"
21 #include "browser-geolocation.h"
22 #ifdef USE_META_TAG
23 #include "browser-meta-tag.h"
24 #endif
25 #include "browser-multi-window-view.h"
26 #include "browser-network-manager.h"
27 #include "browser-user-agent-db.h"
28 #include "browser-window.h"
29 #include "browser-policy-decision-maker.h"
30
31 Browser_Class::Browser_Class(Evas_Object *win, Evas_Object *navi_bar, Evas_Object *bg)
32 :
33         m_win(win)
34         ,m_navi_bar(navi_bar)
35         ,m_bg(bg)
36         ,m_browser_view(NULL)
37         ,m_focused_window(NULL)
38         ,m_user_agent_db(NULL)
39         ,m_download_policy(NULL)
40         ,m_clean_up_windows_timer(NULL)
41         ,m_geolocation(NULL)
42         ,m_network_manager(NULL)
43 {
44         m_window_list.clear();
45         BROWSER_LOGD("[%s]", __func__);
46 }
47
48 Browser_Class::~Browser_Class(void)
49 {
50         BROWSER_LOGD("[%s]", __func__);
51         if (m_browser_view)
52                 delete m_browser_view;
53         if (m_user_agent_db)
54                 delete m_user_agent_db;
55         if (m_download_policy)
56                 delete m_download_policy;
57         if (m_geolocation)
58                 delete m_geolocation;
59         if (m_network_manager)
60                 delete m_network_manager;
61
62         for (int i = 0 ; i < m_window_list.size() ; i++) {
63                 if (m_window_list[i])
64                         delete m_window_list[i];
65                 m_window_list.erase(m_window_list.begin() + i);
66         }
67
68         if (m_clean_up_windows_timer)
69                 ecore_timer_del(m_clean_up_windows_timer);
70 }
71
72 Eina_Bool Browser_Class::__create_network_manager_idler_cb(void *data)
73 {
74         Browser_Class *browser = (Browser_Class *)data;
75
76         browser->m_network_manager = new(nothrow) Browser_Network_Manager;
77         if (!browser->m_network_manager) {
78                 BROWSER_LOGE("new Browser_Network_Manager failed");
79                 return ECORE_CALLBACK_CANCEL;
80         }
81         if (!browser->m_network_manager->init(browser->m_browser_view)) {
82                 BROWSER_LOGE("m_network_manager->init failed");
83                 return ECORE_CALLBACK_CANCEL;
84         }
85
86         return ECORE_CALLBACK_CANCEL;
87 }
88
89 Eina_Bool Browser_Class::init(void)
90 {
91         BROWSER_LOGD("[%s]", __func__);
92         m_user_agent_db = new(nothrow) Browser_User_Agent_DB;
93         if (!m_user_agent_db) {
94                 BROWSER_LOGE("new Browser_User_Agent_DB failed");
95                 return EINA_FALSE;
96         }
97
98         m_browser_view = new(nothrow) Browser_View(m_win, m_navi_bar, m_bg, this);
99         /* Create browser view layout */
100         if (m_browser_view) {
101                 if (!m_browser_view->init()) {
102                         BROWSER_LOGE("m_browser_view->init failed");
103                         return EINA_FALSE;
104                 }
105         } else
106                 return EINA_FALSE;
107
108         m_download_policy = new(nothrow) Browser_Policy_Decision_Maker(m_navi_bar, m_browser_view);
109         if (!m_download_policy) {
110                 BROWSER_LOGE("new Browser_Policy_Decision_Maker failed");
111                 return EINA_FALSE;
112         }
113
114         m_geolocation = new(nothrow) Browser_Geolocation;
115         if (!m_geolocation) {
116                 BROWSER_LOGE("new Browser_Geolocation failed");
117                 return EINA_FALSE;
118         }
119
120         m_network_manager = new(nothrow) Browser_Network_Manager;
121         if (!m_network_manager) {
122                 BROWSER_LOGE("new Browser_Network_Manager failed");
123                 return EINA_FALSE;
124         }
125         if (!m_network_manager->init(m_browser_view)) {
126                 BROWSER_LOGE("m_network_manager->init failed");
127                 return EINA_FALSE;
128         }
129
130         if (!_set_ewk_view_options_listener()) {
131                 BROWSER_LOGE("_set_ewk_view_options_listener failed");
132                 return EINA_FALSE;
133         }
134
135
136         ewk_context_cache_model_set(ewk_context_default_get(), EWK_CACHE_MODEL_PRIMARY_WEBBROWSER);
137
138         return EINA_TRUE;
139 }
140
141 void Browser_Class::__preference_changed_cb(const char *key, void *data)
142 {
143         BROWSER_LOGD("[%s]", __func__);
144         if (!data)
145                 return;
146
147         Browser_Class *browser = (Browser_Class *)data;
148
149         if (!key || strlen(key) == 0) {
150                 BROWSER_LOGD("vconf_keynode_get_name failed");
151                 return;
152         }
153
154         if (!strncmp(key, DEFAULT_VIEW_LEVEL_KEY, strlen(DEFAULT_VIEW_LEVEL_KEY))) {
155                 for (int i = 0 ; i < browser->m_window_list.size() ; i++) {
156                         char *default_level = NULL;
157                         if (br_preference_get_str(DEFAULT_VIEW_LEVEL_KEY, &default_level) == false) {
158                                 BROWSER_LOGE("failed to get %s preference\n", DEFAULT_VIEW_LEVEL_KEY);
159                                 return;
160                         }
161                         if (default_level && browser->m_window_list[i]->m_ewk_view) {
162                                 Ewk_Setting *setting = ewk_view_setting_get(browser->m_window_list[i]->m_ewk_view);
163                                 if (!strncmp(default_level, FIT_TO_WIDTH, strlen(FIT_TO_WIDTH)))
164                                         ewk_setting_auto_fitting_set(setting, EINA_TRUE);
165                                 else
166                                         ewk_setting_auto_fitting_set(setting, EINA_FALSE);
167                                 free(default_level);
168                                 default_level = NULL;
169                         }
170                         if (default_level)
171                                 free(default_level);
172                 }
173         } else if (!strncmp(key, RUN_JAVASCRIPT_KEY, strlen(RUN_JAVASCRIPT_KEY))) {
174                 for (int i = 0 ; i < browser->m_window_list.size() ; i++) {
175                         if (browser->m_window_list[i]->m_ewk_view) {
176                                 Ewk_Setting *setting = ewk_view_setting_get(browser->m_window_list[i]->m_ewk_view);
177                                 bool run_javascript = 1;
178                                 br_preference_get_bool(RUN_JAVASCRIPT_KEY, &run_javascript);
179                                 if (run_javascript)
180                                         ewk_setting_enable_scripts_set(setting, EINA_TRUE);
181                                 else
182                                         ewk_setting_enable_scripts_set(setting, EINA_FALSE);
183                         }
184                 }
185         } else if (!strncmp(key, DISPLAY_IMAGES_KEY, strlen(DISPLAY_IMAGES_KEY))) {
186                 for (int i = 0 ; i < browser->m_window_list.size() ; i++) {
187                         if (browser->m_window_list[i]->m_ewk_view) {
188                                 Ewk_Setting *setting = ewk_view_setting_get(browser->m_window_list[i]->m_ewk_view);
189                                 bool display_images = 1;
190                                 br_preference_get_bool(DISPLAY_IMAGES_KEY, &display_images);
191                                 if (display_images)
192                                         ewk_setting_auto_load_images_set(setting, EINA_TRUE);
193                                 else
194                                         ewk_setting_auto_load_images_set(setting, EINA_FALSE);
195                         }
196                 }
197         } else if (!strncmp(key, ACCEPT_COOKIES_KEY, strlen(ACCEPT_COOKIES_KEY))) {
198                 bool accept_cookies = 1;
199                 br_preference_get_bool(ACCEPT_COOKIES_KEY, &accept_cookies);
200                 if (accept_cookies)
201                         ewk_context_cookies_policy_set(ewk_context_default_get(), EWK_COOKIE_JAR_ACCEPT_ALWAYS);
202                 else
203                         ewk_context_cookies_policy_set(ewk_context_default_get(), EWK_COOKIE_JAR_ACCEPT_NEVER);
204         } else if (!strncmp(key, BLOCK_POPUP_KEY, strlen(BLOCK_POPUP_KEY))) {
205                 for (int i = 0 ; i < browser->m_window_list.size() ; i++) {
206                         if (browser->m_window_list[i]->m_ewk_view) {
207                                 Ewk_Setting *setting = ewk_view_setting_get(browser->m_window_list[i]->m_ewk_view);
208                                 bool block_popup = 0;
209                                 br_preference_get_bool(BLOCK_POPUP_KEY, &block_popup);
210                                 if (block_popup)
211                                         ewk_setting_scripts_window_open_set(setting, EINA_FALSE);
212                                 else
213                                         ewk_setting_scripts_window_open_set(setting, EINA_TRUE);
214                         }
215                 }
216         } else if (!strncmp(key, SHOW_SECURITY_WARNINGS_KEY, strlen(SHOW_SECURITY_WARNINGS_KEY))) {
217                         bool security_warnings = 1;
218                         br_preference_get_bool(SHOW_SECURITY_WARNINGS_KEY, &security_warnings);
219         }
220 }
221
222 void Browser_Class::__vconf_changed_cb(keynode_t *keynode, void *data)
223 {
224         BROWSER_LOGD("[%s]", __func__);
225         if (!data)
226                 return;
227
228         Browser_Class *browser = (Browser_Class *)data;
229         char *key = vconf_keynode_get_name(keynode);
230
231         if (!key || strlen(key) == 0) {
232                 BROWSER_LOGD("vconf_keynode_get_name failed");
233                 return;
234         }
235
236         if (!strncmp(key, USERAGENT_KEY, strlen(USERAGENT_KEY))) {
237                 for (int i = 0 ; i < browser->m_window_list.size() ; i++) {
238                         if (browser->m_window_list[i]->m_ewk_view) {
239                                 if (!browser->_set_user_agent(browser->m_window_list[i]->m_ewk_view))
240                                         BROWSER_LOGE("_set_user_agent failed");
241                         }
242                 }
243         }
244 }
245
246 Eina_Bool Browser_Class::_set_ewk_view_options_listener(void)
247 {
248         BROWSER_LOGD("[%s]", __func__);
249         if (vconf_notify_key_changed(USERAGENT_KEY, __vconf_changed_cb, this) < 0) {
250                 BROWSER_LOGE("user agent vconf_notify_key_changed failed");
251                 return EINA_FALSE;
252         }
253
254         if (br_preference_set_changed_cb(DEFAULT_VIEW_LEVEL_KEY, __preference_changed_cb, this) < 0) {
255                 BROWSER_LOGE("default view level br_preference_set_changed_cb failed");
256                 return EINA_FALSE;
257         }
258         if (br_preference_set_changed_cb(RUN_JAVASCRIPT_KEY, __preference_changed_cb, this) < 0) {
259                 BROWSER_LOGE("run javascript level br_preference_set_changed_cb failed");
260                 return EINA_FALSE;
261         }
262         if (br_preference_set_changed_cb(DISPLAY_IMAGES_KEY, __preference_changed_cb, this) < 0) {
263                 BROWSER_LOGE("display images level br_preference_set_changed_cb failed");
264                 return EINA_FALSE;
265         }
266         if (br_preference_set_changed_cb(ACCEPT_COOKIES_KEY, __preference_changed_cb, this) < 0) {
267                 BROWSER_LOGE("accept cookie br_preference_set_changed_cb failed");
268                 return EINA_FALSE;
269         }
270         if (!br_preference_set_changed_cb(BLOCK_POPUP_KEY, __preference_changed_cb, this)) {
271                 BROWSER_LOGE("BLOCK_POPUP_KEY vconf_notify_key_changed failed");
272                 return EINA_FALSE;
273         }
274         if (!br_preference_set_changed_cb(SHOW_SECURITY_WARNINGS_KEY, __preference_changed_cb, this)) {
275                 BROWSER_LOGE("SHOW_SECURITY_WARNINGS_KEY vconf_notify_key_changed failed");
276                 return EINA_FALSE;
277         }
278         return EINA_TRUE;
279 }
280
281 Eina_Bool Browser_Class::_set_ewk_view_options(Evas_Object *ewk_view)
282 {
283         BROWSER_LOGD("[%s]", __func__);
284
285         if (!_set_user_agent(ewk_view))
286                 BROWSER_LOGE("_set_user_agent failed");
287
288         ewk_context_icon_database_path_set(ewk_view_context_get(ewk_view), BROWSER_FAVICON_DB_PATH);
289
290         Ewk_Setting *setting = ewk_view_setting_get(ewk_view);
291         ewk_setting_show_ime_on_autofocus_set(setting, EINA_FALSE);
292
293         char *default_level = NULL;
294         if (br_preference_get_str(DEFAULT_VIEW_LEVEL_KEY, &default_level) == false) {
295                 BROWSER_LOGE("failed to get %s preference", DEFAULT_VIEW_LEVEL_KEY);
296                 return EINA_FALSE;
297         }
298         if (default_level) {
299                 if (!strncmp(default_level, FIT_TO_WIDTH, strlen(FIT_TO_WIDTH)))
300                         ewk_setting_auto_fitting_set(setting, EINA_TRUE);
301                 else
302                         ewk_setting_auto_fitting_set(setting, EINA_FALSE);
303                 free(default_level);
304         }
305
306         bool run_javascript = 1;
307         br_preference_get_bool(RUN_JAVASCRIPT_KEY, &run_javascript);
308         if (run_javascript)
309                 ewk_setting_enable_scripts_set(setting, EINA_TRUE);
310         else
311                 ewk_setting_enable_scripts_set(setting, EINA_FALSE);
312
313         bool display_images = 1;
314         br_preference_get_bool(DISPLAY_IMAGES_KEY, &display_images);
315         if (display_images)
316                 ewk_setting_enable_plugins_set(setting, EINA_TRUE);
317         else
318                 ewk_setting_enable_plugins_set(setting, EINA_FALSE);
319
320         bool accept_cookies = 1;
321         br_preference_get_bool(ACCEPT_COOKIES_KEY, &accept_cookies);
322         if (accept_cookies)
323                 ewk_context_cookies_policy_set(ewk_context_default_get(), EWK_COOKIE_JAR_ACCEPT_ALWAYS);
324         else
325                 ewk_context_cookies_policy_set(ewk_context_default_get(), EWK_COOKIE_JAR_ACCEPT_NEVER);
326
327         bool block_popup = 0;
328         br_preference_get_bool(BLOCK_POPUP_KEY, &block_popup);
329         if (block_popup)
330                 ewk_setting_scripts_window_open_set(setting, EINA_FALSE);
331         else
332                 ewk_setting_scripts_window_open_set(setting, EINA_TRUE);
333
334         ewk_view_recording_surface_enable_set(ewk_view, EINA_TRUE);
335         ewk_setting_layer_borders_enable_set(ewk_view_setting_get(ewk_view), false);
336         ewk_setting_enable_plugins_set(setting, EINA_TRUE);
337
338         if (!_set_http_accepted_language_header(ewk_view)) {
339                 BROWSER_LOGE("_set_http_accepted_language_header failed");
340                 return EINA_FALSE;
341         }
342
343         return EINA_TRUE;
344 }
345
346 void Browser_Class::ewk_view_deinit(Evas_Object *ewk_view)
347 {
348         BROWSER_LOGD("[%s]", __func__);
349         evas_object_smart_callback_del(ewk_view, "load,started", Browser_View::__load_started_cb);
350         evas_object_smart_callback_del(ewk_view, "load,committed", Browser_View::__load_committed_cb);
351         evas_object_smart_callback_del(ewk_view, "load,nonemptylayout,finished",
352                                                 Browser_View::__load_nonempty_layout_finished_cb);
353         evas_object_smart_callback_del(ewk_view, "title,changed", Browser_View::__title_changed_cb);
354         evas_object_smart_callback_del(ewk_view, "load,progress", Browser_View::__load_progress_cb);
355         evas_object_smart_callback_del(ewk_view, "load,finished", Browser_View::__did_finish_load_for_frame_cb);
356         evas_object_smart_callback_del(ewk_view, "process,crashed", Browser_View::__process_crashed_cb);
357         evas_object_event_callback_del(ewk_view, EVAS_CALLBACK_MOUSE_DOWN,
358                                         Browser_View::__ewk_view_mouse_down_cb);
359         evas_object_event_callback_del(ewk_view, EVAS_CALLBACK_MOUSE_UP,
360                                         Browser_View::__ewk_view_mouse_up_cb);
361         evas_object_smart_callback_del(ewk_view, "edge,top",
362                                         Browser_View::__ewk_view_edge_top_cb);
363         evas_object_smart_callback_del(ewk_view, "edge,bottom",
364                                         Browser_View::__ewk_view_scroll_down_cb);
365         evas_object_smart_callback_del(ewk_view, "scroll,down",
366                                         Browser_View::__ewk_view_scroll_down_cb);
367         evas_object_smart_callback_del(ewk_view, "scroll,up",
368                                         Browser_View::__ewk_view_scroll_up_cb);
369         evas_object_smart_callback_del(ewk_view, "fullscreen,enterfullscreen",
370                                         Browser_View::__ewk_view_enter_full_screen_cb);
371         evas_object_smart_callback_del(ewk_view, "fullscreen,exitfullscreen",
372                                         Browser_View::__ewk_view_exit_full_screen_cb);
373         evas_object_smart_callback_del(ewk_view, "vibration,vibrate",
374                                         Browser_View::__ewk_view_vibration_vibrate_cb);
375         evas_object_smart_callback_del(ewk_view, "vibration,cancel",
376                                         Browser_View::__ewk_view_vibration_cancel_cb);
377
378         evas_object_smart_callback_del(ewk_view, "create,window", Browser_View::__create_window_cb);
379         evas_object_smart_callback_del(ewk_view, "close,window", Browser_View::__close_window_cb);
380
381         evas_object_smart_callback_del(ewk_view, "request,geolocation,permission",
382                                         Browser_Geolocation::__geolocation_permission_request_cb);
383         m_download_policy->deinit();
384         m_browser_view->m_context_menu->deinit();
385 #ifdef USE_META_TAG
386         m_browser_view->m_meta_tag->deinit();
387 #endif
388
389         m_browser_view->suspend_ewk_view(ewk_view);
390 }
391
392 void Browser_Class::ewk_view_init(Evas_Object *ewk_view)
393 {
394         BROWSER_LOGD("[%s]", __func__);
395         ewk_view_deinit(ewk_view);
396
397         evas_object_smart_callback_add(ewk_view, "load,started",
398                                         Browser_View::__load_started_cb, m_browser_view);
399         evas_object_smart_callback_add(ewk_view, "load,committed",
400                                         Browser_View::__load_committed_cb, m_browser_view);
401         evas_object_smart_callback_add(ewk_view, "load,nonemptylayout,finished",
402                                         Browser_View::__load_nonempty_layout_finished_cb, m_browser_view);
403         evas_object_smart_callback_add(ewk_view, "title,changed",
404                                         Browser_View::__title_changed_cb, m_browser_view);
405         evas_object_smart_callback_add(ewk_view, "load,progress",
406                                         Browser_View::__load_progress_cb, m_browser_view);
407         evas_object_smart_callback_add(ewk_view, "load,finished",
408                                         Browser_View::__did_finish_load_for_frame_cb, m_browser_view);
409         evas_object_smart_callback_add(ewk_view, "process,crashed",
410                                         Browser_View::__process_crashed_cb, m_browser_view);
411         evas_object_event_callback_add(ewk_view, EVAS_CALLBACK_MOUSE_DOWN,
412                                         Browser_View::__ewk_view_mouse_down_cb, m_browser_view);
413         evas_object_event_callback_add(ewk_view, EVAS_CALLBACK_MOUSE_UP,
414                                         Browser_View::__ewk_view_mouse_up_cb, m_browser_view);
415         evas_object_smart_callback_add(ewk_view, "edge,top",
416                                         Browser_View::__ewk_view_edge_top_cb, m_browser_view);
417         evas_object_smart_callback_add(ewk_view, "edge,bottom",
418                                         Browser_View::__ewk_view_scroll_down_cb, m_browser_view);
419         evas_object_smart_callback_add(ewk_view, "scroll,down",
420                                         Browser_View::__ewk_view_scroll_down_cb, m_browser_view);
421         evas_object_smart_callback_add(ewk_view, "scroll,up",
422                                         Browser_View::__ewk_view_scroll_up_cb, m_browser_view);
423         evas_object_smart_callback_add(ewk_view, "fullscreen,enterfullscreen",
424                                         Browser_View::__ewk_view_enter_full_screen_cb, m_browser_view);
425         evas_object_smart_callback_add(ewk_view, "fullscreen,exitfullscreen",
426                                         Browser_View::__ewk_view_exit_full_screen_cb, m_browser_view);
427         evas_object_smart_callback_add(ewk_view, "vibration,vibrate",
428                                         Browser_View::__ewk_view_vibration_vibrate_cb, m_browser_view);
429         evas_object_smart_callback_add(ewk_view, "vibration,cancel",
430                                         Browser_View::__ewk_view_vibration_cancel_cb, m_browser_view);
431
432         evas_object_smart_callback_add(ewk_view, "create,window", Browser_View::__create_window_cb, m_browser_view);
433         evas_object_smart_callback_add(ewk_view, "close,window", Browser_View::__close_window_cb, m_browser_view);
434
435         evas_object_smart_callback_add(ewk_view, "request,geolocation,permission",
436                                         Browser_Geolocation::__geolocation_permission_request_cb, m_browser_view);
437
438         m_download_policy->init(ewk_view);
439         m_browser_view->m_context_menu->init(ewk_view);
440 #ifdef USE_META_TAG
441         m_browser_view->m_meta_tag->init(ewk_view);
442 #endif
443         m_geolocation->init(ewk_view);
444         m_browser_view->resume_ewk_view(ewk_view);
445 }
446
447 std::string Browser_Class::get_user_agent(void)
448 {
449         BROWSER_LOGD("[%s]", __func__);
450         char *user_agent_title = vconf_get_str(USERAGENT_KEY);
451         if (!user_agent_title) {
452                 BROWSER_LOGE("vconf_get_str(USERAGENT_KEY) failed.");
453                 user_agent_title = strdup(BROWSER_DEFAULT_USER_AGENT_TITLE);
454                 if (!user_agent_title) {
455                         BROWSER_LOGE("strdup(BROWSER_DEFAULT_USER_AGENT_TITLE) failed.");
456                         return std::string();
457                 }
458         }
459
460         char *user_agent = NULL;
461         if (!m_user_agent_db->get_user_agent(user_agent_title, user_agent)) {
462                 BROWSER_LOGE("m_user_agent_db->get_user_agent failed");
463         }
464
465         if (user_agent_title)
466                 free(user_agent_title);
467
468         if (user_agent) {
469                 std::string return_string = std::string(user_agent);
470                 free(user_agent);
471                 return return_string;
472         } else
473                 return std::string();
474 }
475
476 Eina_Bool Browser_Class::_set_user_agent(Evas_Object *ewk_view)
477 {
478         BROWSER_LOGD("[%s]", __func__);
479
480     char *user_agent_title = vconf_get_str(USERAGENT_KEY);
481     if (!user_agent_title) {
482         BROWSER_LOGE("vconf_get_str(USERAGENT_KEY) failed.");
483         user_agent_title = strdup("Tizen");
484         if (!user_agent_title) {
485             BROWSER_LOGE("strdup(BROWSER_DEFAULT_USER_AGENT_TITLE) failed.");
486             return EINA_FALSE;
487         }
488     }
489
490 #define TIZEN_USER_AGENT "Mozilla/5.0 (Linux; U; Tizen 1.0; en-us) AppleWebKit/534.46 (KHTML,like Gecko) Mobile Tizen Browser/1.0"
491 #define CHROME_USER_AGENT "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11"
492
493     if (strncmp(user_agent_title, "Chrome 20", strlen("Chrome 20"))) {
494         if (!ewk_view_user_agent_set(ewk_view, TIZEN_USER_AGENT));
495             BROWSER_LOGE("ewk_view_setting_user_agent_set failed");
496     } else {
497         if (!ewk_view_user_agent_set(ewk_view, CHROME_USER_AGENT));
498             BROWSER_LOGE("ewk_view_setting_user_agent_set failed");
499     }
500
501         return EINA_TRUE;
502 }
503
504 Eina_Bool Browser_Class::_set_http_accepted_language_header(Evas_Object *ewk_view)
505 {
506         BROWSER_LOGD("[%s]", __func__);
507
508         char *system_language_locale = NULL;
509         char system_language[3] = {0,};
510
511         system_language_locale = vconf_get_str(VCONFKEY_LANGSET);
512         BROWSER_LOGD("system language and locale is [%s]\n", system_language_locale);
513         if (!system_language_locale) {
514                 BROWSER_LOGD("Failed to get system_language, set as English");
515                 strncpy(system_language, "en", 2); /* Copy language set as english */
516         } else {
517                 /* Copy language set from system using 2byte, ex)ko */
518                 strncpy(system_language, system_language_locale, 2);
519         }
520
521         if (system_language_locale)
522                 free(system_language_locale);
523
524         if (!ewk_view_custom_header_add(ewk_view, "Accept-Language", system_language)) {
525                 BROWSER_LOGD("ewk_view_setting_custom_header_add is failed");
526                 return EINA_FALSE;
527         }
528
529         return EINA_TRUE;
530 }
531
532 void Browser_Class::set_focused_window(Browser_Window *window
533 #if defined(FEATURE_MOST_VISITED_SITES)
534         , Eina_Bool show_most_visited_sites
535 #endif
536         )
537 {
538         if (m_focused_window == window || !window)
539                 return;
540
541         if (m_focused_window) {
542                 if (m_focused_window->m_favicon)
543                         evas_object_hide(m_focused_window->m_favicon);
544                 if (m_focused_window->m_option_header_favicon)
545                         evas_object_hide(m_focused_window->m_option_header_favicon);
546                 if (m_focused_window->m_ewk_view) {
547                         ewk_view_deinit(m_focused_window->m_ewk_view);
548                         evas_object_hide(m_focused_window->m_ewk_view);
549                 }
550         }
551
552         m_focused_window = window;
553
554         /* If the ewk view is deleted because of unused case.(etc. low memory)
555           * create the ewk view and load url. */
556         if (!m_focused_window->m_ewk_view) {
557                 int index = 0;
558                 for (index = 0 ; index < m_window_list.size() ; index++) {
559                         if (m_focused_window == m_window_list[index])
560                                 break;
561                 }
562
563                 if (m_focused_window != create_deleted_window(index))
564                         BROWSER_LOGD("create_deleted_window failed");
565
566                 /* Workaround.
567                   * If launch the browser by aul, the grey bg is displayed shortly. */
568                 edje_object_signal_emit(elm_layout_edje_get(m_browser_view->m_main_layout),
569                                                 "hide,grey_background,signal", "");
570
571                 ewk_view_init(m_focused_window->m_ewk_view);
572
573                 m_browser_view->set_focused_window(m_focused_window
574 #if defined(FEATURE_MOST_VISITED_SITES)
575                         , show_most_visited_sites
576 #endif
577                         );
578                 m_browser_view->load_url(m_focused_window->m_url.c_str());
579         } else {
580                 ewk_view_init(m_focused_window->m_ewk_view);
581                 m_browser_view->set_focused_window(m_focused_window
582 #if defined(FEATURE_MOST_VISITED_SITES)
583                         , show_most_visited_sites
584 #endif
585                         );
586         }
587 }
588
589 void Browser_Class::change_order(std::vector<Browser_Window *> window_list)
590 {
591         BROWSER_LOGD("[%s]", __func__);
592         m_window_list.clear();
593         m_window_list = window_list;
594 }
595
596 void Browser_Class::delete_window(Browser_Window *delete_window, Browser_Window *parent)
597 {
598         BROWSER_LOGD("[%s]", __func__);
599
600         if (m_window_list.size() <= 1)
601                 return;
602
603         int index = 0;
604         for (index = 0 ; index < m_window_list.size() ; index++) {
605                 if (delete_window == m_window_list[index])
606                         break;
607         }
608
609         for (int i = 0 ; i < m_window_list.size() ; i++) {
610                 if (delete_window == m_window_list[i]->m_parent)
611                         m_window_list[i]->m_parent = NULL;
612         }
613
614         if (parent)
615                 set_focused_window(parent
616 #if defined(FEATURE_MOST_VISITED_SITES)
617                 , EINA_FALSE
618 #endif
619                 );
620
621         delete m_window_list[index];
622         m_window_list.erase(m_window_list.begin() + index);
623
624         m_browser_view->_set_multi_window_controlbar_text(m_window_list.size());
625 }
626
627 void Browser_Class::delete_window(Browser_Window *window)
628 {
629         BROWSER_LOGD("[%s]", __func__);
630
631         if (m_window_list.size() <= 1)
632                 return;
633
634         int index = 0;
635         for (index = 0 ; index < m_window_list.size() ; index++) {
636                 if (window == m_window_list[index])
637                         break;
638         }
639
640         if (window == m_focused_window) {
641                 if (index == 0)
642                         set_focused_window(m_window_list[index + 1]);
643                 else
644                         set_focused_window(m_window_list[index - 1]);
645         }
646
647         for (int i = 0 ; i < m_window_list.size() ; i++) {
648                 if (window == m_window_list[i]->m_parent)
649                         m_window_list[i]->m_parent = NULL;
650         }
651
652         delete m_window_list[index];
653         m_window_list.erase(m_window_list.begin() + index);
654
655         m_browser_view->_set_multi_window_controlbar_text(m_window_list.size());
656 }
657
658 /* This destroy all windows except current focused window.
659   * However, keep the snapshot and url, title. */
660 void Browser_Class::clean_up_windows(void)
661 {
662         BROWSER_LOGD("[%s]", __func__);
663
664         if (m_browser_view->m_data_manager->is_in_view_stack(BR_MULTI_WINDOW_VIEW)) {
665                 BROWSER_LOGD("close multi window");
666                 m_browser_view->m_data_manager->get_multi_window_view()->close_multi_window();
667         }
668
669         for (int i = 0 ; i < m_window_list.size() ; i++) {
670                 if (m_focused_window != m_window_list[i]) {
671                         m_window_list[i]->m_url = m_browser_view->get_url(m_window_list[i]);
672                         m_window_list[i]->m_title = m_browser_view->get_title(m_window_list[i]);
673                         BROWSER_LOGD("delete [%d:%s] window,", i, m_window_list[i]->m_url.c_str());
674
675                         if (m_window_list[i]->m_favicon)
676                                 evas_object_hide(m_window_list[i]->m_favicon);
677                         if (m_window_list[i]->m_option_header_favicon)
678                                 evas_object_hide(m_window_list[i]->m_option_header_favicon);
679
680                         if (m_window_list[i]->m_ewk_view) {
681                                 evas_object_del(m_window_list[i]->m_ewk_view);
682                                 m_window_list[i]->m_ewk_view = NULL;
683                         }
684                         if (m_window_list[i]->m_ewk_view_layout) {
685                                 evas_object_del(m_window_list[i]->m_ewk_view_layout);
686                                 m_window_list[i]->m_ewk_view_layout = NULL;
687                         }
688                 }
689         }
690
691         /* Clear memory cache to reduce memory usage in case of low memory. */
692         ewk_context_cache_clear(ewk_context_default_get());
693
694         ewk_context_notify_low_memory(ewk_context_default_get());
695 //      m_browser_view->show_msg_popup("This is a test message. Low memory - clean up windows.", 5);
696 }
697
698 Browser_Window *Browser_Class::create_deleted_window(int index)
699 {
700         if (m_window_list[index]->m_ewk_view == NULL) {
701                 m_window_list[index]->m_ewk_view = ewk_view_add(evas_object_evas_get(m_win));
702                 if (!m_window_list[index]->m_ewk_view) {
703                         BROWSER_LOGE("ewk_view_add failed");
704                         return NULL;
705                 }
706
707                 evas_object_color_set(m_window_list[index]->m_ewk_view, 255, 255, 255, 255);
708 #ifdef BROWSER_SCROLLER_BOUNCING
709                 /* The webview is locked initially. */
710                 ewk_view_vertical_panning_hold_set(m_window_list[index]->m_ewk_view, EINA_TRUE);
711 #endif
712                 evas_object_size_hint_weight_set(m_window_list[index]->m_ewk_view,
713                                                 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
714                 evas_object_size_hint_align_set(m_window_list[index]->m_ewk_view,
715                                                 EVAS_HINT_FILL, EVAS_HINT_FILL);
716
717                 if (!_set_ewk_view_options(m_window_list[index]->m_ewk_view))
718                         BROWSER_LOGE("_set_ewk_view_options failed");
719
720                 return m_window_list[index];
721         }
722
723         return NULL;
724 }
725
726 Browser_Window *Browser_Class::create_new_window(Eina_Bool created_by_user)
727 {
728         BROWSER_LOGD("[%s]", __func__);
729         Browser_Window *window = new(nothrow) Browser_Window;
730         if (!window) {
731                 BROWSER_LOGE("new Browser_Window failed");
732                 return NULL;
733         }
734         window->m_ewk_view = ewk_view_add(evas_object_evas_get(m_win));
735         if (!window->m_ewk_view) {
736                 BROWSER_LOGE("ewk_view_add failed");
737                 return NULL;
738         }
739
740         evas_object_color_set(window->m_ewk_view, 255, 255, 255, 255);
741         if (created_by_user)
742                 window->m_created_by_user = created_by_user;
743
744 #ifdef BROWSER_SCROLLER_BOUNCING
745         /* The webview is locked initially. */
746         ewk_view_vertical_panning_hold_set(window->m_ewk_view, EINA_TRUE);
747 #endif
748         evas_object_size_hint_weight_set(window->m_ewk_view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
749         evas_object_size_hint_align_set(window->m_ewk_view, EVAS_HINT_FILL, EVAS_HINT_FILL);
750
751         if (!_set_ewk_view_options(window->m_ewk_view))
752                 BROWSER_LOGE("_set_ewk_view_options failed");
753
754         m_window_list.push_back(window);
755
756         return window;
757 }
758
759 Eina_Bool Browser_Class::launch(const char *url, Eina_Bool new_window_flag)
760 {
761         BROWSER_LOGD("url=[%s], new_window=%d", url, new_window_flag);
762
763         m_browser_view->delete_non_user_created_windows();
764
765         if (new_window_flag && m_window_list.size() >= BROWSER_MULTI_WINDOW_MAX_COUNT) {
766                 /* If the multi window is max, delete the first one in case of new window. */
767                 if (m_window_list[0] != m_focused_window)
768                         delete_window(m_window_list[0]);
769                 else
770                         delete_window(m_window_list[1]);
771         }
772
773         if (m_window_list.size() == 0 || new_window_flag) {
774                 Browser_Window *new_window = NULL;
775                 /* If browser is launched for the first time, create the first window. */
776                 if (m_window_list.size() == 0)
777                         new_window = create_new_window(EINA_TRUE);
778                 else
779                         new_window = create_new_window(EINA_FALSE);
780
781                 if (!new_window) {
782                         BROWSER_LOGD("create_new_window failed");
783                         return EINA_FALSE;
784                 }
785
786                 set_focused_window(new_window);
787         }
788
789         if (m_window_list.size())
790                 m_browser_view->launch(url);
791
792         return EINA_TRUE;
793 }
794
795 #if defined(HORIZONTAL_UI)
796 Eina_Bool Browser_Class::is_available_to_rotate(void)
797 {
798         BROWSER_LOGD("[%s]", __func__);
799         if (m_browser_view)
800                 return m_browser_view->is_available_to_rotate();
801         else
802                 return EINA_FALSE;
803 }
804
805 void Browser_Class::rotate(int degree)
806 {
807         BROWSER_LOGD("[%s]", __func__);
808         m_browser_view->rotate(degree);
809 }
810 #endif
811
812 Eina_Bool Browser_Class::__clean_up_windows_timer_cb(void *data)
813 {
814         if (!data)
815                 return ECORE_CALLBACK_CANCEL;
816
817         BROWSER_LOGD("[%s]", __func__);
818
819         Browser_Class *browser = (Browser_Class *)data;
820         browser->m_clean_up_windows_timer = NULL;
821
822         browser->clean_up_windows();
823         return ECORE_CALLBACK_CANCEL;
824 }
825
826 void Browser_Class::pause(void)
827 {
828         BROWSER_LOGD("[%s]", __func__);
829         m_browser_view->pause();
830         m_download_policy->pause();
831
832         if (m_clean_up_windows_timer)
833                 ecore_timer_del(m_clean_up_windows_timer);
834         m_clean_up_windows_timer = ecore_timer_add(BROWSER_CLEAN_UP_WINDOWS_TIMEOUT,
835                                                 __clean_up_windows_timer_cb, this);
836 }
837
838 void Browser_Class::resume(void)
839 {
840         BROWSER_LOGD("[%s]", __func__);
841         m_browser_view->resume();
842
843         if (m_clean_up_windows_timer) {
844                 ecore_timer_del(m_clean_up_windows_timer);
845                 m_clean_up_windows_timer = NULL;
846         }
847 }
848
849 void Browser_Class::reset(void)
850 {
851         BROWSER_LOGD("[%s]", __func__);
852         if (m_clean_up_windows_timer) {
853                 ecore_timer_del(m_clean_up_windows_timer);
854                 m_clean_up_windows_timer = NULL;
855         }
856
857         m_browser_view->reset();
858 }
859