1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// Copyright 2014 The Chromium Authors. All rights reserved. 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be 3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu// found in the LICENSE file. 4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "chromecast/shell/app/cast_main_delegate.h" 6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "base/cpu.h" 8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "base/logging.h" 9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "base/path_service.h" 10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "base/posix/global_descriptors.h" 11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "chromecast/common/cast_paths.h" 12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "chromecast/common/cast_resource_delegate.h" 13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "chromecast/common/global_descriptors.h" 14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "chromecast/shell/browser/cast_content_browser_client.h" 15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "chromecast/shell/renderer/cast_content_renderer_client.h" 16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "content/public/browser/browser_main_runner.h" 17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "content/public/common/content_switches.h" 18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "ui/base/resource/resource_bundle.h" 195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectnamespace chromecast { 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectnamespace shell { 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectCastMainDelegate::CastMainDelegate() { 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectCastMainDelegate::~CastMainDelegate() { 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectbool CastMainDelegate::BasicStartupComplete(int* exit_code) { 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RegisterPathProvider(); 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project logging::LoggingSettings settings; 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if defined(OS_ANDROID) 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project base::FilePath log_file; 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project PathService::Get(FILE_CAST_ANDROID_LOG, &log_file); 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project settings.logging_dest = logging::LOG_TO_ALL; 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project settings.log_file = log_file.value().c_str(); 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project settings.delete_old = logging::DELETE_OLD_LOG_FILE; 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif // defined(OS_ANDROID) 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project logging::InitLogging(settings); 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // Time, process, and thread ID are available through logcat. 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project logging::SetLogItems(true, true, false, false); 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project content::SetContentClient(&content_client_); 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return false; 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid CastMainDelegate::PreSandboxStartup() { 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX)) 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // Create an instance of the CPU class to parse /proc/cpuinfo and cache the 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // results. This data needs to be cached when file-reading is still allowed, 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // since base::CPU expects to be callable later, when file-reading is no 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // longer allowed. 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project base::CPU cpu_info; 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project InitializeResourceBundle(); 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint CastMainDelegate::RunProcess( 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project const std::string& process_type, 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project const content::MainFunctionParams& main_function_params) { 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if defined(OS_ANDROID) 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!process_type.empty()) 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return -1; 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // Note: Android must handle running its own browser process. 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // See ChromeMainDelegateAndroid::RunProcess. 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project browser_runner_.reset(content::BrowserMainRunner::Create()); 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return browser_runner_->Initialize(main_function_params); 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return -1; 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif // defined(OS_ANDROID) 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if !defined(OS_ANDROID) 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid CastMainDelegate::ZygoteForked() { 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif // !defined(OS_ANDROID) 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid CastMainDelegate::InitializeResourceBundle() { 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if defined(OS_ANDROID) 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // On Android, the renderer runs with a different UID and can never access 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // the file system. Use the file descriptor passed in at launch time. 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project int pak_fd = 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project base::GlobalDescriptors::GetInstance()->MaybeGet(kAndroidPakDescriptor); 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (pak_fd >= 0) { 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ui::ResourceBundle::InitSharedInstanceWithPakFileRegion( 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project base::File(pak_fd), base::MemoryMappedFile::Region::kWholeFile); 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ui::ResourceBundle::GetSharedInstance().AddDataPackFromFile( 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project base::File(pak_fd), ui::SCALE_FACTOR_100P); 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif // defined(OS_ANDROID) 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project resource_delegate_.reset(new CastResourceDelegate()); 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // TODO(gunsch): Use LOAD_COMMON_RESOURCES once ResourceBundle no longer 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // hardcodes resource file names. 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ui::ResourceBundle::InitSharedInstanceWithLocale( 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project "en-US", 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project resource_delegate_.get(), 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ui::ResourceBundle::DO_NOT_LOAD_COMMON_RESOURCES); 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project base::FilePath pak_file; 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CHECK(PathService::Get(FILE_CAST_PAK, &pak_file)); 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath( 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pak_file, 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ui::SCALE_FACTOR_NONE); 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectcontent::ContentBrowserClient* CastMainDelegate::CreateContentBrowserClient() { 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project browser_client_.reset(new CastContentBrowserClient); 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return browser_client_.get(); 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectcontent::ContentRendererClient* 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectCastMainDelegate::CreateContentRendererClient() { 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project renderer_client_.reset(new CastContentRendererClient); 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return renderer_client_.get(); 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} // namespace shell 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} // namespace chromecast 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project