Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(581)

Unified Diff: components/nacl/browser/nacl_host_message_filter.cc

Issue 649603004: Non-SFI NaCl: Batch-open resource files (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/nacl/browser/nacl_host_message_filter.h ('k') | components/nacl/browser/nacl_process_host.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/nacl/browser/nacl_host_message_filter.cc
diff --git a/components/nacl/browser/nacl_host_message_filter.cc b/components/nacl/browser/nacl_host_message_filter.cc
index 3726a7e1e1d349c59f6c6d9e0e6e0e8d0eab3042..18a695e7c54af6c46b4678c0b283a1aab49f9fc5 100644
--- a/components/nacl/browser/nacl_host_message_filter.cc
+++ b/components/nacl/browser/nacl_host_message_filter.cc
@@ -24,6 +24,11 @@ namespace nacl {
namespace {
+// The maximum number of resource file handles NaClProcessMsg_Start message
+// can have.
+// TODO(yusukes): Increase the number.
+const size_t kMaxPreOpenResourceFiles = 2;
+
ppapi::PpapiPermissions GetNaClPermissions(
uint32 permission_bits,
content::BrowserContext* browser_context,
@@ -122,19 +127,16 @@ void NaClHostMessageFilter::OnLaunchNaCl(
// of the whitelisting parameters anyway.
if (launch_params.process_type == kPNaClTranslatorProcessType) {
uint32 perms = launch_params.permission_bits & ppapi::PERMISSION_DEV;
- LaunchNaClContinuation(
+ LaunchNaClContinuationOnIOThread(
launch_params,
reply_msg,
+ std::vector<nacl::NaClResourceFileInfo>(),
ppapi::PpapiPermissions(perms));
return;
}
- content::BrowserThread::PostTaskAndReplyWithResult(
+ content::BrowserThread::PostTask(
content::BrowserThread::UI,
FROM_HERE,
- base::Bind(&GetPpapiPermissions,
- launch_params.permission_bits,
- render_process_id_,
- launch_params.render_view_id),
base::Bind(&NaClHostMessageFilter::LaunchNaClContinuation,
this,
launch_params,
@@ -143,8 +145,100 @@ void NaClHostMessageFilter::OnLaunchNaCl(
void NaClHostMessageFilter::LaunchNaClContinuation(
const nacl::NaClLaunchParams& launch_params,
+ IPC::Message* reply_msg) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+ ppapi::PpapiPermissions permissions =
+ GetPpapiPermissions(launch_params.permission_bits,
+ render_process_id_,
+ launch_params.render_view_id);
+
+ content::RenderViewHost* rvh = content::RenderViewHost::FromID(
+ render_process_id(), launch_params.render_view_id);
+ if (!rvh) {
+ BadMessageReceived(); // Kill the renderer.
+ return;
+ }
+
+ nacl::NaClLaunchParams safe_launch_params(launch_params);
+ safe_launch_params.resource_files_to_prefetch.clear();
+
+ content::SiteInstance* site_instance = rvh->GetSiteInstance();
+ for (size_t i = 0; i < launch_params.resource_files_to_prefetch.size(); ++i) {
+ GURL gurl(launch_params.resource_files_to_prefetch[i].second);
+ // Important security check: Do the same check as OpenNaClExecutable()
+ // in nacl_file_host.cc.
+ if (!content::SiteInstance::IsSameWebSite(
+ site_instance->GetBrowserContext(),
+ site_instance->GetSiteURL(),
+ gurl)) {
+ continue;
+ }
+ safe_launch_params.resource_files_to_prefetch.push_back(
+ launch_params.resource_files_to_prefetch[i]);
+ }
+
+ // Process a list of resource file URLs in
+ // |launch_params.resource_files_to_prefetch|.
+ content::BrowserThread::PostBlockingPoolTask(
+ FROM_HERE,
+ base::Bind(&NaClHostMessageFilter::BatchOpenResourceFiles,
+ this,
+ safe_launch_params,
+ reply_msg,
+ permissions));
+}
+
+void NaClHostMessageFilter::BatchOpenResourceFiles(
+ const nacl::NaClLaunchParams& launch_params,
+ IPC::Message* reply_msg,
+ ppapi::PpapiPermissions permissions) {
+ std::vector<nacl::NaClResourceFileInfo> prefetched_resource_files_info;
+ for (size_t i = 0; i < launch_params.resource_files_to_prefetch.size(); ++i) {
+ nacl::NaClResourceFileInfo prefetched_resource_file;
+ GURL gurl(launch_params.resource_files_to_prefetch[i].second);
+ if (!nacl::NaClBrowser::GetDelegate()->MapUrlToLocalFilePath(
+ gurl,
+ true, // use_blocking_api
+ profile_directory_,
+ &prefetched_resource_file.file_path_metadata)) {
+ continue;
+ }
+ base::File file = nacl::OpenNaClReadExecImpl(
+ prefetched_resource_file.file_path_metadata,
+ true /* is_executable */);
+ if (!file.IsValid())
+ continue;
+
+ prefetched_resource_file.file =
+ IPC::TakeFileHandleForProcess(file.Pass(), PeerHandle());
+ prefetched_resource_file.file_key =
+ launch_params.resource_files_to_prefetch[i].first;
+
+ prefetched_resource_files_info.push_back(prefetched_resource_file);
+ if (prefetched_resource_files_info.size() >= kMaxPreOpenResourceFiles)
+ break;
+ }
+
+ content::BrowserThread::PostTask(
+ content::BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(&NaClHostMessageFilter::LaunchNaClContinuationOnIOThread,
+ this,
+ launch_params,
+ reply_msg,
+ prefetched_resource_files_info,
+ permissions));
+}
+
+void NaClHostMessageFilter::LaunchNaClContinuationOnIOThread(
+ const nacl::NaClLaunchParams& launch_params,
IPC::Message* reply_msg,
+ const std::vector<
+ nacl::NaClResourceFileInfo>& prefetched_resource_files_info,
ppapi::PpapiPermissions permissions) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
NaClFileToken nexe_token = {
launch_params.nexe_token_lo, // lo
launch_params.nexe_token_hi // hi
@@ -179,6 +273,7 @@ void NaClHostMessageFilter::LaunchNaClContinuation(
GURL(launch_params.manifest_url),
base::File(nexe_file),
nexe_token,
+ prefetched_resource_files_info,
permissions,
launch_params.render_view_id,
launch_params.permission_bits,
« no previous file with comments | « components/nacl/browser/nacl_host_message_filter.h ('k') | components/nacl/browser/nacl_process_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698