Prevent memory leaks in settings and view manager 97/91197/5
authorKamil Nowac <k.nowac@samsung.com>
Wed, 5 Oct 2016 08:10:49 +0000 (10:10 +0200)
committerKamil Nowac <k.nowac@samsung.com>
Fri, 7 Oct 2016 08:34:12 +0000 (10:34 +0200)
[Issue]    N/A
[Problem]  Not deleted objects and no smart pointers
[Solution] Delete objects and add smart pointers
[Verify]   Browser should work as usual

Change-Id: Ic432bdbd971fbac366d4fe6ae6a6442965597d52

13 files changed:
services/SettingsUI/SettingsAFCreator.cpp
services/SettingsUI/SettingsAFCreator.h
services/SettingsUI/SettingsAdvanced.cpp
services/SettingsUI/SettingsDelPersData.cpp
services/SettingsUI/SettingsManager.cpp
services/SettingsUI/SettingsManager.h
services/SettingsUI/SettingsPrettySignalConnector.h
services/SettingsUI/SettingsUI.cpp
services/SettingsUI/SettingsUI.h
services/SimpleUI/SimpleUI.cpp
services/SimpleUI/SimpleUI.h
services/SimpleUI/ViewManager.cpp
services/SimpleUI/ViewManager.h

index 5f1b40bac9e75333b8b66ab8ba12684ea1c62b21..dbb26053f5bd47f966441ae7269588da19f03846 100644 (file)
@@ -52,6 +52,35 @@ SettingsAFCreator::SettingsAFCreator(Evas_Object* parent, bool profile_exists)
 SettingsAFCreator::~SettingsAFCreator()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    SPSC.autoFillCleared.disconnect_all_slots();
+
+    for (auto& it : genlistCallbackVector) {
+        unregisterCallbacksForEditfield(it->editfield);
+        evas_object_del(it->editfield);
+        unregisterCallbacksForEntry(it->entry);
+        evas_object_del(it->entry);
+    }
+
+    if (m_box)
+        evas_object_del(m_box);
+    if (m_scroller)
+        evas_object_del(m_scroller);
+}
+
+void SettingsAFCreator::unregisterCallbacksForEntry(Evas_Object* entry)
+{
+    evas_object_smart_callback_del(entry, "preedit,changed", __entry_changed_cb);
+    evas_object_smart_callback_del(entry, "changed", __entry_changed_cb);
+    evas_object_smart_callback_del(entry, "changed", __editfield_changed_cb);
+    evas_object_smart_callback_del(entry, "activated", __entry_next_key_cb);
+    evas_object_smart_callback_del(entry, "clicked", __entry_clicked_cb);
+    evas_object_smart_callback_del(entry, "activated", __done_button_cb);
+}
+
+void SettingsAFCreator::unregisterCallbacksForEditfield(Evas_Object* editfield)
+{
+    auto button(elm_object_part_content_get(editfield, "entry_clear_button"));
+    evas_object_smart_callback_del(button, "clicked", __entry_clear_button_clicked_cb);
 }
 
 bool SettingsAFCreator::loadProfile(void)
@@ -305,6 +334,17 @@ void SettingsAFCreator::addItems()
     evas_object_smart_callback_add(m_emailItemCallbackData.entry, "activated", __done_button_cb, this);
     elm_entry_input_panel_layout_set(m_emailItemCallbackData.entry, ELM_INPUT_PANEL_LAYOUT_EMAIL);
     elm_entry_prediction_allow_set(m_emailItemCallbackData.entry, EINA_FALSE);
+
+    genlistCallbackVector.push_back(&m_fullNameItemCallbackData);
+    genlistCallbackVector.push_back(&m_companyNameItemCallbackData);
+    genlistCallbackVector.push_back(&m_addressLine1ItemCallbackData);
+    genlistCallbackVector.push_back(&m_addressLine2ItemCallbackData);
+    genlistCallbackVector.push_back(&m_cityTownItemCallbackData);
+    genlistCallbackVector.push_back(&m_countryItemCallbackData);
+    genlistCallbackVector.push_back(&m_postCodeItemCallbackData);
+    genlistCallbackVector.push_back(&m_countryRegionItemCallbackData);
+    genlistCallbackVector.push_back(&m_phoneItemCallbackData);
+    genlistCallbackVector.push_back(&m_emailItemCallbackData);
 }
 
 Evas_Object* SettingsAFCreator::createScroller(Evas_Object* parent)
index d7f048da989aeb066c39e28d57b3c0e1ee3de974..6ff7ba57668c69493740e0f21d0eecb1df9fe2c9 100644 (file)
@@ -53,6 +53,9 @@ private:
     static void __entry_clicked_cb(void* data, Evas_Object* obj, void* event_info);
     static void __entry_clear_button_clicked_cb(void* data, Evas_Object* obj, void* event_info);
     static void __editfield_changed_cb(void* data, Evas_Object* obj, void* event_info);
