// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" #include "base/message_loop.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/browser/renderer_host/test_render_view_host.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents_delegate.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_browser_thread.h" #include "testing/gtest/include/gtest/gtest.h" namespace content { class MockWebContentsDelegate : public WebContentsDelegate { public: virtual ~MockWebContentsDelegate() {} }; class WebContentsDelegateTest : public RenderViewHostImplTestHarness { public: WebContentsDelegateTest() : file_user_blocking_thread_( BrowserThread::FILE_USER_BLOCKING, &message_loop_), io_thread_(BrowserThread::IO, &message_loop_) { } private: TestBrowserThread file_user_blocking_thread_; TestBrowserThread io_thread_; }; TEST_F(WebContentsDelegateTest, UnregisterInDestructor) { scoped_ptr contents_a(static_cast( WebContents::Create(WebContents::CreateParams(browser_context_.get())))); scoped_ptr contents_b(static_cast( WebContents::Create(WebContents::CreateParams(browser_context_.get())))); EXPECT_EQ(NULL, contents_a->GetDelegate()); EXPECT_EQ(NULL, contents_b->GetDelegate()); scoped_ptr delegate(new MockWebContentsDelegate()); // Setting a delegate should work correctly. contents_a->SetDelegate(delegate.get()); EXPECT_EQ(delegate.get(), contents_a->GetDelegate()); EXPECT_TRUE(contents_b->GetDelegate() == NULL); // A delegate can be a delegate to multiple WebContentsImpl. contents_b->SetDelegate(delegate.get()); EXPECT_EQ(delegate.get(), contents_a->GetDelegate()); EXPECT_EQ(delegate.get(), contents_b->GetDelegate()); // Setting the same delegate multiple times should work correctly. contents_b->SetDelegate(delegate.get()); EXPECT_EQ(delegate.get(), contents_a->GetDelegate()); EXPECT_EQ(delegate.get(), contents_b->GetDelegate()); // Setting delegate to NULL should work correctly. contents_b->SetDelegate(NULL); EXPECT_EQ(delegate.get(), contents_a->GetDelegate()); EXPECT_TRUE(contents_b->GetDelegate() == NULL); // Destroying the delegate while it is still the delegate for a // WebContentsImpl should unregister it. contents_b->SetDelegate(delegate.get()); EXPECT_EQ(delegate.get(), contents_a->GetDelegate()); EXPECT_EQ(delegate.get(), contents_b->GetDelegate()); delegate.reset(NULL); EXPECT_TRUE(contents_a->GetDelegate() == NULL); EXPECT_TRUE(contents_b->GetDelegate() == NULL); // Destroy the WebContentses and run the message loop to prevent leaks. contents_a.reset(); contents_b.reset(); } } // namespace content