|  | // Copyright 2012 The Chromium Authors | 
|  | // 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.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) && BUILDFLAG(IS_MAC) | 
|  | 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(); | 
|  |  | 
|  | EXPECT_TRUE(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->GetPrimaryMainFrame()->GetProcess(), | 
|  | content::RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); | 
|  | web_contents->GetPrimaryMainFrame()->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 |