+    void unregisterCallbacksForEntry(Evas_Object* entry);
+    void unregisterCallbacksForEditfield(Evas_Object* editfield);
+
     enum menu_type
     {
         profile_composer_title_full_name = 0,
@@ -97,6 +100,9 @@ protected:
     genlistCallbackData m_countryRegionItemCallbackData;
     genlistCallbackData m_phoneItemCallbackData;
     genlistCallbackData m_emailItemCallbackData;
+
+    std::vector<genlistCallbackData*> genlistCallbackVector;
+
     std::shared_ptr<AutoFillFormItem> m_item;
     Ewk_Context* m_ewkContext;
     bool m_profile_exists;
index 0bbdf48b6519a535bc6f0a1f504278bc115bfb00..e66b896a3c6d4c7c5875eb5ae89e9cfa88c14841 100755 (executable)
@@ -35,6 +35,7 @@ SettingsAdvanced::SettingsAdvanced(Evas_Object* parent)
 SettingsAdvanced::~SettingsAdvanced()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    SPSC.settingsSaveContentRadioPopupPtr.disconnect_all_slots();
 }
 
 void SettingsAdvanced::updateButtonMap()
index 8e91b76ca58f461878ad630611b80f47f3dfbd59..d5348026532f40e164f0967548383251df92ad26 100644 (file)
@@ -128,12 +128,11 @@ Evas_Object* SettingsDelPersData::createNormalCheckBox(Evas_Object* obj, ItemDat
         static_cast<SettingsDelPersDataOptions>(itd->id) == CACHE ||
         static_cast<SettingsDelPersDataOptions>(itd->id) == COOKIES_AND_SITE) {
         elm_check_state_set(check, EINA_TRUE);
-        setOption(static_cast<SettingsDelPersDataOptions>(itd->id), true);
+        setOption(itd->id, true);
     } else {
         elm_check_state_set(check, EINA_FALSE);
-        setOption(static_cast<SettingsDelPersDataOptions>(itd->id), false);
+        setOption(itd->id, false);
     }
-    setCheckboxes(static_cast<SettingsDelPersDataOptions>(itd->id), check);
     return check;
 }
 
@@ -155,7 +154,7 @@ void SettingsDelPersData::grid_item_check_changed(void* data, Evas_Object* obj,
     } else {
         elm_check_state_set(obj, value);
         self->setOption(
-            static_cast<SettingsDelPersDataOptions>(itd->id),
+            itd->id,
             static_cast<bool>(value));
     }
     bool val = self->getOption(SELECT_ALL);
index 86b660d950a0a1f618b8645b10cc63fb576aca77..8274a202d2a540d23d2960e88218fc356fee9e6b 100644 (file)
@@ -37,7 +37,7 @@ void SettingsManager::init(Evas_Object* parent)
     m_parent = parent;
 }
 
-std::shared_ptr<SettingsUI> SettingsManager::getView(const SettingsMainOptions& s)
+std::shared_ptr<SettingsUI>& SettingsManager::getView(const SettingsMainOptions& s)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     return addView(s);
@@ -61,9 +61,10 @@ void SettingsManager::connectOpenSignals()
         boost::bind(&SettingsManager::showSettingsAutofillCreatorUI, this, _1));
 }
 
