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