1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/renderer/pepper/pepper_shared_memory_message_filter.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/memory/shared_memory.h"
9 #include "base/process/process_handle.h"
10 #include "content/public/common/content_client.h"
11 #include "content/public/renderer/pepper_plugin_instance.h"
12 #include "content/public/renderer/render_thread.h"
13 #include "content/public/renderer/renderer_ppapi_host.h"
14 #include "ppapi/host/ppapi_host.h"
15 #include "ppapi/proxy/ppapi_messages.h"
16 #include "ppapi/shared_impl/var_tracker.h"
18 PepperSharedMemoryMessageFilter::PepperSharedMemoryMessageFilter(
19 content::RendererPpapiHost* host)
20 : InstanceMessageFilter(host->GetPpapiHost()), host_(host) {}
22 PepperSharedMemoryMessageFilter::~PepperSharedMemoryMessageFilter() {}
24 bool PepperSharedMemoryMessageFilter::OnInstanceMessageReceived(
25 const IPC::Message& msg) {
27 IPC_BEGIN_MESSAGE_MAP(PepperSharedMemoryMessageFilter, msg)
28 IPC_MESSAGE_HANDLER(PpapiHostMsg_SharedMemory_CreateSharedMemory,
29 OnHostMsgCreateSharedMemory)
30 IPC_MESSAGE_UNHANDLED(handled = false)
35 bool PepperSharedMemoryMessageFilter::Send(IPC::Message* msg) {
36 return host_->GetPpapiHost()->Send(msg);
39 void PepperSharedMemoryMessageFilter::OnHostMsgCreateSharedMemory(
43 ppapi::proxy::SerializedHandle* plugin_handle) {
44 plugin_handle->set_null_shmem();
46 scoped_ptr<base::SharedMemory> shm(content::RenderThread::Get()
47 ->HostAllocateSharedMemoryBuffer(size)
52 base::SharedMemoryHandle host_shm_handle;
53 shm->ShareToProcess(base::GetCurrentProcessHandle(), &host_shm_handle);
55 content::PepperPluginInstance::Get(instance)
57 ->TrackSharedMemoryHandle(instance, host_shm_handle, size);
59 base::PlatformFile host_handle =
62 #elif defined(OS_POSIX)
65 #error Not implemented.
67 // We set auto_close to false since we need our file descriptor to
68 // actually be duplicated on linux. The shared memory destructor will
69 // close the original handle for us.
70 plugin_handle->set_shmem(host_->ShareHandleWithRemote(host_handle, false),