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