summaryrefslogtreecommitdiffstats
path: root/webkit/default_plugin/plugin_main.cc
diff options
context:
space:
mode:
authorthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-07 02:48:34 +0000
committerthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-07 02:48:34 +0000
commit325358b8f7e145d69300b1186985a57ab59a546c (patch)
treeed7d81acaf409dde9df4acb5f712b0089945d5e7 /webkit/default_plugin/plugin_main.cc
parent421fb9a0f6c489c006031c1789848e0565ab485c (diff)
downloadchromium_src-325358b8f7e145d69300b1186985a57ab59a546c.zip
chromium_src-325358b8f7e145d69300b1186985a57ab59a546c.tar.gz
chromium_src-325358b8f7e145d69300b1186985a57ab59a546c.tar.bz2
Revert 51681 - Move default_plugin out of webkit.
BUG=48419 Review URL: http://codereview.chromium.org/2803035 TBR=thakis@chromium.org Review URL: http://codereview.chromium.org/2819043 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@51684 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/default_plugin/plugin_main.cc')
-rw-r--r--webkit/default_plugin/plugin_main.cc336
1 files changed, 336 insertions, 0 deletions
diff --git a/webkit/default_plugin/plugin_main.cc b/webkit/default_plugin/plugin_main.cc
new file mode 100644
index 0000000..16f0f6b
--- /dev/null
+++ b/webkit/default_plugin/plugin_main.cc
@@ -0,0 +1,336 @@
+// Copyright (c) 2006-2008 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 "webkit/default_plugin/plugin_main.h"
+
+#include "base/logging.h"
+#include "base/string_util.h"
+#include "webkit/default_plugin/plugin_impl.h"
+#include "webkit/glue/webkit_glue.h"
+
+namespace default_plugin {
+
+#if defined(OS_WIN)
+//
+// Forward declare the linker-provided pseudo variable for the
+// current module handle.
+//
+extern "C" IMAGE_DOS_HEADER __ImageBase;
+
+// get the handle to the currently executing module
+inline HMODULE GetCurrentModuleHandle() {
+ return reinterpret_cast<HINSTANCE>(&__ImageBase);
+}
+#endif
+
+// Initialized in NP_Initialize.
+NPNetscapeFuncs* g_browser = NULL;
+
+NPError API_CALL NP_GetEntryPoints(NPPluginFuncs* funcs) {
+ // Be explicit about the namespace, because all internal plugins have
+ // functions with these names and some might accidentally put them into the
+ // global namespace. In that case, the linker might prefer the global one.
+ funcs->version = 11;
+ funcs->size = sizeof(*funcs);
+ funcs->newp = default_plugin::NPP_New;
+ funcs->destroy = default_plugin::NPP_Destroy;
+ funcs->setwindow = default_plugin::NPP_SetWindow;
+ funcs->newstream = default_plugin::NPP_NewStream;
+ funcs->destroystream = default_plugin::NPP_DestroyStream;
+ funcs->writeready = default_plugin::NPP_WriteReady;
+ funcs->write = default_plugin::NPP_Write;
+ funcs->asfile = NULL;
+ funcs->print = NULL;
+ funcs->event = default_plugin::NPP_HandleEvent;
+ funcs->urlnotify = default_plugin::NPP_URLNotify;
+#if defined(OS_POSIX) && !defined(OS_MACOSX)
+ funcs->getvalue = default_plugin::NPP_GetValue;
+#else
+ funcs->getvalue = NULL;
+#endif
+ funcs->setvalue = NULL;
+ return NPERR_NO_ERROR;
+}
+
+NPError API_CALL NP_Initialize(NPNetscapeFuncs* funcs) {
+ g_browser = funcs;
+ return 0;
+}
+
+#if defined(OS_POSIX) && !defined(OS_MACOSX)
+NPError API_CALL NP_Initialize(NPNetscapeFuncs* funcs, NPPluginFuncs* p_funcs) {
+ NPError err = NP_Initialize(funcs);
+ if (err != NPERR_NO_ERROR)
+ return err;
+ return NP_GetEntryPoints(p_funcs);
+}
+#endif
+
+NPError API_CALL NP_Shutdown(void) {
+ g_browser = NULL;
+ return NPERR_NO_ERROR;
+}
+
+namespace {
+// This function is only invoked when the default plugin is invoked
+// with a special mime type application/chromium-test-default-plugin
+void SignalTestResult(NPP instance) {
+ NPObject *window_obj = NULL;
+ g_browser->getvalue(instance, NPNVWindowNPObject, &window_obj);
+ if (!window_obj) {
+ NOTREACHED();
+ return;
+ }
+
+ std::string script = "javascript:onSuccess()";
+ NPString script_string;
+ script_string.UTF8Characters = script.c_str();
+ script_string.UTF8Length =
+ static_cast<unsigned int>(script.length());
+
+ NPVariant result_var;
+ g_browser->evaluate(instance, window_obj,
+ &script_string, &result_var);
+ g_browser->releaseobject(window_obj);
+}
+
+} // namespace CHROMIUM_DefaultPluginTest
+
+bool NegotiateModels(NPP instance) {
+#if defined(OS_MACOSX)
+ NPError err;
+ // Set drawing model to core graphics
+ NPBool supportsCoreGraphics = false;
+ err = g_browser->getvalue(instance,
+ NPNVsupportsCoreGraphicsBool,
+ &supportsCoreGraphics);
+ if (err != NPERR_NO_ERROR || !supportsCoreGraphics) {
+ NOTREACHED();
+ return false;
+ }
+ err = g_browser->setvalue(instance,
+ NPPVpluginDrawingModel,
+ (void*)NPDrawingModelCoreGraphics);
+ if (err != NPERR_NO_ERROR) {
+ NOTREACHED();
+ return false;
+ }
+
+ // Set event model to cocoa
+ NPBool supportsCocoaEvents = false;
+ err = g_browser->getvalue(instance,
+ NPNVsupportsCocoaBool,
+ &supportsCocoaEvents);
+ if (err != NPERR_NO_ERROR || !supportsCocoaEvents) {
+ NOTREACHED();
+ return false;
+ }
+ err = g_browser->setvalue(instance,
+ NPPVpluginEventModel,
+ (void*)NPEventModelCocoa);
+ if (err != NPERR_NO_ERROR) {
+ NOTREACHED();
+ return false;
+ }
+#elif defined(OS_POSIX)
+ NPError err;
+ // Check that chrome still supports xembed.
+ NPBool supportsXEmbed = false;
+ err = g_browser->getvalue(instance,
+ NPNVSupportsXEmbedBool,
+ &supportsXEmbed);
+ if (err != NPERR_NO_ERROR || !supportsXEmbed) {
+ NOTREACHED();
+ return false;
+ }
+
+ // Check that the toolkit is still gtk2.
+ NPNToolkitType toolkit;
+ err = g_browser->getvalue(instance,
+ NPNVToolkit,
+ &toolkit);
+ if (err != NPERR_NO_ERROR || toolkit != NPNVGtk2) {
+ NOTREACHED();
+ return false;
+ }
+#endif
+ return true;
+}
+
+NPError NPP_New(NPMIMEType plugin_type, NPP instance, uint16_t mode, int16_t argc,
+ char* argn[], char* argv[], NPSavedData* saved) {
+ if (instance == NULL)
+ return NPERR_INVALID_INSTANCE_ERROR;
+
+ // We don't want the null plugin to work in the following cases:-
+ // 1. Test-shell
+ // 2. The plugin is running in the renderer process.
+ if (webkit_glue::IsPluginRunningInRendererProcess()) {
+ return NPERR_GENERIC_ERROR;
+ }
+
+ if (!NegotiateModels(instance))
+ return NPERR_INCOMPATIBLE_VERSION_ERROR;
+
+ PluginInstallerImpl* plugin_impl = new PluginInstallerImpl(mode);
+ plugin_impl->Initialize(
+#if defined(OS_WIN)
+ GetCurrentModuleHandle(),
+#else
+ NULL,
+#endif
+ instance, plugin_type, argc,
+ argn, argv);
+
+ instance->pdata = reinterpret_cast<void*>(plugin_impl);
+
+ if (!base::strcasecmp(plugin_type,
+ "application/chromium-test-default-plugin")) {
+ SignalTestResult(instance);
+ }
+
+ return NPERR_NO_ERROR;
+}
+
+NPError NPP_Destroy(NPP instance, NPSavedData** save) {
+ PluginInstallerImpl* plugin_impl =
+ reinterpret_cast<PluginInstallerImpl*>(instance->pdata);
+
+ if (plugin_impl) {
+ plugin_impl->Shutdown();
+ delete plugin_impl;
+ }
+
+ return NPERR_NO_ERROR;
+}
+
+NPError NPP_SetWindow(NPP instance, NPWindow* window_info) {
+ if (instance == NULL)
+ return NPERR_INVALID_INSTANCE_ERROR;
+
+ if (window_info == NULL) {
+ NOTREACHED();
+ return NPERR_GENERIC_ERROR;
+ }
+
+ PluginInstallerImpl* plugin_impl =
+ reinterpret_cast<PluginInstallerImpl*>(instance->pdata);
+
+ if (plugin_impl == NULL) {
+ NOTREACHED();
+ return NPERR_GENERIC_ERROR;
+ }
+
+ if (!plugin_impl->NPP_SetWindow(window_info)) {
+ delete plugin_impl;
+ return NPERR_GENERIC_ERROR;
+ }
+
+ return NPERR_NO_ERROR;
+}
+
+NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream,
+ NPBool seekable, uint16_t* stype) {
+ if (instance == NULL)
+ return NPERR_INVALID_INSTANCE_ERROR;
+
+ PluginInstallerImpl* plugin_impl =
+ reinterpret_cast<PluginInstallerImpl*>(instance->pdata);
+
+ if (!plugin_impl) {
+ NOTREACHED();
+ return NPERR_INVALID_INSTANCE_ERROR;
+ }
+
+ plugin_impl->NewStream(stream);
+ return NPERR_NO_ERROR;
+}
+
+NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason) {
+ if (instance == NULL)
+ return NPERR_INVALID_INSTANCE_ERROR;
+
+ PluginInstallerImpl* plugin_impl =
+ reinterpret_cast<PluginInstallerImpl*>(instance->pdata);
+
+ if (!plugin_impl) {
+ NOTREACHED();
+ return NPERR_INVALID_INSTANCE_ERROR;
+ }
+
+ plugin_impl->DestroyStream(stream, reason);
+ return NPERR_NO_ERROR;
+}
+
+int32_t NPP_WriteReady(NPP instance, NPStream* stream) {
+ if (instance == NULL)
+ return 0;
+
+ PluginInstallerImpl* plugin_impl =
+ reinterpret_cast<PluginInstallerImpl*>(instance->pdata);
+
+ if (!plugin_impl) {
+ NOTREACHED();
+ return 0;
+ }
+
+ if (plugin_impl->WriteReady(stream))
+ return 0x7FFFFFFF;
+ return 0;
+}
+
+int32_t NPP_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len,
+ void* buffer) {
+ if (instance == NULL)
+ return 0;
+
+ PluginInstallerImpl* plugin_impl =
+ reinterpret_cast<PluginInstallerImpl*>(instance->pdata);
+
+ if (!plugin_impl) {
+ NOTREACHED();
+ return 0;
+ }
+
+ return plugin_impl->Write(stream, offset, len, buffer);
+}
+
+void NPP_URLNotify(NPP instance, const char* url, NPReason reason,
+ void* notifyData) {
+ if (instance != NULL) {
+ PluginInstallerImpl* plugin_impl =
+ reinterpret_cast<PluginInstallerImpl*>(instance->pdata);
+
+ if (!plugin_impl) {
+ NOTREACHED();
+ return;
+ }
+
+ plugin_impl->URLNotify(url, reason);
+ }
+}
+
+#if defined(OS_POSIX) && !defined(OS_MACOSX)
+NPError NPP_GetValue(NPP instance, NPPVariable variable, void* value) {
+ switch (variable) {
+ case NPPVpluginNeedsXEmbed:
+ *static_cast<NPBool*>(value) = true;
+ return NPERR_NO_ERROR;
+ default:
+ return NPERR_INVALID_PARAM;
+ }
+}
+#endif
+
+int16_t NPP_HandleEvent(NPP instance, void* event) {
+ if (instance == NULL)
+ return 0;
+
+ PluginInstallerImpl* plugin_impl =
+ reinterpret_cast<PluginInstallerImpl*>(instance->pdata);
+
+ return plugin_impl->NPP_HandleEvent(event);
+}
+
+} // default_plugin