15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_PLUGIN_PLUGIN_CHANNEL_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_PLUGIN_PLUGIN_CHANNEL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_handle.h" 1158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "base/process/process.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/np_channel_base.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/plugin/webplugin_delegate_stub.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WaitableEvent; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Encapsulates an IPC channel between the plugin process and one renderer 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// process. On the renderer side there's a corresponding PluginChannelHost. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginChannel : public NPChannelBase { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get a new PluginChannel object for the current process to talk to the 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // given renderer process. The renderer ID is an opaque unique ID generated 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by the browser. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static PluginChannel* GetPluginChannel( 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int renderer_id, base::MessageLoopProxy* ipc_message_loop); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send a message to all renderers that the process is going to shutdown. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void NotifyRenderersOfPendingShutdown(); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IPC::Listener: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Send(IPC::Message* msg) OVERRIDE; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnChannelError() OVERRIDE; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int renderer_id() { return renderer_id_; } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GenerateRouteID() OVERRIDE; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the event that's set when a call to the renderer causes a modal 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dialog to come up. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual base::WaitableEvent* GetModalDialogEvent(int render_view_id) OVERRIDE; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool in_send() { return in_send_ != 0; } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool incognito() { return incognito_; } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_incognito(bool value) { incognito_ = value; } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int TakeRendererFileDescriptor() { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return channel_->TakeClientFileDescriptor(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PluginChannel(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NPChannelBase:: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CleanUp() OVERRIDE; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Init(base::MessageLoopProxy* ipc_message_loop, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool create_pipe_now, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent* shutdown_event) OVERRIDE; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MessageFilter; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called on the plugin thread 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginChannel(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnControlMessageReceived(const IPC::Message& msg) OVERRIDE; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static NPChannelBase* ClassFactory() { return new PluginChannel(); } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCreateInstance(const std::string& mime_type, int* instance_id); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDestroyInstance(int instance_id, IPC::Message* reply_msg); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnGenerateRouteID(int* route_id); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnClearSiteData(const std::string& site, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 flags, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 max_age); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<scoped_refptr<WebPluginDelegateStub> > plugin_stubs_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The id of the renderer who is on the other side of the channel. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int renderer_id_; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int in_send_; // Tracks if we're in a Send call. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool log_messages_; // True if we should log sent and received messages. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool incognito_; // True if the renderer is in incognito mode. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MessageFilter> filter_; // Handles the modal dialog events. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Dummy NPP value used in the plugin process to represent entities other 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // that other plugin instances for the purpose of object ownership tracking. 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<struct _NPP> npp_; 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PluginChannel); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_PLUGIN_PLUGIN_CHANNEL_H_ 105