Index: chrome/browser/nacl_host/pnacl_file_host.cc |
diff --git a/chrome/browser/nacl_host/pnacl_file_host.cc b/chrome/browser/nacl_host/pnacl_file_host.cc |
index 966fc7f9633e203af56ede0dbc846ef77366f5fc..0d03f8ee67a2c597606706ebfdbcc0c5e5400fd3 100644 |
--- a/chrome/browser/nacl_host/pnacl_file_host.cc |
+++ b/chrome/browser/nacl_host/pnacl_file_host.cc |
@@ -4,13 +4,18 @@ |
#include "chrome/browser/nacl_host/pnacl_file_host.h" |
+#include <iostream> |
+ |
#include "base/bind.h" |
+#include "base/callback.h" |
#include "base/file_path.h" |
#include "base/file_util.h" |
#include "base/memory/ref_counted.h" |
#include "base/path_service.h" |
#include "base/platform_file.h" |
#include "base/utf_string_conversions.h" |
+#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/component_updater/pnacl/pnacl_component_installer.h" |
#include "chrome/browser/renderer_host/chrome_render_message_filter.h" |
#include "chrome/common/chrome_paths.h" |
#include "chrome/common/render_messages.h" |
@@ -49,13 +54,59 @@ bool PnaclDoOpenFile(const base::FilePath& file_to_open, |
return true; |
} |
-void DoOpenPnaclFile( |
- ChromeRenderMessageFilter* chrome_render_message_filter, |
- const std::string& filename, |
- IPC::Message* reply_msg) { |
+void DoOpenPnaclFile(ChromeRenderMessageFilter* chrome_render_message_filter, |
+ const std::string& filename, |
+ IPC::Message* reply_msg); |
+ |
+void PnaclCheckDone(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 { |
+ BrowserThread::PostTask( |
+ BrowserThread::FILE, FROM_HERE, |
+ base::Bind(&DoOpenPnaclFile, |
+ make_scoped_refptr(chrome_render_message_filter), |
+ filename, |
+ reply_msg)); |
+ } |
+} |
+ |
+void TryInstallPnacl(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(); |
+ CheckUpdatesForPnacl(cus, |
+ base::Bind(&PnaclCheckDone, |
+ make_scoped_refptr( |
+ chrome_render_message_filter), |
+ filename, |
+ reply_msg)); |
+} |
+ |
+void DoOpenPnaclFile(ChromeRenderMessageFilter* chrome_render_message_filter, |
+ const std::string& filename, |
+ IPC::Message* reply_msg) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
- 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, |
+ make_scoped_refptr(chrome_render_message_filter), |
+ filename, |
+ reply_msg)); |
+ return; |
+ } |
+ |
+ FilePath full_filepath; |
// Do some validation. |
if (!pnacl_file_host::PnaclCanOpenFile(filename, &full_filepath)) { |
NotifyRendererOfError(chrome_render_message_filter, reply_msg); |