-std::shared_ptr<SettingsUI> SettingsManager::addView(const SettingsMainOptions& s)
+std::shared_ptr<SettingsUI>& SettingsManager::addView(const SettingsMainOptions& s)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+
     if (m_settingsViews.find(s) == m_settingsViews.end()) {
         switch (s) {
             case BASE:
@@ -99,7 +100,7 @@ std::shared_ptr<SettingsUI> SettingsManager::addView(const SettingsMainOptions&
     } else {
         m_settingsViews[s]->updateButtonMap();
         if (m_settingsViews[s]->getGenlist())
-           elm_genlist_realized_items_update(m_settingsViews[s]->getGenlist());
+            elm_genlist_realized_items_update(m_settingsViews[s]->getGenlist());
     }
     return m_settingsViews[s];
 }
index b7762de73425f8f39e86dbf759b35b407be93c6c..d48534f32ecd70ff2e0b6eb6aaca756cc026ef50 100644 (file)
@@ -46,9 +46,9 @@ public:
     SettingsManager();
     ~SettingsManager();
     void init(Evas_Object* parent);
-    SetPtr getView(const SettingsMainOptions& s);
+    SetPtr& getView(const SettingsMainOptions& s);
     void connectOpenSignals();
-    std::shared_ptr<SettingsUI> addView(const SettingsMainOptions& s);
+    std::shared_ptr<SettingsUI>& addView(const SettingsMainOptions& s);
     std::string getName();
     SetPtr operator[](const SettingsMainOptions& s){ return m_settingsViews[s];};
     void showSettingsBaseUI();
index b6e9b4baed9c9023a2b71a3e9e5c6cfc4cf1a362..500da153d5803c918e37da4a05598e3151812116 100644 (file)
@@ -52,7 +52,7 @@ public:
 
     B_SIG<void ()> settingsPrivacyClicked;
     B_SIG<void ()> settingsDelPersDataClicked;
-    B_SIG<void (const std::map<SettingsDelPersDataOptions, bool>&)> deleteSelectedDataClicked;
+    B_SIG<void (const std::map<int, bool>&)> deleteSelectedDataClicked;
     B_SIG<void ()> closeSettingsUIClicked;
     B_SIG<bool (const basic_webengine::WebEngineSettings&)>getWebEngineSettingsParam;
     B_SIG<std::string (const basic_webengine::WebEngineSettings&)> getWebEngineSettingsParamString;
index 0e8009155f4c033dc4ca5a7984a1071de74c1886..ead40b8d0e226dcfa524cbd01eceb0aea7d689b1 100755 (executable)
@@ -48,9 +48,9 @@ SettingsUI::SettingsUI()
 }
 
 Elm_Gengrid_Item_Class* SettingsUI::createItemClass(
-        const char* style,
-        Elm_Gen_Item_Text_Get_Cb text_cb,
-        Elm_Gen_Item_Content_Get_Cb con_cb)
+    const char* style,
+    Elm_Gen_Item_Text_Get_Cb text_cb,
+    Elm_Gen_Item_Content_Get_Cb con_cb)
 {
     auto ic = elm_genlist_item_class_new();
     ic->item_style = style;
@@ -75,6 +75,24 @@ SettingsUI::~SettingsUI()
         elm_genlist_item_class_free(m_setting_check_on_of_item_class);
     if (m_setting_check_radio_item_class)
         elm_genlist_item_class_free(m_setting_check_radio_item_class);
+
+    for (auto check : m_checkboxes)
+        evas_object_del(check.second);
+    for (auto radio : m_radios)
+        evas_object_del(radio);
+
+    if (m_genlist) {
+        evas_object_smart_callback_del(m_genlist, "language,changed", _language_changed);
+        evas_object_del(m_genlist);
+    }
+    if (m_settings_layout)
+        evas_object_del(m_settings_layout);
+    if (m_items_layout)
+        evas_object_del(m_items_layout);
+    if (m_layout)
+        evas_object_del(m_layout);
+    if (m_radio)
+        evas_object_del(m_radio);
 }
 
 void SettingsUI::init(Evas_Object* parent)
@@ -170,7 +188,9 @@ Evas_Object* SettingsUI::_gengrid_item_content_radio_get(void* data, Evas_Object
     }
     if (strcmp(part, "elm.swallow.end") == 0) {
         auto itd = static_cast<ItemData*>(data);
-        return itd->sui->createRadioButton(obj, itd);
+        auto radio = itd->sui->createRadioButton(obj, itd);
+        itd->sui->m_radios.push_back(radio);
+        return radio;
     }
     return nullptr;
 }
@@ -224,16 +244,22 @@ Evas_Object* SettingsUI::_gengrid_item_content_onoff_get(void* data, Evas_Object
         return nullptr;
     }
     auto itd = static_cast<ItemData*>(data);
-    if (strcmp(part, "elm.swallow.end") == 0)
-        return itd->sui->createOnOffCheckBox(obj, itd);
+    if (strcmp(part, "elm.swallow.end") == 0) {
+        auto check = itd->sui->createOnOffCheckBox(obj, itd);
+        itd->sui->setCheckboxes(itd->id, check);
+        return check;
+    }
     return nullptr;
 }
 
 Evas_Object* SettingsUI::_gengrid_item_content_normal_get(void* data, Evas_Object* obj, const char* part)
 {
     auto itd = static_cast<ItemData*>(data);
-    if (strcmp(part, "elm.swallow.end") == 0)
-        return itd->sui->createNormalCheckBox(obj, itd);
+    if (strcmp(part, "elm.swallow.end") == 0) {
+        auto check = itd->sui->createNormalCheckBox(obj, itd);
+        itd->sui->setCheckboxes(itd->id, check);
+        return check;
+    }
     return nullptr;
 }
 
@@ -285,10 +311,10 @@ Evas_Object* SettingsUI::createSettingsMobilePage(Evas_Object* settings_layout)
 }
 
 Elm_Object_Item* SettingsUI::appendGenlist(
-        Evas_Object* genlist,
-        Elm_Gengrid_Item_Class* it_class,
-        const void *data,
-        Evas_Smart_Cb func)
+    Evas_Object* genlist,
+    Elm_Gengrid_Item_Class* it_class,
+    const void *data,
+    Evas_Smart_Cb func)
 {
     return elm_genlist_item_append(genlist, it_class, data, nullptr, ELM_GENLIST_ITEM_NONE, func, this);
 }
