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_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 |
OLD | NEW |