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