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

Side by Side Diff: content/browser/frame_host/render_widget_host_view_guest_unittest.cc

Issue 1169983006: Convert BrowserPlugin to render using cc::Surfaces. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update test to always call UpdateGuestSizeIfNecessary(). Created 5 years, 6 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
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
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_t 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 // Call base-class version so that we can test UpdateGuestSizeIfNecessary().
121 BrowserPluginGuest::SwapCompositorFrame(output_surface_id, host_process_id,
122 host_routing_id, frame.Pass());
123 }
124
125 void SetChildFrameSurface(const cc::SurfaceId& surface_id,
126 const gfx::Size& frame_size,
127 float scale_factor,
128 const cc::SurfaceSequence& sequence) override {
129 last_surface_id_received_ = surface_id;
130 last_frame_size_received_ = frame_size;
131 last_scale_factor_received_ = scale_factor;
132 }
133
134 cc::SurfaceId last_surface_id_received_;
135 gfx::Size last_frame_size_received_;
136 gfx::Size update_frame_size_received_;
137 float last_scale_factor_received_;
138 float update_scale_factor_received_;
139
140 bool received_delegated_frame_;
141 };
142
143 // TODO(wjmaclean): we should restructure RenderWidgetHostViewChildFrameTest to
144 // look more like this one, and then this one could be derived from it. Also,
145 // include CreateDelegatedFrame as part of the test class so we don't have to
146 // repeat it here.
147 class RenderWidgetHostViewGuestSurfaceTest
148 : public testing::Test {
149 public:
150 RenderWidgetHostViewGuestSurfaceTest()
151 : widget_host_(nullptr), view_(nullptr) {}
152
153 void SetUp() override {
154 #if !defined(OS_ANDROID)
155 ImageTransportFactory::InitializeForUnitTests(
156 scoped_ptr<ImageTransportFactory>(
157 new NoTransportImageTransportFactory));
158 #endif
159 browser_context_.reset(new TestBrowserContext);
160 MockRenderProcessHost* process_host =
161 new MockRenderProcessHost(browser_context_.get());
162 web_contents_.reset(
163 TestWebContents::Create(browser_context_.get(), nullptr));
164 // We don't own the BPG, the WebContents does.
165 browser_plugin_guest_ = new TestBrowserPluginGuest(
166 web_contents_.get(), &browser_plugin_guest_delegate_);
167
168 widget_host_ = new RenderWidgetHostImpl(&delegate_, process_host,
169 MSG_ROUTING_NONE, false);
170 view_ = new RenderWidgetHostViewGuest(
171 widget_host_, browser_plugin_guest_,
172 (new TestRenderWidgetHostView(widget_host_))->GetWeakPtr());
173 }
174
175 void TearDown() override {
176 if (view_)
177 view_->Destroy();
178 delete widget_host_;
179
180 // It's important to make sure that the view finishes destructing before
181 // we hit the destructor for the TestBrowserThreadBundle, so run the message
182 // loop here.
183 base::RunLoop().RunUntilIdle();
184 #if !defined(OS_ANDROID)
185 ImageTransportFactory::Terminate();
186 #endif
187 }
188
189 cc::SurfaceId surface_id() {
190 DCHECK(view_);
191 return static_cast<RenderWidgetHostViewChildFrame*>(view_)->surface_id_;
192 }
193
194 protected:
195 TestBrowserThreadBundle thread_bundle_;
196 scoped_ptr<BrowserContext> browser_context_;
197 MockRenderWidgetHostDelegate delegate_;
198 BrowserPluginGuestDelegate browser_plugin_guest_delegate_;
199 scoped_ptr<TestWebContents> web_contents_;
200 TestBrowserPluginGuest* browser_plugin_guest_;
201
202 // Tests should set these to NULL if they've already triggered their
203 // destruction.
204 RenderWidgetHostImpl* widget_host_;
205 RenderWidgetHostViewGuest* view_;
206
207 private:
208 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewGuestSurfaceTest);
209 };
210
211 namespace {
212 scoped_ptr<cc::CompositorFrame> CreateDelegatedFrame(float scale_factor,
213 gfx::Size size,
214 const gfx::Rect& damage) {
215 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
216 frame->metadata.device_scale_factor = scale_factor;
217 frame->delegated_frame_data.reset(new cc::DelegatedFrameData);
218
219 scoped_ptr<cc::RenderPass> pass = cc::RenderPass::Create();
220 pass->SetNew(cc::RenderPassId(1, 1), gfx::Rect(size), damage,
221 gfx::Transform());
222 frame->delegated_frame_data->render_pass_list.push_back(pass.Pass());
223 return frame;
224 }
225 } // anonymous namespace
226
227 TEST_F(RenderWidgetHostViewGuestSurfaceTest, TestGuestSurface) {
228 gfx::Size view_size(100, 100);
229 gfx::Rect view_rect(view_size);
230 float scale_factor = 1.f;
231
232 ASSERT_TRUE(browser_plugin_guest_);
233
234 view_->SetSize(view_size);
235 view_->Show();
236
237 view_->OnSwapCompositorFrame(
238 0, CreateDelegatedFrame(scale_factor, view_size, view_rect));
239
240 EXPECT_EQ(view_size, browser_plugin_guest_->update_frame_size_received_);
241 EXPECT_EQ(scale_factor,
242 browser_plugin_guest_->update_scale_factor_received_);
243
244 if (UseSurfacesEnabled()) {
245 cc::SurfaceId id = surface_id();
246 if (!id.is_null()) {
247 #if !defined(OS_ANDROID)
248 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
249 cc::SurfaceManager* manager = factory->GetSurfaceManager();
250 cc::Surface* surface = manager->GetSurfaceForId(id);
251 EXPECT_TRUE(surface);
252 // There should be a SurfaceSequence created by the RWHVGuest.
253 EXPECT_EQ(1u, surface->GetDestructionDependencyCount());
254 #endif
255 // Surface ID should have been passed to BrowserPluginGuest to
256 // be sent to the embedding renderer.
257 EXPECT_EQ(id, browser_plugin_guest_->last_surface_id_received_);
258 EXPECT_EQ(view_size, browser_plugin_guest_->last_frame_size_received_);
259 EXPECT_EQ(scale_factor,
260 browser_plugin_guest_->last_scale_factor_received_);
261 }
262 } else {
263 EXPECT_TRUE(browser_plugin_guest_->received_delegated_frame_);
264 EXPECT_EQ(view_size, browser_plugin_guest_->last_frame_size_received_);
265 EXPECT_EQ(scale_factor, browser_plugin_guest_->last_scale_factor_received_);
266 }
267 }
268
85 } // namespace content 269 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/render_widget_host_view_guest.cc ('k') | content/common/browser_plugin/browser_plugin_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698