// Copyright (c) 2010 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) { DVLOG(1) << __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() { DVLOG(1) << __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( 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 chrome_frame_npapi_obj( reinterpret_cast( 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(value); ChromeFrameNPAPI::ChromeFrameNPObject* chrome_frame_npapi_obj = reinterpret_cast( instance->pdata); // Return value is expected to be retained npapi::RetainObject(reinterpret_cast(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