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

Unified Diff: plugin/mac/main_mac.mm

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/linux/main_linux.cc ('k') | plugin/win/main_win.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: plugin/mac/main_mac.mm
===================================================================
--- plugin/mac/main_mac.mm (revision 66184)
+++ plugin/mac/main_mac.mm (working copy)
@@ -35,37 +35,22 @@
#include "plugin/cross/main.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"
-
#import <Cocoa/Cocoa.h>
#include <Carbon/Carbon.h>
#include <OpenGL/OpenGL.h>
#include <AGL/agl.h>
#include <AGL/aglRenderers.h>
+#include "base/logging.h"
#include "core/cross/event.h"
-#include "statsreport/metrics.h"
+#include "core/mac/display_window_mac.h"
#include "plugin/cross/config.h"
-#include "plugin/cross/plugin_logging.h"
#include "plugin/cross/plugin_metrics.h"
-#include "plugin/cross/o3d_glue.h"
-#include "plugin/cross/out_of_memory.h"
-#include "plugin/cross/whitelist.h"
#include "plugin/mac/plugin_mac.h"
#include "plugin/mac/graphics_utils_mac.h"
#include "plugin/mac/fullscreen_window_mac.h"
#import "plugin/mac/o3d_layer.h"
-
-#if !defined(O3D_INTERNAL_PLUGIN)
-o3d::PluginLogging* g_logger = NULL;
-bool g_logging_initialized = false;
-#endif
-
using glue::_o3d::PluginObject;
using glue::StreamManager;
using o3d::Bitmap;
@@ -75,18 +60,11 @@
using o3d::Renderer;
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;
#define CFTIMER
// #define DEFERRED_DRAW_ON_NULLEVENTS
-
+
// Helper that extracts the O3DLayer obj c object from the PluginObject
// and coerces it to the right type. The code can't live in the PluginObject
// since it's c++ code and doesn't know about objective c types, and it saves
@@ -477,37 +455,6 @@
nsPluginEventType_Idle = 0
};
-NPError InitializePlugin() {
-#if !defined(O3D_INTERNAL_PLUGIN)
- if (!o3d::SetupOutOfMemoryHandler())
- return NPERR_MODULE_LOAD_FAILED_ERROR;
-
- o3d::InitializeBreakpad();
-
-#ifdef CFTIMER
- o3d::gRenderTimer.Start();
-#endif // CFTIMER
-
- // Turn on the logging.
- 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";
-
- o3d::SetupOutOfMemoryHandler();
-#endif // O3D_INTERNAL_PLUGIN
-
- return NPERR_NO_ERROR;
-}
-
// When to prefer Core Animation. Safari's support in 10.5 was too
// buggy to attempt to use.
static bool PreferCoreAnimation() {
@@ -637,18 +584,11 @@
extern "C" {
#endif
-NPError OSCALL NP_Initialize(NPNetscapeFuncs* browserFuncs) {
- HANDLE_CRASHES;
- NPError retval = InitializeNPNApi(browserFuncs);
- if (retval != NPERR_NO_ERROR) return retval;
- return InitializePlugin();
-}
-
#if !defined(O3D_INTERNAL_PLUGIN)
// Wrapper that discards the return value to match the expected type of
// NPP_ShutdownProcPtr.
-void NPP_ShutdownWrapper() {
+static void NPP_ShutdownWrapper() {
NP_Shutdown();
}
@@ -669,22 +609,32 @@
#endif // O3D_INTERNAL_PLUGIN
-NPError OSCALL NP_Shutdown(void) {
+} // namespace o3d / extern "C"
+
+namespace o3d {
+
+NPError PlatformPreNPInitialize() {
#if !defined(O3D_INTERNAL_PLUGIN)
- HANDLE_CRASHES;
- DLOG(INFO) << "NP_Shutdown";
+ o3d::InitializeBreakpad();
- if (g_logger) {
- // Do a last sweep to aggregate metrics before we shut down
- g_logger->ProcessMetrics(true, false, false);
- delete g_logger;
- g_logger = NULL;
- g_logging_initialized = false;
- stats_report::g_global_metrics.Uninitialize();
- }
+#ifdef CFTIMER
+ o3d::gRenderTimer.Start();
+#endif // CFTIMER
+#endif // O3D_INTERNAL_PLUGIN
- CommandLine::Reset();
+ return NPERR_NO_ERROR;
+}
+NPError PlatformPostNPInitialize() {
+ return NPERR_NO_ERROR;
+}
+
+NPError PlatformPreNPShutdown() {
+ return NPERR_NO_ERROR;
+}
+
+NPError PlatformPostNPShutdown() {
+#if !defined(O3D_INTERNAL_PLUGIN)
#ifdef CFTIMER
o3d::gRenderTimer.Stop();
#endif
@@ -695,15 +645,9 @@
return NPERR_NO_ERROR;
}
-} // namespace o3d / extern "C"
-
-
-
-namespace o3d {
-
-NPError PlatformNPPGetValue(NPP instance, NPPVariable variable, void *value) {
- PluginObject* obj = static_cast<PluginObject*>(instance->pdata);
-
+NPError PlatformNPPGetValue(PluginObject *obj,
+ NPPVariable variable,
+ void *value) {
switch (variable) {
case NPPVpluginCoreAnimationLayer:
if (!ObjO3DLayer(obj)) {
@@ -942,68 +886,35 @@
return handled;
}
-NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
- char* argn[], char* argv[], NPSavedData* saved) {
- HANDLE_CRASHES;
-
- NPError err = NPERR_NO_ERROR;
-
-#if !defined(O3D_INTERNAL_PLUGIN)
- if (!g_logging_initialized) {
- o3d::GetUserAgentMetrics(instance);
- GetUserConfigMetrics();
- // Create usage stats logs object
- g_logger = o3d::PluginLogging::InitializeUsageStatsLogging();
- g_logging_initialized = true;
- }
-#endif // O3D_INTERNAL_PLUGIN
-
- 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);
-
- err = Mac_SetBestEventAndDrawingModel(instance,
- static_cast<PluginObject*>(
- instance->pdata));
+NPError PlatformNPPNew(NPP instance, PluginObject *obj) {
+ NPError err = Mac_SetBestEventAndDrawingModel(instance, obj);
if (err != NPERR_NO_ERROR)
return err;
#ifdef CFTIMER
- if (pluginObject->drawing_model_ == NPDrawingModelCoreAnimation) {
+ if (obj->drawing_model_ == NPDrawingModelCoreAnimation) {
o3d::gRenderTimer.AddInstance(instance);
}
#endif
return NPERR_NO_ERROR;
}
-NPError NPP_Destroy(NPP instance, NPSavedData** save) {
- HANDLE_CRASHES;
- PluginObject* obj = static_cast<PluginObject*>(instance->pdata);
- if (obj) {
+NPError PlatformNPPDestroy(NPP instance, PluginObject *obj) {
#if defined(CFTIMER)
- o3d::gRenderTimer.RemoveInstance(instance);
+ o3d::gRenderTimer.RemoveInstance(instance);
#endif
- // TODO(maf) / TODO(kbr): are we leaking AGL / CGL contexts?
+ // TODO(maf) / TODO(kbr): are we leaking AGL / CGL contexts?
- if (obj->drawing_model_ == NPDrawingModelCoreAnimation) {
- O3DLayer* layer = ObjO3DLayer(obj);
- if (layer) {
- // Prevent the layer from rendering any more.
- [layer setPluginObject:NULL];
- }
+ if (obj->drawing_model_ == NPDrawingModelCoreAnimation) {
+ O3DLayer* layer = ObjO3DLayer(obj);
+ if (layer) {
+ // Prevent the layer from rendering any more.
+ [layer setPluginObject:NULL];
}
-
- obj->TearDown();
- NPN_ReleaseObject(obj);
- instance->pdata = NULL;
}
+ obj->TearDown();
+
return NPERR_NO_ERROR;
}
@@ -1011,9 +922,9 @@
return aglGetError() != AGL_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) {
WindowRef new_window = NULL;
assert(window != NULL);
@@ -1341,13 +1252,9 @@
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) {
// Some browsers give us an absolute HFS path in fname, some give us an
// absolute Posix path, so convert to Posix if needed.
if ((!fname) || (fname[0] == '/') || !fname[0]) {
@@ -1361,9 +1268,7 @@
}
}
-int16 NPP_HandleEvent(NPP instance, void* event) {
- HANDLE_CRASHES;
- PluginObject* obj = static_cast<PluginObject*>(instance->pdata);
+int16 PlatformNPPHandleEvent(NPP instance, PluginObject *obj, void *event) {
if (obj->event_model_ == NPEventModelCarbon) {
EventRecord* theEvent = static_cast<EventRecord*>(event);
return HandleMacEvent(theEvent, instance) ? 1 : 0;
« no previous file with comments | « plugin/linux/main_linux.cc ('k') | plugin/win/main_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698