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

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 (restore to PS3) 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 scoped_ptr<views::InkDropDelegate> new_ink_drop_delegate(
60 new TestInkDropDelegate(this, button_deleted, delegate_deleted));
61 SetInkDropDelegate(new_ink_drop_delegate.Pass());
62 EXPECT_TRUE(*layer_added_);
63 }
64 ~TestButton() override {
65 SetInkDropDelegate(scoped_ptr<views::InkDropDelegate>());
66 EXPECT_TRUE(*layer_removed_);
67 *button_deleted_ = true;
68 }
69
70 // views::InkDropHost:
71 void AddInkDropLayer(ui::Layer* ink_drop_layer) override {
72 *layer_added_ = true;
73 }
74 void RemoveInkDropLayer(ui::Layer* ink_drop_layer) override {
75 *layer_removed_ = true;
76 }
77 gfx::Point CalculateInkDropCenter() const override { return gfx::Point(); }
78
79 private:
80 bool* layer_added_;
81 bool* layer_removed_;
82 bool* button_deleted_;
83
84 DISALLOW_COPY_AND_ASSIGN(TestButton);
85 };
86
87 } // namespace
88
89 // Test that an InkDropDelegate gets safely deleted when a CustomButton is
90 // destroyed.
91 TEST(InkDropDelegateTest, CanBeDeleted) {
92 bool layer_added = false;
93 bool layer_removed = false;
94 bool button_deleted = false;
95 bool delegate_deleted = false;
96
97 TestButton* button = new TestButton(&layer_added, &layer_removed,
98 &button_deleted, &delegate_deleted);
99 EXPECT_TRUE(layer_added);
100 EXPECT_FALSE(layer_removed);
101 EXPECT_FALSE(button_deleted);
102 EXPECT_FALSE(delegate_deleted);
103
104 delete button;
105 EXPECT_TRUE(layer_added);
106 EXPECT_TRUE(layer_removed);
107 EXPECT_TRUE(button_deleted);
108 EXPECT_TRUE(delegate_deleted);
109 }
110
111 } // namespace views
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698