From 512f9dc7554486a945ade89de4e974c01ce7dca5 Mon Sep 17 00:00:00 2001 From: Wieczorek Bartosz Date: Mon, 20 Mar 2017 10:22:36 +0100 Subject: [PATCH] fix one mem leak, one to go --- src/eedb/EEDB.cpp | 7 +++++-- src/eedb/EEDB.hpp | 2 +- src/eedb/widgets/AuthWidget.cpp | 5 +++++ src/eedb/widgets/AuthWidget.hpp | 2 ++ src/eedb/widgets/BootstrapTheme.cpp | 4 ++-- src/eedb/widgets/BootstrapTheme.hpp | 2 +- src/eedb/widgets/HomePage.cpp | 2 +- src/eedb/widgets/Theme.hpp | 4 +++- tests/mocks/widgets/AuthPageMock.hpp | 1 + 9 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/eedb/EEDB.cpp b/src/eedb/EEDB.cpp index 053dab8..1530bb4 100644 --- a/src/eedb/EEDB.cpp +++ b/src/eedb/EEDB.cpp @@ -37,11 +37,12 @@ EEDB::EEDB(std::unique_ptr< Session > session, AuthPageFactory authPageFactory, _authPageFactory(move(authPageFactory)), _authPage(nullptr), _homePageFactory(move(homePageFactory)), - _homePage(nullptr) { + _homePage(nullptr) // +{ root()->addStyleClass("container"); useStyleSheet("/resources/style.css"); - setTheme(_theme->create()); + setTheme(_theme->create(this)); _authPage = _authPageFactory(); _authPage->registerNeedVerification([] {}); @@ -55,6 +56,8 @@ EEDB::EEDB(std::unique_ptr< Session > session, AuthPageFactory authPageFactory, void EEDB::authEventLogin(EEDB::LoginState state) { using namespace Wt; + root()->removeStyleClass("container"); + _authPage->detachFrom(root()); _homePage = _homePageFactory(); _homePage->show(root()); diff --git a/src/eedb/EEDB.hpp b/src/eedb/EEDB.hpp index 7a09874..47cfdff 100644 --- a/src/eedb/EEDB.hpp +++ b/src/eedb/EEDB.hpp @@ -1,6 +1,6 @@ #include #include -#include + #include namespace Wt { diff --git a/src/eedb/widgets/AuthWidget.cpp b/src/eedb/widgets/AuthWidget.cpp index d1534b1..3786146 100644 --- a/src/eedb/widgets/AuthWidget.cpp +++ b/src/eedb/widgets/AuthWidget.cpp @@ -38,6 +38,11 @@ void AuthPageImpl::setParent(Wt::WContainerWidget * parent) { parent->addWidget(_authWidget); } +void AuthPageImpl::detachFrom(Wt::WContainerWidget * parent) { + if(parent) + parent->removeWidget(_authWidget); +} + void AuthPageImpl::processEnvironment() { _authWidget->processEnvironment(); } diff --git a/src/eedb/widgets/AuthWidget.hpp b/src/eedb/widgets/AuthWidget.hpp index b9a1b52..52fafdc 100644 --- a/src/eedb/widgets/AuthWidget.hpp +++ b/src/eedb/widgets/AuthWidget.hpp @@ -20,6 +20,7 @@ class AuthPage { virtual ~AuthPage() = default; virtual void setParent(Wt::WContainerWidget * parent) = 0; + virtual void detachFrom(Wt::WContainerWidget * parent ) = 0; virtual void processEnvironment() = 0; virtual Wt::Signals::connection registerNeedVerification(std::function< void() > f) { @@ -71,6 +72,7 @@ class AuthPageImpl final : public AuthPage { ~AuthPageImpl(); void setParent(Wt::WContainerWidget * parent) override; + void detachFrom(Wt::WContainerWidget * parent ) override; void processEnvironment() override; private: diff --git a/src/eedb/widgets/BootstrapTheme.cpp b/src/eedb/widgets/BootstrapTheme.cpp index 9743c60..5885054 100644 --- a/src/eedb/widgets/BootstrapTheme.cpp +++ b/src/eedb/widgets/BootstrapTheme.cpp @@ -4,8 +4,8 @@ namespace eedb { -Wt::WTheme * BootstrapTheme::create() const { - auto theme = new Wt::WBootstrapTheme(); +Wt::WTheme * BootstrapTheme::create(Wt::WObject * parent) const { + auto theme = new Wt::WBootstrapTheme(parent); theme->setVersion(Wt::WBootstrapTheme::Version2); // theme->setResponsive(true); return theme; diff --git a/src/eedb/widgets/BootstrapTheme.hpp b/src/eedb/widgets/BootstrapTheme.hpp index afc6bc3..9784044 100644 --- a/src/eedb/widgets/BootstrapTheme.hpp +++ b/src/eedb/widgets/BootstrapTheme.hpp @@ -9,6 +9,6 @@ class BootstrapTheme final : public Theme { BootstrapTheme(Theme &&) {} BootstrapTheme(const Theme &) {} - Wt::WTheme * create() const override; + Wt::WTheme * create(Wt::WObject * parent) const override; }; } diff --git a/src/eedb/widgets/HomePage.cpp b/src/eedb/widgets/HomePage.cpp index feab858..6449b19 100644 --- a/src/eedb/widgets/HomePage.cpp +++ b/src/eedb/widgets/HomePage.cpp @@ -52,7 +52,7 @@ void Home::show(Wt::WContainerWidget * container) { contentsStack->addStyleClass("contents"); // Setup a Left-aligned menu. - Wt::WMenu * mainTabs = new Wt::WMenu(contentsStack, container); + Wt::WMenu * mainTabs = new Wt::WMenu(contentsStack); mainTabs->addItem("Home"); navigation->addMenu(mainTabs); diff --git a/src/eedb/widgets/Theme.hpp b/src/eedb/widgets/Theme.hpp index 032ffe0..2b568b2 100644 --- a/src/eedb/widgets/Theme.hpp +++ b/src/eedb/widgets/Theme.hpp @@ -2,6 +2,7 @@ namespace Wt { class WTheme; +class WObject; } namespace eedb { @@ -12,7 +13,8 @@ class Theme { virtual ~Theme(); - virtual Wt::WTheme * create() const = 0; + virtual Wt::WTheme * create(Wt::WObject * parent) const = 0; }; + } diff --git a/tests/mocks/widgets/AuthPageMock.hpp b/tests/mocks/widgets/AuthPageMock.hpp index c2be3ba..a1ac188 100644 --- a/tests/mocks/widgets/AuthPageMock.hpp +++ b/tests/mocks/widgets/AuthPageMock.hpp @@ -32,6 +32,7 @@ class AuthPageMock final : public AuthPage { public: MOCK_METHOD1(setParent, void(Wt::WContainerWidget * parent)); + MOCK_METHOD1(detachFrom, void(Wt::WContainerWidget * parent)); MOCK_METHOD1(registerNeedVerification, Wt::Signals::connection(std::function< void() > f)); MOCK_METHOD1(registerOnUserWeakLogin, Wt::Signals::connection(std::function< void() > f)); MOCK_METHOD1(registerOnUserStrongLogin, Wt::Signals::connection(std::function< void() > f));