2 * Copyright 2012 Samsung Electronics Co., Ltd
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
8 * http://www.tizenopensource.org/license
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.
18 #include "browser-class.h"
19 #include "browser-context-menu.h"
20 #include "browser-find-word.h"
21 #include "browser-geolocation.h"
23 #include "browser-meta-tag.h"
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"
31 Browser_Class::Browser_Class(Evas_Object *win, Evas_Object *navi_bar, Evas_Object *bg)
37 ,m_focused_window(NULL)
38 ,m_user_agent_db(NULL)
39 ,m_download_policy(NULL)
40 ,m_clean_up_windows_timer(NULL)
42 ,m_network_manager(NULL)
44 m_window_list.clear();
45 BROWSER_LOGD("[%s]", __func__);
48 Browser_Class::~Browser_Class(void)
50 BROWSER_LOGD("[%s]", __func__);
52 delete m_browser_view;
54 delete m_user_agent_db;
55 if (m_download_policy)
56 delete m_download_policy;
59 if (m_network_manager)
60 delete m_network_manager;
62 for (int i = 0 ; i < m_window_list.size() ; i++) {
64 delete m_window_list[i];
65 m_window_list.erase(m_window_list.begin() + i);
68 if (m_clean_up_windows_timer)
69 ecore_timer_del(m_clean_up_windows_timer);
72 Eina_Bool Browser_Class::__create_network_manager_idler_cb(void *data)
74 Browser_Class *browser = (Browser_Class *)data;
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;
81 if (!browser->m_network_manager->init(browser->m_browser_view)) {
82 BROWSER_LOGE("m_network_manager->init failed");
83 return ECORE_CALLBACK_CANCEL;
86 return ECORE_CALLBACK_CANCEL;
89 Eina_Bool Browser_Class::init(void)
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");
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");
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");
114 m_geolocation = new(nothrow) Browser_Geolocation;
115 if (!m_geolocation) {
116 BROWSER_LOGE("new Browser_Geolocation failed");
120 m_network_manager = new(nothrow) Browser_Network_Manager;
121 if (!m_network_manager) {
122 BROWSER_LOGE("new Browser_Network_Manager failed");
125 if (!m_network_manager->init(m_browser_view)) {
126 BROWSER_LOGE("m_network_manager->init failed");
130 if (!_set_ewk_view_options_listener()) {
131 BROWSER_LOGE("_set_ewk_view_options_listener failed");
136 ewk_context_cache_model_set(ewk_context_default_get(), EWK_CACHE_MODEL_PRIMARY_WEBBROWSER);
141 void Browser_Class::__preference_changed_cb(const char *key, void *data)
143 BROWSER_LOGD("[%s]", __func__);
147 Browser_Class *browser = (Browser_Class *)data;
149 if (!key || strlen(key) == 0) {
150 BROWSER_LOGD("vconf_keynode_get_name failed");
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);
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);
166 ewk_setting_auto_fitting_set(setting, EINA_FALSE);
168 default_level = NULL;
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);
180 ewk_setting_enable_scripts_set(setting, EINA_TRUE);
182 ewk_setting_enable_scripts_set(setting, EINA_FALSE);
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);
192 ewk_setting_auto_load_images_set(setting, EINA_TRUE);
194 ewk_setting_auto_load_images_set(setting, EINA_FALSE);
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);
201 ewk_context_cookies_policy_set(ewk_context_default_get(), EWK_COOKIE_JAR_ACCEPT_ALWAYS);
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);
211 ewk_setting_scripts_window_open_set(setting, EINA_FALSE);
213 ewk_setting_scripts_window_open_set(setting, EINA_TRUE);
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);
222 void Browser_Class::__vconf_changed_cb(keynode_t *keynode, void *data)
224 BROWSER_LOGD("[%s]", __func__);
228 Browser_Class *browser = (Browser_Class *)data;
229 char *key = vconf_keynode_get_name(keynode);
231 if (!key || strlen(key) == 0) {
232 BROWSER_LOGD("vconf_keynode_get_name failed");
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");
246 Eina_Bool Browser_Class::_set_ewk_view_options_listener(void)
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");
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");
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");
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");
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");
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");
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");
281 Eina_Bool Browser_Class::_set_ewk_view_options(Evas_Object *ewk_view)
283 BROWSER_LOGD("[%s]", __func__);
285 if (!_set_user_agent(ewk_view))
286 BROWSER_LOGE("_set_user_agent failed");
288 ewk_context_icon_database_path_set(ewk_view_context_get(ewk_view), BROWSER_FAVICON_DB_PATH);
290 Ewk_Setting *setting = ewk_view_setting_get(ewk_view);
291 ewk_setting_show_ime_on_autofocus_set(setting, EINA_FALSE);
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);
299 if (!strncmp(default_level, FIT_TO_WIDTH, strlen(FIT_TO_WIDTH)))
300 ewk_setting_auto_fitting_set(setting, EINA_TRUE);
302 ewk_setting_auto_fitting_set(setting, EINA_FALSE);
306 bool run_javascript = 1;
307 br_preference_get_bool(RUN_JAVASCRIPT_KEY, &run_javascript);
309 ewk_setting_enable_scripts_set(setting, EINA_TRUE);
311 ewk_setting_enable_scripts_set(setting, EINA_FALSE);
313 bool display_images = 1;
314 br_preference_get_bool(DISPLAY_IMAGES_KEY, &display_images);
316 ewk_setting_enable_plugins_set(setting, EINA_TRUE);
318 ewk_setting_enable_plugins_set(setting, EINA_FALSE);
320 bool accept_cookies = 1;
321 br_preference_get_bool(ACCEPT_COOKIES_KEY, &accept_cookies);
323 ewk_context_cookies_policy_set(ewk_context_default_get(), EWK_COOKIE_JAR_ACCEPT_ALWAYS);
325 ewk_context_cookies_policy_set(ewk_context_default_get(), EWK_COOKIE_JAR_ACCEPT_NEVER);
327 bool block_popup = 0;
328 br_preference_get_bool(BLOCK_POPUP_KEY, &block_popup);
330 ewk_setting_scripts_window_open_set(setting, EINA_FALSE);
332 ewk_setting_scripts_window_open_set(setting, EINA_TRUE);
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);
338 if (!_set_http_accepted_language_header(ewk_view)) {
339 BROWSER_LOGE("_set_http_accepted_language_header failed");
346 void Browser_Class::ewk_view_deinit(Evas_Object *ewk_view)
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);
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);
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();
386 m_browser_view->m_meta_tag->deinit();
389 m_browser_view->suspend_ewk_view(ewk_view);
392 void Browser_Class::ewk_view_init(Evas_Object *ewk_view)
394 BROWSER_LOGD("[%s]", __func__);
395 ewk_view_deinit(ewk_view);
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);
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);
435 evas_object_smart_callback_add(ewk_view, "request,geolocation,permission",
436 Browser_Geolocation::__geolocation_permission_request_cb, m_browser_view);
438 m_download_policy->init(ewk_view);
439 m_browser_view->m_context_menu->init(ewk_view);
441 m_browser_view->m_meta_tag->init(ewk_view);
443 m_geolocation->init(ewk_view);
444 m_browser_view->resume_ewk_view(ewk_view);
447 std::string Browser_Class::get_user_agent(void)
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();
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");
465 if (user_agent_title)
466 free(user_agent_title);
469 std::string return_string = std::string(user_agent);
471 return return_string;
473 return std::string();
476 Eina_Bool Browser_Class::_set_user_agent(Evas_Object *ewk_view)
478 BROWSER_LOGD("[%s]", __func__);
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.");
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"
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");
497 if (!ewk_view_user_agent_set(ewk_view, CHROME_USER_AGENT));
498 BROWSER_LOGE("ewk_view_setting_user_agent_set failed");
504 Eina_Bool Browser_Class::_set_http_accepted_language_header(Evas_Object *ewk_view)
506 BROWSER_LOGD("[%s]", __func__);
508 char *system_language_locale = NULL;
509 char system_language[3] = {0,};
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 */
517 /* Copy language set from system using 2byte, ex)ko */
518 strncpy(system_language, system_language_locale, 2);
521 if (system_language_locale)
522 free(system_language_locale);
524 if (!ewk_view_custom_header_add(ewk_view, "Accept-Language", system_language)) {
525 BROWSER_LOGD("ewk_view_setting_custom_header_add is failed");
532 void Browser_Class::set_focused_window(Browser_Window *window
533 #if defined(FEATURE_MOST_VISITED_SITES)
534 , Eina_Bool show_most_visited_sites
538 if (m_focused_window == window || !window)
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);
552 m_focused_window = window;
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) {
558 for (index = 0 ; index < m_window_list.size() ; index++) {
559 if (m_focused_window == m_window_list[index])
563 if (m_focused_window != create_deleted_window(index))
564 BROWSER_LOGD("create_deleted_window failed");
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", "");
571 ewk_view_init(m_focused_window->m_ewk_view);
573 m_browser_view->set_focused_window(m_focused_window
574 #if defined(FEATURE_MOST_VISITED_SITES)
575 , show_most_visited_sites
578 m_browser_view->load_url(m_focused_window->m_url.c_str());
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
589 void Browser_Class::change_order(std::vector<Browser_Window *> window_list)
591 BROWSER_LOGD("[%s]", __func__);
592 m_window_list.clear();
593 m_window_list = window_list;
596 void Browser_Class::delete_window(Browser_Window *delete_window, Browser_Window *parent)
598 BROWSER_LOGD("[%s]", __func__);
600 if (m_window_list.size() <= 1)
604 for (index = 0 ; index < m_window_list.size() ; index++) {
605 if (delete_window == m_window_list[index])
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;
615 set_focused_window(parent
616 #if defined(FEATURE_MOST_VISITED_SITES)
621 delete m_window_list[index];
622 m_window_list.erase(m_window_list.begin() + index);
624 m_browser_view->_set_multi_window_controlbar_text(m_window_list.size());
627 void Browser_Class::delete_window(Browser_Window *window)
629 BROWSER_LOGD("[%s]", __func__);
631 if (m_window_list.size() <= 1)
635 for (index = 0 ; index < m_window_list.size() ; index++) {
636 if (window == m_window_list[index])
640 if (window == m_focused_window) {
642 set_focused_window(m_window_list[index + 1]);
644 set_focused_window(m_window_list[index - 1]);
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;
652 delete m_window_list[index];
653 m_window_list.erase(m_window_list.begin() + index);
655 m_browser_view->_set_multi_window_controlbar_text(m_window_list.size());
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)
662 BROWSER_LOGD("[%s]", __func__);
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();
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());
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);
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;
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;
691 /* Clear memory cache to reduce memory usage in case of low memory. */
692 ewk_context_cache_clear(ewk_context_default_get());
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);
698 Browser_Window *Browser_Class::create_deleted_window(int index)
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");
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);
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);
717 if (!_set_ewk_view_options(m_window_list[index]->m_ewk_view))
718 BROWSER_LOGE("_set_ewk_view_options failed");
720 return m_window_list[index];
726 Browser_Window *Browser_Class::create_new_window(Eina_Bool created_by_user)
728 BROWSER_LOGD("[%s]", __func__);
729 Browser_Window *window = new(nothrow) Browser_Window;
731 BROWSER_LOGE("new Browser_Window failed");
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");
740 evas_object_color_set(window->m_ewk_view, 255, 255, 255, 255);
742 window->m_created_by_user = created_by_user;
744 #ifdef BROWSER_SCROLLER_BOUNCING
745 /* The webview is locked initially. */
746 ewk_view_vertical_panning_hold_set(window->m_ewk_view, EINA_TRUE);
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);
751 if (!_set_ewk_view_options(window->m_ewk_view))
752 BROWSER_LOGE("_set_ewk_view_options failed");
754 m_window_list.push_back(window);
759 Eina_Bool Browser_Class::launch(const char *url, Eina_Bool new_window_flag)
761 BROWSER_LOGD("url=[%s], new_window=%d", url, new_window_flag);
763 m_browser_view->delete_non_user_created_windows();
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]);
770 delete_window(m_window_list[1]);
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);
779 new_window = create_new_window(EINA_FALSE);
782 BROWSER_LOGD("create_new_window failed");
786 set_focused_window(new_window);
789 if (m_window_list.size())
790 m_browser_view->launch(url);
795 #if defined(HORIZONTAL_UI)
796 Eina_Bool Browser_Class::is_available_to_rotate(void)
798 BROWSER_LOGD("[%s]", __func__);
800 return m_browser_view->is_available_to_rotate();
805 void Browser_Class::rotate(int degree)
807 BROWSER_LOGD("[%s]", __func__);
808 m_browser_view->rotate(degree);
812 Eina_Bool Browser_Class::__clean_up_windows_timer_cb(void *data)
815 return ECORE_CALLBACK_CANCEL;
817 BROWSER_LOGD("[%s]", __func__);
819 Browser_Class *browser = (Browser_Class *)data;
820 browser->m_clean_up_windows_timer = NULL;
822 browser->clean_up_windows();
823 return ECORE_CALLBACK_CANCEL;
826 void Browser_Class::pause(void)
828 BROWSER_LOGD("[%s]", __func__);
829 m_browser_view->pause();
830 m_download_policy->pause();
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);
838 void Browser_Class::resume(void)
840 BROWSER_LOGD("[%s]", __func__);
841 m_browser_view->resume();
843 if (m_clean_up_windows_timer) {
844 ecore_timer_del(m_clean_up_windows_timer);
845 m_clean_up_windows_timer = NULL;
849 void Browser_Class::reset(void)
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;
857 m_browser_view->reset();