OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/browser/frame_host/render_widget_host_view_guest.h" | 5 #include "content/browser/frame_host/render_widget_host_view_guest.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "cc/surfaces/surface.h" | |
10 #include "cc/surfaces/surface_factory.h" | |
11 #include "cc/surfaces/surface_manager.h" | |
12 #include "cc/surfaces/surface_sequence.h" | |
13 #include "content/browser/browser_plugin/browser_plugin_guest.h" | |
9 #include "content/browser/compositor/test/no_transport_image_transport_factory.h " | 14 #include "content/browser/compositor/test/no_transport_image_transport_factory.h " |
15 #include "content/browser/gpu/compositor_util.h" | |
10 #include "content/browser/renderer_host/render_widget_host_delegate.h" | 16 #include "content/browser/renderer_host/render_widget_host_delegate.h" |
11 #include "content/browser/renderer_host/render_widget_host_impl.h" | 17 #include "content/browser/renderer_host/render_widget_host_impl.h" |
12 #include "content/common/view_messages.h" | 18 #include "content/common/view_messages.h" |
19 #include "content/public/browser/browser_plugin_guest_delegate.h" | |
13 #include "content/public/browser/render_widget_host_view.h" | 20 #include "content/public/browser/render_widget_host_view.h" |
14 #include "content/public/test/mock_render_process_host.h" | 21 #include "content/public/test/mock_render_process_host.h" |
15 #include "content/public/test/test_browser_context.h" | 22 #include "content/public/test/test_browser_context.h" |
16 #include "content/test/test_render_view_host.h" | 23 #include "content/test/test_render_view_host.h" |
24 #include "content/test/test_web_contents.h" | |
17 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
18 | 26 |
19 namespace content { | 27 namespace content { |
20 namespace { | 28 namespace { |
21 class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate { | 29 class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate { |
22 public: | 30 public: |
23 MockRenderWidgetHostDelegate() {} | 31 MockRenderWidgetHostDelegate() {} |
24 ~MockRenderWidgetHostDelegate() override {} | 32 ~MockRenderWidgetHostDelegate() override {} |
25 }; | 33 }; |
26 | 34 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
75 } // namespace | 83 } // namespace |
76 | 84 |
77 TEST_F(RenderWidgetHostViewGuestTest, VisibilityTest) { | 85 TEST_F(RenderWidgetHostViewGuestTest, VisibilityTest) { |
78 view_->Show(); | 86 view_->Show(); |
79 ASSERT_TRUE(view_->IsShowing()); | 87 ASSERT_TRUE(view_->IsShowing()); |
80 | 88 |
81 view_->Hide(); | 89 view_->Hide(); |
82 ASSERT_FALSE(view_->IsShowing()); | 90 ASSERT_FALSE(view_->IsShowing()); |
83 } | 91 } |
84 | 92 |
93 class TestBrowserPluginGuest : public BrowserPluginGuest { | |
94 public: | |
95 TestBrowserPluginGuest(WebContentsImpl* web_contents, | |
96 BrowserPluginGuestDelegate* delegate): | |
97 BrowserPluginGuest(web_contents->HasOpener(), web_contents, delegate), | |
98 last_scale_factor_received_(0.f), | |
99 update_scale_factor_received_(0.f), | |
100 received_delegated_frame_(false) {} | |
101 ~TestBrowserPluginGuest() override {} | |
102 | |
103 void UpdateGuestSizeIfNecessary(const gfx::Size& frame_size, | |
104 float scale_factor) override { | |
105 update_frame_size_received_= frame_size; | |
106 update_scale_factor_received_ = scale_factor; | |
107 } | |
108 | |
109 void SwapCompositorFrame(uint32 output_surface_id, | |
kenrb
2015/06/12 21:02:47
This is probably copied and pasted, but this shoul
wjmaclean
2015/06/12 21:13:15
Done.
| |
110 int host_process_id, | |
111 int host_routing_id, | |
112 scoped_ptr<cc::CompositorFrame> frame) override { | |
113 received_delegated_frame_ = true; | |
114 last_frame_size_received_ = | |
115 frame->delegated_frame_data->render_pass_list.back() | |
116 ->output_rect.size(); | |
117 last_scale_factor_received_ = frame->metadata.device_scale_factor; | |
118 } | |
119 | |
120 void SetChildFrameSurface(const cc::SurfaceId& surface_id, | |
121 const gfx::Size& frame_size, | |
122 float scale_factor, | |
123 const cc::SurfaceSequence& sequence) override { | |
124 last_surface_id_received_ = surface_id; | |
125 last_frame_size_received_ = frame_size; | |
126 last_scale_factor_received_ = scale_factor; | |
127 } | |
128 | |
129 cc::SurfaceId last_surface_id_received_; | |
130 gfx::Size last_frame_size_received_; | |
131 gfx::Size update_frame_size_received_; | |
132 float last_scale_factor_received_; | |
133 float update_scale_factor_received_; | |
134 | |
135 bool received_delegated_frame_; | |
136 }; | |
137 | |
138 // TODO(wjmaclean): we should restructure RenderWidgetHostViewChildFrameTest to | |
139 // look more like this one, and then this one could be derived from it. Also, | |
140 // include CreateDelegatedFrame as part of the test class so we don't have to | |
141 // repeat it here. | |
142 class RenderWidgetHostViewGuestSurfaceTest | |
143 : public RenderViewHostImplTestHarness { | |
144 public: | |
145 RenderWidgetHostViewGuestSurfaceTest() | |
146 : widget_host_(nullptr), view_(nullptr) {} | |
147 | |
148 void SetUp() override { | |
149 RenderViewHostImplTestHarness::SetUp(); | |
150 #if !defined(OS_ANDROID) | |
151 ImageTransportFactory::InitializeForUnitTests( | |
152 scoped_ptr<ImageTransportFactory>( | |
153 new NoTransportImageTransportFactory)); | |
154 #endif | |
155 // We don't own the BPG, the WebContents does. | |
156 browser_plugin_guest_ = new TestBrowserPluginGuest( | |
157 contents(), &browser_plugin_guest_delegate_); | |
158 | |
159 widget_host_ = new RenderWidgetHostImpl(&delegate_, rvh()->GetProcess(), | |
160 MSG_ROUTING_NONE, false); | |
161 view_ = new RenderWidgetHostViewGuest( | |
162 widget_host_, browser_plugin_guest_, | |
163 (new TestRenderWidgetHostView(widget_host_))->GetWeakPtr()); | |
164 } | |
165 | |
166 void TearDown() override { | |
167 // TODO(wjmaclean): This next line doesn't follow the usual | |
168 // "view_->Destroy();" pattern, but that causes a DCHECK to fail during the | |
169 // tear-down of the view's cc::SurfaceManager (via | |
170 // cc::SurfaceFactory::Destroy()). | |
171 // This should be fixed, though doesn't seem to affect the test. | |
172 delete view_; | |
173 delete widget_host_; | |
174 | |
175 #if !defined(OS_ANDROID) | |
176 ImageTransportFactory::Terminate(); | |
177 #endif | |
178 RenderViewHostImplTestHarness::TearDown(); | |
179 } | |
180 | |
181 cc::SurfaceId surface_id() { | |
182 DCHECK(view_); | |
183 return static_cast<RenderWidgetHostViewChildFrame*>(view_)->surface_id_; | |
184 } | |
185 | |
186 protected: | |
187 MockRenderWidgetHostDelegate delegate_; | |
188 BrowserPluginGuestDelegate browser_plugin_guest_delegate_; | |
189 TestBrowserPluginGuest* browser_plugin_guest_; | |
190 | |
191 // Tests should set these to NULL if they've already triggered their | |
192 // destruction. | |
193 RenderWidgetHostImpl* widget_host_; | |
194 RenderWidgetHostViewGuest* view_; | |
195 | |
196 private: | |
197 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewGuestSurfaceTest); | |
198 }; | |
199 | |
200 namespace { | |
201 scoped_ptr<cc::CompositorFrame> CreateDelegatedFrame(float scale_factor, | |
202 gfx::Size size, | |
203 const gfx::Rect& damage) { | |
204 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); | |
205 frame->metadata.device_scale_factor = scale_factor; | |
206 frame->delegated_frame_data.reset(new cc::DelegatedFrameData); | |
207 | |
208 scoped_ptr<cc::RenderPass> pass = cc::RenderPass::Create(); | |
209 pass->SetNew(cc::RenderPassId(1, 1), gfx::Rect(size), damage, | |
210 gfx::Transform()); | |
211 frame->delegated_frame_data->render_pass_list.push_back(pass.Pass()); | |
212 return frame; | |
213 } | |
214 } // anonymous namespace | |
215 | |
216 TEST_F(RenderWidgetHostViewGuestSurfaceTest, TestGuestSurface) { | |
217 gfx::Size view_size(100, 100); | |
218 gfx::Rect view_rect(view_size); | |
219 float scale_factor = 1.f; | |
220 | |
221 ASSERT_TRUE(browser_plugin_guest_); | |
222 | |
223 view_->SetSize(view_size); | |
224 view_->Show(); | |
225 | |
226 view_->OnSwapCompositorFrame( | |
227 0, CreateDelegatedFrame(scale_factor, view_size, view_rect)); | |
228 | |
229 EXPECT_EQ(view_size, browser_plugin_guest_->update_frame_size_received_); | |
230 EXPECT_EQ(scale_factor, | |
231 browser_plugin_guest_->update_scale_factor_received_); | |
232 | |
233 if (UseSurfacesEnabled()) { | |
234 cc::SurfaceId id = surface_id(); | |
235 if (!id.is_null()) { | |
236 #if !defined(OS_ANDROID) | |
237 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | |
238 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | |
239 cc::Surface* surface = manager->GetSurfaceForId(id); | |
240 EXPECT_TRUE(surface); | |
241 // There should be a SurfaceSequence created by the RWHVGuest. | |
242 EXPECT_EQ(1u, surface->GetDestructionDependencyCount()); | |
243 #endif | |
244 // Surface ID should have been passed to BrowserPluginGuest to | |
245 // be sent to the embedding renderer. | |
246 EXPECT_EQ(id, browser_plugin_guest_->last_surface_id_received_); | |
247 EXPECT_EQ(view_size, browser_plugin_guest_->last_frame_size_received_); | |
248 EXPECT_EQ(scale_factor, | |
249 browser_plugin_guest_->last_scale_factor_received_); | |
250 } | |
251 } else { | |
252 EXPECT_TRUE(browser_plugin_guest_->received_delegated_frame_); | |
253 EXPECT_EQ(view_size, browser_plugin_guest_->last_frame_size_received_); | |
254 EXPECT_EQ(scale_factor, browser_plugin_guest_->last_scale_factor_received_); | |
255 } | |
256 } | |
257 | |
85 } // namespace content | 258 } // namespace content |
OLD | NEW |