diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2015-03-26 21:45:50 +0000 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2015-04-10 13:07:59 +0100 |
commit | 5c91c9fed51bf10387a7673cb8c1ccd95e0469d0 (patch) | |
tree | 53efd025281751a0ab3e668a473cac952ef28cf4 /vcl | |
parent | 7acf94a7cfca389e73016ec337708498bc12cc3c (diff) |
Fix LazyDelete crasher, and add & test more post-dispose robustness.
Change-Id: I0e9460cb33b7cb5da9ddb950ff27bac8cbf7fed8
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/qa/cppunit/lifecycle.cxx | 17 | ||||
-rw-r--r-- | vcl/source/window/window2.cxx | 16 |
2 files changed, 25 insertions, 8 deletions
diff --git a/vcl/qa/cppunit/lifecycle.cxx b/vcl/qa/cppunit/lifecycle.cxx index 8be94a5f6c3e..12b0a5146631 100644 --- a/vcl/qa/cppunit/lifecycle.cxx +++ b/vcl/qa/cppunit/lifecycle.cxx @@ -30,6 +30,7 @@ public: void testIsolatedWidgets(); void testParentedWidgets(); void testChildDispose(); + void testPostDispose(); CPPUNIT_TEST_SUITE(LifecycleTest); CPPUNIT_TEST(testCast); @@ -38,6 +39,7 @@ public: CPPUNIT_TEST(testIsolatedWidgets); CPPUNIT_TEST(testParentedWidgets); CPPUNIT_TEST(testChildDispose); + CPPUNIT_TEST(testPostDispose); CPPUNIT_TEST_SUITE_END(); }; @@ -125,6 +127,21 @@ void LifecycleTest::testChildDispose() xWin->disposeOnce(); } +void LifecycleTest::testPostDispose() +{ + VclPtr<WorkWindow> xWin(new WorkWindow((vcl::Window *)NULL, WB_STDWORK)); + xWin->disposeOnce(); + + // check selected methods continue to work post-dispose + CPPUNIT_ASSERT(!xWin->GetParent()); + xWin->Show(); + CPPUNIT_ASSERT(!xWin->IsReallyShown()); + CPPUNIT_ASSERT(!xWin->IsEnabled()); + CPPUNIT_ASSERT(!xWin->IsInputEnabled()); + CPPUNIT_ASSERT(!xWin->GetChild(0)); + CPPUNIT_ASSERT(!xWin->GetWindow(0)); +} + CPPUNIT_TEST_SUITE_REGISTRATION(LifecycleTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/vcl/source/window/window2.cxx b/vcl/source/window/window2.cxx index 95468f3a5e9f..cf8fd3f930a0 100644 --- a/vcl/source/window/window2.cxx +++ b/vcl/source/window/window2.cxx @@ -975,27 +975,27 @@ vcl::Window* Window::ImplGetWindow() ImplFrameData* Window::ImplGetFrameData() { - return mpWindowImpl->mpFrameData; + return mpWindowImpl ? mpWindowImpl->mpFrameData : NULL; } SalFrame* Window::ImplGetFrame() const { - return mpWindowImpl->mpFrame; + return mpWindowImpl ? mpWindowImpl->mpFrame : NULL; } vcl::Window* Window::ImplGetParent() const { - return mpWindowImpl->mpParent; + return mpWindowImpl ? mpWindowImpl->mpParent.get() : NULL; } vcl::Window* Window::ImplGetClientWindow() const { - return mpWindowImpl->mpClientWindow; + return mpWindowImpl ? mpWindowImpl->mpClientWindow.get() : NULL; } vcl::Window* Window::ImplGetBorderWindow() const { - return mpWindowImpl->mpBorderWindow; + return mpWindowImpl ? mpWindowImpl->mpBorderWindow.get() : NULL; } vcl::Window* Window::ImplGetFirstOverlapWindow() @@ -1237,7 +1237,7 @@ bool Window::IsReallyVisible() const bool Window::IsReallyShown() const { - return mpWindowImpl->mbReallyShown; + return mpWindowImpl ? mpWindowImpl->mbReallyShown : false; } bool Window::IsInInitShow() const @@ -1247,12 +1247,12 @@ bool Window::IsInInitShow() const bool Window::IsEnabled() const { - return !mpWindowImpl->mbDisabled; + return mpWindowImpl ? !mpWindowImpl->mbDisabled : false; } bool Window::IsInputEnabled() const { - return !mpWindowImpl->mbInputDisabled; + return mpWindowImpl ? !mpWindowImpl->mbInputDisabled : false; } bool Window::IsAlwaysEnableInput() const |