| Index: tools/nixysa/nixysa/static_glue/npapi/npn_api.cc
|
| ===================================================================
|
| --- tools/nixysa/nixysa/static_glue/npapi/npn_api.cc (revision 0)
|
| +++ tools/nixysa/nixysa/static_glue/npapi/npn_api.cc (revision 0)
|
| @@ -0,0 +1,397 @@
|
| +// Copyright 2008 Google Inc.
|
| +//
|
| +// Licensed under the Apache License, Version 2.0 (the "License");
|
| +// you may not use this file except in compliance with the License.
|
| +// You may obtain a copy of the License at
|
| +//
|
| +// http://www.apache.org/licenses/LICENSE-2.0
|
| +//
|
| +// Unless required by applicable law or agreed to in writing, software
|
| +// distributed under the License is distributed on an "AS IS" BASIS,
|
| +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| +// See the License for the specific language governing permissions and
|
| +// limitations under the License.
|
| +
|
| +// Implementation of the NPN API
|
| +// The NPN API is defined in npapi.h, but isn't actually exposed as such by the
|
| +// browser. It is exposed through a static set of functions passed to the
|
| +// initialization entrypoint. This file contains the glue between the NPN
|
| +// functions and the browser functions.
|
| +
|
| +#include <npfunctions.h>
|
| +#include <stdlib.h>
|
| +#include <string.h>
|
| +#include <algorithm>
|
| +
|
| +static NPNetscapeFuncs g_browser_functions;
|
| +
|
| +// Gets the NPAPI major version.
|
| +static inline uint16_t GetMajorVersion(uint16_t version) {
|
| + return version >> 8;
|
| +}
|
| +
|
| +// Gets the NPAPI minor version.
|
| +static inline uint16_t GetMinorVersion(uint16_t version) {
|
| + return version & 0xff;
|
| +}
|
| +
|
| +// Work-around of NPN_HasProperty, using NPN_Enumerate.
|
| +static bool HasPropertyWorkaround(NPP npp,
|
| + NPObject *npobj,
|
| + NPIdentifier property_name) {
|
| + NPIdentifier *identifiers = NULL;
|
| + uint32_t count;
|
| + bool result = NPN_Enumerate(npp, npobj, &identifiers, &count);
|
| + if (!result || !identifiers)
|
| + return false;
|
| + bool found = false;
|
| + for (unsigned int i = 0; i < count; ++i) {
|
| + if (identifiers[i] == property_name) {
|
| + found = true;
|
| + break;
|
| + }
|
| + }
|
| + NPN_MemFree(identifiers);
|
| + return result;
|
| +}
|
| +
|
| +// Check for the work-around case.
|
| +bool IsHasPropertyWorkaround() {
|
| + return g_browser_functions.hasproperty == HasPropertyWorkaround;
|
| +}
|
| +
|
| +bool IsPluginThreadAsyncCallSupported() {
|
| + return (GetMinorVersion(g_browser_functions.version) >=
|
| + NPVERS_HAS_PLUGIN_THREAD_ASYNC_CALL) &&
|
| + g_browser_functions.pluginthreadasynccall != NULL;
|
| +}
|
| +
|
| +
|
| +
|
| +NPError InitializeNPNApi(NPNetscapeFuncs *funcs) {
|
| + if (!funcs)
|
| + return NPERR_INVALID_FUNCTABLE_ERROR;
|
| +
|
| + if (GetMajorVersion(funcs->version) > NP_VERSION_MAJOR)
|
| + return NPERR_INCOMPATIBLE_VERSION_ERROR;
|
| +
|
| + // We need at least NPRuntime.
|
| + if (GetMinorVersion(funcs->version) < NPVERS_HAS_NPRUNTIME_SCRIPTING)
|
| + return NPERR_INCOMPATIBLE_VERSION_ERROR;
|
| +
|
| + // np_runtime_size is the offset of the function directly after the last
|
| + // NPRuntime function, that is, the minimum NPRuntime size.
|
| + size_t np_runtime_size =
|
| + reinterpret_cast<char *>(&g_browser_functions.pushpopupsenabledstate) -
|
| + reinterpret_cast<char *>(&g_browser_functions);
|
| +
|
| + // Did browser lie about supporting NPRuntime ?
|
| + if (funcs->size < np_runtime_size)
|
| + return NPERR_INCOMPATIBLE_VERSION_ERROR;
|
| +
|
| + memset(&g_browser_functions, 0, sizeof(g_browser_functions));
|
| + // Only copy functions we know about, and that the browser has.
|
| + size_t size = std::min(sizeof(g_browser_functions),
|
| + static_cast<size_t>(funcs->size));
|
| + memcpy(&g_browser_functions, funcs, size);
|
| +
|
| + // Safari doesn't implement NPN_HasProperty although it claims to support
|
| + // NPRuntime. We have a (slower) workaround using NPN_Enumerate.
|
| + // NOTE: it doesn't implement NPN_HasMethod or NPN_IntFromIdentifier either.
|
| + if (!g_browser_functions.hasproperty && g_browser_functions.enumerate) {
|
| + g_browser_functions.hasproperty = HasPropertyWorkaround;
|
| + }
|
| + return NPERR_NO_ERROR;
|
| +}
|
| +
|
| +// npapi.h functions
|
| +
|
| +void NP_LOADDS NPN_Version(int* plugin_major,
|
| + int* plugin_minor,
|
| + int* netscape_major,
|
| + int* netscape_minor) {
|
| + *plugin_major = NP_VERSION_MAJOR;
|
| + *plugin_minor = NP_VERSION_MINOR;
|
| + *netscape_major = GetMajorVersion(g_browser_functions.version);
|
| + *netscape_minor = GetMinorVersion(g_browser_functions.version);
|
| +}
|
| +
|
| +NPError NP_LOADDS NPN_GetURLNotify(NPP instance,
|
| + const char* url,
|
| + const char* target,
|
| + void* notify_data) {
|
| + if (GetMinorVersion(g_browser_functions.version) < NPVERS_HAS_NOTIFICATION)
|
| + return NPERR_INCOMPATIBLE_VERSION_ERROR;
|
| + return g_browser_functions.geturlnotify(instance, url, target, notify_data);
|
| +}
|
| +
|
| +NPError NP_LOADDS NPN_GetURL(NPP instance,
|
| + const char* url,
|
| + const char* target) {
|
| + return g_browser_functions.geturl(instance, url, target);
|
| +}
|
| +
|
| +NPError NP_LOADDS NPN_PostURLNotify(NPP instance,
|
| + const char* url,
|
| + const char* target,
|
| + uint32_t len,
|
| + const char* buf,
|
| + NPBool file,
|
| + void* notify_data) {
|
| + if (GetMinorVersion(g_browser_functions.version) < NPVERS_HAS_NOTIFICATION)
|
| + return NPERR_INCOMPATIBLE_VERSION_ERROR;
|
| + return g_browser_functions.posturlnotify(instance, url, target, len, buf,
|
| + file, notify_data);
|
| +}
|
| +
|
| +NPError NP_LOADDS NPN_PostURL(NPP instance,
|
| + const char* url,
|
| + const char* target,
|
| + uint32_t len,
|
| + const char* buf,
|
| + NPBool file) {
|
| + return g_browser_functions.posturl(instance, url, target, len, buf, file);
|
| +}
|
| +
|
| +NPError NP_LOADDS NPN_RequestRead(NPStream* stream, NPByteRange* range_list) {
|
| + return g_browser_functions.requestread(stream, range_list);
|
| +}
|
| +
|
| +NPError NP_LOADDS NPN_NewStream(NPP instance,
|
| + NPMIMEType type,
|
| + const char* target,
|
| + NPStream** stream) {
|
| + if (GetMinorVersion(g_browser_functions.version) < NPVERS_HAS_STREAMOUTPUT)
|
| + return NPERR_INCOMPATIBLE_VERSION_ERROR;
|
| + return g_browser_functions.newstream(instance, type, target, stream);
|
| +}
|
| +
|
| +int32_t NP_LOADDS NPN_Write(NPP instance,
|
| + NPStream* stream,
|
| + int32_t len,
|
| + void* buffer) {
|
| + if (GetMinorVersion(g_browser_functions.version) < NPVERS_HAS_STREAMOUTPUT)
|
| + return NPERR_INCOMPATIBLE_VERSION_ERROR;
|
| + return g_browser_functions.write(instance, stream, len, buffer);
|
| +}
|
| +
|
| +NPError NP_LOADDS NPN_DestroyStream(NPP instance,
|
| + NPStream* stream,
|
| + NPReason reason) {
|
| + if (GetMinorVersion(g_browser_functions.version) < NPVERS_HAS_STREAMOUTPUT)
|
| + return NPERR_INCOMPATIBLE_VERSION_ERROR;
|
| + return g_browser_functions.destroystream(instance, stream, reason);
|
| +}
|
| +
|
| +void NP_LOADDS NPN_Status(NPP instance, const char* message) {
|
| + g_browser_functions.status(instance, message);
|
| +}
|
| +
|
| +const char* NP_LOADDS NPN_UserAgent(NPP instance) {
|
| + return g_browser_functions.uagent(instance);
|
| +}
|
| +
|
| +void* NP_LOADDS NPN_MemAlloc(uint32_t size) {
|
| + return g_browser_functions.memalloc(size);
|
| +}
|
| +
|
| +void NP_LOADDS NPN_MemFree(void* ptr) {
|
| + g_browser_functions.memfree(ptr);
|
| +}
|
| +
|
| +uint32_t NP_LOADDS NPN_MemFlush(uint32_t size) {
|
| + return g_browser_functions.memflush(size);
|
| +}
|
| +
|
| +void NP_LOADDS NPN_ReloadPlugins(NPBool reload_pages) {
|
| + g_browser_functions.reloadplugins(reload_pages);
|
| +}
|
| +
|
| +NPError NP_LOADDS NPN_GetValue(NPP instance,
|
| + NPNVariable variable,
|
| + void *value) {
|
| + return g_browser_functions.getvalue(instance, variable, value);
|
| +}
|
| +
|
| +NPError NP_LOADDS NPN_SetValue(NPP instance,
|
| + NPPVariable variable,
|
| + void *value) {
|
| + return g_browser_functions.setvalue(instance, variable, value);
|
| +}
|
| +
|
| +void NP_LOADDS NPN_InvalidateRect(NPP instance, NPRect *invalid_rect) {
|
| + g_browser_functions.invalidaterect(instance, invalid_rect);
|
| +}
|
| +
|
| +void NP_LOADDS NPN_InvalidateRegion(NPP instance, NPRegion invalid_region) {
|
| + g_browser_functions.invalidateregion(instance, invalid_region);
|
| +}
|
| +
|
| +void NP_LOADDS NPN_ForceRedraw(NPP instance) {
|
| + g_browser_functions.forceredraw(instance);
|
| +}
|
| +
|
| +void NP_LOADDS NPN_PushPopupsEnabledState(NPP instance, NPBool enabled) {
|
| + if (GetMinorVersion(g_browser_functions.version) <
|
| + NPVERS_HAS_POPUPS_ENABLED_STATE)
|
| + return;
|
| + g_browser_functions.pushpopupsenabledstate(instance, enabled);
|
| +}
|
| +
|
| +void NP_LOADDS NPN_PopPopupsEnabledState(NPP instance) {
|
| + if (GetMinorVersion(g_browser_functions.version) <
|
| + NPVERS_HAS_POPUPS_ENABLED_STATE)
|
| + return;
|
| + g_browser_functions.poppopupsenabledstate(instance);
|
| +}
|
| +
|
| +void NP_LOADDS NPN_PluginThreadAsyncCall(NPP instance,
|
| + void (*func) (void *),
|
| + void *user_data) {
|
| + if (GetMinorVersion(g_browser_functions.version) <
|
| + NPVERS_HAS_PLUGIN_THREAD_ASYNC_CALL)
|
| + return;
|
| + // NOTE: Safari 4 on Mac OS X claims to support
|
| + // NPN_PluginThreadAsyncCall but supplies us a NULL function
|
| + // pointer. Callers of this entry point are responsible for using
|
| + // IsPluginThreadAsyncCallSupported() to determine whether it's
|
| + // "really" present.
|
| + g_browser_functions.pluginthreadasynccall(instance, func, user_data);
|
| +}
|
| +
|
| +// npruntime.h functions
|
| +
|
| +void NPN_ReleaseVariantValue(NPVariant *variant) {
|
| + g_browser_functions.releasevariantvalue(variant);
|
| +}
|
| +
|
| +NPIdentifier NPN_GetStringIdentifier(const NPUTF8 *name) {
|
| + return g_browser_functions.getstringidentifier(name);
|
| +}
|
| +
|
| +void NPN_GetStringIdentifiers(const NPUTF8 **names,
|
| + int32_t count,
|
| + NPIdentifier *identifiers) {
|
| +#ifdef OS_LINUX
|
| + // GetStringIdentifiers is broken in nspluginwrapper 1.2.0 and 1.2.2 so we
|
| + // use GetStringIdentifier instead for maximum compatibility. See
|
| + // https://www.redhat.com/archives/nspluginwrapper-devel-list/2009-June/msg00000.html
|
| + for (int32_t i = 0; i < count; ++i) {
|
| + identifiers[i] = NPN_GetStringIdentifier(names[i]);
|
| + }
|
| +#else
|
| + g_browser_functions.getstringidentifiers(names, count, identifiers);
|
| +#endif
|
| +}
|
| +
|
| +NPIdentifier NPN_GetIntIdentifier(int32_t intid) {
|
| + return g_browser_functions.getintidentifier(intid);
|
| +}
|
| +
|
| +bool NPN_IdentifierIsString(NPIdentifier identifier) {
|
| + return g_browser_functions.identifierisstring(identifier);
|
| +}
|
| +
|
| +NPUTF8 *NPN_UTF8FromIdentifier(NPIdentifier identifier) {
|
| + return g_browser_functions.utf8fromidentifier(identifier);
|
| +}
|
| +
|
| +int32_t NPN_IntFromIdentifier(NPIdentifier identifier) {
|
| + if (g_browser_functions.intfromidentifier != NULL) {
|
| + return g_browser_functions.intfromidentifier(identifier);
|
| + } else {
|
| + int32_t result = 0;
|
| + NPUTF8 *str = NPN_UTF8FromIdentifier(identifier);
|
| + if (str != NULL) {
|
| + result = atoi(str);
|
| + NPN_MemFree(str);
|
| + } else if (identifier != 0) { // Safari 3.0 just gives us an int*
|
| + result = *static_cast<int32_t*>(identifier);
|
| + }
|
| + return result;
|
| + }
|
| +}
|
| +
|
| +NPObject *NPN_CreateObject(NPP npp, NPClass *_class) {
|
| + return g_browser_functions.createobject(npp, _class);
|
| +}
|
| +
|
| +NPObject *NPN_RetainObject(NPObject *npobj) {
|
| + return g_browser_functions.retainobject(npobj);
|
| +}
|
| +
|
| +void NPN_ReleaseObject(NPObject *npobj) {
|
| + g_browser_functions.releaseobject(npobj);
|
| +}
|
| +
|
| +bool NPN_Invoke(NPP npp,
|
| + NPObject *npobj,
|
| + NPIdentifier method_name,
|
| + const NPVariant *args,
|
| + uint32_t arg_count,
|
| + NPVariant *result) {
|
| + return g_browser_functions.invoke(npp, npobj, method_name, args, arg_count,
|
| + result);
|
| +}
|
| +
|
| +bool NPN_InvokeDefault(NPP npp,
|
| + NPObject *npobj,
|
| + const NPVariant *args,
|
| + uint32_t arg_count,
|
| + NPVariant *result) {
|
| + return g_browser_functions.invokeDefault(npp, npobj, args, arg_count, result);
|
| +}
|
| +
|
| +bool NPN_Evaluate(NPP npp,
|
| + NPObject *npobj,
|
| + NPString *script,
|
| + NPVariant *result) {
|
| + return g_browser_functions.evaluate(npp, npobj, script, result);
|
| +}
|
| +
|
| +bool NPN_GetProperty(NPP npp,
|
| + NPObject *npobj,
|
| + NPIdentifier property_name,
|
| + NPVariant *result) {
|
| + return g_browser_functions.getproperty(npp, npobj, property_name, result);
|
| +}
|
| +
|
| +bool NPN_SetProperty(NPP npp,
|
| + NPObject *npobj,
|
| + NPIdentifier property_name,
|
| + const NPVariant *value) {
|
| + return g_browser_functions.setproperty(npp, npobj, property_name, value);
|
| +}
|
| +
|
| +bool NPN_RemoveProperty(NPP npp, NPObject *npobj, NPIdentifier property_name) {
|
| + return g_browser_functions.removeproperty(npp, npobj, property_name);
|
| +}
|
| +
|
| +bool NPN_HasProperty(NPP npp, NPObject *npobj, NPIdentifier property_name) {
|
| + return g_browser_functions.hasproperty(npp, npobj, property_name);
|
| +}
|
| +
|
| +bool NPN_HasMethod(NPP npp, NPObject *npobj, NPIdentifier method_name) {
|
| + return g_browser_functions.hasmethod(npp, npobj, method_name);
|
| +}
|
| +
|
| +bool NPN_Enumerate(NPP npp,
|
| + NPObject *npobj,
|
| + NPIdentifier **identifier,
|
| + uint32_t *count) {
|
| + if (GetMinorVersion(g_browser_functions.version) < NPVERS_HAS_NPOBJECT_ENUM)
|
| + return false;
|
| + return g_browser_functions.enumerate(npp, npobj, identifier, count);
|
| +}
|
| +
|
| +bool NPN_Construct(NPP npp,
|
| + NPObject *npobj,
|
| + const NPVariant *args,
|
| + uint32_t arg_count,
|
| + NPVariant *result) {
|
| + return g_browser_functions.construct(npp, npobj, args, arg_count, result);
|
| +}
|
| +
|
| +void NPN_SetException(NPObject *npobj, const NPUTF8 *message) {
|
| + g_browser_functions.setexception(npobj, message);
|
| +}
|
|
|
| Property changes on: tools/nixysa/nixysa/static_glue/npapi/npn_api.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|