Home | History | Annotate | Download | only in plugin
      1 /*
      2  * Copyright (C) 2007 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "TestObject.h"
     27 #include "PluginObject.h"
     28 
     29 #include <string.h>
     30 #include <stdlib.h>
     31 
     32 static bool testEnumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count);
     33 static bool testHasMethod(NPObject*, NPIdentifier name);
     34 static bool testInvoke(NPObject*, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result);
     35 static bool testHasProperty(NPObject*, NPIdentifier name);
     36 static bool testGetProperty(NPObject*, NPIdentifier name, NPVariant*);
     37 static NPObject *testAllocate(NPP npp, NPClass *theClass);
     38 static void testDeallocate(NPObject *obj);
     39 static bool testConstruct(NPObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result);
     40 
     41 static NPClass testClass = {
     42     NP_CLASS_STRUCT_VERSION,
     43     testAllocate,
     44     testDeallocate,
     45     0,
     46     testHasMethod,
     47     testInvoke,
     48     0,
     49     testHasProperty,
     50     testGetProperty,
     51     0,
     52     0,
     53     testEnumerate,
     54     testConstruct
     55 };
     56 
     57 NPClass *getTestClass(void)
     58 {
     59     return &testClass;
     60 }
     61 
     62 static int testObjectCount = 0;
     63 
     64 int getTestObjectCount()
     65 {
     66     return testObjectCount;
     67 }
     68 
     69 typedef struct {
     70     NPObject header;
     71     NPObject* testObject;
     72 } TestObject;
     73 
     74 static bool identifiersInitialized = false;
     75 
     76 #define NUM_ENUMERATABLE_TEST_IDENTIFIERS 2
     77 
     78 enum {
     79     ID_PROPERTY_FOO = 0,
     80     ID_PROPERTY_BAR,
     81     ID_PROPERTY_OBJECT_POINTER,
     82     ID_PROPERTY_TEST_OBJECT,
     83     ID_PROPERTY_REF_COUNT,
     84     NUM_TEST_IDENTIFIERS,
     85 };
     86 
     87 static NPIdentifier testIdentifiers[NUM_TEST_IDENTIFIERS];
     88 static const NPUTF8 *testIdentifierNames[NUM_TEST_IDENTIFIERS] = {
     89     "foo",
     90     "bar",
     91     "objectPointer",
     92     "testObject",
     93     "refCount",
     94 };
     95 
     96 #define ID_THROW_EXCEPTION_METHOD   0
     97 #define NUM_METHOD_IDENTIFIERS      1
     98 
     99 static NPIdentifier testMethodIdentifiers[NUM_METHOD_IDENTIFIERS];
    100 static const NPUTF8 *testMethodIdentifierNames[NUM_METHOD_IDENTIFIERS] = {
    101     "throwException",
    102 };
    103 
    104 static void initializeIdentifiers(void)
    105 {
    106     browser->getstringidentifiers(testIdentifierNames, NUM_TEST_IDENTIFIERS, testIdentifiers);
    107     browser->getstringidentifiers(testMethodIdentifierNames, NUM_METHOD_IDENTIFIERS, testMethodIdentifiers);
    108 }
    109 
    110 static NPObject* testAllocate(NPP npp, NPClass* /*theClass*/)
    111 {
    112     TestObject* newInstance = static_cast<TestObject*>(malloc(sizeof(TestObject)));
    113     newInstance->testObject = 0;
    114     ++testObjectCount;
    115 
    116     if (!identifiersInitialized) {
    117         identifiersInitialized = true;
    118         initializeIdentifiers();
    119     }
    120 
    121     return reinterpret_cast<NPObject*>(newInstance);
    122 }
    123 
    124 static void testDeallocate(NPObject *obj)
    125 {
    126     TestObject* testObject = reinterpret_cast<TestObject*>(obj);
    127     if (testObject->testObject)
    128         browser->releaseobject(testObject->testObject);
    129 
    130     --testObjectCount;
    131     free(obj);
    132 }
    133 
    134 static bool testHasMethod(NPObject*, NPIdentifier name)
    135 {
    136     for (unsigned i = 0; i < NUM_METHOD_IDENTIFIERS; i++) {
    137         if (testMethodIdentifiers[i] == name)
    138             return true;
    139     }
    140     return false;
    141 }
    142 
    143 static bool testInvoke(NPObject* header, NPIdentifier name, const NPVariant* /*args*/, uint32_t /*argCount*/, NPVariant* /*result*/)
    144 {
    145     if (name == testMethodIdentifiers[ID_THROW_EXCEPTION_METHOD]) {
    146         browser->setexception(header, "test object throwException SUCCESS");
    147         return true;
    148      }
    149      return false;
    150 }
    151 
    152 static bool testHasProperty(NPObject*, NPIdentifier name)
    153 {
    154     for (unsigned i = 0; i < NUM_TEST_IDENTIFIERS; i++) {
    155         if (testIdentifiers[i] == name)
    156             return true;
    157     }
    158 
    159     return false;
    160 }
    161 
    162 static bool testGetProperty(NPObject* npobj, NPIdentifier name, NPVariant* result)
    163 {
    164     if (name == testIdentifiers[ID_PROPERTY_FOO]) {
    165         char* mem = static_cast<char*>(browser->memalloc(4));
    166         strcpy(mem, "foo");
    167         STRINGZ_TO_NPVARIANT(mem, *result);
    168         return true;
    169     }
    170     if (name == testIdentifiers[ID_PROPERTY_OBJECT_POINTER]) {
    171         int32_t objectPointer = static_cast<int32_t>(reinterpret_cast<long long>(npobj));
    172 
    173         INT32_TO_NPVARIANT(objectPointer, *result);
    174         return true;
    175     }
    176     if (name == testIdentifiers[ID_PROPERTY_TEST_OBJECT]) {
    177         TestObject* testObject = reinterpret_cast<TestObject*>(npobj);
    178         if (!testObject->testObject)
    179             testObject->testObject = browser->createobject(0, &testClass);
    180         browser->retainobject(testObject->testObject);
    181         OBJECT_TO_NPVARIANT(testObject->testObject, *result);
    182         return true;
    183     }
    184     if (name == testIdentifiers[ID_PROPERTY_REF_COUNT]) {
    185         INT32_TO_NPVARIANT(npobj->referenceCount, *result);
    186         return true;
    187     }
    188 
    189     return false;
    190 }
    191 
    192 static bool testEnumerate(NPObject* /*npobj*/, NPIdentifier **value, uint32_t *count)
    193 {
    194     *count = NUM_ENUMERATABLE_TEST_IDENTIFIERS;
    195 
    196     *value = (NPIdentifier*)browser->memalloc(NUM_ENUMERATABLE_TEST_IDENTIFIERS * sizeof(NPIdentifier));
    197     memcpy(*value, testIdentifiers, sizeof(NPIdentifier) * NUM_ENUMERATABLE_TEST_IDENTIFIERS);
    198 
    199     return true;
    200 }
    201 
    202 static bool testConstruct(NPObject* npobj, const NPVariant* /*args*/, uint32_t /*argCount*/, NPVariant* result)
    203 {
    204     browser->retainobject(npobj);
    205 
    206     // Just return the same object.
    207     OBJECT_TO_NPVARIANT(npobj, *result);
    208     return true;
    209 }
    210