diff options
-rw-r--r-- | ash/shell/DEPS | 1 | ||||
-rw-r--r-- | ash/shell/content_client/shell_content_browser_client.cc | 31 | ||||
-rw-r--r-- | ash/shell/content_client/shell_content_browser_client.h | 11 | ||||
-rw-r--r-- | chrome/browser/chrome_content_browser_client.cc | 25 | ||||
-rw-r--r-- | content/shell/browser/shell_content_browser_client.cc | 25 | ||||
-rw-r--r-- | extensions/shell/browser/DEPS | 2 | ||||
-rw-r--r-- | extensions/shell/browser/shell_content_browser_client.cc | 38 | ||||
-rw-r--r-- | extensions/shell/browser/shell_content_browser_client.h | 12 | ||||
-rw-r--r-- | gin/v8_initializer.cc | 108 | ||||
-rw-r--r-- | gin/v8_initializer.h | 6 |
10 files changed, 181 insertions, 78 deletions
diff --git a/ash/shell/DEPS b/ash/shell/DEPS index 1108a45..2e87ae5 100644 --- a/ash/shell/DEPS +++ b/ash/shell/DEPS @@ -1,5 +1,6 @@ include_rules = [ "+content/public", "+content/shell", + "+gin", "+sandbox", ] diff --git a/ash/shell/content_client/shell_content_browser_client.cc b/ash/shell/content_client/shell_content_browser_client.cc index f778787..7f956ec 100644 --- a/ash/shell/content_client/shell_content_browser_client.cc +++ b/ash/shell/content_client/shell_content_browser_client.cc @@ -5,14 +5,21 @@ #include "ash/shell/content_client/shell_content_browser_client.h" #include "ash/shell/content_client/shell_browser_main_parts.h" +#include "content/public/common/content_descriptors.h" #include "content/shell/browser/shell_browser_context.h" +#include "gin/v8_initializer.h" #include "third_party/skia/include/core/SkBitmap.h" namespace ash { namespace shell { ShellContentBrowserClient::ShellContentBrowserClient() - : shell_browser_main_parts_(NULL) { + : +#if defined(OS_POSIX) && !defined(OS_MACOSX) + v8_natives_fd_(-1), + v8_snapshot_fd_(-1), +#endif // OS_POSIX && !OS_MACOSX + shell_browser_main_parts_(nullptr) { } ShellContentBrowserClient::~ShellContentBrowserClient() { @@ -34,6 +41,28 @@ net::URLRequestContextGetter* ShellContentBrowserClient::CreateRequestContext( request_interceptors.Pass()); } +#if defined(OS_POSIX) && !defined(OS_MACOSX) +void ShellContentBrowserClient::GetAdditionalMappedFilesForChildProcess( + const base::CommandLine& command_line, + int child_process_id, + content::FileDescriptorInfo* mappings) { +#if defined(V8_USE_EXTERNAL_STARTUP_DATA) + if (v8_natives_fd_.get() == -1 || v8_snapshot_fd_.get() == -1) { + int v8_natives_fd = -1; + int v8_snapshot_fd = -1; + if (gin::V8Initializer::OpenV8FilesForChildProcesses(&v8_natives_fd, + &v8_snapshot_fd)) { + v8_natives_fd_.reset(v8_natives_fd); + v8_snapshot_fd_.reset(v8_snapshot_fd); + } + } + DCHECK(v8_natives_fd_.get() != -1 && v8_snapshot_fd_.get() != -1); + mappings->Share(kV8NativesDataDescriptor, v8_natives_fd_.get()); + mappings->Share(kV8SnapshotDataDescriptor, v8_snapshot_fd_.get()); +#endif // V8_USE_EXTERNAL_STARTUP_DATA +} +#endif // OS_POSIX && !OS_MACOSX + content::ShellBrowserContext* ShellContentBrowserClient::browser_context() { return shell_browser_main_parts_->browser_context(); } diff --git a/ash/shell/content_client/shell_content_browser_client.h b/ash/shell/content_client/shell_content_browser_client.h index 1a5eb44..df62338 100644 --- a/ash/shell/content_client/shell_content_browser_client.h +++ b/ash/shell/content_client/shell_content_browser_client.h @@ -33,10 +33,21 @@ class ShellContentBrowserClient : public content::ContentBrowserClient { content::BrowserContext* browser_context, content::ProtocolHandlerMap* protocol_handlers, content::URLRequestInterceptorScopedVector request_interceptors) override; +#if defined(OS_POSIX) && !defined(OS_MACOSX) + void GetAdditionalMappedFilesForChildProcess( + const base::CommandLine& command_line, + int child_process_id, + content::FileDescriptorInfo* mappings) override; +#endif content::ShellBrowserContext* browser_context(); private: +#if defined(OS_POSIX) && !defined(OS_MACOSX) + base::ScopedFD v8_natives_fd_; + base::ScopedFD v8_snapshot_fd_; +#endif + ShellBrowserMainParts* shell_browser_main_parts_; DISALLOW_COPY_AND_ASSIGN(ShellContentBrowserClient); diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 51ab5ea..f558eed 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc @@ -2183,23 +2183,16 @@ void ChromeContentBrowserClient::GetAdditionalMappedFilesForChildProcess( int child_process_id, FileDescriptorInfo* mappings) { #if defined(V8_USE_EXTERNAL_STARTUP_DATA) - if (v8_snapshot_fd_.get() == -1 && v8_natives_fd_.get() == -1) { - base::FilePath v8_data_path; - PathService::Get(gin::V8Initializer::kV8SnapshotBasePathKey, &v8_data_path); - DCHECK(!v8_data_path.empty()); - - int file_flags = base::File::FLAG_OPEN | base::File::FLAG_READ; - base::FilePath v8_natives_data_path = - v8_data_path.AppendASCII(gin::V8Initializer::kNativesFileName); - base::FilePath v8_snapshot_data_path = - v8_data_path.AppendASCII(gin::V8Initializer::kSnapshotFileName); - base::File v8_natives_data_file(v8_natives_data_path, file_flags); - base::File v8_snapshot_data_file(v8_snapshot_data_path, file_flags); - DCHECK(v8_natives_data_file.IsValid()); - DCHECK(v8_snapshot_data_file.IsValid()); - v8_natives_fd_.reset(v8_natives_data_file.TakePlatformFile()); - v8_snapshot_fd_.reset(v8_snapshot_data_file.TakePlatformFile()); + if (v8_natives_fd_.get() == -1 || v8_snapshot_fd_.get() == -1) { + int v8_natives_fd = -1; + int v8_snapshot_fd = -1; + if (gin::V8Initializer::OpenV8FilesForChildProcesses(&v8_natives_fd, + &v8_snapshot_fd)) { + v8_natives_fd_.reset(v8_natives_fd); + v8_snapshot_fd_.reset(v8_snapshot_fd); + } } + DCHECK(v8_natives_fd_.get() != -1 && v8_snapshot_fd_.get() != -1); mappings->Share(kV8NativesDataDescriptor, v8_natives_fd_.get()); mappings->Share(kV8SnapshotDataDescriptor, v8_snapshot_fd_.get()); #endif // V8_USE_EXTERNAL_STARTUP_DATA diff --git a/content/shell/browser/shell_content_browser_client.cc b/content/shell/browser/shell_content_browser_client.cc index 9cf8473..07d1148 100644 --- a/content/shell/browser/shell_content_browser_client.cc +++ b/content/shell/browser/shell_content_browser_client.cc @@ -333,23 +333,16 @@ void ShellContentBrowserClient::GetAdditionalMappedFilesForChildProcess( int child_process_id, FileDescriptorInfo* mappings) { #if defined(V8_USE_EXTERNAL_STARTUP_DATA) - if (v8_snapshot_fd_.get() == -1 && v8_natives_fd_.get() == -1) { - base::FilePath v8_data_path; - PathService::Get(gin::V8Initializer::kV8SnapshotBasePathKey, &v8_data_path); - DCHECK(!v8_data_path.empty()); - - int file_flags = base::File::FLAG_OPEN | base::File::FLAG_READ; - base::FilePath v8_natives_data_path = - v8_data_path.AppendASCII(gin::V8Initializer::kNativesFileName); - base::FilePath v8_snapshot_data_path = - v8_data_path.AppendASCII(gin::V8Initializer::kSnapshotFileName); - base::File v8_natives_data_file(v8_natives_data_path, file_flags); - base::File v8_snapshot_data_file(v8_snapshot_data_path, file_flags); - DCHECK(v8_natives_data_file.IsValid()); - DCHECK(v8_snapshot_data_file.IsValid()); - v8_natives_fd_.reset(v8_natives_data_file.TakePlatformFile()); - v8_snapshot_fd_.reset(v8_snapshot_data_file.TakePlatformFile()); + if (v8_natives_fd_.get() == -1 || v8_snapshot_fd_.get() == -1) { + int v8_natives_fd = -1; + int v8_snapshot_fd = -1; + if (gin::V8Initializer::OpenV8FilesForChildProcesses(&v8_natives_fd, + &v8_snapshot_fd)) { + v8_natives_fd_.reset(v8_natives_fd); + v8_snapshot_fd_.reset(v8_snapshot_fd); + } } + DCHECK(v8_natives_fd_.get() != -1 && v8_snapshot_fd_.get() != -1); mappings->Share(kV8NativesDataDescriptor, v8_natives_fd_.get()); mappings->Share(kV8SnapshotDataDescriptor, v8_snapshot_fd_.get()); #endif // V8_USE_EXTERNAL_STARTUP_DATA diff --git a/extensions/shell/browser/DEPS b/extensions/shell/browser/DEPS index 19d19e7..8b27b25 100644 --- a/extensions/shell/browser/DEPS +++ b/extensions/shell/browser/DEPS @@ -21,6 +21,8 @@ include_rules = [ "+device/hid", "+device/usb", + "+gin", + "+google_apis/gaia", "+net", diff --git a/extensions/shell/browser/shell_content_browser_client.cc b/extensions/shell/browser/shell_content_browser_client.cc index 905a343..3971f0c 100644 --- a/extensions/shell/browser/shell_content_browser_client.cc +++ b/extensions/shell/browser/shell_content_browser_client.cc @@ -8,6 +8,7 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/site_instance.h" +#include "content/public/common/content_descriptors.h" #include "content/public/common/content_switches.h" #include "content/public/common/url_constants.h" #include "content/shell/browser/shell_browser_context.h" @@ -26,6 +27,7 @@ #include "extensions/shell/browser/shell_browser_main_parts.h" #include "extensions/shell/browser/shell_extension_system.h" #include "extensions/shell/browser/shell_speech_recognition_manager_delegate.h" +#include "gin/v8_initializer.h" #include "url/gurl.h" #if !defined(DISABLE_NACL) @@ -45,19 +47,25 @@ using content::BrowserThread; namespace extensions { namespace { -ShellContentBrowserClient* g_instance = NULL; +ShellContentBrowserClient* g_instance = nullptr; } // namespace ShellContentBrowserClient::ShellContentBrowserClient( ShellBrowserMainDelegate* browser_main_delegate) - : browser_main_parts_(NULL), browser_main_delegate_(browser_main_delegate) { + : +#if defined(OS_POSIX) && !defined(OS_MACOSX) + v8_natives_fd_(-1), + v8_snapshot_fd_(-1), +#endif // OS_POSIX && !OS_MACOSX + browser_main_parts_(nullptr), + browser_main_delegate_(browser_main_delegate) { DCHECK(!g_instance); g_instance = this; } ShellContentBrowserClient::~ShellContentBrowserClient() { - g_instance = NULL; + g_instance = nullptr; } // static @@ -219,7 +227,7 @@ ShellContentBrowserClient::GetExternalBrowserPpapiHost(int plugin_process_id) { ++iter; } #endif - return NULL; + return nullptr; } void ShellContentBrowserClient::GetAdditionalAllowedSchemesForFileSystem( @@ -229,6 +237,28 @@ void ShellContentBrowserClient::GetAdditionalAllowedSchemesForFileSystem( additional_allowed_schemes->push_back(kExtensionScheme); } +#if defined(OS_POSIX) && !defined(OS_MACOSX) +void ShellContentBrowserClient::GetAdditionalMappedFilesForChildProcess( + const base::CommandLine& command_line, + int child_process_id, + content::FileDescriptorInfo* mappings) { +#if defined(V8_USE_EXTERNAL_STARTUP_DATA) + if (v8_natives_fd_.get() == -1 || v8_snapshot_fd_.get() == -1) { + int v8_natives_fd = -1; + int v8_snapshot_fd = -1; + if (gin::V8Initializer::OpenV8FilesForChildProcesses(&v8_natives_fd, + &v8_snapshot_fd)) { + v8_natives_fd_.reset(v8_natives_fd); + v8_snapshot_fd_.reset(v8_snapshot_fd); + } + } + DCHECK(v8_natives_fd_.get() != -1 && v8_snapshot_fd_.get() != -1); + mappings->Share(kV8NativesDataDescriptor, v8_natives_fd_.get()); + mappings->Share(kV8SnapshotDataDescriptor, v8_snapshot_fd_.get()); +#endif // V8_USE_EXTERNAL_STARTUP_DATA +} +#endif // OS_POSIX && !OS_MACOSX + content::DevToolsManagerDelegate* ShellContentBrowserClient::GetDevToolsManagerDelegate() { return new content::ShellDevToolsManagerDelegate(GetBrowserContext()); diff --git a/extensions/shell/browser/shell_content_browser_client.h b/extensions/shell/browser/shell_content_browser_client.h index 16e51ca..f9d813f 100644 --- a/extensions/shell/browser/shell_content_browser_client.h +++ b/extensions/shell/browser/shell_content_browser_client.h @@ -58,6 +58,13 @@ class ShellContentBrowserClient : public content::ContentBrowserClient { int plugin_process_id) override; void GetAdditionalAllowedSchemesForFileSystem( std::vector<std::string>* additional_schemes) override; +#if defined(OS_POSIX) && !defined(OS_MACOSX) + void GetAdditionalMappedFilesForChildProcess( + const base::CommandLine& command_line, + int child_process_id, + content::FileDescriptorInfo* mappings) override; +#endif + content::DevToolsManagerDelegate* GetDevToolsManagerDelegate() override; protected: @@ -73,6 +80,11 @@ class ShellContentBrowserClient : public content::ContentBrowserClient { // Returns the extension or app associated with |site_instance| or NULL. const Extension* GetExtension(content::SiteInstance* site_instance); +#if defined(OS_POSIX) && !defined(OS_MACOSX) + base::ScopedFD v8_natives_fd_; + base::ScopedFD v8_snapshot_fd_; +#endif + // Owned by content::BrowserMainLoop. ShellBrowserMainParts* browser_main_parts_; diff --git a/gin/v8_initializer.cc b/gin/v8_initializer.cc index 76f227d..67b5f88 100644 --- a/gin/v8_initializer.cc +++ b/gin/v8_initializer.cc @@ -24,15 +24,47 @@ namespace gin { namespace { -bool GenerateEntropy(unsigned char* buffer, size_t amount) { - base::RandBytes(buffer, amount); - return true; -} - base::MemoryMappedFile* g_mapped_natives = nullptr; base::MemoryMappedFile* g_mapped_snapshot = nullptr; #if defined(V8_USE_EXTERNAL_STARTUP_DATA) +#if !defined(OS_MACOSX) +const int kV8SnapshotBasePathKey = +#if defined(OS_ANDROID) + base::DIR_ANDROID_APP_DATA; +#elif defined(OS_POSIX) + base::DIR_EXE; +#elif defined(OS_WIN) + base::DIR_MODULE; +#endif // OS_ANDROID +#endif // !OS_MACOSX + +const char kNativesFileName[] = "natives_blob.bin"; +const char kSnapshotFileName[] = "snapshot_blob.bin"; + +void GetV8FilePaths(base::FilePath* natives_path_out, + base::FilePath* snapshot_path_out) { +#if !defined(OS_MACOSX) + base::FilePath data_path; + PathService::Get(kV8SnapshotBasePathKey, &data_path); + DCHECK(!data_path.empty()); + + *natives_path_out = data_path.AppendASCII(kNativesFileName); + *snapshot_path_out = data_path.AppendASCII(kSnapshotFileName); +#else // !defined(OS_MACOSX) + base::ScopedCFTypeRef<CFStringRef> natives_file_name( + base::SysUTF8ToCFStringRef(kNativesFileName)); + *natives_path_out = + base::mac::PathForFrameworkBundleResource(natives_file_name); + base::ScopedCFTypeRef<CFStringRef> snapshot_file_name( + base::SysUTF8ToCFStringRef(kSnapshotFileName)); + *snapshot_path_out = + base::mac::PathForFrameworkBundleResource(snapshot_file_name); + DCHECK(!natives_path_out->empty()); + DCHECK(!snapshot_path_out->empty()); +#endif // !defined(OS_MACOSX) +} + bool MapV8Files(base::File natives_file, base::File snapshot_file, base::MemoryMappedFile::Region natives_region = @@ -75,58 +107,32 @@ bool VerifyV8SnapshotFile(base::MemoryMappedFile* snapshot_file, #endif // V8_VERIFY_EXTERNAL_STARTUP_DATA #endif // V8_USE_EXTERNAL_STARTUP_DATA +bool GenerateEntropy(unsigned char* buffer, size_t amount) { + base::RandBytes(buffer, amount); + return true; +} + } // namespace #if defined(V8_USE_EXTERNAL_STARTUP_DATA) - #if defined(V8_VERIFY_EXTERNAL_STARTUP_DATA) // Defined in gen/gin/v8_snapshot_fingerprint.cc extern const unsigned char g_natives_fingerprint[]; extern const unsigned char g_snapshot_fingerprint[]; #endif // V8_VERIFY_EXTERNAL_STARTUP_DATA -#if !defined(OS_MACOSX) -const int V8Initializer::kV8SnapshotBasePathKey = -#if defined(OS_ANDROID) - base::DIR_ANDROID_APP_DATA; -#elif defined(OS_POSIX) - base::DIR_EXE; -#elif defined(OS_WIN) - base::DIR_MODULE; -#endif // OS_ANDROID -#endif // !OS_MACOSX - -const char V8Initializer::kNativesFileName[] = "natives_blob.bin"; -const char V8Initializer::kSnapshotFileName[] = "snapshot_blob.bin"; - // static bool V8Initializer::LoadV8Snapshot() { if (g_mapped_natives && g_mapped_snapshot) return true; -#if !defined(OS_MACOSX) - base::FilePath data_path; - PathService::Get(kV8SnapshotBasePathKey, &data_path); - DCHECK(!data_path.empty()); - - base::FilePath natives_path = data_path.AppendASCII(kNativesFileName); - base::FilePath snapshot_path = data_path.AppendASCII(kSnapshotFileName); -#else // !defined(OS_MACOSX) - base::ScopedCFTypeRef<CFStringRef> natives_file_name( - base::SysUTF8ToCFStringRef(kNativesFileName)); - base::FilePath natives_path = - base::mac::PathForFrameworkBundleResource(natives_file_name); - base::ScopedCFTypeRef<CFStringRef> snapshot_file_name( - base::SysUTF8ToCFStringRef(kSnapshotFileName)); - base::FilePath snapshot_path = - base::mac::PathForFrameworkBundleResource(snapshot_file_name); - DCHECK(!natives_path.empty()); - DCHECK(!snapshot_path.empty()); -#endif // !defined(OS_MACOSX) + base::FilePath natives_data_path; + base::FilePath snapshot_data_path; + GetV8FilePaths(&natives_data_path, &snapshot_data_path); int flags = base::File::FLAG_OPEN | base::File::FLAG_READ; - if (!MapV8Files(base::File(natives_path, flags), - base::File(snapshot_path, flags))) + if (!MapV8Files(base::File(natives_data_path, flags), + base::File(snapshot_data_path, flags))) return false; #if defined(V8_VERIFY_EXTERNAL_STARTUP_DATA) @@ -165,6 +171,26 @@ bool V8Initializer::LoadV8SnapshotFromFD(base::PlatformFile natives_pf, natives_region, snapshot_region); } +// static +bool V8Initializer::OpenV8FilesForChildProcesses( + base::PlatformFile* natives_fd_out, + base::PlatformFile* snapshot_fd_out) { + base::FilePath natives_data_path; + base::FilePath snapshot_data_path; + GetV8FilePaths(&natives_data_path, &snapshot_data_path); + + int file_flags = base::File::FLAG_OPEN | base::File::FLAG_READ; + base::File natives_data_file(natives_data_path, file_flags); + base::File snapshot_data_file(snapshot_data_path, file_flags); + + if (!natives_data_file.IsValid() || !snapshot_data_file.IsValid()) + return false; + + *natives_fd_out = natives_data_file.TakePlatformFile(); + *snapshot_fd_out = snapshot_data_file.TakePlatformFile(); + return true; +} + #endif // V8_USE_EXTERNAL_STARTUP_DATA // static diff --git a/gin/v8_initializer.h b/gin/v8_initializer.h index ad3ed6e..6c9c6c2 100644 --- a/gin/v8_initializer.h +++ b/gin/v8_initializer.h @@ -49,6 +49,12 @@ class GIN_EXPORT V8Initializer { // snapshot is already loaded, false otherwise. static bool LoadV8Snapshot(); + // Opens the V8 snapshot data files and returns open file descriptors to these + // files in |natives_fd_out| and |snapshot_fd_out|, which can be passed to + // child processes. + static bool OpenV8FilesForChildProcesses(base::PlatformFile* natives_fd_out, + base::PlatformFile* snapshot_fd_out); + #endif // V8_USE_EXTERNAL_STARTUP_DATA }; |