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 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_PLUGIN_PLUGIN_CHANNEL_H_ 6 #define CONTENT_PLUGIN_PLUGIN_CHANNEL_H_ 7 8 #include <vector> 9 #include "base/memory/ref_counted.h" 10 #include "base/process/process.h" 11 #include "build/build_config.h" 12 #include "content/child/npapi/np_channel_base.h" 13 #include "content/child/scoped_child_process_reference.h" 14 #include "content/plugin/webplugin_delegate_stub.h" 15 16 namespace base { 17 class WaitableEvent; 18 } 19 20 namespace content { 21 22 // Encapsulates an IPC channel between the plugin process and one renderer 23 // process. On the renderer side there's a corresponding PluginChannelHost. 24 class PluginChannel : public NPChannelBase { 25 public: 26 // Get a new PluginChannel object for the current process to talk to the 27 // given renderer process. The renderer ID is an opaque unique ID generated 28 // by the browser. 29 static PluginChannel* GetPluginChannel( 30 int renderer_id, base::MessageLoopProxy* ipc_message_loop); 31 32 // Send a message to all renderers that the process is going to shutdown. 33 static void NotifyRenderersOfPendingShutdown(); 34 35 // IPC::Listener: 36 virtual bool Send(IPC::Message* msg) OVERRIDE; 37 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 38 virtual void OnChannelError() OVERRIDE; 39 renderer_id()40 int renderer_id() { return renderer_id_; } 41 42 virtual int GenerateRouteID() OVERRIDE; 43 44 // Returns the event that's set when a call to the renderer causes a modal 45 // dialog to come up. 46 virtual base::WaitableEvent* GetModalDialogEvent(int render_view_id) OVERRIDE; 47 in_send()48 bool in_send() { return in_send_ != 0; } 49 incognito()50 bool incognito() { return incognito_; } set_incognito(bool value)51 void set_incognito(bool value) { incognito_ = value; } 52 53 #if defined(OS_POSIX) TakeRendererFileDescriptor()54 int TakeRendererFileDescriptor() { 55 return channel_->TakeClientFileDescriptor(); 56 } 57 #endif 58 59 protected: 60 virtual ~PluginChannel(); 61 62 // NPChannelBase:: 63 virtual void CleanUp() OVERRIDE; 64 virtual bool Init(base::MessageLoopProxy* ipc_message_loop, 65 bool create_pipe_now, 66 base::WaitableEvent* shutdown_event) OVERRIDE; 67 68 private: 69 class MessageFilter; 70 71 // Called on the plugin thread 72 PluginChannel(); 73 74 virtual bool OnControlMessageReceived(const IPC::Message& msg) OVERRIDE; 75 ClassFactory()76 static NPChannelBase* ClassFactory() { return new PluginChannel(); } 77 78 void OnCreateInstance(const std::string& mime_type, int* instance_id); 79 void OnDestroyInstance(int instance_id, IPC::Message* reply_msg); 80 void OnGenerateRouteID(int* route_id); 81 void OnClearSiteData(const std::string& site, 82 uint64 flags, 83 uint64 max_age); 84 void OnDidAbortLoading(int render_view_id); 85 86 std::vector<scoped_refptr<WebPluginDelegateStub> > plugin_stubs_; 87 88 ScopedChildProcessReference process_ref_; 89 90 // The id of the renderer who is on the other side of the channel. 91 int renderer_id_; 92 93 int in_send_; // Tracks if we're in a Send call. 94 bool log_messages_; // True if we should log sent and received messages. 95 bool incognito_; // True if the renderer is in incognito mode. 96 scoped_refptr<MessageFilter> filter_; // Handles the modal dialog events. 97 98 // Dummy NPP value used in the plugin process to represent entities other 99 // that other plugin instances for the purpose of object ownership tracking. 100 scoped_ptr<struct _NPP> npp_; 101 102 DISALLOW_COPY_AND_ASSIGN(PluginChannel); 103 }; 104 105 } // namespace content 106 107 #endif // CONTENT_PLUGIN_PLUGIN_CHANNEL_H_ 108