index 3cc046609e42fe6c3068323c619196711e9c7686..399f579ea8aba4a3b9a02938a5523dcb7ccc03f6 100644 (file)
@@ -77,11 +77,11 @@ public:
     Evas_Object* createSettingsMobilePage(Evas_Object* settings_layout);
     Evas_Object* createMainView(Evas_Object* settings_layout);
     Evas_Object* getGenlist() { return m_genlist; }
-    std::map<SettingsDelPersDataOptions, bool> getOptions() const { return m_option; }
-    bool getOption(const SettingsDelPersDataOptions& opt) const { return m_option.at(opt); }
-    std::map<SettingsDelPersDataOptions, Evas_Object*> getCheckboxes() { return m_checkboxes; }
-    void setOption(const SettingsDelPersDataOptions& option, bool value) { m_option[option] = value; }
-    void setCheckboxes(const SettingsDelPersDataOptions& option, Evas_Object* check) { m_checkboxes[option] = check; }
+    std::map<int, bool> getOptions() const { return m_option; }
+    bool getOption(const int& opt) const { return m_option.at(opt); }
+    std::map<int, Evas_Object*> getCheckboxes() { return m_checkboxes; }
+    void setOption(const int& option, bool value) { m_option[option] = value; }
+    void setCheckboxes(const int& option, Evas_Object* check) { m_checkboxes[option] = check; }
     Evas_Object* getRadioGroup() { return m_radio; }
 
 private:
@@ -101,17 +101,18 @@ private:
 
 protected:
     SharedNaviframeWrapper m_naviframe;
-    Evas_Object* m_genlist;
     std::string m_edjFilePath;
+    Evas_Object* m_genlist;
     Evas_Object* m_settings_layout;
     Evas_Object* m_items_layout;
     Evas_Object* m_parent;
     Evas_Object* m_layout;
+    Evas_Object* m_radio;
     std::map<unsigned, ItemData> m_buttonsMap;
-    std::map<SettingsDelPersDataOptions, bool> m_option;
-    std::map<SettingsDelPersDataOptions,Evas_Object*> m_checkboxes;
+    std::map<int, bool> m_option;
+    std::map<int, Evas_Object*> m_checkboxes;
+    std::vector<Evas_Object*> m_radios;
     std::map<int, Elm_Object_Item*> m_genlistItems;
-    Evas_Object* m_radio;
     Elm_Gengrid_Item_Class* m_setting_item_class;
     Elm_Gengrid_Item_Class* m_setting_double_item_class;
     Elm_Gengrid_Item_Class* m_setting_check_on_of_item_class;
index 87f991f9ecc3db06fc10def45a6c16f7369c2b2c..9c4b3220757d458b67e40ddf3bdcee988f599b10 100755 (executable)
@@ -197,7 +197,7 @@ int SimpleUI::exec(const std::string& _url, const std::string& _caller)
             initModelServices();
 
             //Push first view to stack.
-            pushViewToStack(m_webPageUI.get());
+            pushViewToStack(m_webPageUI);
 
             // Register H/W back key callback
             m_platformInputManager->registerHWKeyCallback(m_viewManager.getContent());
@@ -282,7 +282,6 @@ void SimpleUI::loadUIServices()
         m_settingsManager =
             std::dynamic_pointer_cast<SettingsManager, core::AbstractService>(
                 core::ServiceManager::getInstance().getService("org.tizen.browser.settingsui"));
