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 424112eeb32ee08d63e1ef5e6b5cb9e8ed95df5d..d00b671bf70ee0e1acea9573bfdaed7a3a7e35c7 100644 |
| --- a/components/nacl/loader/nacl_listener.cc |
| +++ b/components/nacl/loader/nacl_listener.cc |
| @@ -275,6 +275,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< |
|
Mark Seaborn
2015/03/20 00:40:52
Nit: Define a typedef for this std::map?
Yusuke Sato
2015/04/16 02:38:45
Done.
|
| + IPC::PlatformFileForTransit, base::FilePath> >::iterator it; |
| + |
| + const std::string files_prefix = "files/"; |
| + if (key.find(files_prefix) == 0) |
|
Mark Seaborn
2015/03/20 00:40:52
You're stripping off the "files/" prefix which is
Yusuke Sato
2015/04/16 02:38:45
Sure, let me add a TODO for now.
Yusuke Sato
2015/04/16 03:51:14
https://codereview.chromium.org/1070233007/
|
| + it = prefetched_resource_files_.find(key.substr(files_prefix.length())); |
|
Mark Seaborn
2015/03/20 00:40:52
Can you comment this as a fast path, like how it's
Yusuke Sato
2015/04/16 02:38:45
Done.
|
| + else |
| + it = prefetched_resource_files_.find(key); |
| + |
| + if (it != prefetched_resource_files_.end()) { |
| + IPC::PlatformFileForTransit file = it->second.first; |
| + base::FilePath path = it->second.second; |
| + prefetched_resource_files_.erase(it); |
|
Mark Seaborn
2015/03/20 00:40:52
Can you add a comment saying why this is thread-sa
Yusuke Sato
2015/04/16 02:38:45
Done.
|
| + // 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. |
|
Mark Seaborn
2015/03/20 00:40:52
...and fall back to the slow path.
Yusuke Sato
2015/04/16 02:38:45
Done.
|
| + return false; |
| +} |
| + |
| void NaClListener::OnStart(const nacl::NaClStartParams& params) { |
| #if defined(OS_LINUX) || defined(OS_MACOSX) |
| int urandom_fd = dup(base::GetUrandomFD()); |
| @@ -302,6 +330,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( |
| + 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: " |
| + << 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"); |
| @@ -322,6 +362,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( |
| @@ -448,8 +490,6 @@ void NaClListener::OnStart(const nacl::NaClStartParams& params) { |
| #else |
| InjectDisabledMojo(nap); |
| #endif |
| - // TODO(yusukes): Support pre-opening resource files. |
| - CHECK(params.prefetched_resource_files.empty()); |
| int exit_status; |
| if (!NaClChromeMainStart(nap, args, &exit_status)) |