nacl_host_message_filter.cc revision f2477e01787aa58f445919b809d89e252beef54f
17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/nacl/browser/nacl_host_message_filter.h"
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
70f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "components/nacl/browser/nacl_browser.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/nacl/browser/nacl_file_host.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/nacl/browser/nacl_process_host.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/nacl/browser/pnacl_host.h"
11a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "components/nacl/common/nacl_host_messages.h"
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ipc/ipc_platform_file.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/url_request/url_request_context.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "url/gurl.h"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace nacl {
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)NaClHostMessageFilter::NaClHostMessageFilter(
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int render_process_id,
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    bool is_off_the_record,
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const base::FilePath& profile_directory,
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    net::URLRequestContextGetter* request_context)
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : render_process_id_(render_process_id),
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      off_the_record_(is_off_the_record),
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      profile_directory_(profile_directory),
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      request_context_(request_context),
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      weak_ptr_factory_(this) {
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)NaClHostMessageFilter::~NaClHostMessageFilter() {
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid NaClHostMessageFilter::OnChannelClosing() {
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pnacl::PnaclHost::GetInstance()->RendererClosing(render_process_id_);
36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool NaClHostMessageFilter::OnMessageReceived(const IPC::Message& message,
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                              bool* message_was_ok) {
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool handled = true;
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP_EX(NaClHostMessageFilter, message, *message_was_ok)
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(DISABLE_NACL)
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClHostMsg_LaunchNaCl, OnLaunchNaCl)
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClHostMsg_GetReadonlyPnaclFD,
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    OnGetReadonlyPnaclFd)
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClHostMsg_NaClCreateTemporaryFile,
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    OnNaClCreateTemporaryFile)
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC_MESSAGE_HANDLER(NaClHostMsg_NexeTempFileRequest,
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        OnGetNexeFd)
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC_MESSAGE_HANDLER(NaClHostMsg_ReportTranslationFinished,
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        OnTranslationFinished)
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC_MESSAGE_HANDLER(NaClHostMsg_NaClErrorStatus, OnNaClErrorStatus)
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClHostMsg_OpenNaClExecutable,
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    OnOpenNaClExecutable)
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return handled;
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)net::HostResolver* NaClHostMessageFilter::GetHostResolver() {
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return request_context_->GetURLRequestContext()->host_resolver();
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(DISABLE_NACL)
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void NaClHostMessageFilter::OnLaunchNaCl(
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const nacl::NaClLaunchParams& launch_params,
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC::Message* reply_msg) {
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  NaClProcessHost* host = new NaClProcessHost(
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GURL(launch_params.manifest_url),
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      launch_params.render_view_id,
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      launch_params.permission_bits,
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      launch_params.uses_irt,
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      launch_params.enable_dyncode_syscalls,
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      launch_params.enable_exception_handling,
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      launch_params.enable_crash_throttling,
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      off_the_record_,
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      profile_directory_);
808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  GURL manifest_url(launch_params.manifest_url);
818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::FilePath manifest_path;
828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // We're calling MapUrlToLocalFilePath with the non-blocking API
838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // because we're running in the I/O thread. Ideally we'd use the other path,
848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // which would cover more cases.
850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  nacl::NaClBrowser::GetDelegate()->MapUrlToLocalFilePath(
868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      manifest_url, false /* use_blocking_api */, &manifest_path);
878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  host->Launch(this, reply_msg, manifest_path);
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void NaClHostMessageFilter::OnGetReadonlyPnaclFd(
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& filename, IPC::Message* reply_msg) {
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // This posts a task to another thread, but the renderer will
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // block until the reply is sent.
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  nacl_file_host::GetReadonlyPnaclFd(this, filename, reply_msg);
95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // This is the first message we receive from the renderer once it knows we
97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // want to use PNaCl, so start the translation cache initialization here.
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pnacl::PnaclHost::GetInstance()->Init();
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Return the temporary file via a reply to the
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// NaClHostMsg_NaClCreateTemporaryFile sync message.
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid NaClHostMessageFilter::SyncReturnTemporaryFile(
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC::Message* reply_msg,
105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::PlatformFile fd) {
106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (fd == base::kInvalidPlatformFileValue) {
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    reply_msg->set_reply_error();
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NaClHostMsg_NaClCreateTemporaryFile::WriteReplyParams(
110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        reply_msg,
111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        IPC::GetFileHandleForProcess(fd, PeerHandle(), true));
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Send(reply_msg);
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void NaClHostMessageFilter::OnNaClCreateTemporaryFile(
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC::Message* reply_msg) {
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pnacl::PnaclHost::GetInstance()->CreateTemporaryFile(
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&NaClHostMessageFilter::SyncReturnTemporaryFile,
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 this,
1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 reply_msg));
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid NaClHostMessageFilter::AsyncReturnTemporaryFile(
125ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    int pp_instance,
126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::PlatformFile fd,
127ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    bool is_hit) {
128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  Send(new NaClViewMsg_NexeTempFileReply(
129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      pp_instance,
130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      is_hit,
131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      // Don't close our copy of the handle, because PnaclHost will use it
132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      // when the translation finishes.
133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      IPC::GetFileHandleForProcess(fd, PeerHandle(), false)));
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid NaClHostMessageFilter::OnGetNexeFd(
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int render_view_id,
138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    int pp_instance,
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const nacl::PnaclCacheInfo& cache_info) {
140ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!cache_info.pexe_url.is_valid()) {
141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    LOG(ERROR) << "Bad URL received from GetNexeFd: " <<
142ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        cache_info.pexe_url.possibly_invalid_spec();
143ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    BadMessageReceived();
144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pnacl::PnaclHost::GetInstance()->GetNexeFd(
148ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      render_process_id_,
149ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      render_view_id,
150ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      pp_instance,
151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      off_the_record_,
152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      cache_info,
1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&NaClHostMessageFilter::AsyncReturnTemporaryFile,
1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 this,
155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                 pp_instance));
1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
158bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid NaClHostMessageFilter::OnTranslationFinished(int instance, bool success) {
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pnacl::PnaclHost::GetInstance()->TranslationFinished(
160bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      render_process_id_, instance, success);
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void NaClHostMessageFilter::OnNaClErrorStatus(int render_view_id,
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                              int error_id) {
1650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  nacl::NaClBrowser::GetDelegate()->ShowNaClInfobar(render_process_id_,
1660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                                    render_view_id, error_id);
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void NaClHostMessageFilter::OnOpenNaClExecutable(int render_view_id,
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                                 const GURL& file_url,
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                                 IPC::Message* reply_msg) {
1728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  nacl_file_host::OpenNaClExecutable(this, render_view_id, file_url,
1738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                     reply_msg);
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace nacl
178