-        m_settingsUI = m_settingsManager->getView(SettingsMainOptions::BASE);
     }));
     auto futureBookmarkFlow(std::async(std::launch::async, [this](){
         m_bookmarkFlowUI =
@@ -680,9 +679,6 @@ void SimpleUI::initUIServices()
     M_ASSERT(m_historyUI.get());
     m_historyUI->init(viewManager);
 
-    M_ASSERT(m_settingsUI.get());
-    m_settingsUI->init(viewManager);
-
     M_ASSERT(m_bookmarkFlowUI.get());
     m_bookmarkFlowUI->init(viewManager);
 
@@ -711,7 +707,7 @@ void SimpleUI::initModelServices()
     m_certificateContents->init();
 }
 
-void SimpleUI::pushViewToStack(interfaces::AbstractUIComponent* view)
+void SimpleUI::pushViewToStack(const sAUI& view)
 {
     m_viewManager.pushViewToStack(view);
     enableManualRotation(isManualRotation(view));
@@ -723,7 +719,7 @@ void SimpleUI::popTheStack()
     enableManualRotation(isManualRotation(m_viewManager.topOfStack()));
 }
 
-void SimpleUI::popStackTo(interfaces::AbstractUIComponent* view)
+void SimpleUI::popStackTo(const sAUI& view)
 {
     m_viewManager.popStackTo(view);
     enableManualRotation(isManualRotation(view));
@@ -769,7 +765,7 @@ void SimpleUI::switchViewToQuickAccess()
 
     m_webPageUI->switchViewToQuickAccess(m_quickAccess->getContent());
     m_webEngine->disconnectCurrentWebViewSignals();
-    popStackTo(m_webPageUI.get());
+    popStackTo(m_webPageUI);
 }
 
 void SimpleUI::openNewTab(const std::string &uri, const std::string& title,
@@ -840,7 +836,7 @@ void SimpleUI::onOpenURL(const std::string& url, const std::string& title, bool
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     if (m_webPageUI) {
-        popStackTo(m_webPageUI.get());
+        popStackTo(m_webPageUI);
         if (tabsCount() == 0 || m_webPageUI->stateEquals(WPUState::QUICK_ACCESS))
             openNewTab(url, title, boost::none, desktopMode, basic_webengine::TabOrigin::QUICKACCESS);
         else {
@@ -897,7 +893,7 @@ void SimpleUI::onBookmarkClicked(std::shared_ptr<tizen_browser::services::Bookma
             m_webPageUI->getURIEntry().clearFocus();
             closeBookmarkManagerUI();
         }
-        popStackTo(m_webPageUI.get());
+        popStackTo(m_webPageUI);
     }
 }
 
@@ -926,7 +922,7 @@ void SimpleUI::onBookmarkEdit(std::shared_ptr<services::BookmarkItem> bookmarkIt
         m_bookmarkFlowUI->setState(true);
         m_bookmarkFlowUI->setTitle(bookmarkItem->getTitle());
         m_bookmarkFlowUI->setFolder(m_favoriteService->getBookmarkItem(bookmarkItem->getParent()));
-        pushViewToStack(m_bookmarkFlowUI.get());
+        pushViewToStack(m_bookmarkFlowUI);
     }
 }
 
@@ -970,7 +966,7 @@ void SimpleUI::onNewFolderPopupClick(const std::string& folder_name, int parent)
         return;
     }
     services::SharedBookmarkItem folder = m_favoriteService->addFolder(folder_name, parent);
-    if (m_viewManager.topOfStack() == m_bookmarkManagerUI.get())
+    if (m_viewManager.topOfStack() == m_bookmarkManagerUI)
         m_bookmarkManagerUI->addBookmarkItemCurrentFolder(folder);
 }
 
@@ -1048,7 +1044,7 @@ void SimpleUI::onEditFolderPopupClicked(const std::string& newName, services::Sh
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     m_favoriteService->editBookmark(item->getId(), "", newName, item->getParent());
     services::SharedBookmarkItem parentItem = m_favoriteService->getBookmarkItem(item->getParent());
-    if (m_viewManager.topOfStack() == m_bookmarkManagerUI.get())
+    if (m_viewManager.topOfStack() == m_bookmarkManagerUI)
         m_bookmarkManagerUI->addBookmarkItems(nullptr, m_favoriteService->getAllBookmarkItems(parentItem->getId()));
 }
 
@@ -1164,13 +1160,13 @@ void SimpleUI::onBackPressed()
         return;
     } else if (m_popupVector.size() > 0) {
         m_popupVector.back()->onBackPressed();
-    } else if (m_viewManager.topOfStack() == m_bookmarkManagerUI.get()) {
+    } else if (m_viewManager.topOfStack() == m_bookmarkManagerUI) {
         m_bookmarkManagerUI->onBackPressed();
-    } else if (m_viewManager.topOfStack() == m_webPageUI->getQuickAccessEditUI().get()) {
+    } else if (m_viewManager.topOfStack() == m_webPageUI->getQuickAccessEditUI()) {
         m_webPageUI->getQuickAccessEditUI()->backPressed();
     } else if (m_viewManager.topOfStack() == nullptr) {
         switchViewToQuickAccess();
-    } else if ((m_viewManager.topOfStack() == m_webPageUI.get())) {
+    } else if ((m_viewManager.topOfStack() == m_webPageUI)) {
         if (m_webPageUI->stateEquals(WPUState::QUICK_ACCESS)) {
             if (m_quickAccess->canBeBacked(m_webEngine->tabsCount())) {
                 m_quickAccess->backButtonClicked();
@@ -1180,7 +1176,7 @@ void SimpleUI::onBackPressed()
         } else {
             m_webEngine->backButtonClicked();
         }
-    } else if (m_viewManager.topOfStack() == m_settingsUI.get()) {
+    } else if (m_viewManager.topOfStack() == m_settingsUI) {
         closeSettingsUI();
     } else {
         popTheStack();
@@ -1214,14 +1210,14 @@ void SimpleUI::dismissPopup(interfaces::AbstractPopup* popup)
 void SimpleUI::onMenuButtonPressed()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    interfaces::AbstractContextMenu *view = dynamic_cast<interfaces::AbstractContextMenu*>(m_viewManager.topOfStack());
+    auto view = dynamic_cast<interfaces::AbstractContextMenu*>(m_viewManager.topOfStack().get());
     if (view)
         view->showContextMenu();
 }
 
-bool SimpleUI::isManualRotation(interfaces::AbstractUIComponent* view)
+bool SimpleUI::isManualRotation(const sAUI& view)
 {
-    WebPageUI *webPageUI = dynamic_cast<WebPageUI *>(view);
+    WebPageUI *webPageUI = dynamic_cast<WebPageUI*>(view.get());
     return (webPageUI && webPageUI->stateEquals(WPUState::MAIN_WEB_PAGE));
 }
 
@@ -1249,11 +1245,16 @@ void SimpleUI::onRotation()
     m_current_angle = m_temp_angle;
     m_webEngine->orientationChanged();
     if (!m_manualRotation) {
-        m_bookmarkFlowUI->orientationChanged();
-        m_settingsUI->orientationChanged();
-        m_bookmarkManagerUI->orientationChanged();
-        m_webPageUI->orientationChanged();
-        m_tabUI->orientationChanged();
+        if (m_bookmarkFlowUI)
+            m_bookmarkFlowUI->orientationChanged();
+        if (m_settingsUI)
+            m_settingsUI->orientationChanged();
+        if (m_bookmarkManagerUI)
+            m_bookmarkManagerUI->orientationChanged();
+        if (m_webPageUI)
+            m_webPageUI->orientationChanged();
+        if (m_tabUI)
+            m_tabUI->orientationChanged();
 
         if (!m_popupVector.empty())
             m_popupVector.back()->orientationChanged();
@@ -1443,7 +1444,7 @@ void SimpleUI::closeFindOnPageUI()
 void SimpleUI::showTabUI()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    pushViewToStack(m_tabUI.get());
+    pushViewToStack(m_tabUI);
 
     if (!m_webPageUI->stateEquals(WPUState::QUICK_ACCESS) &&
         m_webEngine->tabsCount() > 0 &&
@@ -1459,7 +1460,7 @@ void SimpleUI::showTabUI()
 void SimpleUI::closeTabUI()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    if (m_viewManager.topOfStack() == m_tabUI.get())
+    if (m_viewManager.topOfStack() == m_tabUI)
         popTheStack();
 }
 
@@ -1482,7 +1483,7 @@ void SimpleUI::tabClicked(const tizen_browser::basic_webengine::TabId& tabId)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     switchToTab(tabId);
-    popStackTo(m_webPageUI.get());
+    popStackTo(m_webPageUI);
 }
 
 void SimpleUI::closeTabsClicked(const tizen_browser::basic_webengine::TabId& tabId)
@@ -1616,7 +1617,7 @@ Evas_Object* SimpleUI::showHistoryUI(Evas_Object* parent, SharedNaviframeWrapper
 void SimpleUI::closeHistoryUI()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    if (m_viewManager.topOfStack() == m_historyUI.get())
+    if (m_viewManager.topOfStack() == m_historyUI)
         popTheStack();
 }
 
@@ -1625,7 +1626,7 @@ void SimpleUI::showSettings(unsigned s)
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     m_settingsManager->init(m_viewManager.getContent());
     m_settingsUI = m_settingsManager->getView(static_cast<SettingsMainOptions>(s));
-    pushViewToStack(m_settingsUI.get());
+    pushViewToStack(m_settingsUI);
 }
 
 void SimpleUI::closeSettingsUI()
