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)
5bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#ifndef CONTENT_RENDERER_NPAPI_PLUGIN_CHANNEL_HOST_H_
6bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#define CONTENT_RENDERER_NPAPI_PLUGIN_CHANNEL_HOST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/np_channel_base.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_channel_handle.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NPObjectBase;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Encapsulates an IPC channel between the renderer and one plugin process.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On the plugin side there's a corresponding PluginChannel.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginChannelHost : public NPChannelBase {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(shess): Debugging for http://crbug.com/97285 .  See comment
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in plugin_channel_host.cc.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool* GetRemoveTrackingFlag();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static PluginChannelHost* GetPluginChannelHost(
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const IPC::ChannelHandle& channel_handle,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::MessageLoopProxy* ipc_message_loop);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Init(base::MessageLoopProxy* ipc_message_loop,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    bool create_pipe_now,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    base::WaitableEvent* shutdown_event) OVERRIDE;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GenerateRouteID() OVERRIDE;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddRoute(int route_id, IPC::Listener* listener,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                NPObjectBase* npobject);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveRoute(int route_id);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NPChannelBase override:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Send(IPC::Message* msg) OVERRIDE;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Listener override
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnChannelError() OVERRIDE;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void Broadcast(IPC::Message* message) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NPChannelBase::Broadcast(message);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool expecting_shutdown() { return expecting_shutdown_; }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called on the render thread
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginChannelHost();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PluginChannelHost();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static NPChannelBase* ClassFactory() { return new PluginChannelHost(); }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnControlMessageReceived(const IPC::Message& message) OVERRIDE;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetException(const std::string& message);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPluginShuttingDown();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep track of all the registered WebPluginDelegeProxies to
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // inform about OnChannelError
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::hash_map<int, IPC::Listener*> ProxyMap;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyMap proxies_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if we are expecting the plugin process to go away - in which case,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't treat it as a crash.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool expecting_shutdown_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PluginChannelHost);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif  // CONTENT_RENDERER_NPAPI_PLUGIN_CHANNEL_HOST_H_
76