Index: ui/views/controls/native/native_view_host_aura_unittest.cc |
diff --git a/ui/views/controls/native/native_view_host_aura_unittest.cc b/ui/views/controls/native/native_view_host_aura_unittest.cc |
index 93e0fe2c8642b31321436172853c7015417c3c82..73319dff81d4b79b282a5019af990b0b52669c76 100644 |
--- a/ui/views/controls/native/native_view_host_aura_unittest.cc |
+++ b/ui/views/controls/native/native_view_host_aura_unittest.cc |
@@ -55,7 +55,9 @@ class NativeViewHostWindowObserver : public aura::WindowObserver { |
} |
}; |
- NativeViewHostWindowObserver() {} |
+ NativeViewHostWindowObserver() |
+ : visibility_state_after_reparenting_(false) {} |
+ |
virtual ~NativeViewHostWindowObserver() {} |
const std::vector<EventDetails>& events() const { return events_; } |
@@ -84,10 +86,24 @@ class NativeViewHostWindowObserver : public aura::WindowObserver { |
events_.push_back(event); |
} |
+ virtual void OnWindowParentChanged(aura::Window* window, |
sky
2014/09/11 14:55:05
Can't you at events_, since presumably OnWindowVis
ananta
2014/09/11 15:01:56
OnWindowVisibilityChanged is only called in Chrome
sky
2014/09/11 15:29:20
OnWindowVisibilityChanged is from aura::WindowObse
|
+ aura::Window* parent) OVERRIDE { |
+ if (parent && !visibility_state_after_reparenting_) |
+ visibility_state_after_reparenting_ = window->IsVisible(); |
+ } |
+ |
+ int visibility_state_after_reparenting() const { |
+ return visibility_state_after_reparenting_; |
+ } |
+ |
private: |
std::vector<EventDetails> events_; |
gfx::Rect bounds_at_visibility_changed_; |
+ // Tracks the visibility state of the window after it was reparented. |
+ // changed. |
+ int visibility_state_after_reparenting_; |
+ |
DISALLOW_COPY_AND_ASSIGN(NativeViewHostWindowObserver); |
}; |
@@ -324,11 +340,11 @@ TEST_F(NativeViewHostAuraTest, RemoveClippingWindowOrder) { |
ASSERT_EQ(3u, test_observer.events().size()); |
EXPECT_EQ(NativeViewHostWindowObserver::EVENT_HIDDEN, |
test_observer.events()[0].type); |
- EXPECT_EQ(clipping_window(), test_observer.events()[0].window); |
- EXPECT_EQ(NativeViewHostWindowObserver::EVENT_BOUNDS_CHANGED, |
- test_observer.events()[1].type); |
- EXPECT_EQ(child()->GetNativeView(), test_observer.events()[1].window); |
+ EXPECT_EQ(child()->GetNativeView(), test_observer.events()[0].window); |
EXPECT_EQ(NativeViewHostWindowObserver::EVENT_HIDDEN, |
+ test_observer.events()[1].type); |
+ EXPECT_EQ(clipping_window(), test_observer.events()[1].window); |
+ EXPECT_EQ(NativeViewHostWindowObserver::EVENT_BOUNDS_CHANGED, |
test_observer.events()[2].type); |
EXPECT_EQ(child()->GetNativeView(), test_observer.events()[2].window); |
@@ -394,4 +410,33 @@ TEST_F(NativeViewHostAuraTest, SimpleShowAndHide) { |
DestroyTopLevel(); |
} |
+// This test validates that detaching the host after it has become visible with |
+// valid bounds, hides the host native view before it is reparented. |
+TEST_F(NativeViewHostAuraTest, DetachHidesNativeViewBeforeReparenting) { |
+ CreateHost(); |
+ |
+ toplevel()->SetBounds(gfx::Rect(20, 20, 100, 100)); |
+ toplevel()->Show(); |
+ |
+ host()->SetBounds(10, 10, 80, 80); |
+ EXPECT_TRUE(clipping_window()->IsVisible()); |
+ EXPECT_TRUE(child()->IsVisible()); |
+ |
+ NativeViewHostWindowObserver test_observer; |
+ host()->native_view()->AddObserver(&test_observer); |
+ |
+ // Save away the native view in a local as it is null'ed out in the Detach |
+ // call. |
+ aura::Window* native_view = host()->native_view(); |
+ host()->Detach(); |
+ |
+ EXPECT_FALSE(clipping_window()->IsVisible()); |
+ EXPECT_FALSE(child()->IsVisible()); |
+ |
+ EXPECT_FALSE(test_observer.visibility_state_after_reparenting()); |
+ native_view->RemoveObserver(&test_observer); |
+ DestroyHost(); |
+ DestroyTopLevel(); |
+} |
+ |
} // namespace views |