| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ppapi/host/ppapi_host.h" | 5 #include "ppapi/host/ppapi_host.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "ppapi/c/pp_errors.h" | 8 #include "ppapi/c/pp_errors.h" |
| 9 #include "ppapi/host/host_factory.h" | 9 #include "ppapi/host/host_factory.h" |
| 10 #include "ppapi/host/host_message_context.h" | 10 #include "ppapi/host/host_message_context.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 | 21 |
| 22 // Put a cap on the maximum number of resources so we don't explode if the | 22 // Put a cap on the maximum number of resources so we don't explode if the |
| 23 // renderer starts spamming us. | 23 // renderer starts spamming us. |
| 24 const size_t kMaxResourcesPerPlugin = 1 << 14; | 24 const size_t kMaxResourcesPerPlugin = 1 << 14; |
| 25 | 25 |
| 26 } // namespace | 26 } // namespace |
| 27 | 27 |
| 28 PpapiHost::PpapiHost(IPC::Sender* sender, | 28 PpapiHost::PpapiHost(IPC::Sender* sender, |
| 29 const PpapiPermissions& perms) | 29 const PpapiPermissions& perms) |
| 30 : sender_(sender), | 30 : sender_(sender), |
| 31 permissions_(perms) { | 31 permissions_(perms), |
| 32 next_pending_resource_host_id_(1) { |
| 32 } | 33 } |
| 33 | 34 |
| 34 PpapiHost::~PpapiHost() { | 35 PpapiHost::~PpapiHost() { |
| 35 // Delete these explicitly before destruction since then the host is still | 36 // Delete these explicitly before destruction since then the host is still |
| 36 // technically alive in case one of the filters accesses us from the | 37 // technically alive in case one of the filters accesses us from the |
| 37 // destructor. | 38 // destructor. |
| 38 instance_message_filters_.clear(); | 39 instance_message_filters_.clear(); |
| 39 } | 40 } |
| 40 | 41 |
| 41 bool PpapiHost::Send(IPC::Message* msg) { | 42 bool PpapiHost::Send(IPC::Message* msg) { |
| 42 return sender_->Send(msg); | 43 return sender_->Send(msg); |
| 43 } | 44 } |
| 44 | 45 |
| 45 bool PpapiHost::OnMessageReceived(const IPC::Message& msg) { | 46 bool PpapiHost::OnMessageReceived(const IPC::Message& msg) { |
| 46 bool handled = true; | 47 bool handled = true; |
| 47 IPC_BEGIN_MESSAGE_MAP(PpapiHost, msg) | 48 IPC_BEGIN_MESSAGE_MAP(PpapiHost, msg) |
| 48 IPC_MESSAGE_HANDLER(PpapiHostMsg_ResourceCall, | 49 IPC_MESSAGE_HANDLER(PpapiHostMsg_ResourceCall, |
| 49 OnHostMsgResourceCall) | 50 OnHostMsgResourceCall) |
| 50 IPC_MESSAGE_HANDLER_DELAY_REPLY(PpapiHostMsg_ResourceSyncCall, | 51 IPC_MESSAGE_HANDLER_DELAY_REPLY(PpapiHostMsg_ResourceSyncCall, |
| 51 OnHostMsgResourceSyncCall) | 52 OnHostMsgResourceSyncCall) |
| 52 IPC_MESSAGE_HANDLER(PpapiHostMsg_ResourceCreated, | 53 IPC_MESSAGE_HANDLER(PpapiHostMsg_ResourceCreated, |
| 53 OnHostMsgResourceCreated) | 54 OnHostMsgResourceCreated) |
| 55 IPC_MESSAGE_HANDLER(PpapiHostMsg_AttachToPendingHost, |
| 56 OnHostMsgAttachToPendingHost) |
| 54 IPC_MESSAGE_HANDLER(PpapiHostMsg_ResourceDestroyed, | 57 IPC_MESSAGE_HANDLER(PpapiHostMsg_ResourceDestroyed, |
| 55 OnHostMsgResourceDestroyed) | 58 OnHostMsgResourceDestroyed) |
| 56 IPC_MESSAGE_UNHANDLED(handled = false) | 59 IPC_MESSAGE_UNHANDLED(handled = false) |
| 57 IPC_END_MESSAGE_MAP() | 60 IPC_END_MESSAGE_MAP() |
| 58 | 61 |
| 59 if (!handled) { | 62 if (!handled) { |
| 60 for (size_t i = 0; i < instance_message_filters_.size(); i++) { | 63 for (size_t i = 0; i < instance_message_filters_.size(); i++) { |
| 61 if (instance_message_filters_[i]->OnInstanceMessageReceived(msg)) { | 64 if (instance_message_filters_[i]->OnInstanceMessageReceived(msg)) { |
| 62 handled = true; | 65 handled = true; |
| 63 break; | 66 break; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 74 PpapiHostMsg_ResourceSyncCall::WriteReplyParams(context.sync_reply_msg, | 77 PpapiHostMsg_ResourceSyncCall::WriteReplyParams(context.sync_reply_msg, |
| 75 context.params, msg); | 78 context.params, msg); |
| 76 Send(context.sync_reply_msg); | 79 Send(context.sync_reply_msg); |
| 77 } else { | 80 } else { |
| 78 Send(new PpapiPluginMsg_ResourceReply(context.params, msg)); | 81 Send(new PpapiPluginMsg_ResourceReply(context.params, msg)); |
| 79 } | 82 } |
| 80 } | 83 } |
| 81 | 84 |
| 82 void PpapiHost::SendUnsolicitedReply(PP_Resource resource, | 85 void PpapiHost::SendUnsolicitedReply(PP_Resource resource, |
| 83 const IPC::Message& msg) { | 86 const IPC::Message& msg) { |
| 87 DCHECK(resource); // If this fails, host is probably pending. |
| 84 proxy::ResourceMessageReplyParams params(resource, 0); | 88 proxy::ResourceMessageReplyParams params(resource, 0); |
| 85 Send(new PpapiPluginMsg_ResourceReply(params, msg)); | 89 Send(new PpapiPluginMsg_ResourceReply(params, msg)); |
| 86 } | 90 } |
| 87 | 91 |
| 92 int PpapiHost::AddPendingResourceHost(scoped_ptr<ResourceHost> resource_host) { |
| 93 // The resource ID should not be assigned. |
| 94 DCHECK(resource_host->pp_resource() == 0); |
| 95 |
| 96 int pending_id = next_pending_resource_host_id_++; |
| 97 pending_resource_hosts_[pending_id] = |
| 98 linked_ptr<ResourceHost>(resource_host.release()); |
| 99 return pending_id; |
| 100 } |
| 101 |
| 88 void PpapiHost::AddHostFactoryFilter(scoped_ptr<HostFactory> filter) { | 102 void PpapiHost::AddHostFactoryFilter(scoped_ptr<HostFactory> filter) { |
| 89 host_factory_filters_.push_back(filter.release()); | 103 host_factory_filters_.push_back(filter.release()); |
| 90 } | 104 } |
| 91 | 105 |
| 92 void PpapiHost::AddInstanceMessageFilter( | 106 void PpapiHost::AddInstanceMessageFilter( |
| 93 scoped_ptr<InstanceMessageFilter> filter) { | 107 scoped_ptr<InstanceMessageFilter> filter) { |
| 94 instance_message_filters_.push_back(filter.release()); | 108 instance_message_filters_.push_back(filter.release()); |
| 95 } | 109 } |
| 96 | 110 |
| 97 void PpapiHost::OnHostMsgResourceCall( | 111 void PpapiHost::OnHostMsgResourceCall( |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 resource_host = host_factory_filters_[i]->CreateResourceHost( | 158 resource_host = host_factory_filters_[i]->CreateResourceHost( |
| 145 this, params, instance, nested_msg).Pass(); | 159 this, params, instance, nested_msg).Pass(); |
| 146 if (resource_host.get()) | 160 if (resource_host.get()) |
| 147 break; | 161 break; |
| 148 } | 162 } |
| 149 if (!resource_host.get()) { | 163 if (!resource_host.get()) { |
| 150 NOTREACHED(); | 164 NOTREACHED(); |
| 151 return; | 165 return; |
| 152 } | 166 } |
| 153 | 167 |
| 168 // Resource should have been assigned a nonzero PP_Resource. |
| 169 DCHECK(resource_host->pp_resource()); |
| 170 |
| 154 resources_[params.pp_resource()] = | 171 resources_[params.pp_resource()] = |
| 155 linked_ptr<ResourceHost>(resource_host.release()); | 172 linked_ptr<ResourceHost>(resource_host.release()); |
| 156 } | 173 } |
| 157 | 174 |
| 175 void PpapiHost::OnHostMsgAttachToPendingHost(PP_Resource pp_resource, |
| 176 int pending_host_id) { |
| 177 PendingHostResourceMap::iterator found = |
| 178 pending_resource_hosts_.find(pending_host_id); |
| 179 if (found == pending_resource_hosts_.end()) { |
| 180 // Plugin sent a bad ID. |
| 181 NOTREACHED(); |
| 182 return; |
| 183 } |
| 184 found->second->SetPPResourceForPendingHost(pp_resource); |
| 185 resources_[pp_resource] = found->second; |
| 186 pending_resource_hosts_.erase(found); |
| 187 } |
| 188 |
| 158 void PpapiHost::OnHostMsgResourceDestroyed(PP_Resource resource) { | 189 void PpapiHost::OnHostMsgResourceDestroyed(PP_Resource resource) { |
| 159 ResourceMap::iterator found = resources_.find(resource); | 190 ResourceMap::iterator found = resources_.find(resource); |
| 160 if (found == resources_.end()) { | 191 if (found == resources_.end()) { |
| 161 NOTREACHED(); | 192 NOTREACHED(); |
| 162 return; | 193 return; |
| 163 } | 194 } |
| 164 resources_.erase(found); | 195 resources_.erase(found); |
| 165 } | 196 } |
| 166 | 197 |
| 167 ResourceHost* PpapiHost::GetResourceHost(PP_Resource resource) const { | 198 ResourceHost* PpapiHost::GetResourceHost(PP_Resource resource) const { |
| 168 ResourceMap::const_iterator found = resources_.find(resource); | 199 ResourceMap::const_iterator found = resources_.find(resource); |
| 169 return found == resources_.end() ? NULL : found->second.get(); | 200 return found == resources_.end() ? NULL : found->second.get(); |
| 170 } | 201 } |
| 171 | 202 |
| 172 } // namespace host | 203 } // namespace host |
| 173 } // namespace ppapi | 204 } // namespace ppapi |
| OLD | NEW |