| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ppapi/shared_impl/ppp_instance_combined.h" |
| #include "ppapi/shared_impl/proxy_lock.h" |
| |
| namespace ppapi { |
| |
| // static |
| PPP_Instance_Combined* PPP_Instance_Combined::Create( |
| base::Callback<const void*(const char*)> get_interface_func) { |
| // Try 1.1. |
| const void* ppp_instance = get_interface_func.Run(PPP_INSTANCE_INTERFACE_1_1); |
| if (ppp_instance) { |
| const PPP_Instance_1_1* ppp_instance_1_1 = |
| static_cast<const PPP_Instance_1_1*>(ppp_instance); |
| return new PPP_Instance_Combined(*ppp_instance_1_1); |
| } |
| // Failing that, try 1.0. |
| ppp_instance = get_interface_func.Run(PPP_INSTANCE_INTERFACE_1_0); |
| if (ppp_instance) { |
| const PPP_Instance_1_0* ppp_instance_1_0 = |
| static_cast<const PPP_Instance_1_0*>(ppp_instance); |
| return new PPP_Instance_Combined(*ppp_instance_1_0); |
| } |
| // No supported PPP_Instance version found. |
| return NULL; |
| } |
| |
| PPP_Instance_Combined::PPP_Instance_Combined( |
| const PPP_Instance_1_0& instance_if) |
| : did_change_view_1_0_(instance_if.DidChangeView) { |
| instance_1_1_.DidCreate = instance_if.DidCreate; |
| instance_1_1_.DidDestroy = instance_if.DidDestroy; |
| instance_1_1_.DidChangeView = NULL; |
| instance_1_1_.DidChangeFocus = instance_if.DidChangeFocus; |
| instance_1_1_.HandleDocumentLoad = instance_if.HandleDocumentLoad; |
| } |
| |
| PPP_Instance_Combined::PPP_Instance_Combined( |
| const PPP_Instance_1_1& instance_if) |
| : instance_1_1_(instance_if), did_change_view_1_0_(NULL) {} |
| |
| PP_Bool PPP_Instance_Combined::DidCreate(PP_Instance instance, |
| uint32_t argc, |
| const char* argn[], |
| const char* argv[]) { |
| return CallWhileUnlocked(instance_1_1_.DidCreate, instance, argc, argn, argv); |
| } |
| |
| void PPP_Instance_Combined::DidDestroy(PP_Instance instance) { |
| return CallWhileUnlocked(instance_1_1_.DidDestroy, instance); |
| } |
| |
| void PPP_Instance_Combined::DidChangeView(PP_Instance instance, |
| PP_Resource view_changed_resource, |
| const struct PP_Rect* position, |
| const struct PP_Rect* clip) { |
| if (instance_1_1_.DidChangeView) { |
| CallWhileUnlocked( |
| instance_1_1_.DidChangeView, instance, view_changed_resource); |
| } else { |
| CallWhileUnlocked(did_change_view_1_0_, instance, position, clip); |
| } |
| } |
| |
| void PPP_Instance_Combined::DidChangeFocus(PP_Instance instance, |
| PP_Bool has_focus) { |
| CallWhileUnlocked(instance_1_1_.DidChangeFocus, instance, has_focus); |
| } |
| |
| PP_Bool PPP_Instance_Combined::HandleDocumentLoad(PP_Instance instance, |
| PP_Resource url_loader) { |
| return CallWhileUnlocked( |
| instance_1_1_.HandleDocumentLoad, instance, url_loader); |
| } |
| |
| } // namespace ppapi |