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/renderer_host/test_render_view_host.h" 9#include "content/browser/web_contents/web_contents_impl.h" 10#include "content/public/browser/web_contents_delegate.h" 11#include "content/public/test/test_browser_context.h" 12#include "testing/gtest/include/gtest/gtest.h" 13 14namespace content { 15 16class MockWebContentsDelegate : public WebContentsDelegate { 17}; 18 19class WebContentsDelegateTest : public RenderViewHostImplTestHarness { 20}; 21 22TEST_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