| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef PPAPI_HOST_PPAPI_HOST_H_ | |
| #define PPAPI_HOST_PPAPI_HOST_H_ | |
| #include <map> | |
| #include <memory> | |
| #include <vector> | |
| #include "base/compiler_specific.h" | |
| #include "base/macros.h" | |
| #include "base/observer_list.h" | |
| #include "ipc/ipc_listener.h" | |
| #include "ipc/ipc_sender.h" | |
| #include "ppapi/c/pp_instance.h" | |
| #include "ppapi/c/pp_resource.h" | |
| #include "ppapi/host/ppapi_host_export.h" | |
| #include "ppapi/shared_impl/ppapi_permissions.h" | |
| namespace ppapi { | |
| namespace proxy { | |
| class ResourceMessageCallParams; | |
| class SerializedHandle; | |
| } | |
| namespace host { | |
| class HostFactory; | |
| struct HostMessageContext; | |
| class InstanceMessageFilter; | |
| struct ReplyMessageContext; | |
| class ResourceHost; | |
| // The host provides routing and tracking for resource message calls that | |
| // come from the plugin to the host (browser or renderer), and the | |
| // corresponding replies. | |
| class PPAPI_HOST_EXPORT PpapiHost : public IPC::Sender, public IPC::Listener { | |
| public: | |
| // The sender is the channel to the plugin for outgoing messages. | |
| // Normally the creator will add filters for resource creation messages | |
| // (AddHostFactoryFilter) and instance messages (AddInstanceMessageFilter) | |
| // after construction. | |
| PpapiHost(IPC::Sender* sender, const PpapiPermissions& perms); | |
| ~PpapiHost() override; | |
| const PpapiPermissions& permissions() const { return permissions_; } | |
| // Sender implementation. Forwards to the sender_. | |
| bool Send(IPC::Message* msg) override; | |
| // Listener implementation. | |
| bool OnMessageReceived(const IPC::Message& msg) override; | |
| // Sends the given reply message to the plugin. | |
| void SendReply(const ReplyMessageContext& context, | |
| const IPC::Message& msg); | |
| // Sends the given unsolicited reply message to the plugin. | |
| void SendUnsolicitedReply(PP_Resource resource, const IPC::Message& msg); | |
| // Similar to |SendUnsolicitedReply()|, but also sends handles. | |
| void SendUnsolicitedReplyWithHandles( | |
| PP_Resource resource, | |
| const IPC::Message& msg, | |
| std::vector<proxy::SerializedHandle>* handles); | |
| // Create a ResourceHost with the given |nested_msg|. | |
| std::unique_ptr<ResourceHost> CreateResourceHost( | |
| PP_Resource resource, | |
| PP_Instance instance, | |
| const IPC::Message& nested_msg); | |
| // Adds the given host resource as a pending one (with no corresponding | |
| // PluginResource object and no PP_Resource ID yet). The pending resource ID | |
| // is returned. See PpapiHostMsg_AttachToPendingHost. | |
| int AddPendingResourceHost(std::unique_ptr<ResourceHost> resource_host); | |
| // Adds the given host factory filter to the host. The PpapiHost will take | |
| // ownership of the pointer. | |
| void AddHostFactoryFilter(std::unique_ptr<HostFactory> filter); | |
| // Adds the given message filter to the host. The PpapiHost will take | |
| // ownership of the pointer. | |
| void AddInstanceMessageFilter(std::unique_ptr<InstanceMessageFilter> filter); | |
| // Returns null if the resource doesn't exist. | |
| host::ResourceHost* GetResourceHost(PP_Resource resource) const; | |
| private: | |
| friend class InstanceMessageFilter; | |
| void HandleResourceCall( | |
| const proxy::ResourceMessageCallParams& params, | |
| const IPC::Message& nested_msg, | |
| HostMessageContext* context); | |
| // Message handlers. | |
| void OnHostMsgResourceCall(const proxy::ResourceMessageCallParams& params, | |
| const IPC::Message& nested_msg); | |
| void OnHostMsgInProcessResourceCall( | |
| int routing_id, | |
| const proxy::ResourceMessageCallParams& params, | |
| const IPC::Message& nested_msg); | |
| void OnHostMsgResourceSyncCall( | |
| const proxy::ResourceMessageCallParams& params, | |
| const IPC::Message& nested_msg, | |
| IPC::Message* reply_msg); | |
| void OnHostMsgResourceCreated(const proxy::ResourceMessageCallParams& param, | |
| PP_Instance instance, | |
| const IPC::Message& nested_msg); | |
| void OnHostMsgAttachToPendingHost(PP_Resource resource, int pending_host_id); | |
| void OnHostMsgResourceDestroyed(PP_Resource resource); | |
| // Non-owning pointer. | |
| IPC::Sender* sender_; | |
| PpapiPermissions permissions_; | |
| // Filters for resource creation messages. Note that since we don't support | |
| // deleting these dynamically we don't need to worry about modifications | |
| // during iteration. If we add that capability, this should be replaced with | |
| // an base::ObserverList. | |
| std::vector<std::unique_ptr<HostFactory>> host_factory_filters_; | |
| // Filters for instance messages. Note that since we don't support deleting | |
| // these dynamically we don't need to worry about modifications during | |
| // iteration. If we add that capability, this should be replaced with an | |
| // base::ObserverList. | |
| std::vector<std::unique_ptr<InstanceMessageFilter>> instance_message_filters_; | |
| typedef std::map<PP_Resource, std::unique_ptr<ResourceHost>> ResourceMap; | |
| ResourceMap resources_; | |
| // Resources that have been created in the host and have not yet had the | |
| // corresponding PluginResource associated with them. | |
| // See PpapiHostMsg_AttachToPendingHost. | |
| typedef std::map<int, std::unique_ptr<ResourceHost>> PendingHostResourceMap; | |
| PendingHostResourceMap pending_resource_hosts_; | |
| int next_pending_resource_host_id_; | |
| DISALLOW_COPY_AND_ASSIGN(PpapiHost); | |
| }; | |
| } // namespace host | |
| } // namespace ppapi | |
| #endif // PPAPI_HOST_PPAPIE_HOST_H_ |