nacl_host_message_filter.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/sys_info.h"
80f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "components/nacl/browser/nacl_browser.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/nacl/browser/nacl_file_host.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/nacl/browser/nacl_process_host.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/nacl/browser/pnacl_host.h"
12a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "components/nacl/common/nacl_host_messages.h"
136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/public/browser/plugin_service.h"
156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/public/browser/web_contents.h"
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ipc/ipc_platform_file.h"
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "native_client/src/public/nacl_file_info.h"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/url_request/url_request_context.h"
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_permissions.h"
228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "url/gurl.h"
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace nacl {
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace {
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)ppapi::PpapiPermissions GetNaClPermissions(
296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    uint32 permission_bits,
306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    content::BrowserContext* browser_context,
316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const GURL& document_url) {
326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Only allow NaCl plugins to request certain permissions. We don't want
336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // a compromised renderer to be able to start a nacl plugin with e.g. Flash
346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // permissions which may expand the surface area of the sandbox.
356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  uint32 masked_bits = permission_bits & ppapi::PERMISSION_DEV;
366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (content::PluginService::GetInstance()->PpapiDevChannelSupported(
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          browser_context, document_url))
386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    masked_bits |= ppapi::PERMISSION_DEV_CHANNEL;
396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return ppapi::PpapiPermissions::GetForCommandLine(masked_bits);
406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)ppapi::PpapiPermissions GetPpapiPermissions(uint32 permission_bits,
446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                            int render_process_id,
456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                            int render_view_id) {
466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // We get the URL from WebContents from the RenderViewHost, since we don't
476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // have a BrowserPpapiHost yet.
486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  content::RenderProcessHost* host =
496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      content::RenderProcessHost::FromID(render_process_id);
506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  content::RenderViewHost* view_host =
516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      content::RenderViewHost::FromID(render_process_id, render_view_id);
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!view_host)
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return ppapi::PpapiPermissions();
546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  GURL document_url;
556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  content::WebContents* contents =
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      content::WebContents::FromRenderViewHost(view_host);
576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (contents)
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    document_url = contents->GetLastCommittedURL();
596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return GetNaClPermissions(permission_bits,
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                            host->GetBrowserContext(),
616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                            document_url);
626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace
656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)NaClHostMessageFilter::NaClHostMessageFilter(
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int render_process_id,
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    bool is_off_the_record,
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const base::FilePath& profile_directory,
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    net::URLRequestContextGetter* request_context)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : BrowserMessageFilter(NaClHostMsgStart),
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_process_id_(render_process_id),
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      off_the_record_(is_off_the_record),
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      profile_directory_(profile_directory),
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      request_context_(request_context),
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      weak_ptr_factory_(this) {
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)NaClHostMessageFilter::~NaClHostMessageFilter() {
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid NaClHostMessageFilter::OnChannelClosing() {
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pnacl::PnaclHost::GetInstance()->RendererClosing(render_process_id_);
84ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
85ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool NaClHostMessageFilter::OnMessageReceived(const IPC::Message& message) {
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool handled = true;
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(NaClHostMessageFilter, message)
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(DISABLE_NACL)
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClHostMsg_LaunchNaCl, OnLaunchNaCl)
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClHostMsg_GetReadonlyPnaclFD,
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    OnGetReadonlyPnaclFd)
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClHostMsg_NaClCreateTemporaryFile,
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    OnNaClCreateTemporaryFile)
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC_MESSAGE_HANDLER(NaClHostMsg_NexeTempFileRequest,
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        OnGetNexeFd)
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC_MESSAGE_HANDLER(NaClHostMsg_ReportTranslationFinished,
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        OnTranslationFinished)
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    IPC_MESSAGE_HANDLER(NaClHostMsg_MissingArchError,
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        OnMissingArchError)
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClHostMsg_OpenNaClExecutable,
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    OnOpenNaClExecutable)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(NaClHostMsg_NaClGetNumProcessors,
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        OnNaClGetNumProcessors)
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    IPC_MESSAGE_HANDLER(NaClHostMsg_NaClDebugEnabledForURL,
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                        OnNaClDebugEnabledForURL)
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return handled;
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)net::HostResolver* NaClHostMessageFilter::GetHostResolver() {
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return request_context_->GetURLRequestContext()->host_resolver();
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void NaClHostMessageFilter::OnLaunchNaCl(
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const nacl::NaClLaunchParams& launch_params,
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC::Message* reply_msg) {
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // If we're running llc or ld for the PNaCl translator, we don't need to look
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // up permissions, and we don't have the right browser state to look up some
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // of the whitelisting parameters anyway.
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!launch_params.uses_irt) {
1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    uint32 perms = launch_params.permission_bits & ppapi::PERMISSION_DEV;
1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    LaunchNaClContinuation(
1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        launch_params,
1286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        reply_msg,
1296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        ppapi::PpapiPermissions(perms));
1306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return;
1316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
1326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  content::BrowserThread::PostTaskAndReplyWithResult(
1336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      content::BrowserThread::UI,
1346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      FROM_HERE,
1356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Bind(&GetPpapiPermissions,
1366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 launch_params.permission_bits,
1376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 render_process_id_,
1386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 launch_params.render_view_id),
1396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Bind(&NaClHostMessageFilter::LaunchNaClContinuation,
1406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 this,
1416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 launch_params,
1426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 reply_msg));
1436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void NaClHostMessageFilter::LaunchNaClContinuation(
1466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const nacl::NaClLaunchParams& launch_params,
1476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    IPC::Message* reply_msg,
1486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ppapi::PpapiPermissions permissions) {
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NaClFileToken nexe_token = {
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      launch_params.nexe_token_lo,  // lo
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      launch_params.nexe_token_hi   // hi
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::PlatformFile nexe_file;
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_WIN)
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Duplicate the nexe file handle from the renderer process into the browser
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // process.
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!::DuplicateHandle(PeerHandle(),
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         launch_params.nexe_file,
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         base::GetCurrentProcessHandle(),
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         &nexe_file,
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         0,  // Unused, given DUPLICATE_SAME_ACCESS.
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         FALSE,
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    NaClHostMsg_LaunchNaCl::WriteReplyParams(
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        reply_msg,
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        NaClLaunchResult(),
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        std::string("Failed to duplicate nexe file handle"));
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Send(reply_msg);
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#elif defined(OS_POSIX)
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  nexe_file =
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      IPC::PlatformFileForTransitToPlatformFile(launch_params.nexe_file);
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#error Unsupported platform.
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  NaClProcessHost* host = new NaClProcessHost(
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GURL(launch_params.manifest_url),
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::File(nexe_file),
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      nexe_token,
1836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      permissions,
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      launch_params.render_view_id,
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      launch_params.permission_bits,
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      launch_params.uses_irt,
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      launch_params.uses_nonsfi_mode,
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      launch_params.enable_dyncode_syscalls,
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      launch_params.enable_exception_handling,
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      launch_params.enable_crash_throttling,
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      off_the_record_,
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      profile_directory_);
1938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  GURL manifest_url(launch_params.manifest_url);
1948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::FilePath manifest_path;
1958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // We're calling MapUrlToLocalFilePath with the non-blocking API
1968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // because we're running in the I/O thread. Ideally we'd use the other path,
1978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // which would cover more cases.
1980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  nacl::NaClBrowser::GetDelegate()->MapUrlToLocalFilePath(
199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      manifest_url,
200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      false /* use_blocking_api */,
201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      profile_directory_,
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      &manifest_path);
2038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  host->Launch(this, reply_msg, manifest_path);
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void NaClHostMessageFilter::OnGetReadonlyPnaclFd(
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& filename, bool is_executable, IPC::Message* reply_msg) {
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // This posts a task to another thread, but the renderer will
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // block until the reply is sent.
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  nacl_file_host::GetReadonlyPnaclFd(this, filename, is_executable, reply_msg);
211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
212ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // This is the first message we receive from the renderer once it knows we
213ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // want to use PNaCl, so start the translation cache initialization here.
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pnacl::PnaclHost::GetInstance()->Init();
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Return the temporary file via a reply to the
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// NaClHostMsg_NaClCreateTemporaryFile sync message.
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid NaClHostMessageFilter::SyncReturnTemporaryFile(
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC::Message* reply_msg,
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::File file) {
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (file.IsValid()) {
2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NaClHostMsg_NaClCreateTemporaryFile::WriteReplyParams(
224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        reply_msg,
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        IPC::TakeFileHandleForProcess(file.Pass(), PeerHandle()));
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    reply_msg->set_reply_error();
2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Send(reply_msg);
2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void NaClHostMessageFilter::OnNaClCreateTemporaryFile(
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC::Message* reply_msg) {
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pnacl::PnaclHost::GetInstance()->CreateTemporaryFile(
2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&NaClHostMessageFilter::SyncReturnTemporaryFile,
2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 this,
2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 reply_msg));
2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid NaClHostMessageFilter::AsyncReturnTemporaryFile(
241ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    int pp_instance,
24246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const base::File& file,
243ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    bool is_hit) {
24446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  IPC::PlatformFileForTransit fd = IPC::InvalidPlatformFileForTransit();
24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (file.IsValid()) {
24646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // Don't close our copy of the handle, because PnaclHost will use it
24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // when the translation finishes.
24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fd = IPC::GetFileHandleForProcess(file.GetPlatformFile(), PeerHandle(),
24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                      false);
25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  Send(new NaClViewMsg_NexeTempFileReply(pp_instance, is_hit, fd));
2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NaClHostMessageFilter::OnNaClGetNumProcessors(int* num_processors) {
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  *num_processors = base::SysInfo::NumberOfProcessors();
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid NaClHostMessageFilter::OnGetNexeFd(
2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int render_view_id,
260ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    int pp_instance,
2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const nacl::PnaclCacheInfo& cache_info) {
262ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!cache_info.pexe_url.is_valid()) {
263ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    LOG(ERROR) << "Bad URL received from GetNexeFd: " <<
264ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        cache_info.pexe_url.possibly_invalid_spec();
265ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    BadMessageReceived();
266ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
267ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pnacl::PnaclHost::GetInstance()->GetNexeFd(
270ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      render_process_id_,
271ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      render_view_id,
272ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      pp_instance,
273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      off_the_record_,
274ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      cache_info,
2757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&NaClHostMessageFilter::AsyncReturnTemporaryFile,
2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 this,
277ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                 pp_instance));
2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
280bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid NaClHostMessageFilter::OnTranslationFinished(int instance, bool success) {
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pnacl::PnaclHost::GetInstance()->TranslationFinished(
282bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      render_process_id_, instance, success);
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NaClHostMessageFilter::OnMissingArchError(int render_view_id) {
286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  nacl::NaClBrowser::GetDelegate()->
287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ShowMissingArchInfobar(render_process_id_, render_view_id);
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void NaClHostMessageFilter::OnOpenNaClExecutable(int render_view_id,
2917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                                 const GURL& file_url,
2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                                 IPC::Message* reply_msg) {
2938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  nacl_file_host::OpenNaClExecutable(this, render_view_id, file_url,
2948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                     reply_msg);
2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid NaClHostMessageFilter::OnNaClDebugEnabledForURL(const GURL& nmf_url,
298effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                     bool* should_debug) {
299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  *should_debug =
300effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      nacl::NaClBrowser::GetDelegate()->URLMatchesDebugPatterns(nmf_url);
301effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
302effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace nacl
304