Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(311)

Unified Diff: components/nacl/renderer/ppb_nacl_private_impl.cc

Issue 302093012: Pepper: Refactor OpenManifestEntry. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | ppapi/api/private/ppb_nacl_private.idl » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 f3e8855989c90a91c1c693ad22d9238a6b7186b7..0aca3a17193a449bb57c8c38b917630f34b5a9f1 100644
--- a/components/nacl/renderer/ppb_nacl_private_impl.cc
+++ b/components/nacl/renderer/ppb_nacl_private_impl.cc
@@ -1080,15 +1080,23 @@ PP_Bool ManifestGetProgramURL(PP_Instance instance,
return PP_FALSE;
}
-PP_Bool ManifestResolveKey(PP_Instance instance,
- PP_Bool is_helper_process,
- const char* key,
- PP_Var* pp_full_url,
- PP_PNaClOptions* pnacl_options) {
+// TODO(teravest): Refactor DownloadFile/DownloadNexe out to their own file;
+// this one is getting way too messy.
+void DownloadFile(PP_Instance instance,
+ const std::string& url,
+ struct PP_NaClFileInfo* file_info,
+ struct PP_CompletionCallback callback);
+
+void OpenManifestEntry(PP_Instance instance,
+ PP_Bool is_helper_process,
+ const char* key,
+ PP_NaClFileInfo* out_file_info,
+ PP_CompletionCallback callback) {
+ std::string resolved_url;
+
// For "helper" processes (llc and ld), we resolve keys manually as there is
// no existing .nmf file to parse.
if (PP_ToBool(is_helper_process)) {
- pnacl_options->translate = PP_FALSE;
// We can only resolve keys in the files/ namespace.
const std::string kFilesPrefix = "files/";
std::string key_string(key);
@@ -1097,25 +1105,41 @@ PP_Bool ManifestResolveKey(PP_Instance instance,
if (load_manager)
load_manager->ReportLoadError(PP_NACL_ERROR_MANIFEST_RESOLVE_URL,
"key did not start with files/");
- return PP_FALSE;
+ ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask(
+ FROM_HERE,
+ base::Bind(callback.func, callback.user_data,
+ static_cast<int32_t>(PP_ERROR_FAILED)));
+ return;
}
std::string key_basename = key_string.substr(kFilesPrefix.length());
- std::string pnacl_url =
+ resolved_url =
std::string(kPNaClTranslatorBaseUrl) + GetSandboxArch() + "/" +
key_basename;
- *pp_full_url = ppapi::StringVar::StringToPPVar(pnacl_url);
- return PP_TRUE;
- }
+ } else {
+ JsonManifestMap::iterator it = g_manifest_map.Get().find(instance);
+ if (it == g_manifest_map.Get().end()) {
+ ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask(
+ FROM_HERE,
+ base::Bind(callback.func, callback.user_data,
+ static_cast<int32_t>(PP_ERROR_FAILED)));
+ return;
+ }
- JsonManifestMap::iterator it = g_manifest_map.Get().find(instance);
- if (it == g_manifest_map.Get().end())
- return PP_FALSE;
+ PP_PNaClOptions pnacl_options;
+ bool ok = it->second->ResolveKey(key, &resolved_url, &pnacl_options);
+ // We don't support OpenManifestEntry for files that require PNaCl
+ // translation.
+ if (!ok || pnacl_options.translate) {
+ ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask(
+ FROM_HERE,
+ base::Bind(callback.func, callback.user_data,
+ static_cast<int32_t>(PP_ERROR_FAILED)));
+ return;
+ }
+ }
- std::string full_url;
- bool ok = it->second->ResolveKey(key, &full_url, pnacl_options);
- if (ok)
- *pp_full_url = ppapi::StringVar::StringToPPVar(full_url);
- return PP_FromBool(ok);
+ // Hand off to DownloadFile to perform fetching the actual file.
+ DownloadFile(instance, resolved_url, out_file_info, callback);
}
PP_Bool GetPNaClResourceInfo(PP_Instance instance,
@@ -1428,10 +1452,9 @@ void DownloadFileCompletion(base::PlatformFile file,
}
void DownloadFile(PP_Instance instance,
- const char* url,
+ const std::string& url,
struct PP_NaClFileInfo* file_info,
struct PP_CompletionCallback callback) {
- CHECK(url);
CHECK(file_info);
NexeLoadManager* load_manager = GetNexeLoadManager(instance);
@@ -1446,9 +1469,8 @@ void DownloadFile(PP_Instance instance,
// 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 (url.find(kPNaClTranslatorBaseUrl, 0) == 0) {
+ PP_FileHandle handle = GetReadonlyPnaclFd(url.c_str());
if (handle == PP_kInvalidFileHandle) {
ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask(
FROM_HERE,
@@ -1483,7 +1505,7 @@ void DownloadFile(PP_Instance instance,
uint64_t file_token_lo = 0;
uint64_t file_token_hi = 0;
PP_FileHandle file_handle = OpenNaClExecutable(instance,
- url,
+ url.c_str(),
&file_token_lo,
&file_token_hi);
if (file_handle != PP_kInvalidFileHandle) {
@@ -1563,12 +1585,11 @@ const PPB_NaCl_Private nacl_interface = {
&GetManifestURLArgument,
&DevInterfacesEnabled,
&ManifestGetProgramURL,
- &ManifestResolveKey,
+ &OpenManifestEntry,
&GetPNaClResourceInfo,
&GetCpuFeatureAttrs,
&PostMessageToJavaScript,
&DownloadNexe,
- &DownloadFile
};
} // namespace
« no previous file with comments | « no previous file | ppapi/api/private/ppb_nacl_private.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698