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"
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"
28 Browser_Class::Browser_Class(Evas_Object *win, Evas_Object *navi_bar, Evas_Object *bg)
34 ,m_focused_window(NULL)
35 ,m_user_agent_db(NULL)
36 ,m_download_policy(NULL)
37 ,m_clean_up_windows_timer(NULL)
39 ,m_network_manager(NULL)
41 m_window_list.clear();
42 BROWSER_LOGD("[%s]", __func__);
45 Browser_Class::~Browser_Class(void)
47 BROWSER_LOGD("[%s]", __func__);
49 delete m_browser_view;
51 delete m_user_agent_db;
52 if (m_download_policy)
53 delete m_download_policy;
56 if (m_network_manager)
57 delete m_network_manager;
59 for (int i = 0 ; i < m_window_list.size() ; i++) {
61 delete m_window_list[i];
62 m_window_list.erase(m_window_list.begin() + i);
65 if (m_clean_up_windows_timer)
66 ecore_timer_del(m_clean_up_windows_timer);
69 Eina_Bool Browser_Class::__create_network_manager_idler_cb(void *data)
71 Browser_Class *browser = (Browser_Class *)data;
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;
78 if (!browser->m_network_manager->init(browser->m_browser_view)) {
79 BROWSER_LOGE("m_network_manager->init failed");
80 return ECORE_CALLBACK_CANCEL;
83 return ECORE_CALLBACK_CANCEL;
86 Eina_Bool Browser_Class::init(void)
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");
95 m_browser_view = new(nothrow) Browser_View(m_win, m_navi_bar, m_bg, this);
96 /* Create browser view layout */
98 if (!m_browser_view->init()) {
99 BROWSER_LOGE("m_browser_view->init failed");
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");
111 m_geolocation = new(nothrow) Browser_Geolocation;
112 if (!m_geolocation) {
113 BROWSER_LOGE("new Browser_Geolocation failed");
117 m_network_manager = new(nothrow) Browser_Network_Manager;
118 if (!m_network_manager) {
119 BROWSER_LOGE("new Browser_Network_Manager failed");
122 if (!m_network_manager->init(m_browser_view)) {
123 BROWSER_LOGE("m_network_manager->init failed");
127 if (!_set_ewk_view_options_listener()) {
128 BROWSER_LOGE("_set_ewk_view_options_listener failed");
133 ewk_context_cache_model_set(ewk_context_default_get(), EWK_CACHE_MODEL_PRIMARY_WEBBROWSER);
138 void Browser_Class::__preference_changed_cb(const char *key, void *data)
140 BROWSER_LOGD("[%s]", __func__);
144 Browser_Class *browser = (Browser_Class *)data;
146 if (!key || strlen(key) == 0) {
147 BROWSER_LOGD("vconf_keynode_get_name failed");
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);
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);
163 ewk_setting_auto_fitting_set(setting, EINA_FALSE);
165 default_level = NULL;
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);
177 ewk_setting_enable_scripts_set(setting, EINA_TRUE);
179 ewk_setting_enable_scripts_set(setting, EINA_FALSE);
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);
189 ewk_setting_auto_load_images_set(setting, EINA_TRUE);
191 ewk_setting_auto_load_images_set(setting, EINA_FALSE);
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);
198 ewk_context_cookies_policy_set(ewk_context_default_get(), EWK_COOKIE_JAR_ACCEPT_ALWAYS);
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);
208 ewk_setting_scripts_window_open_set(setting, EINA_FALSE);
210 ewk_setting_scripts_window_open_set(setting, EINA_TRUE);
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);
219 void Browser_Class::__vconf_changed_cb(keynode_t *keynode, void *data)
221 BROWSER_LOGD("[%s]", __func__);
225 Browser_Class *browser = (Browser_Class *)data;
226 char *key = vconf_keynode_get_name(keynode);
228 if (!key || strlen(key) == 0) {
229 BROWSER_LOGD("vconf_keynode_get_name failed");
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");
243 Eina_Bool Browser_Class::_set_ewk_view_options_listener(void)
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");
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");
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");
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");
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");
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");
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");
278 Eina_Bool Browser_Class::_set_ewk_view_options(Evas_Object *ewk_view)
280 BROWSER_LOGD("[%s]", __func__);
282 if (!_set_user_agent(ewk_view))
283 BROWSER_LOGE("_set_user_agent failed");
285 ewk_context_icon_database_path_set(ewk_view_context_get(ewk_view), BROWSER_FAVICON_DB_PATH);
287 Ewk_Setting *setting = ewk_view_setting_get(ewk_view);
288 ewk_setting_show_ime_on_autofocus_set(setting, EINA_FALSE);
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);
296 if (!strncmp(default_level, FIT_TO_WIDTH, strlen(FIT_TO_WIDTH)))
297 ewk_setting_auto_fitting_set(setting, EINA_TRUE);
299 ewk_setting_auto_fitting_set(setting, EINA_FALSE);
303 bool run_javascript = 1;
304 br_preference_get_bool(RUN_JAVASCRIPT_KEY, &run_javascript);
306 ewk_setting_enable_scripts_set(setting, EINA_TRUE);
308 ewk_setting_enable_scripts_set(setting, EINA_FALSE);
310 bool display_images = 1;
311 br_preference_get_bool(DISPLAY_IMAGES_KEY, &display_images);
313 ewk_setting_enable_plugins_set(setting, EINA_TRUE);
315 ewk_setting_enable_plugins_set(setting, EINA_FALSE);
317 bool accept_cookies = 1;
318 br_preference_get_bool(ACCEPT_COOKIES_KEY, &accept_cookies);
320 ewk_context_cookies_policy_set(ewk_context_default_get(), EWK_COOKIE_JAR_ACCEPT_ALWAYS);
322 ewk_context_cookies_policy_set(ewk_context_default_get(), EWK_COOKIE_JAR_ACCEPT_NEVER);
324 bool block_popup = 0;
325 br_preference_get_bool(BLOCK_POPUP_KEY, &block_popup);
327 ewk_setting_scripts_window_open_set(setting, EINA_FALSE);
329 ewk_setting_scripts_window_open_set(setting, EINA_TRUE);
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);
335 if (!_set_http_accepted_language_header(ewk_view)) {
336 BROWSER_LOGE("_set_http_accepted_language_header failed");
343 void Browser_Class::ewk_view_deinit(Evas_Object *ewk_view)
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);
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);
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);
385 void Browser_Class::ewk_view_init(Evas_Object *ewk_view)
387 BROWSER_LOGD("[%s]", __func__);
388 ewk_view_deinit(ewk_view);
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);
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);
428 evas_object_smart_callback_add(ewk_view, "request,geolocation,permission",
429 Browser_Geolocation::__geolocation_permission_request_cb, m_browser_view);
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);
437 std::string Browser_Class::get_user_agent(void)
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();
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");
455 if (user_agent_title)
456 free(user_agent_title);
459 std::string return_string = std::string(user_agent);
461 return return_string;
463 return std::string();
466 Eina_Bool Browser_Class::_set_user_agent(Evas_Object *ewk_view)
468 BROWSER_LOGD("[%s]", __func__);
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.");
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"
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");
487 if (!ewk_view_user_agent_set(ewk_view, CHROME_USER_AGENT));
488 BROWSER_LOGE("ewk_view_setting_user_agent_set failed");
494 Eina_Bool Browser_Class::_set_http_accepted_language_header(Evas_Object *ewk_view)
496 BROWSER_LOGD("[%s]", __func__);
498 char *system_language_locale = NULL;
499 char system_language[3] = {0,};
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 */
507 /* Copy language set from system using 2byte, ex)ko */
508 strncpy(system_language, system_language_locale, 2);
511 if (system_language_locale)
512 free(system_language_locale);
514 if (!ewk_view_custom_header_add(ewk_view, "Accept-Language", system_language)) {
515 BROWSER_LOGD("ewk_view_setting_custom_header_add is failed");
522 void Browser_Class::set_focused_window(Browser_Window *window
523 #if defined(FEATURE_MOST_VISITED_SITES)
524 , Eina_Bool show_most_visited_sites
528 if (m_focused_window == window || !window)
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);
542 m_focused_window = window;
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) {
548 for (index = 0 ; index < m_window_list.size() ; index++) {
549 if (m_focused_window == m_window_list[index])
553 if (m_focused_window != create_deleted_window(index))
554 BROWSER_LOGD("create_deleted_window failed");
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", "");
561 ewk_view_init(m_focused_window->m_ewk_view);
563 m_browser_view->set_focused_window(m_focused_window
564 #if defined(FEATURE_MOST_VISITED_SITES)
565 , show_most_visited_sites
568 m_browser_view->load_url(m_focused_window->m_url.c_str());
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
579 void Browser_Class::change_order(std::vector<Browser_Window *> window_list)
581 BROWSER_LOGD("[%s]", __func__);
582 m_window_list.clear();
583 m_window_list = window_list;
586 void Browser_Class::delete_window(Browser_Window *delete_window, Browser_Window *parent)
588 BROWSER_LOGD("[%s]", __func__);
590 if (m_window_list.size() <= 1)
594 for (index = 0 ; index < m_window_list.size() ; index++) {
595 if (delete_window == m_window_list[index])
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;
605 set_focused_window(parent
606 #if defined(FEATURE_MOST_VISITED_SITES)
611 delete m_window_list[index];
612 m_window_list.erase(m_window_list.begin() + index);
614 m_browser_view->_set_multi_window_controlbar_text(m_window_list.size());
617 void Browser_Class::delete_window(Browser_Window *window)
619 BROWSER_LOGD("[%s]", __func__);
621 if (m_window_list.size() <= 1)
625 for (index = 0 ; index < m_window_list.size() ; index++) {
626 if (window == m_window_list[index])
630 if (window == m_focused_window) {
632 set_focused_window(m_window_list[index + 1]);
634 set_focused_window(m_window_list[index - 1]);
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;
642 delete m_window_list[index];
643 m_window_list.erase(m_window_list.begin() + index);
645 m_browser_view->_set_multi_window_controlbar_text(m_window_list.size());
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)
652 BROWSER_LOGD("[%s]", __func__);
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();
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());
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);
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;
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;
681 /* Clear memory cache to reduce memory usage in case of low memory. */
682 ewk_context_cache_clear(ewk_context_default_get());
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);
688 Browser_Window *Browser_Class::create_deleted_window(int index)
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");
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);
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);
707 if (!_set_ewk_view_options(m_window_list[index]->m_ewk_view))
708 BROWSER_LOGE("_set_ewk_view_options failed");
710 return m_window_list[index];
716 Browser_Window *Browser_Class::create_new_window(Eina_Bool created_by_user)
718 BROWSER_LOGD("[%s]", __func__);
719 Browser_Window *window = new(nothrow) Browser_Window;
721 BROWSER_LOGE("new Browser_Window failed");
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");
730 evas_object_color_set(window->m_ewk_view, 255, 255, 255, 255);
732 window->m_created_by_user = created_by_user;
734 #ifdef BROWSER_SCROLLER_BOUNCING
735 /* The webview is locked initially. */
736 ewk_view_vertical_panning_hold_set(window->m_ewk_view, EINA_TRUE);
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);
741 if (!_set_ewk_view_options(window->m_ewk_view))
742 BROWSER_LOGE("_set_ewk_view_options failed");
744 m_window_list.push_back(window);
749 Eina_Bool Browser_Class::launch(const char *url, Eina_Bool new_window_flag)
751 BROWSER_LOGD("url=[%s], new_window=%d", url, new_window_flag);
753 m_browser_view->delete_non_user_created_windows();
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]);
760 delete_window(m_window_list[1]);
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);
769 new_window = create_new_window(EINA_FALSE);
772 BROWSER_LOGD("create_new_window failed");
776 set_focused_window(new_window);
779 if (m_window_list.size())
780 m_browser_view->launch(url);
785 #if defined(HORIZONTAL_UI)
786 Eina_Bool Browser_Class::is_available_to_rotate(void)
788 BROWSER_LOGD("[%s]", __func__);
790 return m_browser_view->is_available_to_rotate();
795 void Browser_Class::rotate(int degree)
797 BROWSER_LOGD("[%s]", __func__);
798 m_browser_view->rotate(degree);
802 Eina_Bool Browser_Class::__clean_up_windows_timer_cb(void *data)
805 return ECORE_CALLBACK_CANCEL;
807 BROWSER_LOGD("[%s]", __func__);
809 Browser_Class *browser = (Browser_Class *)data;
810 browser->m_clean_up_windows_timer = NULL;
812 browser->clean_up_windows();
813 return ECORE_CALLBACK_CANCEL;
816 void Browser_Class::pause(void)
818 BROWSER_LOGD("[%s]", __func__);
819 m_browser_view->pause();
820 m_download_policy->pause();
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);
828 void Browser_Class::resume(void)
830 BROWSER_LOGD("[%s]", __func__);
831 m_browser_view->resume();
833 if (m_clean_up_windows_timer) {
834 ecore_timer_del(m_clean_up_windows_timer);
835 m_clean_up_windows_timer = NULL;
839 void Browser_Class::reset(void)
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;
847 m_browser_view->reset();