Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Side by Side Diff: ui/views/animation/ink_drop_delegate_unittest.cc

Issue 1494433003: Fixes a crash when InkDropDelegate gets destroyed after its InkDropHost (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes a crash when InkDropDelegate gets destroyed after its InkDropHost (delegate owned by a leaf c… Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/toolbar/toolbar_action_view.cc ('k') | ui/views/controls/button/custom_button.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698