Chromium Code Reviews| 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 "ppapi/native_client/src/trusted/plugin/pnacl_resources.h" | 5 #include "ppapi/native_client/src/trusted/plugin/pnacl_resources.h" |
| 6 | 6 |
| 7 #include "native_client/src/include/portability_io.h" | 7 #include "native_client/src/include/portability_io.h" |
| 8 #include "native_client/src/shared/platform/nacl_check.h" | 8 #include "native_client/src/shared/platform/nacl_check.h" |
| 9 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h" | 9 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h" |
| 10 #include "ppapi/c/pp_errors.h" | 10 #include "ppapi/c/pp_errors.h" |
| 11 #include "ppapi/native_client/src/trusted/plugin/plugin.h" | 11 #include "ppapi/native_client/src/trusted/plugin/plugin.h" |
| 12 #include "ppapi/native_client/src/trusted/plugin/pnacl_coordinator.h" | 12 #include "ppapi/native_client/src/trusted/plugin/pnacl_coordinator.h" |
| 13 #include "ppapi/native_client/src/trusted/plugin/utility.h" | 13 #include "ppapi/native_client/src/trusted/plugin/utility.h" |
| 14 #include "third_party/jsoncpp/source/include/json/reader.h" | 14 #include "third_party/jsoncpp/source/include/json/reader.h" |
| 15 #include "third_party/jsoncpp/source/include/json/value.h" | 15 #include "third_party/jsoncpp/source/include/json/value.h" |
| 16 | 16 |
| 17 namespace plugin { | 17 namespace plugin { |
| 18 | 18 |
| 19 namespace { | |
| 20 | |
| 21 nacl::string GetFullUrl(const nacl::string& partial_url) { | |
| 22 return PnaclUrls::GetBaseUrl() + GetNaClInterface()->GetSandboxArch() + "/" + | |
| 23 partial_url; | |
| 24 } | |
| 25 | |
| 26 } // namespace | |
| 27 | |
| 19 static const char kPnaclBaseUrl[] = "chrome://pnacl-translator/"; | 28 static const char kPnaclBaseUrl[] = "chrome://pnacl-translator/"; |
| 20 | 29 |
| 21 nacl::string PnaclUrls::GetBaseUrl() { | 30 nacl::string PnaclUrls::GetBaseUrl() { |
| 22 return nacl::string(kPnaclBaseUrl); | 31 return nacl::string(kPnaclBaseUrl); |
| 23 } | 32 } |
| 24 | 33 |
| 25 // Determine if a URL is for a pnacl-component file, or if it is some other | 34 // Determine if a URL is for a pnacl-component file, or if it is some other |
| 26 // type of URL (e.g., http://, https://, chrome-extension://). | 35 // type of URL (e.g., http://, https://, chrome-extension://). |
| 27 // The URL could be one of the other variants for shared libraries | 36 // The URL could be one of the other variants for shared libraries |
| 28 // served from the web. | 37 // served from the web. |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 48 return r; | 57 return r; |
| 49 } | 58 } |
| 50 | 59 |
| 51 nacl::string PnaclUrls::GetResourceInfoUrl() { | 60 nacl::string PnaclUrls::GetResourceInfoUrl() { |
| 52 return "pnacl.json"; | 61 return "pnacl.json"; |
| 53 } | 62 } |
| 54 | 63 |
| 55 ////////////////////////////////////////////////////////////////////// | 64 ////////////////////////////////////////////////////////////////////// |
| 56 | 65 |
| 57 PnaclResources::~PnaclResources() { | 66 PnaclResources::~PnaclResources() { |
| 58 for (std::map<nacl::string, nacl::DescWrapper*>::iterator | 67 if (llc_file_handle_ != PP_kInvalidFileHandle) |
| 59 i = resource_wrappers_.begin(), e = resource_wrappers_.end(); | 68 CloseFileHandle(llc_file_handle_); |
| 60 i != e; | 69 if (ld_file_handle_ != PP_kInvalidFileHandle) |
| 61 ++i) { | 70 CloseFileHandle(ld_file_handle_); |
| 62 delete i->second; | |
| 63 } | |
| 64 resource_wrappers_.clear(); | |
| 65 } | |
| 66 | |
| 67 // static | |
| 68 int32_t PnaclResources::GetPnaclFD(Plugin* plugin, const char* filename) { | |
| 69 PP_FileHandle file_handle = | |
| 70 plugin->nacl_interface()->GetReadonlyPnaclFd(filename); | |
| 71 if (file_handle == PP_kInvalidFileHandle) | |
| 72 return -1; | |
| 73 | |
| 74 #if NACL_WINDOWS | |
| 75 //////// Now try the posix view. | |
| 76 int32_t posix_desc = _open_osfhandle(reinterpret_cast<intptr_t>(file_handle), | |
| 77 _O_RDONLY | _O_BINARY); | |
| 78 if (posix_desc == -1) { | |
| 79 PLUGIN_PRINTF(( | |
| 80 "PnaclResources::GetPnaclFD failed to convert HANDLE to posix\n")); | |
| 81 // Close the Windows HANDLE if it can't be converted. | |
| 82 CloseHandle(file_handle); | |
| 83 } | |
| 84 return posix_desc; | |
| 85 #else | |
| 86 return file_handle; | |
| 87 #endif | |
| 88 } | |
| 89 | |
| 90 nacl::DescWrapper* PnaclResources::WrapperForUrl(const nacl::string& url) { | |
| 91 CHECK(resource_wrappers_.find(url) != resource_wrappers_.end()); | |
| 92 return resource_wrappers_[url]; | |
| 93 } | 71 } |
| 94 | 72 |
| 95 void PnaclResources::ReadResourceInfo( | 73 void PnaclResources::ReadResourceInfo( |
| 96 const nacl::string& resource_info_url, | 74 const nacl::string& resource_info_url, |
| 97 const pp::CompletionCallback& resource_info_read_cb) { | 75 const pp::CompletionCallback& resource_info_read_cb) { |
| 98 PLUGIN_PRINTF(("PnaclResources::ReadResourceInfo\n")); | 76 PLUGIN_PRINTF(("PnaclResources::ReadResourceInfo\n")); |
| 99 | 77 |
| 100 nacl::string full_url = PnaclUrls::GetBaseUrl() + resource_info_url; | 78 nacl::string full_url = PnaclUrls::GetBaseUrl() + resource_info_url; |
| 101 PLUGIN_PRINTF(("Resolved resources info url: %s\n", full_url.c_str())); | 79 PLUGIN_PRINTF(("Resolved resources info url: %s\n", full_url.c_str())); |
| 102 nacl::string resource_info_filename = | 80 nacl::string resource_info_filename = |
| 103 PnaclUrls::PnaclComponentURLToFilename(full_url); | 81 PnaclUrls::PnaclComponentURLToFilename(full_url); |
| 104 | 82 |
| 105 PLUGIN_PRINTF(("Pnacl-converted resources info url: %s\n", | 83 PLUGIN_PRINTF(("Pnacl-converted resources info url: %s\n", |
| 106 resource_info_filename.c_str())); | 84 resource_info_filename.c_str())); |
| 107 | 85 |
| 108 PP_Var pp_llc_tool_name_var; | 86 PP_Var pp_llc_tool_name_var; |
| 109 PP_Var pp_ld_tool_name_var; | 87 PP_Var pp_ld_tool_name_var; |
| 110 if (!plugin_->nacl_interface()->GetPnaclResourceInfo( | 88 if (!plugin_->nacl_interface()->GetPnaclResourceInfo( |
| 111 plugin_->pp_instance(), | 89 plugin_->pp_instance(), |
| 112 resource_info_filename.c_str(), | 90 resource_info_filename.c_str(), |
| 113 &pp_llc_tool_name_var, | 91 &pp_llc_tool_name_var, |
| 114 &pp_ld_tool_name_var)) { | 92 &pp_ld_tool_name_var)) { |
| 115 coordinator_->ExitWithError(); | 93 coordinator_->ExitWithError(); |
| 116 } | 94 } |
| 117 | 95 |
| 118 pp::Var llc_tool_name(pp::PASS_REF, pp_llc_tool_name_var); | 96 pp::Var llc_tool_name(pp::PASS_REF, pp_llc_tool_name_var); |
| 119 pp::Var ld_tool_name(pp::PASS_REF, pp_ld_tool_name_var); | 97 pp::Var ld_tool_name(pp::PASS_REF, pp_ld_tool_name_var); |
| 120 llc_tool_name_ = llc_tool_name.AsString(); | 98 llc_tool_name_ = GetFullUrl(llc_tool_name.AsString()); |
| 121 ld_tool_name_ = ld_tool_name.AsString(); | 99 ld_tool_name_ = GetFullUrl(ld_tool_name.AsString()); |
| 122 pp::Core* core = pp::Module::Get()->core(); | 100 pp::Module::Get()->core()->CallOnMainThread(0, resource_info_read_cb, PP_OK); |
| 123 core->CallOnMainThread(0, resource_info_read_cb, PP_OK); | |
| 124 } | 101 } |
| 125 | 102 |
| 126 nacl::string PnaclResources::GetFullUrl( | 103 PP_FileHandle PnaclResources::TakeLlcFileHandle() { |
| 127 const nacl::string& partial_url, const nacl::string& sandbox_arch) const { | 104 PP_FileHandle to_return = llc_file_handle_; |
| 128 return PnaclUrls::GetBaseUrl() + sandbox_arch + "/" + partial_url; | 105 llc_file_handle_ = PP_kInvalidFileHandle; |
| 106 return to_return; | |
| 107 } | |
| 108 | |
| 109 PP_FileHandle PnaclResources::TakeLdFileHandle() { | |
| 110 PP_FileHandle to_return = ld_file_handle_; | |
| 111 ld_file_handle_ = PP_kInvalidFileHandle; | |
| 112 return to_return; | |
| 129 } | 113 } |
| 130 | 114 |
| 131 void PnaclResources::StartLoad( | 115 void PnaclResources::StartLoad( |
| 132 const pp::CompletionCallback& all_loaded_callback) { | 116 const pp::CompletionCallback& all_loaded_callback) { |
| 133 PLUGIN_PRINTF(("PnaclResources::StartLoad\n")); | 117 PLUGIN_PRINTF(("PnaclResources::StartLoad\n")); |
| 134 | 118 |
| 135 std::vector<nacl::string> resource_urls; | 119 // Do a blocking load of each of the resources. |
| 136 resource_urls.push_back(llc_tool_name_); | 120 nacl::string llc_filename = |
| 137 resource_urls.push_back(ld_tool_name_); | 121 PnaclUrls::PnaclComponentURLToFilename(llc_tool_name_); |
| 122 llc_file_handle_ = | |
| 123 plugin_->nacl_interface()->GetReadonlyPnaclFd(llc_filename.c_str()); | |
| 138 | 124 |
| 139 PLUGIN_PRINTF(("PnaclResources::StartLoad -- local install of PNaCl.\n")); | 125 nacl::string ld_filename = |
| 140 // Do a blocking load of each of the resources. | 126 PnaclUrls::PnaclComponentURLToFilename(ld_tool_name_); |
| 127 ld_file_handle_ = | |
| 128 plugin_->nacl_interface()->GetReadonlyPnaclFd(ld_filename.c_str()); | |
| 129 | |
| 141 int32_t result = PP_OK; | 130 int32_t result = PP_OK; |
| 142 for (size_t i = 0; i < resource_urls.size(); ++i) { | 131 if (llc_file_handle_ == PP_kInvalidFileHandle || |
| 143 nacl::string full_url = GetFullUrl( | 132 ld_file_handle_ == PP_kInvalidFileHandle) { |
| 144 resource_urls[i], plugin_->nacl_interface()->GetSandboxArch()); | 133 // File-open failed. Assume this means that the file is |
| 145 nacl::string filename = PnaclUrls::PnaclComponentURLToFilename(full_url); | 134 // not actually installed. This shouldn't actually occur since |
| 146 | 135 // ReadResourceInfo() should happen first, and error out. |
|
bbudge
2014/05/21 02:04:24
s/happen first, and error out/fail first ?
| |
| 147 int32_t fd = PnaclResources::GetPnaclFD(plugin_, filename.c_str()); | 136 coordinator_->ReportNonPpapiError( |
| 148 if (fd < 0) { | 137 PP_NACL_ERROR_PNACL_RESOURCE_FETCH, |
| 149 // File-open failed. Assume this means that the file is | 138 nacl::string("The Portable Native Client (pnacl) component is not " |
| 150 // not actually installed. This shouldn't actually occur since | 139 "installed. Please consult chrome://components for more " |
| 151 // ReadResourceInfo() should happen first, and error out. | 140 "information.")); |
| 152 coordinator_->ReportNonPpapiError( | 141 result = PP_ERROR_FILENOTFOUND; |
| 153 PP_NACL_ERROR_PNACL_RESOURCE_FETCH, | |
| 154 nacl::string("The Portable Native Client (pnacl) component is not " | |
| 155 "installed. Please consult chrome://components for more " | |
| 156 "information.")); | |
| 157 result = PP_ERROR_FILENOTFOUND; | |
| 158 break; | |
| 159 } else { | |
| 160 resource_wrappers_[resource_urls[i]] = | |
| 161 plugin_->wrapper_factory()->MakeFileDesc(fd, O_RDONLY); | |
| 162 } | |
| 163 } | 142 } |
| 164 // We're done! Queue the callback. | 143 pp::Module::Get()->core()->CallOnMainThread(0, all_loaded_callback, result); |
| 165 pp::Core* core = pp::Module::Get()->core(); | |
| 166 core->CallOnMainThread(0, all_loaded_callback, result); | |
| 167 } | 144 } |
| 168 | 145 |
| 169 } // namespace plugin | 146 } // namespace plugin |
| OLD | NEW |