| Index: chrome_frame/chrome_frame_npapi.cc
|
| ===================================================================
|
| --- chrome_frame/chrome_frame_npapi.cc (revision 35770)
|
| +++ chrome_frame/chrome_frame_npapi.cc (working copy)
|
| @@ -85,6 +85,8 @@
|
| you_must_add_both_plugin_property_and_name);
|
| }
|
|
|
| +static const int kMaxBytesForPluginConsumption = 0x7FFFFFFF;
|
| +
|
| static const char kPluginSrcAttribute[] = "src";
|
| static const char kPluginForceFullPageAttribute[] = "force_full_page";
|
| static const char kPluginOnloadAttribute[] = "onload";
|
| @@ -109,6 +111,154 @@
|
| // If chrome network stack is to be used
|
| static const char kPluginUseChromeNetwork[] = "usechromenetwork";
|
|
|
| +
|
| +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) {
|
| + NPAPIUrlRequest* url_request = ChromeFrameNPAPI::ValidateRequest(
|
| + instance, stream->notifyData);
|
| + if (url_request) {
|
| + if (!url_request->OnStreamCreated(type, stream))
|
| + return NPERR_GENERIC_ERROR;
|
| + }
|
| +
|
| + // We need to return the requested stream mode if we are returning a success
|
| + // code. If we don't do this it causes Opera to blow up.
|
| + *stream_type = NP_NORMAL;
|
| + return NPERR_NO_ERROR;
|
| +}
|
| +
|
| +NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason) {
|
| + NPAPIUrlRequest* url_request = ChromeFrameNPAPI::ValidateRequest(
|
| + instance, stream->notifyData);
|
| + if (url_request) {
|
| + url_request->OnStreamDestroyed(reason);
|
| + }
|
| +
|
| + return NPERR_NO_ERROR;
|
| +}
|
| +
|
| +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) {
|
| + NPAPIUrlRequest* url_request = ChromeFrameNPAPI::ValidateRequest(
|
| + instance, stream->notifyData);
|
| + if (url_request) {
|
| + return url_request->OnWriteReady();
|
| + }
|
| +
|
| + return kMaxBytesForPluginConsumption;
|
| +}
|
| +
|
| +int32 NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len,
|
| + void* buffer) {
|
| + NPAPIUrlRequest* url_request = ChromeFrameNPAPI::ValidateRequest(
|
| + instance, stream->notifyData);
|
| + if (url_request) {
|
| + return url_request->OnWrite(buffer, len);
|
| + }
|
| +
|
| + return len;
|
| +}
|
| +
|
| +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);
|
| +}
|
| +
|
| // ChromeFrameNPAPI member defines.
|
|
|
| // TODO(tommi): remove ignore_setfocus_ since that's not how focus is
|
|
|