1563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/* 2563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Copyright (C) 2007 Apple Inc. All rights reserved. 3563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 4563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Redistribution and use in source and binary forms, with or without 5563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * modification, are permitted provided that the following conditions 6563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * are met: 7563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 1. Redistributions of source code must retain the above copyright 8563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * notice, this list of conditions and the following disclaimer. 9563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 2. Redistributions in binary form must reproduce the above copyright 10563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * notice, this list of conditions and the following disclaimer in the 11563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * documentation and/or other materials provided with the distribution. 12563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 13563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */ 25563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 26563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "TestObject.h" 27563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "PluginObject.h" 28563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 29563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <string.h> 30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <stdlib.h> 31563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool testEnumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count); 33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool testHasMethod(NPObject*, NPIdentifier name); 34563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool testInvoke(NPObject*, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result); 35563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool testHasProperty(NPObject*, NPIdentifier name); 36563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool testGetProperty(NPObject*, NPIdentifier name, NPVariant*); 37563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic NPObject *testAllocate(NPP npp, NPClass *theClass); 38563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void testDeallocate(NPObject *obj); 39563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool testConstruct(NPObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result); 40563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 41563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic NPClass testClass = { 42563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark NP_CLASS_STRUCT_VERSION, 43563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testAllocate, 44563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testDeallocate, 45563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 0, 46563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testHasMethod, 47563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testInvoke, 48563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 0, 49563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testHasProperty, 50563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testGetProperty, 51563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 0, 52563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 0, 53563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testEnumerate, 54563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testConstruct 55563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}; 56563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 57563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkNPClass *getTestClass(void) 58563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 59563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return &testClass; 60563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 61563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic int testObjectCount = 0; 634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangint getTestObjectCount() 654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return testObjectCount; 674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhutypedef struct { 7028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu NPObject header; 7128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu NPObject* testObject; 7228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} TestObject; 73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 7428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhustatic bool identifiersInitialized = false; 75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 76563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#define NUM_ENUMERATABLE_TEST_IDENTIFIERS 2 7728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 7828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuenum { 7928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ID_PROPERTY_FOO = 0, 8028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ID_PROPERTY_BAR, 8128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ID_PROPERTY_OBJECT_POINTER, 8228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ID_PROPERTY_TEST_OBJECT, 834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ID_PROPERTY_REF_COUNT, 8428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu NUM_TEST_IDENTIFIERS, 8528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}; 86563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 87563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic NPIdentifier testIdentifiers[NUM_TEST_IDENTIFIERS]; 88563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic const NPUTF8 *testIdentifierNames[NUM_TEST_IDENTIFIERS] = { 89563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark "foo", 90563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark "bar", 91563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark "objectPointer", 9228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu "testObject", 934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang "refCount", 94563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}; 95563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 96563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#define ID_THROW_EXCEPTION_METHOD 0 97563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#define NUM_METHOD_IDENTIFIERS 1 98563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 99563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic NPIdentifier testMethodIdentifiers[NUM_METHOD_IDENTIFIERS]; 100563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic const NPUTF8 *testMethodIdentifierNames[NUM_METHOD_IDENTIFIERS] = { 101563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark "throwException", 102563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}; 103563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 104563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void initializeIdentifiers(void) 105563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 106563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark browser->getstringidentifiers(testIdentifierNames, NUM_TEST_IDENTIFIERS, testIdentifiers); 107563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark browser->getstringidentifiers(testMethodIdentifierNames, NUM_METHOD_IDENTIFIERS, testMethodIdentifiers); 108563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 109563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 11028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhustatic NPObject* testAllocate(NPP /*npp*/, NPClass* /*theClass*/) 111563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 11228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu TestObject* newInstance = static_cast<TestObject*>(malloc(sizeof(TestObject))); 11328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu newInstance->testObject = 0; 1144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ++testObjectCount; 11528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 116563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!identifiersInitialized) { 117563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark identifiersInitialized = true; 118563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark initializeIdentifiers(); 119563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 12028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 12128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return reinterpret_cast<NPObject*>(newInstance); 122563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 123563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 124563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void testDeallocate(NPObject *obj) 125563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 12628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu TestObject* testObject = reinterpret_cast<TestObject*>(obj); 12728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (testObject->testObject) 12828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu browser->releaseobject(testObject->testObject); 1294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang --testObjectCount; 131563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark free(obj); 132563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 133563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 134563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool testHasMethod(NPObject*, NPIdentifier name) 135563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 136563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (unsigned i = 0; i < NUM_METHOD_IDENTIFIERS; i++) { 137563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (testMethodIdentifiers[i] == name) 138563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return true; 139563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 140563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return false; 141563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 142563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 143231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic bool testInvoke(NPObject* header, NPIdentifier name, const NPVariant* /*args*/, uint32_t /*argCount*/, NPVariant* /*result*/) 144563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 145563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (name == testMethodIdentifiers[ID_THROW_EXCEPTION_METHOD]) { 146563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark browser->setexception(header, "test object throwException SUCCESS"); 147563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return true; 148563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 149563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return false; 150563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 151563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 152563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool testHasProperty(NPObject*, NPIdentifier name) 153563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 154563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (unsigned i = 0; i < NUM_TEST_IDENTIFIERS; i++) { 155563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (testIdentifiers[i] == name) 156563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return true; 157563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 158563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 159563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return false; 160563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 161563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 162563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool testGetProperty(NPObject* npobj, NPIdentifier name, NPVariant* result) 163563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 16428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (name == testIdentifiers[ID_PROPERTY_FOO]) { 16528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu char* mem = static_cast<char*>(browser->memalloc(4)); 16628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu strcpy(mem, "foo"); 16728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu STRINGZ_TO_NPVARIANT(mem, *result); 16828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return true; 16928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 17028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (name == testIdentifiers[ID_PROPERTY_OBJECT_POINTER]) { 171563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark int32_t objectPointer = static_cast<int32_t>(reinterpret_cast<long long>(npobj)); 172563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 173563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark INT32_TO_NPVARIANT(objectPointer, *result); 174563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return true; 175563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 17628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (name == testIdentifiers[ID_PROPERTY_TEST_OBJECT]) { 17728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu TestObject* testObject = reinterpret_cast<TestObject*>(npobj); 17828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (!testObject->testObject) 17928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu testObject->testObject = browser->createobject(0, &testClass); 18028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu browser->retainobject(testObject->testObject); 18128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu OBJECT_TO_NPVARIANT(testObject->testObject, *result); 18228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return true; 18328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 1844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (name == testIdentifiers[ID_PROPERTY_REF_COUNT]) { 1854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang INT32_TO_NPVARIANT(npobj->referenceCount, *result); 1864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return true; 1874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 188563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 189563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return false; 190563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 191563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 192231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic bool testEnumerate(NPObject* /*npobj*/, NPIdentifier **value, uint32_t *count) 193563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 194563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *count = NUM_ENUMERATABLE_TEST_IDENTIFIERS; 195563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 196563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *value = (NPIdentifier*)browser->memalloc(NUM_ENUMERATABLE_TEST_IDENTIFIERS * sizeof(NPIdentifier)); 197563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark memcpy(*value, testIdentifiers, sizeof(NPIdentifier) * NUM_ENUMERATABLE_TEST_IDENTIFIERS); 198563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 199563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return true; 200563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 201563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 202231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic bool testConstruct(NPObject* npobj, const NPVariant* /*args*/, uint32_t /*argCount*/, NPVariant* result) 203563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 204563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark browser->retainobject(npobj); 205563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 206563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark // Just return the same object. 207563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark OBJECT_TO_NPVARIANT(npobj, *result); 208563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return true; 209563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 210