1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 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)
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/npobject_proxy.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/np_channel_base.h"
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/npobject_util.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/plugin_messages.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebBindings.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(ENABLE_PLUGINS)
13bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/child/npapi/plugin_instance.h"
14bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif
15bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebBindings;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NPObjectWrapper {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NPObject object;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NPObjectProxy* proxy;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPClass NPObjectProxy::npclass_proxy_ = {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NP_CLASS_STRUCT_VERSION,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy::NPAllocate,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy::NPDeallocate,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy::NPPInvalidate,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy::NPHasMethod,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy::NPInvoke,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy::NPInvokeDefault,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy::NPHasProperty,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy::NPGetProperty,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy::NPSetProperty,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy::NPRemoveProperty,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy::NPNEnumerate,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy::NPNConstruct
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPObjectProxy* NPObjectProxy::GetProxy(NPObject* object) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy* proxy = NULL;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wrapper exists only for NPObjects that we had created.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (&npclass_proxy_ == object->_class) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NPObjectWrapper* wrapper = reinterpret_cast<NPObjectWrapper*>(object);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy = wrapper->proxy;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return proxy;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPObject* NPObjectProxy::GetUnderlyingNPObject() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IPC::Listener* NPObjectProxy::GetChannelListener() {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<IPC::Listener*>(this);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPObjectProxy::NPObjectProxy(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NPChannelBase* channel,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int route_id,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int render_view_id,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& page_url)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : channel_(channel),
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      route_id_(route_id),
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view_id_(render_view_id),
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      page_url_(page_url) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  channel_->AddRoute(route_id, this, this);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPObjectProxy::~NPObjectProxy() {
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (channel_.get()) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This NPObjectProxy instance is now invalid and should not be reused for
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // requests initiated by plugins. We may receive requests for the
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // same NPObject in the context of the outgoing NPObjectMsg_Release call.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should be creating new NPObjectProxy instances to wrap these
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NPObjects.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    channel_->RemoveMappingForNPObjectProxy(route_id_);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    channel_->RemoveRoute(route_id_);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(new NPObjectMsg_Release(route_id_));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPObject* NPObjectProxy::Create(NPChannelBase* channel,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int route_id,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int render_view_id,
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                const GURL& page_url,
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                NPP owner) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectWrapper* obj = reinterpret_cast<NPObjectWrapper*>(
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      WebBindings::createObject(owner, &npclass_proxy_));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  obj->proxy = new NPObjectProxy(channel, route_id, render_view_id, page_url);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  channel->AddMappingForNPObjectProxy(route_id, &obj->object);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reinterpret_cast<NPObject*>(obj);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NPObjectProxy::Send(IPC::Message* msg) {
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (channel_.get())
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return channel_->Send(msg);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete msg;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPObject* NPObjectProxy::NPAllocate(NPP, NPClass*) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reinterpret_cast<NPObject*>(new NPObjectWrapper);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NPObjectProxy::NPDeallocate(NPObject* npObj) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectWrapper* obj = reinterpret_cast<NPObjectWrapper*>(npObj);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete obj->proxy;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete obj;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NPObjectProxy::OnMessageReceived(const IPC::Message& msg) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NPObjectProxy::OnChannelError() {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Release our ref count of the plugin channel object, as it addrefs the
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // process.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  channel_ = NULL;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NPObjectProxy::NPHasMethod(NPObject *obj,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                NPIdentifier name) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj == NULL)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = false;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy* proxy = GetProxy(obj);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!proxy) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return obj->_class->hasMethod(obj, name);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPIdentifier_Param name_param;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateNPIdentifierParam(name, &name_param);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy->Send(new NPObjectMsg_HasMethod(proxy->route_id(), name_param,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        &result));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NPObjectProxy::NPInvoke(NPObject *obj,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             NPIdentifier name,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const NPVariant *args,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             uint32_t arg_count,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             NPVariant *result) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NPInvokePrivate(0, obj, false, name, args, arg_count, result);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NPObjectProxy::NPInvokeDefault(NPObject *npobj,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const NPVariant *args,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    uint32_t arg_count,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    NPVariant *result) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NPInvokePrivate(0, npobj, true, 0, args, arg_count, result);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NPObjectProxy::NPInvokePrivate(NPP npp,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    NPObject *obj,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    bool is_default,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    NPIdentifier name,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const NPVariant *args,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    uint32_t arg_count,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    NPVariant *np_result) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj == NULL)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy* proxy = GetProxy(obj);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!proxy) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (is_default) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return obj->_class->invokeDefault(obj, args, arg_count, np_result);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return obj->_class->invoke(obj, name, args, arg_count, np_result);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = false;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_view_id = proxy->render_view_id_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPIdentifier_Param name_param;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_default) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The data won't actually get used, but set it so we don't send random
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // data.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name_param.identifier = NULL;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreateNPIdentifierParam(name, &name_param);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This instance can get destroyed in the context of
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send so addref the channel in this scope.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<NPChannelBase> channel_copy = proxy->channel_;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<NPVariant_Param> args_param;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (unsigned int i = 0; i < arg_count; ++i) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NPVariant_Param param;
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    CreateNPVariantParam(args[i],
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         channel_copy.get(),
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         &param,
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false,
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         render_view_id,
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         proxy->page_url_);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args_param.push_back(param);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPVariant_Param param_result;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectMsg_Invoke* msg = new NPObjectMsg_Invoke(
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proxy->route_id_, is_default, name_param, args_param, &param_result,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &result);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're in the plugin process and this invoke leads to a dialog box, the
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // plugin will hang the window hierarchy unless we pump the window message
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // queue while waiting for a reply.  We need to do this to simulate what
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // happens when everything runs in-process (while calling MessageBox window
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // messages are pumped).
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsPluginProcess() && proxy->channel()) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg->set_pump_messages_event(
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        proxy->channel()->GetModalDialogEvent(render_view_id));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL page_url = proxy->page_url_;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy->Send(msg);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send may delete proxy.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy = NULL;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateNPVariant(
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      param_result, channel_copy.get(), np_result, render_view_id, page_url);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NPObjectProxy::NPHasProperty(NPObject *obj,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  NPIdentifier name) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj == NULL)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = false;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy* proxy = GetProxy(obj);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!proxy) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return obj->_class->hasProperty(obj, name);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPIdentifier_Param name_param;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateNPIdentifierParam(name, &name_param);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPVariant_Param param;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy->Send(new NPObjectMsg_HasProperty(
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proxy->route_id(), name_param, &result));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send may delete proxy.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy = NULL;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NPObjectProxy::NPGetProperty(NPObject *obj,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  NPIdentifier name,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  NPVariant *np_result) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Please refer to http://code.google.com/p/chromium/issues/detail?id=2556,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which was a crash in the XStandard plugin during plugin shutdown. The
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crash occured because the plugin requests the plugin script object,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which fails. The plugin does not check the result of the operation and
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invokes NPN_GetProperty on a NULL object which lead to the crash. If
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we observe similar crashes in other methods in the future, these null
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // checks may have to be replicated in the other methods in this class.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj == NULL)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy* proxy = GetProxy(obj);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!proxy) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return obj->_class->getProperty(obj, name, np_result);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = false;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_view_id = proxy->render_view_id_;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPIdentifier_Param name_param;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateNPIdentifierParam(name, &name_param);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPVariant_Param param;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<NPChannelBase> channel(proxy->channel_);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL page_url = proxy->page_url_;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy->Send(new NPObjectMsg_GetProperty(
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proxy->route_id(), name_param, &param, &result));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send may delete proxy.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy = NULL;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateNPVariant(
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      param, channel.get(), np_result, render_view_id, page_url);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NPObjectProxy::NPSetProperty(NPObject *obj,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  NPIdentifier name,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const NPVariant *value) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj == NULL)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy* proxy = GetProxy(obj);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!proxy) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return obj->_class->setProperty(obj, name, value);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = false;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_view_id = proxy->render_view_id_;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPIdentifier_Param name_param;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateNPIdentifierParam(name, &name_param);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPVariant_Param value_param;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateNPVariantParam(
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *value, proxy->channel(), &value_param, false, render_view_id,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proxy->page_url_);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy->Send(new NPObjectMsg_SetProperty(
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proxy->route_id(), name_param, value_param, &result));
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send may delete proxy.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy = NULL;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NPObjectProxy::NPRemoveProperty(NPObject *obj,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     NPIdentifier name) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj == NULL)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = false;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy* proxy = GetProxy(obj);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!proxy) {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return obj->_class->removeProperty(obj, name);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPIdentifier_Param name_param;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateNPIdentifierParam(name, &name_param);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPVariant_Param param;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy->Send(new NPObjectMsg_RemoveProperty(
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proxy->route_id(), name_param, &result));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send may delete proxy.
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy = NULL;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NPObjectProxy::NPPInvalidate(NPObject *obj) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj == NULL)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy* proxy = GetProxy(obj);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!proxy) {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj->_class->invalidate(obj);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy->Send(new NPObjectMsg_Invalidate(proxy->route_id()));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send may delete proxy.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy = NULL;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NPObjectProxy::NPNEnumerate(NPObject *obj,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 NPIdentifier **value,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 uint32_t *count) {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj == NULL)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = false;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy* proxy = GetProxy(obj);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!proxy) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (obj->_class->structVersion >= NP_CLASS_STRUCT_VERSION_ENUM) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return obj->_class->enumerate(obj, value, count);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<NPIdentifier_Param> value_param;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy->Send(new NPObjectMsg_Enumeration(
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proxy->route_id(), &value_param, &result));
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send may delete proxy.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy = NULL;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *count = static_cast<unsigned int>(value_param.size());
393bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  *value = static_cast<NPIdentifier *>(malloc(sizeof(NPIdentifier) * *count));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (unsigned int i = 0; i < *count; ++i)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*value)[i] = CreateNPIdentifier(value_param[i]);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NPObjectProxy::NPNConstruct(NPObject *obj,
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const NPVariant *args,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 uint32_t arg_count,
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 NPVariant *np_result) {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj == NULL)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy* proxy = GetProxy(obj);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!proxy) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (obj->_class->structVersion >= NP_CLASS_STRUCT_VERSION_CTOR) {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return obj->_class->construct(obj, args, arg_count, np_result);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = false;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_view_id = proxy->render_view_id_;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This instance can get destroyed in the context of
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send so addref the channel in this scope.
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<NPChannelBase> channel_copy = proxy->channel_;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<NPVariant_Param> args_param;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (unsigned int i = 0; i < arg_count; ++i) {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NPVariant_Param param;
425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    CreateNPVariantParam(args[i],
426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         channel_copy.get(),
427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         &param,
428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false,
429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         render_view_id,
430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         proxy->page_url_);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args_param.push_back(param);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPVariant_Param param_result;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectMsg_Construct* msg = new NPObjectMsg_Construct(
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proxy->route_id_, args_param, &param_result, &result);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See comment in NPObjectProxy::NPInvokePrivate.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsPluginProcess() && proxy->channel()) {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg->set_pump_messages_event(
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        proxy->channel()->GetModalDialogEvent(proxy->render_view_id_));
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL page_url = proxy->page_url_;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy->Send(msg);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send may delete proxy.
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy = NULL;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateNPVariant(
454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      param_result, channel_copy.get(), np_result, render_view_id, page_url);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NPObjectProxy::NPNEvaluate(NPP npp,
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                NPObject *obj,
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                NPString *script,
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                NPVariant *result_var) {
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectProxy* proxy = GetProxy(obj);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!proxy) {
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = false;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_view_id = proxy->render_view_id_;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool popups_allowed = false;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
471bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(ENABLE_PLUGINS)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (npp) {
473ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    PluginInstance* plugin_instance =
474ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        reinterpret_cast<PluginInstance*>(npp->ndata);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (plugin_instance)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      popups_allowed = plugin_instance->popups_allowed();
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
478bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPVariant_Param result_param;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string script_str = std::string(
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      script->UTF8Characters, script->UTF8Length);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObjectMsg_Evaluate* msg = new NPObjectMsg_Evaluate(proxy->route_id(),
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       script_str,
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       popups_allowed,
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       &result_param,
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       &result);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See comment in NPObjectProxy::NPInvokePrivate.
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsPluginProcess() && proxy->channel()) {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg->set_pump_messages_event(
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        proxy->channel()->GetModalDialogEvent(render_view_id));
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<NPChannelBase> channel(proxy->channel_);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL page_url = proxy->page_url_;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy->Send(msg);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send may delete proxy.
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy = NULL;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateNPVariant(
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_param, channel.get(), result_var, render_view_id, page_url);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
510