// 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 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(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(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