OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gin/v8_initializer.h" | 5 #include "gin/v8_initializer.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/files/file.h" | 8 #include "base/files/file.h" |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/files/memory_mapped_file.h" | 10 #include "base/files/memory_mapped_file.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/rand_util.h" | 12 #include "base/rand_util.h" |
13 #include "base/strings/sys_string_conversions.h" | 13 #include "base/strings/sys_string_conversions.h" |
14 #include "crypto/sha2.h" | 14 #include "crypto/sha2.h" |
15 | 15 |
16 #if defined(V8_USE_EXTERNAL_STARTUP_DATA) | 16 #if defined(V8_USE_EXTERNAL_STARTUP_DATA) |
17 #if defined(OS_MACOSX) | 17 #if defined(OS_MACOSX) |
18 #include "base/mac/foundation_util.h" | 18 #include "base/mac/foundation_util.h" |
19 #endif // OS_MACOSX | 19 #endif // OS_MACOSX |
20 #include "base/path_service.h" | 20 #include "base/path_service.h" |
21 #endif // V8_USE_EXTERNAL_STARTUP_DATA | 21 #endif // V8_USE_EXTERNAL_STARTUP_DATA |
22 | 22 |
23 namespace gin { | 23 namespace gin { |
24 | 24 |
25 namespace { | 25 namespace { |
26 | 26 |
27 bool GenerateEntropy(unsigned char* buffer, size_t amount) { | |
28 base::RandBytes(buffer, amount); | |
29 return true; | |
30 } | |
31 | |
32 base::MemoryMappedFile* g_mapped_natives = nullptr; | 27 base::MemoryMappedFile* g_mapped_natives = nullptr; |
33 base::MemoryMappedFile* g_mapped_snapshot = nullptr; | 28 base::MemoryMappedFile* g_mapped_snapshot = nullptr; |
34 | 29 |
35 #if defined(V8_USE_EXTERNAL_STARTUP_DATA) | 30 #if defined(V8_USE_EXTERNAL_STARTUP_DATA) |
| 31 #if !defined(OS_MACOSX) |
| 32 const int kV8SnapshotBasePathKey = |
| 33 #if defined(OS_ANDROID) |
| 34 base::DIR_ANDROID_APP_DATA; |
| 35 #elif defined(OS_POSIX) |
| 36 base::DIR_EXE; |
| 37 #elif defined(OS_WIN) |
| 38 base::DIR_MODULE; |
| 39 #endif // OS_ANDROID |
| 40 #endif // !OS_MACOSX |
| 41 |
| 42 const char kNativesFileName[] = "natives_blob.bin"; |
| 43 const char kSnapshotFileName[] = "snapshot_blob.bin"; |
| 44 |
| 45 void GetV8FilePaths(base::FilePath* natives_path_out, |
| 46 base::FilePath* snapshot_path_out) { |
| 47 #if !defined(OS_MACOSX) |
| 48 base::FilePath data_path; |
| 49 PathService::Get(kV8SnapshotBasePathKey, &data_path); |
| 50 DCHECK(!data_path.empty()); |
| 51 |
| 52 *natives_path_out = data_path.AppendASCII(kNativesFileName); |
| 53 *snapshot_path_out = data_path.AppendASCII(kSnapshotFileName); |
| 54 #else // !defined(OS_MACOSX) |
| 55 base::ScopedCFTypeRef<CFStringRef> natives_file_name( |
| 56 base::SysUTF8ToCFStringRef(kNativesFileName)); |
| 57 *natives_path_out = |
| 58 base::mac::PathForFrameworkBundleResource(natives_file_name); |
| 59 base::ScopedCFTypeRef<CFStringRef> snapshot_file_name( |
| 60 base::SysUTF8ToCFStringRef(kSnapshotFileName)); |
| 61 *snapshot_path_out = |
| 62 base::mac::PathForFrameworkBundleResource(snapshot_file_name); |
| 63 DCHECK(!natives_path_out->empty()); |
| 64 DCHECK(!snapshot_path_out->empty()); |
| 65 #endif // !defined(OS_MACOSX) |
| 66 } |
| 67 |
36 bool MapV8Files(base::File natives_file, | 68 bool MapV8Files(base::File natives_file, |
37 base::File snapshot_file, | 69 base::File snapshot_file, |
38 base::MemoryMappedFile::Region natives_region = | 70 base::MemoryMappedFile::Region natives_region = |
39 base::MemoryMappedFile::Region::kWholeFile, | 71 base::MemoryMappedFile::Region::kWholeFile, |
40 base::MemoryMappedFile::Region snapshot_region = | 72 base::MemoryMappedFile::Region snapshot_region = |
41 base::MemoryMappedFile::Region::kWholeFile) { | 73 base::MemoryMappedFile::Region::kWholeFile) { |
42 g_mapped_natives = new base::MemoryMappedFile; | 74 g_mapped_natives = new base::MemoryMappedFile; |
43 if (!g_mapped_natives->IsValid()) { | 75 if (!g_mapped_natives->IsValid()) { |
44 if (!g_mapped_natives->Initialize(natives_file.Pass(), natives_region)) { | 76 if (!g_mapped_natives->Initialize(natives_file.Pass(), natives_region)) { |
45 delete g_mapped_natives; | 77 delete g_mapped_natives; |
(...skipping 22 matching lines...) Expand all Loading... |
68 unsigned char output[crypto::kSHA256Length]; | 100 unsigned char output[crypto::kSHA256Length]; |
69 crypto::SHA256HashString( | 101 crypto::SHA256HashString( |
70 base::StringPiece(reinterpret_cast<const char*>(snapshot_file->data()), | 102 base::StringPiece(reinterpret_cast<const char*>(snapshot_file->data()), |
71 snapshot_file->length()), | 103 snapshot_file->length()), |
72 output, sizeof(output)); | 104 output, sizeof(output)); |
73 return !memcmp(fingerprint, output, sizeof(output)); | 105 return !memcmp(fingerprint, output, sizeof(output)); |
74 } | 106 } |
75 #endif // V8_VERIFY_EXTERNAL_STARTUP_DATA | 107 #endif // V8_VERIFY_EXTERNAL_STARTUP_DATA |
76 #endif // V8_USE_EXTERNAL_STARTUP_DATA | 108 #endif // V8_USE_EXTERNAL_STARTUP_DATA |
77 | 109 |
| 110 bool GenerateEntropy(unsigned char* buffer, size_t amount) { |
| 111 base::RandBytes(buffer, amount); |
| 112 return true; |
| 113 } |
| 114 |
78 } // namespace | 115 } // namespace |
79 | 116 |
80 #if defined(V8_USE_EXTERNAL_STARTUP_DATA) | 117 #if defined(V8_USE_EXTERNAL_STARTUP_DATA) |
81 | |
82 #if defined(V8_VERIFY_EXTERNAL_STARTUP_DATA) | 118 #if defined(V8_VERIFY_EXTERNAL_STARTUP_DATA) |
83 // Defined in gen/gin/v8_snapshot_fingerprint.cc | 119 // Defined in gen/gin/v8_snapshot_fingerprint.cc |
84 extern const unsigned char g_natives_fingerprint[]; | 120 extern const unsigned char g_natives_fingerprint[]; |
85 extern const unsigned char g_snapshot_fingerprint[]; | 121 extern const unsigned char g_snapshot_fingerprint[]; |
86 #endif // V8_VERIFY_EXTERNAL_STARTUP_DATA | 122 #endif // V8_VERIFY_EXTERNAL_STARTUP_DATA |
87 | 123 |
88 #if !defined(OS_MACOSX) | |
89 const int V8Initializer::kV8SnapshotBasePathKey = | |
90 #if defined(OS_ANDROID) | |
91 base::DIR_ANDROID_APP_DATA; | |
92 #elif defined(OS_POSIX) | |
93 base::DIR_EXE; | |
94 #elif defined(OS_WIN) | |
95 base::DIR_MODULE; | |
96 #endif // OS_ANDROID | |
97 #endif // !OS_MACOSX | |
98 | |
99 const char V8Initializer::kNativesFileName[] = "natives_blob.bin"; | |
100 const char V8Initializer::kSnapshotFileName[] = "snapshot_blob.bin"; | |
101 | |
102 // static | 124 // static |
103 bool V8Initializer::LoadV8Snapshot() { | 125 bool V8Initializer::LoadV8Snapshot() { |
104 if (g_mapped_natives && g_mapped_snapshot) | 126 if (g_mapped_natives && g_mapped_snapshot) |
105 return true; | 127 return true; |
106 | 128 |
107 #if !defined(OS_MACOSX) | 129 base::FilePath natives_data_path; |
108 base::FilePath data_path; | 130 base::FilePath snapshot_data_path; |
109 PathService::Get(kV8SnapshotBasePathKey, &data_path); | 131 GetV8FilePaths(&natives_data_path, &snapshot_data_path); |
110 DCHECK(!data_path.empty()); | |
111 | |
112 base::FilePath natives_path = data_path.AppendASCII(kNativesFileName); | |
113 base::FilePath snapshot_path = data_path.AppendASCII(kSnapshotFileName); | |
114 #else // !defined(OS_MACOSX) | |
115 base::ScopedCFTypeRef<CFStringRef> natives_file_name( | |
116 base::SysUTF8ToCFStringRef(kNativesFileName)); | |
117 base::FilePath natives_path = | |
118 base::mac::PathForFrameworkBundleResource(natives_file_name); | |
119 base::ScopedCFTypeRef<CFStringRef> snapshot_file_name( | |
120 base::SysUTF8ToCFStringRef(kSnapshotFileName)); | |
121 base::FilePath snapshot_path = | |
122 base::mac::PathForFrameworkBundleResource(snapshot_file_name); | |
123 DCHECK(!natives_path.empty()); | |
124 DCHECK(!snapshot_path.empty()); | |
125 #endif // !defined(OS_MACOSX) | |
126 | 132 |
127 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ; | 133 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ; |
128 if (!MapV8Files(base::File(natives_path, flags), | 134 if (!MapV8Files(base::File(natives_data_path, flags), |
129 base::File(snapshot_path, flags))) | 135 base::File(snapshot_data_path, flags))) |
130 return false; | 136 return false; |
131 | 137 |
132 #if defined(V8_VERIFY_EXTERNAL_STARTUP_DATA) | 138 #if defined(V8_VERIFY_EXTERNAL_STARTUP_DATA) |
133 return VerifyV8SnapshotFile(g_mapped_natives, g_natives_fingerprint) && | 139 return VerifyV8SnapshotFile(g_mapped_natives, g_natives_fingerprint) && |
134 VerifyV8SnapshotFile(g_mapped_snapshot, g_snapshot_fingerprint); | 140 VerifyV8SnapshotFile(g_mapped_snapshot, g_snapshot_fingerprint); |
135 #else | 141 #else |
136 return true; | 142 return true; |
137 #endif // V8_VERIFY_EXTERNAL_STARTUP_DATA | 143 #endif // V8_VERIFY_EXTERNAL_STARTUP_DATA |
138 } | 144 } |
139 | 145 |
(...skipping 18 matching lines...) Expand all Loading... |
158 base::MemoryMappedFile::Region::kWholeFile; | 164 base::MemoryMappedFile::Region::kWholeFile; |
159 if (natives_size != 0 || natives_offset != 0) { | 165 if (natives_size != 0 || natives_offset != 0) { |
160 snapshot_region = | 166 snapshot_region = |
161 base::MemoryMappedFile::Region(snapshot_offset, snapshot_size); | 167 base::MemoryMappedFile::Region(snapshot_offset, snapshot_size); |
162 } | 168 } |
163 | 169 |
164 return MapV8Files(base::File(natives_pf), base::File(snapshot_pf), | 170 return MapV8Files(base::File(natives_pf), base::File(snapshot_pf), |
165 natives_region, snapshot_region); | 171 natives_region, snapshot_region); |
166 } | 172 } |
167 | 173 |
| 174 // static |
| 175 bool V8Initializer::OpenV8FilesForChildProcesses( |
| 176 base::PlatformFile* natives_fd_out, |
| 177 base::PlatformFile* snapshot_fd_out) { |
| 178 base::FilePath natives_data_path; |
| 179 base::FilePath snapshot_data_path; |
| 180 GetV8FilePaths(&natives_data_path, &snapshot_data_path); |
| 181 |
| 182 int file_flags = base::File::FLAG_OPEN | base::File::FLAG_READ; |
| 183 base::File natives_data_file(natives_data_path, file_flags); |
| 184 base::File snapshot_data_file(snapshot_data_path, file_flags); |
| 185 |
| 186 if (!natives_data_file.IsValid() || !snapshot_data_file.IsValid()) |
| 187 return false; |
| 188 |
| 189 *natives_fd_out = natives_data_file.TakePlatformFile(); |
| 190 *snapshot_fd_out = snapshot_data_file.TakePlatformFile(); |
| 191 return true; |
| 192 } |
| 193 |
168 #endif // V8_USE_EXTERNAL_STARTUP_DATA | 194 #endif // V8_USE_EXTERNAL_STARTUP_DATA |
169 | 195 |
170 // static | 196 // static |
171 void V8Initializer::Initialize(gin::IsolateHolder::ScriptMode mode, | 197 void V8Initializer::Initialize(gin::IsolateHolder::ScriptMode mode, |
172 v8::ArrayBuffer::Allocator* allocator) { | 198 v8::ArrayBuffer::Allocator* allocator) { |
173 CHECK(allocator); | 199 CHECK(allocator); |
174 | 200 |
175 static bool v8_is_initialized = false; | 201 static bool v8_is_initialized = false; |
176 if (v8_is_initialized) | 202 if (v8_is_initialized) |
177 return; | 203 return; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 *natives_size_out = *snapshot_size_out = 0; | 238 *natives_size_out = *snapshot_size_out = 0; |
213 return; | 239 return; |
214 } | 240 } |
215 *natives_data_out = reinterpret_cast<const char*>(g_mapped_natives->data()); | 241 *natives_data_out = reinterpret_cast<const char*>(g_mapped_natives->data()); |
216 *snapshot_data_out = reinterpret_cast<const char*>(g_mapped_snapshot->data()); | 242 *snapshot_data_out = reinterpret_cast<const char*>(g_mapped_snapshot->data()); |
217 *natives_size_out = static_cast<int>(g_mapped_natives->length()); | 243 *natives_size_out = static_cast<int>(g_mapped_natives->length()); |
218 *snapshot_size_out = static_cast<int>(g_mapped_snapshot->length()); | 244 *snapshot_size_out = static_cast<int>(g_mapped_snapshot->length()); |
219 } | 245 } |
220 | 246 |
221 } // namespace gin | 247 } // namespace gin |
OLD | NEW |