From 1c2178cff58fdcd84a33d517cf214a17ced376f2 Mon Sep 17 00:00:00 2001 From: "joki%netscape.com" Date: Tue, 17 Apr 2001 23:25:21 +0000 Subject: [PATCH] Fix for 63742, fire DOM resize events from a resetting timer to make them more useful and avoid infinite recursion. r:pollmann,sr:jst git-svn-id: svn://10.0.0.236/trunk@92596 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/layout/base/nsPresShell.cpp | 51 +++++++++++++++++++- mozilla/layout/html/base/src/nsPresShell.cpp | 51 +++++++++++++++++++- 2 files changed, 98 insertions(+), 4 deletions(-) diff --git a/mozilla/layout/base/nsPresShell.cpp b/mozilla/layout/base/nsPresShell.cpp index cf64d401a13..7489013a956 100644 --- a/mozilla/layout/base/nsPresShell.cpp +++ b/mozilla/layout/base/nsPresShell.cpp @@ -132,6 +132,7 @@ #include "prlong.h" #include "nsIDragService.h" #include "nsCopySupport.h" +#include "nsITimer.h" // Dummy layout request #include "nsIChannel.h" @@ -1184,6 +1185,13 @@ private: void PushCurrentEventInfo(nsIFrame* aFrame, nsIContent* aContent); void PopCurrentEventInfo(); nsresult HandleEventInternal(nsEvent* aEvent, nsIView* aView, PRUint32 aFlags, nsEventStatus *aStatus); + + //help funcs for resize events + void CreateResizeEventTimer(); + void KillResizeEventTimer(); + void FireResizeEvent(); + static void sResizeEventCallback(nsITimer* aTimer, void* aPresShell) ; + nsCOMPtr mResizeEventTimer; }; #ifdef PR_LOGGING @@ -1445,6 +1453,7 @@ PresShell::~PresShell() mEventQueue->RevokeEvents(this); } + KillResizeEventTimer(); } /** @@ -2675,6 +2684,46 @@ PresShell::ResizeReflow(nscoord aWidth, nscoord aHeight) HandlePostedAttributeChanges(); HandlePostedReflowCallbacks(); + //Set resize event timer + CreateResizeEventTimer(); + + return NS_OK; //XXX this needs to be real. MMP +} + +#define RESIZE_EVENT_DELAY 200 + +void +PresShell::CreateResizeEventTimer () +{ + KillResizeEventTimer(); + + mResizeEventTimer = do_CreateInstance("@mozilla.org/timer;1"); + if (mResizeEventTimer) { + mResizeEventTimer->Init(sResizeEventCallback, this, RESIZE_EVENT_DELAY, NS_PRIORITY_HIGH); + } +} + +void +PresShell::KillResizeEventTimer() +{ + if(mResizeEventTimer) { + mResizeEventTimer->Cancel(); + mResizeEventTimer = nsnull; + } +} + +void +PresShell::sResizeEventCallback(nsITimer *aTimer, void* aPresShell) +{ + PresShell* self = NS_STATIC_CAST(PresShell*, aPresShell); + if (self) { + self->FireResizeEvent(); + } +} + +void +PresShell::FireResizeEvent() +{ //Send resize event from here. nsEvent event; nsEventStatus status = nsEventStatus_eIgnore; @@ -2685,8 +2734,6 @@ PresShell::ResizeReflow(nscoord aWidth, nscoord aHeight) nsCOMPtr globalObj; mDocument->GetScriptGlobalObject(getter_AddRefs(globalObj)); globalObj->HandleDOMEvent(mPresContext, &event, nsnull, NS_EVENT_FLAG_INIT, &status); - - return NS_OK; //XXX this needs to be real. MMP } NS_IMETHODIMP diff --git a/mozilla/layout/html/base/src/nsPresShell.cpp b/mozilla/layout/html/base/src/nsPresShell.cpp index cf64d401a13..7489013a956 100644 --- a/mozilla/layout/html/base/src/nsPresShell.cpp +++ b/mozilla/layout/html/base/src/nsPresShell.cpp @@ -132,6 +132,7 @@ #include "prlong.h" #include "nsIDragService.h" #include "nsCopySupport.h" +#include "nsITimer.h" // Dummy layout request #include "nsIChannel.h" @@ -1184,6 +1185,13 @@ private: void PushCurrentEventInfo(nsIFrame* aFrame, nsIContent* aContent); void PopCurrentEventInfo(); nsresult HandleEventInternal(nsEvent* aEvent, nsIView* aView, PRUint32 aFlags, nsEventStatus *aStatus); + + //help funcs for resize events + void CreateResizeEventTimer(); + void KillResizeEventTimer(); + void FireResizeEvent(); + static void sResizeEventCallback(nsITimer* aTimer, void* aPresShell) ; + nsCOMPtr mResizeEventTimer; }; #ifdef PR_LOGGING @@ -1445,6 +1453,7 @@ PresShell::~PresShell() mEventQueue->RevokeEvents(this); } + KillResizeEventTimer(); } /** @@ -2675,6 +2684,46 @@ PresShell::ResizeReflow(nscoord aWidth, nscoord aHeight) HandlePostedAttributeChanges(); HandlePostedReflowCallbacks(); + //Set resize event timer + CreateResizeEventTimer(); + + return NS_OK; //XXX this needs to be real. MMP +} + +#define RESIZE_EVENT_DELAY 200 + +void +PresShell::CreateResizeEventTimer () +{ + KillResizeEventTimer(); + + mResizeEventTimer = do_CreateInstance("@mozilla.org/timer;1"); + if (mResizeEventTimer) { + mResizeEventTimer->Init(sResizeEventCallback, this, RESIZE_EVENT_DELAY, NS_PRIORITY_HIGH); + } +} + +void +PresShell::KillResizeEventTimer() +{ + if(mResizeEventTimer) { + mResizeEventTimer->Cancel(); + mResizeEventTimer = nsnull; + } +} + +void +PresShell::sResizeEventCallback(nsITimer *aTimer, void* aPresShell) +{ + PresShell* self = NS_STATIC_CAST(PresShell*, aPresShell); + if (self) { + self->FireResizeEvent(); + } +} + +void +PresShell::FireResizeEvent() +{ //Send resize event from here. nsEvent event; nsEventStatus status = nsEventStatus_eIgnore; @@ -2685,8 +2734,6 @@ PresShell::ResizeReflow(nscoord aWidth, nscoord aHeight) nsCOMPtr globalObj; mDocument->GetScriptGlobalObject(getter_AddRefs(globalObj)); globalObj->HandleDOMEvent(mPresContext, &event, nsnull, NS_EVENT_FLAG_INIT, &status); - - return NS_OK; //XXX this needs to be real. MMP } NS_IMETHODIMP