| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/renderer/pepper/ppb_nacl_private_impl.h" | 5 #include "chrome/renderer/pepper/ppb_nacl_private_impl.h" |
| 6 | 6 |
| 7 #ifndef DISABLE_NACL | 7 #ifndef DISABLE_NACL |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 #include "third_party/WebKit/public/web/WebFrame.h" | 34 #include "third_party/WebKit/public/web/WebFrame.h" |
| 35 #include "third_party/WebKit/public/web/WebPluginContainer.h" | 35 #include "third_party/WebKit/public/web/WebPluginContainer.h" |
| 36 #include "third_party/WebKit/public/web/WebView.h" | 36 #include "third_party/WebKit/public/web/WebView.h" |
| 37 | 37 |
| 38 namespace { | 38 namespace { |
| 39 | 39 |
| 40 base::LazyInstance<scoped_refptr<PnaclTranslationResourceHost> > | 40 base::LazyInstance<scoped_refptr<PnaclTranslationResourceHost> > |
| 41 g_pnacl_resource_host = LAZY_INSTANCE_INITIALIZER; | 41 g_pnacl_resource_host = LAZY_INSTANCE_INITIALIZER; |
| 42 | 42 |
| 43 static bool InitializePnaclResourceHost() { | 43 static bool InitializePnaclResourceHost() { |
| 44 // Must run on the main thread. |
| 45 content::RenderThread* render_thread = content::RenderThread::Get(); |
| 46 if (!render_thread) |
| 47 return false; |
| 44 if (!g_pnacl_resource_host.Get()) { | 48 if (!g_pnacl_resource_host.Get()) { |
| 45 content::RenderThread* render_thread = content::RenderThread::Get(); | |
| 46 if (!render_thread) | |
| 47 return false; | |
| 48 g_pnacl_resource_host.Get() = new PnaclTranslationResourceHost( | 49 g_pnacl_resource_host.Get() = new PnaclTranslationResourceHost( |
| 49 render_thread->GetIOMessageLoopProxy()); | 50 render_thread->GetIOMessageLoopProxy()); |
| 50 render_thread->AddFilter(g_pnacl_resource_host.Get()); | 51 render_thread->AddFilter(g_pnacl_resource_host.Get()); |
| 51 } | 52 } |
| 52 return true; | 53 return true; |
| 53 } | 54 } |
| 54 | 55 |
| 55 struct InstanceInfo { | 56 struct InstanceInfo { |
| 56 InstanceInfo() : plugin_pid(base::kNullProcessId), plugin_child_id(0) {} | 57 InstanceInfo() : plugin_pid(base::kNullProcessId), plugin_child_id(0) {} |
| 57 GURL url; | 58 GURL url; |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 uint32_t options) { | 195 uint32_t options) { |
| 195 #if defined(OS_WIN) | 196 #if defined(OS_WIN) |
| 196 return content::BrokerDuplicateHandle(source_handle, process_id, | 197 return content::BrokerDuplicateHandle(source_handle, process_id, |
| 197 target_handle, desired_access, | 198 target_handle, desired_access, |
| 198 options); | 199 options); |
| 199 #else | 200 #else |
| 200 return 0; | 201 return 0; |
| 201 #endif | 202 #endif |
| 202 } | 203 } |
| 203 | 204 |
| 205 int32_t EnsurePnaclInstalled(PP_Instance instance, |
| 206 PP_CompletionCallback callback) { |
| 207 ppapi::thunk::EnterInstance enter(instance, callback); |
| 208 if (enter.failed()) |
| 209 return enter.retval(); |
| 210 if (!InitializePnaclResourceHost()) |
| 211 return enter.SetResult(PP_ERROR_FAILED); |
| 212 g_pnacl_resource_host.Get()->EnsurePnaclInstalled( |
| 213 instance, |
| 214 enter.callback()); |
| 215 return enter.SetResult(PP_OK_COMPLETIONPENDING); |
| 216 } |
| 217 |
| 204 PP_FileHandle GetReadonlyPnaclFD(const char* filename) { | 218 PP_FileHandle GetReadonlyPnaclFD(const char* filename) { |
| 205 IPC::PlatformFileForTransit out_fd = IPC::InvalidPlatformFileForTransit(); | 219 IPC::PlatformFileForTransit out_fd = IPC::InvalidPlatformFileForTransit(); |
| 206 IPC::Sender* sender = content::RenderThread::Get(); | 220 IPC::Sender* sender = content::RenderThread::Get(); |
| 207 DCHECK(sender); | 221 DCHECK(sender); |
| 208 if (!sender->Send(new NaClHostMsg_GetReadonlyPnaclFD( | 222 if (!sender->Send(new NaClHostMsg_GetReadonlyPnaclFD( |
| 209 std::string(filename), | 223 std::string(filename), |
| 210 &out_fd))) { | 224 &out_fd))) { |
| 211 return base::kInvalidPlatformFileValue; | 225 return base::kInvalidPlatformFileValue; |
| 212 } | 226 } |
| 213 | |
| 214 if (out_fd == IPC::InvalidPlatformFileForTransit()) { | 227 if (out_fd == IPC::InvalidPlatformFileForTransit()) { |
| 215 return base::kInvalidPlatformFileValue; | 228 return base::kInvalidPlatformFileValue; |
| 216 } | 229 } |
| 217 | |
| 218 base::PlatformFile handle = | 230 base::PlatformFile handle = |
| 219 IPC::PlatformFileForTransitToPlatformFile(out_fd); | 231 IPC::PlatformFileForTransitToPlatformFile(out_fd); |
| 220 return handle; | 232 return handle; |
| 221 } | 233 } |
| 222 | 234 |
| 223 PP_FileHandle CreateTemporaryFile(PP_Instance instance) { | 235 PP_FileHandle CreateTemporaryFile(PP_Instance instance) { |
| 224 IPC::PlatformFileForTransit transit_fd = IPC::InvalidPlatformFileForTransit(); | 236 IPC::PlatformFileForTransit transit_fd = IPC::InvalidPlatformFileForTransit(); |
| 225 IPC::Sender* sender = content::RenderThread::Get(); | 237 IPC::Sender* sender = content::RenderThread::Get(); |
| 226 DCHECK(sender); | 238 DCHECK(sender); |
| 227 if (!sender->Send(new NaClHostMsg_NaClCreateTemporaryFile( | 239 if (!sender->Send(new NaClHostMsg_NaClCreateTemporaryFile( |
| (...skipping 20 matching lines...) Expand all Loading... |
| 248 PP_FileHandle* handle, | 260 PP_FileHandle* handle, |
| 249 struct PP_CompletionCallback callback) { | 261 struct PP_CompletionCallback callback) { |
| 250 ppapi::thunk::EnterInstance enter(instance, callback); | 262 ppapi::thunk::EnterInstance enter(instance, callback); |
| 251 if (enter.failed()) | 263 if (enter.failed()) |
| 252 return enter.retval(); | 264 return enter.retval(); |
| 253 if (!pexe_url || !last_modified || !etag || !is_hit || !handle) | 265 if (!pexe_url || !last_modified || !etag || !is_hit || !handle) |
| 254 return enter.SetResult(PP_ERROR_BADARGUMENT); | 266 return enter.SetResult(PP_ERROR_BADARGUMENT); |
| 255 if (!InitializePnaclResourceHost()) | 267 if (!InitializePnaclResourceHost()) |
| 256 return enter.SetResult(PP_ERROR_FAILED); | 268 return enter.SetResult(PP_ERROR_FAILED); |
| 257 | 269 |
| 258 IPC::Sender* sender = content::RenderThread::Get(); | |
| 259 DCHECK(sender); | |
| 260 base::Time last_modified_time; | 270 base::Time last_modified_time; |
| 261 // If FromString fails, it doesn't touch last_modified_time and we just send | 271 // If FromString fails, it doesn't touch last_modified_time and we just send |
| 262 // the default-constructed null value. | 272 // the default-constructed null value. |
| 263 base::Time::FromString(last_modified, &last_modified_time); | 273 base::Time::FromString(last_modified, &last_modified_time); |
| 264 | 274 |
| 265 nacl::PnaclCacheInfo cache_info; | 275 nacl::PnaclCacheInfo cache_info; |
| 266 cache_info.pexe_url = GURL(pexe_url); | 276 cache_info.pexe_url = GURL(pexe_url); |
| 267 cache_info.abi_version = abi_version; | 277 cache_info.abi_version = abi_version; |
| 268 cache_info.opt_level = opt_level; | 278 cache_info.opt_level = opt_level; |
| 269 cache_info.last_modified = last_modified_time; | 279 cache_info.last_modified = last_modified_time; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 IPC::PlatformFileForTransitToPlatformFile(out_fd); | 349 IPC::PlatformFileForTransitToPlatformFile(out_fd); |
| 340 return handle; | 350 return handle; |
| 341 } | 351 } |
| 342 | 352 |
| 343 const PPB_NaCl_Private nacl_interface = { | 353 const PPB_NaCl_Private nacl_interface = { |
| 344 &LaunchSelLdr, | 354 &LaunchSelLdr, |
| 345 &StartPpapiProxy, | 355 &StartPpapiProxy, |
| 346 &UrandomFD, | 356 &UrandomFD, |
| 347 &Are3DInterfacesDisabled, | 357 &Are3DInterfacesDisabled, |
| 348 &BrokerDuplicateHandle, | 358 &BrokerDuplicateHandle, |
| 359 &EnsurePnaclInstalled, |
| 349 &GetReadonlyPnaclFD, | 360 &GetReadonlyPnaclFD, |
| 350 &CreateTemporaryFile, | 361 &CreateTemporaryFile, |
| 351 &GetNexeFd, | 362 &GetNexeFd, |
| 352 &ReportTranslationFinished, | 363 &ReportTranslationFinished, |
| 353 &IsOffTheRecord, | 364 &IsOffTheRecord, |
| 354 &IsPnaclEnabled, | 365 &IsPnaclEnabled, |
| 355 &ReportNaClError, | 366 &ReportNaClError, |
| 356 &OpenNaClExecutable | 367 &OpenNaClExecutable |
| 357 }; | 368 }; |
| 358 | 369 |
| 359 } // namespace | 370 } // namespace |
| 360 | 371 |
| 361 const PPB_NaCl_Private* PPB_NaCl_Private_Impl::GetInterface() { | 372 const PPB_NaCl_Private* PPB_NaCl_Private_Impl::GetInterface() { |
| 362 return &nacl_interface; | 373 return &nacl_interface; |
| 363 } | 374 } |
| 364 | 375 |
| 365 #endif // DISABLE_NACL | 376 #endif // DISABLE_NACL |
| OLD | NEW |