Merge backout of changeset 5263468b1d60 (bug 395668) due to unit test timeouts in test_tooltip.xul and test_tooltip_noautohide.xul

This commit is contained in:
L. David Baron 2009-04-02 11:05:46 -07:00
commit d5b404e0cd
2 changed files with 46 additions and 33 deletions

View File

@ -72,7 +72,6 @@ nsXULTooltipListener* nsXULTooltipListener::mInstance = nsnull;
nsXULTooltipListener::nsXULTooltipListener()
: mMouseScreenX(0)
, mMouseScreenY(0)
, mTooltipShownOnce(PR_FALSE)
#ifdef MOZ_XUL
, mIsSourceTree(PR_FALSE)
, mNeedTitletip(PR_FALSE)
@ -137,9 +136,6 @@ nsXULTooltipListener::MouseUp(nsIDOMEvent* aMouseEvent)
NS_IMETHODIMP
nsXULTooltipListener::MouseOut(nsIDOMEvent* aMouseEvent)
{
// reset flag so that tooltip will display on the next MouseMove
mTooltipShownOnce = PR_FALSE;
// Clear the cached mouse event as it might hold a window alive too long, see
// bug 420803.
mCachedMouseEvent = nsnull;
@ -208,18 +204,7 @@ nsXULTooltipListener::MouseMove(nsIDOMEvent* aMouseEvent)
PRInt32 newMouseX, newMouseY;
mouseEvent->GetScreenX(&newMouseX);
mouseEvent->GetScreenY(&newMouseY);
// filter out false win32 MouseMove event
if (mMouseScreenX == newMouseX && mMouseScreenY == newMouseY)
return NS_OK;
// filter out minor movements due to crappy optical mice and shaky hands
// to prevent tooltips from hiding prematurely.
nsCOMPtr<nsIContent> currentTooltip = do_QueryReferent(mCurrentTooltip);
if ((currentTooltip) &&
(abs(mMouseScreenX - newMouseX) <= kTooltipMouseMoveTolerance) &&
(abs(mMouseScreenY - newMouseY) <= kTooltipMouseMoveTolerance))
return NS_OK;
mMouseScreenX = newMouseX;
mMouseScreenY = newMouseY;
@ -241,10 +226,11 @@ nsXULTooltipListener::MouseMove(nsIDOMEvent* aMouseEvent)
// the node.
KillTooltipTimer();
// If the mouse moves while the tooltip is up, hide it. If nothing is
// showing and the tooltip hasn't been displayed since the mouse entered
// the node, then start the timer to show the tooltip.
if (!currentTooltip && !mTooltipShownOnce) {
// If the mouse moves while the tooltip is up, don't do anything. We make it
// go away only if it times out or leaves the target node. If nothing is
// showing, though, we have to do the work.
nsCOMPtr<nsIContent> currentTooltip = do_QueryReferent(mCurrentTooltip);
if (!currentTooltip) {
mTooltipTimer = do_CreateInstance("@mozilla.org/timer;1");
if (mTooltipTimer) {
aMouseEvent->GetTarget(getter_AddRefs(eventTarget));
@ -259,8 +245,6 @@ nsXULTooltipListener::MouseMove(nsIDOMEvent* aMouseEvent)
}
}
}
} else {
HideTooltip();
}
return NS_OK;
@ -435,6 +419,13 @@ nsXULTooltipListener::ShowTooltip()
if (!currentTooltip)
return NS_OK;
// at this point, |currentTooltip| holds the content node of
// the tooltip. If there is an attribute on the popup telling us
// not to create the auto-hide timer, don't.
if (!currentTooltip->AttrValueIs(kNameSpaceID_None, nsGkAtoms::noautohide,
nsGkAtoms::_true, eCaseMatters))
CreateAutoHideTimer();
// listen for popuphidden on the tooltip node, so that we can
// be sure DestroyPopup is called even if someone else closes the tooltip
nsCOMPtr<nsIDOMEventTarget> evtTarget(do_QueryInterface(currentTooltip));
@ -536,11 +527,6 @@ nsXULTooltipListener::LaunchTooltip()
// Clear the current tooltip if the popup was not opened successfully.
if (!pm->IsPopupOpen(currentTooltip))
mCurrentTooltip = nsnull;
else {
// set a flag so that the tooltip is only displayed once until the mouse
// leaves the node
mTooltipShownOnce = PR_TRUE;
}
}
#endif
@ -725,6 +711,10 @@ nsXULTooltipListener::DestroyTooltip()
#ifdef MOZ_XUL
mLastTreeCol = nsnull;
#endif
if (mAutoHideTimer) {
mAutoHideTimer->Cancel();
mAutoHideTimer = nsnull;
}
return NS_OK;
}
@ -739,6 +729,20 @@ nsXULTooltipListener::KillTooltipTimer()
}
}
void
nsXULTooltipListener::CreateAutoHideTimer()
{
if (mAutoHideTimer) {
mAutoHideTimer->Cancel();
mAutoHideTimer = nsnull;
}
mAutoHideTimer = do_CreateInstance("@mozilla.org/timer;1");
if ( mAutoHideTimer )
mAutoHideTimer->InitWithFuncCallback(sAutoHideCallback, this, kTooltipAutoHideTime,
nsITimer::TYPE_ONE_SHOT);
}
void
nsXULTooltipListener::sTooltipCallback(nsITimer *aTimer, void *aListener)
{
@ -747,6 +751,14 @@ nsXULTooltipListener::sTooltipCallback(nsITimer *aTimer, void *aListener)
instance->ShowTooltip();
}
void
nsXULTooltipListener::sAutoHideCallback(nsITimer *aTimer, void* aListener)
{
nsRefPtr<nsXULTooltipListener> instance = mInstance;
if (instance)
instance->HideTooltip();
}
#ifdef MOZ_XUL
nsresult
nsXULTooltipListener::GetSourceTreeBoxObject(nsITreeBoxObject** aBoxObject)

View File

@ -107,10 +107,12 @@ protected:
~nsXULTooltipListener();
// pref callback for when the "show tooltips" pref changes
static int sTooltipPrefChanged (const char* aPref, void* aData);
static PRBool sShowTooltips;
static PRUint32 sTooltipListenerCount;
void KillTooltipTimer();
void CreateAutoHideTimer();
#ifdef MOZ_XUL
void CheckTreeBodyMove(nsIDOMMouseEvent* aMouseEvent);
@ -144,18 +146,17 @@ protected:
// last cached mouse event
nsCOMPtr<nsIDOMEvent> mCachedMouseEvent;
// a timer for auto-hiding the tooltip after a certain delay
nsCOMPtr<nsITimer> mAutoHideTimer;
static void sAutoHideCallback (nsITimer* aTimer, void* aListener);
// various constants for tooltips
// various delays for tooltips
enum {
kTooltipMouseMoveTolerance = 7, // 7 pixel tolerance for mousemove event
kTooltipAutoHideTime = 5000, // 5000ms = 5 seconds
kTooltipShowTime = 500 // 500ms = 0.5 seconds
};
// flag specifying if the tooltip has already been displayed by a MouseMove
// event. The flag is reset on MouseOut so that the tooltip will display
// the next time the mouse enters the node (bug #395668).
PRBool mTooltipShownOnce;
#ifdef MOZ_XUL
// special members for handling trees
PRBool mIsSourceTree;