⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pluginobject.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * 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 + -