From b56013acd4141ef92ddff82fb583c909601c2b95 Mon Sep 17 00:00:00 2001 From: "beard%netscape.com" Date: Sun, 14 Mar 1999 22:51:41 +0000 Subject: [PATCH] fixed crashing bug when frames are destroyed --- .../oji/MRJ/plugin/Source/EmbeddedFrame.cpp | 25 +++++++++++++++---- plugin/oji/MRJ/plugin/Source/EmbeddedFrame.h | 5 +++- .../Source/EmbeddedFramePluginInstance.cpp | 20 ++++++++++----- .../Source/EmbeddedFramePluginInstance.h | 2 ++ 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/plugin/oji/MRJ/plugin/Source/EmbeddedFrame.cpp b/plugin/oji/MRJ/plugin/Source/EmbeddedFrame.cpp index 6d39e5a89ba3..fbdeb4119b96 100644 --- a/plugin/oji/MRJ/plugin/Source/EmbeddedFrame.cpp +++ b/plugin/oji/MRJ/plugin/Source/EmbeddedFrame.cpp @@ -27,12 +27,13 @@ #include #include +#include "EmbeddedFrame.h" +#include "EmbeddedFramePluginInstance.h" #include "MRJPlugin.h" #include "MRJSession.h" #include "nsIPluginInstancePeer.h" #include "nsIOutputStream.h" -#include "EmbeddedFrame.h" #include "JSEvaluator.h" #include "LocalPort.h" #include "StringUtils.h" @@ -43,7 +44,7 @@ static short getModifiers(); EmbeddedFrame::EmbeddedFrame(MRJPluginInstance* pluginInstance, JMFrameRef frameRef, JMFrameKind kind, const Rect* initialBounds, Boolean resizeable) : MRJFrame(frameRef), - mPluginInstance(pluginInstance), mEvaluator(NULL), mWindow(NULL), mBounds(*initialBounds) + mPluginInstance(NULL), mEvaluator(NULL), mWindow(NULL), mBounds(*initialBounds) { Boolean hasGoAway = true; SInt16 windowProc = documentProc; @@ -117,9 +118,14 @@ EmbeddedFrame::EmbeddedFrame(MRJPluginInstance* pluginInstance, JMFrameRef frame #else // Use JavaScript to create a window with an tag. - const char* kEmbeddedFrameScript = "javascript:var w = window.open('', '', 'resizable=yes,status=no,width=400,height=400'); " - "var d = w.document; d.write(''); d.close();"; + const char* kEmbeddedFrameScript = "var w = window.open('','_new','resizable=no,status=no,width=200,height=200');" + "var d = w.document; d.write('" + // "" // this doesn't work, don't know why + "" + "" + "'); d.close();"; + char* script = strdup(kEmbeddedFrameScript); char* address = strchr(script, 'X'); sprintf(address, "%08X", this); @@ -132,6 +138,7 @@ EmbeddedFrame::EmbeddedFrame(MRJPluginInstance* pluginInstance, JMFrameRef frame const char* result = evaluator->eval(script); delete[] script; + #endif #endif @@ -144,6 +151,9 @@ EmbeddedFrame::EmbeddedFrame(MRJPluginInstance* pluginInstance, JMFrameRef frame EmbeddedFrame::~EmbeddedFrame() { + if (mPluginInstance != NULL) + mPluginInstance->setFrame(NULL); + // make sure the window is hidden (and unregistered with the browser). showHide(false); @@ -283,6 +293,11 @@ void EmbeddedFrame::click(const EventRecord* event) } } +void EmbeddedFrame::setPluginInstance(EmbeddedFramePluginInstance* embeddedInstance) +{ + mPluginInstance = embeddedInstance; +} + void EmbeddedFrame::setWindow(WindowRef window) { mWindow = window; diff --git a/plugin/oji/MRJ/plugin/Source/EmbeddedFrame.h b/plugin/oji/MRJ/plugin/Source/EmbeddedFrame.h index 86a448164964..948b641868ee 100644 --- a/plugin/oji/MRJ/plugin/Source/EmbeddedFrame.h +++ b/plugin/oji/MRJ/plugin/Source/EmbeddedFrame.h @@ -33,6 +33,7 @@ #endif class MRJPluginInstance; +class EmbeddedFramePluginInstance; class JSEvaluator; class EmbeddedFrame : public MRJFrame { @@ -51,6 +52,8 @@ public: virtual void activate(Boolean active); virtual void click(const EventRecord* event); + void setPluginInstance(EmbeddedFramePluginInstance* embeddedInstance); + void setWindow(WindowRef window); WindowRef getWindow(); @@ -58,7 +61,7 @@ protected: virtual GrafPtr getPort(); private: - MRJPluginInstance* mPluginInstance; + EmbeddedFramePluginInstance* mPluginInstance; JSEvaluator* mEvaluator; WindowRef mWindow; Rect mBounds; diff --git a/plugin/oji/MRJ/plugin/Source/EmbeddedFramePluginInstance.cpp b/plugin/oji/MRJ/plugin/Source/EmbeddedFramePluginInstance.cpp index 22bedf643e93..6ab48a137378 100644 --- a/plugin/oji/MRJ/plugin/Source/EmbeddedFramePluginInstance.cpp +++ b/plugin/oji/MRJ/plugin/Source/EmbeddedFramePluginInstance.cpp @@ -29,7 +29,7 @@ #include EmbeddedFramePluginInstance::EmbeddedFramePluginInstance() - : mPeer(NULL), mParentInstance(NULL), mFrame(NULL) + : mPeer(NULL), mFrame(NULL) { NS_INIT_REFCNT(); } @@ -53,6 +53,8 @@ NS_METHOD EmbeddedFramePluginInstance::Initialize(nsIPluginInstancePeer* peer) if (tagInfo->GetAttribute("FRAME", &frameValue) == NS_OK) { sscanf(frameValue, "%X", &mFrame); } + if (mFrame != NULL) + mFrame->setPluginInstance(this); NS_RELEASE(tagInfo); } @@ -71,7 +73,6 @@ NS_METHOD EmbeddedFramePluginInstance::GetPeer(nsIPluginInstancePeer* *resulting NS_METHOD EmbeddedFramePluginInstance::Destroy() { NS_IF_RELEASE(mPeer); - NS_IF_RELEASE(mParentInstance); if (mFrame != NULL) { delete mFrame; mFrame = NULL; @@ -81,10 +82,12 @@ NS_METHOD EmbeddedFramePluginInstance::Destroy() NS_METHOD EmbeddedFramePluginInstance::SetWindow(nsPluginWindow* pluginWindow) { - if (pluginWindow != NULL) - mFrame->setWindow(WindowRef(pluginWindow->window->port)); - else - mFrame->setWindow(NULL); + if (mFrame != NULL) { + if (pluginWindow != NULL) + mFrame->setWindow(WindowRef(pluginWindow->window->port)); + else + mFrame->setWindow(NULL); + } return NS_OK; } @@ -94,3 +97,8 @@ NS_METHOD EmbeddedFramePluginInstance::HandleEvent(nsPluginEvent* pluginEvent, P *eventHandled = mFrame->handleEvent(pluginEvent->event); return NS_OK; } + +void EmbeddedFramePluginInstance::setFrame(EmbeddedFrame* frame) +{ + mFrame = frame; +} diff --git a/plugin/oji/MRJ/plugin/Source/EmbeddedFramePluginInstance.h b/plugin/oji/MRJ/plugin/Source/EmbeddedFramePluginInstance.h index 3158770d0714..ffdcefd1f1b8 100644 --- a/plugin/oji/MRJ/plugin/Source/EmbeddedFramePluginInstance.h +++ b/plugin/oji/MRJ/plugin/Source/EmbeddedFramePluginInstance.h @@ -168,6 +168,8 @@ public: NS_IMETHOD HandleEvent(nsPluginEvent* event, PRBool* handled); + void setFrame(EmbeddedFrame* frame); + private: nsIPluginInstancePeer* mPeer; MRJPluginInstance* mParentInstance;