@@ -1734,7 +1735,7 @@ void SimpleUI::switchToMobileMode()
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     if (!m_webPageUI->stateEquals(WPUState::QUICK_ACCESS)) {
         m_webEngine->switchToMobileMode();
-        popStackTo(m_webPageUI.get());
+        popStackTo(m_webPageUI);
         m_webEngine->reload();
     } else {
         m_quickAccess->setDesktopMode(false);
@@ -1756,14 +1757,14 @@ void SimpleUI::editQuickAccess()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     m_quickAccess->editQuickAccess();
-    pushViewToStack(m_webPageUI->getQuickAccessEditUI().get());
+    pushViewToStack(m_webPageUI->getQuickAccessEditUI());
 }
 
 void SimpleUI::deleteMostVisited()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     m_quickAccess->deleteMostVisited();
-    pushViewToStack(m_webPageUI->getQuickAccessEditUI().get());
+    pushViewToStack(m_webPageUI->getQuickAccessEditUI());
 }
 
 void SimpleUI::addQuickAccess()
@@ -1807,13 +1808,13 @@ void SimpleUI::showBookmarkFlowUI()
         m_bookmarkFlowUI->setFolder(m_favoriteService->getRoot());
     }
 
-    pushViewToStack(m_bookmarkFlowUI.get());
+    pushViewToStack(m_bookmarkFlowUI);
 }
 
 void SimpleUI::closeBookmarkFlowUI()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    if (m_viewManager.topOfStack() == m_bookmarkFlowUI.get())
+    if (m_viewManager.topOfStack() == m_bookmarkFlowUI)
         popTheStack();
 }
 
