Chromium Code Reviews| Index: components/nacl/loader/nacl_listener.cc |
| diff --git a/components/nacl/loader/nacl_listener.cc b/components/nacl/loader/nacl_listener.cc |
| index 4a58a1ce49bcd8a2814fab35a611bdf91ecd2028..6571b46309f009b985e76d2271ed1b7172cc02b5 100644 |
| --- a/components/nacl/loader/nacl_listener.cc |
| +++ b/components/nacl/loader/nacl_listener.cc |
| @@ -144,11 +144,13 @@ void SetUpIPCAdapter( |
| scoped_refptr<base::MessageLoopProxy> message_loop_proxy, |
| struct NaClApp* nap, |
| int nacl_fd, |
| - NaClIPCAdapter::ResolveFileTokenCallback resolve_file_token_cb) { |
| + NaClIPCAdapter::ResolveFileTokenCallback resolve_file_token_cb, |
| + NaClIPCAdapter::OpenResourceCallback open_resource_cb) { |
| scoped_refptr<NaClIPCAdapter> ipc_adapter( |
| new NaClIPCAdapter(*handle, |
| message_loop_proxy.get(), |
| - resolve_file_token_cb)); |
| + resolve_file_token_cb, |
| + open_resource_cb)); |
| ipc_adapter->ConnectChannel(); |
| #if defined(OS_POSIX) |
| handle->socket = |
| @@ -277,6 +279,32 @@ bool NaClListener::OnMessageReceived(const IPC::Message& msg) { |
| return handled; |
| } |
| +bool NaClListener::OnOpenResource( |
| + const IPC::Message& msg, |
| + const std::string& key, |
| + NaClIPCAdapter::OpenResourceReplyCallback cb) { |
| + // This callback is executed only on |io_thread_| with NaClIPCAdapter's |
| + // |lock_| not being held. |
| + DCHECK(!cb.is_null()); |
| + PrefetchedResourceFilesMap::iterator it = |
| + prefetched_resource_files_.find(key); |
| + |
| + if (it != prefetched_resource_files_.end()) { |
| + // Fast path for prefetched FDs. |
| + IPC::PlatformFileForTransit file = it->second.first; |
| + base::FilePath path = it->second.second; |
| + prefetched_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 fall back to the slow path. Let the IPC adapter issue an |
|
Mark Seaborn
2015/05/04 17:08:39
Nit: "the IPC adapter" -> "NaClIPCAdapter" to be m
Yusuke Sato
2015/05/05 18:27:16
Done.
|
| + // 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()); |
| @@ -304,6 +332,18 @@ void NaClListener::OnStart(const nacl::NaClStartParams& params) { |
| IPC::ChannelHandle ppapi_renderer_handle; |
| IPC::ChannelHandle manifest_service_handle; |
| + for (size_t i = 0; i < params.prefetched_resource_files.size(); ++i) { |
| + bool result = prefetched_resource_files_.insert(std::make_pair( |
|
Mark Seaborn
2015/05/04 17:08:39
I think you'll need to rebase this use of std::pai
Yusuke Sato
2015/05/05 18:27:16
Done.
|
| + params.prefetched_resource_files[i].file_key, |
| + std::make_pair( |
| + params.prefetched_resource_files[i].file, |
| + params.prefetched_resource_files[i].file_path_metadata))).second; |
| + if (!result) { |
| + DLOG(ERROR) << "Duplicated open_resource key: " |
|
Mark Seaborn
2015/05/04 17:08:39
How about just making this fatal? The renderer sh
Yusuke Sato
2015/05/05 18:27:16
Done.
|
| + << params.prefetched_resource_files[i].file_key; |
| + } |
| + } |
| + |
| if (params.enable_ipc_proxy) { |
| browser_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
| ppapi_renderer_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
| @@ -314,15 +354,19 @@ void NaClListener::OnStart(const nacl::NaClStartParams& params) { |
| // communicate with the host and to initialize the IPC dispatchers. |
| SetUpIPCAdapter(&browser_handle, io_thread_.message_loop_proxy(), |
| nap, NACL_CHROME_DESC_BASE, |
| - NaClIPCAdapter::ResolveFileTokenCallback()); |
| + NaClIPCAdapter::ResolveFileTokenCallback(), |
| + NaClIPCAdapter::OpenResourceCallback()); |
| SetUpIPCAdapter(&ppapi_renderer_handle, io_thread_.message_loop_proxy(), |
| nap, NACL_CHROME_DESC_BASE + 1, |
| - NaClIPCAdapter::ResolveFileTokenCallback()); |
| + NaClIPCAdapter::ResolveFileTokenCallback(), |
| + NaClIPCAdapter::OpenResourceCallback()); |
| SetUpIPCAdapter(&manifest_service_handle, |
| io_thread_.message_loop_proxy(), |
| nap, |
| NACL_CHROME_DESC_BASE + 2, |
| base::Bind(&NaClListener::ResolveFileToken, |
| + base::Unretained(this)), |
| + base::Bind(&NaClListener::OnOpenResource, |
| base::Unretained(this))); |
| } |
| @@ -440,8 +484,6 @@ void NaClListener::OnStart(const nacl::NaClStartParams& params) { |
| // fails on any imc_sendmsg() call to make debugging easier. |
| InjectDisabledMojo(nap); |
| } |
| - // TODO(yusukes): Support pre-opening resource files. |
| - CHECK(params.prefetched_resource_files.empty()); |
| int exit_status; |
| if (!NaClChromeMainStart(nap, args, &exit_status)) |