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 3 // found in the LICENSE file. 4 5 #include "base/compiler_specific.h" 6 #include "base/memory/scoped_ptr.h" 7 #include "base/message_loop/message_loop.h" 8 #include "content/browser/web_contents/web_contents_impl.h" 9 #include "content/public/browser/web_contents_delegate.h" 10 #include "content/public/test/test_browser_context.h" 11 #include "content/test/test_render_view_host.h" 12 #include "testing/gtest/include/gtest/gtest.h" 13 14 namespace content { 15 16 class MockWebContentsDelegate : public WebContentsDelegate { 17 }; 18 19 class WebContentsDelegateTest : public RenderViewHostImplTestHarness { 20 }; 21 22 TEST_F(WebContentsDelegateTest, UnregisterInDestructor) { 23 scoped_ptr<WebContentsImpl> contents_a(static_cast<WebContentsImpl*>( 24 WebContents::Create(WebContents::CreateParams(browser_context())))); 25 scoped_ptr<WebContentsImpl> contents_b(static_cast<WebContentsImpl*>( 26 WebContents::Create(WebContents::CreateParams(browser_context())))); 27 EXPECT_EQ(NULL, contents_a->GetDelegate()); 28 EXPECT_EQ(NULL, contents_b->GetDelegate()); 29 30 scoped_ptr<MockWebContentsDelegate> delegate(new MockWebContentsDelegate()); 31 32 // Setting a delegate should work correctly. 33 contents_a->SetDelegate(delegate.get()); 34 EXPECT_EQ(delegate.get(), contents_a->GetDelegate()); 35 EXPECT_TRUE(contents_b->GetDelegate() == NULL); 36 37 // A delegate can be a delegate to multiple WebContentsImpl. 38 contents_b->SetDelegate(delegate.get()); 39 EXPECT_EQ(delegate.get(), contents_a->GetDelegate()); 40 EXPECT_EQ(delegate.get(), contents_b->GetDelegate()); 41 42 // Setting the same delegate multiple times should work correctly. 43 contents_b->SetDelegate(delegate.get()); 44 EXPECT_EQ(delegate.get(), contents_a->GetDelegate()); 45 EXPECT_EQ(delegate.get(), contents_b->GetDelegate()); 46 47 // Setting delegate to NULL should work correctly. 48 contents_b->SetDelegate(NULL); 49 EXPECT_EQ(delegate.get(), contents_a->GetDelegate()); 50 EXPECT_TRUE(contents_b->GetDelegate() == NULL); 51 52 // Destroying the delegate while it is still the delegate for a 53 // WebContentsImpl should unregister it. 54 contents_b->SetDelegate(delegate.get()); 55 EXPECT_EQ(delegate.get(), contents_a->GetDelegate()); 56 EXPECT_EQ(delegate.get(), contents_b->GetDelegate()); 57 delegate.reset(NULL); 58 EXPECT_TRUE(contents_a->GetDelegate() == NULL); 59 EXPECT_TRUE(contents_b->GetDelegate() == NULL); 60 61 // Destroy the WebContentses and run the message loop to prevent leaks. 62 contents_a.reset(); 63 contents_b.reset(); 64 } 65 66 } // namespace content 67