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 "extensions/shell/app/shell_main_delegate.h" 6 7 #include "base/command_line.h" 8 #include "base/files/file_path.h" 9 #include "base/logging.h" 10 #include "base/path_service.h" 11 #include "content/public/browser/browser_main_runner.h" 12 #include "content/public/common/content_switches.h" 13 #include "extensions/common/extension_paths.h" 14 #include "extensions/shell/browser/default_shell_browser_main_delegate.h" 15 #include "extensions/shell/browser/shell_content_browser_client.h" 16 #include "extensions/shell/common/shell_content_client.h" 17 #include "extensions/shell/renderer/shell_content_renderer_client.h" 18 #include "ui/base/resource/resource_bundle.h" 19 20 #if defined(OS_CHROMEOS) 21 #include "chromeos/chromeos_paths.h" 22 #endif 23 24 #if !defined(DISABLE_NACL) 25 #include "components/nacl/common/nacl_switches.h" 26 #if defined(OS_LINUX) 27 #include "components/nacl/common/nacl_paths.h" 28 #include "components/nacl/zygote/nacl_fork_delegate_linux.h" 29 #endif // OS_LINUX 30 #endif // !DISABLE_NACL 31 32 namespace { 33 34 void InitLogging() { 35 base::FilePath log_filename; 36 PathService::Get(base::DIR_EXE, &log_filename); 37 log_filename = log_filename.AppendASCII("app_shell.log"); 38 logging::LoggingSettings settings; 39 settings.logging_dest = logging::LOG_TO_ALL; 40 settings.log_file = log_filename.value().c_str(); 41 settings.delete_old = logging::DELETE_OLD_LOG_FILE; 42 logging::InitLogging(settings); 43 logging::SetLogItems(true, true, true, true); 44 } 45 46 } // namespace 47 48 namespace extensions { 49 50 ShellMainDelegate::ShellMainDelegate() { 51 } 52 53 ShellMainDelegate::~ShellMainDelegate() { 54 } 55 56 bool ShellMainDelegate::BasicStartupComplete(int* exit_code) { 57 InitLogging(); 58 content_client_.reset(CreateContentClient()); 59 SetContentClient(content_client_.get()); 60 61 #if defined(OS_CHROMEOS) 62 chromeos::RegisterPathProvider(); 63 #endif 64 #if !defined(DISABLE_NACL) && defined(OS_LINUX) 65 nacl::RegisterPathProvider(); 66 #endif 67 extensions::RegisterPathProvider(); 68 return false; 69 } 70 71 void ShellMainDelegate::PreSandboxStartup() { 72 std::string process_type = 73 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( 74 switches::kProcessType); 75 if (ProcessNeedsResourceBundle(process_type)) 76 InitializeResourceBundle(); 77 } 78 79 content::ContentBrowserClient* ShellMainDelegate::CreateContentBrowserClient() { 80 browser_client_.reset(CreateShellContentBrowserClient()); 81 return browser_client_.get(); 82 } 83 84 content::ContentRendererClient* 85 ShellMainDelegate::CreateContentRendererClient() { 86 renderer_client_.reset(CreateShellContentRendererClient()); 87 return renderer_client_.get(); 88 } 89 90 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) 91 void ShellMainDelegate::ZygoteStarting( 92 ScopedVector<content::ZygoteForkDelegate>* delegates) { 93 #if !defined(DISABLE_NACL) 94 nacl::AddNaClZygoteForkDelegates(delegates); 95 #endif // DISABLE_NACL 96 } 97 #endif // OS_POSIX && !OS_MACOSX && !OS_ANDROID 98 99 content::ContentClient* ShellMainDelegate::CreateContentClient() { 100 return new ShellContentClient(); 101 } 102 103 content::ContentBrowserClient* 104 ShellMainDelegate::CreateShellContentBrowserClient() { 105 return new ShellContentBrowserClient(new DefaultShellBrowserMainDelegate()); 106 } 107 108 content::ContentRendererClient* 109 ShellMainDelegate::CreateShellContentRendererClient() { 110 return new ShellContentRendererClient(); 111 } 112 113 void ShellMainDelegate::InitializeResourceBundle() { 114 base::FilePath extensions_shell_and_test_pak_path; 115 PathService::Get(base::DIR_MODULE, &extensions_shell_and_test_pak_path); 116 ui::ResourceBundle::InitSharedInstanceWithPakPath( 117 extensions_shell_and_test_pak_path.AppendASCII( 118 "extensions_shell_and_test.pak")); 119 } 120 121 // static 122 bool ShellMainDelegate::ProcessNeedsResourceBundle( 123 const std::string& process_type) { 124 // The browser process has no process type flag, but needs resources. 125 // On Linux the zygote process opens the resources for the renderers. 126 return process_type.empty() || 127 process_type == switches::kZygoteProcess || 128 process_type == switches::kRendererProcess || 129 #if !defined(DISABLE_NACL) 130 process_type == switches::kNaClLoaderProcess || 131 #endif 132 process_type == switches::kUtilityProcess; 133 } 134 135 } // namespace extensions 136