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