diff --git a/content/html/content/src/nsHTMLInputElement.cpp b/content/html/content/src/nsHTMLInputElement.cpp
index f16d60ea432d..acc247363fdd 100644
--- a/content/html/content/src/nsHTMLInputElement.cpp
+++ b/content/html/content/src/nsHTMLInputElement.cpp
@@ -178,6 +178,7 @@ protected:
nsGenericHTMLLeafElement mInner;
nsIForm* mForm;
PRInt32 mType;
+ PRBool mSkipFocusEvent;
PRBool IsImage() const {
nsAutoString tmp;
@@ -209,6 +210,7 @@ nsHTMLInputElement::nsHTMLInputElement(nsIAtom* aTag)
mInner.Init(this, aTag);
mType = NS_FORM_INPUT_TEXT; // default value
mForm = nsnull;
+ mSkipFocusEvent = PR_FALSE;
//nsTraceRefcnt::Create((nsIFormControl*)this, "nsHTMLFormControlElement", __FILE__, __LINE__);
}
@@ -535,19 +537,21 @@ nsHTMLInputElement::SetFocus(nsIPresContext* aPresContext)
nsAutoString disabled;
if (NS_CONTENT_ATTR_HAS_VALUE == mInner.GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::disabled, disabled))
return NS_OK;
-
+
nsIEventStateManager* esm;
if (NS_OK == aPresContext->GetEventStateManager(&esm)) {
esm->SetContentState(this, NS_EVENT_STATE_FOCUS);
NS_RELEASE(esm);
}
-
+
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
- formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
+ // XXX commented out - redundant
+ // formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
formControlFrame->ScrollIntoView(aPresContext);
}
+
return rv;
}
@@ -611,6 +615,11 @@ nsHTMLInputElement::HandleDOMEvent(nsIPresContext& aPresContext,
PRUint32 aFlags,
nsEventStatus& aEventStatus)
{
+ if ((aEvent->message == NS_FOCUS_CONTENT && mSkipFocusEvent) ||
+ (aEvent->message == NS_BLUR_CONTENT && mSkipFocusEvent)) {
+ return NS_OK;
+ }
+
// Try script event handlers first
nsresult ret = mInner.HandleDOMEvent(aPresContext, aEvent, aDOMEvent,
aFlags, aEventStatus);
@@ -622,7 +631,9 @@ nsHTMLInputElement::HandleDOMEvent(nsIPresContext& aPresContext,
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
+ mSkipFocusEvent = PR_TRUE;
formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
+ mSkipFocusEvent = PR_FALSE;
return NS_OK;
}
}
diff --git a/layout/html/content/src/nsHTMLInputElement.cpp b/layout/html/content/src/nsHTMLInputElement.cpp
index f16d60ea432d..acc247363fdd 100644
--- a/layout/html/content/src/nsHTMLInputElement.cpp
+++ b/layout/html/content/src/nsHTMLInputElement.cpp
@@ -178,6 +178,7 @@ protected:
nsGenericHTMLLeafElement mInner;
nsIForm* mForm;
PRInt32 mType;
+ PRBool mSkipFocusEvent;
PRBool IsImage() const {
nsAutoString tmp;
@@ -209,6 +210,7 @@ nsHTMLInputElement::nsHTMLInputElement(nsIAtom* aTag)
mInner.Init(this, aTag);
mType = NS_FORM_INPUT_TEXT; // default value
mForm = nsnull;
+ mSkipFocusEvent = PR_FALSE;
//nsTraceRefcnt::Create((nsIFormControl*)this, "nsHTMLFormControlElement", __FILE__, __LINE__);
}
@@ -535,19 +537,21 @@ nsHTMLInputElement::SetFocus(nsIPresContext* aPresContext)
nsAutoString disabled;
if (NS_CONTENT_ATTR_HAS_VALUE == mInner.GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::disabled, disabled))
return NS_OK;
-
+
nsIEventStateManager* esm;
if (NS_OK == aPresContext->GetEventStateManager(&esm)) {
esm->SetContentState(this, NS_EVENT_STATE_FOCUS);
NS_RELEASE(esm);
}
-
+
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
- formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
+ // XXX commented out - redundant
+ // formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
formControlFrame->ScrollIntoView(aPresContext);
}
+
return rv;
}
@@ -611,6 +615,11 @@ nsHTMLInputElement::HandleDOMEvent(nsIPresContext& aPresContext,
PRUint32 aFlags,
nsEventStatus& aEventStatus)
{
+ if ((aEvent->message == NS_FOCUS_CONTENT && mSkipFocusEvent) ||
+ (aEvent->message == NS_BLUR_CONTENT && mSkipFocusEvent)) {
+ return NS_OK;
+ }
+
// Try script event handlers first
nsresult ret = mInner.HandleDOMEvent(aPresContext, aEvent, aDOMEvent,
aFlags, aEventStatus);
@@ -622,7 +631,9 @@ nsHTMLInputElement::HandleDOMEvent(nsIPresContext& aPresContext,
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
+ mSkipFocusEvent = PR_TRUE;
formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
+ mSkipFocusEvent = PR_FALSE;
return NS_OK;
}
}