| Index: chrome_frame/np_browser_functions.cc
|
| ===================================================================
|
| --- chrome_frame/np_browser_functions.cc (revision 0)
|
| +++ chrome_frame/np_browser_functions.cc (revision 0)
|
| @@ -0,0 +1,512 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome_frame/np_browser_functions.h"
|
| +
|
| +#include "base/logging.h"
|
| +
|
| +namespace npapi {
|
| +
|
| +// global function pointers (within this namespace) for the NPN functions.
|
| +union NpVersion {
|
| + struct {
|
| + uint8 major;
|
| + uint8 minor;
|
| + } v;
|
| + uint16 version;
|
| +};
|
| +
|
| +NpVersion g_version = {0};
|
| +
|
| +NPN_GetURLProcPtr g_geturl = NULL;
|
| +NPN_PostURLProcPtr g_posturl = NULL;
|
| +NPN_RequestReadProcPtr g_requestread = NULL;
|
| +NPN_NewStreamProcPtr g_newstream = NULL;
|
| +NPN_WriteProcPtr g_write = NULL;
|
| +NPN_DestroyStreamProcPtr g_destroystream = NULL;
|
| +NPN_StatusProcPtr g_status = NULL;
|
| +NPN_UserAgentProcPtr g_useragent = NULL;
|
| +NPN_MemAllocProcPtr g_memalloc = NULL;
|
| +NPN_MemFreeProcPtr g_memfree = NULL;
|
| +NPN_MemFlushProcPtr g_memflush = NULL;
|
| +NPN_ReloadPluginsProcPtr g_reloadplugins = NULL;
|
| +NPN_GetJavaEnvProcPtr g_getJavaEnv = NULL;
|
| +NPN_GetJavaPeerProcPtr g_getJavaPeer = NULL;
|
| +NPN_GetURLNotifyProcPtr g_geturlnotify = NULL;
|
| +NPN_PostURLNotifyProcPtr g_posturlnotify = NULL;
|
| +NPN_GetValueProcPtr g_getvalue = NULL;
|
| +NPN_SetValueProcPtr g_setvalue = NULL;
|
| +NPN_InvalidateRectProcPtr g_invalidaterect = NULL;
|
| +NPN_InvalidateRegionProcPtr g_invalidateregion = NULL;
|
| +NPN_ForceRedrawProcPtr g_forceredraw = NULL;
|
| +NPN_GetStringIdentifierProcPtr g_getstringidentifier = NULL;
|
| +NPN_GetStringIdentifiersProcPtr g_getstringidentifiers = NULL;
|
| +NPN_GetIntIdentifierProcPtr g_getintidentifier = NULL;
|
| +NPN_IdentifierIsStringProcPtr g_identifierisstring = NULL;
|
| +NPN_UTF8FromIdentifierProcPtr g_utf8fromidentifier = NULL;
|
| +NPN_IntFromIdentifierProcPtr g_intfromidentifier = NULL;
|
| +NPN_CreateObjectProcPtr g_createobject = NULL;
|
| +NPN_RetainObjectProcPtr g_retainobject = NULL;
|
| +NPN_ReleaseObjectProcPtr g_releaseobject = NULL;
|
| +NPN_InvokeProcPtr g_invoke = NULL;
|
| +NPN_InvokeDefaultProcPtr g_invoke_default = NULL;
|
| +NPN_EvaluateProcPtr g_evaluate = NULL;
|
| +NPN_GetPropertyProcPtr g_getproperty = NULL;
|
| +NPN_SetPropertyProcPtr g_setproperty = NULL;
|
| +NPN_RemovePropertyProcPtr g_removeproperty = NULL;
|
| +NPN_HasPropertyProcPtr g_hasproperty = NULL;
|
| +NPN_HasMethodProcPtr g_hasmethod = NULL;
|
| +NPN_ReleaseVariantValueProcPtr g_releasevariantvalue = NULL;
|
| +NPN_SetExceptionProcPtr g_setexception = NULL;
|
| +NPN_PushPopupsEnabledStateProcPtr g_pushpopupsenabledstate = NULL;
|
| +NPN_PopPopupsEnabledStateProcPtr g_poppopupsenabledstate = NULL;
|
| +NPN_EnumerateProcPtr g_enumerate = NULL;
|
| +NPN_PluginThreadAsyncCallProcPtr g_pluginthreadasynccall = NULL;
|
| +NPN_ConstructProcPtr g_construct = NULL;
|
| +NPN_GetValueForURLProcPtr g_getvalueforurl = NULL;
|
| +NPN_SetValueForURLProcPtr g_setvalueforurl = NULL;
|
| +NPN_GetAuthenticationInfoProcPtr g_getauthenticationinfo = NULL;
|
| +
|
| +// Must be called prior to calling any of the browser functions below.
|
| +void InitializeBrowserFunctions(NPNetscapeFuncs* functions) {
|
| + CHECK(functions);
|
| + DCHECK(g_geturl == NULL || g_geturl == functions->geturl);
|
| +
|
| + g_version.version = functions->version;
|
| +
|
| + g_geturl = functions->geturl;
|
| + g_posturl = functions->posturl;
|
| + g_requestread = functions->requestread;
|
| + g_newstream = functions->newstream;
|
| + g_write = functions->write;
|
| + g_destroystream = functions->destroystream;
|
| + g_status = functions->status;
|
| + g_useragent = functions->uagent;
|
| + g_memalloc = functions->memalloc;
|
| + g_memfree = functions->memfree;
|
| + g_memflush = functions->memflush;
|
| + g_reloadplugins = functions->reloadplugins;
|
| + g_getJavaEnv = functions->getJavaEnv;
|
| + g_getJavaPeer = functions->getJavaPeer;
|
| + g_geturlnotify = functions->geturlnotify;
|
| + g_posturlnotify = functions->posturlnotify;
|
| + g_getvalue = functions->getvalue;
|
| + g_setvalue = functions->setvalue;
|
| + g_invalidaterect = functions->invalidaterect;
|
| + g_invalidateregion = functions->invalidateregion;
|
| + g_forceredraw = functions->forceredraw;
|
| + g_getstringidentifier = functions->getstringidentifier;
|
| + g_getstringidentifiers = functions->getstringidentifiers;
|
| + g_getintidentifier = functions->getintidentifier;
|
| + g_identifierisstring = functions->identifierisstring;
|
| + g_utf8fromidentifier = functions->utf8fromidentifier;
|
| + g_intfromidentifier = functions->intfromidentifier;
|
| + g_createobject = functions->createobject;
|
| + g_retainobject = functions->retainobject;
|
| + g_releaseobject = functions->releaseobject;
|
| + g_invoke = functions->invoke;
|
| + g_invoke_default = functions->invokeDefault;
|
| + g_evaluate = functions->evaluate;
|
| + g_getproperty = functions->getproperty;
|
| + g_setproperty = functions->setproperty;
|
| + g_removeproperty = functions->removeproperty;
|
| + g_hasproperty = functions->hasproperty;
|
| + g_hasmethod = functions->hasmethod;
|
| + g_releasevariantvalue = functions->releasevariantvalue;
|
| + g_setexception = functions->setexception;
|
| + g_pushpopupsenabledstate = functions->pushpopupsenabledstate;
|
| + g_poppopupsenabledstate = functions->poppopupsenabledstate;
|
| + g_enumerate = functions->enumerate;
|
| + g_pluginthreadasynccall = functions->pluginthreadasynccall;
|
| + g_construct = functions->construct;
|
| +
|
| + if (g_version.v.minor >= NPVERS_HAS_URL_AND_AUTH_INFO) {
|
| + g_getvalueforurl = functions->getvalueforurl;
|
| + g_setvalueforurl = functions->setvalueforurl;
|
| + g_getauthenticationinfo = functions->getauthenticationinfo;
|
| + }
|
| +}
|
| +
|
| +void UninitializeBrowserFunctions() {
|
| + g_version.version = 0;
|
| +
|
| + // We skip doing this in the official build as it doesn't serve much purpose
|
| +// during shutdown. The reason for it being here in the other types of builds
|
| +// is to spot potential browser bugs whereby the browser leaves living objects
|
| +// in our DLL after shutdown has been called. In theory those objects could
|
| +// trigger a call to the browser functions after shutdown has been called
|
| +// and for non official builds we want that to simply crash.
|
| +// For official builds we leave the function pointers around since they
|
| +// continue to valid.
|
| + g_geturl = NULL;
|
| + g_posturl = NULL;
|
| + g_requestread = NULL;
|
| + g_newstream = NULL;
|
| + g_write = NULL;
|
| + g_destroystream = NULL;
|
| + g_status = NULL;
|
| + g_useragent = NULL;
|
| + g_memalloc = NULL;
|
| + g_memfree = NULL;
|
| + g_memflush = NULL;
|
| + g_reloadplugins = NULL;
|
| + g_getJavaEnv = NULL;
|
| + g_getJavaPeer = NULL;
|
| + g_geturlnotify = NULL;
|
| + g_posturlnotify = NULL;
|
| + g_getvalue = NULL;
|
| + g_setvalue = NULL;
|
| + g_invalidaterect = NULL;
|
| + g_invalidateregion = NULL;
|
| + g_forceredraw = NULL;
|
| + g_getstringidentifier = NULL;
|
| + g_getstringidentifiers = NULL;
|
| + g_getintidentifier = NULL;
|
| + g_identifierisstring = NULL;
|
| + g_utf8fromidentifier = NULL;
|
| + g_intfromidentifier = NULL;
|
| + g_createobject = NULL;
|
| + g_retainobject = NULL;
|
| + g_releaseobject = NULL;
|
| + g_invoke = NULL;
|
| + g_invoke_default = NULL;
|
| + g_evaluate = NULL;
|
| + g_getproperty = NULL;
|
| + g_setproperty = NULL;
|
| + g_removeproperty = NULL;
|
| + g_hasproperty = NULL;
|
| + g_hasmethod = NULL;
|
| + g_releasevariantvalue = NULL;
|
| + g_setexception = NULL;
|
| + g_pushpopupsenabledstate = NULL;
|
| + g_poppopupsenabledstate = NULL;
|
| + g_enumerate = NULL;
|
| + g_pluginthreadasynccall = NULL;
|
| + g_construct = NULL;
|
| + g_getvalueforurl = NULL;
|
| + g_setvalueforurl = NULL;
|
| + g_getauthenticationinfo = NULL;
|
| +}
|
| +
|
| +bool IsInitialized() {
|
| + // We only check one function for convenience.
|
| + return g_getvalue != NULL;
|
| +}
|
| +
|
| +// Function stubs for functions that the host browser implements.
|
| +uint8 VersionMinor() {
|
| + return g_version.v.minor;
|
| +}
|
| +
|
| +uint8 VersionMajor() {
|
| + return g_version.v.major;
|
| +}
|
| +
|
| +NPError GetURL(NPP instance, const char* URL, const char* window) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_geturl(instance, URL, window);
|
| +}
|
| +
|
| +NPError PostURL(NPP instance, const char* URL, const char* window, uint32 len,
|
| + const char* buf, NPBool file) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_posturl(instance, URL, window, len, buf, file);
|
| +}
|
| +
|
| +NPError RequestRead(NPStream* stream, NPByteRange* rangeList) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_requestread(stream, rangeList);
|
| +}
|
| +
|
| +NPError NewStream(NPP instance, NPMIMEType type, const char* window,
|
| + NPStream** stream) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_newstream(instance, type, window, stream);
|
| +}
|
| +
|
| +int32 Write(NPP instance, NPStream* stream, int32 len, void* buffer) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_write(instance, stream, len, buffer);
|
| +}
|
| +
|
| +NPError DestroyStream(NPP instance, NPStream* stream, NPReason reason) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_destroystream(instance, stream, reason);
|
| +}
|
| +
|
| +void Status(NPP instance, const char* message) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_status(instance, message);
|
| +}
|
| +
|
| +const char* UserAgent(NPP instance) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_useragent(instance);
|
| +}
|
| +
|
| +void* MemAlloc(uint32 size) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_memalloc(size);
|
| +}
|
| +
|
| +void MemFree(void* ptr) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_memfree(ptr);
|
| +}
|
| +
|
| +uint32 MemFlush(uint32 size) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_memflush(size);
|
| +}
|
| +
|
| +void ReloadPlugins(NPBool reloadPages) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_reloadplugins(reloadPages);
|
| +}
|
| +
|
| +void* GetJavaEnv() {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_getJavaEnv();
|
| +}
|
| +
|
| +void* GetJavaPeer(NPP instance) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_getJavaPeer(instance);
|
| +}
|
| +
|
| +NPError GetURLNotify(NPP instance, const char* URL, const char* window,
|
| + void* notifyData) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_geturlnotify(instance, URL, window, notifyData);
|
| +}
|
| +
|
| +NPError PostURLNotify(NPP instance, const char* URL, const char* window,
|
| + uint32 len, const char* buf, NPBool file,
|
| + void* notifyData) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_posturlnotify(instance, URL, window, len, buf, file, notifyData);
|
| +}
|
| +
|
| +NPError GetValue(NPP instance, NPNVariable variable, void* ret_value) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_getvalue(instance, variable, ret_value);
|
| +}
|
| +
|
| +NPError SetValue(NPP instance, NPPVariable variable, void* value) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_setvalue(instance, variable, value);
|
| +}
|
| +
|
| +void InvalidateRect(NPP instance, NPRect* rect) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_invalidaterect(instance, rect);
|
| +}
|
| +
|
| +void InvalidateRegion(NPP instance, NPRegion region) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_invalidateregion(instance, region);
|
| +}
|
| +
|
| +void ForceRedraw(NPP instance) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_forceredraw(instance);
|
| +}
|
| +
|
| +void ReleaseVariantValue(NPVariant* variant) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_releasevariantvalue(variant);
|
| +}
|
| +
|
| +NPIdentifier GetStringIdentifier(const NPUTF8* name) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_getstringidentifier(name);
|
| +}
|
| +
|
| +void GetStringIdentifiers(const NPUTF8** names, int32_t nameCount,
|
| + NPIdentifier* identifiers) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_getstringidentifiers(names, nameCount, identifiers);
|
| +}
|
| +
|
| +NPIdentifier GetIntIdentifier(int32_t intid) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_getintidentifier(intid);
|
| +}
|
| +
|
| +int32_t IntFromIdentifier(NPIdentifier identifier) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_intfromidentifier(identifier);
|
| +}
|
| +
|
| +bool IdentifierIsString(NPIdentifier identifier) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_identifierisstring(identifier);
|
| +
|
| +}
|
| +
|
| +NPUTF8* UTF8FromIdentifier(NPIdentifier identifier) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_utf8fromidentifier(identifier);
|
| +
|
| +}
|
| +
|
| +NPObject* CreateObject(NPP instance, NPClass* aClass) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_createobject(instance, aClass);
|
| +
|
| +}
|
| +
|
| +NPObject* RetainObject(NPObject* obj) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_retainobject(obj);
|
| +
|
| +}
|
| +
|
| +void ReleaseObject(NPObject* obj) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_releaseobject(obj);
|
| +
|
| +}
|
| +
|
| +bool Invoke(NPP npp, NPObject* obj, NPIdentifier methodName,
|
| + const NPVariant* args, unsigned argCount, NPVariant* result) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_invoke(npp, obj, methodName, args, argCount, result);
|
| +}
|
| +
|
| +bool InvokeDefault(NPP npp, NPObject* obj, const NPVariant* args,
|
| + unsigned argCount, NPVariant* result) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_invoke_default(npp, obj, args, argCount, result);
|
| +}
|
| +
|
| +bool Evaluate(NPP npp, NPObject* obj, NPString* script, NPVariant* result) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_evaluate(npp, obj, script, result);
|
| +}
|
| +
|
| +bool GetProperty(NPP npp, NPObject* obj, NPIdentifier propertyName,
|
| + NPVariant* result) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_getproperty(npp, obj, propertyName, result);
|
| +}
|
| +
|
| +bool SetProperty(NPP npp, NPObject* obj, NPIdentifier propertyName,
|
| + const NPVariant* value) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_setproperty(npp, obj, propertyName, value);
|
| +}
|
| +
|
| +bool HasProperty(NPP npp, NPObject* npobj, NPIdentifier propertyName) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_hasproperty(npp, npobj, propertyName);
|
| +}
|
| +
|
| +bool HasMethod(NPP npp, NPObject* npobj, NPIdentifier methodName) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_hasmethod(npp, npobj, methodName);
|
| +}
|
| +
|
| +bool RemoveProperty(NPP npp, NPObject* obj, NPIdentifier propertyName) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_removeproperty(npp, obj, propertyName);
|
| +}
|
| +
|
| +void SetException(NPObject* obj, const NPUTF8* message) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_setexception(obj, message);
|
| +}
|
| +
|
| +void PushPopupsEnabledState(NPP npp, NPBool enabled) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_pushpopupsenabledstate(npp, enabled);
|
| +}
|
| +
|
| +void PopPopupsEnabledState(NPP npp) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_poppopupsenabledstate(npp);
|
| +}
|
| +
|
| +bool Enumerate(NPP npp, NPObject* obj, NPIdentifier** identifier,
|
| + uint32_t* count) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_enumerate(npp, obj, identifier, count);
|
| +}
|
| +
|
| +void PluginThreadAsyncCall(NPP instance, void (*func)(void*), void* userData) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_pluginthreadasynccall(instance, func, userData);
|
| +}
|
| +
|
| +bool Construct(NPP npp, NPObject* obj, const NPVariant* args, uint32_t argCount,
|
| + NPVariant* result) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + return g_construct(npp, obj, args, argCount, result);
|
| +}
|
| +
|
| +NPError GetValueForURL(NPP instance, NPNURLVariable variable, const char* url,
|
| + char** value, uint32* len) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + DCHECK(npapi::VersionMinor() >= NPVERS_HAS_URL_AND_AUTH_INFO);
|
| + if (!g_getvalueforurl) {
|
| + NOTREACHED();
|
| + return NPERR_INCOMPATIBLE_VERSION_ERROR;
|
| + }
|
| +
|
| + return g_getvalueforurl(instance, variable, url, value, len);
|
| +}
|
| +
|
| +NPError SetValueForURL(NPP instance, NPNURLVariable variable, const char* url,
|
| + const char* value, uint32 len) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + DCHECK(npapi::VersionMinor() >= NPVERS_HAS_URL_AND_AUTH_INFO);
|
| + if (g_setvalueforurl) {
|
| + NOTREACHED();
|
| + return NPERR_INCOMPATIBLE_VERSION_ERROR;
|
| + }
|
| +
|
| + return g_setvalueforurl(instance, variable, url, value, len);
|
| +}
|
| +
|
| +NPError GetAuthenticationInfo(NPP instance, const char* protocol,
|
| + const char* host, int32 port, const char* scheme,
|
| + const char *realm, char** username, uint32* ulen,
|
| + char** password, uint32* plen) {
|
| + DCHECK(IsInitialized()) << __FUNCTION__;
|
| + DCHECK(npapi::VersionMinor() >= NPVERS_HAS_URL_AND_AUTH_INFO);
|
| + if (g_getauthenticationinfo) {
|
| + NOTREACHED();
|
| + return NPERR_INCOMPATIBLE_VERSION_ERROR;
|
| + }
|
| +
|
| + return g_getauthenticationinfo(instance, protocol, host, port, scheme,
|
| + realm, username, ulen, password, plen);
|
| +}
|
| +
|
| +std::string StringFromIdentifier(NPIdentifier identifier) {
|
| + std::string ret;
|
| + NPUTF8* utf8 = UTF8FromIdentifier(identifier);
|
| + if (utf8) {
|
| + ret = utf8;
|
| + MemFree(utf8);
|
| + }
|
| + return ret;
|
| +}
|
| +
|
| +} // namespace npapi
|
| +
|
| +void AllocateStringVariant(const std::string& str, NPVariant* var) {
|
| + DCHECK(var);
|
| +
|
| + int len = str.length();
|
| + NPUTF8* buffer = reinterpret_cast<NPUTF8*>(npapi::MemAlloc(len + 1));
|
| + if (buffer) {
|
| + buffer[len] = '\0';
|
| + memcpy(buffer, str.c_str(), len);
|
| + STRINGN_TO_NPVARIANT(buffer, len, *var);
|
| + } else {
|
| + NULL_TO_NPVARIANT(*var);
|
| + }
|
| +}
|
| +
|
|
|