OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Note that the single accessor, Module::Get(), is not actually implemented | 5 // Note that the single accessor, Module::Get(), is not actually implemented |
6 // in this file. This is an intentional hook that allows users of ppapi's | 6 // in this file. This is an intentional hook that allows users of ppapi's |
7 // C++ wrapper objects to provide difference semantics for how the singleton | 7 // C++ wrapper objects to provide difference semantics for how the singleton |
8 // object is accessed. | 8 // object is accessed. |
9 // | 9 // |
10 // In general, users of ppapi will also link in ppp_entrypoints.cc, which | 10 // In general, users of ppapi will also link in ppp_entrypoints.cc, which |
11 // provides a simple default implementation of Module::Get(). | 11 // provides a simple default implementation of Module::Get(). |
12 // | 12 // |
13 // A notable exception where the default ppp_entrypoints will not work is | 13 // A notable exception where the default ppp_entrypoints will not work is |
14 // when implementing "internal plugins" that are statically linked into the | 14 // when implementing "internal plugins" that are statically linked into the |
15 // browser. In this case, the process may actually have multiple Modules | 15 // browser. In this case, the process may actually have multiple Modules |
16 // loaded at once making a traditional "singleton" unworkable. To get around | 16 // loaded at once making a traditional "singleton" unworkable. To get around |
17 // this, the users of ppapi need to get creative about how to properly | 17 // this, the users of ppapi need to get creative about how to properly |
18 // implement the Module::Get() so that ppapi's C++ wrappers can find the | 18 // implement the Module::Get() so that ppapi's C++ wrappers can find the |
19 // right Module object. One example solution is to use thread local storage | 19 // right Module object. One example solution is to use thread local storage |
20 // to change the Module* returned based on which thread is invoking the | 20 // to change the Module* returned based on which thread is invoking the |
21 // function. Leaving Module::Get() unimplemented provides a hook for | 21 // function. Leaving Module::Get() unimplemented provides a hook for |
22 // implementing such behavior. | 22 // implementing such behavior. |
23 | 23 |
24 #include "ppapi/cpp/module.h" | 24 #include "ppapi/cpp/module.h" |
25 | 25 |
26 #include <string.h> | 26 #include <string.h> |
27 | 27 |
| 28 #include "ppapi/c/dev/ppp_messaging_dev.h" |
28 #include "ppapi/c/pp_instance.h" | 29 #include "ppapi/c/pp_instance.h" |
29 #include "ppapi/c/pp_var.h" | 30 #include "ppapi/c/pp_var.h" |
30 #include "ppapi/c/ppp_instance.h" | 31 #include "ppapi/c/ppp_instance.h" |
31 #include "ppapi/cpp/common.h" | 32 #include "ppapi/cpp/common.h" |
32 #include "ppapi/cpp/url_loader.h" | 33 #include "ppapi/cpp/url_loader.h" |
33 #include "ppapi/cpp/instance.h" | 34 #include "ppapi/cpp/instance.h" |
34 #include "ppapi/cpp/rect.h" | 35 #include "ppapi/cpp/rect.h" |
35 #include "ppapi/cpp/resource.h" | 36 #include "ppapi/cpp/resource.h" |
36 #include "ppapi/cpp/var.h" | 37 #include "ppapi/cpp/var.h" |
37 | 38 |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 static PPP_Instance instance_interface = { | 128 static PPP_Instance instance_interface = { |
128 &Instance_DidCreate, | 129 &Instance_DidCreate, |
129 &Instance_DidDestroy, | 130 &Instance_DidDestroy, |
130 &Instance_DidChangeView, | 131 &Instance_DidChangeView, |
131 &Instance_DidChangeFocus, | 132 &Instance_DidChangeFocus, |
132 &Instance_HandleInputEvent, | 133 &Instance_HandleInputEvent, |
133 &Instance_HandleDocumentLoad, | 134 &Instance_HandleDocumentLoad, |
134 &Instance_GetInstanceObject | 135 &Instance_GetInstanceObject |
135 }; | 136 }; |
136 | 137 |
| 138 void Messaging_HandleMessage(PP_Instance pp_instance, PP_Var var) { |
| 139 Module* module_singleton = Module::Get(); |
| 140 if (!module_singleton) |
| 141 return; |
| 142 Instance* instance = module_singleton->InstanceForPPInstance(pp_instance); |
| 143 if (!instance) |
| 144 return; |
| 145 instance->HandleMessage(Var(Var::PassRef(), var)); |
| 146 } |
| 147 |
| 148 static PPP_Messaging_Dev instance_messaging_interface = { |
| 149 &Messaging_HandleMessage |
| 150 }; |
| 151 |
137 // Module ---------------------------------------------------------------------- | 152 // Module ---------------------------------------------------------------------- |
138 | 153 |
139 Module::Module() : pp_module_(0), get_browser_interface_(NULL), core_(NULL) { | 154 Module::Module() : pp_module_(0), get_browser_interface_(NULL), core_(NULL) { |
140 } | 155 } |
141 | 156 |
142 Module::~Module() { | 157 Module::~Module() { |
143 delete core_; | 158 delete core_; |
144 core_ = NULL; | 159 core_ = NULL; |
145 } | 160 } |
146 | 161 |
147 bool Module::Init() { | 162 bool Module::Init() { |
148 return true; | 163 return true; |
149 } | 164 } |
150 | 165 |
151 const void* Module::GetPluginInterface(const char* interface_name) { | 166 const void* Module::GetPluginInterface(const char* interface_name) { |
152 if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0) | 167 if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0) |
153 return &instance_interface; | 168 return &instance_interface; |
154 | 169 |
| 170 if (strcmp(interface_name, PPP_MESSAGING_DEV_INTERFACE) == 0) |
| 171 return &instance_messaging_interface; |
| 172 |
155 // Now see if anything was dynamically registered. | 173 // Now see if anything was dynamically registered. |
156 InterfaceMap::const_iterator found = additional_interfaces_.find( | 174 InterfaceMap::const_iterator found = additional_interfaces_.find( |
157 std::string(interface_name)); | 175 std::string(interface_name)); |
158 if (found != additional_interfaces_.end()) | 176 if (found != additional_interfaces_.end()) |
159 return found->second; | 177 return found->second; |
160 | 178 |
161 return NULL; | 179 return NULL; |
162 } | 180 } |
163 | 181 |
164 const void* Module::GetBrowserInterface(const char* interface_name) { | 182 const void* Module::GetBrowserInterface(const char* interface_name) { |
(...skipping 30 matching lines...) Expand all Loading... |
195 const PPB_Core* core = reinterpret_cast<const PPB_Core*>(GetBrowserInterface( | 213 const PPB_Core* core = reinterpret_cast<const PPB_Core*>(GetBrowserInterface( |
196 PPB_CORE_INTERFACE)); | 214 PPB_CORE_INTERFACE)); |
197 if (!core) | 215 if (!core) |
198 return false; | 216 return false; |
199 core_ = new Core(core); | 217 core_ = new Core(core); |
200 | 218 |
201 return Init(); | 219 return Init(); |
202 } | 220 } |
203 | 221 |
204 } // namespace pp | 222 } // namespace pp |
OLD | NEW |