OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/pp_instance.h" | 28 #include "ppapi/c/pp_instance.h" |
29 #include "ppapi/c/pp_var.h" | 29 #include "ppapi/c/pp_var.h" |
| 30 #include "ppapi/c/ppp_input_event.h" |
30 #include "ppapi/c/ppp_instance.h" | 31 #include "ppapi/c/ppp_instance.h" |
31 #include "ppapi/c/ppp_messaging.h" | 32 #include "ppapi/c/ppp_messaging.h" |
32 #include "ppapi/cpp/common.h" | 33 #include "ppapi/cpp/common.h" |
33 #include "ppapi/cpp/url_loader.h" | 34 #include "ppapi/cpp/input_event.h" |
34 #include "ppapi/cpp/instance.h" | 35 #include "ppapi/cpp/instance.h" |
35 #include "ppapi/cpp/rect.h" | 36 #include "ppapi/cpp/rect.h" |
36 #include "ppapi/cpp/resource.h" | 37 #include "ppapi/cpp/resource.h" |
| 38 #include "ppapi/cpp/url_loader.h" |
37 #include "ppapi/cpp/var.h" | 39 #include "ppapi/cpp/var.h" |
38 | 40 |
39 namespace pp { | 41 namespace pp { |
40 | 42 |
| 43 // PPP_InputEvent implementation ----------------------------------------------- |
| 44 |
| 45 PP_Bool InputEvent_HandleEvent(PP_Instance pp_instance, PP_Resource resource) { |
| 46 Module* module_singleton = Module::Get(); |
| 47 if (!module_singleton) |
| 48 return PP_FALSE; |
| 49 Instance* instance = module_singleton->InstanceForPPInstance(pp_instance); |
| 50 if (!instance) |
| 51 return PP_FALSE; |
| 52 |
| 53 return BoolToPPBool(instance->HandleInputEvent(InputEvent(resource))); |
| 54 } |
| 55 |
| 56 const PPP_InputEvent input_event_interface = { |
| 57 &InputEvent_HandleEvent |
| 58 }; |
| 59 |
41 // PPP_Instance implementation ------------------------------------------------- | 60 // PPP_Instance implementation ------------------------------------------------- |
42 | 61 |
43 PP_Bool Instance_DidCreate(PP_Instance pp_instance, | 62 PP_Bool Instance_DidCreate(PP_Instance pp_instance, |
44 uint32_t argc, | 63 uint32_t argc, |
45 const char* argn[], | 64 const char* argn[], |
46 const char* argv[]) { | 65 const char* argv[]) { |
47 Module* module_singleton = Module::Get(); | 66 Module* module_singleton = Module::Get(); |
48 if (!module_singleton) | 67 if (!module_singleton) |
49 return PP_FALSE; | 68 return PP_FALSE; |
50 | 69 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 &Instance_DidDestroy, | 151 &Instance_DidDestroy, |
133 &Instance_DidChangeView, | 152 &Instance_DidChangeView, |
134 &Instance_DidChangeFocus, | 153 &Instance_DidChangeFocus, |
135 &Instance_HandleInputEvent, | 154 &Instance_HandleInputEvent, |
136 &Instance_HandleDocumentLoad, | 155 &Instance_HandleDocumentLoad, |
137 #ifndef PPAPI_INSTANCE_REMOVE_SCRIPTING | 156 #ifndef PPAPI_INSTANCE_REMOVE_SCRIPTING |
138 &Instance_GetInstanceObject | 157 &Instance_GetInstanceObject |
139 #endif | 158 #endif |
140 }; | 159 }; |
141 | 160 |
| 161 // PPP_Messaging implementation ------------------------------------------------ |
| 162 |
142 void Messaging_HandleMessage(PP_Instance pp_instance, PP_Var var) { | 163 void Messaging_HandleMessage(PP_Instance pp_instance, PP_Var var) { |
143 Module* module_singleton = Module::Get(); | 164 Module* module_singleton = Module::Get(); |
144 if (!module_singleton) | 165 if (!module_singleton) |
145 return; | 166 return; |
146 Instance* instance = module_singleton->InstanceForPPInstance(pp_instance); | 167 Instance* instance = module_singleton->InstanceForPPInstance(pp_instance); |
147 if (!instance) | 168 if (!instance) |
148 return; | 169 return; |
149 instance->HandleMessage(Var(Var::PassRef(), var)); | 170 instance->HandleMessage(Var(Var::PassRef(), var)); |
150 } | 171 } |
151 | 172 |
152 static PPP_Messaging instance_messaging_interface = { | 173 static PPP_Messaging instance_messaging_interface = { |
153 &Messaging_HandleMessage | 174 &Messaging_HandleMessage |
154 }; | 175 }; |
155 | 176 |
156 // Module ---------------------------------------------------------------------- | 177 // Module ---------------------------------------------------------------------- |
157 | 178 |
158 Module::Module() : pp_module_(0), get_browser_interface_(NULL), core_(NULL) { | 179 Module::Module() : pp_module_(0), get_browser_interface_(NULL), core_(NULL) { |
159 } | 180 } |
160 | 181 |
161 Module::~Module() { | 182 Module::~Module() { |
162 delete core_; | 183 delete core_; |
163 core_ = NULL; | 184 core_ = NULL; |
164 } | 185 } |
165 | 186 |
166 bool Module::Init() { | 187 bool Module::Init() { |
167 return true; | 188 return true; |
168 } | 189 } |
169 | 190 |
170 const void* Module::GetPluginInterface(const char* interface_name) { | 191 const void* Module::GetPluginInterface(const char* interface_name) { |
| 192 if (strcmp(interface_name, PPP_INPUT_EVENT_INTERFACE) == 0) |
| 193 return &input_event_interface; |
171 if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0) | 194 if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0) |
172 return &instance_interface; | 195 return &instance_interface; |
173 | |
174 if (strcmp(interface_name, PPP_MESSAGING_INTERFACE) == 0) | 196 if (strcmp(interface_name, PPP_MESSAGING_INTERFACE) == 0) |
175 return &instance_messaging_interface; | 197 return &instance_messaging_interface; |
176 | 198 |
177 // Now see if anything was dynamically registered. | 199 // Now see if anything was dynamically registered. |
178 InterfaceMap::const_iterator found = additional_interfaces_.find( | 200 InterfaceMap::const_iterator found = additional_interfaces_.find( |
179 std::string(interface_name)); | 201 std::string(interface_name)); |
180 if (found != additional_interfaces_.end()) | 202 if (found != additional_interfaces_.end()) |
181 return found->second; | 203 return found->second; |
182 | 204 |
183 return NULL; | 205 return NULL; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 const PPB_Core* core = reinterpret_cast<const PPB_Core*>(GetBrowserInterface( | 239 const PPB_Core* core = reinterpret_cast<const PPB_Core*>(GetBrowserInterface( |
218 PPB_CORE_INTERFACE)); | 240 PPB_CORE_INTERFACE)); |
219 if (!core) | 241 if (!core) |
220 return false; | 242 return false; |
221 core_ = new Core(core); | 243 core_ = new Core(core); |
222 | 244 |
223 return Init(); | 245 return Init(); |
224 } | 246 } |
225 | 247 |
226 } // namespace pp | 248 } // namespace pp |
OLD | NEW |