From 6c59f1939118693bb1ee6f59c48b162fcae17204 Mon Sep 17 00:00:00 2001 From: "joki%netscape.com" Date: Mon, 12 Apr 1999 21:24:07 +0000 Subject: [PATCH] New api's into nsEventStateManager for content state change (hover,focus,active) git-svn-id: svn://10.0.0.236/trunk@27211 18797224-902f-48f8-a5cc-f745e15eee43 --- .../events/public/nsIEventStateManager.h | 13 +- .../events/src/nsEventStateManager.cpp | 165 +++++++++++------- .../content/events/src/nsEventStateManager.h | 5 +- .../html/content/src/nsHTMLAnchorElement.cpp | 22 ++- .../html/content/src/nsHTMLAreaElement.cpp | 2 +- .../html/content/src/nsHTMLButtonElement.cpp | 29 ++- .../html/content/src/nsHTMLInputElement.cpp | 2 +- .../html/content/src/nsHTMLSelectElement.cpp | 2 +- .../content/src/nsHTMLTextAreaElement.cpp | 2 +- .../content/xml/content/src/nsXMLElement.cpp | 6 +- .../events/public/nsIEventStateManager.h | 13 +- .../layout/events/src/nsEventStateManager.cpp | 165 +++++++++++------- .../layout/events/src/nsEventStateManager.h | 5 +- mozilla/layout/generic/nsFrame.cpp | 9 +- mozilla/layout/generic/nsImageFrame.cpp | 15 +- mozilla/layout/html/base/src/nsFrame.cpp | 9 +- mozilla/layout/html/base/src/nsImageFrame.cpp | 15 +- .../html/content/src/nsHTMLAnchorElement.cpp | 22 ++- .../html/content/src/nsHTMLAreaElement.cpp | 2 +- .../html/content/src/nsHTMLButtonElement.cpp | 29 ++- .../html/content/src/nsHTMLInputElement.cpp | 2 +- .../html/content/src/nsHTMLSelectElement.cpp | 2 +- .../content/src/nsHTMLTextAreaElement.cpp | 2 +- .../layout/xml/content/src/nsXMLElement.cpp | 6 +- 24 files changed, 306 insertions(+), 238 deletions(-) diff --git a/mozilla/content/events/public/nsIEventStateManager.h b/mozilla/content/events/public/nsIEventStateManager.h index d3d0ada6458..49bcd385193 100644 --- a/mozilla/content/events/public/nsIEventStateManager.h +++ b/mozilla/content/events/public/nsIEventStateManager.h @@ -56,15 +56,12 @@ public: NS_IMETHOD GetEventTarget(nsIFrame **aFrame) = 0; NS_IMETHOD GetContentState(nsIContent *aContent, PRInt32& aState) = 0; - - NS_IMETHOD SetActiveContent(nsIContent *aActive) = 0; - NS_IMETHOD SetHoverContent(nsIContent *aHover) = 0; - NS_IMETHOD SetFocusedContent(nsIContent *aContent) = 0; + NS_IMETHOD SetContentState(nsIContent *aContent, PRInt32 aState) = 0; }; -#define NS_EVENT_STATE_UNSPECIFIED 0000 -#define NS_EVENT_STATE_ACTIVE 0001 // mouse is down on content -#define NS_EVENT_STATE_FOCUS 0002 // content has focus -#define NS_EVENT_STATE_HOVER 0003 // mouse is hovering over content +#define NS_EVENT_STATE_UNSPECIFIED 0x0000 +#define NS_EVENT_STATE_ACTIVE 0x0001 // mouse is down on content +#define NS_EVENT_STATE_FOCUS 0x0002 // content has focus +#define NS_EVENT_STATE_HOVER 0x0004 // mouse is hovering over content #endif // nsIEventStateManager_h__ diff --git a/mozilla/content/events/src/nsEventStateManager.cpp b/mozilla/content/events/src/nsEventStateManager.cpp index 3a60886cc36..e3c21f545b2 100644 --- a/mozilla/content/events/src/nsEventStateManager.cpp +++ b/mozilla/content/events/src/nsEventStateManager.cpp @@ -130,24 +130,30 @@ nsEventStateManager::PostHandleEvent(nsIPresContext& aPresContext, case NS_MOUSE_RIGHT_BUTTON_DOWN: { ret = CheckForAndDispatchClick(aPresContext, (nsMouseEvent*)aEvent, aStatus); - - nsIContent* newFocus; - mCurrentTarget->GetContent(&newFocus); - if (newFocus) { - if (!ChangeFocus(newFocus, PR_TRUE)) { - if (nsnull != aEvent->widget) { - aEvent->widget->SetFocus(); + + if (nsEventStatus_eConsumeNoDefault != aStatus) { + nsIContent* newFocus; + mCurrentTarget->GetContent(&newFocus); + if (newFocus) { + if (!ChangeFocus(newFocus, PR_TRUE)) { + if (nsnull != aEvent->widget) { + aEvent->widget->SetFocus(); + } } } - NS_RELEASE(newFocus); + + SetContentState(newFocus, NS_EVENT_STATE_ACTIVE); + + NS_IF_RELEASE(newFocus); } + } break; case NS_MOUSE_LEFT_BUTTON_UP: case NS_MOUSE_MIDDLE_BUTTON_UP: case NS_MOUSE_RIGHT_BUTTON_UP: ret = CheckForAndDispatchClick(aPresContext, (nsMouseEvent*)aEvent, aStatus); - SetActiveContent(nsnull); + SetContentState(nsnull, NS_EVENT_STATE_ACTIVE); break; case NS_KEY_DOWN: ret = DispatchKeyPressEvent(aPresContext, (nsKeyEvent*)aEvent, aStatus); @@ -274,6 +280,10 @@ nsEventStateManager::GenerateMouseEnterExit(nsIPresContext& aPresContext, nsGUIE } } + if (nsEventStatus_eConsumeNoDefault != status) { + SetContentState(nsnull, NS_EVENT_STATE_HOVER); + } + //Now dispatch to the frame if (nsnull != mLastMouseOverFrame) { //XXX Get the new frame @@ -294,6 +304,10 @@ nsEventStateManager::GenerateMouseEnterExit(nsIPresContext& aPresContext, nsGUIE if (nsnull != targetContent) { targetContent->HandleDOMEvent(aPresContext, &event, nsnull, NS_EVENT_FLAG_INIT, status); } + + if (nsEventStatus_eConsumeNoDefault != status) { + SetContentState(targetContent, NS_EVENT_STATE_HOVER); + } } //Now dispatch to the frame @@ -455,6 +469,8 @@ nsEventStateManager::ChangeFocus(nsIContent* aFocus, PRBool aSetFocus) void nsEventStateManager::ShiftFocus(PRBool forward) { + PRBool topOfDoc = PR_FALSE; + if (nsnull == mPresContext) { return; } @@ -475,11 +491,14 @@ nsEventStateManager::ShiftFocus(PRBool forward) return; } mCurrentTabIndex = forward ? 1 : 0; + topOfDoc = PR_TRUE; } nsIContent* next = GetNextTabbableContent(mCurrentFocus, nsnull, mCurrentFocus, forward); if (nsnull == next) { + PRBool focusTaken = PR_FALSE; + NS_IF_RELEASE(mCurrentFocus); //Pass focus up to nsIWebShellContainer FocusAvailable @@ -491,13 +510,16 @@ nsEventStateManager::ShiftFocus(PRBool forward) nsIWebShellContainer* webShellContainer; webShell->GetContainer(webShellContainer); if (nsnull != webShellContainer) { - webShellContainer->FocusAvailable(webShell); + webShellContainer->FocusAvailable(webShell, focusTaken); NS_RELEASE(webShellContainer); } NS_RELEASE(webShell); } NS_RELEASE(container); } + if (!focusTaken && !topOfDoc) { + ShiftFocus(forward); + } return; } @@ -693,59 +715,70 @@ nsEventStateManager::GetContentState(nsIContent *aContent, PRInt32& aState) } NS_IMETHODIMP -nsEventStateManager::SetActiveContent(nsIContent *aActive) +nsEventStateManager::SetContentState(nsIContent *aContent, PRInt32 aState) { - nsIDocument *mDocument; + nsIDocument *document; - if (nsnull != mActiveContent) { + if (aState & NS_EVENT_STATE_ACTIVE && nsnull != mActiveContent) { //transferring ref to lastActive from mActiveContent nsIContent *lastActive = mActiveContent; + mActiveContent = nsnull; - if (NS_OK == mActiveContent->GetDocument(mDocument)) { - mActiveContent = nsnull; - mDocument->ContentStateChanged(lastActive); - NS_RELEASE(mDocument); + lastActive->GetDocument(document); + if (document) { + document->ContentStateChanged(lastActive); + NS_RELEASE(document); } NS_RELEASE(lastActive); } - mActiveContent = aActive; - NS_IF_ADDREF(mActiveContent); - - if (nsnull != mActiveContent) { - if (NS_OK == mActiveContent->GetDocument(mDocument)) { - mDocument->ContentStateChanged(mActiveContent); - NS_RELEASE(mDocument); - } - } - - return NS_OK; -} - -NS_IMETHODIMP -nsEventStateManager::SetHoverContent(nsIContent *aHover) -{ - nsIDocument *mDocument; - - if (nsnull != mHoverContent) { - //transferring ref to lastHover from mActiveContent + if (aState & NS_EVENT_STATE_HOVER && nsnull != mHoverContent) { + //transferring ref to lastHover from mHoverContent nsIContent *lastHover = mHoverContent; + mHoverContent = nsnull; - if (NS_OK == mHoverContent->GetDocument(mDocument)) { - mHoverContent = nsnull; - mDocument->ContentStateChanged(lastHover); - NS_RELEASE(mDocument); + lastHover->GetDocument(document); + if (document) { + document->ContentStateChanged(lastHover); + NS_RELEASE(document); } NS_RELEASE(lastHover); } - mHoverContent = aHover; + if (aState & NS_EVENT_STATE_FOCUS) { + SendFocusBlur(aContent); - NS_IF_ADDREF(mHoverContent); - if (nsnull != mHoverContent) { - if (NS_OK == mHoverContent->GetDocument(mDocument)) { - mDocument->ContentStateChanged(mHoverContent); - NS_RELEASE(mDocument); + if (nsnull != mCurrentFocus) { + //transferring ref to lastFocus from mCurrentFocus + nsIContent *lastFocus = mCurrentFocus; + mCurrentFocus = nsnull; + + lastFocus->GetDocument(document); + if (document) { + document->ContentStateChanged(lastFocus); + NS_RELEASE(document); + } + NS_RELEASE(lastFocus); + } + } + + if (nsnull != aContent) { + if (aState & NS_EVENT_STATE_ACTIVE) { + mActiveContent = aContent; + NS_IF_ADDREF(mActiveContent); + } + if (aState & NS_EVENT_STATE_HOVER) { + mHoverContent = aContent; + NS_IF_ADDREF(mHoverContent); + } + if (aState & NS_EVENT_STATE_FOCUS) { + mCurrentFocus = aContent; + NS_IF_ADDREF(mCurrentFocus); + } + aContent->GetDocument(document); + if (document) { + document->ContentStateChanged(aContent); + NS_RELEASE(document); } } @@ -753,12 +786,14 @@ nsEventStateManager::SetHoverContent(nsIContent *aHover) } NS_IMETHODIMP -nsEventStateManager::SetFocusedContent(nsIContent *aContent) +nsEventStateManager::SendFocusBlur(nsIContent *aContent) { if (mCurrentFocus == aContent) { return NS_OK; } + nsIDocument *document; + if (mCurrentFocus) { ChangeFocus(mCurrentFocus, PR_FALSE); @@ -771,29 +806,27 @@ nsEventStateManager::SetFocusedContent(nsIContent *aContent) if (nsnull != mPresContext) { mCurrentFocus->HandleDOMEvent(*mPresContext, &event, nsnull, NS_EVENT_FLAG_INIT, status); } - NS_RELEASE(mCurrentFocus); } - //fire focus - nsEventStatus status = nsEventStatus_eIgnore; - nsEvent event; - event.eventStructType = NS_EVENT; - event.message = NS_FOCUS_CONTENT; + if (nsnull != aContent) { + //fire focus + nsEventStatus status = nsEventStatus_eIgnore; + nsEvent event; + event.eventStructType = NS_EVENT; + event.message = NS_FOCUS_CONTENT; - if (nsnull != mPresContext) { - aContent->HandleDOMEvent(*mPresContext, &event, nsnull, NS_EVENT_FLAG_INIT, status); + if (nsnull != mPresContext) { + aContent->HandleDOMEvent(*mPresContext, &event, nsnull, NS_EVENT_FLAG_INIT, status); + } + + nsAutoString tabIndex; + aContent->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::tabindex, tabIndex); + PRInt32 ec, val = tabIndex.ToInteger(&ec); + if (NS_OK == ec) { + mCurrentTabIndex = val; + } } - nsAutoString tabIndex; - aContent->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::tabindex, tabIndex); - PRInt32 ec, val = tabIndex.ToInteger(&ec); - if (NS_OK == ec) { - mCurrentTabIndex = val; - } - - mCurrentFocus = aContent; - NS_IF_ADDREF(mCurrentFocus); - return NS_OK; } diff --git a/mozilla/content/events/src/nsEventStateManager.h b/mozilla/content/events/src/nsEventStateManager.h index 4b43bd89e05..325dc0fb57a 100644 --- a/mozilla/content/events/src/nsEventStateManager.h +++ b/mozilla/content/events/src/nsEventStateManager.h @@ -51,9 +51,7 @@ public: NS_IMETHOD GetEventTarget(nsIFrame **aFrame); NS_IMETHOD GetContentState(nsIContent *aContent, PRInt32& aState); - NS_IMETHOD SetActiveContent(nsIContent *aActive); - NS_IMETHOD SetHoverContent(nsIContent *aHover); - NS_IMETHOD SetFocusedContent(nsIContent *aContent); + NS_IMETHOD SetContentState(nsIContent *aContent, PRInt32 aState); protected: void UpdateCursor(nsIPresContext& aPresContext, nsPoint& aPoint, nsIFrame* aTargetFrame, nsEventStatus& aStatus); @@ -64,6 +62,7 @@ protected: void ShiftFocus(PRBool foward); nsIContent* GetNextTabbableContent(nsIContent* aParent, nsIContent* aChild, nsIContent* aTop, PRBool foward); PRInt32 GetNextTabIndex(nsIContent* aParent, PRBool foward); + NS_IMETHOD SendFocusBlur(nsIContent *aContent); //Any frames here must be checked for validity in ClearFrameRefs nsIFrame* mCurrentTarget; diff --git a/mozilla/content/html/content/src/nsHTMLAnchorElement.cpp b/mozilla/content/html/content/src/nsHTMLAnchorElement.cpp index a021d43ccd3..686fb0ca215 100644 --- a/mozilla/content/html/content/src/nsHTMLAnchorElement.cpp +++ b/mozilla/content/html/content/src/nsHTMLAnchorElement.cpp @@ -200,7 +200,7 @@ nsHTMLAnchorElement::SetFocus(nsIPresContext* aPresContext) { nsIEventStateManager* esm; if (NS_OK == aPresContext->GetEventStateManager(&esm)) { - esm->SetFocusedContent(this); + esm->SetContentState(this, NS_EVENT_STATE_FOCUS); NS_RELEASE(esm); } @@ -286,7 +286,7 @@ nsHTMLAnchorElement::HandleDOMEvent(nsIPresContext& aPresContext, { nsIEventStateManager *stateManager; if (NS_OK == aPresContext.GetEventStateManager(&stateManager)) { - stateManager->SetActiveContent(this); + stateManager->SetContentState(this, NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_FOCUS); NS_RELEASE(stateManager); } aEventStatus = nsEventStatus_eConsumeNoDefault; @@ -306,7 +306,7 @@ nsHTMLAnchorElement::HandleDOMEvent(nsIPresContext& aPresContext, mInner.TriggerLink(aPresContext, eLinkVerb_Replace, baseURL, href, target, PR_TRUE); NS_IF_RELEASE(baseURL); - aEventStatus = nsEventStatus_eConsumeNoDefault; + aEventStatus = nsEventStatus_eConsumeDoDefault; } } break; @@ -317,6 +317,12 @@ nsHTMLAnchorElement::HandleDOMEvent(nsIPresContext& aPresContext, case NS_MOUSE_ENTER: { + nsIEventStateManager *stateManager; + if (NS_OK == aPresContext.GetEventStateManager(&stateManager)) { + stateManager->SetContentState(this, NS_EVENT_STATE_HOVER); + NS_RELEASE(stateManager); + } + nsAutoString target; nsIURL* baseURL = nsnull; GetBaseURL(baseURL); @@ -327,15 +333,21 @@ nsHTMLAnchorElement::HandleDOMEvent(nsIPresContext& aPresContext, mInner.TriggerLink(aPresContext, eLinkVerb_Replace, baseURL, href, target, PR_FALSE); NS_IF_RELEASE(baseURL); - aEventStatus = nsEventStatus_eConsumeDoDefault; + aEventStatus = nsEventStatus_eConsumeNoDefault; } break; case NS_MOUSE_EXIT: { + nsIEventStateManager *stateManager; + if (NS_OK == aPresContext.GetEventStateManager(&stateManager)) { + stateManager->SetContentState(nsnull, NS_EVENT_STATE_HOVER); + NS_RELEASE(stateManager); + } + nsAutoString empty; mInner.TriggerLink(aPresContext, eLinkVerb_Replace, nsnull, empty, empty, PR_FALSE); - aEventStatus = nsEventStatus_eConsumeDoDefault; + aEventStatus = nsEventStatus_eConsumeNoDefault; } break; diff --git a/mozilla/content/html/content/src/nsHTMLAreaElement.cpp b/mozilla/content/html/content/src/nsHTMLAreaElement.cpp index fe9e09f18a9..bfc090cc14c 100644 --- a/mozilla/content/html/content/src/nsHTMLAreaElement.cpp +++ b/mozilla/content/html/content/src/nsHTMLAreaElement.cpp @@ -231,7 +231,7 @@ nsHTMLAreaElement::SetFocus(nsIPresContext* aPresContext) { nsIEventStateManager* esm; if (NS_OK == aPresContext->GetEventStateManager(&esm)) { - esm->SetFocusedContent(this); + esm->SetContentState(this, NS_EVENT_STATE_FOCUS); NS_RELEASE(esm); } diff --git a/mozilla/content/html/content/src/nsHTMLButtonElement.cpp b/mozilla/content/html/content/src/nsHTMLButtonElement.cpp index e1d3021f423..4ca8a1e14e3 100644 --- a/mozilla/content/html/content/src/nsHTMLButtonElement.cpp +++ b/mozilla/content/html/content/src/nsHTMLButtonElement.cpp @@ -276,7 +276,7 @@ nsHTMLButtonElement::SetFocus(nsIPresContext* aPresContext) { nsIEventStateManager* esm; if (NS_OK == aPresContext->GetEventStateManager(&esm)) { - esm->SetFocusedContent(this); + esm->SetContentState(this, NS_EVENT_STATE_FOCUS); NS_RELEASE(esm); } @@ -372,7 +372,7 @@ nsHTMLButtonElement::HandleDOMEvent(nsIPresContext& aPresContext, { nsIEventStateManager *stateManager; if (NS_OK == aPresContext.GetEventStateManager(&stateManager)) { - //stateManager->SetActiveLink(this); + stateManager->SetContentState(this, NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_FOCUS); NS_RELEASE(stateManager); } aEventStatus = nsEventStatus_eConsumeNoDefault; @@ -413,28 +413,25 @@ nsHTMLButtonElement::HandleDOMEvent(nsIPresContext& aPresContext, break; case NS_MOUSE_ENTER: - //mouse enter doesn't work yet. Use move until then. { - nsAutoString href, target; - nsIURL* baseURL = nsnull; - GetBaseURL(baseURL); - GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::href, href); - GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::target, target); - if (target.Length() == 0) { - GetBaseTarget(target); + nsIEventStateManager *stateManager; + if (NS_OK == aPresContext.GetEventStateManager(&stateManager)) { + stateManager->SetContentState(this, NS_EVENT_STATE_HOVER); + NS_RELEASE(stateManager); } - mInner.TriggerLink(aPresContext, eLinkVerb_Replace, baseURL, href, target, PR_FALSE); - NS_IF_RELEASE(baseURL); - aEventStatus = nsEventStatus_eConsumeDoDefault; + aEventStatus = nsEventStatus_eConsumeNoDefault; } break; // XXX this doesn't seem to do anything yet case NS_MOUSE_EXIT: { - nsAutoString empty; - mInner.TriggerLink(aPresContext, eLinkVerb_Replace, nsnull, empty, empty, PR_FALSE); - aEventStatus = nsEventStatus_eConsumeDoDefault; + nsIEventStateManager *stateManager; + if (NS_OK == aPresContext.GetEventStateManager(&stateManager)) { + stateManager->SetContentState(nsnull, NS_EVENT_STATE_HOVER); + NS_RELEASE(stateManager); + } + aEventStatus = nsEventStatus_eConsumeNoDefault; } break; diff --git a/mozilla/content/html/content/src/nsHTMLInputElement.cpp b/mozilla/content/html/content/src/nsHTMLInputElement.cpp index 4a110505c23..a0990be4388 100644 --- a/mozilla/content/html/content/src/nsHTMLInputElement.cpp +++ b/mozilla/content/html/content/src/nsHTMLInputElement.cpp @@ -425,7 +425,7 @@ nsHTMLInputElement::SetFocus(nsIPresContext* aPresContext) { nsIEventStateManager* esm; if (NS_OK == aPresContext->GetEventStateManager(&esm)) { - esm->SetFocusedContent(this); + esm->SetContentState(this, NS_EVENT_STATE_FOCUS); NS_RELEASE(esm); } diff --git a/mozilla/content/html/content/src/nsHTMLSelectElement.cpp b/mozilla/content/html/content/src/nsHTMLSelectElement.cpp index 5bc62c42bb8..71da7a9f6a9 100644 --- a/mozilla/content/html/content/src/nsHTMLSelectElement.cpp +++ b/mozilla/content/html/content/src/nsHTMLSelectElement.cpp @@ -415,7 +415,7 @@ nsHTMLSelectElement::SetFocus(nsIPresContext* aPresContext) { nsIEventStateManager* esm; if (NS_OK == aPresContext->GetEventStateManager(&esm)) { - esm->SetFocusedContent(this); + esm->SetContentState(this, NS_EVENT_STATE_FOCUS); NS_RELEASE(esm); } diff --git a/mozilla/content/html/content/src/nsHTMLTextAreaElement.cpp b/mozilla/content/html/content/src/nsHTMLTextAreaElement.cpp index 9e451a2d204..6db3361426a 100644 --- a/mozilla/content/html/content/src/nsHTMLTextAreaElement.cpp +++ b/mozilla/content/html/content/src/nsHTMLTextAreaElement.cpp @@ -252,7 +252,7 @@ nsHTMLTextAreaElement::SetFocus(nsIPresContext* aPresContext) { nsIEventStateManager* esm; if (NS_OK == aPresContext->GetEventStateManager(&esm)) { - esm->SetFocusedContent(this); + esm->SetContentState(this, NS_EVENT_STATE_FOCUS); NS_RELEASE(esm); } diff --git a/mozilla/content/xml/content/src/nsXMLElement.cpp b/mozilla/content/xml/content/src/nsXMLElement.cpp index 1dfd072503f..87a5836e3ca 100644 --- a/mozilla/content/xml/content/src/nsXMLElement.cpp +++ b/mozilla/content/xml/content/src/nsXMLElement.cpp @@ -136,10 +136,10 @@ nsXMLElement::HandleDOMEvent(nsIPresContext& aPresContext, { nsIEventStateManager *stateManager; if (NS_OK == aPresContext.GetEventStateManager(&stateManager)) { - stateManager->SetActiveContent(this); + stateManager->SetContentState(this, NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_FOCUS); NS_RELEASE(stateManager); } - aEventStatus = nsEventStatus_eConsumeNoDefault; + aEventStatus = nsEventStatus_eConsumeDoDefault; } break; @@ -165,7 +165,7 @@ nsXMLElement::HandleDOMEvent(nsIPresContext& aPresContext, } mInner.TriggerLink(aPresContext, verb, baseURL, href, target, PR_TRUE); NS_IF_RELEASE(baseURL); - aEventStatus = nsEventStatus_eConsumeNoDefault; + aEventStatus = nsEventStatus_eConsumeDoDefault; } } break; diff --git a/mozilla/layout/events/public/nsIEventStateManager.h b/mozilla/layout/events/public/nsIEventStateManager.h index d3d0ada6458..49bcd385193 100644 --- a/mozilla/layout/events/public/nsIEventStateManager.h +++ b/mozilla/layout/events/public/nsIEventStateManager.h @@ -56,15 +56,12 @@ public: NS_IMETHOD GetEventTarget(nsIFrame **aFrame) = 0; NS_IMETHOD GetContentState(nsIContent *aContent, PRInt32& aState) = 0; - - NS_IMETHOD SetActiveContent(nsIContent *aActive) = 0; - NS_IMETHOD SetHoverContent(nsIContent *aHover) = 0; - NS_IMETHOD SetFocusedContent(nsIContent *aContent) = 0; + NS_IMETHOD SetContentState(nsIContent *aContent, PRInt32 aState) = 0; }; -#define NS_EVENT_STATE_UNSPECIFIED 0000 -#define NS_EVENT_STATE_ACTIVE 0001 // mouse is down on content -#define NS_EVENT_STATE_FOCUS 0002 // content has focus -#define NS_EVENT_STATE_HOVER 0003 // mouse is hovering over content +#define NS_EVENT_STATE_UNSPECIFIED 0x0000 +#define NS_EVENT_STATE_ACTIVE 0x0001 // mouse is down on content +#define NS_EVENT_STATE_FOCUS 0x0002 // content has focus +#define NS_EVENT_STATE_HOVER 0x0004 // mouse is hovering over content #endif // nsIEventStateManager_h__ diff --git a/mozilla/layout/events/src/nsEventStateManager.cpp b/mozilla/layout/events/src/nsEventStateManager.cpp index 3a60886cc36..e3c21f545b2 100644 --- a/mozilla/layout/events/src/nsEventStateManager.cpp +++ b/mozilla/layout/events/src/nsEventStateManager.cpp @@ -130,24 +130,30 @@ nsEventStateManager::PostHandleEvent(nsIPresContext& aPresContext, case NS_MOUSE_RIGHT_BUTTON_DOWN: { ret = CheckForAndDispatchClick(aPresContext, (nsMouseEvent*)aEvent, aStatus); - - nsIContent* newFocus; - mCurrentTarget->GetContent(&newFocus); - if (newFocus) { - if (!ChangeFocus(newFocus, PR_TRUE)) { - if (nsnull != aEvent->widget) { - aEvent->widget->SetFocus(); + + if (nsEventStatus_eConsumeNoDefault != aStatus) { + nsIContent* newFocus; + mCurrentTarget->GetContent(&newFocus); + if (newFocus) { + if (!ChangeFocus(newFocus, PR_TRUE)) { + if (nsnull != aEvent->widget) { + aEvent->widget->SetFocus(); + } } } - NS_RELEASE(newFocus); + + SetContentState(newFocus, NS_EVENT_STATE_ACTIVE); + + NS_IF_RELEASE(newFocus); } + } break; case NS_MOUSE_LEFT_BUTTON_UP: case NS_MOUSE_MIDDLE_BUTTON_UP: case NS_MOUSE_RIGHT_BUTTON_UP: ret = CheckForAndDispatchClick(aPresContext, (nsMouseEvent*)aEvent, aStatus); - SetActiveContent(nsnull); + SetContentState(nsnull, NS_EVENT_STATE_ACTIVE); break; case NS_KEY_DOWN: ret = DispatchKeyPressEvent(aPresContext, (nsKeyEvent*)aEvent, aStatus); @@ -274,6 +280,10 @@ nsEventStateManager::GenerateMouseEnterExit(nsIPresContext& aPresContext, nsGUIE } } + if (nsEventStatus_eConsumeNoDefault != status) { + SetContentState(nsnull, NS_EVENT_STATE_HOVER); + } + //Now dispatch to the frame if (nsnull != mLastMouseOverFrame) { //XXX Get the new frame @@ -294,6 +304,10 @@ nsEventStateManager::GenerateMouseEnterExit(nsIPresContext& aPresContext, nsGUIE if (nsnull != targetContent) { targetContent->HandleDOMEvent(aPresContext, &event, nsnull, NS_EVENT_FLAG_INIT, status); } + + if (nsEventStatus_eConsumeNoDefault != status) { + SetContentState(targetContent, NS_EVENT_STATE_HOVER); + } } //Now dispatch to the frame @@ -455,6 +469,8 @@ nsEventStateManager::ChangeFocus(nsIContent* aFocus, PRBool aSetFocus) void nsEventStateManager::ShiftFocus(PRBool forward) { + PRBool topOfDoc = PR_FALSE; + if (nsnull == mPresContext) { return; } @@ -475,11 +491,14 @@ nsEventStateManager::ShiftFocus(PRBool forward) return; } mCurrentTabIndex = forward ? 1 : 0; + topOfDoc = PR_TRUE; } nsIContent* next = GetNextTabbableContent(mCurrentFocus, nsnull, mCurrentFocus, forward); if (nsnull == next) { + PRBool focusTaken = PR_FALSE; + NS_IF_RELEASE(mCurrentFocus); //Pass focus up to nsIWebShellContainer FocusAvailable @@ -491,13 +510,16 @@ nsEventStateManager::ShiftFocus(PRBool forward) nsIWebShellContainer* webShellContainer; webShell->GetContainer(webShellContainer); if (nsnull != webShellContainer) { - webShellContainer->FocusAvailable(webShell); + webShellContainer->FocusAvailable(webShell, focusTaken); NS_RELEASE(webShellContainer); } NS_RELEASE(webShell); } NS_RELEASE(container); } + if (!focusTaken && !topOfDoc) { + ShiftFocus(forward); + } return; } @@ -693,59 +715,70 @@ nsEventStateManager::GetContentState(nsIContent *aContent, PRInt32& aState) } NS_IMETHODIMP -nsEventStateManager::SetActiveContent(nsIContent *aActive) +nsEventStateManager::SetContentState(nsIContent *aContent, PRInt32 aState) { - nsIDocument *mDocument; + nsIDocument *document; - if (nsnull != mActiveContent) { + if (aState & NS_EVENT_STATE_ACTIVE && nsnull != mActiveContent) { //transferring ref to lastActive from mActiveContent nsIContent *lastActive = mActiveContent; + mActiveContent = nsnull; - if (NS_OK == mActiveContent->GetDocument(mDocument)) { - mActiveContent = nsnull; - mDocument->ContentStateChanged(lastActive); - NS_RELEASE(mDocument); + lastActive->GetDocument(document); + if (document) { + document->ContentStateChanged(lastActive); + NS_RELEASE(document); } NS_RELEASE(lastActive); } - mActiveContent = aActive; - NS_IF_ADDREF(mActiveContent); - - if (nsnull != mActiveContent) { - if (NS_OK == mActiveContent->GetDocument(mDocument)) { - mDocument->ContentStateChanged(mActiveContent); - NS_RELEASE(mDocument); - } - } - - return NS_OK; -} - -NS_IMETHODIMP -nsEventStateManager::SetHoverContent(nsIContent *aHover) -{ - nsIDocument *mDocument; - - if (nsnull != mHoverContent) { - //transferring ref to lastHover from mActiveContent + if (aState & NS_EVENT_STATE_HOVER && nsnull != mHoverContent) { + //transferring ref to lastHover from mHoverContent nsIContent *lastHover = mHoverContent; + mHoverContent = nsnull; - if (NS_OK == mHoverContent->GetDocument(mDocument)) { - mHoverContent = nsnull; - mDocument->ContentStateChanged(lastHover); - NS_RELEASE(mDocument); + lastHover->GetDocument(document); + if (document) { + document->ContentStateChanged(lastHover); + NS_RELEASE(document); } NS_RELEASE(lastHover); } - mHoverContent = aHover; + if (aState & NS_EVENT_STATE_FOCUS) { + SendFocusBlur(aContent); - NS_IF_ADDREF(mHoverContent); - if (nsnull != mHoverContent) { - if (NS_OK == mHoverContent->GetDocument(mDocument)) { - mDocument->ContentStateChanged(mHoverContent); - NS_RELEASE(mDocument); + if (nsnull != mCurrentFocus) { + //transferring ref to lastFocus from mCurrentFocus + nsIContent *lastFocus = mCurrentFocus; + mCurrentFocus = nsnull; + + lastFocus->GetDocument(document); + if (document) { + document->ContentStateChanged(lastFocus); + NS_RELEASE(document); + } + NS_RELEASE(lastFocus); + } + } + + if (nsnull != aContent) { + if (aState & NS_EVENT_STATE_ACTIVE) { + mActiveContent = aContent; + NS_IF_ADDREF(mActiveContent); + } + if (aState & NS_EVENT_STATE_HOVER) { + mHoverContent = aContent; + NS_IF_ADDREF(mHoverContent); + } + if (aState & NS_EVENT_STATE_FOCUS) { + mCurrentFocus = aContent; + NS_IF_ADDREF(mCurrentFocus); + } + aContent->GetDocument(document); + if (document) { + document->ContentStateChanged(aContent); + NS_RELEASE(document); } } @@ -753,12 +786,14 @@ nsEventStateManager::SetHoverContent(nsIContent *aHover) } NS_IMETHODIMP -nsEventStateManager::SetFocusedContent(nsIContent *aContent) +nsEventStateManager::SendFocusBlur(nsIContent *aContent) { if (mCurrentFocus == aContent) { return NS_OK; } + nsIDocument *document; + if (mCurrentFocus) { ChangeFocus(mCurrentFocus, PR_FALSE); @@ -771,29 +806,27 @@ nsEventStateManager::SetFocusedContent(nsIContent *aContent) if (nsnull != mPresContext) { mCurrentFocus->HandleDOMEvent(*mPresContext, &event, nsnull, NS_EVENT_FLAG_INIT, status); } - NS_RELEASE(mCurrentFocus); } - //fire focus - nsEventStatus status = nsEventStatus_eIgnore; - nsEvent event; - event.eventStructType = NS_EVENT; - event.message = NS_FOCUS_CONTENT; + if (nsnull != aContent) { + //fire focus + nsEventStatus status = nsEventStatus_eIgnore; + nsEvent event; + event.eventStructType = NS_EVENT; + event.message = NS_FOCUS_CONTENT; - if (nsnull != mPresContext) { - aContent->HandleDOMEvent(*mPresContext, &event, nsnull, NS_EVENT_FLAG_INIT, status); + if (nsnull != mPresContext) { + aContent->HandleDOMEvent(*mPresContext, &event, nsnull, NS_EVENT_FLAG_INIT, status); + } + + nsAutoString tabIndex; + aContent->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::tabindex, tabIndex); + PRInt32 ec, val = tabIndex.ToInteger(&ec); + if (NS_OK == ec) { + mCurrentTabIndex = val; + } } - nsAutoString tabIndex; - aContent->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::tabindex, tabIndex); - PRInt32 ec, val = tabIndex.ToInteger(&ec); - if (NS_OK == ec) { - mCurrentTabIndex = val; - } - - mCurrentFocus = aContent; - NS_IF_ADDREF(mCurrentFocus); - return NS_OK; } diff --git a/mozilla/layout/events/src/nsEventStateManager.h b/mozilla/layout/events/src/nsEventStateManager.h index 4b43bd89e05..325dc0fb57a 100644 --- a/mozilla/layout/events/src/nsEventStateManager.h +++ b/mozilla/layout/events/src/nsEventStateManager.h @@ -51,9 +51,7 @@ public: NS_IMETHOD GetEventTarget(nsIFrame **aFrame); NS_IMETHOD GetContentState(nsIContent *aContent, PRInt32& aState); - NS_IMETHOD SetActiveContent(nsIContent *aActive); - NS_IMETHOD SetHoverContent(nsIContent *aHover); - NS_IMETHOD SetFocusedContent(nsIContent *aContent); + NS_IMETHOD SetContentState(nsIContent *aContent, PRInt32 aState); protected: void UpdateCursor(nsIPresContext& aPresContext, nsPoint& aPoint, nsIFrame* aTargetFrame, nsEventStatus& aStatus); @@ -64,6 +62,7 @@ protected: void ShiftFocus(PRBool foward); nsIContent* GetNextTabbableContent(nsIContent* aParent, nsIContent* aChild, nsIContent* aTop, PRBool foward); PRInt32 GetNextTabIndex(nsIContent* aParent, PRBool foward); + NS_IMETHOD SendFocusBlur(nsIContent *aContent); //Any frames here must be checked for validity in ClearFrameRefs nsIFrame* mCurrentTarget; diff --git a/mozilla/layout/generic/nsFrame.cpp b/mozilla/layout/generic/nsFrame.cpp index 1e820016e3d..57401226278 100644 --- a/mozilla/layout/generic/nsFrame.cpp +++ b/mozilla/layout/generic/nsFrame.cpp @@ -731,10 +731,12 @@ nsFrame::HandleEvent(nsIPresContext& aPresContext, if(nsEventStatus_eConsumeNoDefault != aEventStatus) { if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN) { - } else if (aEvent->message == NS_MOUSE_MOVE && mDoingSelection || + } + else if (aEvent->message == NS_MOUSE_MOVE && mDoingSelection || aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) { // no-op - } else { + } + else { return NS_OK; } if (SELECTION_DEBUG) printf("Message: %d-------------------------------------------------------------\n",aEvent->message); @@ -765,7 +767,6 @@ nsFrame::HandlePress(nsIPresContext& aPresContext, nsEventStatus& aEventStatus) { if (!DisplaySelection(aPresContext, PR_TRUE)) { - aEventStatus = nsEventStatus_eIgnore; return NS_OK; } @@ -810,7 +811,6 @@ NS_IMETHODIMP nsFrame::HandleDrag(nsIPresContext& aPresContext, nsEventStatus& aEventStatus) { if (!DisplaySelection(aPresContext, PR_TRUE)) { - aEventStatus = nsEventStatus_eIgnore; return NS_OK; } @@ -852,7 +852,6 @@ NS_IMETHODIMP nsFrame::HandleRelease(nsIPresContext& aPresContext, nsEventStatus& aEventStatus) { mDoingSelection = PR_FALSE; - aEventStatus = nsEventStatus_eIgnore; NS_IF_RELEASE(gDoc); return NS_OK; } diff --git a/mozilla/layout/generic/nsImageFrame.cpp b/mozilla/layout/generic/nsImageFrame.cpp index aae146ae024..63ece40a052 100644 --- a/mozilla/layout/generic/nsImageFrame.cpp +++ b/mozilla/layout/generic/nsImageFrame.cpp @@ -895,7 +895,6 @@ nsImageFrame::HandleEvent(nsIPresContext& aPresContext, nsEventStatus& aEventStatus) { nsImageMap* map; - aEventStatus = nsEventStatus_eIgnore; switch (aEvent->message) { case NS_MOUSE_LEFT_BUTTON_UP: @@ -947,7 +946,7 @@ nsImageFrame::HandleEvent(nsIPresContext& aPresContext, // We hit a clickable area. Time to go somewhere... PRBool clicked = PR_FALSE; if (aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) { - aEventStatus = nsEventStatus_eConsumeNoDefault; + aEventStatus = nsEventStatus_eConsumeDoDefault; clicked = PR_TRUE; } TriggerLink(aPresContext, absURL, target, clicked); @@ -983,20 +982,18 @@ nsImageFrame::HandleEvent(nsIPresContext& aPresContext, absURL.Append(cbuf); PRBool clicked = PR_FALSE; if (aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) { - aEventStatus = nsEventStatus_eConsumeNoDefault; + aEventStatus = nsEventStatus_eConsumeDoDefault; clicked = PR_TRUE; } TriggerLink(aPresContext, absURL, target, clicked); } break; } - // FALL THROUGH - - default: - // Let default event handler deal with it - return nsLeafFrame::HandleEvent(aPresContext, aEvent, aEventStatus); + default: + break; } - return NS_OK; + + return nsLeafFrame::HandleEvent(aPresContext, aEvent, aEventStatus); } NS_METHOD diff --git a/mozilla/layout/html/base/src/nsFrame.cpp b/mozilla/layout/html/base/src/nsFrame.cpp index 1e820016e3d..57401226278 100644 --- a/mozilla/layout/html/base/src/nsFrame.cpp +++ b/mozilla/layout/html/base/src/nsFrame.cpp @@ -731,10 +731,12 @@ nsFrame::HandleEvent(nsIPresContext& aPresContext, if(nsEventStatus_eConsumeNoDefault != aEventStatus) { if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN) { - } else if (aEvent->message == NS_MOUSE_MOVE && mDoingSelection || + } + else if (aEvent->message == NS_MOUSE_MOVE && mDoingSelection || aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) { // no-op - } else { + } + else { return NS_OK; } if (SELECTION_DEBUG) printf("Message: %d-------------------------------------------------------------\n",aEvent->message); @@ -765,7 +767,6 @@ nsFrame::HandlePress(nsIPresContext& aPresContext, nsEventStatus& aEventStatus) { if (!DisplaySelection(aPresContext, PR_TRUE)) { - aEventStatus = nsEventStatus_eIgnore; return NS_OK; } @@ -810,7 +811,6 @@ NS_IMETHODIMP nsFrame::HandleDrag(nsIPresContext& aPresContext, nsEventStatus& aEventStatus) { if (!DisplaySelection(aPresContext, PR_TRUE)) { - aEventStatus = nsEventStatus_eIgnore; return NS_OK; } @@ -852,7 +852,6 @@ NS_IMETHODIMP nsFrame::HandleRelease(nsIPresContext& aPresContext, nsEventStatus& aEventStatus) { mDoingSelection = PR_FALSE; - aEventStatus = nsEventStatus_eIgnore; NS_IF_RELEASE(gDoc); return NS_OK; } diff --git a/mozilla/layout/html/base/src/nsImageFrame.cpp b/mozilla/layout/html/base/src/nsImageFrame.cpp index aae146ae024..63ece40a052 100644 --- a/mozilla/layout/html/base/src/nsImageFrame.cpp +++ b/mozilla/layout/html/base/src/nsImageFrame.cpp @@ -895,7 +895,6 @@ nsImageFrame::HandleEvent(nsIPresContext& aPresContext, nsEventStatus& aEventStatus) { nsImageMap* map; - aEventStatus = nsEventStatus_eIgnore; switch (aEvent->message) { case NS_MOUSE_LEFT_BUTTON_UP: @@ -947,7 +946,7 @@ nsImageFrame::HandleEvent(nsIPresContext& aPresContext, // We hit a clickable area. Time to go somewhere... PRBool clicked = PR_FALSE; if (aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) { - aEventStatus = nsEventStatus_eConsumeNoDefault; + aEventStatus = nsEventStatus_eConsumeDoDefault; clicked = PR_TRUE; } TriggerLink(aPresContext, absURL, target, clicked); @@ -983,20 +982,18 @@ nsImageFrame::HandleEvent(nsIPresContext& aPresContext, absURL.Append(cbuf); PRBool clicked = PR_FALSE; if (aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) { - aEventStatus = nsEventStatus_eConsumeNoDefault; + aEventStatus = nsEventStatus_eConsumeDoDefault; clicked = PR_TRUE; } TriggerLink(aPresContext, absURL, target, clicked); } break; } - // FALL THROUGH - - default: - // Let default event handler deal with it - return nsLeafFrame::HandleEvent(aPresContext, aEvent, aEventStatus); + default: + break; } - return NS_OK; + + return nsLeafFrame::HandleEvent(aPresContext, aEvent, aEventStatus); } NS_METHOD diff --git a/mozilla/layout/html/content/src/nsHTMLAnchorElement.cpp b/mozilla/layout/html/content/src/nsHTMLAnchorElement.cpp index a021d43ccd3..686fb0ca215 100644 --- a/mozilla/layout/html/content/src/nsHTMLAnchorElement.cpp +++ b/mozilla/layout/html/content/src/nsHTMLAnchorElement.cpp @@ -200,7 +200,7 @@ nsHTMLAnchorElement::SetFocus(nsIPresContext* aPresContext) { nsIEventStateManager* esm; if (NS_OK == aPresContext->GetEventStateManager(&esm)) { - esm->SetFocusedContent(this); + esm->SetContentState(this, NS_EVENT_STATE_FOCUS); NS_RELEASE(esm); } @@ -286,7 +286,7 @@ nsHTMLAnchorElement::HandleDOMEvent(nsIPresContext& aPresContext, { nsIEventStateManager *stateManager; if (NS_OK == aPresContext.GetEventStateManager(&stateManager)) { - stateManager->SetActiveContent(this); + stateManager->SetContentState(this, NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_FOCUS); NS_RELEASE(stateManager); } aEventStatus = nsEventStatus_eConsumeNoDefault; @@ -306,7 +306,7 @@ nsHTMLAnchorElement::HandleDOMEvent(nsIPresContext& aPresContext, mInner.TriggerLink(aPresContext, eLinkVerb_Replace, baseURL, href, target, PR_TRUE); NS_IF_RELEASE(baseURL); - aEventStatus = nsEventStatus_eConsumeNoDefault; + aEventStatus = nsEventStatus_eConsumeDoDefault; } } break; @@ -317,6 +317,12 @@ nsHTMLAnchorElement::HandleDOMEvent(nsIPresContext& aPresContext, case NS_MOUSE_ENTER: { + nsIEventStateManager *stateManager; + if (NS_OK == aPresContext.GetEventStateManager(&stateManager)) { + stateManager->SetContentState(this, NS_EVENT_STATE_HOVER); + NS_RELEASE(stateManager); + } + nsAutoString target; nsIURL* baseURL = nsnull; GetBaseURL(baseURL); @@ -327,15 +333,21 @@ nsHTMLAnchorElement::HandleDOMEvent(nsIPresContext& aPresContext, mInner.TriggerLink(aPresContext, eLinkVerb_Replace, baseURL, href, target, PR_FALSE); NS_IF_RELEASE(baseURL); - aEventStatus = nsEventStatus_eConsumeDoDefault; + aEventStatus = nsEventStatus_eConsumeNoDefault; } break; case NS_MOUSE_EXIT: { + nsIEventStateManager *stateManager; + if (NS_OK == aPresContext.GetEventStateManager(&stateManager)) { + stateManager->SetContentState(nsnull, NS_EVENT_STATE_HOVER); + NS_RELEASE(stateManager); + } + nsAutoString empty; mInner.TriggerLink(aPresContext, eLinkVerb_Replace, nsnull, empty, empty, PR_FALSE); - aEventStatus = nsEventStatus_eConsumeDoDefault; + aEventStatus = nsEventStatus_eConsumeNoDefault; } break; diff --git a/mozilla/layout/html/content/src/nsHTMLAreaElement.cpp b/mozilla/layout/html/content/src/nsHTMLAreaElement.cpp index fe9e09f18a9..bfc090cc14c 100644 --- a/mozilla/layout/html/content/src/nsHTMLAreaElement.cpp +++ b/mozilla/layout/html/content/src/nsHTMLAreaElement.cpp @@ -231,7 +231,7 @@ nsHTMLAreaElement::SetFocus(nsIPresContext* aPresContext) { nsIEventStateManager* esm; if (NS_OK == aPresContext->GetEventStateManager(&esm)) { - esm->SetFocusedContent(this); + esm->SetContentState(this, NS_EVENT_STATE_FOCUS); NS_RELEASE(esm); } diff --git a/mozilla/layout/html/content/src/nsHTMLButtonElement.cpp b/mozilla/layout/html/content/src/nsHTMLButtonElement.cpp index e1d3021f423..4ca8a1e14e3 100644 --- a/mozilla/layout/html/content/src/nsHTMLButtonElement.cpp +++ b/mozilla/layout/html/content/src/nsHTMLButtonElement.cpp @@ -276,7 +276,7 @@ nsHTMLButtonElement::SetFocus(nsIPresContext* aPresContext) { nsIEventStateManager* esm; if (NS_OK == aPresContext->GetEventStateManager(&esm)) { - esm->SetFocusedContent(this); + esm->SetContentState(this, NS_EVENT_STATE_FOCUS); NS_RELEASE(esm); } @@ -372,7 +372,7 @@ nsHTMLButtonElement::HandleDOMEvent(nsIPresContext& aPresContext, { nsIEventStateManager *stateManager; if (NS_OK == aPresContext.GetEventStateManager(&stateManager)) { - //stateManager->SetActiveLink(this); + stateManager->SetContentState(this, NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_FOCUS); NS_RELEASE(stateManager); } aEventStatus = nsEventStatus_eConsumeNoDefault; @@ -413,28 +413,25 @@ nsHTMLButtonElement::HandleDOMEvent(nsIPresContext& aPresContext, break; case NS_MOUSE_ENTER: - //mouse enter doesn't work yet. Use move until then. { - nsAutoString href, target; - nsIURL* baseURL = nsnull; - GetBaseURL(baseURL); - GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::href, href); - GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::target, target); - if (target.Length() == 0) { - GetBaseTarget(target); + nsIEventStateManager *stateManager; + if (NS_OK == aPresContext.GetEventStateManager(&stateManager)) { + stateManager->SetContentState(this, NS_EVENT_STATE_HOVER); + NS_RELEASE(stateManager); } - mInner.TriggerLink(aPresContext, eLinkVerb_Replace, baseURL, href, target, PR_FALSE); - NS_IF_RELEASE(baseURL); - aEventStatus = nsEventStatus_eConsumeDoDefault; + aEventStatus = nsEventStatus_eConsumeNoDefault; } break; // XXX this doesn't seem to do anything yet case NS_MOUSE_EXIT: { - nsAutoString empty; - mInner.TriggerLink(aPresContext, eLinkVerb_Replace, nsnull, empty, empty, PR_FALSE); - aEventStatus = nsEventStatus_eConsumeDoDefault; + nsIEventStateManager *stateManager; + if (NS_OK == aPresContext.GetEventStateManager(&stateManager)) { + stateManager->SetContentState(nsnull, NS_EVENT_STATE_HOVER); + NS_RELEASE(stateManager); + } + aEventStatus = nsEventStatus_eConsumeNoDefault; } break; diff --git a/mozilla/layout/html/content/src/nsHTMLInputElement.cpp b/mozilla/layout/html/content/src/nsHTMLInputElement.cpp index 4a110505c23..a0990be4388 100644 --- a/mozilla/layout/html/content/src/nsHTMLInputElement.cpp +++ b/mozilla/layout/html/content/src/nsHTMLInputElement.cpp @@ -425,7 +425,7 @@ nsHTMLInputElement::SetFocus(nsIPresContext* aPresContext) { nsIEventStateManager* esm; if (NS_OK == aPresContext->GetEventStateManager(&esm)) { - esm->SetFocusedContent(this); + esm->SetContentState(this, NS_EVENT_STATE_FOCUS); NS_RELEASE(esm); } diff --git a/mozilla/layout/html/content/src/nsHTMLSelectElement.cpp b/mozilla/layout/html/content/src/nsHTMLSelectElement.cpp index 5bc62c42bb8..71da7a9f6a9 100644 --- a/mozilla/layout/html/content/src/nsHTMLSelectElement.cpp +++ b/mozilla/layout/html/content/src/nsHTMLSelectElement.cpp @@ -415,7 +415,7 @@ nsHTMLSelectElement::SetFocus(nsIPresContext* aPresContext) { nsIEventStateManager* esm; if (NS_OK == aPresContext->GetEventStateManager(&esm)) { - esm->SetFocusedContent(this); + esm->SetContentState(this, NS_EVENT_STATE_FOCUS); NS_RELEASE(esm); } diff --git a/mozilla/layout/html/content/src/nsHTMLTextAreaElement.cpp b/mozilla/layout/html/content/src/nsHTMLTextAreaElement.cpp index 9e451a2d204..6db3361426a 100644 --- a/mozilla/layout/html/content/src/nsHTMLTextAreaElement.cpp +++ b/mozilla/layout/html/content/src/nsHTMLTextAreaElement.cpp @@ -252,7 +252,7 @@ nsHTMLTextAreaElement::SetFocus(nsIPresContext* aPresContext) { nsIEventStateManager* esm; if (NS_OK == aPresContext->GetEventStateManager(&esm)) { - esm->SetFocusedContent(this); + esm->SetContentState(this, NS_EVENT_STATE_FOCUS); NS_RELEASE(esm); } diff --git a/mozilla/layout/xml/content/src/nsXMLElement.cpp b/mozilla/layout/xml/content/src/nsXMLElement.cpp index 1dfd072503f..87a5836e3ca 100644 --- a/mozilla/layout/xml/content/src/nsXMLElement.cpp +++ b/mozilla/layout/xml/content/src/nsXMLElement.cpp @@ -136,10 +136,10 @@ nsXMLElement::HandleDOMEvent(nsIPresContext& aPresContext, { nsIEventStateManager *stateManager; if (NS_OK == aPresContext.GetEventStateManager(&stateManager)) { - stateManager->SetActiveContent(this); + stateManager->SetContentState(this, NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_FOCUS); NS_RELEASE(stateManager); } - aEventStatus = nsEventStatus_eConsumeNoDefault; + aEventStatus = nsEventStatus_eConsumeDoDefault; } break; @@ -165,7 +165,7 @@ nsXMLElement::HandleDOMEvent(nsIPresContext& aPresContext, } mInner.TriggerLink(aPresContext, verb, baseURL, href, target, PR_TRUE); NS_IF_RELEASE(baseURL); - aEventStatus = nsEventStatus_eConsumeNoDefault; + aEventStatus = nsEventStatus_eConsumeDoDefault; } } break;