15ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark/* 2d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2008, 2009, 2010 Apple Inc. All Rights Reserved. 35ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * 45ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * Redistribution and use in source and binary forms, with or without 55ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * modification, are permitted provided that the following conditions 65ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * are met: 75ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * 1. Redistributions of source code must retain the above copyright 85ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * notice, this list of conditions and the following disclaimer. 95ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * 2. Redistributions in binary form must reproduce the above copyright 105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * notice, this list of conditions and the following disclaimer in the 115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * documentation and/or other materials provided with the distribution. 125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * 135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark */ 255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 26e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#if USE(PLUGIN_HOST_PROCESS) && ENABLE(NETSCAPE_PLUGIN_API) 275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "ProxyInstance.h" 295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "NetscapePluginHostProxy.h" 31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import "ProxyRuntimeObject.h" 32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/IdentifierRep.h> 33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/JSDOMWindow.h> 345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <WebCore/npruntime_impl.h> 35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <WebCore/runtime_method.h> 36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <runtime/Error.h> 3781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#import <runtime/FunctionPrototype.h> 38d0825bca7fe65beaee391d30da42e937db621564Steve Block#import <runtime/PropertyNameArray.h> 395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkextern "C" { 415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebKitPluginHost.h" 425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkusing namespace JSC; 455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkusing namespace JSC::Bindings; 465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkusing namespace std; 47563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkusing namespace WebCore; 485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarknamespace WebKit { 505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkclass ProxyClass : public JSC::Bindings::Class { 525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkprivate: 535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark virtual MethodList methodsNamed(const Identifier&, Instance*) const; 545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark virtual Field* fieldNamed(const Identifier&, Instance*) const; 555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}; 565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 575ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkMethodList ProxyClass::methodsNamed(const Identifier& identifier, Instance* instance) const 585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return static_cast<ProxyInstance*>(instance)->methodsNamed(identifier); 605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 625ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkField* ProxyClass::fieldNamed(const Identifier& identifier, Instance* instance) const 635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return static_cast<ProxyInstance*>(instance)->fieldNamed(identifier); 655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkstatic ProxyClass* proxyClass() 685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark DEFINE_STATIC_LOCAL(ProxyClass, proxyClass, ()); 705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return &proxyClass; 715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkclass ProxyField : public JSC::Bindings::Field { 745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkpublic: 755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark ProxyField(uint64_t serverIdentifier) 765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark : m_serverIdentifier(serverIdentifier) 775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark { 785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark } 795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark uint64_t serverIdentifier() const { return m_serverIdentifier; } 815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkprivate: 830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch virtual JSValue valueFromInstance(ExecState*, const Instance*) const; 840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch virtual void setValueToInstance(ExecState*, const Instance*, JSValue) const; 855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark uint64_t m_serverIdentifier; 875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}; 885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochJSValue ProxyField::valueFromInstance(ExecState* exec, const Instance* instance) const 905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return static_cast<const ProxyInstance*>(instance)->fieldValue(exec, this); 925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid ProxyField::setValueToInstance(ExecState* exec, const Instance* instance, JSValue value) const 955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark static_cast<const ProxyInstance*>(instance)->setFieldValue(exec, this, value); 975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkclass ProxyMethod : public JSC::Bindings::Method { 1005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkpublic: 1015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark ProxyMethod(uint64_t serverIdentifier) 1025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark : m_serverIdentifier(serverIdentifier) 1035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark { 1045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark } 1055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark uint64_t serverIdentifier() const { return m_serverIdentifier; } 1075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkprivate: 1095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark virtual int numParameters() const { return 0; } 1105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark uint64_t m_serverIdentifier; 1125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}; 1135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1145ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkProxyInstance::ProxyInstance(PassRefPtr<RootObject> rootObject, NetscapePluginInstanceProxy* instanceProxy, uint32_t objectID) 1155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark : Instance(rootObject) 1165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark , m_instanceProxy(instanceProxy) 1175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark , m_objectID(objectID) 1185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 119563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark m_instanceProxy->addInstance(this); 1205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 1215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1225ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkProxyInstance::~ProxyInstance() 1235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 1245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark deleteAllValues(m_fields); 1255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark deleteAllValues(m_methods); 126563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 127563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!m_instanceProxy) 128563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return; 1295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 130563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark m_instanceProxy->removeInstance(this); 131563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 132563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark invalidate(); 1335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 1345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockRuntimeObject* ProxyInstance::newRuntimeObject(ExecState* exec) 136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 137e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block return new (exec) ProxyRuntimeObject(exec, exec->lexicalGlobalObject(), this); 138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSC::Bindings::Class* ProxyInstance::getClass() const 1415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 1425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return proxyClass(); 1435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 1445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1455af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue ProxyInstance::invoke(JSC::ExecState* exec, InvokeType type, uint64_t identifier, const ArgList& args) 1465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 147231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!m_instanceProxy) 148231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return jsUndefined(); 149692e5dbf12901edacf14812a6fae25462920af42Steve Block 1505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark RetainPtr<NSData*> arguments(m_instanceProxy->marshalValues(exec, args)); 151563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 152563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark uint32_t requestID = m_instanceProxy->nextRequestID(); 153563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 154692e5dbf12901edacf14812a6fae25462920af42Steve Block for (unsigned i = 0; i < args.size(); i++) 155692e5dbf12901edacf14812a6fae25462920af42Steve Block m_instanceProxy->retainLocalObject(args.at(i)); 156692e5dbf12901edacf14812a6fae25462920af42Steve Block 157563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (_WKPHNPObjectInvoke(m_instanceProxy->hostProxy()->port(), m_instanceProxy->pluginID(), requestID, m_objectID, 158692e5dbf12901edacf14812a6fae25462920af42Steve Block type, identifier, (char*)[arguments.get() bytes], [arguments.get() length]) != KERN_SUCCESS) { 159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_instanceProxy) { 160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (unsigned i = 0; i < args.size(); i++) 161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_instanceProxy->releaseLocalObject(args.at(i)); 162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return jsUndefined(); 164692e5dbf12901edacf14812a6fae25462920af42Steve Block } 1655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 166d0825bca7fe65beaee391d30da42e937db621564Steve Block auto_ptr<NetscapePluginInstanceProxy::BooleanAndDataReply> reply = waitForReply<NetscapePluginInstanceProxy::BooleanAndDataReply>(requestID); 1678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block NetscapePluginInstanceProxy::moveGlobalExceptionToExecState(exec); 168692e5dbf12901edacf14812a6fae25462920af42Steve Block 169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_instanceProxy) { 170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (unsigned i = 0; i < args.size(); i++) 171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_instanceProxy->releaseLocalObject(args.at(i)); 172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 173692e5dbf12901edacf14812a6fae25462920af42Steve Block 1745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (!reply.get() || !reply->m_returnValue) 1755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return jsUndefined(); 1765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return m_instanceProxy->demarshalValue(exec, (char*)CFDataGetBytePtr(reply->m_result.get()), CFDataGetLength(reply->m_result.get())); 1785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 1795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass ProxyRuntimeMethod : public RuntimeMethod { 181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic: 182e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block ProxyRuntimeMethod(ExecState* exec, JSGlobalObject* globalObject, const Identifier& name, Bindings::MethodList& list) 18381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // FIXME: deprecatedGetDOMStructure uses the prototype off of the wrong global object 18481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // exec-globalData() is also likely wrong. 18581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch : RuntimeMethod(exec, globalObject, deprecatedGetDOMStructure<ProxyRuntimeMethod>(exec), name, list) 186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 18781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(inherits(&s_info)); 188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* createStructure(JSGlobalData& globalData, JSValue prototype) 19181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 1922bde8e466a4451c7319e3a072d118917957d6554Steve Block return Structure::create(globalData, prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount, &s_info); 19381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static const ClassInfo s_info; 196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}; 197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockconst ClassInfo ProxyRuntimeMethod::s_info = { "ProxyRuntimeMethod", &RuntimeMethod::s_info, 0, 0 }; 199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSValue ProxyInstance::getMethod(JSC::ExecState* exec, const JSC::Identifier& propertyName) 201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block MethodList methodList = getClass()->methodsNamed(propertyName, this); 203e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block return new (exec) ProxyRuntimeMethod(exec, exec->lexicalGlobalObject(), propertyName, methodList); 204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 2065af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue ProxyInstance::invokeMethod(ExecState* exec, JSC::RuntimeMethod* runtimeMethod) 2075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!asObject(runtimeMethod)->inherits(&ProxyRuntimeMethod::s_info)) 209545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwError(exec, createTypeError(exec, "Attempt to invoke non-plug-in method on plug-in object.")); 210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const MethodList& methodList = *runtimeMethod->methods(); 212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 2135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark ASSERT(methodList.size() == 1); 2145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark ProxyMethod* method = static_cast<ProxyMethod*>(methodList[0]); 2165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2175af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return invoke(exec, Invoke, method->serverIdentifier(), ArgList(exec)); 2185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool ProxyInstance::supportsInvokeDefaultMethod() const 2215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 222231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!m_instanceProxy) 223231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 224231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 225563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark uint32_t requestID = m_instanceProxy->nextRequestID(); 226563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 2275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_WKPHNPObjectHasInvokeDefaultMethod(m_instanceProxy->hostProxy()->port(), 228563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark m_instanceProxy->pluginID(), requestID, 2295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark m_objectID) != KERN_SUCCESS) 2305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return false; 2315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 232d0825bca7fe65beaee391d30da42e937db621564Steve Block auto_ptr<NetscapePluginInstanceProxy::BooleanReply> reply = waitForReply<NetscapePluginInstanceProxy::BooleanReply>(requestID); 2335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (reply.get() && reply->m_result) 2345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return true; 2355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return false; 2375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2385af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 2395af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue ProxyInstance::invokeDefaultMethod(ExecState* exec) 2405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 2415af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return invoke(exec, InvokeDefault, 0, ArgList(exec)); 2425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool ProxyInstance::supportsConstruct() const 2455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 246231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!m_instanceProxy) 247231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 248231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 249563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark uint32_t requestID = m_instanceProxy->nextRequestID(); 250563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 2515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_WKPHNPObjectHasConstructMethod(m_instanceProxy->hostProxy()->port(), 252563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark m_instanceProxy->pluginID(), requestID, 2535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark m_objectID) != KERN_SUCCESS) 2545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return false; 2555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 256d0825bca7fe65beaee391d30da42e937db621564Steve Block auto_ptr<NetscapePluginInstanceProxy::BooleanReply> reply = waitForReply<NetscapePluginInstanceProxy::BooleanReply>(requestID); 2575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (reply.get() && reply->m_result) 2585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return true; 2595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return false; 2615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochJSValue ProxyInstance::invokeConstruct(ExecState* exec, const ArgList& args) 2645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 2655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return invoke(exec, Construct, 0, args); 2665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochJSValue ProxyInstance::defaultValue(ExecState* exec, PreferredPrimitiveType hint) const 2695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 2705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (hint == PreferString) 2715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return stringValue(exec); 2725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (hint == PreferNumber) 2735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return numberValue(exec); 2745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return valueOf(exec); 2755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochJSValue ProxyInstance::stringValue(ExecState* exec) const 2785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 2795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark // FIXME: Implement something sensible. 280d0825bca7fe65beaee391d30da42e937db621564Steve Block return jsEmptyString(exec); 2815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 283e14391e94c850b8bd03680c23b38978db68687a8John ReckJSValue ProxyInstance::numberValue(ExecState*) const 2845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 2855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark // FIXME: Implement something sensible. 286e14391e94c850b8bd03680c23b38978db68687a8John Reck return jsNumber(0); 2875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochJSValue ProxyInstance::booleanValue() const 2905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 2915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark // FIXME: Implement something sensible. 2925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return jsBoolean(false); 2935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochJSValue ProxyInstance::valueOf(ExecState* exec) const 2965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 2975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return stringValue(exec); 2985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 300563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid ProxyInstance::getPropertyNames(ExecState* exec, PropertyNameArray& nameArray) 301563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 302231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!m_instanceProxy) 303231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 304231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 305563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark uint32_t requestID = m_instanceProxy->nextRequestID(); 306563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 307563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (_WKPHNPObjectEnumerate(m_instanceProxy->hostProxy()->port(), m_instanceProxy->pluginID(), requestID, m_objectID) != KERN_SUCCESS) 308563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return; 309563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 310d0825bca7fe65beaee391d30da42e937db621564Steve Block auto_ptr<NetscapePluginInstanceProxy::BooleanAndDataReply> reply = waitForReply<NetscapePluginInstanceProxy::BooleanAndDataReply>(requestID); 3118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block NetscapePluginInstanceProxy::moveGlobalExceptionToExecState(exec); 312563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!reply.get() || !reply->m_returnValue) 313563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return; 314563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 315563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark RetainPtr<NSArray*> array = [NSPropertyListSerialization propertyListFromData:(NSData *)reply->m_result.get() 316563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark mutabilityOption:NSPropertyListImmutable 317563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark format:0 318563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark errorDescription:0]; 319563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 320563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (NSNumber *number in array.get()) { 321563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark IdentifierRep* identifier = reinterpret_cast<IdentifierRep*>([number longLongValue]); 322563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!IdentifierRep::isValid(identifier)) 323563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark continue; 324563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 325563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (identifier->isString()) { 326563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark const char* str = identifier->string(); 327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block nameArray.add(Identifier(JSDOMWindow::commonJSGlobalData(), stringToUString(String::fromUTF8WithLatin1Fallback(str, strlen(str))))); 328563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } else 329563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark nameArray.add(Identifier::from(exec, identifier->number())); 330563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 331563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 332563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 3335ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkMethodList ProxyInstance::methodsNamed(const Identifier& identifier) 3345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 335231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!m_instanceProxy) 336231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return MethodList(); 337231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 3380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // If we already have an entry in the map, use it. 339f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick MethodMap::iterator existingMapEntry = m_methods.find(identifier.impl()); 3400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (existingMapEntry != m_methods.end()) { 3415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark MethodList methodList; 3420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (existingMapEntry->second) 3430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch methodList.append(existingMapEntry->second); 3445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return methodList; 3455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark } 3460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 347f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick uint64_t methodName = reinterpret_cast<uint64_t>(_NPN_GetStringIdentifier(identifier.ascii().data())); 348563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark uint32_t requestID = m_instanceProxy->nextRequestID(); 349563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 3505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_WKPHNPObjectHasMethod(m_instanceProxy->hostProxy()->port(), 351563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark m_instanceProxy->pluginID(), requestID, 3525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark m_objectID, methodName) != KERN_SUCCESS) 3535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return MethodList(); 3545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 355d0825bca7fe65beaee391d30da42e937db621564Steve Block auto_ptr<NetscapePluginInstanceProxy::BooleanReply> reply = waitForReply<NetscapePluginInstanceProxy::BooleanReply>(requestID); 3560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!reply.get()) 3570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return MethodList(); 3585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!reply->m_result && !m_instanceProxy->hostProxy()->shouldCacheMissingPropertiesAndMethods()) 3600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return MethodList(); 3610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Add a new entry to the map unless an entry was added while we were in waitForReply. 363f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick pair<MethodMap::iterator, bool> mapAddResult = m_methods.add(identifier.impl(), 0); 3640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (mapAddResult.second && reply->m_result) 3650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch mapAddResult.first->second = new ProxyMethod(methodName); 3660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch MethodList methodList; 3680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (mapAddResult.first->second) 3690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch methodList.append(mapAddResult.first->second); 3700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return methodList; 3715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 3725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3735ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkField* ProxyInstance::fieldNamed(const Identifier& identifier) 3745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 375231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!m_instanceProxy) 376231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return 0; 377231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 3780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // If we already have an entry in the map, use it. 379f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick FieldMap::iterator existingMapEntry = m_fields.find(identifier.impl()); 3800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (existingMapEntry != m_fields.end()) 3810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return existingMapEntry->second; 3825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 383f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick uint64_t propertyName = reinterpret_cast<uint64_t>(_NPN_GetStringIdentifier(identifier.ascii().data())); 384563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark uint32_t requestID = m_instanceProxy->nextRequestID(); 385563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 3865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_WKPHNPObjectHasProperty(m_instanceProxy->hostProxy()->port(), 387563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark m_instanceProxy->pluginID(), requestID, 3885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark m_objectID, propertyName) != KERN_SUCCESS) 3895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return 0; 3900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 391d0825bca7fe65beaee391d30da42e937db621564Steve Block auto_ptr<NetscapePluginInstanceProxy::BooleanReply> reply = waitForReply<NetscapePluginInstanceProxy::BooleanReply>(requestID); 3920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!reply.get()) 3930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return 0; 3945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!reply->m_result && !m_instanceProxy->hostProxy()->shouldCacheMissingPropertiesAndMethods()) 3960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return 0; 3975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Add a new entry to the map unless an entry was added while we were in waitForReply. 399f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick pair<FieldMap::iterator, bool> mapAddResult = m_fields.add(identifier.impl(), 0); 4000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (mapAddResult.second && reply->m_result) 4010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch mapAddResult.first->second = new ProxyField(propertyName); 4020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return mapAddResult.first->second; 4035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 4045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 4050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochJSC::JSValue ProxyInstance::fieldValue(ExecState* exec, const Field* field) const 4065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 407231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!m_instanceProxy) 408231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return jsUndefined(); 409231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 4105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark uint64_t serverIdentifier = static_cast<const ProxyField*>(field)->serverIdentifier(); 411563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark uint32_t requestID = m_instanceProxy->nextRequestID(); 4125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 4135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_WKPHNPObjectGetProperty(m_instanceProxy->hostProxy()->port(), 414563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark m_instanceProxy->pluginID(), requestID, 4155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark m_objectID, serverIdentifier) != KERN_SUCCESS) 4165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return jsUndefined(); 4175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 418d0825bca7fe65beaee391d30da42e937db621564Steve Block auto_ptr<NetscapePluginInstanceProxy::BooleanAndDataReply> reply = waitForReply<NetscapePluginInstanceProxy::BooleanAndDataReply>(requestID); 4198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block NetscapePluginInstanceProxy::moveGlobalExceptionToExecState(exec); 4205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (!reply.get() || !reply->m_returnValue) 4215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return jsUndefined(); 4225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 4235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return m_instanceProxy->demarshalValue(exec, (char*)CFDataGetBytePtr(reply->m_result.get()), CFDataGetLength(reply->m_result.get())); 4245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 4255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 4260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid ProxyInstance::setFieldValue(ExecState* exec, const Field* field, JSValue value) const 4275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 428cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (!m_instanceProxy) 429231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 430231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 4315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark uint64_t serverIdentifier = static_cast<const ProxyField*>(field)->serverIdentifier(); 432563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark uint32_t requestID = m_instanceProxy->nextRequestID(); 4335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 4345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark data_t valueData; 4355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark mach_msg_type_number_t valueLength; 4365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 4375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark m_instanceProxy->marshalValue(exec, value, valueData, valueLength); 438692e5dbf12901edacf14812a6fae25462920af42Steve Block m_instanceProxy->retainLocalObject(value); 4395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark kern_return_t kr = _WKPHNPObjectSetProperty(m_instanceProxy->hostProxy()->port(), 440563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark m_instanceProxy->pluginID(), requestID, 4415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark m_objectID, serverIdentifier, valueData, valueLength); 4425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark mig_deallocate(reinterpret_cast<vm_address_t>(valueData), valueLength); 443dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_instanceProxy) 444dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_instanceProxy->releaseLocalObject(value); 4455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (kr != KERN_SUCCESS) 4465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return; 4475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 448d0825bca7fe65beaee391d30da42e937db621564Steve Block auto_ptr<NetscapePluginInstanceProxy::BooleanReply> reply = waitForReply<NetscapePluginInstanceProxy::BooleanReply>(requestID); 4498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block NetscapePluginInstanceProxy::moveGlobalExceptionToExecState(exec); 450563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 451563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 452563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid ProxyInstance::invalidate() 453563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 454231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(m_instanceProxy); 455231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 456563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (NetscapePluginHostProxy* hostProxy = m_instanceProxy->hostProxy()) 457563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark _WKPHNPObjectRelease(hostProxy->port(), 458563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark m_instanceProxy->pluginID(), m_objectID); 459563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark m_instanceProxy = 0; 4605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 4615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 4625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} // namespace WebKit 4635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 464e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif // USE(PLUGIN_HOST_PROCESS) && ENABLE(NETSCAPE_PLUGIN_API) 4655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 466