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