From 69552c1104a97877a65182e1abf987fcc8dd3c49 Mon Sep 17 00:00:00 2001 From: LongXiang Date: Tue, 29 Jan 2013 16:09:34 +0800 Subject: [PATCH] Update background-support app's memory policy and reorganize some code [Issue#] N/A [Problem] There's a limitation on hidden applications number(current 15) which is kept by apps' /proc/[pid]/oom_adj values. Least recently used app will have the highest oom_adj value, when hidden apps number limitation is reached, the app will be killed. However background-support enabled app shouldn't be one of this kind, it shouldn't be count as a hidden app when goes to background. [Cause] N/A [Solution] Make background-support enabled app active when goes to background by using sysman's API. oom_adj value will be updated accordingly by these APIs. Move backgroun-support check logic from RunnableWidgetObject to ViewLogic. Change-Id: I29ef92153e345c31bd50d4c034f44fa6fced5e33 --- packaging/wrt.spec | 1 + src/api_new/runnable_widget_object.cpp | 45 ++++-------------- src/view/i_view_module.h | 1 - src/view/webkit/CMakeLists.txt | 1 + src/view/webkit/view_logic.cpp | 85 ++++++++++++++++++++++++---------- src/view/webkit/view_logic.h | 4 +- 6 files changed, 74 insertions(+), 63 deletions(-) diff --git a/packaging/wrt.spec b/packaging/wrt.spec index e2fc0f9..34c0d51 100644 --- a/packaging/wrt.spec +++ b/packaging/wrt.spec @@ -43,6 +43,7 @@ BuildRequires: pkgconfig(wrt-plugin-js-overlay) BuildRequires: pkgconfig(dpl-encryption) BuildRequires: pkgconfig(wrt-popup-wrt-runner) BuildRequires: pkgconfig(wrt-popup-ace-runner) +BuildRequires: pkgconfig(sysman) ## wrt-launchpad-daemon ####################################################### BuildRequires: pkgconfig(app-checker) diff --git a/src/api_new/runnable_widget_object.cpp b/src/api_new/runnable_widget_object.cpp index 029a0fe..61d96a2 100644 --- a/src/api_new/runnable_widget_object.cpp +++ b/src/api_new/runnable_widget_object.cpp @@ -34,9 +34,6 @@ #include namespace { //Anonymous - -const wchar_t* BACKGROUND_ENABLED = L"background_enabled" ; - const std::string ACCESS_DENIED = _("IDS_BR_POP_ACCESS_DENIED"); const std::string ALREADY_RUNNING = _("IDS_BR_POP_ALREADY_RUNNING"); const std::string INVALID_LOCALE = _("IDS_IM_POP_INVALID_WIDGET_LOCALE"); @@ -135,7 +132,8 @@ void RunnableWidgetObject::Show() change.commit(); } -void RunnableWidgetObject::Hide() { +void RunnableWidgetObject::Hide() +{ State::StateChange change = m_guardstate->allowHide(); m_view->hideWidget(); @@ -144,38 +142,11 @@ void RunnableWidgetObject::Hide() { change.commit(); } -void RunnableWidgetObject::Suspend() { +void RunnableWidgetObject::Suspend() +{ LogDebug("Suspending widget"); State::StateChange change = m_guardstate->allowSuspend(); - Assert(m_widgetModel); - - bool suspendWebkit = true; - - if( m_widgetModel->SettingList.Get().getBackgroundSupport() - == BackgroundSupport_Enable ) { - //skip suspendWidget - LogDebug("Background enabled, skipping suspend"); - suspendWebkit = false; - } -#ifndef DEPRECATED_SETTING_STRING - else { - WrtDB::WidgetDAOReadOnly dao(m_widgetModel->TizenId); - WrtDB::PropertyDAOReadOnly::WidgetPropertyValue bgEnableValue = - dao.getPropertyValue(DPL::String(BACKGROUND_ENABLED)); - - if(!bgEnableValue.IsNull() && !bgEnableValue->compare(L"true")) { - //skip suspendWidget - LogDebug("Background enabled, skipping suspend"); - suspendWebkit = false; - } - } -#endif - - m_view->changeViewVisibility(false); - if(suspendWebkit) //if widget has background page suspending wk will be skipped - { - m_view->suspendWidget(); - } + m_view->suspendWidget(); change.commit(); } @@ -203,7 +174,8 @@ void RunnableWidgetObject::ReloadStartPage() m_view->reloadStartPage(); } -Evas_Object* RunnableWidgetObject::GetCurrentWebview() { +Evas_Object* RunnableWidgetObject::GetCurrentWebview() +{ State::StateChange change = m_guardstate->allowGetCurrentWebview(); Evas_Object* cww = m_view->getCurrentWebview(); @@ -218,7 +190,8 @@ void RunnableWidgetObject::SetUserDelegates(const UserDelegatesPtr& cbs) { change.commit(); } -void RunnableWidgetObject::Backward() { +void RunnableWidgetObject::Backward() +{ State::StateChange change = m_guardstate->allowBackward(); m_view->backward(); diff --git a/src/view/i_view_module.h b/src/view/i_view_module.h index e24da45..8622b01 100755 --- a/src/view/i_view_module.h +++ b/src/view/i_view_module.h @@ -46,7 +46,6 @@ public: virtual void prepareView(WidgetModel *, const std::string &) = 0; virtual void showWidget() = 0; virtual void hideWidget() = 0; - virtual void changeViewVisibility(bool isVisible) = 0; virtual void suspendWidget()= 0; virtual void resumeWidget() = 0; virtual void resetWidget() = 0; diff --git a/src/view/webkit/CMakeLists.txt b/src/view/webkit/CMakeLists.txt index 2e3d3c7..60fa610 100644 --- a/src/view/webkit/CMakeLists.txt +++ b/src/view/webkit/CMakeLists.txt @@ -31,6 +31,7 @@ PKG_CHECK_MODULES(VIEW_MODULE_DEP security-core security-client haptic + sysman REQUIRED ) diff --git a/src/view/webkit/view_logic.cpp b/src/view/webkit/view_logic.cpp index b9e11ff..2a4ad92 100755 --- a/src/view/webkit/view_logic.cpp +++ b/src/view/webkit/view_logic.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -96,6 +97,9 @@ const char * const CERTIFICATE_CONFIRM_REQUEST_ASK_TITLE = "Certification Info"; const char * const CERTIFICATE_CONFIRM_REQUEST_ASK_BODY = "This site's security certificate is not trusted! Do you acess this site?"; + +const wchar_t* BACKGROUND_ENABLED = L"background_enabled" ; + } // anonymous namespace std::map ViewLogic::m_ewkCallbacksMap = @@ -161,6 +165,7 @@ ViewLogic::ViewLogic(): m_model(0), m_cbs(new WRT::UserDelegates), m_isBackgroundReload(false), + m_isBackgroundSupport(false), m_appsSupport(new ViewModule::AppsSupport()), m_vibrationSupport(new ViewModule::VibrationSupport()), m_attachedToCustomHandlerDao(false) @@ -270,25 +275,6 @@ void ViewLogic::hideWidget() m_ewkViewList.clear(); } -void ViewLogic::changeViewVisibility(bool isVisible) -{ - Evas_Object* wkView = m_currentEwkView; - if (!wkView) - return; - - if (isVisible) { - ewk_view_page_visibility_state_set(wkView, - EWK_PAGE_VISIBILITY_STATE_VISIBLE, - EINA_FALSE); - ewk_view_visibility_set(wkView, EINA_TRUE); - } else { - ewk_view_page_visibility_state_set(wkView, - EWK_PAGE_VISIBILITY_STATE_HIDDEN, - EINA_FALSE); - ewk_view_visibility_set(wkView, EINA_FALSE); - } -} - void ViewLogic::suspendWidget() { LogInfo("Pausing widget"); @@ -300,7 +286,10 @@ void ViewLogic::suspendWidget() if (!m_currentEwkView) { LogWarning("Cannot suspend widget without view"); } else { - suspendWebkit(m_currentEwkView); + setEwkViewInvisible(m_currentEwkView); + if (!m_isBackgroundSupport) { + suspendWebkit(m_currentEwkView); + } } evas_object_focus_set(m_currentEwkView, EINA_FALSE); @@ -320,7 +309,10 @@ void ViewLogic::resumeWidget() PluginModuleSupport::resume(m_ewkContext); if (m_currentEwkView) { - resumeWebkit(m_currentEwkView); + setEwkViewVisible(m_currentEwkView); + if (!m_isBackgroundSupport) { + resumeWebkit(m_currentEwkView); + } } /* window system team recomend removing this win_raise code. */ @@ -525,6 +517,30 @@ void ViewLogic::finalizeEwkContext() void ViewLogic::initializeSupport() { + // background support + if( m_model->SettingList.Get().getBackgroundSupport() + == BackgroundSupport_Enable ) { + LogDebug("Background support enabled, set process active"); + pid_t pid = getpid(); + sysman_inform_active(pid); + m_isBackgroundSupport = true; + } +#ifndef DEPRECATED_SETTING_STRING + else { + WrtDB::WidgetDAOReadOnly dao(m_model->TizenId); + WrtDB::PropertyDAOReadOnly::WidgetPropertyValue bgEnableValue = + dao.getPropertyValue(DPL::String(BACKGROUND_ENABLED)); + + if(!bgEnableValue.IsNull() && !bgEnableValue->compare(L"true")) { + //skip suspendWidget + LogDebug("Background support enabled, set process active"); + pid_t pid = getpid(); + sysman_inform_active(pid); + m_isBackgroundSupport = true; + } + } +#endif + // set local stroage database path WrtDB::WidgetDAOReadOnly dao(m_model->TizenId); ewk_context_web_storage_path_set(m_ewkContext, @@ -737,6 +753,28 @@ void ViewLogic::suspendEwkView(Evas_Object *wkView) return; } +void ViewLogic::setEwkViewInvisible(Evas_Object *wkView) +{ + LogInfo("setEwkViewInvisible called"); + Assert(wkView); + + ewk_view_page_visibility_state_set(wkView, + EWK_PAGE_VISIBILITY_STATE_HIDDEN, + EINA_FALSE); + ewk_view_visibility_set(wkView, EINA_FALSE); +} + +void ViewLogic::setEwkViewVisible(Evas_Object *wkView) +{ + LogInfo("setEwkViewVisible called"); + Assert(wkView); + + ewk_view_page_visibility_state_set(wkView, + EWK_PAGE_VISIBILITY_STATE_VISIBLE, + EINA_FALSE); + ewk_view_visibility_set(wkView, EINA_TRUE); +} + void ViewLogic::resumeWebkit(Evas_Object *wkView) { LogDebug("resumeWebkit"); @@ -750,10 +788,7 @@ void ViewLogic::resumeWebkit(Evas_Object *wkView) // ewk_view_enable_render(); // ewk_view_reduce_plugins_frame_rate(false); ewk_view_resume(wkView); - ewk_view_visibility_set(wkView, EINA_TRUE); - ewk_view_page_visibility_state_set(wkView, - EWK_PAGE_VISIBILITY_STATE_VISIBLE, - EINA_FALSE); + return; } diff --git a/src/view/webkit/view_logic.h b/src/view/webkit/view_logic.h index 709a410..753a828 100755 --- a/src/view/webkit/view_logic.h +++ b/src/view/webkit/view_logic.h @@ -55,7 +55,6 @@ class ViewLogic : public ViewModule::IViewModule void prepareView(WidgetModel* m, const std::string &startUrl); void showWidget(); void hideWidget(); - void changeViewVisibility(bool isVisible); void suspendWidget(); void resumeWidget(); void resetWidget(); @@ -82,6 +81,8 @@ class ViewLogic : public ViewModule::IViewModule void removeEwkView(Evas_Object *wkView); void resumeEwkView(Evas_Object *wkView); void suspendEwkView(Evas_Object *wkView); + void setEwkViewVisible(Evas_Object *wkView); + void setEwkViewInvisible(Evas_Object *wkView); void resumeWebkit(Evas_Object *wkView); void suspendWebkit(Evas_Object *wkView); @@ -302,6 +303,7 @@ class ViewLogic : public ViewModule::IViewModule size_t m_imeWidth; size_t m_imeHeight; bool m_isBackgroundReload; + bool m_isBackgroundSupport; std::unique_ptr m_schemeSupport; std::unique_ptr m_appsSupport; -- 2.7.4