Index: chrome/browser/nacl_host/nacl_file_host.cc |
diff --git a/chrome/browser/nacl_host/nacl_file_host.cc b/chrome/browser/nacl_host/nacl_file_host.cc |
index 67d1a3970cb08335fa3b3f473ce4914b17fefbf5..093f2737981bbf8186217667f1b4d9055abc01d9 100644 |
--- a/chrome/browser/nacl_host/nacl_file_host.cc |
+++ b/chrome/browser/nacl_host/nacl_file_host.cc |
@@ -11,6 +11,8 @@ |
#include "base/platform_file.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/threading/sequenced_worker_pool.h" |
+#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/component_updater/pnacl/pnacl_component_installer.h" |
#include "chrome/browser/extensions/extension_info_map.h" |
#include "chrome/browser/nacl_host/nacl_browser.h" |
#include "chrome/browser/renderer_host/chrome_render_message_filter.h" |
@@ -58,10 +60,64 @@ bool PnaclDoOpenFile(const base::FilePath& file_to_open, |
void DoOpenPnaclFile( |
scoped_refptr<ChromeRenderMessageFilter> chrome_render_message_filter, |
const std::string& filename, |
+ IPC::Message* reply_msg); |
+ |
+void PnaclCheckDone( |
+ scoped_refptr<ChromeRenderMessageFilter> chrome_render_message_filter, |
+ const std::string& filename, |
+ IPC::Message* reply_msg, |
+ bool success) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ if (!success) { |
+ NotifyRendererOfError(chrome_render_message_filter, reply_msg); |
+ } else { |
+ if (!BrowserThread::PostBlockingPoolTask( |
+ FROM_HERE, |
+ base::Bind(&DoOpenPnaclFile, |
+ chrome_render_message_filter, |
+ filename, |
+ reply_msg))) { |
+ NotifyRendererOfError(chrome_render_message_filter, reply_msg); |
+ } |
+ } |
+} |
+ |
+void TryInstallPnacl( |
+ scoped_refptr<ChromeRenderMessageFilter> chrome_render_message_filter, |
+ const std::string& filename, |
+ IPC::Message* reply_msg) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ ComponentUpdateService* cus = g_browser_process->component_updater(); |
+ PnaclComponentInstaller* pci = |
+ g_browser_process->pnacl_component_installer(); |
+ RequestFirstInstall(cus, |
+ pci, |
+ base::Bind(&PnaclCheckDone, |
+ chrome_render_message_filter, |
+ filename, |
+ reply_msg)); |
+} |
+ |
+void DoOpenPnaclFile( |
+ scoped_refptr<ChromeRenderMessageFilter> chrome_render_message_filter, |
+ const std::string& filename, |
IPC::Message* reply_msg) { |
DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); |
base::FilePath full_filepath; |
+ // PNaCl must be installed. |
+ base::FilePath pnacl_dir; |
+ if (!PathService::Get(chrome::DIR_PNACL_COMPONENT, &pnacl_dir) || |
+ !file_util::PathExists(pnacl_dir)) { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&TryInstallPnacl, |
+ chrome_render_message_filter, |
+ filename, |
+ reply_msg)); |
+ return; |
+ } |
+ |
// Do some validation. |
if (!nacl_file_host::PnaclCanOpenFile(filename, &full_filepath)) { |
NotifyRendererOfError(chrome_render_message_filter.get(), reply_msg); |