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) ¶m, 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, ¶m_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, ¶m, &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) ¶m, 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, ¶m_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