This source file includes following definitions.
- initializeIdentifiers
- testAllocate
- testDeallocate
- testHasMethod
- testInvoke
- testHasProperty
- testGetProperty
- testEnumerate
- testConstruct
- GetTestClass
- GetTestObjectCount
#include "content/shell/tools/plugin/test_object.h"
#include "PluginObject.h"
#include <string.h>
#include <stdlib.h>
static bool testEnumerate(NPObject* npobj,
NPIdentifier** value,
uint32_t* count);
static bool testHasMethod(NPObject*, NPIdentifier name);
static bool testInvoke(NPObject*,
NPIdentifier name,
const NPVariant* args,
uint32_t argCount,
NPVariant* result);
static bool testHasProperty(NPObject*, NPIdentifier name);
static bool testGetProperty(NPObject*, NPIdentifier name, NPVariant*);
static NPObject* testAllocate(NPP npp, NPClass* theClass);
static void testDeallocate(NPObject* obj);
static bool testConstruct(NPObject* obj,
const NPVariant* args,
uint32_t argCount,
NPVariant* result);
static NPClass g_test_class = {
NP_CLASS_STRUCT_VERSION, testAllocate, testDeallocate, 0,
testHasMethod, testInvoke, 0, testHasProperty,
testGetProperty, 0, 0, testEnumerate,
testConstruct};
static int g_test_object_count = 0;
typedef struct {
NPObject header;
NPObject* testObject;
} TestObject;
static bool identifiersInitialized = false;
#define NUM_ENUMERATABLE_TEST_IDENTIFIERS 2
enum {
ID_PROPERTY_FOO = 0,
ID_PROPERTY_BAR,
ID_PROPERTY_OBJECT_POINTER,
ID_PROPERTY_TEST_OBJECT,
ID_PROPERTY_REF_COUNT,
NUM_TEST_IDENTIFIERS,
};
static NPIdentifier testIdentifiers[NUM_TEST_IDENTIFIERS];
static const NPUTF8* testIdentifierNames[NUM_TEST_IDENTIFIERS] = {
"foo", "bar", "objectPointer", "testObject", "refCount", };
#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* ) {
TestObject* newInstance =
static_cast<TestObject*>(malloc(sizeof(TestObject)));
newInstance->testObject = 0;
++g_test_object_count;
if (!identifiersInitialized) {
identifiersInitialized = true;
initializeIdentifiers();
}
return reinterpret_cast<NPObject*>(newInstance);
}
static void testDeallocate(NPObject* obj) {
TestObject* testObject = reinterpret_cast<TestObject*>(obj);
if (testObject->testObject)
browser->releaseobject(testObject->testObject);
--g_test_object_count;
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* ,
uint32_t ,
NPVariant* ) {
if (name == testMethodIdentifiers[ID_THROW_EXCEPTION_METHOD]) {
browser->setexception(header, "test object throwException SUCCESS");
return true;
}
return false;
}
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* npobj,
NPIdentifier name,
NPVariant* result) {
if (name == testIdentifiers[ID_PROPERTY_FOO]) {
char* mem = static_cast<char*>(browser->memalloc(4));
strcpy(mem, "foo");
STRINGZ_TO_NPVARIANT(mem, *result);
return true;
}
if (name == testIdentifiers[ID_PROPERTY_BAR]) {
char* mem = static_cast<char*>(browser->memalloc(4));
strcpy(mem, "bar");
STRINGZ_TO_NPVARIANT(mem, *result);
return true;
}
if (name == testIdentifiers[ID_PROPERTY_OBJECT_POINTER]) {
int32_t objectPointer =
static_cast<int32_t>(reinterpret_cast<long long>(npobj));
INT32_TO_NPVARIANT(objectPointer, *result);
return true;
}
if (name == testIdentifiers[ID_PROPERTY_TEST_OBJECT]) {
TestObject* testObject = reinterpret_cast<TestObject*>(npobj);
if (!testObject->testObject)
testObject->testObject = browser->createobject(0, &g_test_class);
browser->retainobject(testObject->testObject);
OBJECT_TO_NPVARIANT(testObject->testObject, *result);
return true;
}
if (name == testIdentifiers[ID_PROPERTY_REF_COUNT]) {
INT32_TO_NPVARIANT(npobj->referenceCount, *result);
return true;
}
return false;
}
static bool testEnumerate(NPObject* ,
NPIdentifier** value,
uint32_t* count) {
*count = NUM_ENUMERATABLE_TEST_IDENTIFIERS;
*value = (NPIdentifier*)browser->memalloc(NUM_ENUMERATABLE_TEST_IDENTIFIERS *
sizeof(NPIdentifier));
memcpy(*value,
testIdentifiers,
sizeof(NPIdentifier) * NUM_ENUMERATABLE_TEST_IDENTIFIERS);
return true;
}
static bool testConstruct(NPObject* npobj,
const NPVariant* ,
uint32_t ,
NPVariant* result) {
browser->retainobject(npobj);
OBJECT_TO_NPVARIANT(npobj, *result);
return true;
}
namespace content {
NPClass* GetTestClass() { return &g_test_class; }
int GetTestObjectCount() { return g_test_object_count; }
}