📄 pluginobject.cpp
字号:
/* * Copyright (C) 2006, 2007, 2008 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 "PluginObject.h"#include "TestObject.h"#include <assert.h>#include <stdio.h>#include <string.h>#include <stdlib.h>static void pluginInvalidate(NPObject*);static bool pluginHasProperty(NPObject*, NPIdentifier name);static bool pluginHasMethod(NPObject*, NPIdentifier name);static bool pluginGetProperty(NPObject*, NPIdentifier name, NPVariant*);static bool pluginSetProperty(NPObject*, NPIdentifier name, const NPVariant*);static bool pluginInvoke(NPObject*, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result);static bool pluginInvokeDefault(NPObject*, const NPVariant* args, uint32_t argCount, NPVariant* result);static NPObject* pluginAllocate(NPP npp, NPClass*);static void pluginDeallocate(NPObject*);NPNetscapeFuncs* browser;static NPClass pluginClass = { NP_CLASS_STRUCT_VERSION, pluginAllocate, pluginDeallocate, pluginInvalidate, pluginHasMethod, pluginInvoke, pluginInvokeDefault, pluginHasProperty, pluginGetProperty, pluginSetProperty,};NPClass *getPluginClass(void){ return &pluginClass;}static bool identifiersInitialized = false;#define ID_PROPERTY_PROPERTY 0#define ID_PROPERTY_EVENT_LOGGING 1#define ID_PROPERTY_HAS_STREAM 2#define ID_PROPERTY_TEST_OBJECT 3#define ID_PROPERTY_LOG_DESTROY 4#define ID_PROPERTY_RETURN_ERROR_FROM_NEWSTREAM 5#define NUM_PROPERTY_IDENTIFIERS 6static NPIdentifier pluginPropertyIdentifiers[NUM_PROPERTY_IDENTIFIERS];static const NPUTF8 *pluginPropertyIdentifierNames[NUM_PROPERTY_IDENTIFIERS] = { "property", "eventLoggingEnabled", "hasStream", "testObject", "logDestroy", "returnErrorFromNewStream",};#define ID_TEST_CALLBACK_METHOD 0#define ID_TEST_GETURL 1#define ID_REMOVE_DEFAULT_METHOD 2#define ID_TEST_DOM_ACCESS 3#define ID_TEST_GET_URL_NOTIFY 4#define ID_TEST_INVOKE_DEFAULT 5#define ID_DESTROY_STREAM 6#define ID_TEST_ENUMERATE 7#define ID_TEST_GETINTIDENTIFIER 8#define ID_TEST_GET_PROPERTY 9#define ID_TEST_EVALUATE 10#define ID_TEST_GET_PROPERTY_RETURN_VALUE 11#define ID_TEST_IDENTIFIER_TO_STRING 12#define ID_TEST_IDENTIFIER_TO_INT 13#define ID_TEST_POSTURL_FILE 14#define ID_TEST_CONSTRUCT 15#define ID_TEST_THROW_EXCEPTION_METHOD 16#define ID_DESTROY_NULL_STREAM 17#define NUM_METHOD_IDENTIFIERS 18static NPIdentifier pluginMethodIdentifiers[NUM_METHOD_IDENTIFIERS];static const NPUTF8 *pluginMethodIdentifierNames[NUM_METHOD_IDENTIFIERS] = { "testCallback", "getURL", "removeDefaultMethod", "testDOMAccess", "getURLNotify", "testInvokeDefault", "destroyStream", "testEnumerate", "testGetIntIdentifier", "testGetProperty", "testEvaluate", "testGetPropertyReturnValue", "testIdentifierToString", "testIdentifierToInt", "testPostURLFile", "testConstruct", "testThrowException", "destroyNullStream"};static NPUTF8* createCStringFromNPVariant(const NPVariant* variant){ size_t length = NPVARIANT_TO_STRING(*variant).UTF8Length; NPUTF8* result = (NPUTF8*)malloc(length + 1); memcpy(result, NPVARIANT_TO_STRING(*variant).UTF8Characters, length); result[length] = '\0'; return result;}static void initializeIdentifiers(void){ browser->getstringidentifiers(pluginPropertyIdentifierNames, NUM_PROPERTY_IDENTIFIERS, pluginPropertyIdentifiers); browser->getstringidentifiers(pluginMethodIdentifierNames, NUM_METHOD_IDENTIFIERS, pluginMethodIdentifiers);}static bool pluginHasProperty(NPObject *obj, NPIdentifier name){ for (int i = 0; i < NUM_PROPERTY_IDENTIFIERS; i++) if (name == pluginPropertyIdentifiers[i]) return true; return false;}static bool pluginHasMethod(NPObject *obj, NPIdentifier name){ for (int i = 0; i < NUM_METHOD_IDENTIFIERS; i++) if (name == pluginMethodIdentifiers[i]) return true; return false;}static bool pluginGetProperty(NPObject* obj, NPIdentifier name, NPVariant* result){ PluginObject* plugin = reinterpret_cast<PluginObject*>(obj); if (name == pluginPropertyIdentifiers[ID_PROPERTY_PROPERTY]) { STRINGZ_TO_NPVARIANT("property", *result); return true; } else if (name == pluginPropertyIdentifiers[ID_PROPERTY_EVENT_LOGGING]) { BOOLEAN_TO_NPVARIANT(plugin->eventLogging, *result); return true; } else if (name == pluginPropertyIdentifiers[ID_PROPERTY_LOG_DESTROY]) { BOOLEAN_TO_NPVARIANT(plugin->logDestroy, *result); return true; } else if (name == pluginPropertyIdentifiers[ID_PROPERTY_HAS_STREAM]) { BOOLEAN_TO_NPVARIANT(plugin->stream != 0, *result); return true; } else if (name == pluginPropertyIdentifiers[ID_PROPERTY_TEST_OBJECT]) { NPObject* testObject = plugin->testObject; browser->retainobject(testObject); OBJECT_TO_NPVARIANT(testObject, *result); return true; } else if (name == pluginPropertyIdentifiers[ID_PROPERTY_RETURN_ERROR_FROM_NEWSTREAM]) { BOOLEAN_TO_NPVARIANT(plugin->returnErrorFromNewStream, *result); return true; } return false;}static bool pluginSetProperty(NPObject* obj, NPIdentifier name, const NPVariant* variant){ PluginObject* plugin = reinterpret_cast<PluginObject*>(obj); if (name == pluginPropertyIdentifiers[ID_PROPERTY_EVENT_LOGGING]) { plugin->eventLogging = NPVARIANT_TO_BOOLEAN(*variant); return true; } else if (name == pluginPropertyIdentifiers[ID_PROPERTY_LOG_DESTROY]) { plugin->logDestroy = NPVARIANT_TO_BOOLEAN(*variant); return true; } else if (name == pluginPropertyIdentifiers[ID_PROPERTY_RETURN_ERROR_FROM_NEWSTREAM]) { plugin->returnErrorFromNewStream = NPVARIANT_TO_BOOLEAN(*variant); return true; } return false;}static bool testDOMAccess(PluginObject* obj, const NPVariant*, uint32_t, NPVariant* result){ // Get plug-in's DOM element NPObject* elementObject; if (browser->getvalue(obj->npp, NPNVPluginElementNPObject, &elementObject) == NPERR_NO_ERROR) { // Get style NPVariant styleVariant; NPIdentifier styleIdentifier = browser->getstringidentifier("style"); if (browser->getproperty(obj->npp, elementObject, styleIdentifier, &styleVariant) && NPVARIANT_IS_OBJECT(styleVariant)) { // Set style.border NPIdentifier borderIdentifier = browser->getstringidentifier("border"); NPVariant borderVariant; STRINGZ_TO_NPVARIANT("3px solid red", borderVariant); browser->setproperty(obj->npp, NPVARIANT_TO_OBJECT(styleVariant), borderIdentifier, &borderVariant); browser->releasevariantvalue(&styleVariant); } browser->releaseobject(elementObject); } VOID_TO_NPVARIANT(*result); return true;}static NPIdentifier stringVariantToIdentifier(NPVariant variant){ assert(NPVARIANT_IS_STRING(variant)); NPUTF8* utf8String = createCStringFromNPVariant(&variant); NPIdentifier identifier = browser->getstringidentifier(utf8String); free(utf8String); return identifier;}static NPIdentifier int32VariantToIdentifier(NPVariant variant){ assert(NPVARIANT_IS_INT32(variant)); int32 integer = NPVARIANT_TO_INT32(variant); return browser->getintidentifier(integer);}static NPIdentifier doubleVariantToIdentifier(NPVariant variant){ assert(NPVARIANT_IS_DOUBLE(variant)); double value = NPVARIANT_TO_DOUBLE(variant); // Sadly there is no "getdoubleidentifier" int32 integer = static_cast<int32>(value); return browser->getintidentifier(integer);}static NPIdentifier variantToIdentifier(NPVariant variant){ if (NPVARIANT_IS_STRING(variant)) return stringVariantToIdentifier(variant); else if (NPVARIANT_IS_INT32(variant)) return int32VariantToIdentifier(variant); else if (NPVARIANT_IS_DOUBLE(variant)) return doubleVariantToIdentifier(variant); return 0;}static bool testIdentifierToString(PluginObject*, const NPVariant* args, uint32_t argCount, NPVariant* result){ if (argCount != 1) return false; NPIdentifier identifier = variantToIdentifier(args[0]); if (!identifier) return false; NPUTF8* utf8String = browser->utf8fromidentifier(identifier); if (!utf8String) return false; STRINGZ_TO_NPVARIANT(utf8String, *result); return true;}static bool testIdentifierToInt(PluginObject*, const NPVariant* args, uint32_t argCount, NPVariant* result){ if (argCount != 1) return false; NPIdentifier identifier = variantToIdentifier(args[0]); if (!identifier) return false; int32 integer = browser->intfromidentifier(identifier); INT32_TO_NPVARIANT(integer, *result); return true;}static bool testCallback(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result){ if (argCount == 0 || !NPVARIANT_IS_STRING(args[0])) return false; NPObject* windowScriptObject; browser->getvalue(obj->npp, NPNVWindowNPObject, &windowScriptObject); NPUTF8* callbackString = createCStringFromNPVariant(&args[0]); NPIdentifier callbackIdentifier = browser->getstringidentifier(callbackString); free(callbackString); NPVariant browserResult; browser->invoke(obj->npp, windowScriptObject, callbackIdentifier, 0, 0, &browserResult); browser->releasevariantvalue(&browserResult); browser->releaseobject(windowScriptObject); VOID_TO_NPVARIANT(*result); return true;}static bool getURL(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result){ if (argCount == 2 && NPVARIANT_IS_STRING(args[0]) && NPVARIANT_IS_STRING(args[1])) { NPUTF8* urlString = createCStringFromNPVariant(&args[0]); NPUTF8* targetString = createCStringFromNPVariant(&args[1]); NPError npErr = browser->geturl(obj->npp, urlString, targetString); free(urlString); free(targetString); INT32_TO_NPVARIANT(npErr, *result); return true; } else if (argCount == 1 && NPVARIANT_IS_STRING(args[0])) { NPUTF8* urlString = createCStringFromNPVariant(&args[0]); NPError npErr = browser->geturl(obj->npp, urlString, 0); free(urlString); INT32_TO_NPVARIANT(npErr, *result); return true; } return false;}static bool removeDefaultMethod(PluginObject*, const NPVariant* args, uint32_t argCount, NPVariant* result){ pluginClass.invokeDefault = 0; VOID_TO_NPVARIANT(*result); return true;}static bool getURLNotify(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result){ if (argCount != 3 || !NPVARIANT_IS_STRING(args[0]) || (!NPVARIANT_IS_STRING(args[1]) && !NPVARIANT_IS_NULL(args[1])) || !NPVARIANT_IS_STRING(args[2])) return false; NPUTF8* urlString = createCStringFromNPVariant(&args[0]); NPUTF8* targetString = (NPVARIANT_IS_STRING(args[1]) ? createCStringFromNPVariant(&args[1]) : NULL); NPUTF8* callbackString = createCStringFromNPVariant(&args[2]); NPIdentifier callbackIdentifier = browser->getstringidentifier(callbackString); browser->geturlnotify(obj->npp, urlString, targetString, callbackIdentifier); free(urlString); free(targetString); free(callbackString); VOID_TO_NPVARIANT(*result); return true;}static bool testInvokeDefault(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -