Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(763)

Unified Diff: plugin/linux/main_linux.cc

Issue 4957002: - Check for a NULL PluginObject at all NPAPI entry points. This fixes a crash in Chrome where ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/o3d/
Patch Set: '' Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « plugin/cross/plugin_logging.h ('k') | plugin/mac/main_mac.mm » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: plugin/linux/main_linux.cc
===================================================================
--- plugin/linux/main_linux.cc (revision 66184)
+++ plugin/linux/main_linux.cc (working copy)
@@ -33,20 +33,20 @@
// This file implements the platform specific parts of the plugin for
// the Linux platform.
+#include "plugin/cross/main.h"
+
#include <X11/keysym.h>
#include <gdk/gdkx.h>
#include <gdk/gdkkeysyms.h>
-#include "base/at_exit.h"
-#include "base/command_line.h"
-#include "base/file_util.h"
+
#include "base/logging.h"
-#include "base/scoped_ptr.h"
#include "base/third_party/nspr/prtypes.h"
-#include "o3d/breakpad/linux/breakpad.h"
-#include "plugin/cross/main.h"
-#include "plugin/cross/out_of_memory.h"
-#include "plugin/cross/whitelist.h"
+#include "core/cross/event.h"
+#include "core/linux/display_window_linux.h"
#include "plugin/linux/envvars.h"
+#if !defined(O3D_INTERNAL_PLUGIN)
+#include "breakpad/linux/breakpad.h"
+#endif
using glue::_o3d::PluginObject;
using glue::StreamManager;
@@ -54,20 +54,15 @@
using o3d::Event;
namespace {
-// We would normally make this a stack variable in main(), but in a
-// plugin, that's not possible, so we make it a global. When the DLL is loaded
-// this it gets constructed and when it is unlooaded it is destructed. Note
-// that this cannot be done in NP_Initialize and NP_Shutdown because those
-// calls do not necessarily signify the DLL being loaded and unloaded. If the
-// DLL is not unloaded then the values of global variables are preserved.
-base::AtExitManager g_at_exit_manager;
bool g_xembed_support = false;
+#if !defined(O3D_INTERNAL_PLUGIN)
o3d::Breakpad g_breakpad;
+#endif
#ifdef O3D_PLUGIN_ENV_VARS_FILE
-static const char *kEnvVarsFilePath = O3D_PLUGIN_ENV_VARS_FILE;
+static const char kEnvVarsFilePath[] = O3D_PLUGIN_ENV_VARS_FILE;
#endif
static void DrawPlugin(PluginObject *obj) {
@@ -625,27 +620,20 @@
return TRUE;
}
-NPError InitializePlugin() {
- if (!o3d::SetupOutOfMemoryHandler())
- return NPERR_MODULE_LOAD_FAILED_ERROR;
+} // end anonymous namespace
+namespace o3d {
+
+NPError PlatformPreNPInitialize() {
+#if !defined(O3D_INTERNAL_PLUGIN)
// Setup breakpad
g_breakpad.Initialize();
g_breakpad.set_version(O3D_PLUGIN_VERSION);
+#endif
+ return NPERR_NO_ERROR;
+}
- CommandLine::Init(0, NULL);
-
- FilePath log;
- file_util::GetTempDir(&log);
- log = log.Append("debug.log");
-
- InitLogging(log.value().c_str(),
- logging::LOG_TO_BOTH_FILE_AND_SYSTEM_DEBUG_LOG,
- logging::DONT_LOCK_LOG_FILE,
- logging::APPEND_TO_OLD_LOG_FILE);
-
- DLOG(INFO) << "NP_Initialize";
-
+NPError PlatformPostNPInitialize() {
#ifdef O3D_PLUGIN_ENV_VARS_FILE
// Before doing anything more, we first load our environment variables file.
// This file is a newline-delimited list of any system-specific environment
@@ -680,38 +668,21 @@
return NPERR_NO_ERROR;
}
-} // end anonymous namespace
-
-#if defined(O3D_INTERNAL_PLUGIN)
-namespace o3d {
-#else
-extern "C" {
-#endif
-
-NPError EXPORT_SYMBOL OSCALL NP_Initialize(NPNetscapeFuncs *browserFuncs,
- NPPluginFuncs *pluginFuncs) {
- NPError retval = InitializeNPNApi(browserFuncs);
- if (retval != NPERR_NO_ERROR) return retval;
- NP_GetEntryPoints(pluginFuncs);
- return InitializePlugin();
+NPError PlatformPreNPShutdown() {
+ return NPERR_NO_ERROR;
}
-NPError EXPORT_SYMBOL OSCALL NP_Shutdown(void) {
- HANDLE_CRASHES;
- DLOG(INFO) << "NP_Shutdown";
-
- CommandLine::Reset();
-
+NPError PlatformPostNPShutdown() {
+#if !defined(O3D_INTERNAL_PLUGIN)
g_breakpad.Shutdown();
+#endif
return NPERR_NO_ERROR;
}
-} // namespace o3d / extern "C"
-
-namespace o3d {
-
-NPError PlatformNPPGetValue(NPP instance, NPPVariable variable, void *value) {
+NPError PlatformNPPGetValue(PluginObject *obj,
+ NPPVariable variable,
+ void *value) {
switch (variable) {
case NPPVpluginNeedsXEmbed:
*static_cast<NPBool *>(value) = g_xembed_support;
@@ -722,73 +693,53 @@
return NPERR_NO_ERROR;
}
-NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
- char *argn[], char *argv[], NPSavedData *saved) {
- HANDLE_CRASHES;
-
- if (!IsDomainAuthorized(instance)) {
- return NPERR_INVALID_URL;
- }
-
- PluginObject* pluginObject = glue::_o3d::PluginObject::Create(
- instance);
- instance->pdata = pluginObject;
- glue::_o3d::InitializeGlue(instance);
- pluginObject->Init(argc, argn, argv);
-
- // Get the metrics for the system setup
- GetUserConfigMetrics();
+NPError PlatformNPPNew(NPP instance, PluginObject *obj) {
return NPERR_NO_ERROR;
}
-NPError NPP_Destroy(NPP instance, NPSavedData **save) {
- HANDLE_CRASHES;
- PluginObject *obj = static_cast<PluginObject*>(instance->pdata);
- if (obj) {
- obj->TearDown();
+NPError PlatformNPPDestroy(NPP instance, PluginObject *obj) {
+ // TODO(tschmelcher): Do we really have to do this before the other teardown
+ // below? If not then we can factor out the platform-specific TearDown()
+ // calls into NPP_Destroy() in main.cc.
+ obj->TearDown();
- if (obj->xt_widget_) {
- // NOTE: This crashes. Not sure why, possibly the widget has
- // already been destroyed, but we haven't received a SetWindow(NULL).
- // XtRemoveEventHandler(obj->xt_widget_, ExposureMask, False,
- // LinuxExposeHandler, obj);
- obj->xt_widget_ = NULL;
- }
- if (obj->xt_interval_) {
- XtRemoveTimeOut(obj->xt_interval_);
- obj->xt_interval_ = 0;
- }
- if (obj->timeout_id_) {
- g_source_remove(obj->timeout_id_);
- obj->timeout_id_ = 0;
- }
- if (obj->gtk_container_) {
- gtk_widget_destroy(obj->gtk_container_);
- obj->gtk_container_ = NULL;
- }
- if (obj->gtk_fullscreen_container_) {
- gtk_widget_destroy(obj->gtk_fullscreen_container_);
- obj->gtk_fullscreen_container_ = NULL;
- }
- if (obj->gdk_display_) {
- gdk_display_close(obj->gdk_display_);
- obj->gdk_display_ = NULL;
- }
- obj->gtk_event_source_ = NULL;
- obj->event_handler_id_ = 0;
- obj->window_ = 0;
- obj->drawable_ = 0;
-
- NPN_ReleaseObject(obj);
- instance->pdata = NULL;
+ if (obj->xt_widget_) {
+ // NOTE: This crashes. Not sure why, possibly the widget has
+ // already been destroyed, but we haven't received a SetWindow(NULL).
+ // XtRemoveEventHandler(obj->xt_widget_, ExposureMask, False,
+ // LinuxExposeHandler, obj);
+ obj->xt_widget_ = NULL;
}
+ if (obj->xt_interval_) {
+ XtRemoveTimeOut(obj->xt_interval_);
+ obj->xt_interval_ = 0;
+ }
+ if (obj->timeout_id_) {
+ g_source_remove(obj->timeout_id_);
+ obj->timeout_id_ = 0;
+ }
+ if (obj->gtk_container_) {
+ gtk_widget_destroy(obj->gtk_container_);
+ obj->gtk_container_ = NULL;
+ }
+ if (obj->gtk_fullscreen_container_) {
+ gtk_widget_destroy(obj->gtk_fullscreen_container_);
+ obj->gtk_fullscreen_container_ = NULL;
+ }
+ if (obj->gdk_display_) {
+ gdk_display_close(obj->gdk_display_);
+ obj->gdk_display_ = NULL;
+ }
+ obj->gtk_event_source_ = NULL;
+ obj->event_handler_id_ = 0;
+ obj->window_ = 0;
+ obj->drawable_ = 0;
return NPERR_NO_ERROR;
}
-NPError NPP_SetWindow(NPP instance, NPWindow *window) {
- HANDLE_CRASHES;
- PluginObject *obj = static_cast<PluginObject*>(instance->pdata);
-
+NPError PlatformNPPSetWindow(NPP instance,
+ PluginObject *obj,
+ NPWindow *window) {
NPSetWindowCallbackStruct *cb_struct =
static_cast<NPSetWindowCallbackStruct *>(window->ws_info);
Window xwindow = reinterpret_cast<Window>(window->window);
@@ -854,22 +805,19 @@
return NPERR_NO_ERROR;
}
-// Called when the browser has finished attempting to stream data to
-// a file as requested. If fname == NULL the attempt was not successful.
-void NPP_StreamAsFile(NPP instance, NPStream *stream, const char *fname) {
- HANDLE_CRASHES;
- PluginObject *obj = static_cast<PluginObject*>(instance->pdata);
- StreamManager *stream_manager = obj->stream_manager();
-
+void PlatformNPPStreamAsFile(StreamManager *stream_manager,
+ NPStream *stream,
+ const char *fname) {
stream_manager->SetStreamFile(stream, fname);
}
-int16 NPP_HandleEvent(NPP instance, void *event) {
- HANDLE_CRASHES;
+int16 PlatformNPPHandleEvent(NPP instance, PluginObject *obj, void *event) {
return 0;
}
+
} // namespace o3d
+// TODO(tschmelcher): This stuff does not belong in this file.
namespace glue {
namespace _o3d {
« no previous file with comments | « plugin/cross/plugin_logging.h ('k') | plugin/mac/main_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698