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