blob: ef5af01fdd8b2e423fa8cdf53899ddd04741fee0 [file] [log] [blame]
// 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/chrome_frame_npapi_entrypoints.h"
#include "chrome_frame/chrome_frame_npapi.h"
#define NPAPI WINAPI
// Plugin entry points.
extern "C" {
NPError NPAPI NP_Initialize(NPNetscapeFuncs* browser_funcs);
NPError NPAPI NP_GetEntryPoints(NPPluginFuncs* plugin_funcs);
void NPAPI NP_Shutdown();
}
NPError NPAPI NP_Initialize(NPNetscapeFuncs* browser_funcs) {
DLOG(INFO) << __FUNCTION__;
_pAtlModule->Lock();
npapi::InitializeBrowserFunctions(browser_funcs);
return NPERR_NO_ERROR;
}
NPError NPAPI NP_GetEntryPoints(NPPluginFuncs* plugin_funcs) {
plugin_funcs->version = (NP_VERSION_MAJOR << 8) | NP_VERSION_MINOR;
plugin_funcs->size = sizeof(plugin_funcs);
plugin_funcs->newp = chrome_frame::NPP_New;
plugin_funcs->destroy = chrome_frame::NPP_Destroy;
plugin_funcs->setwindow = chrome_frame::NPP_SetWindow;
plugin_funcs->newstream = chrome_frame::NPP_NewStream;
plugin_funcs->destroystream = chrome_frame::NPP_DestroyStream;
plugin_funcs->asfile = NULL;
plugin_funcs->writeready = chrome_frame::NPP_WriteReady;
plugin_funcs->write = chrome_frame::NPP_Write;
plugin_funcs->print = chrome_frame::NPP_Print;
plugin_funcs->event = NULL;
plugin_funcs->urlnotify = chrome_frame::NPP_URLNotify;
plugin_funcs->getvalue = chrome_frame::NPP_GetValue;
plugin_funcs->setvalue = chrome_frame::NPP_SetValue;
return NPERR_NO_ERROR;
}
void NPAPI NP_Shutdown() {
DLOG(INFO) << __FUNCTION__;
npapi::UninitializeBrowserFunctions();
_pAtlModule->Unlock(); // matches Lock() inside NP_Initialize
DLOG_IF(ERROR, _pAtlModule->GetLockCount() != 0)
<< "Being shut down but still have " << _pAtlModule->GetLockCount()
<< " living objects";
}
namespace chrome_frame {
NPError NPP_New(NPMIMEType plugin_type, NPP instance, uint16 mode, int16 argc,
char* argn[], char* argv[], NPSavedData* saved) {
if (instance == NULL)
return NPERR_INVALID_INSTANCE_ERROR;
ChromeFrameNPAPI::ChromeFrameNPObject* chrome_frame_npapi_obj =
reinterpret_cast<ChromeFrameNPAPI::ChromeFrameNPObject*>(
npapi::CreateObject(instance, ChromeFrameNPAPI::PluginClass()));
DCHECK(chrome_frame_npapi_obj != NULL);
ChromeFrameNPAPI* plugin_instance =
chrome_frame_npapi_obj->chrome_frame_plugin_instance;
DCHECK(plugin_instance != NULL);
// Note that we MUST set instance->pdata BEFORE calling Initialize. This is
// because Initialize can call back into the NPAPI host which will need the
// pdata field to be set.
chrome_frame_npapi_obj->chrome_frame_plugin_instance =
plugin_instance;
instance->pdata = chrome_frame_npapi_obj;
bool init = plugin_instance->Initialize(plugin_type, instance,
mode, argc, argn, argv);
DCHECK(init);
return NPERR_NO_ERROR;
}
NPError NPP_Destroy(NPP instance, NPSavedData** save) {
// Takes ownership and releases the object at the end of scope.
ScopedNpObject<ChromeFrameNPAPI::ChromeFrameNPObject> chrome_frame_npapi_obj(
reinterpret_cast<ChromeFrameNPAPI::ChromeFrameNPObject*>(
instance->pdata));
if (chrome_frame_npapi_obj.get()) {
ChromeFrameNPAPI* plugin_instance =
ChromeFrameNPAPI::ChromeFrameInstanceFromPluginInstance(instance);
plugin_instance->Uninitialize();
instance->pdata = NULL;
}
return NPERR_NO_ERROR;
}
NPError NPP_SetWindow(NPP instance, NPWindow* window_info) {
if (window_info == NULL) {
NOTREACHED();
return NPERR_GENERIC_ERROR;
}
ChromeFrameNPAPI* plugin_instance =
ChromeFrameNPAPI::ChromeFrameInstanceFromPluginInstance(instance);
if (plugin_instance == NULL) {
return NPERR_INVALID_INSTANCE_ERROR;
}
plugin_instance->SetWindow(window_info);
return NPERR_NO_ERROR;
}
NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream,
NPBool seekable, uint16* stream_type) {
ChromeFrameNPAPI* plugin_instance =
ChromeFrameNPAPI::ChromeFrameInstanceFromPluginInstance(instance);
if (plugin_instance == NULL) {
return NPERR_INVALID_INSTANCE_ERROR;
}
return plugin_instance->NewStream(type, stream, seekable, stream_type);
}
NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason) {
ChromeFrameNPAPI* plugin_instance =
ChromeFrameNPAPI::ChromeFrameInstanceFromPluginInstance(instance);
if (plugin_instance == NULL) {
return NPERR_INVALID_INSTANCE_ERROR;
}
return plugin_instance->DestroyStream(stream, reason);
}
NPError NPP_GetValue(NPP instance, NPPVariable variable, void* value) {
if (variable == NPPVpluginScriptableNPObject) {
void** plugin = reinterpret_cast<void**>(value);
ChromeFrameNPAPI::ChromeFrameNPObject* chrome_frame_npapi_obj =
reinterpret_cast<ChromeFrameNPAPI::ChromeFrameNPObject*>(
instance->pdata);
// Return value is expected to be retained
npapi::RetainObject(reinterpret_cast<NPObject*>(chrome_frame_npapi_obj));
*plugin = chrome_frame_npapi_obj;
return NPERR_NO_ERROR;
}
return NPERR_GENERIC_ERROR;
}
NPError NPP_SetValue(NPP instance, NPNVariable variable, void* value) {
return NPERR_GENERIC_ERROR;
}
int32 NPP_WriteReady(NPP instance, NPStream* stream) {
static const int kMaxBytesForPluginConsumption = 0x7FFFFFFF;
ChromeFrameNPAPI* plugin_instance =
ChromeFrameNPAPI::ChromeFrameInstanceFromPluginInstance(instance);
if (plugin_instance == NULL) {
return kMaxBytesForPluginConsumption;
}
return plugin_instance->WriteReady(stream);
}
int32 NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len,
void* buffer) {
ChromeFrameNPAPI* plugin_instance =
ChromeFrameNPAPI::ChromeFrameInstanceFromPluginInstance(instance);
if (plugin_instance == NULL)
return len;
return plugin_instance->Write(stream, offset, len, buffer);
}
void NPP_URLNotify(NPP instance, const char* url, NPReason reason,
void* notifyData) {
ChromeFrameNPAPI* plugin_instance =
ChromeFrameNPAPI::ChromeFrameInstanceFromPluginInstance(instance);
if (plugin_instance) {
plugin_instance->UrlNotify(url, reason, notifyData);
}
}
void NPP_Print(NPP instance, NPPrint* print_info) {
ChromeFrameNPAPI* plugin_instance =
ChromeFrameNPAPI::ChromeFrameInstanceFromPluginInstance(instance);
if (plugin_instance == NULL) {
NOTREACHED();
return;
}
plugin_instance->Print(print_info);
}
} // namespace chrome_frame