| Index: components/nacl/loader/nacl_listener.cc
|
| diff --git a/components/nacl/loader/nacl_listener.cc b/components/nacl/loader/nacl_listener.cc
|
| index b75f4b3d9b4360d47d09205ec6951ab132895ffc..d4c8ea18340c7652cc66241919e9ab2f672839a9 100644
|
| --- a/components/nacl/loader/nacl_listener.cc
|
| +++ b/components/nacl/loader/nacl_listener.cc
|
| @@ -271,6 +271,34 @@ bool NaClListener::OnMessageReceived(const IPC::Message& msg) {
|
| return handled;
|
| }
|
|
|
| +bool NaClListener::OnOpenResource(
|
| + const IPC::Message& msg,
|
| + const std::string& key,
|
| + NaClIPCAdapter::OpenResourceReplyCallback cb) {
|
| + DCHECK(!cb.is_null());
|
| + std::map<std::string, std::pair<
|
| + IPC::PlatformFileForTransit, base::FilePath> >::iterator it;
|
| +
|
| + const std::string files_prefix = "files/";
|
| + if (key.find(files_prefix) == 0)
|
| + it = resource_files_.find(key.substr(files_prefix.length()));
|
| + else
|
| + it = resource_files_.find(key);
|
| +
|
| + if (it != resource_files_.end()) {
|
| + IPC::PlatformFileForTransit file = it->second.first;
|
| + base::FilePath path = it->second.second;
|
| + resource_files_.erase(it);
|
| + // A pre-opened resource descriptor is available. Run the reply callback
|
| + // and return true.
|
| + cb.Run(msg, file, path);
|
| + return true;
|
| + }
|
| +
|
| + // Return false to let the IPC adapter issue an IPC to the renderer.
|
| + return false;
|
| +}
|
| +
|
| void NaClListener::OnStart(const nacl::NaClStartParams& params) {
|
| #if defined(OS_LINUX) || defined(OS_MACOSX)
|
| int urandom_fd = dup(base::GetUrandomFD());
|
| @@ -298,6 +326,16 @@ void NaClListener::OnStart(const nacl::NaClStartParams& params) {
|
| IPC::ChannelHandle ppapi_renderer_handle;
|
| IPC::ChannelHandle manifest_service_handle;
|
|
|
| + for (size_t i = 0; i < params.resource_files.size(); ++i) {
|
| + if (!resource_files_.insert(std::make_pair(
|
| + params.resource_files[i].file_key,
|
| + std::make_pair(params.resource_files[i].file,
|
| + params.resource_files[i].file_path))).second) {
|
| + DLOG(ERROR) << "Duplicated open_resource key: "
|
| + << params.resource_files[i].file_key;
|
| + }
|
| + }
|
| +
|
| if (params.enable_ipc_proxy) {
|
| browser_handle = IPC::Channel::GenerateVerifiedChannelID("nacl");
|
| ppapi_renderer_handle = IPC::Channel::GenerateVerifiedChannelID("nacl");
|
| @@ -318,6 +356,8 @@ void NaClListener::OnStart(const nacl::NaClStartParams& params) {
|
| NACL_CHROME_DESC_BASE + 2);
|
| manifest_ipc_adapter->set_resolve_file_token_callback(
|
| base::Bind(&NaClListener::ResolveFileToken, base::Unretained(this)));
|
| + manifest_ipc_adapter->set_open_resource_callback(
|
| + base::Bind(&NaClListener::OnOpenResource, base::Unretained(this)));
|
| }
|
|
|
| trusted_listener_ = new NaClTrustedListener(
|
| @@ -423,9 +463,6 @@ void NaClListener::OnStart(const nacl::NaClStartParams& params) {
|
| args->nexe_desc = NaClDescCreateWithFilePathMetadata(nexe_file,
|
| file_path_str.c_str());
|
|
|
| - // TODO(yusukes): Support pre-opening resource files.
|
| - CHECK(params.resource_files.empty());
|
| -
|
| int exit_status;
|
| if (!NaClChromeMainStart(nap, args, &exit_status))
|
| NaClExit(1);
|
|
|