Chromium Code Reviews| Index: ui/wm/core/transient_window_manager_unittest.cc |
| diff --git a/ui/wm/core/transient_window_manager_unittest.cc b/ui/wm/core/transient_window_manager_unittest.cc |
| index bbc3820c479dd6a17a0df55f77b3df3702880d03..9e2e9570f670de2ccf82a74db3fa809c3b8ba15f 100644 |
| --- a/ui/wm/core/transient_window_manager_unittest.cc |
| +++ b/ui/wm/core/transient_window_manager_unittest.cc |
| @@ -8,6 +8,7 @@ |
| #include "ui/aura/test/aura_test_base.h" |
| #include "ui/aura/test/test_windows.h" |
| #include "ui/aura/window.h" |
| +#include "ui/aura/window_observer.h" |
| #include "ui/wm/core/transient_window_observer.h" |
| #include "ui/wm/core/window_util.h" |
| #include "ui/wm/core/wm_state.h" |
| @@ -44,6 +45,25 @@ class TestTransientWindowObserver : public TransientWindowObserver { |
| DISALLOW_COPY_AND_ASSIGN(TestTransientWindowObserver); |
| }; |
| +class WindowVisibilityObserver : public aura::WindowObserver { |
| + public: |
| + WindowVisibilityObserver(Window* observed_window, |
| + scoped_ptr<Window> owned_window) |
| + : observed_window_(observed_window), owned_window_(owned_window.Pass()) { |
| + observed_window_->AddObserver(this); |
| + } |
| + ~WindowVisibilityObserver() override { |
| + observed_window_->RemoveObserver(this); |
| + } |
| + |
| + void OnWindowVisibilityChanged(Window* window, bool visible) override { |
| + owned_window_.reset(); |
| + } |
| + private: |
| + Window* observed_window_; |
| + scoped_ptr<Window> owned_window_; |
| +}; |
|
oshima
2015/11/19 18:05:40
nit: DISALLOW_COPY_AND_ASSIGN
|
| + |
| class TransientWindowManagerTest : public aura::test::AuraTestBase { |
| public: |
| TransientWindowManagerTest() {} |
| @@ -312,6 +332,17 @@ TEST_F(TransientWindowManagerTest, StackUponCreation) { |
| EXPECT_EQ("0 2 1", ChildWindowIDsAsString(root_window())); |
| } |
| +// Tests for a crash when window destroyed inside |
| +// UpdateTransientChildVisibility loop. |
| +TEST_F(TransientWindowManagerTest, CrashOnVisibilityChange) { |
| + scoped_ptr<Window> window1(CreateTransientChild(1, root_window())); |
| + scoped_ptr<Window> window2(CreateTransientChild(2, root_window())); |
| + window1->Show(); |
| + window2->Show(); |
| + |
| + WindowVisibilityObserver visibility_observer(window1.get(), window2.Pass()); |
| + root_window()->Hide(); |
| +} |
| // Tests that windows are restacked properly after a call to AddTransientChild() |
| // or RemoveTransientChild(). |
| TEST_F(TransientWindowManagerTest, RestackUponAddOrRemoveTransientChild) { |