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)
5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/host_globals.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/rand_util.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/task_runner.h"
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/common/content_switches.h"
1558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
16bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/plugin_module.h"
17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "content/renderer/render_thread_impl.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/api_id.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/id_assignment.h"
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ppapi/shared_impl/proxy_lock.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h"
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebConsoleMessage.h"
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h"
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h"
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h"
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginContainer.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::CheckIdType;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::MakeTypedId;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PPIdType;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using ppapi::ResourceTracker;
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebConsoleMessage;
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef std::set<blink::WebPluginContainer*> ContainerSet;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds all WebPluginContainers associated with the given module to the set.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetAllContainersForModule(PluginModule* module,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ContainerSet* containers) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PluginModule::PluginInstanceSet& instances =
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      module->GetAllInstances();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (PluginModule::PluginInstanceSet::const_iterator i = instances.begin();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != instances.end(); ++i)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    containers->insert((*i)->container());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebConsoleMessage::Level LogLevelToWebLogLevel(PP_LogLevel level) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (level) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_LOGLEVEL_TIP:
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return WebConsoleMessage::LevelDebug;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_LOGLEVEL_LOG:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return WebConsoleMessage::LevelLog;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_LOGLEVEL_WARNING:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return WebConsoleMessage::LevelWarning;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_LOGLEVEL_ERROR:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return WebConsoleMessage::LevelError;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebConsoleMessage MakeLogMessage(PP_LogLevel level,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const std::string& source,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const std::string& message) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result = source;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result.empty())
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result.append(": ");
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result.append(message);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WebConsoleMessage(LogLevelToWebLogLevel(level),
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           WebString(UTF8ToUTF16(result)));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostGlobals* HostGlobals::host_globals_ = NULL;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)HostGlobals::HostGlobals()
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : ppapi::PpapiGlobals(),
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      resource_tracker_(ResourceTracker::SINGLE_THREADED) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!host_globals_);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_globals_ = this;
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // We do not support calls off of the main thread on the host side, and thus
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // do not lock.
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ppapi::ProxyLock::DisableLocking();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostGlobals::~HostGlobals() {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(host_globals_ == this || !host_globals_);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_globals_ = NULL;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochppapi::ResourceTracker* HostGlobals::GetResourceTracker() {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &resource_tracker_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochppapi::VarTracker* HostGlobals::GetVarTracker() {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &host_var_tracker_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochppapi::CallbackTracker* HostGlobals::GetCallbackTrackerForInstance(
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstanceMap::iterator found = instance_map_.find(instance);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (found == instance_map_.end())
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return found->second->module()->GetCallbackTracker().get();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochppapi::thunk::PPB_Instance_API* HostGlobals::GetInstanceAPI(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The InstanceAPI is just implemented by the PluginInstance object.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetInstance(instance);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochppapi::thunk::ResourceCreationAPI* HostGlobals::GetResourceCreationAPI(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance pp_instance) {
11958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginInstanceImpl* instance = GetInstance(pp_instance);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &instance->resource_creation();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Module HostGlobals::GetModuleForInstance(PP_Instance instance) {
12658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginInstanceImpl* inst = GetInstance(instance);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!inst)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return inst->module()->pp_module();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string HostGlobals::GetCmdLine() {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kPpapiFlashArgs);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostGlobals::PreCacheFontForFlash(const void* logfontw) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not implemented in-process.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostGlobals::LogWithSource(PP_Instance instance,
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                PP_LogLevel level,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const std::string& source,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const std::string& value) {
14558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginInstanceImpl* instance_object =
146bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      HostGlobals::Get()->GetInstance(instance);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (instance_object) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instance_object->container()->element().document().frame()->
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        addMessageToConsole(MakeLogMessage(level, source, value));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BroadcastLogWithSource(0, level, source, value);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostGlobals::BroadcastLogWithSource(PP_Module pp_module,
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         PP_LogLevel level,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const std::string& source,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const std::string& value) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the unique containers associated with the broadcast. This prevents us
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from sending the same message to the same console when there are two
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // instances on the page.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContainerSet containers;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginModule* module = GetModule(pp_module);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (module) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetAllContainersForModule(module, &containers);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Unknown module, get containers for all modules.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (ModuleMap::const_iterator i = module_map_.begin();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         i != module_map_.end(); ++i) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetAllContainersForModule(i->second, &containers);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebConsoleMessage message = MakeLogMessage(level, source, value);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ContainerSet::iterator i = containers.begin();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != containers.end(); ++i)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     (*i)->element().document().frame()->addMessageToConsole(message);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)base::TaskRunner* HostGlobals::GetFileTaskRunner() {
181d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return RenderThreadImpl::current()->GetFileThreadMessageLoopProxy().get();
1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochppapi::MessageLoopShared* HostGlobals::GetCurrentMessageLoop() {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Module HostGlobals::AddModule(PluginModule* module) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we're not adding one more than once.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ModuleMap::const_iterator i = module_map_.begin();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != module_map_.end(); ++i)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(i->second != module);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See AddInstance.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Module new_module;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_module = MakeTypedId(static_cast<PP_Module>(base::RandUint64()),
200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                             ppapi::PP_ID_TYPE_MODULE);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (!new_module ||
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           module_map_.find(new_module) != module_map_.end());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  module_map_[new_module] = module;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new_module;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostGlobals::ModuleDeleted(PP_Module module) {
208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DLOG_IF(ERROR, !CheckIdType(module, ppapi::PP_ID_TYPE_MODULE))
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << module << " is not a PP_Module.";
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ModuleMap::iterator found = module_map_.find(module);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (found == module_map_.end()) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  module_map_.erase(found);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginModule* HostGlobals::GetModule(PP_Module module) {
219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DLOG_IF(ERROR, !CheckIdType(module, ppapi::PP_ID_TYPE_MODULE))
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << module << " is not a PP_Module.";
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ModuleMap::iterator found = module_map_.find(module);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (found == module_map_.end())
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return found->second;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Instance HostGlobals::AddInstance(PepperPluginInstanceImpl* instance) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(instance_map_.find(instance->pp_instance()) == instance_map_.end());
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use a random number for the instance ID. This helps prevent some
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // accidents. See also AddModule below.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Need to make sure the random number isn't a duplicate or 0.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Instance new_instance;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_instance = MakeTypedId(static_cast<PP_Instance>(base::RandUint64()),
237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                               ppapi::PP_ID_TYPE_INSTANCE);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (!new_instance ||
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           instance_map_.find(new_instance) != instance_map_.end() ||
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           !instance->module()->ReserveInstanceID(new_instance));
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_map_[new_instance] = instance;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_tracker_.DidCreateInstance(new_instance);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new_instance;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostGlobals::InstanceDeleted(PP_Instance instance) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_tracker_.DidDeleteInstance(instance);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_var_tracker_.DidDeleteInstance(instance);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_map_.erase(instance);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostGlobals::InstanceCrashed(PP_Instance instance) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_tracker_.DidDeleteInstance(instance);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_var_tracker_.DidDeleteInstance(instance);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* HostGlobals::GetInstance(PP_Instance instance) {
260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DLOG_IF(ERROR, !CheckIdType(instance, ppapi::PP_ID_TYPE_INSTANCE))
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << instance << " is not a PP_Instance.";
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstanceMap::iterator found = instance_map_.find(instance);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (found == instance_map_.end())
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return found->second;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HostGlobals::IsHostGlobals() const {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch}  // namespace content
273