| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/views/widget/native_widget_aura.h" | 5 #include "ui/views/widget/native_widget_aura.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 Widget::InitParams params(Widget::InitParams::TYPE_POPUP); | 30 Widget::InitParams params(Widget::InitParams::TYPE_POPUP); |
| 31 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 31 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| 32 params.parent = parent; | 32 params.parent = parent; |
| 33 widget->Init(params); | 33 widget->Init(params); |
| 34 return static_cast<NativeWidgetAura*>(widget->native_widget()); | 34 return static_cast<NativeWidgetAura*>(widget->native_widget()); |
| 35 } | 35 } |
| 36 | 36 |
| 37 class NativeWidgetAuraTest : public aura::test::AuraTestBase { | 37 class NativeWidgetAuraTest : public aura::test::AuraTestBase { |
| 38 public: | 38 public: |
| 39 NativeWidgetAuraTest() {} | 39 NativeWidgetAuraTest() {} |
| 40 virtual ~NativeWidgetAuraTest() {} | 40 ~NativeWidgetAuraTest() override {} |
| 41 | 41 |
| 42 // testing::Test overrides: | 42 // testing::Test overrides: |
| 43 virtual void SetUp() override { | 43 void SetUp() override { |
| 44 AuraTestBase::SetUp(); | 44 AuraTestBase::SetUp(); |
| 45 new wm::DefaultActivationClient(root_window()); | 45 new wm::DefaultActivationClient(root_window()); |
| 46 host()->SetBounds(gfx::Rect(640, 480)); | 46 host()->SetBounds(gfx::Rect(640, 480)); |
| 47 } | 47 } |
| 48 | 48 |
| 49 private: | 49 private: |
| 50 DISALLOW_COPY_AND_ASSIGN(NativeWidgetAuraTest); | 50 DISALLOW_COPY_AND_ASSIGN(NativeWidgetAuraTest); |
| 51 }; | 51 }; |
| 52 | 52 |
| 53 TEST_F(NativeWidgetAuraTest, CenterWindowLargeParent) { | 53 TEST_F(NativeWidgetAuraTest, CenterWindowLargeParent) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 window->CenterWindow(gfx::Size(500, 600)); | 96 window->CenterWindow(gfx::Size(500, 600)); |
| 97 | 97 |
| 98 // |window| should be no bigger than |parent|. | 98 // |window| should be no bigger than |parent|. |
| 99 EXPECT_EQ("20,40 480x320", window->GetNativeWindow()->bounds().ToString()); | 99 EXPECT_EQ("20,40 480x320", window->GetNativeWindow()->bounds().ToString()); |
| 100 widget->CloseNow(); | 100 widget->CloseNow(); |
| 101 } | 101 } |
| 102 | 102 |
| 103 class TestLayoutManagerBase : public aura::LayoutManager { | 103 class TestLayoutManagerBase : public aura::LayoutManager { |
| 104 public: | 104 public: |
| 105 TestLayoutManagerBase() {} | 105 TestLayoutManagerBase() {} |
| 106 virtual ~TestLayoutManagerBase() {} | 106 ~TestLayoutManagerBase() override {} |
| 107 | 107 |
| 108 // aura::LayoutManager: | 108 // aura::LayoutManager: |
| 109 virtual void OnWindowResized() override {} | 109 void OnWindowResized() override {} |
| 110 virtual void OnWindowAddedToLayout(aura::Window* child) override {} | 110 void OnWindowAddedToLayout(aura::Window* child) override {} |
| 111 virtual void OnWillRemoveWindowFromLayout(aura::Window* child) override {} | 111 void OnWillRemoveWindowFromLayout(aura::Window* child) override {} |
| 112 virtual void OnWindowRemovedFromLayout(aura::Window* child) override {} | 112 void OnWindowRemovedFromLayout(aura::Window* child) override {} |
| 113 virtual void OnChildWindowVisibilityChanged(aura::Window* child, | 113 void OnChildWindowVisibilityChanged(aura::Window* child, |
| 114 bool visible) override {} | 114 bool visible) override {} |
| 115 virtual void SetChildBounds(aura::Window* child, | 115 void SetChildBounds(aura::Window* child, |
| 116 const gfx::Rect& requested_bounds) override {} | 116 const gfx::Rect& requested_bounds) override {} |
| 117 | 117 |
| 118 private: | 118 private: |
| 119 DISALLOW_COPY_AND_ASSIGN(TestLayoutManagerBase); | 119 DISALLOW_COPY_AND_ASSIGN(TestLayoutManagerBase); |
| 120 }; | 120 }; |
| 121 | 121 |
| 122 // Used by ShowMaximizedDoesntBounceAround. See it for details. | 122 // Used by ShowMaximizedDoesntBounceAround. See it for details. |
| 123 class MaximizeLayoutManager : public TestLayoutManagerBase { | 123 class MaximizeLayoutManager : public TestLayoutManagerBase { |
| 124 public: | 124 public: |
| 125 MaximizeLayoutManager() {} | 125 MaximizeLayoutManager() {} |
| 126 virtual ~MaximizeLayoutManager() {} | 126 ~MaximizeLayoutManager() override {} |
| 127 | 127 |
| 128 private: | 128 private: |
| 129 // aura::LayoutManager: | 129 // aura::LayoutManager: |
| 130 virtual void OnWindowAddedToLayout(aura::Window* child) override { | 130 void OnWindowAddedToLayout(aura::Window* child) override { |
| 131 // This simulates what happens when adding a maximized window. | 131 // This simulates what happens when adding a maximized window. |
| 132 SetChildBoundsDirect(child, gfx::Rect(0, 0, 300, 300)); | 132 SetChildBoundsDirect(child, gfx::Rect(0, 0, 300, 300)); |
| 133 } | 133 } |
| 134 | 134 |
| 135 DISALLOW_COPY_AND_ASSIGN(MaximizeLayoutManager); | 135 DISALLOW_COPY_AND_ASSIGN(MaximizeLayoutManager); |
| 136 }; | 136 }; |
| 137 | 137 |
| 138 // This simulates BrowserView, which creates a custom RootView so that | 138 // This simulates BrowserView, which creates a custom RootView so that |
| 139 // OnNativeWidgetSizeChanged that is invoked during Init matters. | 139 // OnNativeWidgetSizeChanged that is invoked during Init matters. |
| 140 class TestWidget : public views::Widget { | 140 class TestWidget : public views::Widget { |
| 141 public: | 141 public: |
| 142 TestWidget() : did_size_change_more_than_once_(false) { | 142 TestWidget() : did_size_change_more_than_once_(false) { |
| 143 } | 143 } |
| 144 | 144 |
| 145 // Returns true if the size changes to a non-empty size, and then to another | 145 // Returns true if the size changes to a non-empty size, and then to another |
| 146 // size. | 146 // size. |
| 147 bool did_size_change_more_than_once() const { | 147 bool did_size_change_more_than_once() const { |
| 148 return did_size_change_more_than_once_; | 148 return did_size_change_more_than_once_; |
| 149 } | 149 } |
| 150 | 150 |
| 151 virtual void OnNativeWidgetSizeChanged(const gfx::Size& new_size) override { | 151 void OnNativeWidgetSizeChanged(const gfx::Size& new_size) override { |
| 152 if (last_size_.IsEmpty()) | 152 if (last_size_.IsEmpty()) |
| 153 last_size_ = new_size; | 153 last_size_ = new_size; |
| 154 else if (!did_size_change_more_than_once_ && new_size != last_size_) | 154 else if (!did_size_change_more_than_once_ && new_size != last_size_) |
| 155 did_size_change_more_than_once_ = true; | 155 did_size_change_more_than_once_ = true; |
| 156 Widget::OnNativeWidgetSizeChanged(new_size); | 156 Widget::OnNativeWidgetSizeChanged(new_size); |
| 157 } | 157 } |
| 158 | 158 |
| 159 private: | 159 private: |
| 160 bool did_size_change_more_than_once_; | 160 bool did_size_change_more_than_once_; |
| 161 gfx::Size last_size_; | 161 gfx::Size last_size_; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 178 params.show_state = ui::SHOW_STATE_MAXIMIZED; | 178 params.show_state = ui::SHOW_STATE_MAXIMIZED; |
| 179 params.bounds = gfx::Rect(10, 10, 100, 200); | 179 params.bounds = gfx::Rect(10, 10, 100, 200); |
| 180 widget->Init(params); | 180 widget->Init(params); |
| 181 EXPECT_FALSE(widget->did_size_change_more_than_once()); | 181 EXPECT_FALSE(widget->did_size_change_more_than_once()); |
| 182 widget->CloseNow(); | 182 widget->CloseNow(); |
| 183 } | 183 } |
| 184 | 184 |
| 185 class PropertyTestLayoutManager : public TestLayoutManagerBase { | 185 class PropertyTestLayoutManager : public TestLayoutManagerBase { |
| 186 public: | 186 public: |
| 187 PropertyTestLayoutManager() : added_(false) {} | 187 PropertyTestLayoutManager() : added_(false) {} |
| 188 virtual ~PropertyTestLayoutManager() {} | 188 ~PropertyTestLayoutManager() override {} |
| 189 | 189 |
| 190 bool added() const { return added_; } | 190 bool added() const { return added_; } |
| 191 | 191 |
| 192 private: | 192 private: |
| 193 // aura::LayoutManager: | 193 // aura::LayoutManager: |
| 194 virtual void OnWindowAddedToLayout(aura::Window* child) override { | 194 void OnWindowAddedToLayout(aura::Window* child) override { |
| 195 EXPECT_TRUE(child->GetProperty(aura::client::kCanMaximizeKey)); | 195 EXPECT_TRUE(child->GetProperty(aura::client::kCanMaximizeKey)); |
| 196 EXPECT_TRUE(child->GetProperty(aura::client::kCanMinimizeKey)); | 196 EXPECT_TRUE(child->GetProperty(aura::client::kCanMinimizeKey)); |
| 197 EXPECT_TRUE(child->GetProperty(aura::client::kCanResizeKey)); | 197 EXPECT_TRUE(child->GetProperty(aura::client::kCanResizeKey)); |
| 198 added_ = true; | 198 added_ = true; |
| 199 } | 199 } |
| 200 | 200 |
| 201 bool added_; | 201 bool added_; |
| 202 | 202 |
| 203 DISALLOW_COPY_AND_ASSIGN(PropertyTestLayoutManager); | 203 DISALLOW_COPY_AND_ASSIGN(PropertyTestLayoutManager); |
| 204 }; | 204 }; |
| 205 | 205 |
| 206 class PropertyTestWidgetDelegate : public views::WidgetDelegate { | 206 class PropertyTestWidgetDelegate : public views::WidgetDelegate { |
| 207 public: | 207 public: |
| 208 explicit PropertyTestWidgetDelegate(Widget* widget) : widget_(widget) {} | 208 explicit PropertyTestWidgetDelegate(Widget* widget) : widget_(widget) {} |
| 209 virtual ~PropertyTestWidgetDelegate() {} | 209 ~PropertyTestWidgetDelegate() override {} |
| 210 | 210 |
| 211 private: | 211 private: |
| 212 // views::WidgetDelegate: | 212 // views::WidgetDelegate: |
| 213 virtual bool CanMaximize() const override { | 213 bool CanMaximize() const override { return true; } |
| 214 return true; | 214 bool CanMinimize() const override { return true; } |
| 215 } | 215 bool CanResize() const override { return true; } |
| 216 virtual bool CanMinimize() const override { | 216 void DeleteDelegate() override { delete this; } |
| 217 return true; | 217 Widget* GetWidget() override { return widget_; } |
| 218 } | 218 const Widget* GetWidget() const override { return widget_; } |
| 219 virtual bool CanResize() const override { | |
| 220 return true; | |
| 221 } | |
| 222 virtual void DeleteDelegate() override { | |
| 223 delete this; | |
| 224 } | |
| 225 virtual Widget* GetWidget() override { | |
| 226 return widget_; | |
| 227 } | |
| 228 virtual const Widget* GetWidget() const override { | |
| 229 return widget_; | |
| 230 } | |
| 231 | 219 |
| 232 Widget* widget_; | 220 Widget* widget_; |
| 233 DISALLOW_COPY_AND_ASSIGN(PropertyTestWidgetDelegate); | 221 DISALLOW_COPY_AND_ASSIGN(PropertyTestWidgetDelegate); |
| 234 }; | 222 }; |
| 235 | 223 |
| 236 // Verifies that the kCanMaximizeKey/kCanMinimizeKey/kCanResizeKey have the | 224 // Verifies that the kCanMaximizeKey/kCanMinimizeKey/kCanResizeKey have the |
| 237 // correct value when added to the layout manager. | 225 // correct value when added to the layout manager. |
| 238 TEST_F(NativeWidgetAuraTest, TestPropertiesWhenAddedToLayout) { | 226 TEST_F(NativeWidgetAuraTest, TestPropertiesWhenAddedToLayout) { |
| 239 root_window()->SetBounds(gfx::Rect(0, 0, 640, 480)); | 227 root_window()->SetBounds(gfx::Rect(0, 0, 640, 480)); |
| 240 PropertyTestLayoutManager* layout_manager = new PropertyTestLayoutManager(); | 228 PropertyTestLayoutManager* layout_manager = new PropertyTestLayoutManager(); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 } | 267 } |
| 280 | 268 |
| 281 void clear_got_gesture_event() { | 269 void clear_got_gesture_event() { |
| 282 got_gesture_event_ = false; | 270 got_gesture_event_ = false; |
| 283 } | 271 } |
| 284 bool got_gesture_event() const { | 272 bool got_gesture_event() const { |
| 285 return got_gesture_event_; | 273 return got_gesture_event_; |
| 286 } | 274 } |
| 287 | 275 |
| 288 // View overrides: | 276 // View overrides: |
| 289 virtual void OnGestureEvent(ui::GestureEvent* event) override { | 277 void OnGestureEvent(ui::GestureEvent* event) override { |
| 290 got_gesture_event_ = true; | 278 got_gesture_event_ = true; |
| 291 if (consume_gesture_event_) | 279 if (consume_gesture_event_) |
| 292 event->StopPropagation(); | 280 event->StopPropagation(); |
| 293 } | 281 } |
| 294 | 282 |
| 295 private: | 283 private: |
| 296 // Was OnGestureEvent() invoked? | 284 // Was OnGestureEvent() invoked? |
| 297 bool got_gesture_event_; | 285 bool got_gesture_event_; |
| 298 | 286 |
| 299 // Dictates what OnGestureEvent() returns. | 287 // Dictates what OnGestureEvent() returns. |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 441 widget->Show(); | 429 widget->Show(); |
| 442 widget->Close(); | 430 widget->Close(); |
| 443 base::MessageLoop::current()->RunUntilIdle(); | 431 base::MessageLoop::current()->RunUntilIdle(); |
| 444 widget->GetNativeTheme(); // Shouldn't crash. | 432 widget->GetNativeTheme(); // Shouldn't crash. |
| 445 } | 433 } |
| 446 | 434 |
| 447 // Used to track calls to WidgetDelegate::OnWidgetMove(). | 435 // Used to track calls to WidgetDelegate::OnWidgetMove(). |
| 448 class MoveTestWidgetDelegate : public WidgetDelegateView { | 436 class MoveTestWidgetDelegate : public WidgetDelegateView { |
| 449 public: | 437 public: |
| 450 MoveTestWidgetDelegate() : got_move_(false) {} | 438 MoveTestWidgetDelegate() : got_move_(false) {} |
| 451 virtual ~MoveTestWidgetDelegate() {} | 439 ~MoveTestWidgetDelegate() override {} |
| 452 | 440 |
| 453 void ClearGotMove() { got_move_ = false; } | 441 void ClearGotMove() { got_move_ = false; } |
| 454 bool got_move() const { return got_move_; } | 442 bool got_move() const { return got_move_; } |
| 455 | 443 |
| 456 // WidgetDelegate overrides: | 444 // WidgetDelegate overrides: |
| 457 virtual void OnWidgetMove() override { got_move_ = true; } | 445 void OnWidgetMove() override { got_move_ = true; } |
| 458 | 446 |
| 459 private: | 447 private: |
| 460 bool got_move_; | 448 bool got_move_; |
| 461 | 449 |
| 462 DISALLOW_COPY_AND_ASSIGN(MoveTestWidgetDelegate); | 450 DISALLOW_COPY_AND_ASSIGN(MoveTestWidgetDelegate); |
| 463 }; | 451 }; |
| 464 | 452 |
| 465 // This test simulates what happens when a window is normally maximized. That | 453 // This test simulates what happens when a window is normally maximized. That |
| 466 // is, it's layer is acquired for animation then the window is maximized. | 454 // is, it's layer is acquired for animation then the window is maximized. |
| 467 // Acquiring the layer resets the bounds of the window. This test verifies the | 455 // Acquiring the layer resets the bounds of the window. This test verifies the |
| 468 // Widget is still notified correctly of a move in this case. | 456 // Widget is still notified correctly of a move in this case. |
| 469 TEST_F(NativeWidgetAuraTest, OnWidgetMovedInvokedAfterAcquireLayer) { | 457 TEST_F(NativeWidgetAuraTest, OnWidgetMovedInvokedAfterAcquireLayer) { |
| 470 // |delegate| deletes itself when the widget is destroyed. | 458 // |delegate| deletes itself when the widget is destroyed. |
| 471 MoveTestWidgetDelegate* delegate = new MoveTestWidgetDelegate; | 459 MoveTestWidgetDelegate* delegate = new MoveTestWidgetDelegate; |
| 472 Widget* widget = | 460 Widget* widget = |
| 473 Widget::CreateWindowWithContextAndBounds(delegate, | 461 Widget::CreateWindowWithContextAndBounds(delegate, |
| 474 root_window(), | 462 root_window(), |
| 475 gfx::Rect(10, 10, 100, 200)); | 463 gfx::Rect(10, 10, 100, 200)); |
| 476 widget->Show(); | 464 widget->Show(); |
| 477 delegate->ClearGotMove(); | 465 delegate->ClearGotMove(); |
| 478 // Simulate a maximize with animation. | 466 // Simulate a maximize with animation. |
| 479 delete widget->GetNativeView()->RecreateLayer().release(); | 467 delete widget->GetNativeView()->RecreateLayer().release(); |
| 480 widget->SetBounds(gfx::Rect(0, 0, 500, 500)); | 468 widget->SetBounds(gfx::Rect(0, 0, 500, 500)); |
| 481 EXPECT_TRUE(delegate->got_move()); | 469 EXPECT_TRUE(delegate->got_move()); |
| 482 widget->CloseNow(); | 470 widget->CloseNow(); |
| 483 } | 471 } |
| 484 | 472 |
| 485 } // namespace | 473 } // namespace |
| 486 } // namespace views | 474 } // namespace views |
| OLD | NEW |