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

Side by Side Diff: blimp/client/feature/compositor/blimp_compositor_manager_unittest.cc

Issue 2241623002: blimp: Move compositing, input and render widget feature to client/core. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: moar gn fix Created 4 years, 4 months 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 2016 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 "blimp/client/feature/compositor/blimp_compositor_manager.h"
6
7 #include "base/memory/ptr_util.h"
8 #include "cc/proto/compositor_message.pb.h"
9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "ui/events/gesture_detection/motion_event_generic.h"
12
13 using testing::_;
14 using testing::InSequence;
15 using testing::Sequence;
16
17 namespace blimp {
18 namespace client {
19
20 class MockRenderWidgetFeature : public RenderWidgetFeature {
21 public:
22 MOCK_METHOD3(SendCompositorMessage,
23 void(const int,
24 const int,
25 const cc::proto::CompositorMessage&));
26 MOCK_METHOD3(SendInputEvent, void(const int,
27 const int,
28 const blink::WebInputEvent&));
29 MOCK_METHOD2(SetDelegate, void(int, RenderWidgetFeatureDelegate*));
30 MOCK_METHOD1(RemoveDelegate, void(const int));
31 };
32
33 class MockBlimpCompositor : public BlimpCompositor {
34 public :
35 explicit MockBlimpCompositor(const int render_widget_id)
36 : BlimpCompositor(render_widget_id, nullptr) {
37 }
38
39 MOCK_METHOD1(SetVisible, void(bool));
40 MOCK_METHOD1(SetAcceleratedWidget, void(gfx::AcceleratedWidget));
41 MOCK_METHOD0(ReleaseAcceleratedWidget, void());
42 MOCK_METHOD1(OnTouchEvent, bool(const ui::MotionEvent& motion_event));
43
44 void OnCompositorMessageReceived(
45 std::unique_ptr<cc::proto::CompositorMessage> message) override {
46 MockableOnCompositorMessageReceived(*message);
47 }
48 MOCK_METHOD1(MockableOnCompositorMessageReceived,
49 void(const cc::proto::CompositorMessage&));
50 };
51
52 class BlimpCompositorManagerForTesting : public BlimpCompositorManager {
53 public:
54 explicit BlimpCompositorManagerForTesting(
55 RenderWidgetFeature* render_widget_feature)
56 : BlimpCompositorManager(render_widget_feature, nullptr) {}
57
58 using BlimpCompositorManager::GetCompositor;
59
60 std::unique_ptr<BlimpCompositor> CreateBlimpCompositor(
61 int render_widget_id,
62 BlimpCompositorClient* client) override {
63 return base::WrapUnique(new MockBlimpCompositor(render_widget_id));
64 }
65 };
66
67 class BlimpCompositorManagerTest : public testing::Test {
68 public:
69 void SetUp() override {
70 EXPECT_CALL(render_widget_feature_, SetDelegate(_, _)).Times(1);
71 EXPECT_CALL(render_widget_feature_, RemoveDelegate(_)).Times(1);
72
73 compositor_manager_.reset(
74 new BlimpCompositorManagerForTesting(&render_widget_feature_));
75 }
76
77 void TearDown() override {
78 compositor_manager_.reset();
79 }
80
81 void SetUpCompositors() {
82 delegate()->OnRenderWidgetCreated(1);
83 delegate()->OnRenderWidgetCreated(2);
84
85 mock_compositor1_ = static_cast<MockBlimpCompositor*>
86 (compositor_manager_->GetCompositor(1));
87 mock_compositor2_ = static_cast<MockBlimpCompositor*>
88 (compositor_manager_->GetCompositor(2));
89
90 EXPECT_NE(mock_compositor1_, nullptr);
91 EXPECT_NE(mock_compositor2_, nullptr);
92
93 EXPECT_EQ(mock_compositor1_->render_widget_id(), 1);
94 EXPECT_EQ(mock_compositor2_->render_widget_id(), 2);
95 }
96
97 RenderWidgetFeature::RenderWidgetFeatureDelegate* delegate() const {
98 DCHECK(compositor_manager_);
99 return static_cast<RenderWidgetFeature::RenderWidgetFeatureDelegate*>
100 (compositor_manager_.get());
101 }
102
103 std::unique_ptr<BlimpCompositorManagerForTesting> compositor_manager_;
104 MockRenderWidgetFeature render_widget_feature_;
105 MockBlimpCompositor* mock_compositor1_;
106 MockBlimpCompositor* mock_compositor2_;
107 };
108
109 TEST_F(BlimpCompositorManagerTest, ForwardsMessagesToCorrectCompositor) {
110 SetUpCompositors();
111
112 // Ensure that the compositor messages for a render widget are forwarded to
113 // the correct compositor.
114 EXPECT_CALL(*mock_compositor1_,
115 MockableOnCompositorMessageReceived(_)).Times(2);
116 EXPECT_CALL(*mock_compositor2_,
117 MockableOnCompositorMessageReceived(_)).Times(1);
118 EXPECT_CALL(*mock_compositor1_,
119 SetVisible(false)).Times(1);
120 EXPECT_CALL(*mock_compositor1_,
121 SetAcceleratedWidget(gfx::kNullAcceleratedWidget)).Times(1);
122
123 delegate()->OnCompositorMessageReceived(
124 1, base::WrapUnique(new cc::proto::CompositorMessage));
125 delegate()->OnRenderWidgetInitialized(1);
126 delegate()->OnCompositorMessageReceived(
127 2, base::WrapUnique(new cc::proto::CompositorMessage));
128 delegate()->OnCompositorMessageReceived(
129 1, base::WrapUnique(new cc::proto::CompositorMessage));
130
131 delegate()->OnRenderWidgetDeleted(1);
132 EXPECT_EQ(compositor_manager_->GetCompositor(1), nullptr);
133 }
134
135 TEST_F(BlimpCompositorManagerTest, ForwardsViewEventsToCorrectCompositor) {
136 InSequence sequence;
137 SetUpCompositors();
138
139 EXPECT_CALL(*mock_compositor1_, SetVisible(true));
140 EXPECT_CALL(*mock_compositor1_, SetAcceleratedWidget(
141 gfx::kNullAcceleratedWidget));
142 EXPECT_CALL(*mock_compositor1_, OnTouchEvent(_));
143 EXPECT_CALL(*mock_compositor1_, SetVisible(false));
144 EXPECT_CALL(*mock_compositor1_, ReleaseAcceleratedWidget());
145
146 EXPECT_CALL(*mock_compositor2_, SetVisible(true));
147 EXPECT_CALL(*mock_compositor2_, SetAcceleratedWidget(
148 gfx::kNullAcceleratedWidget));
149 EXPECT_CALL(*mock_compositor2_, SetVisible(false));
150 EXPECT_CALL(*mock_compositor2_, ReleaseAcceleratedWidget());
151
152 // Make the compositor manager visible and give it the accelerated widget
153 // while we don't have any render widget initialized.
154 compositor_manager_->SetVisible(true);
155 compositor_manager_->SetAcceleratedWidget(gfx::kNullAcceleratedWidget);
156
157 // Initialize the first render widget. This should propagate the visibility,
158 // the accelerated widget and the touch events to the corresponding
159 // compositor.
160 delegate()->OnRenderWidgetInitialized(1);
161 compositor_manager_->OnTouchEvent(
162 ui::MotionEventGeneric(ui::MotionEvent::Action::ACTION_NONE,
163 base::TimeTicks::Now(), ui::PointerProperties()));
164
165 // Now initialize the second render widget. This should swap the compositors
166 // and make the first one invisible and release the accelerated widget.
167 delegate()->OnRenderWidgetInitialized(2);
168
169 // Now make the compositor manager invisible and release the accelerated
170 // widget from it. This should make the current compositor invisible and
171 // release the widget.
172 compositor_manager_->SetVisible(false);
173 compositor_manager_->ReleaseAcceleratedWidget();
174
175 // Destroy all the widgets. We should not be receiving any calls for the view
176 // events forwarded after this.
177 delegate()->OnRenderWidgetDeleted(1);
178 delegate()->OnRenderWidgetDeleted(2);
179
180 compositor_manager_->SetVisible(true);
181 }
182
183 } // namespace client
184 } // namespace blimp
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698