r=rickg a=rickg
fixed an optimized-only crash that looks like a race condition
where we send a message containing a pointer to a frame back to
the frame manager after the frames have been deleted.
This commit is contained in:
buster%netscape.com 2000-06-05 03:37:33 +00:00
Родитель 6b825774b4
Коммит e1de241d59
2 изменённых файлов: 68 добавлений и 4 удалений

Просмотреть файл

@ -228,6 +228,11 @@ public:
NS_IMETHOD CantRenderReplacedElement(nsIPresContext* aPresContext,
nsIFrame* aFrame);
/** return PR_TRUE if this instance is prepared to process events
* (specifically, CantRenderReplacedElement events.)
*/
NS_IMETHOD CanProcessEvents() { return mCanProcessEvents; }
NS_IMETHOD NotifyDestroyingFrame(nsIFrame* aFrame);
NS_IMETHOD ReParentStyleContext(nsIPresContext* aPresContext,
@ -294,6 +299,9 @@ private:
FrameHashTable* mPlaceholderMap;
UndisplayedMap* mUndisplayedMap;
CantRenderReplacedElementEvent* mPostedEvents;
// keep around a flag that we use to prevent processing on event callbacks after
// we've started the shutdown procedure
PRBool mCanProcessEvents;
PropertyList* mPropertyList;
void ReResolveStyleContext(nsIPresContext* aPresContext,
@ -337,6 +345,7 @@ NS_NewFrameManager(nsIFrameManager** aInstancePtrResult)
FrameManager::FrameManager()
{
NS_INIT_REFCNT();
mCanProcessEvents = PR_TRUE;
}
NS_IMPL_ADDREF(FrameManager)
@ -344,9 +353,15 @@ NS_IMPL_RELEASE(FrameManager)
FrameManager::~FrameManager()
{
#ifdef NOISY_EVENTS
printf("%p ~FrameManager() start\n", this);
#endif
nsCOMPtr<nsIPresContext> presContext;
mPresShell->GetPresContext(getter_AddRefs(presContext));
// first, mark this FM so it no longer can accept events
mCanProcessEvents = PR_FALSE;
// Revoke any events posted to the event queue that we haven't processed yet
RevokePostedEvents();
@ -362,6 +377,9 @@ FrameManager::~FrameManager()
delete mPlaceholderMap;
delete mUndisplayedMap;
DestroyPropertyList(presContext);
#ifdef NOISY_EVENTS
printf("%p ~FrameManager() end\n", this);
#endif
}
nsresult
@ -711,6 +729,9 @@ FrameManager::NotifyDestroyingFrame(nsIFrame* aFrame)
void
FrameManager::RevokePostedEvents()
{
#ifdef NOISY_EVENTS
printf("%p ~RevokePostedEvents() start\n", this);
#endif
if (mPostedEvents) {
mPostedEvents = nsnull;
@ -732,6 +753,9 @@ FrameManager::RevokePostedEvents()
}
}
}
#ifdef NOISY_EVENTS
printf("%p ~RevokePostedEvents() end\n", this);
#endif
}
CantRenderReplacedElementEvent**
@ -788,13 +812,15 @@ FrameManager::DequeuePostedEventFor(nsIFrame* aFrame)
void
FrameManager::HandlePLEvent(CantRenderReplacedElementEvent* aEvent) {
#ifdef NOISY_EVENTS
printf("FrameManager::HandlePLEvent() start for FM %p\n", aEvent->owner);
#endif
FrameManager* frameManager = (FrameManager*)aEvent->owner;
//adding a ptr check since talkback is complaining about a crash here.
//I suspect that if the event->owner is really null, bad things will happen
//elsewhere.
if(frameManager) {
if(frameManager && frameManager->CanProcessEvents()) {
// Remove the posted event from the linked list
CantRenderReplacedElementEvent** events = &frameManager->mPostedEvents;
@ -813,6 +839,9 @@ FrameManager::HandlePLEvent(CantRenderReplacedElementEvent* aEvent) {
frameManager->mPresShell->GetPresContext(getter_AddRefs(presContext));
frameManager->mStyleSet->CantRenderReplacedElement(presContext, aEvent->mFrame);
}
#ifdef NOISY_EVENTS
printf("FrameManager::HandlePLEvent() end for FM %p\n", aEvent->owner);
#endif
}
void
@ -835,6 +864,9 @@ NS_IMETHODIMP
FrameManager::CantRenderReplacedElement(nsIPresContext* aPresContext,
nsIFrame* aFrame)
{
#ifdef NOISY_EVENTS
printf("%p FrameManager::CantRenderReplacedElement called\n", this);
#endif
nsIEventQueueService* eventService;
nsresult rv;

Просмотреть файл

@ -228,6 +228,11 @@ public:
NS_IMETHOD CantRenderReplacedElement(nsIPresContext* aPresContext,
nsIFrame* aFrame);
/** return PR_TRUE if this instance is prepared to process events
* (specifically, CantRenderReplacedElement events.)
*/
NS_IMETHOD CanProcessEvents() { return mCanProcessEvents; }
NS_IMETHOD NotifyDestroyingFrame(nsIFrame* aFrame);
NS_IMETHOD ReParentStyleContext(nsIPresContext* aPresContext,
@ -294,6 +299,9 @@ private:
FrameHashTable* mPlaceholderMap;
UndisplayedMap* mUndisplayedMap;
CantRenderReplacedElementEvent* mPostedEvents;
// keep around a flag that we use to prevent processing on event callbacks after
// we've started the shutdown procedure
PRBool mCanProcessEvents;
PropertyList* mPropertyList;
void ReResolveStyleContext(nsIPresContext* aPresContext,
@ -337,6 +345,7 @@ NS_NewFrameManager(nsIFrameManager** aInstancePtrResult)
FrameManager::FrameManager()
{
NS_INIT_REFCNT();
mCanProcessEvents = PR_TRUE;
}
NS_IMPL_ADDREF(FrameManager)
@ -344,9 +353,15 @@ NS_IMPL_RELEASE(FrameManager)
FrameManager::~FrameManager()
{
#ifdef NOISY_EVENTS
printf("%p ~FrameManager() start\n", this);
#endif
nsCOMPtr<nsIPresContext> presContext;
mPresShell->GetPresContext(getter_AddRefs(presContext));
// first, mark this FM so it no longer can accept events
mCanProcessEvents = PR_FALSE;
// Revoke any events posted to the event queue that we haven't processed yet
RevokePostedEvents();
@ -362,6 +377,9 @@ FrameManager::~FrameManager()
delete mPlaceholderMap;
delete mUndisplayedMap;
DestroyPropertyList(presContext);
#ifdef NOISY_EVENTS
printf("%p ~FrameManager() end\n", this);
#endif
}
nsresult
@ -711,6 +729,9 @@ FrameManager::NotifyDestroyingFrame(nsIFrame* aFrame)
void
FrameManager::RevokePostedEvents()
{
#ifdef NOISY_EVENTS
printf("%p ~RevokePostedEvents() start\n", this);
#endif
if (mPostedEvents) {
mPostedEvents = nsnull;
@ -732,6 +753,9 @@ FrameManager::RevokePostedEvents()
}
}
}
#ifdef NOISY_EVENTS
printf("%p ~RevokePostedEvents() end\n", this);
#endif
}
CantRenderReplacedElementEvent**
@ -788,13 +812,15 @@ FrameManager::DequeuePostedEventFor(nsIFrame* aFrame)
void
FrameManager::HandlePLEvent(CantRenderReplacedElementEvent* aEvent) {
#ifdef NOISY_EVENTS
printf("FrameManager::HandlePLEvent() start for FM %p\n", aEvent->owner);
#endif
FrameManager* frameManager = (FrameManager*)aEvent->owner;
//adding a ptr check since talkback is complaining about a crash here.
//I suspect that if the event->owner is really null, bad things will happen
//elsewhere.
if(frameManager) {
if(frameManager && frameManager->CanProcessEvents()) {
// Remove the posted event from the linked list
CantRenderReplacedElementEvent** events = &frameManager->mPostedEvents;
@ -813,6 +839,9 @@ FrameManager::HandlePLEvent(CantRenderReplacedElementEvent* aEvent) {
frameManager->mPresShell->GetPresContext(getter_AddRefs(presContext));
frameManager->mStyleSet->CantRenderReplacedElement(presContext, aEvent->mFrame);
}
#ifdef NOISY_EVENTS
printf("FrameManager::HandlePLEvent() end for FM %p\n", aEvent->owner);
#endif
}
void
@ -835,6 +864,9 @@ NS_IMETHODIMP
FrameManager::CantRenderReplacedElement(nsIPresContext* aPresContext,
nsIFrame* aFrame)
{
#ifdef NOISY_EVENTS
printf("%p FrameManager::CantRenderReplacedElement called\n", this);
#endif
nsIEventQueueService* eventService;
nsresult rv;