Index: content/renderer/browser_plugin/guest_to_embedder_channel.h |
diff --git a/content/renderer/browser_plugin/guest_to_embedder_channel.h b/content/renderer/browser_plugin/guest_to_embedder_channel.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..10555952347b5200b05d70825e6a9bf973a07b29 |
--- /dev/null |
+++ b/content/renderer/browser_plugin/guest_to_embedder_channel.h |
@@ -0,0 +1,125 @@ |
+// 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 CONTENT_RENDERER_BROWSER_PLUGIN_GUEST_TO_EMBEDDER_CHANNEL_H_ |
+#define CONTENT_RENDERER_BROWSER_PLUGIN_GUEST_TO_EMBEDDER_CHANNEL_H_ |
+#pragma once |
+ |
+#include "base/memory/ref_counted.h" |
+#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" |
+#include "content/renderer/pepper/pepper_proxy_channel_delegate_impl.h" |
+#include "content/renderer/render_view_impl.h" |
+#include "ipc/ipc_channel_handle.h" |
+#include "ppapi/c/pp_bool.h" |
+#include "ppapi/c/pp_instance.h" |
+#include "ppapi/shared_impl/ppb_view_shared.h" |
+#include "ppapi/proxy/plugin_dispatcher.h" |
+#include "ppapi/proxy/serialized_var.h" |
+#include "ppapi/shared_impl/host_resource.h" |
+#include "ppapi/shared_impl/ppapi_preferences.h" |
+#include "ppapi/shared_impl/ppb_input_event_shared.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebGraphicsContext3D.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
+ |
+namespace content { |
+ |
+class BrowserPluginChannelManager; |
+ |
+// GuestToEmbedderChannel is a Dispatcher that sends and receives ppapi messages |
+// from the browser plugin embedder. It is reference counted because it is held |
+// by a RenderViewImpl which (indirectly) owns a PpapiCommandBufferProxy through |
+// a WebGraphicsContext3DCommandBufferImpl which is owned by WebKit. Since the |
+// lifetime of this context is less than the lifetime of the RenderViewImpl, we |
+// keep the GuestToEmbedderChannel alive as long as a RenderViewImpl has access |
+// to it. If the context is lost, then the PpapiCommandBufferProxy is destroyed |
+// and we can safely release the reference to this GuestToEmbedderChannel held |
+// by RenderViewImpl. |
+class GuestToEmbedderChannel |
+ : public ppapi::proxy::Dispatcher, |
+ public base::RefCounted<GuestToEmbedderChannel> { |
+ public: |
+ explicit GuestToEmbedderChannel(const std::string& embedder_channel_manager); |
+ |
+ virtual ~GuestToEmbedderChannel() { } |
+ |
+ // This must be called before anything else. Returns true on success. |
+ bool InitChannel(const IPC::ChannelHandle& channel_handle); |
+ |
+ // Creates a new WebGraphicsContext3DCommandBufferImpl and returns it. |
+ WebGraphicsContext3DCommandBufferImpl* CreateWebGraphicsContext3D( |
+ RenderViewImpl* render_view, |
+ const WebKit::WebGraphicsContext3D::Attributes& attributes, |
+ bool offscreen); |
+ |
+ // Inform the host to invalidate its plugin container after a swap buffer. |
+ void IssueSwapBuffers(const ppapi::HostResource& resource); |
+ |
+ // Request the receipt of events from the embedder renderer. |
+ void RequestInputEvents(PP_Instance instance); |
+ |
+ // Request a graphics context from the embedder renderer. |
+ bool CreateGraphicsContext( |
+ WebGraphicsContext3DCommandBufferImpl* context, |
+ const WebKit::WebGraphicsContext3D::Attributes& attributes, |
+ bool offscreen, |
+ RenderViewImpl* render_view); |
+ |
+ // Register the given RenderView with the given PP_Instance. |
+ void AddGuest(PP_Instance instance, RenderViewImpl* render_view); |
+ |
+ // Removes the guest with the given instance identifier from the |
+ // InstanceMap. |
+ void RemoveGuest(PP_Instance instance); |
+ |
+ // ppapi::proxy::Dispatcher implementation. |
+ virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; |
+ virtual bool Send(IPC::Message* message) OVERRIDE; |
+ virtual void OnChannelError() OVERRIDE; |
+ virtual bool IsPlugin() const; |
+ |
+ private: |
+ typedef std::map<PP_Instance, base::WeakPtr<RenderViewImpl> > InstanceMap; |
+ typedef std::map<int, int> RoutingIDToInstanceMap; |
+ |
+ void OnSupportsInterface(const std::string& interface_name, bool* result); |
+ void OnSetPreferences(const ppapi::Preferences& prefs); |
+ void OnReserveInstanceId(PP_Instance instance, bool* usable); |
+ void OnDidCreate(PP_Instance instance, |
+ const std::vector<std::string>& argn, |
+ const std::vector<std::string>& argv, |
+ PP_Bool* result); |
+ void OnDidDestroy(PP_Instance instance); |
+ void OnDidChangeView(PP_Instance instance, |
+ const ppapi::ViewData& new_data, |
+ PP_Bool flash_fullscreen); |
+ void OnDidChangeFocus(PP_Instance instance, PP_Bool has_focus); |
+ void OnGetInstanceObject(PP_Instance instance, |
+ ppapi::proxy::SerializedVarReturnValue result); |
+ |
+ void OnHandleMessage(PP_Instance instance, |
+ ppapi::proxy::SerializedVarReceiveInput data); |
+ |
+ void OnHandleFilteredInputEvent(PP_Instance instance, |
+ const ppapi::InputEventData& data, |
+ PP_Bool* result); |
+ |
+ void OnSwapBuffersACK(const ppapi::HostResource& context, |
+ int32_t pp_error); |
+ |
+ void OnContextLost(PP_Instance instance); |
+ |
+ base::WeakPtr<RenderViewImpl> render_view_; |
+ BrowserPluginChannelManager* channel_manager_; |
+ std::string embedder_channel_name_; |
+ PepperProxyChannelDelegateImpl delegate_; |
+ |
+ InstanceMap render_view_instances_; |
+ RoutingIDToInstanceMap routing_id_instance_map_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(GuestToEmbedderChannel); |
+}; |
+ |
+} // namespace content |
+ |
+#endif // CONTENT_RENDERER_BROWSER_PLUGIN_GUEST_TO_EMBEDDER_CHANNEL_H_ |