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 "chrome/browser/nacl_host/nacl_file_host.h" | 5 #include "chrome/browser/nacl_host/nacl_file_host.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 34 // in file name limit error-handling-code-paths, etc. | 34 // in file name limit error-handling-code-paths, etc. |
| 35 const size_t kMaxFileLength = 40; | 35 const size_t kMaxFileLength = 40; |
| 36 | 36 |
| 37 void NotifyRendererOfError( | 37 void NotifyRendererOfError( |
| 38 NaClHostMessageFilter* nacl_host_message_filter, | 38 NaClHostMessageFilter* nacl_host_message_filter, |
| 39 IPC::Message* reply_msg) { | 39 IPC::Message* reply_msg) { |
| 40 reply_msg->set_reply_error(); | 40 reply_msg->set_reply_error(); |
| 41 nacl_host_message_filter->Send(reply_msg); | 41 nacl_host_message_filter->Send(reply_msg); |
| 42 } | 42 } |
| 43 | 43 |
| 44 void ReplyEnsurePnaclInstalledOnIOThread( | |
| 45 const nacl_file_host::InstallCallback& cb, | |
| 46 bool success) { | |
| 47 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 48 cb.Run(success); | |
| 49 } | |
| 50 | |
| 51 void PnaclCheckDone( | |
| 52 const nacl_file_host::InstallCallback& done_callback, | |
| 53 const nacl_file_host::InstallProgressCallback& progress_callback, | |
| 54 bool success) { | |
| 55 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 56 BrowserThread::PostTask( | |
| 57 BrowserThread::IO, | |
| 58 FROM_HERE, | |
| 59 base::Bind(&ReplyEnsurePnaclInstalledOnIOThread, | |
| 60 done_callback, success)); | |
| 61 } | |
| 62 | |
| 63 void TryInstallPnacl( | |
| 64 const nacl_file_host::InstallCallback& done_callback, | |
| 65 const nacl_file_host::InstallProgressCallback& progress_callback) { | |
| 66 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 67 // TODO(jvoung): Figure out a way to get progress events and | |
| 68 // call progress_callback. | |
| 69 NaClBrowser::GetDelegate()->TryInstallPnacl( | |
| 70 base::Bind(&PnaclCheckDone, | |
| 71 done_callback, | |
| 72 progress_callback)); | |
| 73 } | |
| 74 | |
| 75 void SendNotInstalledProgress( | |
| 76 const nacl_file_host::InstallCallback& done_callback, | |
| 77 const nacl_file_host::InstallProgressCallback& progress_callback) { | |
| 78 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 79 progress_callback.Run(0, -1); | |
|
dmichael (off chromium)
2013/08/01 17:33:49
It's not documented anywhere what this means ^^^
jvoung (off chromium)
2013/08/02 18:32:36
Done.
| |
| 80 // TryInstall after sending the progress event so that they are more ordered. | |
| 81 BrowserThread::PostTask( | |
| 82 BrowserThread::UI, | |
| 83 FROM_HERE, | |
| 84 base::Bind(&TryInstallPnacl, done_callback, progress_callback)); | |
| 85 } | |
| 86 | |
| 87 void DoEnsurePnaclInstalled( | |
| 88 const nacl_file_host::InstallCallback& done_callback, | |
| 89 const nacl_file_host::InstallProgressCallback& progress_callback) { | |
| 90 DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); | |
| 91 // If already installed, return on IO thread. | |
| 92 base::FilePath pnacl_dir; | |
| 93 if (NaClBrowser::GetDelegate()->GetPnaclDirectory(&pnacl_dir) && | |
| 94 base::PathExists(pnacl_dir)) { | |
| 95 BrowserThread::PostTask( | |
| 96 BrowserThread::IO, | |
| 97 FROM_HERE, | |
| 98 base::Bind(&ReplyEnsurePnaclInstalledOnIOThread, | |
| 99 done_callback, true)); | |
| 100 return; | |
| 101 } | |
| 102 | |
| 103 // Otherwise, request an install (but send some "unknown" progress first). | |
| 104 BrowserThread::PostTask( | |
| 105 BrowserThread::IO, | |
| 106 FROM_HERE, | |
| 107 base::Bind(&SendNotInstalledProgress, done_callback, progress_callback)); | |
|
dmichael (off chromium)
2013/08/01 17:33:49
You go through a lot of work to call Send() only f
jvoung (off chromium)
2013/08/02 18:32:36
Ah, yes forgot about that. Otherwise, all the use
| |
| 108 } | |
| 109 | |
| 44 bool PnaclDoOpenFile(const base::FilePath& file_to_open, | 110 bool PnaclDoOpenFile(const base::FilePath& file_to_open, |
| 45 base::PlatformFile* out_file) { | 111 base::PlatformFile* out_file) { |
| 46 base::PlatformFileError error_code; | 112 base::PlatformFileError error_code; |
| 47 *out_file = base::CreatePlatformFile(file_to_open, | 113 *out_file = base::CreatePlatformFile(file_to_open, |
| 48 base::PLATFORM_FILE_OPEN | | 114 base::PLATFORM_FILE_OPEN | |
| 49 base::PLATFORM_FILE_READ, | 115 base::PLATFORM_FILE_READ, |
| 50 NULL, | 116 NULL, |
| 51 &error_code); | 117 &error_code); |
| 52 if (error_code != base::PLATFORM_FILE_OK) { | 118 if (error_code != base::PLATFORM_FILE_OK) { |
| 53 return false; | 119 return false; |
| 54 } | 120 } |
| 55 return true; | 121 return true; |
| 56 } | 122 } |
| 57 | 123 |
| 58 void DoOpenPnaclFile( | 124 void DoOpenPnaclFile( |
| 59 scoped_refptr<NaClHostMessageFilter> nacl_host_message_filter, | 125 scoped_refptr<NaClHostMessageFilter> nacl_host_message_filter, |
| 60 const std::string& filename, | 126 const std::string& filename, |
| 61 IPC::Message* reply_msg); | |
| 62 | |
| 63 void PnaclCheckDone( | |
| 64 scoped_refptr<NaClHostMessageFilter> nacl_host_message_filter, | |
| 65 const std::string& filename, | |
| 66 IPC::Message* reply_msg, | |
| 67 bool success) { | |
| 68 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 69 if (!success) { | |
| 70 NotifyRendererOfError(nacl_host_message_filter.get(), reply_msg); | |
| 71 } else { | |
| 72 if (!BrowserThread::PostBlockingPoolTask( | |
| 73 FROM_HERE, | |
| 74 base::Bind(&DoOpenPnaclFile, | |
| 75 nacl_host_message_filter, | |
| 76 filename, | |
| 77 reply_msg))) { | |
| 78 NotifyRendererOfError(nacl_host_message_filter.get(), reply_msg); | |
| 79 } | |
| 80 } | |
| 81 } | |
| 82 | |
| 83 void TryInstallPnacl( | |
| 84 scoped_refptr<NaClHostMessageFilter> nacl_host_message_filter, | |
| 85 const std::string& filename, | |
| 86 IPC::Message* reply_msg) { | |
| 87 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 88 NaClBrowser::GetDelegate()->TryInstallPnacl( | |
| 89 base::Bind(&PnaclCheckDone, | |
| 90 nacl_host_message_filter, | |
| 91 filename, | |
| 92 reply_msg)); | |
| 93 } | |
| 94 | |
| 95 void DoOpenPnaclFile( | |
| 96 scoped_refptr<NaClHostMessageFilter> nacl_host_message_filter, | |
| 97 const std::string& filename, | |
| 98 IPC::Message* reply_msg) { | 127 IPC::Message* reply_msg) { |
| 99 DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); | 128 DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); |
| 100 base::FilePath full_filepath; | 129 base::FilePath full_filepath; |
| 101 | 130 |
| 102 // PNaCl must be installed. | 131 // PNaCl must be installed. |
| 103 base::FilePath pnacl_dir; | 132 base::FilePath pnacl_dir; |
| 104 if (!NaClBrowser::GetDelegate()->GetPnaclDirectory(&pnacl_dir) || | 133 if (!NaClBrowser::GetDelegate()->GetPnaclDirectory(&pnacl_dir) || |
| 105 !base::PathExists(pnacl_dir)) { | 134 !base::PathExists(pnacl_dir)) { |
| 106 BrowserThread::PostTask( | 135 NotifyRendererOfError(nacl_host_message_filter.get(), reply_msg); |
| 107 BrowserThread::UI, FROM_HERE, | |
| 108 base::Bind(&TryInstallPnacl, | |
| 109 nacl_host_message_filter, | |
| 110 filename, | |
| 111 reply_msg)); | |
| 112 return; | 136 return; |
| 113 } | 137 } |
| 114 | 138 |
| 115 // Do some validation. | 139 // Do some validation. |
| 116 if (!nacl_file_host::PnaclCanOpenFile(filename, &full_filepath)) { | 140 if (!nacl_file_host::PnaclCanOpenFile(filename, &full_filepath)) { |
| 117 NotifyRendererOfError(nacl_host_message_filter.get(), reply_msg); | 141 NotifyRendererOfError(nacl_host_message_filter.get(), reply_msg); |
| 118 return; | 142 return; |
| 119 } | 143 } |
| 120 | 144 |
| 121 base::PlatformFile file_to_open; | 145 base::PlatformFile file_to_open; |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 241 } else { | 265 } else { |
| 242 NotifyRendererOfError(nacl_host_message_filter.get(), reply_msg); | 266 NotifyRendererOfError(nacl_host_message_filter.get(), reply_msg); |
| 243 return; | 267 return; |
| 244 } | 268 } |
| 245 } | 269 } |
| 246 | 270 |
| 247 } // namespace | 271 } // namespace |
| 248 | 272 |
| 249 namespace nacl_file_host { | 273 namespace nacl_file_host { |
| 250 | 274 |
| 275 void EnsurePnaclInstalled( | |
| 276 const InstallCallback& done_callback, | |
| 277 const InstallProgressCallback& progress_callback) { | |
| 278 if (!BrowserThread::PostBlockingPoolTask( | |
| 279 FROM_HERE, | |
| 280 base::Bind(&DoEnsurePnaclInstalled, | |
| 281 done_callback, | |
| 282 progress_callback))) { | |
| 283 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 284 done_callback.Run(false); | |
| 285 } | |
| 286 } | |
| 287 | |
| 251 void GetReadonlyPnaclFd( | 288 void GetReadonlyPnaclFd( |
| 252 scoped_refptr<NaClHostMessageFilter> nacl_host_message_filter, | 289 scoped_refptr<NaClHostMessageFilter> nacl_host_message_filter, |
| 253 const std::string& filename, | 290 const std::string& filename, |
| 254 IPC::Message* reply_msg) { | 291 IPC::Message* reply_msg) { |
| 255 if (!BrowserThread::PostBlockingPoolTask( | 292 if (!BrowserThread::PostBlockingPoolTask( |
| 256 FROM_HERE, | 293 FROM_HERE, |
| 257 base::Bind(&DoOpenPnaclFile, | 294 base::Bind(&DoOpenPnaclFile, |
| 258 nacl_host_message_filter, | 295 nacl_host_message_filter, |
| 259 filename, | 296 filename, |
| 260 reply_msg))) { | 297 reply_msg))) { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 337 base::Bind( | 374 base::Bind( |
| 338 &DoOpenNaClExecutableOnThreadPool, | 375 &DoOpenNaClExecutableOnThreadPool, |
| 339 nacl_host_message_filter, | 376 nacl_host_message_filter, |
| 340 extension_info_map, | 377 extension_info_map, |
| 341 file_url, reply_msg))) { | 378 file_url, reply_msg))) { |
| 342 NotifyRendererOfError(nacl_host_message_filter.get(), reply_msg); | 379 NotifyRendererOfError(nacl_host_message_filter.get(), reply_msg); |
| 343 } | 380 } |
| 344 } | 381 } |
| 345 | 382 |
| 346 } // namespace nacl_file_host | 383 } // namespace nacl_file_host |
| OLD | NEW |