plugin_globals.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ppapi/proxy/plugin_globals.h"
6
7#include "ppapi/proxy/plugin_dispatcher.h"
8#include "ppapi/proxy/plugin_proxy_delegate.h"
9#include "ppapi/proxy/ppb_message_loop_proxy.h"
10#include "ppapi/thunk/enter.h"
11
12namespace ppapi {
13namespace proxy {
14
15PluginGlobals* PluginGlobals::plugin_globals_ = NULL;
16
17PluginGlobals::PluginGlobals()
18    : ppapi::PpapiGlobals(),
19      plugin_proxy_delegate_(NULL),
20      callback_tracker_(new CallbackTracker),
21      loop_for_main_thread_(
22          new MessageLoopResource(MessageLoopResource::ForMainThread())) {
23  DCHECK(!plugin_globals_);
24  plugin_globals_ = this;
25}
26
27PluginGlobals::PluginGlobals(ForTest for_test)
28    : ppapi::PpapiGlobals(for_test),
29      plugin_proxy_delegate_(NULL),
30      callback_tracker_(new CallbackTracker) {
31  DCHECK(!plugin_globals_);
32}
33
34PluginGlobals::~PluginGlobals() {
35  DCHECK(plugin_globals_ == this || !plugin_globals_);
36  plugin_globals_ = NULL;
37}
38
39ResourceTracker* PluginGlobals::GetResourceTracker() {
40  return &plugin_resource_tracker_;
41}
42
43VarTracker* PluginGlobals::GetVarTracker() {
44  return &plugin_var_tracker_;
45}
46
47CallbackTracker* PluginGlobals::GetCallbackTrackerForInstance(
48    PP_Instance instance) {
49  // In the plugin process, the callback tracker is always the same, regardless
50  // of the instance.
51  return callback_tracker_.get();
52}
53
54thunk::PPB_Instance_API* PluginGlobals::GetInstanceAPI(PP_Instance instance) {
55  PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
56  if (dispatcher)
57    return dispatcher->GetInstanceAPI();
58  return NULL;
59}
60
61thunk::ResourceCreationAPI* PluginGlobals::GetResourceCreationAPI(
62    PP_Instance instance) {
63  PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
64  if (dispatcher)
65    return dispatcher->GetResourceCreationAPI();
66  return NULL;
67}
68
69PP_Module PluginGlobals::GetModuleForInstance(PP_Instance instance) {
70  // Currently proxied plugins don't use the PP_Module for anything useful.
71  return 0;
72}
73
74std::string PluginGlobals::GetCmdLine() {
75  return command_line_;
76}
77
78void PluginGlobals::PreCacheFontForFlash(const void* logfontw) {
79  plugin_proxy_delegate_->PreCacheFont(logfontw);
80}
81
82base::Lock* PluginGlobals::GetProxyLock() {
83#ifdef ENABLE_PEPPER_THREADING
84  return &proxy_lock_;
85#else
86  return NULL;
87#endif
88}
89
90void PluginGlobals::LogWithSource(PP_Instance instance,
91                                  PP_LogLevel_Dev level,
92                                  const std::string& source,
93                                  const std::string& value) {
94  const std::string& fixed_up_source = source.empty() ? plugin_name_ : source;
95  PluginDispatcher::LogWithSource(instance, level, fixed_up_source, value);
96}
97
98void PluginGlobals::BroadcastLogWithSource(PP_Module /* module */,
99                                           PP_LogLevel_Dev level,
100                                           const std::string& source,
101                                           const std::string& value) {
102  // Since we have only one module in a plugin process, broadcast is always
103  // the same as "send to everybody" which is what the dispatcher implements
104  // for the "instance = 0" case.
105  LogWithSource(0, level, source, value);
106}
107
108MessageLoopShared* PluginGlobals::GetCurrentMessageLoop() {
109  return MessageLoopResource::GetCurrent();
110}
111
112MessageLoopResource* PluginGlobals::loop_for_main_thread() {
113  return loop_for_main_thread_.get();
114}
115
116bool PluginGlobals::IsPluginGlobals() const {
117  return true;
118}
119
120}  // namespace proxy
121}  // namespace ppapi
122