15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppp_instance_combined.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/proxy_lock.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_Instance_Combined* PPP_Instance_Combined::Create( 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Callback<const void*(const char*)> get_interface_func) { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try 1.1. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* ppp_instance = get_interface_func.Run(PPP_INSTANCE_INTERFACE_1_1); 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ppp_instance) { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPP_Instance_1_1* ppp_instance_1_1 = 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_Instance_1_1*>(ppp_instance); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new PPP_Instance_Combined(*ppp_instance_1_1); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Failing that, try 1.0. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppp_instance = get_interface_func.Run(PPP_INSTANCE_INTERFACE_1_0); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ppp_instance) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPP_Instance_1_0* ppp_instance_1_0 = 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_Instance_1_0*>(ppp_instance); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new PPP_Instance_Combined(*ppp_instance_1_0); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No supported PPP_Instance version found. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_Instance_Combined::PPP_Instance_Combined( 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPP_Instance_1_0& instance_if) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : did_change_view_1_0_(instance_if.DidChangeView) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_1_1_.DidCreate = instance_if.DidCreate; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_1_1_.DidDestroy = instance_if.DidDestroy; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_1_1_.DidChangeView = NULL; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_1_1_.DidChangeFocus = instance_if.DidChangeFocus; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_1_1_.HandleDocumentLoad = instance_if.HandleDocumentLoad; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_Instance_Combined::PPP_Instance_Combined( 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPP_Instance_1_1& instance_if) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : instance_1_1_(instance_if), 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_change_view_1_0_(NULL) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool PPP_Instance_Combined::DidCreate(PP_Instance instance, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t argc, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* argn[], 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* argv[]) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallWhileUnlocked(instance_1_1_.DidCreate, instance, argc, argn, argv); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Combined::DidDestroy(PP_Instance instance) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallWhileUnlocked(instance_1_1_.DidDestroy, instance); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Combined::DidChangeView(PP_Instance instance, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource view_changed_resource, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct PP_Rect* position, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct PP_Rect* clip) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (instance_1_1_.DidChangeView) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallWhileUnlocked(instance_1_1_.DidChangeView, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_changed_resource); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallWhileUnlocked(did_change_view_1_0_, instance, position, clip); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Combined::DidChangeFocus(PP_Instance instance, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool has_focus) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallWhileUnlocked(instance_1_1_.DidChangeFocus, instance, has_focus); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool PPP_Instance_Combined::HandleDocumentLoad(PP_Instance instance, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource url_loader) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallWhileUnlocked(instance_1_1_.HandleDocumentLoad, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_loader); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85