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" 25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "third_party/WebKit/public/web/WebLocalFrame.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; 33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing blink::WebLocalFrame; 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing blink::WebPluginContainer; 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochtypedef std::set<WebPluginContainer*> ContainerSet; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds all WebPluginContainers associated with the given module to the set. 44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid GetAllContainersForModule(PluginModule* module, ContainerSet* containers) { 45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const PluginModule::PluginInstanceSet& instances = module->GetAllInstances(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PluginModule::PluginInstanceSet::const_iterator i = instances.begin(); 47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch i != instances.end(); 48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ++i) { 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch WebPluginContainer* container = (*i)->container(); 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If "Delete" is called on an instance, the instance sets its container to 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // NULL, but the instance may actually outlive its container. Callers of 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // GetAllContainersForModule only want to know about valid containers. 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (container) 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch containers->insert(container); 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebConsoleMessage::Level LogLevelToWebLogLevel(PP_LogLevel level) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (level) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_LOGLEVEL_TIP: 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return WebConsoleMessage::LevelDebug; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_LOGLEVEL_LOG: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebConsoleMessage::LevelLog; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_LOGLEVEL_WARNING: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebConsoleMessage::LevelWarning; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_LOGLEVEL_ERROR: 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebConsoleMessage::LevelError; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebConsoleMessage MakeLogMessage(PP_LogLevel level, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& source, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result = source; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result.empty()) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.append(": "); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.append(message); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebConsoleMessage(LogLevelToWebLogLevel(level), 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebString(base::UTF8ToUTF16(result))); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostGlobals* HostGlobals::host_globals_ = NULL; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)HostGlobals::HostGlobals() 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : ppapi::PpapiGlobals(), 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resource_tracker_(ResourceTracker::SINGLE_THREADED) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!host_globals_); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_globals_ = this; 92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // We do not support calls off of the main thread on the host side, and thus 93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // do not lock. 94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ppapi::ProxyLock::DisableLocking(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostGlobals::~HostGlobals() { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(host_globals_ == this || !host_globals_); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_globals_ = NULL; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochppapi::ResourceTracker* HostGlobals::GetResourceTracker() { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &resource_tracker_; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochppapi::VarTracker* HostGlobals::GetVarTracker() { return &host_var_tracker_; } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochppapi::CallbackTracker* HostGlobals::GetCallbackTrackerForInstance( 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstanceMap::iterator found = instance_map_.find(instance); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (found == instance_map_.end()) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return found->second->module()->GetCallbackTracker().get(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochppapi::thunk::PPB_Instance_API* HostGlobals::GetInstanceAPI( 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The InstanceAPI is just implemented by the PluginInstance object. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetInstance(instance); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochppapi::thunk::ResourceCreationAPI* HostGlobals::GetResourceCreationAPI( 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance pp_instance) { 12458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* instance = GetInstance(pp_instance); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &instance->resource_creation(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Module HostGlobals::GetModuleForInstance(PP_Instance instance) { 13158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* inst = GetInstance(instance); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!inst) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return inst->module()->pp_module(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string HostGlobals::GetCmdLine() { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CommandLine::ForCurrentProcess()->GetSwitchValueASCII( 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashArgs); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostGlobals::PreCacheFontForFlash(const void* logfontw) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not implemented in-process. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostGlobals::LogWithSource(PP_Instance instance, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_LogLevel level, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& source, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& value) { 15058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* instance_object = 151bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch HostGlobals::Get()->GetInstance(instance); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (instance_object) { 153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch instance_object->container() 154a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ->element() 155a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch .document() 156a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch .frame() 157a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ->addMessageToConsole(MakeLogMessage(level, source, value)); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BroadcastLogWithSource(0, level, source, value); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostGlobals::BroadcastLogWithSource(PP_Module pp_module, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_LogLevel level, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& source, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& value) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the unique containers associated with the broadcast. This prevents us 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from sending the same message to the same console when there are two 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instances on the page. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContainerSet containers; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginModule* module = GetModule(pp_module); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (module) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAllContainersForModule(module, &containers); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unknown module, get containers for all modules. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ModuleMap::const_iterator i = module_map_.begin(); 177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch i != module_map_.end(); 178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ++i) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAllContainersForModule(i->second, &containers); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebConsoleMessage message = MakeLogMessage(level, source, value); 184a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (ContainerSet::iterator i = containers.begin(); i != containers.end(); 185a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ++i) { 186a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch WebLocalFrame* frame = (*i)->element().document().frame(); 187a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (frame) 188a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch frame->addMessageToConsole(message); 189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)base::TaskRunner* HostGlobals::GetFileTaskRunner() { 193d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return RenderThreadImpl::current()->GetFileThreadMessageLoopProxy().get(); 1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 196a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochppapi::MessageLoopShared* HostGlobals::GetCurrentMessageLoop() { return NULL; } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Module HostGlobals::AddModule(PluginModule* module) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we're not adding one more than once. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ModuleMap::const_iterator i = module_map_.begin(); 202a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch i != module_map_.end(); 203a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ++i) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(i->second != module); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See AddInstance. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Module new_module; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_module = MakeTypedId(static_cast<PP_Module>(base::RandUint64()), 211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ppapi::PP_ID_TYPE_MODULE); 212a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } while (!new_module || module_map_.find(new_module) != module_map_.end()); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_map_[new_module] = module; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_module; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostGlobals::ModuleDeleted(PP_Module module) { 218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DLOG_IF(ERROR, !CheckIdType(module, ppapi::PP_ID_TYPE_MODULE)) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << module << " is not a PP_Module."; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleMap::iterator found = module_map_.find(module); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (found == module_map_.end()) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_map_.erase(found); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginModule* HostGlobals::GetModule(PP_Module module) { 229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DLOG_IF(ERROR, !CheckIdType(module, ppapi::PP_ID_TYPE_MODULE)) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << module << " is not a PP_Module."; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleMap::iterator found = module_map_.find(module); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (found == module_map_.end()) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return found->second; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Instance HostGlobals::AddInstance(PepperPluginInstanceImpl* instance) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(instance_map_.find(instance->pp_instance()) == instance_map_.end()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a random number for the instance ID. This helps prevent some 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // accidents. See also AddModule below. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Need to make sure the random number isn't a duplicate or 0. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance new_instance; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_instance = MakeTypedId(static_cast<PP_Instance>(base::RandUint64()), 247ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ppapi::PP_ID_TYPE_INSTANCE); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (!new_instance || 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_map_.find(new_instance) != instance_map_.end() || 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !instance->module()->ReserveInstanceID(new_instance)); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_map_[new_instance] = instance; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource_tracker_.DidCreateInstance(new_instance); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_instance; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostGlobals::InstanceDeleted(PP_Instance instance) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource_tracker_.DidDeleteInstance(instance); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_var_tracker_.DidDeleteInstance(instance); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_map_.erase(instance); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostGlobals::InstanceCrashed(PP_Instance instance) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource_tracker_.DidDeleteInstance(instance); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_var_tracker_.DidDeleteInstance(instance); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* HostGlobals::GetInstance(PP_Instance instance) { 270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DLOG_IF(ERROR, !CheckIdType(instance, ppapi::PP_ID_TYPE_INSTANCE)) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << instance << " is not a PP_Instance."; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstanceMap::iterator found = instance_map_.find(instance); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (found == instance_map_.end()) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return found->second; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 278a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool HostGlobals::IsHostGlobals() const { return true; } 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} // namespace content 281