Home | History | Annotate | Download | only in web_contents
      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 
     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