| // 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 "content/public/browser/web_contents_delegate.h" |
| |
| #include <memory> |
| |
| #include "base/compiler_specific.h" |
| #include "content/browser/web_contents/web_contents_impl.h" |
| #include "content/public/test/test_browser_context.h" |
| #include "content/test/test_render_view_host.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace content { |
| |
| class MockWebContentsDelegate : public WebContentsDelegate { |
| }; |
| |
| class WebContentsDelegateTest : public RenderViewHostImplTestHarness { |
| }; |
| |
| TEST_F(WebContentsDelegateTest, UnregisterInDestructor) { |
| std::unique_ptr<WebContents> contents_a( |
| WebContents::Create(WebContents::CreateParams(browser_context()))); |
| WebContentsImpl* raw_contents_a = |
| static_cast<WebContentsImpl*>(contents_a.get()); |
| std::unique_ptr<WebContents> contents_b( |
| WebContents::Create(WebContents::CreateParams(browser_context()))); |
| WebContentsImpl* raw_contents_b = |
| static_cast<WebContentsImpl*>(contents_b.get()); |
| EXPECT_EQ(nullptr, raw_contents_a->GetDelegate()); |
| EXPECT_EQ(nullptr, raw_contents_b->GetDelegate()); |
| |
| std::unique_ptr<MockWebContentsDelegate> delegate( |
| new MockWebContentsDelegate()); |
| |
| // Setting a delegate should work correctly. |
| raw_contents_a->SetDelegate(delegate.get()); |
| EXPECT_EQ(delegate.get(), raw_contents_a->GetDelegate()); |
| EXPECT_TRUE(raw_contents_b->GetDelegate() == nullptr); |
| |
| // A delegate can be a delegate to multiple WebContentsImpl. |
| raw_contents_b->SetDelegate(delegate.get()); |
| EXPECT_EQ(delegate.get(), raw_contents_a->GetDelegate()); |
| EXPECT_EQ(delegate.get(), raw_contents_b->GetDelegate()); |
| |
| // Setting the same delegate multiple times should work correctly. |
| raw_contents_b->SetDelegate(delegate.get()); |
| EXPECT_EQ(delegate.get(), raw_contents_a->GetDelegate()); |
| EXPECT_EQ(delegate.get(), raw_contents_b->GetDelegate()); |
| |
| // Setting delegate to NULL should work correctly. |
| raw_contents_b->SetDelegate(nullptr); |
| EXPECT_EQ(delegate.get(), raw_contents_a->GetDelegate()); |
| EXPECT_TRUE(raw_contents_b->GetDelegate() == nullptr); |
| |
| // Destroying the delegate while it is still the delegate for a |
| // WebContentsImpl should unregister it. |
| raw_contents_b->SetDelegate(delegate.get()); |
| EXPECT_EQ(delegate.get(), raw_contents_a->GetDelegate()); |
| EXPECT_EQ(delegate.get(), raw_contents_b->GetDelegate()); |
| delegate.reset(nullptr); |
| EXPECT_TRUE(raw_contents_a->GetDelegate() == nullptr); |
| EXPECT_TRUE(raw_contents_b->GetDelegate() == nullptr); |
| |
| // Destroy the WebContentses and run the message loop to prevent leaks. |
| contents_a.reset(); |
| contents_b.reset(); |
| } |
| |
| } // namespace content |