| // 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 <string> | 
 |  | 
 | #include "base/files/file_path.h" | 
 | #include "build/build_config.h" | 
 | #include "content/browser/child_process_security_policy_impl.h" | 
 | #include "content/browser/renderer_host/render_process_host_impl.h" | 
 | #include "content/browser/web_contents/web_contents_impl.h" | 
 | #include "content/public/browser/render_frame_host.h" | 
 | #include "content/public/browser/render_process_host.h" | 
 | #include "content/public/common/result_codes.h" | 
 | #include "content/public/test/browser_test_utils.h" | 
 | #include "content/public/test/content_browser_test.h" | 
 | #include "content/public/test/content_browser_test_utils.h" | 
 | #include "content/shell/browser/shell.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | namespace content { | 
 |  | 
 | class ChildProcessSecurityPolicyInProcessBrowserTest | 
 |     : public ContentBrowserTest { | 
 |  public: | 
 |   void SetUp() override { | 
 |     auto* policy = ChildProcessSecurityPolicyImpl::GetInstance(); | 
 |     { | 
 |       base::AutoLock lock(policy->lock_); | 
 |       EXPECT_EQ(0u, policy->security_state_.size()); | 
 |     } | 
 |     ContentBrowserTest::SetUp(); | 
 |   } | 
 |  | 
 |   void TearDown() override { | 
 |     auto* policy = ChildProcessSecurityPolicyImpl::GetInstance(); | 
 |     { | 
 |       base::AutoLock lock(policy->lock_); | 
 |       EXPECT_EQ(0u, policy->security_state_.size()); | 
 |     } | 
 |     ContentBrowserTest::TearDown(); | 
 |   } | 
 | }; | 
 |  | 
 | #if !defined(NDEBUG) && defined(OS_MACOSX) | 
 | IN_PROC_BROWSER_TEST_F(ChildProcessSecurityPolicyInProcessBrowserTest, DISABLED_NoLeak) { | 
 | #else | 
 | IN_PROC_BROWSER_TEST_F(ChildProcessSecurityPolicyInProcessBrowserTest, NoLeak) { | 
 | #endif | 
 |   GURL url = GetTestUrl("", "simple_page.html"); | 
 |   auto* policy = ChildProcessSecurityPolicyImpl::GetInstance(); | 
 |  | 
 |   NavigateToURL(shell(), url); | 
 |   { | 
 |     base::AutoLock lock(policy->lock_); | 
 |     EXPECT_EQ(RenderProcessHostImpl::IsSpareProcessKeptAtAllTimes() ? 2u : 1u, | 
 |               policy->security_state_.size()); | 
 |   } | 
 |  | 
 |   WebContents* web_contents = shell()->web_contents(); | 
 |   content::RenderProcessHostWatcher exit_observer( | 
 |       web_contents->GetMainFrame()->GetProcess(), | 
 |       content::RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); | 
 |   web_contents->GetMainFrame()->GetProcess()->Shutdown(RESULT_CODE_KILLED); | 
 |   exit_observer.Wait(); | 
 |  | 
 |   web_contents->GetController().Reload(ReloadType::NORMAL, true); | 
 |   { | 
 |     base::AutoLock lock(policy->lock_); | 
 |     EXPECT_EQ(RenderProcessHostImpl::IsSpareProcessKeptAtAllTimes() ? 2u : 1u, | 
 |               policy->security_state_.size()); | 
 |   } | 
 | } | 
 |  | 
 | }  // namespace content |