OLD | NEW |
| (Empty) |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "ui/views/animation/ink_drop_delegate.h" | |
6 | |
7 #include "ui/views/animation/ink_drop_host.h" | |
8 #include "ui/views/controls/button/custom_button.h" | |
9 #include "ui/views/test/views_test_base.h" | |
10 | |
11 namespace views { | |
12 | |
13 namespace { | |
14 | |
15 // An InkDropDelegate that keeps track of order of deletions. | |
16 class TestInkDropDelegate : public InkDropDelegate { | |
17 public: | |
18 TestInkDropDelegate(InkDropHost* ink_drop_host, | |
19 bool* button_deleted, | |
20 bool* delegate_deleted) | |
21 : ink_drop_host_(ink_drop_host), | |
22 button_deleted_(button_deleted), | |
23 delegate_deleted_(delegate_deleted) { | |
24 ink_drop_host_->AddInkDropLayer(nullptr); | |
25 } | |
26 ~TestInkDropDelegate() override { | |
27 EXPECT_FALSE(*button_deleted_); | |
28 ink_drop_host_->RemoveInkDropLayer(nullptr); | |
29 *delegate_deleted_ = true; | |
30 } | |
31 | |
32 // InkDropDelegate: | |
33 void SetInkDropSize(int large_size, | |
34 int large_corner_radius, | |
35 int small_size, | |
36 int small_corner_radius) override {} | |
37 void OnLayout() override {} | |
38 void OnAction(InkDropState state) override {} | |
39 | |
40 private: | |
41 InkDropHost* ink_drop_host_; | |
42 bool* button_deleted_; | |
43 bool* delegate_deleted_; | |
44 | |
45 DISALLOW_COPY_AND_ASSIGN(TestInkDropDelegate); | |
46 }; | |
47 | |
48 // A test Button class that owns a TestInkDropDelegate. | |
49 class TestButton : public views::CustomButton, public views::InkDropHost { | |
50 public: | |
51 TestButton(bool* layer_added, | |
52 bool* layer_removed, | |
53 bool* button_deleted, | |
54 bool* delegate_deleted) | |
55 : CustomButton(nullptr), | |
56 layer_added_(layer_added), | |
57 layer_removed_(layer_removed), | |
58 button_deleted_(button_deleted), | |
59 ink_drop_delegate_( | |
60 new TestInkDropDelegate(this, button_deleted, delegate_deleted)) { | |
61 set_ink_drop_delegate(ink_drop_delegate_.get()); | |
62 EXPECT_TRUE(*layer_added_); | |
63 } | |
64 ~TestButton() override { | |
65 ink_drop_delegate_.reset(); | |
66 set_ink_drop_delegate(nullptr); | |
67 EXPECT_TRUE(*layer_removed_); | |
68 *button_deleted_ = true; | |
69 } | |
70 | |
71 // views::InkDropHost: | |
72 void AddInkDropLayer(ui::Layer* ink_drop_layer) override { | |
73 *layer_added_ = true; | |
74 } | |
75 void RemoveInkDropLayer(ui::Layer* ink_drop_layer) override { | |
76 *layer_removed_ = true; | |
77 } | |
78 gfx::Point CalculateInkDropCenter() const override { return gfx::Point(); } | |
79 | |
80 private: | |
81 bool* layer_added_; | |
82 bool* layer_removed_; | |
83 bool* button_deleted_; | |
84 scoped_ptr<views::InkDropDelegate> ink_drop_delegate_; | |
85 | |
86 DISALLOW_COPY_AND_ASSIGN(TestButton); | |
87 }; | |
88 | |
89 } // namespace | |
90 | |
91 // Test that an InkDropDelegate gets safely deleted when a CustomButton is | |
92 // destroyed. | |
93 TEST(InkDropDelegateTest, CanBeDeleted) { | |
94 bool layer_added = false; | |
95 bool layer_removed = false; | |
96 bool button_deleted = false; | |
97 bool delegate_deleted = false; | |
98 | |
99 TestButton* button = new TestButton(&layer_added, &layer_removed, | |
100 &button_deleted, &delegate_deleted); | |
101 EXPECT_TRUE(layer_added); | |
102 EXPECT_FALSE(layer_removed); | |
103 EXPECT_FALSE(button_deleted); | |
104 EXPECT_FALSE(delegate_deleted); | |
105 | |
106 delete button; | |
107 EXPECT_TRUE(layer_added); | |
108 EXPECT_TRUE(layer_removed); | |
109 EXPECT_TRUE(button_deleted); | |
110 EXPECT_TRUE(delegate_deleted); | |
111 } | |
112 | |
113 } // namespace views | |
OLD | NEW |