Home | History | Annotate | Download | only in browser
      1 // Copyright 2014 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 "content/browser/bootstrap_sandbox_mac.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/mac/mac_util.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "base/memory/singleton.h"
     11 #include "content/common/sandbox_init_mac.h"
     12 #include "content/public/browser/browser_child_process_observer.h"
     13 #include "content/public/browser/child_process_data.h"
     14 #include "content/public/common/sandbox_type_mac.h"
     15 #include "sandbox/mac/bootstrap_sandbox.h"
     16 
     17 namespace content {
     18 
     19 namespace {
     20 
     21 // This class is responsible for creating the BootstrapSandbox global
     22 // singleton, as well as registering all associated policies with it.
     23 class BootstrapSandboxPolicy : public BrowserChildProcessObserver {
     24  public:
     25   static BootstrapSandboxPolicy* GetInstance();
     26 
     27   sandbox::BootstrapSandbox* sandbox() const {
     28     return sandbox_.get();
     29   }
     30 
     31   // BrowserChildProcessObserver:
     32   virtual void BrowserChildProcessHostDisconnected(
     33       const ChildProcessData& data) OVERRIDE;
     34   virtual void BrowserChildProcessCrashed(
     35       const ChildProcessData& data) OVERRIDE;
     36 
     37  private:
     38   friend struct DefaultSingletonTraits<BootstrapSandboxPolicy>;
     39   BootstrapSandboxPolicy();
     40   virtual ~BootstrapSandboxPolicy();
     41 
     42   void RegisterSandboxPolicies();
     43 
     44   scoped_ptr<sandbox::BootstrapSandbox> sandbox_;
     45 };
     46 
     47 BootstrapSandboxPolicy* BootstrapSandboxPolicy::GetInstance() {
     48   return Singleton<BootstrapSandboxPolicy>::get();
     49 }
     50 
     51 void BootstrapSandboxPolicy::BrowserChildProcessHostDisconnected(
     52       const ChildProcessData& data) {
     53   sandbox()->ChildDied(data.handle);
     54 }
     55 
     56 void BootstrapSandboxPolicy::BrowserChildProcessCrashed(
     57       const ChildProcessData& data) {
     58   sandbox()->ChildDied(data.handle);
     59 }
     60 
     61 BootstrapSandboxPolicy::BootstrapSandboxPolicy()
     62     : sandbox_(sandbox::BootstrapSandbox::Create()) {
     63   CHECK(sandbox_.get());
     64   BrowserChildProcessObserver::Add(this);
     65   RegisterSandboxPolicies();
     66 }
     67 
     68 BootstrapSandboxPolicy::~BootstrapSandboxPolicy() {
     69   BrowserChildProcessObserver::Remove(this);
     70 }
     71 
     72 void BootstrapSandboxPolicy::RegisterSandboxPolicies() {
     73 }
     74 
     75 }  // namespace
     76 
     77 bool ShouldEnableBootstrapSandbox() {
     78   return base::mac::IsOSMountainLionOrEarlier() ||
     79          base::mac::IsOSMavericks();
     80 }
     81 
     82 sandbox::BootstrapSandbox* GetBootstrapSandbox() {
     83   return BootstrapSandboxPolicy::GetInstance()->sandbox();
     84 }
     85 
     86 }  // namespace content
     87