Chromium Code Reviews| 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 |