| Index: components/nacl/browser/nacl_host_impl.cc
|
| diff --git a/components/nacl/browser/nacl_host_message_filter.cc b/components/nacl/browser/nacl_host_impl.cc
|
| similarity index 41%
|
| rename from components/nacl/browser/nacl_host_message_filter.cc
|
| rename to components/nacl/browser/nacl_host_impl.cc
|
| index c8d0ebfe06d350059b22169bdf4dbcfc9dc19cb3..7ee8e51eea87d694d4363a3cbc99f8982ec24fea 100644
|
| --- a/components/nacl/browser/nacl_host_message_filter.cc
|
| +++ b/components/nacl/browser/nacl_host_impl.cc
|
| @@ -2,7 +2,7 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "components/nacl/browser/nacl_host_message_filter.h"
|
| +#include "components/nacl/browser/nacl_host_impl.h"
|
|
|
| #include <stddef.h>
|
| #include <stdint.h>
|
| @@ -15,14 +15,12 @@
|
| #include "components/nacl/browser/nacl_file_host.h"
|
| #include "components/nacl/browser/nacl_process_host.h"
|
| #include "components/nacl/browser/pnacl_host.h"
|
| -#include "components/nacl/common/nacl_host_messages.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/plugin_service.h"
|
| #include "content/public/browser/render_process_host.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "ipc/ipc_platform_file.h"
|
| -#include "net/url_request/url_request_context.h"
|
| -#include "net/url_request/url_request_context_getter.h"
|
| +#include "mojo/public/cpp/system/platform_handle.h"
|
| #include "ppapi/shared_impl/ppapi_permissions.h"
|
| #include "url/gurl.h"
|
|
|
| @@ -65,162 +63,130 @@ ppapi::PpapiPermissions GetPpapiPermissions(uint32_t permission_bits,
|
| content::WebContents::FromRenderViewHost(view_host);
|
| if (contents)
|
| document_url = contents->GetLastCommittedURL();
|
| - return GetNaClPermissions(permission_bits,
|
| - host->GetBrowserContext(),
|
| + return GetNaClPermissions(permission_bits, host->GetBrowserContext(),
|
| document_url);
|
| }
|
|
|
| } // namespace
|
|
|
| -NaClHostMessageFilter::NaClHostMessageFilter(
|
| - int render_process_id,
|
| - bool is_off_the_record,
|
| - const base::FilePath& profile_directory,
|
| - net::URLRequestContextGetter* request_context)
|
| - : BrowserMessageFilter(NaClHostMsgStart),
|
| - render_process_id_(render_process_id),
|
| +NaClHostImpl::NaClHostImpl(int render_process_id,
|
| + bool is_off_the_record,
|
| + const base::FilePath& profile_directory,
|
| + mojom::NaClHostRequest request)
|
| + : render_process_id_(render_process_id),
|
| off_the_record_(is_off_the_record),
|
| profile_directory_(profile_directory),
|
| - request_context_(request_context),
|
| + self_(this),
|
| + binding_(this, std::move(request)),
|
| weak_ptr_factory_(this) {
|
| + binding_.set_connection_error_handler(base::Bind(
|
| + &NaClHostImpl::OnConnectionError, weak_ptr_factory_.GetWeakPtr()));
|
| }
|
|
|
| -NaClHostMessageFilter::~NaClHostMessageFilter() {
|
| -}
|
| +NaClHostImpl::~NaClHostImpl() = default;
|
|
|
| -void NaClHostMessageFilter::OnChannelClosing() {
|
| - pnacl::PnaclHost::GetInstance()->RendererClosing(render_process_id_);
|
| +// static
|
| +void NaClHostImpl::Create(int render_process_id,
|
| + bool is_off_the_record,
|
| + const base::FilePath& profile_directory,
|
| + mojom::NaClHostRequest request) {
|
| + new NaClHostImpl(render_process_id, is_off_the_record, profile_directory,
|
| + std::move(request));
|
| }
|
|
|
| -bool NaClHostMessageFilter::OnMessageReceived(const IPC::Message& message) {
|
| - bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP(NaClHostMessageFilter, message)
|
| -#if !defined(DISABLE_NACL)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClHostMsg_LaunchNaCl, OnLaunchNaCl)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClHostMsg_GetReadonlyPnaclFD,
|
| - OnGetReadonlyPnaclFd)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClHostMsg_NaClCreateTemporaryFile,
|
| - OnNaClCreateTemporaryFile)
|
| - IPC_MESSAGE_HANDLER(NaClHostMsg_NexeTempFileRequest,
|
| - OnGetNexeFd)
|
| - IPC_MESSAGE_HANDLER(NaClHostMsg_ReportTranslationFinished,
|
| - OnTranslationFinished)
|
| - IPC_MESSAGE_HANDLER(NaClHostMsg_MissingArchError,
|
| - OnMissingArchError)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClHostMsg_OpenNaClExecutable,
|
| - OnOpenNaClExecutable)
|
| - IPC_MESSAGE_HANDLER(NaClHostMsg_NaClGetNumProcessors,
|
| - OnNaClGetNumProcessors)
|
| - IPC_MESSAGE_HANDLER(NaClHostMsg_NaClDebugEnabledForURL,
|
| - OnNaClDebugEnabledForURL)
|
| -#endif
|
| - IPC_MESSAGE_UNHANDLED(handled = false)
|
| - IPC_END_MESSAGE_MAP()
|
| -
|
| - return handled;
|
| -}
|
| -
|
| -net::HostResolver* NaClHostMessageFilter::GetHostResolver() {
|
| - return request_context_->GetURLRequestContext()->host_resolver();
|
| +void NaClHostImpl::OnConnectionError() {
|
| + pnacl::PnaclHost::GetInstance()->RendererClosing(render_process_id_);
|
| + self_ = nullptr;
|
| }
|
|
|
| -void NaClHostMessageFilter::OnLaunchNaCl(
|
| - const nacl::NaClLaunchParams& launch_params,
|
| - IPC::Message* reply_msg) {
|
| +void NaClHostImpl::LaunchNaCl(mojom::NaClLaunchParamsPtr launch_params,
|
| + const LaunchNaClCallback& callback) {
|
| // If we're running llc or ld for the PNaCl translator, we don't need to look
|
| // up permissions, and we don't have the right browser state to look up some
|
| // of the whitelisting parameters anyway.
|
| - if (launch_params.process_type == kPNaClTranslatorProcessType) {
|
| - uint32_t perms = launch_params.permission_bits & ppapi::PERMISSION_DEV;
|
| - LaunchNaClContinuationOnIOThread(
|
| - launch_params,
|
| - reply_msg,
|
| - std::vector<NaClResourcePrefetchResult>(),
|
| - ppapi::PpapiPermissions(perms));
|
| + if (launch_params->process_type == kPNaClTranslatorProcessType) {
|
| + uint32_t perms = launch_params->permission_bits & ppapi::PERMISSION_DEV;
|
| + LaunchNaClContinuationOnIOThread(std::move(launch_params), callback,
|
| + std::vector<NaClResourcePrefetchResult>(),
|
| + ppapi::PpapiPermissions(perms));
|
| return;
|
| }
|
| content::BrowserThread::PostTask(
|
| - content::BrowserThread::UI,
|
| - FROM_HERE,
|
| - base::Bind(&NaClHostMessageFilter::LaunchNaClContinuation,
|
| - this,
|
| - launch_params,
|
| - reply_msg));
|
| + content::BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&NaClHostImpl::LaunchNaClContinuation, this,
|
| + base::Passed(&launch_params), callback));
|
| }
|
|
|
| -void NaClHostMessageFilter::LaunchNaClContinuation(
|
| - const nacl::NaClLaunchParams& launch_params,
|
| - IPC::Message* reply_msg) {
|
| +void NaClHostImpl::LaunchNaClContinuation(
|
| + mojom::NaClLaunchParamsPtr launch_params,
|
| + const LaunchNaClCallback& callback) {
|
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
|
|
| ppapi::PpapiPermissions permissions =
|
| - GetPpapiPermissions(launch_params.permission_bits,
|
| - render_process_id_,
|
| - launch_params.render_view_id);
|
| + 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);
|
| + render_process_id_, launch_params->render_view_id);
|
| if (!rvh) {
|
| + // Mojo requires that the callback be called in all cases.
|
| + content::BrowserThread::PostTask(
|
| + content::BrowserThread::IO, FROM_HERE,
|
| + base::Bind(callback, base::Passed(nacl::mojom::NaClLaunchResultPtr()),
|
| + ""));
|
| bad_message::ReceivedBadMessage(
|
| - this, bad_message::NHMF_LAUNCH_CONTINUATION_BAD_ROUTING_ID);
|
| - delete reply_msg;
|
| + render_process_id_,
|
| + bad_message::NHMF_LAUNCH_CONTINUATION_BAD_ROUTING_ID);
|
| return;
|
| }
|
|
|
| - nacl::NaClLaunchParams safe_launch_params(launch_params);
|
| - safe_launch_params.resource_prefetch_request_list.clear();
|
| -
|
| - // TODO(yusukes): Fix NaClProcessHost::~NaClProcessHost() and remove the
|
| - // ifdef.
|
| +// TODO(yusukes): Fix NaClProcessHost::~NaClProcessHost() and remove the
|
| +// ifdef.
|
| #if !defined(OS_WIN)
|
| - const std::vector<NaClResourcePrefetchRequest>& original_request_list =
|
| - launch_params.resource_prefetch_request_list;
|
| + std::vector<NaClResourcePrefetchRequest> original_request_list =
|
| + std::move(launch_params->resource_prefetch_request_list);
|
| + launch_params->resource_prefetch_request_list.clear();
|
| content::SiteInstance* site_instance = rvh->GetSiteInstance();
|
| for (size_t i = 0; i < original_request_list.size(); ++i) {
|
| GURL gurl(original_request_list[i].resource_url);
|
| // Important security check: Do the same check as OpenNaClExecutable()
|
| // in nacl_file_host.cc.
|
| if (!content::SiteInstance::IsSameWebSite(
|
| - site_instance->GetBrowserContext(),
|
| - site_instance->GetSiteURL(),
|
| + site_instance->GetBrowserContext(), site_instance->GetSiteURL(),
|
| gurl)) {
|
| continue;
|
| }
|
| - safe_launch_params.resource_prefetch_request_list.push_back(
|
| + launch_params->resource_prefetch_request_list.push_back(
|
| original_request_list[i]);
|
| }
|
| #endif
|
|
|
| // Process a list of resource file URLs in
|
| - // |launch_params.resource_files_to_prefetch|.
|
| + // |launch_params->resource_files_to_prefetch|.
|
| content::BrowserThread::PostBlockingPoolTask(
|
| FROM_HERE,
|
| - base::Bind(&NaClHostMessageFilter::BatchOpenResourceFiles,
|
| - this,
|
| - safe_launch_params,
|
| - reply_msg,
|
| - permissions));
|
| + base::Bind(&NaClHostImpl::BatchOpenResourceFiles, this,
|
| + base::Passed(&launch_params), callback, permissions));
|
| }
|
|
|
| -void NaClHostMessageFilter::BatchOpenResourceFiles(
|
| - const nacl::NaClLaunchParams& launch_params,
|
| - IPC::Message* reply_msg,
|
| +void NaClHostImpl::BatchOpenResourceFiles(
|
| + mojom::NaClLaunchParamsPtr launch_params,
|
| + const LaunchNaClCallback& callback,
|
| ppapi::PpapiPermissions permissions) {
|
| std::vector<NaClResourcePrefetchResult> prefetched_resource_files;
|
| const std::vector<NaClResourcePrefetchRequest>& request_list =
|
| - launch_params.resource_prefetch_request_list;
|
| + launch_params->resource_prefetch_request_list;
|
| for (size_t i = 0; i < request_list.size(); ++i) {
|
| GURL gurl(request_list[i].resource_url);
|
| base::FilePath file_path_metadata;
|
| if (!nacl::NaClBrowser::GetDelegate()->MapUrlToLocalFilePath(
|
| gurl,
|
| true, // use_blocking_api
|
| - profile_directory_,
|
| - &file_path_metadata)) {
|
| + profile_directory_, &file_path_metadata)) {
|
| continue;
|
| }
|
| - base::File file = nacl::OpenNaClReadExecImpl(
|
| - file_path_metadata, true /* is_executable */);
|
| + base::File file = nacl::OpenNaClReadExecImpl(file_path_metadata,
|
| + true /* is_executable */);
|
| if (!file.IsValid())
|
| continue;
|
|
|
| @@ -233,155 +199,108 @@ void NaClHostMessageFilter::BatchOpenResourceFiles(
|
| }
|
|
|
| content::BrowserThread::PostTask(
|
| - content::BrowserThread::IO,
|
| - FROM_HERE,
|
| - base::Bind(&NaClHostMessageFilter::LaunchNaClContinuationOnIOThread,
|
| - this,
|
| - launch_params,
|
| - reply_msg,
|
| - prefetched_resource_files,
|
| - permissions));
|
| + content::BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&NaClHostImpl::LaunchNaClContinuationOnIOThread, this,
|
| + base::Passed(&launch_params), callback,
|
| + prefetched_resource_files, permissions));
|
| }
|
|
|
| -void NaClHostMessageFilter::LaunchNaClContinuationOnIOThread(
|
| - const nacl::NaClLaunchParams& launch_params,
|
| - IPC::Message* reply_msg,
|
| +void NaClHostImpl::LaunchNaClContinuationOnIOThread(
|
| + mojom::NaClLaunchParamsPtr launch_params,
|
| + const LaunchNaClCallback& callback,
|
| const std::vector<NaClResourcePrefetchResult>& prefetched_resource_files,
|
| ppapi::PpapiPermissions permissions) {
|
| DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
|
|
| NaClFileToken nexe_token = {
|
| - launch_params.nexe_token_lo, // lo
|
| - launch_params.nexe_token_hi // hi
|
| + launch_params->nexe_token_lo, // lo
|
| + launch_params->nexe_token_hi // hi
|
| };
|
|
|
| - base::PlatformFile nexe_file =
|
| - IPC::PlatformFileForTransitToPlatformFile(launch_params.nexe_file);
|
| -
|
| NaClProcessHost* host = new NaClProcessHost(
|
| - GURL(launch_params.manifest_url),
|
| - base::File(nexe_file),
|
| - nexe_token,
|
| - prefetched_resource_files,
|
| - permissions,
|
| - launch_params.render_view_id,
|
| - launch_params.permission_bits,
|
| - launch_params.uses_nonsfi_mode,
|
| - off_the_record_,
|
| - launch_params.process_type,
|
| - profile_directory_);
|
| - GURL manifest_url(launch_params.manifest_url);
|
| + launch_params->manifest_url, std::move(launch_params->nexe_file),
|
| + nexe_token, prefetched_resource_files, permissions, render_process_id_,
|
| + launch_params->render_view_id, launch_params->permission_bits,
|
| + launch_params->uses_nonsfi_mode, off_the_record_,
|
| + launch_params->process_type, profile_directory_);
|
| base::FilePath manifest_path;
|
| // We're calling MapUrlToLocalFilePath with the non-blocking API
|
| // because we're running in the I/O thread. Ideally we'd use the other path,
|
| // which would cover more cases.
|
| nacl::NaClBrowser::GetDelegate()->MapUrlToLocalFilePath(
|
| - manifest_url,
|
| - false /* use_blocking_api */,
|
| - profile_directory_,
|
| - &manifest_path);
|
| - host->Launch(this, reply_msg, manifest_path);
|
| + launch_params->manifest_url, false /* use_blocking_api */,
|
| + profile_directory_, &manifest_path);
|
| + host->Launch(manifest_path, callback);
|
| }
|
|
|
| -void NaClHostMessageFilter::OnGetReadonlyPnaclFd(
|
| - const std::string& filename, bool is_executable, IPC::Message* reply_msg) {
|
| +void NaClHostImpl::GetReadonlyPnaclFd(
|
| + const std::string& filename,
|
| + bool is_executable,
|
| + const GetReadonlyPnaclFdCallback& callback) {
|
| // This posts a task to another thread, but the renderer will
|
| // block until the reply is sent.
|
| - nacl_file_host::GetReadonlyPnaclFd(this, filename, is_executable, reply_msg);
|
| + nacl_file_host::GetReadonlyPnaclFd(filename, is_executable, callback);
|
|
|
| // This is the first message we receive from the renderer once it knows we
|
| // want to use PNaCl, so start the translation cache initialization here.
|
| pnacl::PnaclHost::GetInstance()->Init();
|
| }
|
|
|
| -// Return the temporary file via a reply to the
|
| -// NaClHostMsg_NaClCreateTemporaryFile sync message.
|
| -void NaClHostMessageFilter::SyncReturnTemporaryFile(
|
| - IPC::Message* reply_msg,
|
| - base::File file) {
|
| - if (file.IsValid()) {
|
| - NaClHostMsg_NaClCreateTemporaryFile::WriteReplyParams(
|
| - reply_msg, IPC::TakePlatformFileForTransit(std::move(file)));
|
| - } else {
|
| - reply_msg->set_reply_error();
|
| - }
|
| - Send(reply_msg);
|
| -}
|
| -
|
| -void NaClHostMessageFilter::OnNaClCreateTemporaryFile(
|
| - IPC::Message* reply_msg) {
|
| - pnacl::PnaclHost::GetInstance()->CreateTemporaryFile(
|
| - base::Bind(&NaClHostMessageFilter::SyncReturnTemporaryFile,
|
| - this,
|
| - reply_msg));
|
| -}
|
| -
|
| -void NaClHostMessageFilter::AsyncReturnTemporaryFile(
|
| - int pp_instance,
|
| - const base::File& file,
|
| - bool is_hit) {
|
| - IPC::PlatformFileForTransit fd = IPC::InvalidPlatformFileForTransit();
|
| - if (file.IsValid()) {
|
| - // Don't close our copy of the handle, because PnaclHost will use it
|
| - // when the translation finishes.
|
| - fd = IPC::GetPlatformFileForTransit(file.GetPlatformFile(), false);
|
| - }
|
| - Send(new NaClViewMsg_NexeTempFileReply(pp_instance, is_hit, fd));
|
| +void NaClHostImpl::NaClCreateTemporaryFile(
|
| + const NaClCreateTemporaryFileCallback& callback) {
|
| + pnacl::PnaclHost::GetInstance()->CreateTemporaryFile(callback);
|
| }
|
|
|
| -void NaClHostMessageFilter::OnNaClGetNumProcessors(int* num_processors) {
|
| - *num_processors = base::SysInfo::NumberOfProcessors();
|
| +void NaClHostImpl::NaClGetNumProcessors(
|
| + const NaClGetNumProcessorsCallback& callback) {
|
| + callback.Run(base::SysInfo::NumberOfProcessors());
|
| }
|
|
|
| -void NaClHostMessageFilter::OnGetNexeFd(
|
| +void NaClHostImpl::NexeTempFileRequest(
|
| int render_view_id,
|
| int pp_instance,
|
| - const nacl::PnaclCacheInfo& cache_info) {
|
| + const PnaclCacheInfo& cache_info,
|
| + const NexeTempFileRequestCallback& callback) {
|
| if (!cache_info.pexe_url.is_valid()) {
|
| - LOG(ERROR) << "Bad URL received from GetNexeFd: " <<
|
| - cache_info.pexe_url.possibly_invalid_spec();
|
| - bad_message::ReceivedBadMessage(this,
|
| + LOG(ERROR) << "Bad URL received from GetNexeFd: "
|
| + << cache_info.pexe_url.possibly_invalid_spec();
|
| + // Mojo requires that the callback be called in all cases.
|
| + callback.Run(pp_instance, base::File(), false);
|
| + bad_message::ReceivedBadMessage(render_process_id_,
|
| bad_message::NHMF_GET_NEXE_FD_BAD_URL);
|
| return;
|
| }
|
|
|
| pnacl::PnaclHost::GetInstance()->GetNexeFd(
|
| - render_process_id_,
|
| - render_view_id,
|
| - pp_instance,
|
| - off_the_record_,
|
| - cache_info,
|
| - base::Bind(&NaClHostMessageFilter::AsyncReturnTemporaryFile,
|
| - this,
|
| - pp_instance));
|
| + render_process_id_, render_view_id, pp_instance, off_the_record_,
|
| + cache_info, base::Bind(callback, pp_instance));
|
| }
|
|
|
| -void NaClHostMessageFilter::OnTranslationFinished(int instance, bool success) {
|
| - pnacl::PnaclHost::GetInstance()->TranslationFinished(
|
| - render_process_id_, instance, success);
|
| +void NaClHostImpl::ReportTranslationFinished(int instance, bool success) {
|
| + pnacl::PnaclHost::GetInstance()->TranslationFinished(render_process_id_,
|
| + instance, success);
|
| }
|
|
|
| -void NaClHostMessageFilter::OnMissingArchError(int render_view_id) {
|
| - nacl::NaClBrowser::GetDelegate()->
|
| - ShowMissingArchInfobar(render_process_id_, render_view_id);
|
| +void NaClHostImpl::MissingArchError(int render_view_id) {
|
| + nacl::NaClBrowser::GetDelegate()->ShowMissingArchInfobar(render_process_id_,
|
| + render_view_id);
|
| }
|
|
|
| -void NaClHostMessageFilter::OnOpenNaClExecutable(
|
| +void NaClHostImpl::OpenNaClExecutable(
|
| int render_view_id,
|
| const GURL& file_url,
|
| bool enable_validation_caching,
|
| - IPC::Message* reply_msg) {
|
| - nacl_file_host::OpenNaClExecutable(this,
|
| - render_view_id,
|
| - file_url,
|
| - enable_validation_caching,
|
| - reply_msg);
|
| + const OpenNaClExecutableCallback& callback) {
|
| + nacl_file_host::OpenNaClExecutable(
|
| + render_view_id, file_url, enable_validation_caching, render_process_id_,
|
| + profile_directory_, base::ThreadTaskRunnerHandle::Get(), callback);
|
| }
|
|
|
| -void NaClHostMessageFilter::OnNaClDebugEnabledForURL(const GURL& nmf_url,
|
| - bool* should_debug) {
|
| - *should_debug =
|
| - nacl::NaClBrowser::GetDelegate()->URLMatchesDebugPatterns(nmf_url);
|
| +void NaClHostImpl::NaClDebugEnabledForURL(
|
| + const GURL& nmf_url,
|
| + const NaClDebugEnabledForURLCallback& callback) {
|
| + callback.Run(
|
| + nacl::NaClBrowser::GetDelegate()->URLMatchesDebugPatterns(nmf_url));
|
| }
|
|
|
| } // namespace nacl
|
|
|