Index: components/nacl/renderer/ppb_nacl_private_impl.cc |
diff --git a/components/nacl/renderer/ppb_nacl_private_impl.cc b/components/nacl/renderer/ppb_nacl_private_impl.cc |
index 2d6d1c77352505dd11e65ea3bbd95ea286233fb4..f3e8855989c90a91c1c693ad22d9238a6b7186b7 100644 |
--- a/components/nacl/renderer/ppb_nacl_private_impl.cc |
+++ b/components/nacl/renderer/ppb_nacl_private_impl.cc |
@@ -66,6 +66,9 @@ namespace { |
// The pseudo-architecture used to indicate portable native client. |
const char* const kPortableArch = "portable"; |
+// The base URL for resources used by the PNaCl translator processes. |
+const char* kPNaClTranslatorBaseUrl = "chrome://pnacl-translator/"; |
+ |
base::LazyInstance<scoped_refptr<PnaclTranslationResourceHost> > |
g_pnacl_resource_host = LAZY_INSTANCE_INITIALIZER; |
@@ -520,7 +523,30 @@ int32_t BrokerDuplicateHandle(PP_FileHandle source_handle, |
#endif |
} |
-PP_FileHandle GetReadonlyPnaclFD(const char* filename) { |
+// Convert a URL to a filename for GetReadonlyPnaclFd. |
+// Must be kept in sync with PnaclCanOpenFile() in |
+// components/nacl/browser/nacl_file_host.cc. |
+std::string PnaclComponentURLToFilename(const std::string& url) { |
+ // PNaCl component URLs aren't arbitrary URLs; they are always either |
+ // generated from ManifestResolveKey or PnaclResources::ReadResourceInfo. |
+ // So, it's safe to just use string parsing operations here instead of |
+ // URL-parsing ones. |
+ DCHECK(StartsWithASCII(url, kPNaClTranslatorBaseUrl, true)); |
+ std::string r = url.substr(std::string(kPNaClTranslatorBaseUrl).length()); |
+ |
+ // Use white-listed-chars. |
+ size_t replace_pos; |
+ static const char* white_list = "abcdefghijklmnopqrstuvwxyz0123456789_"; |
+ replace_pos = r.find_first_not_of(white_list); |
+ while(replace_pos != std::string::npos) { |
+ r = r.replace(replace_pos, 1, "_"); |
+ replace_pos = r.find_first_not_of(white_list); |
+ } |
+ return r; |
+} |
+ |
+PP_FileHandle GetReadonlyPnaclFd(const char* url) { |
+ std::string filename = PnaclComponentURLToFilename(url); |
IPC::PlatformFileForTransit out_fd = IPC::InvalidPlatformFileForTransit(); |
IPC::Sender* sender = content::RenderThread::Get(); |
DCHECK(sender); |
@@ -1075,7 +1101,7 @@ PP_Bool ManifestResolveKey(PP_Instance instance, |
} |
std::string key_basename = key_string.substr(kFilesPrefix.length()); |
std::string pnacl_url = |
- std::string("chrome://pnacl-translator/") + GetSandboxArch() + "/" + |
+ std::string(kPNaClTranslatorBaseUrl) + GetSandboxArch() + "/" + |
key_basename; |
*pp_full_url = ppapi::StringVar::StringToPPVar(pnacl_url); |
return PP_TRUE; |
@@ -1101,7 +1127,7 @@ PP_Bool GetPNaClResourceInfo(PP_Instance instance, |
if (!load_manager) |
return PP_FALSE; |
- base::PlatformFile file = GetReadonlyPnaclFD(filename); |
+ base::PlatformFile file = GetReadonlyPnaclFd(filename); |
if (file == base::kInvalidPlatformFileValue) { |
load_manager->ReportLoadError( |
PP_NACL_ERROR_PNACL_RESOURCE_FETCH, |
@@ -1418,6 +1444,30 @@ void DownloadFile(PP_Instance instance, |
return; |
} |
+ // Handle special PNaCl support files which are installed on the user's |
+ // machine. |
+ std::string url_string(url); |
+ if (url_string.find(kPNaClTranslatorBaseUrl, 0) == 0) { |
+ PP_FileHandle handle = GetReadonlyPnaclFd(url); |
+ if (handle == PP_kInvalidFileHandle) { |
+ ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( |
+ FROM_HERE, |
+ base::Bind(callback.func, callback.user_data, |
+ static_cast<int32_t>(PP_ERROR_FAILED))); |
+ return; |
+ } |
+ // TODO(ncbray): enable the fast loading and validation paths for this type |
+ // of file. |
+ file_info->handle = handle; |
+ file_info->token_lo = 0; |
+ file_info->token_hi = 0; |
+ ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( |
+ FROM_HERE, |
+ base::Bind(callback.func, callback.user_data, |
+ static_cast<int32_t>(PP_OK))); |
+ return; |
+ } |
+ |
// We have to ensure that this url resolves relative to the plugin base url |
// before downloading it. |
const GURL& test_gurl = load_manager->plugin_base_url().Resolve(url); |
@@ -1484,7 +1534,7 @@ const PPB_NaCl_Private nacl_interface = { |
&UrandomFD, |
&Are3DInterfacesDisabled, |
&BrokerDuplicateHandle, |
- &GetReadonlyPnaclFD, |
+ &GetReadonlyPnaclFd, |
&CreateTemporaryFile, |
&GetNumberOfProcessors, |
&PPIsNonSFIModeEnabled, |