18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2003, 2006 Apple Computer, Inc.  All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(NETSCAPE_PLUGIN_API)
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "c_instance.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "CRuntimeObject.h"
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "IdentifierRep.h"
3481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "JSDOMBinding.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "c_class.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "c_runtime.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "c_utility.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "npruntime_impl.h"
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "runtime_method.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "runtime_root.h"
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <interpreter/CallFrame.h>
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <runtime/ArgList.h>
43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <runtime/Error.h>
4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <runtime/FunctionPrototype.h>
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <runtime/JSLock.h>
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <runtime/PropertyNameArray.h>
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Assertions.h>
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/StdLibExtras.h>
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/StringExtras.h>
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h>
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianusing namespace WebCore;
538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace Bindings {
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing JSC::UString;
58635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic JSC::UString& globalExceptionString()
60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(JSC::UString, exceptionStr, ());
62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return exceptionStr;
63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CInstance::setGlobalException(UString exception)
66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    globalExceptionString() = exception;
68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CInstance::moveGlobalExceptionToExecState(ExecState* exec)
71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (globalExceptionString().isNull())
73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSLock lock(SilenceAssertionsOnly);
77545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        throwError(exec, createError(exec, globalExceptionString()));
78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
79635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
80635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    globalExceptionString() = UString();
81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCInstance::CInstance(NPObject* o, PassRefPtr<RootObject> rootObject)
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : Instance(rootObject)
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _object = _NPN_RetainObject(o);
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _class = 0;
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCInstance::~CInstance()
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _NPN_ReleaseObject(_object);
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockRuntimeObject* CInstance::newRuntimeObject(ExecState* exec)
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
97e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    return new (exec) CRuntimeObject(exec, exec->lexicalGlobalObject(), this);
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectClass *CInstance::getClass() const
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_class)
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _class = CClass::classForIsA(_object->_class);
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _class;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CInstance::supportsInvokeDefaultMethod() const
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _object->_class->invokeDefault;
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass CRuntimeMethod : public RuntimeMethod {
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic:
114e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    CRuntimeMethod(ExecState* exec, JSGlobalObject* globalObject, const Identifier& name, Bindings::MethodList& list)
11581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // FIXME: deprecatedGetDOMStructure uses the prototype off of the wrong global object
11681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // We need to pass in the right global object for "i".
11781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        : RuntimeMethod(exec, globalObject, WebCore::deprecatedGetDOMStructure<CRuntimeMethod>(exec), name, list)
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
11981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ASSERT(inherits(&s_info));
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static Structure* createStructure(JSGlobalData& globalData, JSValue prototype)
12381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
1242bde8e466a4451c7319e3a072d118917957d6554Steve Block        return Structure::create(globalData, prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount, &s_info);
12581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    static const ClassInfo s_info;
128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block};
129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockconst ClassInfo CRuntimeMethod::s_info = { "CRuntimeMethod", &RuntimeMethod::s_info, 0, 0 };
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSValue CInstance::getMethod(ExecState* exec, const Identifier& propertyName)
133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    MethodList methodList = getClass()->methodsNamed(propertyName, this);
135e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    return new (exec) CRuntimeMethod(exec, exec->lexicalGlobalObject(), propertyName, methodList);
136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1385af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue CInstance::invokeMethod(ExecState* exec, RuntimeMethod* runtimeMethod)
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!asObject(runtimeMethod)->inherits(&CRuntimeMethod::s_info))
141545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return throwError(exec, createTypeError(exec, "Attempt to invoke non-plug-in method on plug-in object."));
142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const MethodList& methodList = *runtimeMethod->methods();
144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Overloading methods are not allowed by NPObjects.  Should only be one
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // name match for a particular method.
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(methodList.size() == 1);
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CMethod* method = static_cast<CMethod*>(methodList[0]);
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    NPIdentifier ident = method->identifier();
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_object->_class->hasMethod(_object, ident))
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1555af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    unsigned count = exec->argumentCount();
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<NPVariant, 8> cArgs(count);
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned i;
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < count; i++)
1605af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        convertValueToNPVariant(exec, exec->argument(i), &cArgs[i]);
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Invoke the 'C' method.
163cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    bool retval = true;
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPVariant resultVariant;
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    VOID_TO_NPVARIANT(resultVariant);
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSLock::DropAllLocks dropAllLocks(SilenceAssertionsOnly);
169635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ASSERT(globalExceptionString().isNull());
170cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        retval = _object->_class->invoke(_object, ident, cArgs.data(), count, &resultVariant);
171635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        moveGlobalExceptionToExecState(exec);
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
173cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
174cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!retval)
175a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        throwError(exec, createError(exec, "Error calling method on NPObject."));
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < count; i++)
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _NPN_ReleaseVariantValue(&cArgs[i]);
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18016885d427ad88d2062898f56b801491974b88201Steve Block    JSValue resultValue = convertNPVariantToValue(exec, &resultVariant, m_rootObject.get());
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _NPN_ReleaseVariantValue(&resultVariant);
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return resultValue;
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1865af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue CInstance::invokeDefaultMethod(ExecState* exec)
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_object->_class->invokeDefault)
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    unsigned count = exec->argumentCount();
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<NPVariant, 8> cArgs(count);
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned i;
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < count; i++)
1965af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        convertValueToNPVariant(exec, exec->argument(i), &cArgs[i]);
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Invoke the 'C' method.
199cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    bool retval = true;
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPVariant resultVariant;
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    VOID_TO_NPVARIANT(resultVariant);
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
2030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSLock::DropAllLocks dropAllLocks(SilenceAssertionsOnly);
204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ASSERT(globalExceptionString().isNull());
205cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        retval = _object->_class->invokeDefault(_object, cArgs.data(), count, &resultVariant);
206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        moveGlobalExceptionToExecState(exec);
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
208cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
209cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!retval)
210a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        throwError(exec, createError(exec, "Error calling method on NPObject."));
211635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < count; i++)
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _NPN_ReleaseVariantValue(&cArgs[i]);
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21516885d427ad88d2062898f56b801491974b88201Steve Block    JSValue resultValue = convertNPVariantToValue(exec, &resultVariant, m_rootObject.get());
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _NPN_ReleaseVariantValue(&resultVariant);
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return resultValue;
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CInstance::supportsConstruct() const
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _object->_class->construct;
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2255f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue CInstance::invokeConstruct(ExecState* exec, const ArgList& args)
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_object->_class->construct)
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned count = args.size();
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<NPVariant, 8> cArgs(count);
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned i;
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < count; i++)
2355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        convertValueToNPVariant(exec, args.at(i), &cArgs[i]);
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Invoke the 'C' method.
238cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    bool retval = true;
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPVariant resultVariant;
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    VOID_TO_NPVARIANT(resultVariant);
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
2420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSLock::DropAllLocks dropAllLocks(SilenceAssertionsOnly);
243635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ASSERT(globalExceptionString().isNull());
244cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        retval = _object->_class->construct(_object, cArgs.data(), count, &resultVariant);
245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        moveGlobalExceptionToExecState(exec);
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
247cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
248cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!retval)
249a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        throwError(exec, createError(exec, "Error calling method on NPObject."));
250635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < count; i++)
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _NPN_ReleaseVariantValue(&cArgs[i]);
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
25416885d427ad88d2062898f56b801491974b88201Steve Block    JSValue resultValue = convertNPVariantToValue(exec, &resultVariant, m_rootObject.get());
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _NPN_ReleaseVariantValue(&resultVariant);
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return resultValue;
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2595f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue CInstance::defaultValue(ExecState* exec, PreferredPrimitiveType hint) const
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hint == PreferString)
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return stringValue(exec);
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hint == PreferNumber)
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return numberValue(exec);
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return valueOf(exec);
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2685f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue CInstance::stringValue(ExecState* exec) const
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    char buf[1024];
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    snprintf(buf, sizeof(buf), "NPObject %p, NPClass %p", _object, _object->_class);
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return jsString(exec, buf);
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
275e14391e94c850b8bd03680c23b38978db68687a8John ReckJSValue CInstance::numberValue(ExecState*) const
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Implement something sensible.
278e14391e94c850b8bd03680c23b38978db68687a8John Reck    return jsNumber(0);
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2815f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue CInstance::booleanValue() const
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Implement something sensible.
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return jsBoolean(false);
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2875f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue CInstance::valueOf(ExecState* exec) const
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return stringValue(exec);
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CInstance::getPropertyNames(ExecState* exec, PropertyNameArray& nameArray)
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!NP_CLASS_STRUCT_VERSION_HAS_ENUM(_object->_class) || !_object->_class->enumerate)
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    uint32_t count;
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPIdentifier* identifiers;
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
3010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSLock::DropAllLocks dropAllLocks(SilenceAssertionsOnly);
302635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ASSERT(globalExceptionString().isNull());
303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool ok = _object->_class->enumerate(_object, &identifiers, &count);
304635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        moveGlobalExceptionToExecState(exec);
305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (!ok)
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (uint32_t i = 0; i < count; i++) {
3108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        IdentifierRep* identifier = static_cast<IdentifierRep*>(identifiers[i]);
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (identifier->isString())
313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            nameArray.add(identifierFromNPIdentifier(exec, identifier->string()));
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
3158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            nameArray.add(Identifier::from(exec, identifier->number()));
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This should really call NPN_MemFree but that's in WebKit
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    free(identifiers);
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(NETSCAPE_PLUGIN_API)
326