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