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_RENDERER_BROWSER_PLUGIN_BROWSER_PLUGIN_MANAGER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_RENDERER_BROWSER_PLUGIN_BROWSER_PLUGIN_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/id_map.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/observer_list.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/renderer/render_view_observer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sender.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace WebKit {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebFrame;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct WebPluginParams;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserPlugin;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BrowserPluginManagerFactory;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewImpl;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserPluginManager manages the routing of messages to the appropriate
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// BrowserPlugin object based on its instance ID.
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CONTENT_EXPORT BrowserPluginManager
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public RenderViewObserver,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public base::RefCounted<BrowserPluginManager> {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the one BrowserPluginManager for this process.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static BrowserPluginManager* Create(RenderViewImpl* render_view);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overrides factory for testing. Default (NULL) value indicates regular
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (non-test) environment.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void set_factory_for_testing(BrowserPluginManagerFactory* factory) {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserPluginManager::factory_ = factory;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit BrowserPluginManager(RenderViewImpl* render_view);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a new BrowserPlugin object with a unique identifier.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowserPlugin is responsible for associating itself with the
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowserPluginManager via AddBrowserPlugin. When it is destroyed, it is
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // responsible for removing its association via RemoveBrowserPlugin.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual BrowserPlugin* CreateBrowserPlugin(
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RenderViewImpl* render_view,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebKit::WebFrame* frame,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const WebKit::WebPluginParams& params) = 0;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AllocateInstanceID(BrowserPlugin* browser_plugin) = 0;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void AddBrowserPlugin(int guest_instance_id, BrowserPlugin* browser_plugin);
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void RemoveBrowserPlugin(int guest_instance_id);
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  BrowserPlugin* GetBrowserPlugin(int guest_instance_id) const;
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void UpdateDeviceScaleFactor(float device_scale_factor);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateFocusState();
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RenderViewImpl* render_view() const { return render_view_.get(); }
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RenderViewObserver implementation.
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // BrowserPluginManager must override the default Send behavior.
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool Send(IPC::Message* msg) OVERRIDE = 0;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Don't destroy the BrowserPluginManager when the RenderViewImpl goes away.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // BrowserPluginManager's lifetime is managed by a reference count. Once
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the host RenderViewImpl and all BrowserPlugins release their references,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // then the BrowserPluginManager will be destroyed.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDestruct() OVERRIDE {}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Friend RefCounted so that the dtor can be non-public.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class base::RefCounted<BrowserPluginManager>;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Static factory instance (always NULL for non-test).
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static BrowserPluginManagerFactory* factory_;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~BrowserPluginManager();
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // This map is keyed by guest instance IDs.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDMap<BrowserPlugin> instances_;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtr<RenderViewImpl> render_view_;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowserPluginManager);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif //  CONTENT_RENDERER_BROWSER_PLUGIN_BROWSER_PLUGIN_MANAGER_H_
89