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/proxy/ppb_var_deprecated_proxy.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> // For malloc 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_var_deprecated.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_var.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_core.h" 159ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "ppapi/c/ppb_var.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/host_dispatcher.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_dispatcher.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_globals.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_resource_tracker.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_var_tracker.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppp_class_proxy.h" 239ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "ppapi/proxy/proxy_object_var.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/serialized_var.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_var_shared.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/proxy_lock.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/var.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to do get the set-up information for calling a var object. If the 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// exception is set, returns NULL. Otherwise, computes the dispatcher for the 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// given var object. If the var is not a valid object, returns NULL and sets 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the exception. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginDispatcher* CheckExceptionAndGetDispatcher(const PP_Var& object, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* exception) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If an exception is already set, we don't need to do anything, just return 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an error to the caller. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (exception && exception->type != PP_VARTYPE_UNDEFINED) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (object.type == PP_VARTYPE_OBJECT) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the dispatcher for the object. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginDispatcher* dispatcher = 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginGlobals::Get()->plugin_var_tracker()-> 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatcherForPluginObject(object); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dispatcher) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dispatcher; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The object is invalid. This means we can't figure out which dispatcher 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to use, which is OK because the call will fail anyway. Set the exception. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (exception) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *exception = StringVar::StringToPPVar( 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string("Attempting to use an invalid object")); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PPB_Var_Deprecated plugin --------------------------------------------------- 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasProperty(PP_Var var, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var name, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* exception) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyAutoLock lock; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Dispatcher* dispatcher = CheckExceptionAndGetDispatcher(var, exception); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReceiveSerializedException se(dispatcher, exception); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool result = PP_FALSE; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!se.IsThrown()) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send(new PpapiHostMsg_PPBVar_HasProperty( 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPB_VAR_DEPRECATED, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput(dispatcher, var), 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput(dispatcher, name), &se, &result)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ToBool(result); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasMethod(PP_Var var, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var name, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* exception) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyAutoLock lock; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Dispatcher* dispatcher = CheckExceptionAndGetDispatcher(var, exception); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReceiveSerializedException se(dispatcher, exception); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool result = PP_FALSE; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!se.IsThrown()) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send(new PpapiHostMsg_PPBVar_HasMethodDeprecated( 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPB_VAR_DEPRECATED, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput(dispatcher, var), 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput(dispatcher, name), &se, &result)); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ToBool(result); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var GetProperty(PP_Var var, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var name, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* exception) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyAutoLock lock; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Dispatcher* dispatcher = CheckExceptionAndGetDispatcher(var, exception); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReceiveSerializedException se(dispatcher, exception); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReceiveSerializedVarReturnValue result; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!se.IsThrown()) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send(new PpapiHostMsg_PPBVar_GetProperty( 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPB_VAR_DEPRECATED, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput(dispatcher, var), 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput(dispatcher, name), &se, &result)); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result.Return(dispatcher); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void EnumerateProperties(PP_Var var, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t* property_count, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var** properties, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* exception) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyAutoLock lock; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Dispatcher* dispatcher = CheckExceptionAndGetDispatcher(var, exception); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *property_count = 0; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *properties = NULL; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReceiveSerializedVarVectorOutParam out_vector(dispatcher, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) property_count, properties); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReceiveSerializedException se(dispatcher, exception); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!se.IsThrown()) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send(new PpapiHostMsg_PPBVar_EnumerateProperties( 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPB_VAR_DEPRECATED, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput(dispatcher, var), 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_vector.OutParam(), &se)); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetProperty(PP_Var var, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var name, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var value, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* exception) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyAutoLock lock; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Dispatcher* dispatcher = CheckExceptionAndGetDispatcher(var, exception); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReceiveSerializedException se(dispatcher, exception); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!se.IsThrown()) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send(new PpapiHostMsg_PPBVar_SetPropertyDeprecated( 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPB_VAR_DEPRECATED, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput(dispatcher, var), 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput(dispatcher, name), 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput(dispatcher, value), &se)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RemoveProperty(PP_Var var, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var name, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* exception) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyAutoLock lock; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Dispatcher* dispatcher = CheckExceptionAndGetDispatcher(var, exception); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReceiveSerializedException se(dispatcher, exception); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool result = PP_FALSE; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!se.IsThrown()) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send(new PpapiHostMsg_PPBVar_DeleteProperty( 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPB_VAR_DEPRECATED, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput(dispatcher, var), 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput(dispatcher, name), &se, &result)); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var Call(PP_Var object, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var method_name, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t argc, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* argv, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* exception) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyAutoLock lock; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Dispatcher* dispatcher = CheckExceptionAndGetDispatcher(object, exception); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReceiveSerializedVarReturnValue result; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReceiveSerializedException se(dispatcher, exception); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!se.IsThrown()) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<SerializedVar> argv_vect; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput::ConvertVector(dispatcher, argv, argc, &argv_vect); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send(new PpapiHostMsg_PPBVar_CallDeprecated( 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPB_VAR_DEPRECATED, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput(dispatcher, object), 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput(dispatcher, method_name), argv_vect, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &se, &result)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result.Return(dispatcher); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var Construct(PP_Var object, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t argc, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* argv, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* exception) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyAutoLock lock; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Dispatcher* dispatcher = CheckExceptionAndGetDispatcher(object, exception); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReceiveSerializedVarReturnValue result; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReceiveSerializedException se(dispatcher, exception); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!se.IsThrown()) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<SerializedVar> argv_vect; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput::ConvertVector(dispatcher, argv, argc, &argv_vect); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send(new PpapiHostMsg_PPBVar_Construct( 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPB_VAR_DEPRECATED, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarSendInput(dispatcher, object), 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argv_vect, &se, &result)); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result.Return(dispatcher); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsInstanceOf(PP_Var var, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPP_Class_Deprecated* ppp_class, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void** ppp_class_data) { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyAutoLock lock; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Dispatcher* dispatcher = CheckExceptionAndGetDispatcher(var, NULL); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool result = PP_FALSE; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 class_int = static_cast<int64>(reinterpret_cast<intptr_t>(ppp_class)); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 class_data_int = 0; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send(new PpapiHostMsg_PPBVar_IsInstanceOfDeprecated( 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPB_VAR_DEPRECATED, SerializedVarSendInput(dispatcher, var), 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class_int, &class_data_int, &result)); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ppp_class_data = 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<void*>(static_cast<intptr_t>(class_data_int)); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ToBool(result); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var CreateObject(PP_Instance instance, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPP_Class_Deprecated* ppp_class, 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* ppp_class_data) { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyAutoLock lock; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Dispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginVarTracker* tracker = PluginGlobals::Get()->plugin_var_tracker(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tracker->IsPluginImplementedObjectAlive(ppp_class_data)) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); // Object already exists with this user data. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReceiveSerializedVarReturnValue result; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 class_int = static_cast<int64>(reinterpret_cast<intptr_t>(ppp_class)); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 data_int = 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int64>(reinterpret_cast<intptr_t>(ppp_class_data)); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send(new PpapiHostMsg_PPBVar_CreateObjectDeprecated( 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPB_VAR_DEPRECATED, instance, class_int, data_int, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result)); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var ret_var = result.Return(dispatcher); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Register this object as being implemented by the plugin. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret_var.type == PP_VARTYPE_OBJECT) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker->PluginImplementedObjectCreated(instance, ret_var, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppp_class, ppp_class_data); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret_var; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPB_Var_Deprecated_Proxy::PPB_Var_Deprecated_Proxy( 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Dispatcher* dispatcher) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : InterfaceProxy(dispatcher), 2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ppb_var_impl_(NULL), 2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) task_factory_(this) { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher->IsPlugin()) { 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppb_var_impl_ = static_cast<const PPB_Var_Deprecated*>( 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->local_get_interface()(PPB_VAR_DEPRECATED_INTERFACE)); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPB_Var_Deprecated_Proxy::~PPB_Var_Deprecated_Proxy() { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const PPB_Var_Deprecated* PPB_Var_Deprecated_Proxy::GetProxyInterface() { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const PPB_Var_Deprecated var_deprecated_interface = { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::PPB_Var_Shared::GetVarInterface1_0()->AddRef, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::PPB_Var_Shared::GetVarInterface1_0()->Release, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::PPB_Var_Shared::GetVarInterface1_0()->VarFromUtf8, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::PPB_Var_Shared::GetVarInterface1_0()->VarToUtf8, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HasProperty, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HasMethod, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetProperty, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &EnumerateProperties, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SetProperty, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &RemoveProperty, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Call, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Construct, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &IsInstanceOf, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &CreateObject 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return &var_deprecated_interface; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PPB_Var_Deprecated_Proxy::OnMessageReceived(const IPC::Message& msg) { 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!dispatcher()->permissions().HasPermission(PERMISSION_DEV)) 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prevent the dispatcher from going away during a call to Call or other 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // function that could mutate the DOM. This must happen OUTSIDE of 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the message handlers since the SerializedVars use the dispatcher upon 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return of the function (converting the SerializedVarReturnValue/OutParam 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to a SerializedVar in the destructor). 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedModuleReference death_grip(dispatcher()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(PPB_Var_Deprecated_Proxy, msg) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVar_AddRefObject, OnMsgAddRefObject) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVar_ReleaseObject, OnMsgReleaseObject) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVar_HasProperty, 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgHasProperty) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVar_HasMethodDeprecated, 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgHasMethodDeprecated) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVar_GetProperty, 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgGetProperty) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVar_DeleteProperty, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgDeleteProperty) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVar_EnumerateProperties, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgEnumerateProperties) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVar_SetPropertyDeprecated, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgSetPropertyDeprecated) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVar_CallDeprecated, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgCallDeprecated) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVar_Construct, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgConstruct) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVar_IsInstanceOfDeprecated, 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgIsInstanceOfDeprecated) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVar_CreateObjectDeprecated, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgCreateObjectDeprecated) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) handle bad messages! 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Var_Deprecated_Proxy::OnMsgAddRefObject(int64 object_id, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* /* unused */) { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var var = { PP_VARTYPE_OBJECT }; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var.value.as_id = object_id; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppb_var_impl_->AddRef(var); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Var_Deprecated_Proxy::OnMsgReleaseObject(int64 object_id) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ok, so this is super subtle. 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the browser side sends a sync IPC message that returns a var, and the 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // plugin wants to give ownership of that var to the browser, dropping all 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // references, it may call ReleaseObject right after returning the result. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // However, the IPC system doesn't enforce strict ordering of messages in that 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // case, where a message that is set to unblock (e.g. a sync message, or in 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // our case all messages coming from the plugin) that is sent *after* the 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // result may be dispatched on the browser side *before* the sync send 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returned (see ipc_sync_channel.cc). In this case, that means it could 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // release the object before it is AddRef'ed on the browser side. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To work around this, we post a task here, that will not execute before 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // control goes back to the main message loop, that will ensure the sync send 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has returned and the browser side can take its reference before we Release. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: if the instance is gone by the time the task is executed, then it 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will Release the objects itself and this Release will be a NOOP (aside of a 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // spurious warning). 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(piman): See if we can fix the IPC code to enforce strict ordering, and 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then remove this. 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostNonNestableTask( 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FROM_HERE, 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunWhileLocked(base::Bind(&PPB_Var_Deprecated_Proxy::DoReleaseObject, 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_factory_.GetWeakPtr(), 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) object_id))); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Var_Deprecated_Proxy::OnMsgHasProperty( 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput var, 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput name, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarOutParam exception, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool* result) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAllowPluginReentrancy(); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = PP_FromBool(ppb_var_impl_->HasProperty( 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var.Get(dispatcher()), 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name.Get(dispatcher()), 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exception.OutParam(dispatcher()))); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Var_Deprecated_Proxy::OnMsgHasMethodDeprecated( 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput var, 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput name, 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarOutParam exception, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool* result) { 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAllowPluginReentrancy(); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = PP_FromBool(ppb_var_impl_->HasMethod( 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var.Get(dispatcher()), 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name.Get(dispatcher()), 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exception.OutParam(dispatcher()))); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Var_Deprecated_Proxy::OnMsgGetProperty( 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput var, 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput name, 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarOutParam exception, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReturnValue result) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAllowPluginReentrancy(); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Return(dispatcher(), ppb_var_impl_->GetProperty( 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var.Get(dispatcher()), name.Get(dispatcher()), 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exception.OutParam(dispatcher()))); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Var_Deprecated_Proxy::OnMsgEnumerateProperties( 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput var, 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarVectorOutParam props, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarOutParam exception) { 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAllowPluginReentrancy(); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppb_var_impl_->GetAllPropertyNames(var.Get(dispatcher()), 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) props.CountOutParam(), props.ArrayOutParam(dispatcher()), 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exception.OutParam(dispatcher())); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Var_Deprecated_Proxy::OnMsgSetPropertyDeprecated( 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput var, 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput name, 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput value, 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarOutParam exception) { 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAllowPluginReentrancy(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppb_var_impl_->SetProperty(var.Get(dispatcher()), 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name.Get(dispatcher()), 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.Get(dispatcher()), 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exception.OutParam(dispatcher())); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Var_Deprecated_Proxy::OnMsgDeleteProperty( 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput var, 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput name, 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarOutParam exception, 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool* result) { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAllowPluginReentrancy(); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppb_var_impl_->RemoveProperty(var.Get(dispatcher()), 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name.Get(dispatcher()), 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exception.OutParam(dispatcher())); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This deprecated function doesn't actually return a value, but we re-use 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the message from the non-deprecated interface with the return value. 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = PP_TRUE; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Var_Deprecated_Proxy::OnMsgCallDeprecated( 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput object, 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput method_name, 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarVectorReceiveInput arg_vector, 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarOutParam exception, 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReturnValue result) { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAllowPluginReentrancy(); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t arg_count = 0; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* args = arg_vector.Get(dispatcher(), &arg_count); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Return(dispatcher(), ppb_var_impl_->Call( 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) object.Get(dispatcher()), 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_name.Get(dispatcher()), 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg_count, args, 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exception.OutParam(dispatcher()))); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Var_Deprecated_Proxy::OnMsgConstruct( 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput var, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarVectorReceiveInput arg_vector, 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarOutParam exception, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReturnValue result) { 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAllowPluginReentrancy(); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t arg_count = 0; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* args = arg_vector.Get(dispatcher(), &arg_count); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Return(dispatcher(), ppb_var_impl_->Construct( 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var.Get(dispatcher()), arg_count, args, 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exception.OutParam(dispatcher()))); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Var_Deprecated_Proxy::OnMsgIsInstanceOfDeprecated( 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput var, 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 ppp_class, 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64* ppp_class_data, 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool* result) { 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAllowPluginReentrancy(); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = PPP_Class_Proxy::IsInstanceOf(ppb_var_impl_, 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var.Get(dispatcher()), 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppp_class, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppp_class_data); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Var_Deprecated_Proxy::OnMsgCreateObjectDeprecated( 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 ppp_class, 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 class_data, 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReturnValue result) { 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAllowPluginReentrancy(); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.Return(dispatcher(), PPP_Class_Proxy::CreateProxiedObject( 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppb_var_impl_, dispatcher(), instance, ppp_class, class_data)); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Var_Deprecated_Proxy::SetAllowPluginReentrancy() { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dispatcher()->IsPlugin()) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<HostDispatcher*>(dispatcher())->set_allow_plugin_reentrancy(); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Var_Deprecated_Proxy::DoReleaseObject(int64 object_id) { 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var var = { PP_VARTYPE_OBJECT }; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var.value.as_id = object_id; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppb_var_impl_->Release(var); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace proxy 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 527