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

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_aura_unittest.cc

Issue 647613002: Fix RenderWidgetHostViewGuest leak. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add is_guest_view_hack_ check in rwhvmac-delegate call (needs review) Created 6 years, 2 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/renderer_host/render_widget_host_view_aura.h" 5 #include "content/browser/renderer_host/render_widget_host_view_aura.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/memory/shared_memory.h" 9 #include "base/memory/shared_memory.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "base/run_loop.h" 11 #include "base/run_loop.h"
12 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
13 #include "cc/output/compositor_frame.h" 13 #include "cc/output/compositor_frame.h"
14 #include "cc/output/compositor_frame_metadata.h" 14 #include "cc/output/compositor_frame_metadata.h"
15 #include "cc/output/copy_output_request.h" 15 #include "cc/output/copy_output_request.h"
16 #include "cc/surfaces/surface.h" 16 #include "cc/surfaces/surface.h"
17 #include "cc/surfaces/surface_manager.h" 17 #include "cc/surfaces/surface_manager.h"
18 #include "content/browser/browser_thread_impl.h" 18 #include "content/browser/browser_thread_impl.h"
19 #include "content/browser/compositor/resize_lock.h" 19 #include "content/browser/compositor/resize_lock.h"
20 #include "content/browser/compositor/test/no_transport_image_transport_factory.h " 20 #include "content/browser/compositor/test/no_transport_image_transport_factory.h "
21 #include "content/browser/frame_host/render_widget_host_view_guest.h"
21 #include "content/browser/renderer_host/overscroll_controller.h" 22 #include "content/browser/renderer_host/overscroll_controller.h"
22 #include "content/browser/renderer_host/overscroll_controller_delegate.h" 23 #include "content/browser/renderer_host/overscroll_controller_delegate.h"
23 #include "content/browser/renderer_host/render_widget_host_delegate.h" 24 #include "content/browser/renderer_host/render_widget_host_delegate.h"
24 #include "content/browser/renderer_host/render_widget_host_impl.h" 25 #include "content/browser/renderer_host/render_widget_host_impl.h"
25 #include "content/common/gpu/client/gl_helper.h" 26 #include "content/common/gpu/client/gl_helper.h"
26 #include "content/common/gpu/gpu_messages.h" 27 #include "content/common/gpu/gpu_messages.h"
27 #include "content/common/host_shared_bitmap_manager.h" 28 #include "content/common/host_shared_bitmap_manager.h"
28 #include "content/common/input/synthetic_web_input_event_builders.h" 29 #include "content/common/input/synthetic_web_input_event_builders.h"
29 #include "content/common/input_messages.h" 30 #include "content/common/input_messages.h"
30 #include "content/common/view_messages.h" 31 #include "content/common/view_messages.h"
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 callback.Run(success); 215 callback.Run(success);
215 } 216 }
216 217
217 private: 218 private:
218 gfx::Size size_; 219 gfx::Size size_;
219 base::Callback<void(bool)> callback_; 220 base::Callback<void(bool)> callback_;
220 }; 221 };
221 222
222 class FakeRenderWidgetHostViewAura : public RenderWidgetHostViewAura { 223 class FakeRenderWidgetHostViewAura : public RenderWidgetHostViewAura {
223 public: 224 public:
224 FakeRenderWidgetHostViewAura(RenderWidgetHost* widget) 225 FakeRenderWidgetHostViewAura(RenderWidgetHost* widget,
225 : RenderWidgetHostViewAura(widget), has_resize_lock_(false) {} 226 bool is_guest_view_hack)
227 : RenderWidgetHostViewAura(widget, is_guest_view_hack),
228 has_resize_lock_(false) {}
226 229
227 virtual ~FakeRenderWidgetHostViewAura() {} 230 virtual ~FakeRenderWidgetHostViewAura() {}
228 231
229 virtual scoped_ptr<ResizeLock> CreateResizeLock( 232 virtual scoped_ptr<ResizeLock> CreateResizeLock(
230 bool defer_compositor_lock) override { 233 bool defer_compositor_lock) override {
231 gfx::Size desired_size = window()->bounds().size(); 234 gfx::Size desired_size = window()->bounds().size();
232 return scoped_ptr<ResizeLock>( 235 return scoped_ptr<ResizeLock>(
233 new FakeResizeLock(desired_size, defer_compositor_lock)); 236 new FakeResizeLock(desired_size, defer_compositor_lock));
234 } 237 }
235 238
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 class MockWindowObserver : public aura::WindowObserver { 321 class MockWindowObserver : public aura::WindowObserver {
319 public: 322 public:
320 MOCK_METHOD2(OnDelegatedFrameDamage, void(aura::Window*, const gfx::Rect&)); 323 MOCK_METHOD2(OnDelegatedFrameDamage, void(aura::Window*, const gfx::Rect&));
321 }; 324 };
322 325
323 } // namespace 326 } // namespace
324 327
325 class RenderWidgetHostViewAuraTest : public testing::Test { 328 class RenderWidgetHostViewAuraTest : public testing::Test {
326 public: 329 public:
327 RenderWidgetHostViewAuraTest() 330 RenderWidgetHostViewAuraTest()
328 : browser_thread_for_ui_(BrowserThread::UI, &message_loop_) {} 331 : widget_host_uses_shutdown_to_destroy_(false),
332 is_guest_view_hack_(false),
333 browser_thread_for_ui_(BrowserThread::UI, &message_loop_) {}
329 334
330 void SetUpEnvironment() { 335 void SetUpEnvironment() {
331 ImageTransportFactory::InitializeForUnitTests( 336 ImageTransportFactory::InitializeForUnitTests(
332 scoped_ptr<ImageTransportFactory>( 337 scoped_ptr<ImageTransportFactory>(
333 new NoTransportImageTransportFactory)); 338 new NoTransportImageTransportFactory));
334 aura_test_helper_.reset(new aura::test::AuraTestHelper(&message_loop_)); 339 aura_test_helper_.reset(new aura::test::AuraTestHelper(&message_loop_));
335 aura_test_helper_->SetUp( 340 aura_test_helper_->SetUp(
336 ImageTransportFactory::GetInstance()->GetContextFactory()); 341 ImageTransportFactory::GetInstance()->GetContextFactory());
337 new wm::DefaultActivationClient(aura_test_helper_->root_window()); 342 new wm::DefaultActivationClient(aura_test_helper_->root_window());
338 343
339 browser_context_.reset(new TestBrowserContext); 344 browser_context_.reset(new TestBrowserContext);
340 process_host_ = new MockRenderProcessHost(browser_context_.get()); 345 process_host_ = new MockRenderProcessHost(browser_context_.get());
341 346
342 sink_ = &process_host_->sink(); 347 sink_ = &process_host_->sink();
343 348
344 parent_host_ = new RenderWidgetHostImpl( 349 parent_host_ = new RenderWidgetHostImpl(
345 &delegate_, process_host_, MSG_ROUTING_NONE, false); 350 &delegate_, process_host_, MSG_ROUTING_NONE, false);
346 parent_view_ = new RenderWidgetHostViewAura(parent_host_); 351 parent_view_ = new RenderWidgetHostViewAura(parent_host_,
352 is_guest_view_hack_);
347 parent_view_->InitAsChild(NULL); 353 parent_view_->InitAsChild(NULL);
348 aura::client::ParentWindowWithContext(parent_view_->GetNativeView(), 354 aura::client::ParentWindowWithContext(parent_view_->GetNativeView(),
349 aura_test_helper_->root_window(), 355 aura_test_helper_->root_window(),
350 gfx::Rect()); 356 gfx::Rect());
351 357
352 widget_host_ = new RenderWidgetHostImpl( 358 widget_host_ = new RenderWidgetHostImpl(
353 &delegate_, process_host_, MSG_ROUTING_NONE, false); 359 &delegate_, process_host_, MSG_ROUTING_NONE, false);
354 widget_host_->Init(); 360 widget_host_->Init();
355 view_ = new FakeRenderWidgetHostViewAura(widget_host_); 361 view_ = new FakeRenderWidgetHostViewAura(widget_host_, is_guest_view_hack_);
356 } 362 }
357 363
358 void TearDownEnvironment() { 364 void TearDownEnvironment() {
359 sink_ = NULL; 365 sink_ = NULL;
360 process_host_ = NULL; 366 process_host_ = NULL;
361 if (view_) 367 if (view_)
362 view_->Destroy(); 368 view_->Destroy();
363 delete widget_host_; 369
370 if (widget_host_uses_shutdown_to_destroy_)
371 widget_host_->Shutdown();
372 else
373 delete widget_host_;
364 374
365 parent_view_->Destroy(); 375 parent_view_->Destroy();
366 delete parent_host_; 376 delete parent_host_;
367 377
368 browser_context_.reset(); 378 browser_context_.reset();
369 aura_test_helper_->TearDown(); 379 aura_test_helper_->TearDown();
370 380
371 message_loop_.DeleteSoon(FROM_HERE, browser_context_.release()); 381 message_loop_.DeleteSoon(FROM_HERE, browser_context_.release());
372 message_loop_.RunUntilIdle(); 382 message_loop_.RunUntilIdle();
373 ImageTransportFactory::Terminate(); 383 ImageTransportFactory::Terminate();
374 } 384 }
375 385
376 virtual void SetUp() { SetUpEnvironment(); } 386 virtual void SetUp() override { SetUpEnvironment(); }
377 387
378 virtual void TearDown() { TearDownEnvironment(); } 388 virtual void TearDown() override { TearDownEnvironment(); }
389
390 void set_widget_host_uses_shutdown_to_destroy(bool use) {
391 widget_host_uses_shutdown_to_destroy_ = use;
392 }
379 393
380 protected: 394 protected:
395 // If true, then calls RWH::Shutdown() instead of deleting RWH.
396 bool widget_host_uses_shutdown_to_destroy_;
397
398 bool is_guest_view_hack_;
399
381 base::MessageLoopForUI message_loop_; 400 base::MessageLoopForUI message_loop_;
382 BrowserThreadImpl browser_thread_for_ui_; 401 BrowserThreadImpl browser_thread_for_ui_;
383 scoped_ptr<aura::test::AuraTestHelper> aura_test_helper_; 402 scoped_ptr<aura::test::AuraTestHelper> aura_test_helper_;
384 scoped_ptr<BrowserContext> browser_context_; 403 scoped_ptr<BrowserContext> browser_context_;
385 MockRenderWidgetHostDelegate delegate_; 404 MockRenderWidgetHostDelegate delegate_;
386 MockRenderProcessHost* process_host_; 405 MockRenderProcessHost* process_host_;
387 406
388 // Tests should set these to NULL if they've already triggered their 407 // Tests should set these to NULL if they've already triggered their
389 // destruction. 408 // destruction.
390 RenderWidgetHostImpl* parent_host_; 409 RenderWidgetHostImpl* parent_host_;
391 RenderWidgetHostViewAura* parent_view_; 410 RenderWidgetHostViewAura* parent_view_;
392 411
393 // Tests should set these to NULL if they've already triggered their 412 // Tests should set these to NULL if they've already triggered their
394 // destruction. 413 // destruction.
395 RenderWidgetHostImpl* widget_host_; 414 RenderWidgetHostImpl* widget_host_;
396 FakeRenderWidgetHostViewAura* view_; 415 FakeRenderWidgetHostViewAura* view_;
397 416
398 IPC::TestSink* sink_; 417 IPC::TestSink* sink_;
399 418
400 private: 419 private:
401 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAuraTest); 420 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAuraTest);
402 }; 421 };
403 422
423 // Helper class to instantiate RenderWidgetHostViewGuest which is backed
424 // by an aura platform view.
425 class RenderWidgetHostViewGuestAuraTest : public RenderWidgetHostViewAuraTest {
426 public:
427 RenderWidgetHostViewGuestAuraTest() {
428 // Use RWH::Shutdown to destroy RWH, instead of deleting.
429 // This will ensure that the RenderWidgetHostViewGuest is not leaked and
430 // is deleted properly upon RWH going away.
431 set_widget_host_uses_shutdown_to_destroy(true);
432 }
433
434 // We explicitly invoke SetUp to allow gesture debounce customization.
435 virtual void SetUp() {
436 is_guest_view_hack_ = true;
437
438 RenderWidgetHostViewAuraTest::SetUp();
439
440 guest_view_weak_ = (new RenderWidgetHostViewGuest(
441 widget_host_, NULL, view_->GetWeakPtr()))->GetWeakPtr();
442 }
443
444 virtual void TearDown() {
445 // Internal override to do nothing, we clean up ourselves in the test body.
446 // This helps us test that |guest_view_weak_| does not leak.
447 }
448
449 protected:
450 base::WeakPtr<RenderWidgetHostViewBase> guest_view_weak_;
451
452 private:
453
454 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewGuestAuraTest);
455 };
456
404 class RenderWidgetHostViewAuraOverscrollTest 457 class RenderWidgetHostViewAuraOverscrollTest
405 : public RenderWidgetHostViewAuraTest { 458 : public RenderWidgetHostViewAuraTest {
406 public: 459 public:
407 RenderWidgetHostViewAuraOverscrollTest() {} 460 RenderWidgetHostViewAuraOverscrollTest() {}
408 461
409 // We explicitly invoke SetUp to allow gesture debounce customization. 462 // We explicitly invoke SetUp to allow gesture debounce customization.
410 virtual void SetUp() {} 463 virtual void SetUp() {}
411 464
412 protected: 465 protected:
413 void SetUpOverscrollEnvironmentWithDebounce(int debounce_interval_in_ms) { 466 void SetUpOverscrollEnvironmentWithDebounce(int debounce_interval_in_ms) {
(...skipping 1158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1572 scoped_ptr<RenderWidgetHostImpl * []> hosts( 1625 scoped_ptr<RenderWidgetHostImpl * []> hosts(
1573 new RenderWidgetHostImpl* [renderer_count]); 1626 new RenderWidgetHostImpl* [renderer_count]);
1574 scoped_ptr<FakeRenderWidgetHostViewAura * []> views( 1627 scoped_ptr<FakeRenderWidgetHostViewAura * []> views(
1575 new FakeRenderWidgetHostViewAura* [renderer_count]); 1628 new FakeRenderWidgetHostViewAura* [renderer_count]);
1576 1629
1577 // Create a bunch of renderers. 1630 // Create a bunch of renderers.
1578 for (size_t i = 0; i < renderer_count; ++i) { 1631 for (size_t i = 0; i < renderer_count; ++i) {
1579 hosts[i] = new RenderWidgetHostImpl( 1632 hosts[i] = new RenderWidgetHostImpl(
1580 &delegate_, process_host_, MSG_ROUTING_NONE, false); 1633 &delegate_, process_host_, MSG_ROUTING_NONE, false);
1581 hosts[i]->Init(); 1634 hosts[i]->Init();
1582 views[i] = new FakeRenderWidgetHostViewAura(hosts[i]); 1635 views[i] = new FakeRenderWidgetHostViewAura(hosts[i], false);
1583 views[i]->InitAsChild(NULL); 1636 views[i]->InitAsChild(NULL);
1584 aura::client::ParentWindowWithContext( 1637 aura::client::ParentWindowWithContext(
1585 views[i]->GetNativeView(), 1638 views[i]->GetNativeView(),
1586 parent_view_->GetNativeView()->GetRootWindow(), 1639 parent_view_->GetNativeView()->GetRootWindow(),
1587 gfx::Rect()); 1640 gfx::Rect());
1588 views[i]->SetSize(view_rect.size()); 1641 views[i]->SetSize(view_rect.size());
1589 } 1642 }
1590 1643
1591 // Make each renderer visible, and swap a frame on it, then make it invisible. 1644 // Make each renderer visible, and swap a frame on it, then make it invisible.
1592 for (size_t i = 0; i < renderer_count; ++i) { 1645 for (size_t i = 0; i < renderer_count; ++i) {
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1734 scoped_ptr<RenderWidgetHostImpl * []> hosts( 1787 scoped_ptr<RenderWidgetHostImpl * []> hosts(
1735 new RenderWidgetHostImpl* [renderer_count]); 1788 new RenderWidgetHostImpl* [renderer_count]);
1736 scoped_ptr<FakeRenderWidgetHostViewAura * []> views( 1789 scoped_ptr<FakeRenderWidgetHostViewAura * []> views(
1737 new FakeRenderWidgetHostViewAura* [renderer_count]); 1790 new FakeRenderWidgetHostViewAura* [renderer_count]);
1738 1791
1739 // Create a bunch of renderers. 1792 // Create a bunch of renderers.
1740 for (size_t i = 0; i < renderer_count; ++i) { 1793 for (size_t i = 0; i < renderer_count; ++i) {
1741 hosts[i] = new RenderWidgetHostImpl( 1794 hosts[i] = new RenderWidgetHostImpl(
1742 &delegate_, process_host_, MSG_ROUTING_NONE, false); 1795 &delegate_, process_host_, MSG_ROUTING_NONE, false);
1743 hosts[i]->Init(); 1796 hosts[i]->Init();
1744 views[i] = new FakeRenderWidgetHostViewAura(hosts[i]); 1797 views[i] = new FakeRenderWidgetHostViewAura(hosts[i], false);
1745 views[i]->InitAsChild(NULL); 1798 views[i]->InitAsChild(NULL);
1746 aura::client::ParentWindowWithContext( 1799 aura::client::ParentWindowWithContext(
1747 views[i]->GetNativeView(), 1800 views[i]->GetNativeView(),
1748 parent_view_->GetNativeView()->GetRootWindow(), 1801 parent_view_->GetNativeView()->GetRootWindow(),
1749 gfx::Rect()); 1802 gfx::Rect());
1750 views[i]->SetSize(view_rect.size()); 1803 views[i]->SetSize(view_rect.size());
1751 } 1804 }
1752 1805
1753 // Make each renderer visible and swap a frame on it. No eviction should 1806 // Make each renderer visible and swap a frame on it. No eviction should
1754 // occur because all frames are visible. 1807 // occur because all frames are visible.
(...skipping 1092 matching lines...) Expand 10 before | Expand all | Expand 10 after
2847 EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->current_mode()); 2900 EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->current_mode());
2848 EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->completed_mode()); 2901 EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->completed_mode());
2849 2902
2850 SimulateGestureEvent(WebInputEvent::GestureScrollEnd, 2903 SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
2851 blink::WebGestureDeviceTouchscreen); 2904 blink::WebGestureDeviceTouchscreen);
2852 EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); 2905 EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode());
2853 EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->completed_mode()); 2906 EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->completed_mode());
2854 EXPECT_EQ(3U, sink_->message_count()); 2907 EXPECT_EQ(3U, sink_->message_count());
2855 } 2908 }
2856 2909
2910 // Tests that when view initiated shutdown happens (i.e. RWHView is deleted
2911 // before RWH), we clean up properly and don't leak the RWHVGuest.
2912 TEST_F(RenderWidgetHostViewGuestAuraTest, GuestViewDoesNotLeak) {
2913 TearDownEnvironment();
2914 ASSERT_FALSE(guest_view_weak_.get());
2915 }
2916
2857 } // namespace content 2917 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698