@@ -1822,7 +1823,7 @@ void SimpleUI::showBookmarkManagerUI(std::shared_ptr<services::BookmarkItem> par
 {
     BROWSER_LOGD("[%s:%d]", __PRETTY_FUNCTION__, __LINE__);
     m_bookmarkManagerUI->setState(state);
-    pushViewToStack(m_bookmarkManagerUI.get());
+    pushViewToStack(m_bookmarkManagerUI);
     m_bookmarkManagerUI->addBookmarkItems(parent,
         m_favoriteService->getAllBookmarkItems(parent->getId()));
 }
@@ -1852,7 +1853,7 @@ void SimpleUI::showHomePage()
         stateString.erase(it, Translations::CurrentPage.length());
     }
     auto url = m_webPageUI->getURIEntry().rewriteURI(stateString);
-    popStackTo(m_webPageUI.get());
+    popStackTo(m_webPageUI);
     openNewTab(url);
 }
 
@@ -1866,11 +1867,11 @@ void SimpleUI::redirectedWebPage(const std::string& oldUrl, const std::string& n
 void SimpleUI::closeBookmarkManagerUI()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    if (m_viewManager.topOfStack() == m_bookmarkManagerUI.get())
+    if (m_viewManager.topOfStack() == m_bookmarkManagerUI)
     popTheStack();
 }
 
-void SimpleUI::settingsDeleteSelectedData(const std::map<SettingsDelPersDataOptions, bool>& options)
+void SimpleUI::settingsDeleteSelectedData(const std::map<int, bool>& options)
 {
     BROWSER_LOGD("[%s]: Deleting selected data", __func__);
     M_ASSERT(m_viewManager);
@@ -1894,7 +1895,7 @@ void SimpleUI::settingsDeleteSelectedData(const std::map<SettingsDelPersDataOpti
     }
 }
 
-void SimpleUI::onDeleteSelectedDataButton(const PopupButtons& button, const std::map<SettingsDelPersDataOptions, bool>& options)
+void SimpleUI::onDeleteSelectedDataButton(const PopupButtons& button, const std::map<int, bool>& options)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     if (button == OK) {
@@ -1965,7 +1966,7 @@ void SimpleUI::updateView()
 {
     int tabs = m_webEngine->tabsCount();
     BROWSER_LOGD("[%s] Opened tabs: %d", __func__, tabs);
-    if (m_viewManager.topOfStack() == m_webPageUI.get()) {
+    if (m_viewManager.topOfStack() == m_webPageUI) {
         if (tabs == 0) {
             switchViewToQuickAccess();
         } else if (!m_webPageUI->stateEquals(WPUState::QUICK_ACCESS)) {
@@ -2010,7 +2011,7 @@ void SimpleUI::searchWebPage(std::string &text, int flags)
 void SimpleUI::showPasswordUI()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    pushViewToStack(&(m_tabUI->getPasswordUI()));
+    pushViewToStack(sAUI(&m_tabUI->getPasswordUI()));
 }
 
 void SimpleUI::closeTopView()
index 537fbf81b4d18e5c6dc79012a963c81443a135e4..e0ef89f0322b59a902f0b96ec2a77edc84de3ed7 100644 (file)
@@ -103,9 +103,9 @@ private:
     void initModelServices();
     void initUIServices();
     void connectModelSignals();
-    void pushViewToStack(interfaces::AbstractUIComponent* view);
+    void pushViewToStack(const sAUI& view);
     void popTheStack();
-    void popStackTo(interfaces::AbstractUIComponent* view);
+    void popStackTo(const sAUI& view);
     void faviconChanged(tools::BrowserImagePtr favicon);
     void restoreLastSession();
     Evas_Object* createWebLayout(Evas_Object* parent);
@@ -281,7 +281,7 @@ private:
     void registerHWKeyCallback();
     void unregisterHWKeyCallback();
 
-    bool isManualRotation(interfaces::AbstractUIComponent* view);
+    bool isManualRotation(const sAUI& view);
     void enableManualRotation(bool enable);
     void rotatePrepared();
     void onRotation();
@@ -317,10 +317,10 @@ private:
     void closeTab();
     void closeTab(const tizen_browser::basic_webengine::TabId& id);
 
-    void settingsDeleteSelectedData(const std::map<SettingsDelPersDataOptions, bool>& option);
+    void settingsDeleteSelectedData(const std::map<int, bool>& option);
     void settingsResetMostVisited();
     void settingsResetBrowser();
-    void onDeleteSelectedDataButton(const PopupButtons& button, const std::map<SettingsDelPersDataOptions, bool>& options);
+    void onDeleteSelectedDataButton(const PopupButtons& button, const std::map<int, bool>& options);
     void onDeleteMostVisitedButton(std::shared_ptr<PopupData> popupData);
     void onResetBrowserButton(PopupButtons button, std::shared_ptr<PopupData> popupData);
     void tabLimitPopupButtonClicked(PopupButtons button);
index 8f8916ecf724d2c93f5f7d384722ea1839c49fc3..49f5561aa0755963edd99dfa41d8c3539f99f6ae 100755 (executable)
@@ -78,30 +78,30 @@ ViewManager::~ViewManager()
     evas_object_del(m_mainLayout);
 }
 
-void ViewManager::popStackTo(interfaces::AbstractUIComponent* view)
+void ViewManager::popStackTo(const sAUI& view)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     M_ASSERT(view);
-    interfaces::AbstractUIComponent* previousView = m_viewStack.top();
+    sAUI previousView = m_viewStack.top();
 
     while (!m_viewStack.empty() && m_viewStack.top() != view)
         m_viewStack.pop();
     updateLayout(previousView);
-    BROWSER_LOGD("[%s:%d] new top: %p", __PRETTY_FUNCTION__, __LINE__, topOfStack());
+    BROWSER_LOGD("[%s:%d] new top: %p", __PRETTY_FUNCTION__, __LINE__, topOfStack().get());
 }
 
 void ViewManager::popTheStack()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     if (!m_viewStack.empty()) {
-        interfaces::AbstractUIComponent* previousView = m_viewStack.top();
+        sAUI previousView = m_viewStack.top();
         m_viewStack.pop();
         updateLayout(previousView);
     }
-    BROWSER_LOGD("[%s:%d] new top: %p", __PRETTY_FUNCTION__, __LINE__, topOfStack());
+    BROWSER_LOGD("[%s:%d] new top: %p", __PRETTY_FUNCTION__, __LINE__, topOfStack().get());
 }
 
-void ViewManager::pushViewToStack(interfaces::AbstractUIComponent* view)
+void ViewManager::pushViewToStack(const sAUI& view)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
 
@@ -109,17 +109,17 @@ void ViewManager::pushViewToStack(interfaces::AbstractUIComponent* view)
     if (topOfStack() == view) {
        BROWSER_LOGD(
            "[%s:%d] View %p is already on stack !!!",
-           __PRETTY_FUNCTION__, __LINE__, view);
+           __PRETTY_FUNCTION__, __LINE__, view.get());
        return;
     }
