| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 #include "ppapi/proxy/interface_list.h" | 5 #include "ppapi/proxy/interface_list.h" |
| 6 | 6 |
| 7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
| 8 #include "base/memory/singleton.h" | 8 #include "base/memory/singleton.h" |
| 9 #include "ppapi/c/dev/ppb_alarms_dev.h" | 9 #include "ppapi/c/dev/ppb_alarms_dev.h" |
| 10 #include "ppapi/c/dev/ppb_audio_input_dev.h" | 10 #include "ppapi/c/dev/ppb_audio_input_dev.h" |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 // for each InterfaceProxy type we support. | 165 // for each InterfaceProxy type we support. |
| 166 #define PROXIED_API(api_name) \ | 166 #define PROXIED_API(api_name) \ |
| 167 AddProxy(PROXY_API_ID(api_name), &PROXY_FACTORY_NAME(api_name)); | 167 AddProxy(PROXY_API_ID(api_name), &PROXY_FACTORY_NAME(api_name)); |
| 168 | 168 |
| 169 // Register each proxied interface by calling AddPPB for each supported | 169 // Register each proxied interface by calling AddPPB for each supported |
| 170 // interface. Set current_required_permission to the appropriate value for | 170 // interface. Set current_required_permission to the appropriate value for |
| 171 // the value you want expanded by this macro. | 171 // the value you want expanded by this macro. |
| 172 #define PROXIED_IFACE(iface_str, iface_struct) \ | 172 #define PROXIED_IFACE(iface_str, iface_struct) \ |
| 173 AddPPB(iface_str, \ | 173 AddPPB(iface_str, \ |
| 174 INTERFACE_THUNK_NAME(iface_struct)(), \ | 174 INTERFACE_THUNK_NAME(iface_struct)(), \ |
| 175 current_required_permission); | 175 current_required_permission, \ |
| 176 requires_dev_channel); |
| 176 | 177 |
| 177 { | 178 { |
| 178 Permission current_required_permission = PERMISSION_NONE; | 179 Permission current_required_permission = PERMISSION_NONE; |
| 180 bool requires_dev_channel = false; |
| 179 #include "ppapi/thunk/interfaces_ppb_private_no_permissions.h" | 181 #include "ppapi/thunk/interfaces_ppb_private_no_permissions.h" |
| 180 #include "ppapi/thunk/interfaces_ppb_public_stable.h" | 182 #include "ppapi/thunk/interfaces_ppb_public_stable.h" |
| 181 } | 183 } |
| 182 { | 184 { |
| 183 Permission current_required_permission = PERMISSION_DEV; | 185 Permission current_required_permission = PERMISSION_DEV; |
| 186 bool requires_dev_channel = false; |
| 184 #include "ppapi/thunk/interfaces_ppb_public_dev.h" | 187 #include "ppapi/thunk/interfaces_ppb_public_dev.h" |
| 185 } | 188 } |
| 186 { | 189 { |
| 187 Permission current_required_permission = PERMISSION_PRIVATE; | 190 Permission current_required_permission = PERMISSION_PRIVATE; |
| 191 bool requires_dev_channel = false; |
| 188 #include "ppapi/thunk/interfaces_ppb_private.h" | 192 #include "ppapi/thunk/interfaces_ppb_private.h" |
| 189 } | 193 } |
| 190 { | 194 { |
| 191 #if !defined(OS_NACL) | 195 #if !defined(OS_NACL) |
| 192 Permission current_required_permission = PERMISSION_FLASH; | 196 Permission current_required_permission = PERMISSION_FLASH; |
| 197 bool requires_dev_channel = false; |
| 193 #include "ppapi/thunk/interfaces_ppb_private_flash.h" | 198 #include "ppapi/thunk/interfaces_ppb_private_flash.h" |
| 194 #endif // !defined(OS_NACL) | 199 #endif // !defined(OS_NACL) |
| 195 } | 200 } |
| 196 | 201 { |
| 197 // TODO(teravest): Add dev channel interfaces here. | 202 // TODO(teravest): These lines should be uncommented when a dev channel |
| 203 // interface is added. They're commented right now because they cause an |
| 204 // unused variable warning. |
| 205 // |
| 206 // Permission current_required_permission = PERMISSION_NONE; |
| 207 // bool requires_dev_channel = true; |
| 208 // #include "ppapi/thunk/interfaces_ppb_public_dev_channel.h" |
| 209 } |
| 198 | 210 |
| 199 #undef PROXIED_API | 211 #undef PROXIED_API |
| 200 #undef PROXIED_IFACE | 212 #undef PROXIED_IFACE |
| 201 | 213 |
| 202 // Manually add some special proxies. Some of these don't have interfaces | 214 // Manually add some special proxies. Some of these don't have interfaces |
| 203 // that they support, so aren't covered by the macros above, but have proxies | 215 // that they support, so aren't covered by the macros above, but have proxies |
| 204 // for message routing. Others have different implementations between the | 216 // for message routing. Others have different implementations between the |
| 205 // proxy and the impl and there's no obvious message routing. | 217 // proxy and the impl and there's no obvious message routing. |
| 206 AddProxy(API_ID_RESOURCE_CREATION, &ResourceCreationProxy::Create); | 218 AddProxy(API_ID_RESOURCE_CREATION, &ResourceCreationProxy::Create); |
| 207 AddProxy(API_ID_PPP_CLASS, &PPP_Class_Proxy::Create); | 219 AddProxy(API_ID_PPP_CLASS, &PPP_Class_Proxy::Create); |
| 208 AddPPB(PPB_CORE_INTERFACE_1_0, | 220 AddPPB(PPB_CORE_INTERFACE_1_0, |
| 209 PPB_Core_Proxy::GetPPB_Core_Interface(), PERMISSION_NONE); | 221 PPB_Core_Proxy::GetPPB_Core_Interface(), PERMISSION_NONE, false); |
| 210 AddPPB(PPB_MESSAGELOOP_INTERFACE_1_0, | 222 AddPPB(PPB_MESSAGELOOP_INTERFACE_1_0, |
| 211 PPB_MessageLoop_Proxy::GetInterface(), PERMISSION_NONE); | 223 PPB_MessageLoop_Proxy::GetInterface(), PERMISSION_NONE, false); |
| 212 AddPPB(PPB_OPENGLES2_INTERFACE_1_0, | 224 AddPPB(PPB_OPENGLES2_INTERFACE_1_0, |
| 213 PPB_OpenGLES2_Shared::GetInterface(), PERMISSION_NONE); | 225 PPB_OpenGLES2_Shared::GetInterface(), PERMISSION_NONE, false); |
| 214 AddPPB(PPB_OPENGLES2_INSTANCEDARRAYS_INTERFACE_1_0, | 226 AddPPB(PPB_OPENGLES2_INSTANCEDARRAYS_INTERFACE_1_0, |
| 215 PPB_OpenGLES2_Shared::GetInstancedArraysInterface(), PERMISSION_NONE); | 227 PPB_OpenGLES2_Shared::GetInstancedArraysInterface(), |
| 228 PERMISSION_NONE, false); |
| 216 AddPPB(PPB_OPENGLES2_FRAMEBUFFERBLIT_INTERFACE_1_0, | 229 AddPPB(PPB_OPENGLES2_FRAMEBUFFERBLIT_INTERFACE_1_0, |
| 217 PPB_OpenGLES2_Shared::GetFramebufferBlitInterface(), PERMISSION_NONE); | 230 PPB_OpenGLES2_Shared::GetFramebufferBlitInterface(), |
| 231 PERMISSION_NONE, false); |
| 218 AddPPB(PPB_OPENGLES2_FRAMEBUFFERMULTISAMPLE_INTERFACE_1_0, | 232 AddPPB(PPB_OPENGLES2_FRAMEBUFFERMULTISAMPLE_INTERFACE_1_0, |
| 219 PPB_OpenGLES2_Shared::GetFramebufferMultisampleInterface(), | 233 PPB_OpenGLES2_Shared::GetFramebufferMultisampleInterface(), |
| 220 PERMISSION_NONE); | 234 PERMISSION_NONE, false); |
| 221 AddPPB(PPB_OPENGLES2_CHROMIUMENABLEFEATURE_INTERFACE_1_0, | 235 AddPPB(PPB_OPENGLES2_CHROMIUMENABLEFEATURE_INTERFACE_1_0, |
| 222 PPB_OpenGLES2_Shared::GetChromiumEnableFeatureInterface(), | 236 PPB_OpenGLES2_Shared::GetChromiumEnableFeatureInterface(), |
| 223 PERMISSION_NONE); | 237 PERMISSION_NONE, false); |
| 224 AddPPB(PPB_OPENGLES2_CHROMIUMMAPSUB_INTERFACE_1_0, | 238 AddPPB(PPB_OPENGLES2_CHROMIUMMAPSUB_INTERFACE_1_0, |
| 225 PPB_OpenGLES2_Shared::GetChromiumMapSubInterface(), PERMISSION_NONE); | 239 PPB_OpenGLES2_Shared::GetChromiumMapSubInterface(), |
| 240 PERMISSION_NONE, false); |
| 226 AddPPB(PPB_OPENGLES2_CHROMIUMMAPSUB_DEV_INTERFACE_1_0, | 241 AddPPB(PPB_OPENGLES2_CHROMIUMMAPSUB_DEV_INTERFACE_1_0, |
| 227 PPB_OpenGLES2_Shared::GetChromiumMapSubInterface(), PERMISSION_NONE); | 242 PPB_OpenGLES2_Shared::GetChromiumMapSubInterface(), |
| 243 PERMISSION_NONE, false); |
| 228 AddPPB(PPB_OPENGLES2_QUERY_INTERFACE_1_0, | 244 AddPPB(PPB_OPENGLES2_QUERY_INTERFACE_1_0, |
| 229 PPB_OpenGLES2_Shared::GetQueryInterface(), PERMISSION_NONE); | 245 PPB_OpenGLES2_Shared::GetQueryInterface(), PERMISSION_NONE, false); |
| 230 AddPPB(PPB_VAR_ARRAY_BUFFER_INTERFACE_1_0, | 246 AddPPB(PPB_VAR_ARRAY_BUFFER_INTERFACE_1_0, |
| 231 PPB_Var_Shared::GetVarArrayBufferInterface1_0(), | 247 PPB_Var_Shared::GetVarArrayBufferInterface1_0(), |
| 232 PERMISSION_NONE); | 248 PERMISSION_NONE, false); |
| 233 AddPPB(PPB_VAR_INTERFACE_1_1, | 249 AddPPB(PPB_VAR_INTERFACE_1_1, |
| 234 PPB_Var_Shared::GetVarInterface1_1(), PERMISSION_NONE); | 250 PPB_Var_Shared::GetVarInterface1_1(), PERMISSION_NONE, false); |
| 235 AddPPB(PPB_VAR_INTERFACE_1_0, | 251 AddPPB(PPB_VAR_INTERFACE_1_0, |
| 236 PPB_Var_Shared::GetVarInterface1_0(), PERMISSION_NONE); | 252 PPB_Var_Shared::GetVarInterface1_0(), PERMISSION_NONE, false); |
| 237 | 253 |
| 238 #if !defined(OS_NACL) | 254 #if !defined(OS_NACL) |
| 239 // PPB (browser) interfaces. | 255 // PPB (browser) interfaces. |
| 240 // Do not add more stuff here, they should be added to interface_list*.h | 256 // Do not add more stuff here, they should be added to interface_list*.h |
| 241 // TODO(brettw) remove these. | 257 // TODO(brettw) remove these. |
| 242 AddProxy(API_ID_PPB_INSTANCE_PRIVATE, &ProxyFactory<PPB_Instance_Proxy>); | 258 AddProxy(API_ID_PPB_INSTANCE_PRIVATE, &ProxyFactory<PPB_Instance_Proxy>); |
| 243 AddPPB(PPB_INSTANCE_PRIVATE_INTERFACE_0_1, | 259 AddPPB(PPB_INSTANCE_PRIVATE_INTERFACE_0_1, |
| 244 thunk::GetPPB_Instance_Private_0_1_Thunk(), | 260 thunk::GetPPB_Instance_Private_0_1_Thunk(), |
| 245 PERMISSION_PRIVATE); | 261 PERMISSION_PRIVATE, false); |
| 246 | 262 |
| 247 AddProxy(API_ID_PPB_VAR_DEPRECATED, &ProxyFactory<PPB_Var_Deprecated_Proxy>); | 263 AddProxy(API_ID_PPB_VAR_DEPRECATED, &ProxyFactory<PPB_Var_Deprecated_Proxy>); |
| 248 AddPPB(PPB_VAR_DEPRECATED_INTERFACE, | 264 AddPPB(PPB_VAR_DEPRECATED_INTERFACE, |
| 249 PPB_Var_Deprecated_Proxy::GetProxyInterface(), PERMISSION_DEV); | 265 PPB_Var_Deprecated_Proxy::GetProxyInterface(), PERMISSION_DEV, false); |
| 250 | 266 |
| 251 // TODO(tomfinegan): Figure out where to put these once we refactor things | 267 // TODO(tomfinegan): Figure out where to put these once we refactor things |
| 252 // to load the PPP interface struct from the PPB interface. | 268 // to load the PPP interface struct from the PPB interface. |
| 253 AddProxy(API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, | 269 AddProxy(API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, |
| 254 &ProxyFactory<PPP_ContentDecryptor_Private_Proxy>); | 270 &ProxyFactory<PPP_ContentDecryptor_Private_Proxy>); |
| 255 AddPPP(PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE, | 271 AddPPP(PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE, |
| 256 PPP_ContentDecryptor_Private_Proxy::GetProxyInterface()); | 272 PPP_ContentDecryptor_Private_Proxy::GetProxyInterface()); |
| 257 #endif | 273 #endif |
| 258 AddProxy(API_ID_PPB_TESTING, &ProxyFactory<PPB_Testing_Proxy>); | 274 AddProxy(API_ID_PPB_TESTING, &ProxyFactory<PPB_Testing_Proxy>); |
| 259 AddPPB(PPB_TESTING_PRIVATE_INTERFACE, | 275 AddPPB(PPB_TESTING_PRIVATE_INTERFACE, |
| 260 PPB_Testing_Proxy::GetProxyInterface(), PERMISSION_TESTING); | 276 PPB_Testing_Proxy::GetProxyInterface(), PERMISSION_TESTING, false); |
| 261 | 277 |
| 262 // PPP (plugin) interfaces. | 278 // PPP (plugin) interfaces. |
| 263 // TODO(brettw) move these to interface_list*.h | 279 // TODO(brettw) move these to interface_list*.h |
| 264 AddProxy(API_ID_PPP_GRAPHICS_3D, &ProxyFactory<PPP_Graphics3D_Proxy>); | 280 AddProxy(API_ID_PPP_GRAPHICS_3D, &ProxyFactory<PPP_Graphics3D_Proxy>); |
| 265 AddPPP(PPP_GRAPHICS_3D_INTERFACE, PPP_Graphics3D_Proxy::GetProxyInterface()); | 281 AddPPP(PPP_GRAPHICS_3D_INTERFACE, PPP_Graphics3D_Proxy::GetProxyInterface()); |
| 266 AddProxy(API_ID_PPP_INPUT_EVENT, &ProxyFactory<PPP_InputEvent_Proxy>); | 282 AddProxy(API_ID_PPP_INPUT_EVENT, &ProxyFactory<PPP_InputEvent_Proxy>); |
| 267 AddPPP(PPP_INPUT_EVENT_INTERFACE, PPP_InputEvent_Proxy::GetProxyInterface()); | 283 AddPPP(PPP_INPUT_EVENT_INTERFACE, PPP_InputEvent_Proxy::GetProxyInterface()); |
| 268 AddProxy(API_ID_PPP_INSTANCE, &ProxyFactory<PPP_Instance_Proxy>); | 284 AddProxy(API_ID_PPP_INSTANCE, &ProxyFactory<PPP_Instance_Proxy>); |
| 269 #if !defined(OS_NACL) | 285 #if !defined(OS_NACL) |
| 270 AddPPP(PPP_INSTANCE_INTERFACE_1_1, | 286 AddPPP(PPP_INSTANCE_INTERFACE_1_1, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 return NULL; | 332 return NULL; |
| 317 return id_to_factory_[index]; | 333 return id_to_factory_[index]; |
| 318 } | 334 } |
| 319 | 335 |
| 320 const void* InterfaceList::GetInterfaceForPPB(const std::string& name) const { | 336 const void* InterfaceList::GetInterfaceForPPB(const std::string& name) const { |
| 321 NameToInterfaceInfoMap::const_iterator found = | 337 NameToInterfaceInfoMap::const_iterator found = |
| 322 name_to_browser_info_.find(name); | 338 name_to_browser_info_.find(name); |
| 323 if (found == name_to_browser_info_.end()) | 339 if (found == name_to_browser_info_.end()) |
| 324 return NULL; | 340 return NULL; |
| 325 | 341 |
| 326 // Dev channel checking goes here. | 342 if (found->second.requires_dev_channel && !g_supports_dev_channel.Get()) |
| 343 return NULL; |
| 327 | 344 |
| 328 if (g_process_global_permissions.Get().HasPermission( | 345 if (g_process_global_permissions.Get().HasPermission( |
| 329 found->second.required_permission)) | 346 found->second.required_permission)) |
| 330 return found->second.iface; | 347 return found->second.iface; |
| 331 return NULL; | 348 return NULL; |
| 332 } | 349 } |
| 333 | 350 |
| 334 const void* InterfaceList::GetInterfaceForPPP(const std::string& name) const { | 351 const void* InterfaceList::GetInterfaceForPPP(const std::string& name) const { |
| 335 NameToInterfaceInfoMap::const_iterator found = | 352 NameToInterfaceInfoMap::const_iterator found = |
| 336 name_to_plugin_info_.find(name); | 353 name_to_plugin_info_.find(name); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 350 // The factory should be an exact dupe of the one we already have if it | 367 // The factory should be an exact dupe of the one we already have if it |
| 351 // has already been registered before. | 368 // has already been registered before. |
| 352 int index = static_cast<int>(id); | 369 int index = static_cast<int>(id); |
| 353 DCHECK(!id_to_factory_[index] || id_to_factory_[index] == factory); | 370 DCHECK(!id_to_factory_[index] || id_to_factory_[index] == factory); |
| 354 | 371 |
| 355 id_to_factory_[index] = factory; | 372 id_to_factory_[index] = factory; |
| 356 } | 373 } |
| 357 | 374 |
| 358 void InterfaceList::AddPPB(const char* name, | 375 void InterfaceList::AddPPB(const char* name, |
| 359 const void* iface, | 376 const void* iface, |
| 360 Permission perm) { | 377 Permission perm, |
| 378 bool requires_dev_channel) { |
| 361 DCHECK(name_to_browser_info_.find(name) == name_to_browser_info_.end()); | 379 DCHECK(name_to_browser_info_.find(name) == name_to_browser_info_.end()); |
| 362 name_to_browser_info_[name] = InterfaceInfo(iface, perm); | 380 name_to_browser_info_[name] = |
| 381 InterfaceInfo(iface, perm, requires_dev_channel); |
| 363 } | 382 } |
| 364 | 383 |
| 365 void InterfaceList::AddPPP(const char* name, | 384 void InterfaceList::AddPPP(const char* name, |
| 366 const void* iface) { | 385 const void* iface) { |
| 367 DCHECK(name_to_plugin_info_.find(name) == name_to_plugin_info_.end()); | 386 DCHECK(name_to_plugin_info_.find(name) == name_to_plugin_info_.end()); |
| 368 name_to_plugin_info_[name] = InterfaceInfo(iface, PERMISSION_NONE); | 387 name_to_plugin_info_[name] = InterfaceInfo(iface, PERMISSION_NONE, false); |
| 369 } | 388 } |
| 370 | 389 |
| 371 } // namespace proxy | 390 } // namespace proxy |
| 372 } // namespace ppapi | 391 } // namespace ppapi |
| OLD | NEW |