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)#include "content/renderer/browser_plugin/browser_plugin_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h"
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_local.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/values.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_constants.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_thread.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin_manager_factory.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin_manager_impl.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginManagerFactory* BrowserPluginManager::factory_ = NULL;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginManager* BrowserPluginManager::Create(
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderViewImpl* render_view) {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (factory_)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return factory_->CreateBrowserPluginManager(render_view);
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new BrowserPluginManagerImpl(render_view);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginManager::BrowserPluginManager(RenderViewImpl* render_view)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : RenderViewObserver(render_view),
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      current_instance_id_(browser_plugin::kInstanceIDNone),
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_(render_view->AsWeakPtr()) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPluginManager::~BrowserPluginManager() {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPluginManager::AddBrowserPlugin(
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int browser_plugin_instance_id,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserPlugin* browser_plugin) {
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  instances_.AddWithID(browser_plugin, browser_plugin_instance_id);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void BrowserPluginManager::RemoveBrowserPlugin(int browser_plugin_instance_id) {
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  instances_.Remove(browser_plugin_instance_id);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)BrowserPlugin* BrowserPluginManager::GetBrowserPlugin(
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int browser_plugin_instance_id) const {
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return instances_.Lookup(browser_plugin_instance_id);
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)int BrowserPluginManager::GetNextInstanceID() {
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return ++current_instance_id_;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserPluginManager::UpdateDeviceScaleFactor() {
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  IDMap<BrowserPlugin>::iterator iter(&instances_);
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  while (!iter.IsAtEnd()) {
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    iter.GetCurrentValue()->UpdateDeviceScaleFactor();
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    iter.Advance();
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPluginManager::UpdateFocusState() {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDMap<BrowserPlugin>::iterator iter(&instances_);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!iter.IsAtEnd()) {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    iter.GetCurrentValue()->UpdateGuestFocusState();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iter.Advance();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void BrowserPluginManager::Attach(int browser_plugin_instance_id) {
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  BrowserPlugin* plugin = GetBrowserPlugin(browser_plugin_instance_id);
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (plugin)
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    plugin->Attach();
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
81