blob: 9b84d337f46e0885a4a3085773570f40f15102db [file] [log] [blame]
/*
* Copyright (C) 2007 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "webkit/tools/pepper_test_plugin/test_object.h"
#include <stdlib.h>
#include "webkit/tools/pepper_test_plugin/plugin_object.h"
static bool testEnumerate(NPObject*, NPIdentifier **value, uint32_t *count);
static bool testHasMethod(NPObject*, NPIdentifier name);
static bool testInvoke(NPObject* header, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result);
static bool testInvokeDefault(NPObject*, const NPVariant *args, uint32_t argCount, NPVariant *result);
static bool testHasProperty(NPObject*, NPIdentifier name);
static bool testGetProperty(NPObject*, NPIdentifier name, NPVariant *variant);
static NPObject *testAllocate(NPP npp, NPClass *theClass);
static void testDeallocate(NPObject*);
static bool testConstruct(NPObject*, const NPVariant* args, uint32_t argCount, NPVariant* result);
static NPClass testClass = {
NP_CLASS_STRUCT_VERSION,
testAllocate,
testDeallocate,
0,
testHasMethod,
testInvoke,
testInvokeDefault,
testHasProperty,
testGetProperty,
0,
0,
testEnumerate,
testConstruct
};
NPClass* GetTestClass()
{
return &testClass;
}
int testObjectCount = 0;
int GetTestObjectCount()
{
return testObjectCount;
}
static bool identifiersInitialized = false;
#define NUM_ENUMERABLE_TEST_IDENTIFIERS 4
#define NUM_TEST_IDENTIFIERS 5
#define ID_PROPERTY_FOO 0
#define ID_PROPERTY_BAR 1
#define ID_PROPERTY_TEST_OBJECT 2
#define ID_PROPERTY_REF_COUNT 3
#define ID_PROPERTY_OBJECT_POINTER 4
static NPIdentifier testIdentifiers[NUM_TEST_IDENTIFIERS];
static const NPUTF8 *testIdentifierNames[NUM_TEST_IDENTIFIERS] = {
"foo",
"bar",
"testObject",
"refCount",
"objectPointer",
};
#define ID_THROW_EXCEPTION_METHOD 0
#define NUM_METHOD_IDENTIFIERS 1
static NPIdentifier testMethodIdentifiers[NUM_METHOD_IDENTIFIERS];
static const NPUTF8 *testMethodIdentifierNames[NUM_METHOD_IDENTIFIERS] = {
"throwException",
};
static void initializeIdentifiers(void)
{
browser->getstringidentifiers(testIdentifierNames, NUM_TEST_IDENTIFIERS, testIdentifiers);
browser->getstringidentifiers(testMethodIdentifierNames, NUM_METHOD_IDENTIFIERS, testMethodIdentifiers);
}
static NPObject *testAllocate(NPP npp, NPClass *theClass)
{
TestObject *newInstance =
static_cast<TestObject*>(malloc(sizeof(TestObject)));
newInstance->test_object = NULL;
++testObjectCount;
if (!identifiersInitialized) {
identifiersInitialized = true;
initializeIdentifiers();
}
return reinterpret_cast<NPObject*>(newInstance);
}
static void testDeallocate(NPObject *obj)
{
TestObject *testObject = reinterpret_cast<TestObject*>(obj);
if (testObject->test_object)
browser->releaseobject(testObject->test_object);
--testObjectCount;
free(obj);
}
static bool testHasMethod(NPObject*, NPIdentifier name)
{
for (unsigned i = 0; i < NUM_METHOD_IDENTIFIERS; i++) {
if (testMethodIdentifiers[i] == name)
return true;
}
return false;
}
static bool testInvoke(NPObject* header, NPIdentifier name, const NPVariant* /*args*/, uint32_t /*argCount*/, NPVariant* /*result*/)
{
if (name == testMethodIdentifiers[ID_THROW_EXCEPTION_METHOD]) {
browser->setexception(header, "test object throwException SUCCESS");
return true;
}
return false;
}
static bool testInvokeDefault(NPObject *obj, const NPVariant *args,
uint32_t argCount, NPVariant *result)
{
INT32_TO_NPVARIANT(2, *result);
return true;
}
static bool testHasProperty(NPObject*, NPIdentifier name)
{
for (unsigned i = 0; i < NUM_TEST_IDENTIFIERS; i++) {
if (testIdentifiers[i] == name)
return true;
}
return false;
}
static bool testGetProperty(NPObject *obj, NPIdentifier name,
NPVariant *variant)
{
if (name == testIdentifiers[ID_PROPERTY_FOO]) {
char* mem = static_cast<char*>(browser->memalloc(4));
strcpy(mem, "foo");
STRINGZ_TO_NPVARIANT(mem, *variant);
return true;
} else if (name == testIdentifiers[ID_PROPERTY_BAR]) {
BOOLEAN_TO_NPVARIANT(true, *variant);
return true;
} else if (name == testIdentifiers[ID_PROPERTY_TEST_OBJECT]) {
TestObject* testObject = reinterpret_cast<TestObject*>(obj);
if (testObject->test_object == NULL)
testObject->test_object = browser->createobject(NULL, &testClass);
browser->retainobject(testObject->test_object);
OBJECT_TO_NPVARIANT(testObject->test_object, *variant);
return true;
} else if (name == testIdentifiers[ID_PROPERTY_REF_COUNT]) {
INT32_TO_NPVARIANT(obj->referenceCount, *variant);
return true;
} else if (name == testIdentifiers[ID_PROPERTY_OBJECT_POINTER]) {
int32_t objectPointer = static_cast<int32_t>(reinterpret_cast<long long>(obj));
INT32_TO_NPVARIANT(objectPointer, *variant);
return true;
}
return false;
}
static bool testEnumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count)
{
*count = NUM_ENUMERABLE_TEST_IDENTIFIERS;
*value = (NPIdentifier*)browser->memalloc(NUM_ENUMERABLE_TEST_IDENTIFIERS * sizeof(NPIdentifier));
memcpy(*value, testIdentifiers, sizeof(NPIdentifier) * NUM_ENUMERABLE_TEST_IDENTIFIERS);
return true;
}
static bool testConstruct(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result)
{
browser->retainobject(npobj);
// Just return the same object.
OBJECT_TO_NPVARIANT(npobj, *result);
return true;
}