-    interfaces::AbstractUIComponent* previousView = topOfStack();
+    sAUI previousView = topOfStack();
     m_viewStack.push(view);
     updateLayout(previousView);
-    BROWSER_LOGD("[%s:%d] new top: %p", __PRETTY_FUNCTION__, __LINE__, topOfStack());
+    BROWSER_LOGD("[%s:%d] new top: %p", __PRETTY_FUNCTION__, __LINE__, topOfStack().get());
 }
 
 
-void ViewManager::updateLayout(interfaces::AbstractUIComponent* previousView)
+void ViewManager::updateLayout(const sAUI& previousView)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     Evas_Object* swallowed = elm_layout_content_get(m_mainLayout, "content");
@@ -160,12 +160,12 @@ Evas_Object* ViewManager::getConformant() {
     return m_conformant;
 }
 
-interfaces::AbstractUIComponent* ViewManager::topOfStack()
+sAUI& ViewManager::topOfStack()
 {
+    static sAUI ret = sAUI(nullptr);
     if (!m_viewStack.empty())
         return m_viewStack.top();
-    else
-        return nullptr;
+    return ret;
 }
 
 
index 51082d9b87dc4f9b8c9a49c77a37ea74adc22cca..9a7984f0627b48100b59ddbac0f45f19d0655581 100644 (file)
@@ -34,6 +34,8 @@
 namespace tizen_browser{
 namespace base_ui{
 
+using AUI = interfaces::AbstractUIComponent;
+using sAUI = std::shared_ptr<AUI>;
 
 /**
  * @brief This class simplifies UI component management. It is a views stack.
@@ -67,7 +69,7 @@ public:
  *
  * @param A view which stack should be popped to. Do not use nullptr.
  */
-    void popStackTo(interfaces::AbstractUIComponent* view);
+    void popStackTo(const sAUI& view);
 
 /**
  * @brief Pops actual view from the stack, hides it and if there is any view
@@ -81,7 +83,7 @@ public:
  *
  * @param View pushed to stack. Do not use nullptr.
  */
-    void pushViewToStack(interfaces::AbstractUIComponent* view);
+    void pushViewToStack(const sAUI& view);
 
 /**
  * @brief Function returns elm layout used in view management. It's parent is
@@ -104,7 +106,7 @@ public:
  *
  * @return actual dispalyed view
  */
-    interfaces::AbstractUIComponent* topOfStack();
+    sAUI& topOfStack();
 
 /**
  * @brief Signal checks if browser is in landscape mode.
@@ -114,12 +116,12 @@ public:
     boost::signals2::signal<bool ()> isLandscape;
 
 private:
-    void updateLayout(interfaces::AbstractUIComponent* previousView);
+    void updateLayout(const sAUI& previousView);
 private:
     Evas_Object* m_mainLayout;
     Evas_Object* m_conformant;
     Evas_Object* m_parentWindow;
-    std::stack<interfaces::AbstractUIComponent*> m_viewStack;
+    std::stack<sAUI> m_viewStack;
 };
 
 }//namespace base_ui