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