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