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