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

📄 pluginobject.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{    if (!NPVARIANT_IS_OBJECT(args[0]))        return false;    NPObject *callback = NPVARIANT_TO_OBJECT(args[0]);    NPVariant invokeArgs[1];    NPVariant browserResult;    STRINGZ_TO_NPVARIANT("test", invokeArgs[0]);    bool retval = browser->invokeDefault(obj->npp, callback, invokeArgs, 1, &browserResult);    if (retval)        browser->releasevariantvalue(&browserResult);    BOOLEAN_TO_NPVARIANT(retval, *result);    return true;}static bool destroyStream(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result){    NPError npError = browser->destroystream(obj->npp, obj->stream, NPRES_USER_BREAK);    INT32_TO_NPVARIANT(npError, *result);    return true;}static bool destroyNullStream(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result){    NPError npError = browser->destroystream(obj->npp, 0, NPRES_USER_BREAK);    INT32_TO_NPVARIANT(npError, *result);    return true;}static bool testEnumerate(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result){    if (argCount != 2 || !NPVARIANT_IS_OBJECT(args[0]) || !NPVARIANT_IS_OBJECT(args[1]))        return false;    uint32_t count;    NPIdentifier* identifiers;    if (browser->enumerate(obj->npp, NPVARIANT_TO_OBJECT(args[0]), &identifiers, &count)) {        NPObject* outArray = NPVARIANT_TO_OBJECT(args[1]);        NPIdentifier pushIdentifier = browser->getstringidentifier("push");        for (uint32_t i = 0; i < count; i++) {            NPUTF8* string = browser->utf8fromidentifier(identifiers[i]);            if (!string)                continue;            NPVariant args[1];            STRINGZ_TO_NPVARIANT(string, args[0]);            NPVariant browserResult;            browser->invoke(obj->npp, outArray, pushIdentifier, args, 1, &browserResult);            browser->releasevariantvalue(&browserResult);            browser->memfree(string);        }        browser->memfree(identifiers);    }    VOID_TO_NPVARIANT(*result);    return true;}static bool testGetIntIdentifier(PluginObject*, const NPVariant* args, uint32_t argCount, NPVariant* result){    if (argCount != 1 || !NPVARIANT_IS_DOUBLE(args[0]))        return false;    NPIdentifier identifier = browser->getintidentifier((int)NPVARIANT_TO_DOUBLE(args[0]));    INT32_TO_NPVARIANT((int32)(long long)identifier, *result);    return true;}static bool testGetProperty(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result){    if (argCount == 0)        return false;    NPObject *object;    browser->getvalue(obj->npp, NPNVWindowNPObject, &object);    for (uint32_t i = 0; i < argCount; i++) {        assert(NPVARIANT_IS_STRING(args[i]));        NPUTF8* propertyString = createCStringFromNPVariant(&args[i]);        NPIdentifier propertyIdentifier = browser->getstringidentifier(propertyString);        free(propertyString);        NPVariant variant;        bool retval = browser->getproperty(obj->npp, object, propertyIdentifier, &variant);        browser->releaseobject(object);        if (!retval)            break;        if (i + 1 < argCount) {            assert(NPVARIANT_IS_OBJECT(variant));            object = NPVARIANT_TO_OBJECT(variant);        } else {            *result = variant;            return true;        }    }    VOID_TO_NPVARIANT(*result);    return false;}static bool testEvaluate(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result){    if (argCount != 1 || !NPVARIANT_IS_STRING(args[0]))        return false;    NPObject* windowScriptObject;    browser->getvalue(obj->npp, NPNVWindowNPObject, &windowScriptObject);    NPString s = NPVARIANT_TO_STRING(args[0]);    bool retval = browser->evaluate(obj->npp, windowScriptObject, &s, result);    browser->releaseobject(windowScriptObject);    return retval;}static bool testGetPropertyReturnValue(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result){    if (argCount != 2 || !NPVARIANT_IS_OBJECT(args[0]) || !NPVARIANT_IS_STRING(args[1]))        return false;    NPUTF8* propertyString = createCStringFromNPVariant(&args[1]);    NPIdentifier propertyIdentifier = browser->getstringidentifier(propertyString);    free(propertyString);    NPVariant variant;    bool retval = browser->getproperty(obj->npp, NPVARIANT_TO_OBJECT(args[0]), propertyIdentifier, &variant);    if (retval)        browser->releasevariantvalue(&variant);    BOOLEAN_TO_NPVARIANT(retval, *result);    return true;}static char* toCString(const NPString& string){    char* result = static_cast<char*>(malloc(string.UTF8Length + 1));    memcpy(result, string.UTF8Characters, string.UTF8Length);    result[string.UTF8Length] = '\0';    return result;}static bool testPostURLFile(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result){    if (argCount != 4 || !NPVARIANT_IS_STRING(args[0]) || !NPVARIANT_IS_STRING(args[1]) || !NPVARIANT_IS_STRING(args[2]) || !NPVARIANT_IS_STRING(args[3]))        return false;    NPString urlString = NPVARIANT_TO_STRING(args[0]);    char* url = toCString(urlString);    NPString targetString = NPVARIANT_TO_STRING(args[1]);    char* target = toCString(targetString);    NPString pathString = NPVARIANT_TO_STRING(args[2]);    char* path = toCString(pathString);    NPString contentsString = NPVARIANT_TO_STRING(args[3]);    FILE* tempFile = fopen(path, "w");    if (!tempFile)        return false;    fwrite(contentsString.UTF8Characters, contentsString.UTF8Length, 1, tempFile);    fclose(tempFile);    NPError error = browser->posturl(obj->npp, url, target, pathString.UTF8Length, path, TRUE);    free(path);    free(target);    free(url);    BOOLEAN_TO_NPVARIANT(error == NPERR_NO_ERROR, *result);    return true;}static bool testConstruct(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result){    if (!argCount || !NPVARIANT_IS_OBJECT(args[0]))        return false;        return browser->construct(obj->npp, NPVARIANT_TO_OBJECT(args[0]), args + 1, argCount - 1, result);}static bool pluginInvoke(NPObject* header, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result){    PluginObject* plugin = reinterpret_cast<PluginObject*>(header);    if (name == pluginMethodIdentifiers[ID_TEST_CALLBACK_METHOD])        return testCallback(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_TEST_GETURL])        return getURL(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_REMOVE_DEFAULT_METHOD])        return removeDefaultMethod(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_TEST_DOM_ACCESS])        return testDOMAccess(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_TEST_GET_URL_NOTIFY])        return getURLNotify(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_TEST_INVOKE_DEFAULT])        return testInvokeDefault(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_TEST_ENUMERATE])        return testEnumerate(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_DESTROY_STREAM])        return destroyStream(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_TEST_GETINTIDENTIFIER])        return testGetIntIdentifier(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_TEST_EVALUATE])        return testEvaluate(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_TEST_GET_PROPERTY])        return testGetProperty(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_TEST_GET_PROPERTY_RETURN_VALUE])        return testGetPropertyReturnValue(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_TEST_IDENTIFIER_TO_STRING])        return testIdentifierToString(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_TEST_IDENTIFIER_TO_INT])        return testIdentifierToInt(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_TEST_POSTURL_FILE])        return testPostURLFile(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_TEST_CONSTRUCT])        return testConstruct(plugin, args, argCount, result);    else if (name == pluginMethodIdentifiers[ID_TEST_THROW_EXCEPTION_METHOD]) {        browser->setexception(header, "plugin object testThrowException SUCCESS");        return true;    } else if (name == pluginMethodIdentifiers[ID_DESTROY_NULL_STREAM])         return destroyNullStream(plugin, args, argCount, result);        return false;}static bool pluginInvokeDefault(NPObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result){    INT32_TO_NPVARIANT(1, *result);    return true;}static void pluginInvalidate(NPObject* obj){}static NPObject *pluginAllocate(NPP npp, NPClass *theClass){    PluginObject* newInstance = (PluginObject*)malloc(sizeof(PluginObject));    if (!identifiersInitialized) {        identifiersInitialized = true;        initializeIdentifiers();    }    newInstance->npp = npp;    newInstance->testObject = browser->createobject(npp, getTestClass());    newInstance->eventLogging = FALSE;    newInstance->onStreamLoad = 0;    newInstance->onStreamDestroy = 0;    newInstance->onURLNotify = 0;    newInstance->logDestroy = FALSE;    newInstance->logSetWindow = FALSE;    newInstance->returnErrorFromNewStream = FALSE;    newInstance->stream = 0;    newInstance->firstUrl = NULL;    newInstance->firstHeaders = NULL;    newInstance->lastUrl = NULL;    newInstance->lastHeaders = NULL;    return (NPObject*)newInstance;}static void pluginDeallocate(NPObject* header){    PluginObject* plugin = reinterpret_cast<PluginObject*>(header);    browser->releaseobject(plugin->testObject);    free(plugin->firstUrl);    free(plugin->firstHeaders);    free(plugin->lastUrl);    free(plugin->lastHeaders);    free(plugin);}void handleCallback(PluginObject* object, const char *url, NPReason reason, void *notifyData){    assert(object);    NPVariant args[2];    NPObject *windowScriptObject;    browser->getvalue(object->npp, NPNVWindowNPObject, &windowScriptObject);    NPIdentifier callbackIdentifier = notifyData;    INT32_TO_NPVARIANT(reason, args[0]);    char *strHdr = NULL;    if (object->firstUrl && object->firstHeaders && object->lastUrl && object->lastHeaders) {        // Format expected by JavaScript validator: four fields separated by \n\n:        // First URL; first header block; last URL; last header block.        // Note that header blocks already end with \n due to how NPStream::headers works.        int len = strlen(object->firstUrl) + 2            + strlen(object->firstHeaders) + 1            + strlen(object->lastUrl) + 2            + strlen(object->lastHeaders) + 1;        strHdr = (char*)malloc(len + 1);        snprintf(strHdr, len + 1, "%s\n\n%s\n%s\n\n%s\n",                 object->firstUrl, object->firstHeaders, object->lastUrl, object->lastHeaders);        STRINGN_TO_NPVARIANT(strHdr, len, args[1]);    } else        NULL_TO_NPVARIANT(args[1]);    NPVariant browserResult;    browser->invoke(object->npp, windowScriptObject, callbackIdentifier, args, 2, &browserResult);    browser->releasevariantvalue(&browserResult);    free(strHdr);}void notifyStream(PluginObject* object, const char *url, const char *headers){    if (object->firstUrl == NULL) {        if (url)            object->firstUrl = strdup(url);        if (headers)            object->firstHeaders = strdup(headers);    } else {        free(object->lastUrl);        free(object->lastHeaders);        object->lastUrl = (url ? strdup(url) : NULL);        object->lastHeaders = (headers ? strdup(headers) : NULL);    }}void testNPRuntime(NPP npp){    NPObject* windowScriptObject;    browser->getvalue(npp, NPNVWindowNPObject, &windowScriptObject);    // Invoke    NPIdentifier testNPInvoke = browser->getstringidentifier("testNPInvoke");    NPVariant args[7];        VOID_TO_NPVARIANT(args[0]);    NULL_TO_NPVARIANT(args[1]);    BOOLEAN_TO_NPVARIANT(true, args[2]);    INT32_TO_NPVARIANT(242, args[3]);    DOUBLE_TO_NPVARIANT(242.242, args[4]);    STRINGZ_TO_NPVARIANT("Hello, World", args[5]);    OBJECT_TO_NPVARIANT(windowScriptObject, args[6]);        NPVariant result;    browser->invoke(npp, windowScriptObject, testNPInvoke, args, 7, &result);        browser->releasevariantvalue(&result);    browser->releaseobject(windowScriptObject);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -