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

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: Fix test. 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 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
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