diff --git a/mozilla/content/html/content/src/nsHTMLFormElement.cpp b/mozilla/content/html/content/src/nsHTMLFormElement.cpp
index 5e6efa4f85a..e0362193662 100644
--- a/mozilla/content/html/content/src/nsHTMLFormElement.cpp
+++ b/mozilla/content/html/content/src/nsHTMLFormElement.cpp
@@ -38,7 +38,6 @@
#include "nsCOMPtr.h"
#include "nsIForm.h"
#include "nsIFormControl.h"
-#include "nsIFormManager.h"
#include "nsIFormSubmission.h"
#include "nsIDOMHTMLFormElement.h"
#include "nsIDOMNSHTMLFormElement.h"
@@ -228,11 +227,14 @@ protected:
nsCOMPtr mSubmittingRequest;
protected:
- // Detection of first form to notify observers
+ /** Detection of first form to notify observers */
static PRBool gFirstFormSubmitted;
+ /** Detection of first password input to initialize the password manager */
+ static PRBool gPasswordManagerInitialized;
};
PRBool nsHTMLFormElement::gFirstFormSubmitted = PR_FALSE;
+PRBool nsHTMLFormElement::gPasswordManagerInitialized = PR_FALSE;
// nsFormControlList
@@ -500,17 +502,16 @@ nsHTMLFormElement::Submit()
// original code added in bug 76694)
rv = DoSubmitOrReset(presContext, nsnull, NS_FORM_SUBMIT);
} else {
- nsCOMPtr presShell;
- presContext->GetShell(getter_AddRefs(presShell));
- if (presShell) {
- nsFormEvent event;
- event.eventStructType = NS_FORM_EVENT;
- event.message = NS_FORM_SUBMIT;
- event.originator = nsnull;
- nsEventStatus status = nsEventStatus_eIgnore;
- presShell->HandleEventWithTarget(&event, nsnull, this,
- NS_EVENT_FLAG_INIT, &status);
- }
+ // Calling HandleDOMEvent() directly so that submit() will work even if
+ // the frame does not exist. This does not have an effect right now, but
+ // If PresShell::HandleEventWithTarget() ever starts to work for elements
+ // without frames, that should be called instead.
+ nsFormEvent event;
+ event.eventStructType = NS_FORM_EVENT;
+ event.message = NS_FORM_SUBMIT;
+ event.originator = nsnull;
+ nsEventStatus status = nsEventStatus_eIgnore;
+ HandleDOMEvent(presContext, &event, nsnull, NS_EVENT_FLAG_INIT, &status);
}
}
return rv;
@@ -524,17 +525,16 @@ nsHTMLFormElement::Reset()
nsCOMPtr presContext;
GetPresContext(this, getter_AddRefs(presContext));
if (presContext) {
- nsCOMPtr presShell;
- presContext->GetShell(getter_AddRefs(presShell));
- if (presShell) {
- nsFormEvent event;
- event.eventStructType = NS_FORM_EVENT;
- event.message = NS_FORM_RESET;
- event.originator = nsnull;
- nsEventStatus status = nsEventStatus_eIgnore;
- presShell->HandleEventWithTarget(&event, nsnull, this,
- NS_EVENT_FLAG_INIT, &status);
- }
+ // Calling HandleDOMEvent() directly so that reset() will work even if
+ // the frame does not exist. This does not have an effect right now, but
+ // If PresShell::HandleEventWithTarget() ever starts to work for elements
+ // without frames, that should be called instead.
+ nsFormEvent event;
+ event.eventStructType = NS_FORM_EVENT;
+ event.message = NS_FORM_RESET;
+ event.originator = nsnull;
+ nsEventStatus status = nsEventStatus_eIgnore;
+ HandleDOMEvent(presContext, &event, nsnull, NS_EVENT_FLAG_INIT, &status);
}
return rv;
}
@@ -1122,6 +1122,18 @@ nsHTMLFormElement::AddElement(nsIFormControl* aChild)
NS_ENSURE_SUCCESS(rv, rv);
}
+ //
+ // If it is a password control, and the password manager has not yet been
+ // initialized, initialize the password manager
+ //
+ if (!gPasswordManagerInitialized && type == NS_FORM_INPUT_PASSWORD) {
+ // Initialize the password manager category
+ gPasswordManagerInitialized = PR_TRUE;
+ NS_CreateServicesFromCategory(NS_PASSWORDMANAGER_CATEGORY,
+ nsnull,
+ NS_PASSWORDMANAGER_CATEGORY);
+ }
+
return NS_OK;
}
diff --git a/mozilla/content/html/content/src/nsHTMLInputElement.cpp b/mozilla/content/html/content/src/nsHTMLInputElement.cpp
index 4cc5989368d..29723310ba5 100644
--- a/mozilla/content/html/content/src/nsHTMLInputElement.cpp
+++ b/mozilla/content/html/content/src/nsHTMLInputElement.cpp
@@ -82,7 +82,6 @@
#include "nsIDOMNodeList.h"
#include "nsIDOMHTMLCollection.h"
#include "nsICheckboxControlFrame.h"
-#include "nsIFormManager.h"
#include "nsIImageControlFrame.h"
#include "nsLinebreakConverter.h" //to strip out carriage returns
#include "nsReadableUtils.h"
@@ -1517,7 +1516,85 @@ nsHTMLInputElement::HandleDOMEvent(nsIPresContext* aPresContext,
} // case
} // switch
}
- } break;// NS_KEY_PRESS || NS_KEY_UP
+
+ /*
+ * If this is input type=text, and the user hit enter, fire onChange and
+ * submit the form (if we are in one)
+ *
+ * Bug 99920 and bug 109463:
+ * (a) if there is only one text input in the form, submit using JS
+ * form.submit()
+ * (b) if there is more than one text input, submit by sending a click
+ * to the first submit button in the form.
+ * (c) if there is more than one text input and no submit buttons, do
+ * not submit, period.
+ */
+
+ if (aEvent->message == NS_KEY_PRESS &&
+ (keyEvent->keyCode == NS_VK_RETURN ||
+ keyEvent->keyCode == NS_VK_ENTER) &&
+ (type == NS_FORM_INPUT_TEXT || type == NS_FORM_INPUT_PASSWORD)) {
+
+ if (mForm) {
+ nsIFrame* primaryFrame = GetPrimaryFrame(PR_FALSE);
+ if (primaryFrame) {
+ nsIGfxTextControlFrame2* textFrame = nsnull;
+ CallQueryInterface(primaryFrame, &textFrame);
+
+ // Fire onChange (if necessary)
+ if (textFrame) {
+ textFrame->CheckFireOnChange();
+ }
+ }
+
+ // Find the nearest submit control in elements[]
+ // and also check how many text controls we have in the form
+ nsCOMPtr submitControl;
+ PRInt32 numTextControlsFound = 0;
+
+ nsCOMPtr currentControl;
+ PRUint32 count = 0;
+ mForm->GetElementCount(&count);
+ for (PRUint32 i=0; i < count; i++) {
+ mForm->GetElementAt(i, getter_AddRefs(currentControl));
+ if (currentControl) {
+ PRInt32 type;
+ currentControl->GetType(&type);
+ if (!submitControl &&
+ (type == NS_FORM_INPUT_SUBMIT ||
+ type == NS_FORM_BUTTON_SUBMIT ||
+ type == NS_FORM_INPUT_IMAGE)) {
+ submitControl = do_QueryInterface(currentControl);
+ } else if (type == NS_FORM_INPUT_TEXT ||
+ type == NS_FORM_INPUT_PASSWORD) {
+ numTextControlsFound++;
+ }
+ }
+ }
+
+ if (submitControl && numTextControlsFound > 1) {
+ // IE actually fires the button's onclick handler. Dispatch
+ // the click event and let the button handle submitting the
+ // form.
+ nsCOMPtr shell;
+ aPresContext->GetShell(getter_AddRefs(shell));
+ if (shell) {
+ nsGUIEvent event;
+ event.eventStructType = NS_MOUSE_EVENT;
+ event.message = NS_MOUSE_LEFT_CLICK;
+ event.widget = nsnull;
+ nsEventStatus status = nsEventStatus_eIgnore;
+ shell->HandleDOMEventWithTarget(submitControl, &event, &status);
+ }
+ } else if (numTextControlsFound == 1) {
+ // If there's only one text control, just call submit()
+ nsCOMPtr form = do_QueryInterface(mForm);
+ form->Submit();
+ }
+ }
+ }
+
+ } break; // NS_KEY_PRESS || NS_KEY_UP
// cancel all of these events for buttons
case NS_MOUSE_MIDDLE_BUTTON_DOWN:
diff --git a/mozilla/layout/forms/nsComboboxControlFrame.cpp b/mozilla/layout/forms/nsComboboxControlFrame.cpp
index daf7c31f544..6bd12fe5f70 100644
--- a/mozilla/layout/forms/nsComboboxControlFrame.cpp
+++ b/mozilla/layout/forms/nsComboboxControlFrame.cpp
@@ -40,7 +40,6 @@
#include "nsComboboxControlFrame.h"
#include "nsIDOMEventReceiver.h"
#include "nsIFrameManager.h"
-#include "nsFormFrame.h"
#include "nsFormControlFrame.h"
#include "nsIHTMLContent.h"
#include "nsHTMLAtoms.h"
@@ -284,7 +283,6 @@ nsComboboxControlFrame::nsComboboxControlFrame()
: nsAreaFrame()
{
mPresContext = nsnull;
- mFormFrame = nsnull;
mListControlFrame = nsnull;
mDroppedDown = PR_FALSE;
mDisplayFrame = nsnull;
@@ -319,11 +317,6 @@ nsComboboxControlFrame::~nsComboboxControlFrame()
{
REFLOW_COUNTER_DUMP("nsCCF");
- if (mFormFrame) {
- mFormFrame->RemoveFormControlFrame(*this);
- mFormFrame = nsnull;
- }
-
NS_IF_RELEASE(mPresContext);
}
@@ -1262,9 +1255,7 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
return NS_OK;
}
- // add ourself to the form control
- if (!mFormFrame && (eReflowReason_Initial == aReflowState.reason)) {
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*,this));
+ if (eReflowReason_Initial == aReflowState.reason) {
if (NS_FAILED(CreateDisplayFrame(aPresContext))) {
return NS_ERROR_FAILURE;
}
@@ -1816,7 +1807,7 @@ nsComboboxControlFrame::GetFrameName(nsAString& aResult) const
NS_IMETHODIMP
nsComboboxControlFrame::ShowDropDown(PRBool aDoDropDown)
{
- if (nsFormFrame::GetDisabled(this)) {
+ if (nsFormControlHelper::GetDisabled(mContent)) {
return NS_OK;
}
@@ -2103,7 +2094,7 @@ nsComboboxControlFrame::HandleEvent(nsIPresContext* aPresContext,
if (nsEventStatus_eConsumeNoDefault == *aEventStatus) {
return NS_OK;
}
- if (nsFormFrame::GetDisabled(this)) {
+ if (nsFormControlHelper::GetDisabled(mContent)) {
return NS_OK;
}
@@ -2565,7 +2556,7 @@ nsComboboxControlFrame::Paint(nsIPresContext* aPresContext,
nsCOMPtr stateManager;
nsresult rv = mPresContext->GetEventStateManager(getter_AddRefs(stateManager));
if (NS_SUCCEEDED(rv)) {
- if (NS_SUCCEEDED(rv) && !nsFormFrame::GetDisabled(this) && mFocused == this) {
+ if (!nsFormControlHelper::GetDisabled(mContent) && mFocused == this) {
aRenderingContext.SetLineStyle(nsLineStyle_kDotted);
aRenderingContext.SetColor(0);
} else {
diff --git a/mozilla/layout/forms/nsComboboxControlFrame.h b/mozilla/layout/forms/nsComboboxControlFrame.h
index cf286d7237c..369b376fe3d 100644
--- a/mozilla/layout/forms/nsComboboxControlFrame.h
+++ b/mozilla/layout/forms/nsComboboxControlFrame.h
@@ -65,7 +65,6 @@
#include "nsIScrollableViewProvider.h"
#include "nsIStatefulFrame.h"
-class nsFormFrame;
class nsIView;
class nsStyleContext;
class nsIHTMLContent;
@@ -152,7 +151,6 @@ public:
void SetFocus(PRBool aOn, PRBool aRepaint);
void ScrollIntoView(nsIPresContext* aPresContext);
virtual void InitializeControl(nsIPresContext* aPresContext);
- virtual void SetFormFrame(nsFormFrame* aFormFrame) { mFormFrame = aFormFrame; }
NS_IMETHOD OnContentReset();
NS_IMETHOD GetFont(nsIPresContext* aPresContext,
@@ -271,7 +269,6 @@ protected:
nsFrameList mPopupFrames; // additional named child list
nsIPresContext* mPresContext; // XXX: Remove the need to cache the pres context.
- nsFormFrame* mFormFrame; // Parent Form Frame
nsCOMPtr mDisplayContent; // Anonymous content used to display the current selection
nsIFrame* mDisplayFrame; // frame to display selection
nsIFrame* mButtonFrame; // button frame
diff --git a/mozilla/layout/forms/nsFileControlFrame.cpp b/mozilla/layout/forms/nsFileControlFrame.cpp
index fe55e7987d6..03c1a1ec812 100644
--- a/mozilla/layout/forms/nsFileControlFrame.cpp
+++ b/mozilla/layout/forms/nsFileControlFrame.cpp
@@ -36,7 +36,6 @@
* ***** END LICENSE BLOCK ***** */
#include "nsFileControlFrame.h"
-#include "nsFormFrame.h"
#include "nsIElementFactory.h"
@@ -70,6 +69,7 @@
#include "nsINodeInfo.h"
#include "nsIDOMEventReceiver.h"
#include "nsIScriptGlobalObject.h"
+#include "nsILocalFile.h"
#include "nsContentCID.h"
static NS_DEFINE_CID(kHTMLElementFactoryCID, NS_HTML_ELEMENT_FACTORY_CID);
@@ -91,7 +91,6 @@ NS_NewFileControlFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame)
nsFileControlFrame::nsFileControlFrame():
mTextFrame(nsnull),
- mFormFrame(nsnull),
mTextContent(nsnull),
mCachedState(nsnull)
{
@@ -113,10 +112,6 @@ nsFileControlFrame::~nsFileControlFrame()
delete mCachedState;
mCachedState = nsnull;
}
- if (mFormFrame) {
- mFormFrame->RemoveFormControlFrame(*this);
- mFormFrame = nsnull;
- }
}
NS_IMETHODIMP
@@ -149,7 +144,7 @@ nsFileControlFrame::CreateAnonymousContent(nsIPresContext* aPresContext,
mTextContent->SetAttr(kNameSpaceID_None, nsHTMLAtoms::type, NS_LITERAL_STRING("text"), PR_FALSE);
nsCOMPtr textControl = do_QueryInterface(mTextContent);
if (textControl) {
- textControl->SetDisabled(nsFormFrame::GetDisabled(this));
+ textControl->SetDisabled(nsFormControlHelper::GetDisabled(mContent));
// Initialize value when we create the content in case the value was set
// before we got here
nsCOMPtr fileContent = do_QueryInterface(mContent);
@@ -356,9 +351,7 @@ NS_IMETHODIMP nsFileControlFrame::Reflow(nsIPresContext* aPresContext,
aStatus = NS_FRAME_COMPLETE;
- if (mFormFrame == nsnull && eReflowReason_Initial == aReflowState.reason) {
- // add ourself as an nsIFormControlFrame
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*, this));
+ if (eReflowReason_Initial == aReflowState.reason) {
mTextFrame = GetTextControlFrame(aPresContext, this);
if (!mTextFrame) return NS_ERROR_UNEXPECTED;
if (mCachedState) {
@@ -537,14 +530,14 @@ nsFileControlFrame::AttributeChanged(nsIPresContext* aPresContext,
nsCOMPtr textControl = do_QueryInterface(mTextContent);
if (textControl)
{
- textControl->SetDisabled(nsFormFrame::GetDisabled(this));
+ textControl->SetDisabled(nsFormControlHelper::GetDisabled(mContent));
}
} else if (nsHTMLAtoms::size == aAttribute) {
nsString value;
if (nsnull != mTextContent && NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttr(kNameSpaceID_None, nsHTMLAtoms::size, value)) {
mTextContent->SetAttr(kNameSpaceID_None, nsHTMLAtoms::size, value, PR_TRUE);
if (aHint != NS_STYLE_HINT_REFLOW) {
- nsFormFrame::StyleChangeReflow(aPresContext, this);
+ nsFormControlHelper::StyleChangeReflow(aPresContext, this);
}
}
}
@@ -559,7 +552,7 @@ nsFileControlFrame::GetFrameForPoint(nsIPresContext* aPresContext,
nsIFrame** aFrame)
{
#ifndef DEBUG_NEWFRAME
- if ( nsFormFrame::GetDisabled(this) && mRect.Contains(aPoint) ) {
+ if ( nsFormControlHelper::GetDisabled(mContent) && mRect.Contains(aPoint) ) {
const nsStyleVisibility* vis =
(const nsStyleVisibility*)mStyleContext->GetStyleData(eStyleStruct_Visibility);
diff --git a/mozilla/layout/forms/nsFileControlFrame.h b/mozilla/layout/forms/nsFileControlFrame.h
index 56bfd7833d3..e4aebda4fad 100644
--- a/mozilla/layout/forms/nsFileControlFrame.h
+++ b/mozilla/layout/forms/nsFileControlFrame.h
@@ -50,7 +50,6 @@
typedef nsGfxTextControlFrame2 nsNewFrame;
class nsIPresState;
-class nsFormFrame;
class nsISupportsArray;
class nsFileControlFrame : public nsAreaFrame,
@@ -73,8 +72,6 @@ public:
}
virtual void MouseClicked(nsIPresContext* aPresContext) {}
- virtual void SetFormFrame(nsFormFrame* aFormFrame) { mFormFrame = aFormFrame; }
- virtual nsFormFrame* GetFromFrame() { return mFormFrame; }
NS_IMETHOD Paint(nsIPresContext* aPresContext,
nsIRenderingContext& aRenderingContext,
@@ -184,7 +181,6 @@ protected:
virtual PRIntn GetSkipSides() const;
nsNewFrame* mTextFrame;
- nsFormFrame* mFormFrame;
nsIHTMLContent* mTextContent;
nsCOMPtr mBrowse;
nsString* mCachedState;
diff --git a/mozilla/layout/forms/nsFormControlFrame.cpp b/mozilla/layout/forms/nsFormControlFrame.cpp
index 7303b3cbedb..b2d317d6c50 100644
--- a/mozilla/layout/forms/nsFormControlFrame.cpp
+++ b/mozilla/layout/forms/nsFormControlFrame.cpp
@@ -62,7 +62,6 @@
#include "nsStyleConsts.h"
#include "nsUnitConversion.h"
#include "nsStyleUtil.h"
-#include "nsFormFrame.h"
#include "nsIContent.h"
#include "nsStyleUtil.h"
#include "nsINameSpaceManager.h"
@@ -112,7 +111,6 @@ nsFormControlFrame::nsFormControlFrame()
: nsLeafFrame()
{
mDidInit = PR_FALSE;
- mFormFrame = nsnull;
mSuggestedWidth = NS_FORMSIZE_NOTSET;
mSuggestedHeight = NS_FORMSIZE_NOTSET;
mPresContext = nsnull;
@@ -126,10 +124,6 @@ nsFormControlFrame::nsFormControlFrame()
nsFormControlFrame::~nsFormControlFrame()
{
- if (mFormFrame) {
- mFormFrame->RemoveFormControlFrame(*this);
- mFormFrame = nsnull;
- }
}
NS_IMETHODIMP
@@ -550,11 +544,6 @@ nsFormControlFrame::Reflow(nsIPresContext* aPresContext,
mDidInit = PR_TRUE;
}
- // add ourself as an nsIFormControlFrame
- if (!mFormFrame && (eReflowReason_Initial == aReflowState.reason)) {
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*, this));
- }
-
#if 0
nsresult skiprv = SkipResizeReflow(mCacheSize, mCachedMaxElementSize, aPresContext,
aDesiredSize, aReflowState, aStatus);
diff --git a/mozilla/layout/forms/nsFormControlFrame.h b/mozilla/layout/forms/nsFormControlFrame.h
index b6119f4bde6..3c8c47670ef 100644
--- a/mozilla/layout/forms/nsFormControlFrame.h
+++ b/mozilla/layout/forms/nsFormControlFrame.h
@@ -40,7 +40,6 @@
#include "nsIFormControlFrame.h"
#include "nsFormControlHelper.h"
-#include "nsIFormManager.h"
#include "nsISupports.h"
#include "nsIWidget.h"
#include "nsLeafFrame.h"
@@ -52,7 +51,6 @@
class nsIView;
class nsIPresContext;
class nsStyleCoord;
-class nsFormFrame;
#define CSS_NOTSET -1
#define ATTR_NOTSET -1
@@ -199,8 +197,6 @@ public:
NS_IMETHOD GetMaxLength(PRInt32* aSize);
virtual void SetClickPoint(nscoord aX, nscoord aY);
- nsFormFrame* GetFormFrame() { return mFormFrame; }
- virtual void SetFormFrame(nsFormFrame* aFormFrame) { mFormFrame = aFormFrame; }
NS_IMETHOD GetFont(nsIPresContext* aPresContext,
const nsFont*& aFont);
@@ -326,7 +322,6 @@ protected:
nsSize mWidgetSize;
PRBool mDidInit;
nsPoint mLastClickPoint;
- nsFormFrame* mFormFrame;
nscoord mSuggestedWidth;
nscoord mSuggestedHeight;
diff --git a/mozilla/layout/forms/nsFormControlHelper.cpp b/mozilla/layout/forms/nsFormControlHelper.cpp
index 6a6a6ce8e45..6dfb2a107b1 100644
--- a/mozilla/layout/forms/nsFormControlHelper.cpp
+++ b/mozilla/layout/forms/nsFormControlHelper.cpp
@@ -62,7 +62,6 @@
#include "nsStyleConsts.h"
#include "nsUnitConversion.h"
#include "nsStyleUtil.h"
-#include "nsFormFrame.h"
#include "nsIContent.h"
#include "nsStyleUtil.h"
#include "nsINameSpaceManager.h"
@@ -714,44 +713,6 @@ nsFormControlHelper::GetName(nsIContent* aContent, nsAString* aResult)
}
-nsresult
-nsFormControlHelper::GetValue(nsIContent* aContent, nsAString* aResult)
-{
- nsresult result = NS_FORM_NOTOK;
-
- nsCOMPtr formControl(do_QueryInterface(aContent));
-
- if (formControl) {
- nsHTMLValue value;
- result = formControl->GetHTMLAttribute(nsHTMLAtoms::value, value);
- if (NS_CONTENT_ATTR_HAS_VALUE == result) {
- if (eHTMLUnit_String == value.GetUnit()) {
- value.GetStringValue(*aResult);
- }
- }
- }
- return result;
-}
-
-nsresult
-nsFormControlHelper::GetInputElementValue(nsIContent* aContent, nsString* aText, PRBool aInitialValue)
-{
- nsresult result = NS_OK;
- nsIDOMHTMLInputElement* inputElem = nsnull;
- result = aContent->QueryInterface(NS_GET_IID(nsIDOMHTMLInputElement), (void**)&inputElem);
- if ((NS_OK == result) && inputElem) {
- if (PR_TRUE == aInitialValue) {
- result = inputElem->GetDefaultValue(*aText);
- }
- else {
- result = inputElem->GetValue(*aText);
- }
-
- NS_RELEASE(inputElem);
- }
- return result;
-}
-
//----------------------------------------------------------------------------------
// Return localised string for resource string (e.g. "Submit" -> "Submit Query")
// This code is derived from nsBookmarksService::Init() and cookie_Localize()
@@ -783,91 +744,6 @@ nsFormControlHelper::GetLocalizedString(const char * aPropFileName, const PRUnic
return rv;
}
-// Return value of disabled attribute or PR_FALSE if none set
-nsresult
-nsFormControlHelper::GetDisabled(nsIContent* aContent, PRBool* oIsDisabled)
-{
- nsCOMPtr formControl = do_QueryInterface(aContent);
- nsHTMLValue value;
- nsresult result = formControl->GetHTMLAttribute(nsHTMLAtoms::disabled, value);
- if (NS_CONTENT_ATTR_HAS_VALUE == result) {
- if (eHTMLUnit_Empty == value.GetUnit()) {
- *oIsDisabled = PR_TRUE;
- } else {
- *oIsDisabled = PR_FALSE;
- }
- } else {
- *oIsDisabled = PR_FALSE;
- }
- return NS_OK;
-}
-
-// manual submission helper method
-// aPresShell - If the PresShell is null then the PresContext will
-// get its own and use itstatic nsresult
-// aFormFrame - The HTML Form's frame
-// aFormControlFrame - The form controls frame that is calling this
-// it can be null
-// aDoSubmit - Submit = TRUE, Reset = FALSE
-// Indicates whether to do DOM Processing of the event or to do regular frame processing
-nsresult
-nsFormControlHelper::DoManualSubmitOrReset(nsIPresContext* aPresContext,
- nsIPresShell* aPresShell,
- nsIFrame* aFormFrame,
- nsIFrame* aFormControlFrame,
- PRBool aDoSubmit,
- PRBool aDoDOMEvent)
-{
- NS_ENSURE_ARG_POINTER(aPresContext);
- NS_ENSURE_ARG_POINTER(aFormFrame);
-
- nsresult result = NS_OK;
-
- nsCOMPtr formContent;
- aFormFrame->GetContent(getter_AddRefs(formContent));
-
- // Here we save a pointer to the form control content
- // so we can get its frame again after the Shell has processed the event.
- //
- // Control's Frame may get destroyed during the processing of the event (by the Shell)
- // meaning: aFormControlFrame becomes invalid, so instead of using aFormControlFrame
- // we use the saved content and the shell to go back and get the frame and
- // use it only if it isn't null
- nsCOMPtr controlContent;
- if (aDoSubmit && aFormControlFrame != nsnull) {
- aFormControlFrame->GetContent(getter_AddRefs(controlContent));
- }
-
- if (formContent) {
- //Either use the PresShell passed in or go get it from the PresContext
- nsCOMPtr shell; // this will do our clean up
- if (aPresShell == nsnull) {
- result = aPresContext->GetShell(getter_AddRefs(shell));
- aPresShell = shell.get(); // not AddRefing because shell will clean up
- }
-
- // With a valid PreShell handle the event
- if (NS_SUCCEEDED(result) && nsnull != aPresShell) {
-
- // Get originator for event (failure is non-fatal)
- nsCOMPtr formControl;
- aFormControlFrame->GetContent(getter_AddRefs(formControl));
-
- nsFormEvent event;
- event.eventStructType = NS_FORM_EVENT;
- event.message = aDoSubmit?NS_FORM_SUBMIT:NS_FORM_RESET;
- event.originator = formControl;
- nsEventStatus status = nsEventStatus_eIgnore;
- if (aDoDOMEvent) {
- aPresShell->HandleDOMEventWithTarget(formContent, &event, &status);
- } else {
- aPresShell->HandleEventWithTarget(&event, nsnull, formContent, NS_EVENT_FLAG_INIT, &status);
- }
- }
- }
- return result;
-}
-
nsresult
nsFormControlHelper::Reset(nsIFrame* aFrame, nsIPresContext* aPresContext)
{
@@ -883,3 +759,19 @@ nsFormControlHelper::Reset(nsIFrame* aFrame, nsIPresContext* aPresContext)
return NS_ERROR_FAILURE;
}
+void
+nsFormControlHelper::StyleChangeReflow(nsIPresContext* aPresContext,
+ nsIFrame* aFrame)
+{
+ nsCOMPtr shell;
+ aPresContext->GetShell(getter_AddRefs(shell));
+
+ nsHTMLReflowCommand* reflowCmd;
+ nsresult rv = NS_NewHTMLReflowCommand(&reflowCmd, aFrame,
+ eReflowType_StyleChanged);
+ if (NS_SUCCEEDED(rv)) {
+ shell->AppendReflowCommand(reflowCmd);
+ }
+}
+
+
diff --git a/mozilla/layout/forms/nsFormControlHelper.h b/mozilla/layout/forms/nsFormControlHelper.h
index cfe795743fc..0034a95b940 100644
--- a/mozilla/layout/forms/nsFormControlHelper.h
+++ b/mozilla/layout/forms/nsFormControlHelper.h
@@ -39,20 +39,18 @@
#define nsFormControlHelper_h___
#include "nsIFormControlFrame.h"
-#include "nsIFormManager.h"
#include "nsISupports.h"
#include "nsIWidget.h"
#include "nsLeafFrame.h"
#include "nsCoord.h"
-#include "nsIStyleContext.h"
-#include "nsIPresContext.h"
+#include "nsHTMLAtoms.h"
+#include "nsINameSpaceManager.h"
class nsIView;
-//class nsIPresContext;
+class nsIPresContext;
class nsStyleCoord;
-class nsFormFrame;
class nsIPresState;
-//class nsIStyleContext;
+class nsIStyleContext;
#define CSS_NOTSET -1
#define ATTR_NOTSET -1
@@ -156,27 +154,43 @@ public:
// Map platform line endings (CR, CRLF, LF) to DOM line endings (LF)
static void PlatformToDOMLineBreaks(nsString &aString);
- static nsresult GetValue(nsIContent* aContent, nsAString* aResult);
+ /**
+ * Get whether a form control is disabled
+ * @param aContent the content of the form control in question
+ * @return whether the form control is disabled
+ */
+ static PRBool GetDisabled(nsIContent* aContent) {
+ return aContent->HasAttr(kNameSpaceID_None, nsHTMLAtoms::disabled);
+ };
+ /**
+ * Get the name of the form control
+ * @param aContent the content to get the name of
+ * @param aResult the returned name of the form control [OUT]
+ * @return NS_CONTENT_ATTR_HAS_VALUE if things go well
+ * @return NS_CONTENT_ATTR_NOT_THERE if the name attribute is undefined
+ * @return NS_FORM_NOTOK if aContent is null or is not HTML content
+ */
static nsresult GetName(nsIContent* aContent, nsAString* aResult);
- static nsresult GetInputElementValue(nsIContent* aContent, nsString* aText, PRBool aInitialValue);
+ /**
+ * Cause the form control to reset its value
+ * @param aFrame the frame who owns the form control
+ * @param aPresContext the pres context
+ */
static nsresult Reset(nsIFrame* aFrame, nsIPresContext* aPresContext);
- /**
- * Utility to convert a string to a PRBool
- * @param aValue string to convert to a PRBool
- * @returns PR_TRUE if aValue = "1", PR_FALSE otherwise
- */
-
+ /**
+ * Utility to convert a string to a PRBool
+ * @param aValue string to convert to a PRBool
+ * @returns PR_TRUE if aValue = "1", PR_FALSE otherwise
+ */
static PRBool GetBool(const nsAString& aValue);
- /**
- * Utility to convert a PRBool to a string
- * @param aValue Boolean value to convert to string.
- * @param aResult string to hold the boolean value. It is set to "1"
- * if aValue equals PR_TRUE, "0" if aValue equals PR_FALSE.
-
- */
-
+ /**
+ * Utility to convert a PRBool to a string
+ * @param aValue Boolean value to convert to string.
+ * @param aResult string to hold the boolean value. It is set to "1"
+ * if aValue equals PR_TRUE, "0" if aValue equals PR_FALSE.
+ */
static void GetBoolString(const PRBool aValue, nsAString& aResult);
static void GetRepChars(char& char1, char& char2) {
@@ -202,16 +216,6 @@ public:
static nsresult GetLocalizedString(const char * aPropFileName, const PRUnichar* aKey, nsString& oVal);
static const char * GetHTMLPropertiesFileName() { return FORM_PROPERTIES; }
- static nsresult GetDisabled(nsIContent* aContent, PRBool* oIsDisabled);
-
- // If the PresShell is null then the PresContext will get its own and use it
- static nsresult DoManualSubmitOrReset(nsIPresContext* aPresContext,
- nsIPresShell* aPresShell,
- nsIFrame* aFormFrame,
- nsIFrame* aFormControlFrame,
- PRBool aDoSubmit, // Submit = TRUE, Reset = FALSE
- PRBool aDoDOMEvent);
-
//
//-------------------------------------------------------------------------------------
// Utility methods for managing checkboxes and radiobuttons
@@ -355,6 +359,9 @@ public:
nsIStyleContext* aStyleContext, nsString& aLabel,
nsIFrame* aForFrame);
+ static void StyleChangeReflow(nsIPresContext* aPresContext,
+ nsIFrame* aFrame);
+
protected:
nsFormControlHelper();
virtual ~nsFormControlHelper();
diff --git a/mozilla/layout/forms/nsGfxButtonControlFrame.cpp b/mozilla/layout/forms/nsGfxButtonControlFrame.cpp
index 7ad9224a4d9..42992983f58 100644
--- a/mozilla/layout/forms/nsGfxButtonControlFrame.cpp
+++ b/mozilla/layout/forms/nsGfxButtonControlFrame.cpp
@@ -49,6 +49,7 @@
#include "nsIServiceManager.h"
#include "nsIDOMNode.h"
#include "nsLayoutAtoms.h"
+#include "nsReflowPath.h"
// MouseEvent suppression in PP
#include "nsGUIEvent.h"
@@ -538,13 +539,7 @@ nsGfxButtonControlFrame::Reflow(nsIPresContext* aPresContext,
DO_GLOBAL_REFLOW_COUNT("nsGfxButtonControlFrame", aReflowState.reason);
DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus);
- // The mFormFrame is set in the initial reflow within nsHTMLButtonControlFrame
nsresult rv = NS_OK;
- if (eReflowReason_Initial == aReflowState.reason) {
- if (!mFormFrame) {
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*, this));
- }
- }
#if 0
nsresult skiprv = nsFormControlFrame::SkipResizeReflow(mCacheSize, mCachedMaxElementSize, aPresContext,
diff --git a/mozilla/layout/forms/nsGfxCheckboxControlFrame.cpp b/mozilla/layout/forms/nsGfxCheckboxControlFrame.cpp
index 89dcf110a43..d0150eabd68 100644
--- a/mozilla/layout/forms/nsGfxCheckboxControlFrame.cpp
+++ b/mozilla/layout/forms/nsGfxCheckboxControlFrame.cpp
@@ -39,7 +39,6 @@
#include "nsICheckButton.h"
#include "nsHTMLAtoms.h"
#include "nsHTMLParts.h"
-#include "nsFormFrame.h"
#include "nsIFormControl.h"
#include "nsIContent.h"
#include "nsIComponentManager.h"
@@ -54,6 +53,7 @@
#endif
#include "nsIServiceManager.h"
#include "nsIDOMNode.h"
+#include "nsIDOMHTMLInputElement.h"
//------------------------------------------------------------
diff --git a/mozilla/layout/forms/nsGfxRadioControlFrame.cpp b/mozilla/layout/forms/nsGfxRadioControlFrame.cpp
index ab541bb0515..62cd0413829 100644
--- a/mozilla/layout/forms/nsGfxRadioControlFrame.cpp
+++ b/mozilla/layout/forms/nsGfxRadioControlFrame.cpp
@@ -38,7 +38,6 @@
#include "nsGfxRadioControlFrame.h"
#include "nsHTMLAtoms.h"
#include "nsHTMLParts.h"
-#include "nsFormFrame.h"
#include "nsIFormControl.h"
#include "nsIContent.h"
#include "nsWidgetsCID.h"
diff --git a/mozilla/layout/forms/nsHTMLButtonControlFrame.cpp b/mozilla/layout/forms/nsHTMLButtonControlFrame.cpp
index de537912a6e..23e74932e20 100644
--- a/mozilla/layout/forms/nsHTMLButtonControlFrame.cpp
+++ b/mozilla/layout/forms/nsHTMLButtonControlFrame.cpp
@@ -43,7 +43,6 @@
#include "nsIFormControlFrame.h"
#include "nsHTMLParts.h"
#include "nsIFormControl.h"
-#include "nsFormFrame.h"
#include "nsIRenderingContext.h"
#include "nsIPresContext.h"
@@ -68,6 +67,8 @@
#include "nsFormControlFrame.h"
#include "nsIFrameManager.h"
#include "nsINameSpaceManager.h"
+#include "nsReflowPath.h"
+#include "nsIServiceManager.h"
#ifdef ACCESSIBILITY
#include "nsIAccessibilityService.h"
#endif
@@ -114,10 +115,6 @@ NS_IMETHODIMP
nsHTMLButtonControlFrame::Destroy(nsIPresContext *aPresContext)
{
nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_FALSE);
- if (mFormFrame) {
- mFormFrame->RemoveFormControlFrame(*this);
- mFormFrame = nsnull;
- }
return nsHTMLContainerFrame::Destroy(aPresContext);
}
@@ -373,9 +370,6 @@ nsHTMLButtonControlFrame::SetInitialChildList(nsIPresContext* aPresContext,
nsIAtom* aListName,
nsIFrame* aChildList)
{
- // add ourself as an nsIFormControlFrame
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*, this));
-
// get the frame manager and the style context of the new parent frame
// this is used whent he children are reparented below
// NOTE: the whole reparenting should not need to happen: see bugzilla bug 51767
@@ -500,9 +494,8 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext,
DO_GLOBAL_REFLOW_COUNT("nsHTMLButtonControlFrame", aReflowState.reason);
DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus);
- if (!mFormFrame && (eReflowReason_Initial == aReflowState.reason)) {
+ if (eReflowReason_Initial == aReflowState.reason) {
nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_TRUE);
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*, this));
}
#if 0
@@ -604,8 +597,10 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext,
0, aStatus);
// calculate the min internal size so the contents gets centered correctly
- nscoord minInternalWidth = aReflowState.mComputedMinWidth == 0?0:aReflowState.mComputedMinWidth -
- (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right);
+ // minInternalWidth is not being used at all and causes a warning--commenting
+ // out until someone wants it.
+ // nscoord minInternalWidth = aReflowState.mComputedMinWidth == 0?0:aReflowState.mComputedMinWidth -
+ // (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right);
nscoord minInternalHeight = aReflowState.mComputedMinHeight == 0?0:aReflowState.mComputedMinHeight -
(aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom);
diff --git a/mozilla/layout/forms/nsHTMLButtonControlFrame.h b/mozilla/layout/forms/nsHTMLButtonControlFrame.h
index 9aa093d4536..a2ac8f9c034 100644
--- a/mozilla/layout/forms/nsHTMLButtonControlFrame.h
+++ b/mozilla/layout/forms/nsHTMLButtonControlFrame.h
@@ -44,7 +44,6 @@
#include "nsIFormControlFrame.h"
#include "nsHTMLParts.h"
#include "nsIFormControl.h"
-#include "nsFormFrame.h"
#include "nsIRenderingContext.h"
#include "nsIPresContext.h"
@@ -132,7 +131,6 @@ public:
NS_IMETHOD GetName(nsAString* aName);
NS_IMETHOD GetValue(nsAString* aName);
virtual void MouseClicked(nsIPresContext* aPresContext);
- virtual void SetFormFrame(nsFormFrame* aFormFrame) { mFormFrame = aFormFrame; }
NS_IMETHOD OnContentReset();
void SetFocus(PRBool aOn, PRBool aRepaint);
@@ -168,7 +166,6 @@ protected:
PRIntn GetSkipSides() const;
PRBool mInline;
- nsFormFrame* mFormFrame;
nsCursor mPreviousCursor;
nsRect mTranslatedRect;
PRBool mDidInit;
diff --git a/mozilla/layout/forms/nsIComboboxControlFrame.h b/mozilla/layout/forms/nsIComboboxControlFrame.h
index 2c591d23e62..c22b0706ebb 100644
--- a/mozilla/layout/forms/nsIComboboxControlFrame.h
+++ b/mozilla/layout/forms/nsIComboboxControlFrame.h
@@ -41,7 +41,6 @@
#include "nsISupports.h"
#include "nsFont.h"
-class nsFormFrame;
class nsIPresContext;
class nsString;
class nsIContent;
diff --git a/mozilla/layout/forms/nsIFormControlFrame.h b/mozilla/layout/forms/nsIFormControlFrame.h
index db2469ed4d8..0393b126734 100644
--- a/mozilla/layout/forms/nsIFormControlFrame.h
+++ b/mozilla/layout/forms/nsIFormControlFrame.h
@@ -40,7 +40,6 @@
#include "nsISupports.h"
#include "nsFont.h"
-class nsFormFrame;
class nsIPresContext;
class nsAString;
class nsIContent;
@@ -71,8 +70,6 @@ public:
virtual void MouseClicked(nsIPresContext* aPresContext) = 0;
- virtual void SetFormFrame(nsFormFrame* aFrame) = 0;
-
/**
* Set the suggested size for the form element.
* This is used to control the size of the element during reflow if it hasn't had it's size
diff --git a/mozilla/layout/forms/nsIListControlFrame.h b/mozilla/layout/forms/nsIListControlFrame.h
index 9d788c40b31..b378fc59296 100644
--- a/mozilla/layout/forms/nsIListControlFrame.h
+++ b/mozilla/layout/forms/nsIListControlFrame.h
@@ -40,7 +40,6 @@
#include "nsISupports.h"
#include "nsFont.h"
-class nsFormFrame;
class nsIPresContext;
class nsAString;
class nsIContent;
diff --git a/mozilla/layout/forms/nsITextControlFrame.h b/mozilla/layout/forms/nsITextControlFrame.h
index b59e05edd4a..1abb35cb422 100644
--- a/mozilla/layout/forms/nsITextControlFrame.h
+++ b/mozilla/layout/forms/nsITextControlFrame.h
@@ -73,6 +73,11 @@ public:
NS_IMETHOD GetTextLength(PRInt32* aTextLength) = 0;
+ /**
+ * Fire onChange if the value has changed since it was focused or since it
+ * was last fired.
+ */
+ NS_IMETHOD CheckFireOnChange() = 0;
NS_IMETHOD SetSelectionStart(PRInt32 aSelectionStart) = 0;
NS_IMETHOD SetSelectionEnd(PRInt32 aSelectionEnd) = 0;
diff --git a/mozilla/layout/forms/nsImageControlFrame.cpp b/mozilla/layout/forms/nsImageControlFrame.cpp
index 542caa44f1d..f11c281bacb 100644
--- a/mozilla/layout/forms/nsImageControlFrame.cpp
+++ b/mozilla/layout/forms/nsImageControlFrame.cpp
@@ -57,10 +57,10 @@
#include "nsIImage.h"
#include "nsStyleUtil.h"
#include "nsStyleConsts.h"
-#include "nsFormFrame.h"
#include "nsFormControlFrame.h"
#include "nsGUIEvent.h"
#include "nsLayoutAtoms.h"
+#include "nsIServiceManager.h"
#ifdef ACCESSIBILITY
#include "nsIAccessibilityService.h"
#endif
@@ -121,8 +121,6 @@ public:
virtual void MouseClicked(nsIPresContext* aPresContext);
- virtual void SetFormFrame(nsFormFrame* aFormFrame) { mFormFrame = aFormFrame; }
-
NS_IMETHOD GetType(PRInt32* aType) const;
NS_IMETHOD GetName(nsAString* aName);
@@ -159,7 +157,6 @@ protected:
NS_IMETHOD_(nsrefcnt) AddRef(void);
NS_IMETHOD_(nsrefcnt) Release(void);
- nsFormFrame* mFormFrame;
nsMouseState mLastMouseState;
nsPoint mLastClickPoint;
nsCursor mPreviousCursor;
@@ -176,7 +173,6 @@ nsImageControlFrame::nsImageControlFrame()
mPreviousCursor = eCursor_standard;
mTranslatedRect = nsRect(0,0,0,0);
mGotFocus = PR_FALSE;
- mFormFrame = nsnull;
}
nsImageControlFrame::~nsImageControlFrame()
@@ -188,10 +184,6 @@ nsImageControlFrame::Destroy(nsIPresContext *aPresContext)
{
nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_FALSE);
- if (mFormFrame) {
- mFormFrame->RemoveFormControlFrame(*this);
- mFormFrame = nsnull;
- }
return nsImageControlFrameSuper::Destroy(aPresContext);
}
@@ -313,10 +305,8 @@ nsImageControlFrame::Reflow(nsIPresContext* aPresContext,
{
DO_GLOBAL_REFLOW_COUNT("nsImageControlFrame", aReflowState.reason);
DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus);
- if (!mFormFrame && (eReflowReason_Initial == aReflowState.reason)) {
+ if (aReflowState.reason == eReflowReason_Initial) {
nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_TRUE);
- // add ourself as an nsIFormControlFrame
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*, this));
}
return nsImageControlFrameSuper::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus);
}
@@ -339,7 +329,7 @@ nsImageControlFrame::HandleEvent(nsIPresContext* aPresContext,
if (uiStyle->mUserInput == NS_STYLE_USER_INPUT_NONE || uiStyle->mUserInput == NS_STYLE_USER_INPUT_DISABLED)
return nsFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
- if (nsFormFrame::GetDisabled(this)) { // XXX cache disabled
+ if (nsFormControlHelper::GetDisabled(mContent)) { // XXX cache disabled
return NS_OK;
}
@@ -414,7 +404,7 @@ nsImageControlFrame::GetName(nsAString* aResult)
if (nsnull == aResult) {
return NS_OK;
} else {
- return nsFormFrame::GetName(this, *aResult);
+ return nsFormControlHelper::GetName(mContent, aResult);
}
}
diff --git a/mozilla/layout/forms/nsListControlFrame.cpp b/mozilla/layout/forms/nsListControlFrame.cpp
index 910a18069de..d74e4deed9c 100644
--- a/mozilla/layout/forms/nsListControlFrame.cpp
+++ b/mozilla/layout/forms/nsListControlFrame.cpp
@@ -54,7 +54,6 @@
#include "nsIDOMHTMLOptionElement.h"
#include "nsIComboboxControlFrame.h"
#include "nsIViewManager.h"
-#include "nsFormFrame.h"
#include "nsIScrollableView.h"
#include "nsIDOMHTMLOptGroupElement.h"
#include "nsWidgetsCID.h"
@@ -77,6 +76,7 @@
#include "nsIDOMEventTarget.h"
#include "nsIDOMNSEvent.h"
#include "nsGUIEvent.h"
+#include "nsIServiceManager.h"
#ifdef ACCESSIBILITY
#include "nsIAccessibilityService.h"
#endif
@@ -84,6 +84,7 @@
#include "nsIPrivateDOMEvent.h"
#include "nsCSSRendering.h"
#include "nsILookAndFeel.h"
+#include "nsReflowPath.h"
// Timer Includes
#include "nsITimer.h"
@@ -393,7 +394,6 @@ nsListControlFrame::nsListControlFrame()
: mWeakReferent(this)
{
mComboboxFrame = nsnull;
- mFormFrame = nsnull;
mButtonDown = PR_FALSE;
mMaxWidth = 0;
mMaxHeight = 0;
@@ -433,10 +433,6 @@ nsListControlFrame::~nsListControlFrame()
}
mComboboxFrame = nsnull;
- if (mFormFrame) {
- mFormFrame->RemoveFormControlFrame(*this);
- mFormFrame = nsnull;
- }
NS_IF_RELEASE(mPresContext);
}
@@ -920,9 +916,8 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext,
// Add the list frame as a child of the form
if (eReflowReason_Initial == aReflowState.reason) {
- if (IsInDropDownMode() == PR_FALSE && !mFormFrame) {
+ if (!IsInDropDownMode()) {
nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_TRUE);
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*, this));
}
}
@@ -1604,7 +1599,7 @@ nsListControlFrame::HandleEvent(nsIPresContext* aPresContext,
if (uiStyle->mUserInput == NS_STYLE_USER_INPUT_NONE || uiStyle->mUserInput == NS_STYLE_USER_INPUT_DISABLED)
return nsFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
- if (nsFormFrame::GetDisabled(this))
+ if (nsFormControlHelper::GetDisabled(mContent))
return NS_OK;
switch (aEvent->message) {
@@ -1929,13 +1924,6 @@ nsListControlFrame::GetType(PRInt32* aType) const
return NS_OK;
}
-//---------------------------------------------------------
-void
-nsListControlFrame::SetFormFrame(nsFormFrame* aFormFrame)
-{
- mFormFrame = aFormFrame;
-}
-
//---------------------------------------------------------
void
@@ -2742,7 +2730,7 @@ nsListControlFrame::MouseUp(nsIDOMEvent* aMouseEvent)
mButtonDown = PR_FALSE;
- if (nsFormFrame::GetDisabled(this)) {
+ if (nsFormControlHelper::GetDisabled(mContent)) {
return NS_OK;
}
@@ -2927,7 +2915,7 @@ nsListControlFrame::MouseDown(nsIDOMEvent* aMouseEvent)
mButtonDown = PR_TRUE;
- if (nsFormFrame::GetDisabled(this)) {
+ if (nsFormControlHelper::GetDisabled(mContent)) {
return NS_OK;
}
@@ -3250,7 +3238,7 @@ nsListControlFrame::KeyPress(nsIDOMEvent* aKeyEvent)
{
NS_ASSERTION(aKeyEvent != nsnull, "keyEvent is null.");
- if (nsFormFrame::GetDisabled(this))
+ if (nsFormControlHelper::GetDisabled(mContent))
return NS_OK;
nsresult rv = NS_ERROR_FAILURE;
diff --git a/mozilla/layout/forms/nsListControlFrame.h b/mozilla/layout/forms/nsListControlFrame.h
index 49b3b4cd391..51ccb93f33b 100644
--- a/mozilla/layout/forms/nsListControlFrame.h
+++ b/mozilla/layout/forms/nsListControlFrame.h
@@ -242,7 +242,6 @@ public:
virtual void SetFocus(PRBool aOn = PR_TRUE, PRBool aRepaint = PR_FALSE);
virtual void ScrollIntoView(nsIPresContext* aPresContext);
virtual void MouseClicked(nsIPresContext* aPresContext);
- virtual void SetFormFrame(nsFormFrame* aFrame);
virtual nscoord GetVerticalInsidePadding(nsIPresContext* aPresContext,
float aPixToTwip,
nscoord aInnerHeight) const;
@@ -381,8 +380,6 @@ protected:
void ItemsHaveBeenRemoved(nsIPresContext * aPresContext);
// Data Members
- nsFormFrame* mFormFrame;
-
PRInt32 mStartSelectionIndex;
PRInt32 mEndSelectionIndex;
PRPackedBool mChangesSinceDragStart;
diff --git a/mozilla/layout/html/forms/public/Makefile.in b/mozilla/layout/html/forms/public/Makefile.in
index 6668dcf0246..80a30bc81b3 100644
--- a/mozilla/layout/html/forms/public/Makefile.in
+++ b/mozilla/layout/html/forms/public/Makefile.in
@@ -29,7 +29,6 @@ include $(DEPTH)/config/autoconf.mk
MODULE = layout
EXPORTS = \
- nsIFormManager.h \
nsIListControlFrame.h \
nsIImageControlFrame.h \
nsIComboboxControlFrame.h \
diff --git a/mozilla/layout/html/forms/public/makefile.win b/mozilla/layout/html/forms/public/makefile.win
index 11f5a5c6aaf..77c26be04d1 100644
--- a/mozilla/layout/html/forms/public/makefile.win
+++ b/mozilla/layout/html/forms/public/makefile.win
@@ -21,8 +21,7 @@
DEPTH=..\..\..\..
-EXPORTS=nsIFormManager.h \
- nsIListControlFrame.h \
+EXPORTS=nsIListControlFrame.h \
nsIImageControlFrame.h \
nsIComboboxControlFrame.h \
nsIRadioControlFrame.h \
diff --git a/mozilla/layout/html/forms/public/nsIComboboxControlFrame.h b/mozilla/layout/html/forms/public/nsIComboboxControlFrame.h
index 2c591d23e62..c22b0706ebb 100644
--- a/mozilla/layout/html/forms/public/nsIComboboxControlFrame.h
+++ b/mozilla/layout/html/forms/public/nsIComboboxControlFrame.h
@@ -41,7 +41,6 @@
#include "nsISupports.h"
#include "nsFont.h"
-class nsFormFrame;
class nsIPresContext;
class nsString;
class nsIContent;
diff --git a/mozilla/layout/html/forms/public/nsIFormControlFrame.h b/mozilla/layout/html/forms/public/nsIFormControlFrame.h
index db2469ed4d8..0393b126734 100644
--- a/mozilla/layout/html/forms/public/nsIFormControlFrame.h
+++ b/mozilla/layout/html/forms/public/nsIFormControlFrame.h
@@ -40,7 +40,6 @@
#include "nsISupports.h"
#include "nsFont.h"
-class nsFormFrame;
class nsIPresContext;
class nsAString;
class nsIContent;
@@ -71,8 +70,6 @@ public:
virtual void MouseClicked(nsIPresContext* aPresContext) = 0;
- virtual void SetFormFrame(nsFormFrame* aFrame) = 0;
-
/**
* Set the suggested size for the form element.
* This is used to control the size of the element during reflow if it hasn't had it's size
diff --git a/mozilla/layout/html/forms/public/nsIGfxTextControlFrame.h b/mozilla/layout/html/forms/public/nsIGfxTextControlFrame.h
index b59e05edd4a..1abb35cb422 100644
--- a/mozilla/layout/html/forms/public/nsIGfxTextControlFrame.h
+++ b/mozilla/layout/html/forms/public/nsIGfxTextControlFrame.h
@@ -73,6 +73,11 @@ public:
NS_IMETHOD GetTextLength(PRInt32* aTextLength) = 0;
+ /**
+ * Fire onChange if the value has changed since it was focused or since it
+ * was last fired.
+ */
+ NS_IMETHOD CheckFireOnChange() = 0;
NS_IMETHOD SetSelectionStart(PRInt32 aSelectionStart) = 0;
NS_IMETHOD SetSelectionEnd(PRInt32 aSelectionEnd) = 0;
diff --git a/mozilla/layout/html/forms/public/nsIListControlFrame.h b/mozilla/layout/html/forms/public/nsIListControlFrame.h
index 9d788c40b31..b378fc59296 100644
--- a/mozilla/layout/html/forms/public/nsIListControlFrame.h
+++ b/mozilla/layout/html/forms/public/nsIListControlFrame.h
@@ -40,7 +40,6 @@
#include "nsISupports.h"
#include "nsFont.h"
-class nsFormFrame;
class nsIPresContext;
class nsAString;
class nsIContent;
diff --git a/mozilla/layout/html/forms/public/nsITextControlFrame.h b/mozilla/layout/html/forms/public/nsITextControlFrame.h
index b59e05edd4a..1abb35cb422 100644
--- a/mozilla/layout/html/forms/public/nsITextControlFrame.h
+++ b/mozilla/layout/html/forms/public/nsITextControlFrame.h
@@ -73,6 +73,11 @@ public:
NS_IMETHOD GetTextLength(PRInt32* aTextLength) = 0;
+ /**
+ * Fire onChange if the value has changed since it was focused or since it
+ * was last fired.
+ */
+ NS_IMETHOD CheckFireOnChange() = 0;
NS_IMETHOD SetSelectionStart(PRInt32 aSelectionStart) = 0;
NS_IMETHOD SetSelectionEnd(PRInt32 aSelectionEnd) = 0;
diff --git a/mozilla/layout/html/forms/src/Makefile.in b/mozilla/layout/html/forms/src/Makefile.in
index 2ae13df673a..7f3a8414b36 100644
--- a/mozilla/layout/html/forms/src/Makefile.in
+++ b/mozilla/layout/html/forms/src/Makefile.in
@@ -62,7 +62,6 @@ CPPSRCS = \
nsFileControlFrame.cpp \
nsFormControlFrame.cpp \
nsFormControlHelper.cpp \
- nsFormFrame.cpp \
nsGfxButtonControlFrame.cpp \
nsGfxCheckboxControlFrame.cpp \
nsGfxRadioControlFrame.cpp \
diff --git a/mozilla/layout/html/forms/src/makefile.win b/mozilla/layout/html/forms/src/makefile.win
index 44cdb96c940..19eeb11bbd7 100644
--- a/mozilla/layout/html/forms/src/makefile.win
+++ b/mozilla/layout/html/forms/src/makefile.win
@@ -55,7 +55,6 @@ CPP_OBJS= \
.\$(OBJDIR)\nsFormControlHelper.obj \
.\$(OBJDIR)\nsComboboxControlFrame.obj \
.\$(OBJDIR)\nsListControlFrame.obj \
- .\$(OBJDIR)\nsFormFrame.obj \
.\$(OBJDIR)\nsFormControlFrame.obj \
.\$(OBJDIR)\nsFileControlFrame.obj \
.\$(OBJDIR)\nsGfxTextControlFrame2.obj \
diff --git a/mozilla/layout/html/forms/src/nsComboboxControlFrame.cpp b/mozilla/layout/html/forms/src/nsComboboxControlFrame.cpp
index daf7c31f544..6bd12fe5f70 100644
--- a/mozilla/layout/html/forms/src/nsComboboxControlFrame.cpp
+++ b/mozilla/layout/html/forms/src/nsComboboxControlFrame.cpp
@@ -40,7 +40,6 @@
#include "nsComboboxControlFrame.h"
#include "nsIDOMEventReceiver.h"
#include "nsIFrameManager.h"
-#include "nsFormFrame.h"
#include "nsFormControlFrame.h"
#include "nsIHTMLContent.h"
#include "nsHTMLAtoms.h"
@@ -284,7 +283,6 @@ nsComboboxControlFrame::nsComboboxControlFrame()
: nsAreaFrame()
{
mPresContext = nsnull;
- mFormFrame = nsnull;
mListControlFrame = nsnull;
mDroppedDown = PR_FALSE;
mDisplayFrame = nsnull;
@@ -319,11 +317,6 @@ nsComboboxControlFrame::~nsComboboxControlFrame()
{
REFLOW_COUNTER_DUMP("nsCCF");
- if (mFormFrame) {
- mFormFrame->RemoveFormControlFrame(*this);
- mFormFrame = nsnull;
- }
-
NS_IF_RELEASE(mPresContext);
}
@@ -1262,9 +1255,7 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
return NS_OK;
}
- // add ourself to the form control
- if (!mFormFrame && (eReflowReason_Initial == aReflowState.reason)) {
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*,this));
+ if (eReflowReason_Initial == aReflowState.reason) {
if (NS_FAILED(CreateDisplayFrame(aPresContext))) {
return NS_ERROR_FAILURE;
}
@@ -1816,7 +1807,7 @@ nsComboboxControlFrame::GetFrameName(nsAString& aResult) const
NS_IMETHODIMP
nsComboboxControlFrame::ShowDropDown(PRBool aDoDropDown)
{
- if (nsFormFrame::GetDisabled(this)) {
+ if (nsFormControlHelper::GetDisabled(mContent)) {
return NS_OK;
}
@@ -2103,7 +2094,7 @@ nsComboboxControlFrame::HandleEvent(nsIPresContext* aPresContext,
if (nsEventStatus_eConsumeNoDefault == *aEventStatus) {
return NS_OK;
}
- if (nsFormFrame::GetDisabled(this)) {
+ if (nsFormControlHelper::GetDisabled(mContent)) {
return NS_OK;
}
@@ -2565,7 +2556,7 @@ nsComboboxControlFrame::Paint(nsIPresContext* aPresContext,
nsCOMPtr stateManager;
nsresult rv = mPresContext->GetEventStateManager(getter_AddRefs(stateManager));
if (NS_SUCCEEDED(rv)) {
- if (NS_SUCCEEDED(rv) && !nsFormFrame::GetDisabled(this) && mFocused == this) {
+ if (!nsFormControlHelper::GetDisabled(mContent) && mFocused == this) {
aRenderingContext.SetLineStyle(nsLineStyle_kDotted);
aRenderingContext.SetColor(0);
} else {
diff --git a/mozilla/layout/html/forms/src/nsComboboxControlFrame.h b/mozilla/layout/html/forms/src/nsComboboxControlFrame.h
index cf286d7237c..369b376fe3d 100644
--- a/mozilla/layout/html/forms/src/nsComboboxControlFrame.h
+++ b/mozilla/layout/html/forms/src/nsComboboxControlFrame.h
@@ -65,7 +65,6 @@
#include "nsIScrollableViewProvider.h"
#include "nsIStatefulFrame.h"
-class nsFormFrame;
class nsIView;
class nsStyleContext;
class nsIHTMLContent;
@@ -152,7 +151,6 @@ public:
void SetFocus(PRBool aOn, PRBool aRepaint);
void ScrollIntoView(nsIPresContext* aPresContext);
virtual void InitializeControl(nsIPresContext* aPresContext);
- virtual void SetFormFrame(nsFormFrame* aFormFrame) { mFormFrame = aFormFrame; }
NS_IMETHOD OnContentReset();
NS_IMETHOD GetFont(nsIPresContext* aPresContext,
@@ -271,7 +269,6 @@ protected:
nsFrameList mPopupFrames; // additional named child list
nsIPresContext* mPresContext; // XXX: Remove the need to cache the pres context.
- nsFormFrame* mFormFrame; // Parent Form Frame
nsCOMPtr mDisplayContent; // Anonymous content used to display the current selection
nsIFrame* mDisplayFrame; // frame to display selection
nsIFrame* mButtonFrame; // button frame
diff --git a/mozilla/layout/html/forms/src/nsFileControlFrame.cpp b/mozilla/layout/html/forms/src/nsFileControlFrame.cpp
index fe55e7987d6..03c1a1ec812 100644
--- a/mozilla/layout/html/forms/src/nsFileControlFrame.cpp
+++ b/mozilla/layout/html/forms/src/nsFileControlFrame.cpp
@@ -36,7 +36,6 @@
* ***** END LICENSE BLOCK ***** */
#include "nsFileControlFrame.h"
-#include "nsFormFrame.h"
#include "nsIElementFactory.h"
@@ -70,6 +69,7 @@
#include "nsINodeInfo.h"
#include "nsIDOMEventReceiver.h"
#include "nsIScriptGlobalObject.h"
+#include "nsILocalFile.h"
#include "nsContentCID.h"
static NS_DEFINE_CID(kHTMLElementFactoryCID, NS_HTML_ELEMENT_FACTORY_CID);
@@ -91,7 +91,6 @@ NS_NewFileControlFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame)
nsFileControlFrame::nsFileControlFrame():
mTextFrame(nsnull),
- mFormFrame(nsnull),
mTextContent(nsnull),
mCachedState(nsnull)
{
@@ -113,10 +112,6 @@ nsFileControlFrame::~nsFileControlFrame()
delete mCachedState;
mCachedState = nsnull;
}
- if (mFormFrame) {
- mFormFrame->RemoveFormControlFrame(*this);
- mFormFrame = nsnull;
- }
}
NS_IMETHODIMP
@@ -149,7 +144,7 @@ nsFileControlFrame::CreateAnonymousContent(nsIPresContext* aPresContext,
mTextContent->SetAttr(kNameSpaceID_None, nsHTMLAtoms::type, NS_LITERAL_STRING("text"), PR_FALSE);
nsCOMPtr textControl = do_QueryInterface(mTextContent);
if (textControl) {
- textControl->SetDisabled(nsFormFrame::GetDisabled(this));
+ textControl->SetDisabled(nsFormControlHelper::GetDisabled(mContent));
// Initialize value when we create the content in case the value was set
// before we got here
nsCOMPtr fileContent = do_QueryInterface(mContent);
@@ -356,9 +351,7 @@ NS_IMETHODIMP nsFileControlFrame::Reflow(nsIPresContext* aPresContext,
aStatus = NS_FRAME_COMPLETE;
- if (mFormFrame == nsnull && eReflowReason_Initial == aReflowState.reason) {
- // add ourself as an nsIFormControlFrame
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*, this));
+ if (eReflowReason_Initial == aReflowState.reason) {
mTextFrame = GetTextControlFrame(aPresContext, this);
if (!mTextFrame) return NS_ERROR_UNEXPECTED;
if (mCachedState) {
@@ -537,14 +530,14 @@ nsFileControlFrame::AttributeChanged(nsIPresContext* aPresContext,
nsCOMPtr textControl = do_QueryInterface(mTextContent);
if (textControl)
{
- textControl->SetDisabled(nsFormFrame::GetDisabled(this));
+ textControl->SetDisabled(nsFormControlHelper::GetDisabled(mContent));
}
} else if (nsHTMLAtoms::size == aAttribute) {
nsString value;
if (nsnull != mTextContent && NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttr(kNameSpaceID_None, nsHTMLAtoms::size, value)) {
mTextContent->SetAttr(kNameSpaceID_None, nsHTMLAtoms::size, value, PR_TRUE);
if (aHint != NS_STYLE_HINT_REFLOW) {
- nsFormFrame::StyleChangeReflow(aPresContext, this);
+ nsFormControlHelper::StyleChangeReflow(aPresContext, this);
}
}
}
@@ -559,7 +552,7 @@ nsFileControlFrame::GetFrameForPoint(nsIPresContext* aPresContext,
nsIFrame** aFrame)
{
#ifndef DEBUG_NEWFRAME
- if ( nsFormFrame::GetDisabled(this) && mRect.Contains(aPoint) ) {
+ if ( nsFormControlHelper::GetDisabled(mContent) && mRect.Contains(aPoint) ) {
const nsStyleVisibility* vis =
(const nsStyleVisibility*)mStyleContext->GetStyleData(eStyleStruct_Visibility);
diff --git a/mozilla/layout/html/forms/src/nsFileControlFrame.h b/mozilla/layout/html/forms/src/nsFileControlFrame.h
index 56bfd7833d3..e4aebda4fad 100644
--- a/mozilla/layout/html/forms/src/nsFileControlFrame.h
+++ b/mozilla/layout/html/forms/src/nsFileControlFrame.h
@@ -50,7 +50,6 @@
typedef nsGfxTextControlFrame2 nsNewFrame;
class nsIPresState;
-class nsFormFrame;
class nsISupportsArray;
class nsFileControlFrame : public nsAreaFrame,
@@ -73,8 +72,6 @@ public:
}
virtual void MouseClicked(nsIPresContext* aPresContext) {}
- virtual void SetFormFrame(nsFormFrame* aFormFrame) { mFormFrame = aFormFrame; }
- virtual nsFormFrame* GetFromFrame() { return mFormFrame; }
NS_IMETHOD Paint(nsIPresContext* aPresContext,
nsIRenderingContext& aRenderingContext,
@@ -184,7 +181,6 @@ protected:
virtual PRIntn GetSkipSides() const;
nsNewFrame* mTextFrame;
- nsFormFrame* mFormFrame;
nsIHTMLContent* mTextContent;
nsCOMPtr mBrowse;
nsString* mCachedState;
diff --git a/mozilla/layout/html/forms/src/nsFormControlFrame.cpp b/mozilla/layout/html/forms/src/nsFormControlFrame.cpp
index 7303b3cbedb..b2d317d6c50 100644
--- a/mozilla/layout/html/forms/src/nsFormControlFrame.cpp
+++ b/mozilla/layout/html/forms/src/nsFormControlFrame.cpp
@@ -62,7 +62,6 @@
#include "nsStyleConsts.h"
#include "nsUnitConversion.h"
#include "nsStyleUtil.h"
-#include "nsFormFrame.h"
#include "nsIContent.h"
#include "nsStyleUtil.h"
#include "nsINameSpaceManager.h"
@@ -112,7 +111,6 @@ nsFormControlFrame::nsFormControlFrame()
: nsLeafFrame()
{
mDidInit = PR_FALSE;
- mFormFrame = nsnull;
mSuggestedWidth = NS_FORMSIZE_NOTSET;
mSuggestedHeight = NS_FORMSIZE_NOTSET;
mPresContext = nsnull;
@@ -126,10 +124,6 @@ nsFormControlFrame::nsFormControlFrame()
nsFormControlFrame::~nsFormControlFrame()
{
- if (mFormFrame) {
- mFormFrame->RemoveFormControlFrame(*this);
- mFormFrame = nsnull;
- }
}
NS_IMETHODIMP
@@ -550,11 +544,6 @@ nsFormControlFrame::Reflow(nsIPresContext* aPresContext,
mDidInit = PR_TRUE;
}
- // add ourself as an nsIFormControlFrame
- if (!mFormFrame && (eReflowReason_Initial == aReflowState.reason)) {
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*, this));
- }
-
#if 0
nsresult skiprv = SkipResizeReflow(mCacheSize, mCachedMaxElementSize, aPresContext,
aDesiredSize, aReflowState, aStatus);
diff --git a/mozilla/layout/html/forms/src/nsFormControlFrame.h b/mozilla/layout/html/forms/src/nsFormControlFrame.h
index b6119f4bde6..3c8c47670ef 100644
--- a/mozilla/layout/html/forms/src/nsFormControlFrame.h
+++ b/mozilla/layout/html/forms/src/nsFormControlFrame.h
@@ -40,7 +40,6 @@
#include "nsIFormControlFrame.h"
#include "nsFormControlHelper.h"
-#include "nsIFormManager.h"
#include "nsISupports.h"
#include "nsIWidget.h"
#include "nsLeafFrame.h"
@@ -52,7 +51,6 @@
class nsIView;
class nsIPresContext;
class nsStyleCoord;
-class nsFormFrame;
#define CSS_NOTSET -1
#define ATTR_NOTSET -1
@@ -199,8 +197,6 @@ public:
NS_IMETHOD GetMaxLength(PRInt32* aSize);
virtual void SetClickPoint(nscoord aX, nscoord aY);
- nsFormFrame* GetFormFrame() { return mFormFrame; }
- virtual void SetFormFrame(nsFormFrame* aFormFrame) { mFormFrame = aFormFrame; }
NS_IMETHOD GetFont(nsIPresContext* aPresContext,
const nsFont*& aFont);
@@ -326,7 +322,6 @@ protected:
nsSize mWidgetSize;
PRBool mDidInit;
nsPoint mLastClickPoint;
- nsFormFrame* mFormFrame;
nscoord mSuggestedWidth;
nscoord mSuggestedHeight;
diff --git a/mozilla/layout/html/forms/src/nsFormControlHelper.cpp b/mozilla/layout/html/forms/src/nsFormControlHelper.cpp
index 6a6a6ce8e45..6dfb2a107b1 100644
--- a/mozilla/layout/html/forms/src/nsFormControlHelper.cpp
+++ b/mozilla/layout/html/forms/src/nsFormControlHelper.cpp
@@ -62,7 +62,6 @@
#include "nsStyleConsts.h"
#include "nsUnitConversion.h"
#include "nsStyleUtil.h"
-#include "nsFormFrame.h"
#include "nsIContent.h"
#include "nsStyleUtil.h"
#include "nsINameSpaceManager.h"
@@ -714,44 +713,6 @@ nsFormControlHelper::GetName(nsIContent* aContent, nsAString* aResult)
}
-nsresult
-nsFormControlHelper::GetValue(nsIContent* aContent, nsAString* aResult)
-{
- nsresult result = NS_FORM_NOTOK;
-
- nsCOMPtr formControl(do_QueryInterface(aContent));
-
- if (formControl) {
- nsHTMLValue value;
- result = formControl->GetHTMLAttribute(nsHTMLAtoms::value, value);
- if (NS_CONTENT_ATTR_HAS_VALUE == result) {
- if (eHTMLUnit_String == value.GetUnit()) {
- value.GetStringValue(*aResult);
- }
- }
- }
- return result;
-}
-
-nsresult
-nsFormControlHelper::GetInputElementValue(nsIContent* aContent, nsString* aText, PRBool aInitialValue)
-{
- nsresult result = NS_OK;
- nsIDOMHTMLInputElement* inputElem = nsnull;
- result = aContent->QueryInterface(NS_GET_IID(nsIDOMHTMLInputElement), (void**)&inputElem);
- if ((NS_OK == result) && inputElem) {
- if (PR_TRUE == aInitialValue) {
- result = inputElem->GetDefaultValue(*aText);
- }
- else {
- result = inputElem->GetValue(*aText);
- }
-
- NS_RELEASE(inputElem);
- }
- return result;
-}
-
//----------------------------------------------------------------------------------
// Return localised string for resource string (e.g. "Submit" -> "Submit Query")
// This code is derived from nsBookmarksService::Init() and cookie_Localize()
@@ -783,91 +744,6 @@ nsFormControlHelper::GetLocalizedString(const char * aPropFileName, const PRUnic
return rv;
}
-// Return value of disabled attribute or PR_FALSE if none set
-nsresult
-nsFormControlHelper::GetDisabled(nsIContent* aContent, PRBool* oIsDisabled)
-{
- nsCOMPtr formControl = do_QueryInterface(aContent);
- nsHTMLValue value;
- nsresult result = formControl->GetHTMLAttribute(nsHTMLAtoms::disabled, value);
- if (NS_CONTENT_ATTR_HAS_VALUE == result) {
- if (eHTMLUnit_Empty == value.GetUnit()) {
- *oIsDisabled = PR_TRUE;
- } else {
- *oIsDisabled = PR_FALSE;
- }
- } else {
- *oIsDisabled = PR_FALSE;
- }
- return NS_OK;
-}
-
-// manual submission helper method
-// aPresShell - If the PresShell is null then the PresContext will
-// get its own and use itstatic nsresult
-// aFormFrame - The HTML Form's frame
-// aFormControlFrame - The form controls frame that is calling this
-// it can be null
-// aDoSubmit - Submit = TRUE, Reset = FALSE
-// Indicates whether to do DOM Processing of the event or to do regular frame processing
-nsresult
-nsFormControlHelper::DoManualSubmitOrReset(nsIPresContext* aPresContext,
- nsIPresShell* aPresShell,
- nsIFrame* aFormFrame,
- nsIFrame* aFormControlFrame,
- PRBool aDoSubmit,
- PRBool aDoDOMEvent)
-{
- NS_ENSURE_ARG_POINTER(aPresContext);
- NS_ENSURE_ARG_POINTER(aFormFrame);
-
- nsresult result = NS_OK;
-
- nsCOMPtr formContent;
- aFormFrame->GetContent(getter_AddRefs(formContent));
-
- // Here we save a pointer to the form control content
- // so we can get its frame again after the Shell has processed the event.
- //
- // Control's Frame may get destroyed during the processing of the event (by the Shell)
- // meaning: aFormControlFrame becomes invalid, so instead of using aFormControlFrame
- // we use the saved content and the shell to go back and get the frame and
- // use it only if it isn't null
- nsCOMPtr controlContent;
- if (aDoSubmit && aFormControlFrame != nsnull) {
- aFormControlFrame->GetContent(getter_AddRefs(controlContent));
- }
-
- if (formContent) {
- //Either use the PresShell passed in or go get it from the PresContext
- nsCOMPtr shell; // this will do our clean up
- if (aPresShell == nsnull) {
- result = aPresContext->GetShell(getter_AddRefs(shell));
- aPresShell = shell.get(); // not AddRefing because shell will clean up
- }
-
- // With a valid PreShell handle the event
- if (NS_SUCCEEDED(result) && nsnull != aPresShell) {
-
- // Get originator for event (failure is non-fatal)
- nsCOMPtr formControl;
- aFormControlFrame->GetContent(getter_AddRefs(formControl));
-
- nsFormEvent event;
- event.eventStructType = NS_FORM_EVENT;
- event.message = aDoSubmit?NS_FORM_SUBMIT:NS_FORM_RESET;
- event.originator = formControl;
- nsEventStatus status = nsEventStatus_eIgnore;
- if (aDoDOMEvent) {
- aPresShell->HandleDOMEventWithTarget(formContent, &event, &status);
- } else {
- aPresShell->HandleEventWithTarget(&event, nsnull, formContent, NS_EVENT_FLAG_INIT, &status);
- }
- }
- }
- return result;
-}
-
nsresult
nsFormControlHelper::Reset(nsIFrame* aFrame, nsIPresContext* aPresContext)
{
@@ -883,3 +759,19 @@ nsFormControlHelper::Reset(nsIFrame* aFrame, nsIPresContext* aPresContext)
return NS_ERROR_FAILURE;
}
+void
+nsFormControlHelper::StyleChangeReflow(nsIPresContext* aPresContext,
+ nsIFrame* aFrame)
+{
+ nsCOMPtr shell;
+ aPresContext->GetShell(getter_AddRefs(shell));
+
+ nsHTMLReflowCommand* reflowCmd;
+ nsresult rv = NS_NewHTMLReflowCommand(&reflowCmd, aFrame,
+ eReflowType_StyleChanged);
+ if (NS_SUCCEEDED(rv)) {
+ shell->AppendReflowCommand(reflowCmd);
+ }
+}
+
+
diff --git a/mozilla/layout/html/forms/src/nsFormControlHelper.h b/mozilla/layout/html/forms/src/nsFormControlHelper.h
index cfe795743fc..0034a95b940 100644
--- a/mozilla/layout/html/forms/src/nsFormControlHelper.h
+++ b/mozilla/layout/html/forms/src/nsFormControlHelper.h
@@ -39,20 +39,18 @@
#define nsFormControlHelper_h___
#include "nsIFormControlFrame.h"
-#include "nsIFormManager.h"
#include "nsISupports.h"
#include "nsIWidget.h"
#include "nsLeafFrame.h"
#include "nsCoord.h"
-#include "nsIStyleContext.h"
-#include "nsIPresContext.h"
+#include "nsHTMLAtoms.h"
+#include "nsINameSpaceManager.h"
class nsIView;
-//class nsIPresContext;
+class nsIPresContext;
class nsStyleCoord;
-class nsFormFrame;
class nsIPresState;
-//class nsIStyleContext;
+class nsIStyleContext;
#define CSS_NOTSET -1
#define ATTR_NOTSET -1
@@ -156,27 +154,43 @@ public:
// Map platform line endings (CR, CRLF, LF) to DOM line endings (LF)
static void PlatformToDOMLineBreaks(nsString &aString);
- static nsresult GetValue(nsIContent* aContent, nsAString* aResult);
+ /**
+ * Get whether a form control is disabled
+ * @param aContent the content of the form control in question
+ * @return whether the form control is disabled
+ */
+ static PRBool GetDisabled(nsIContent* aContent) {
+ return aContent->HasAttr(kNameSpaceID_None, nsHTMLAtoms::disabled);
+ };
+ /**
+ * Get the name of the form control
+ * @param aContent the content to get the name of
+ * @param aResult the returned name of the form control [OUT]
+ * @return NS_CONTENT_ATTR_HAS_VALUE if things go well
+ * @return NS_CONTENT_ATTR_NOT_THERE if the name attribute is undefined
+ * @return NS_FORM_NOTOK if aContent is null or is not HTML content
+ */
static nsresult GetName(nsIContent* aContent, nsAString* aResult);
- static nsresult GetInputElementValue(nsIContent* aContent, nsString* aText, PRBool aInitialValue);
+ /**
+ * Cause the form control to reset its value
+ * @param aFrame the frame who owns the form control
+ * @param aPresContext the pres context
+ */
static nsresult Reset(nsIFrame* aFrame, nsIPresContext* aPresContext);
- /**
- * Utility to convert a string to a PRBool
- * @param aValue string to convert to a PRBool
- * @returns PR_TRUE if aValue = "1", PR_FALSE otherwise
- */
-
+ /**
+ * Utility to convert a string to a PRBool
+ * @param aValue string to convert to a PRBool
+ * @returns PR_TRUE if aValue = "1", PR_FALSE otherwise
+ */
static PRBool GetBool(const nsAString& aValue);
- /**
- * Utility to convert a PRBool to a string
- * @param aValue Boolean value to convert to string.
- * @param aResult string to hold the boolean value. It is set to "1"
- * if aValue equals PR_TRUE, "0" if aValue equals PR_FALSE.
-
- */
-
+ /**
+ * Utility to convert a PRBool to a string
+ * @param aValue Boolean value to convert to string.
+ * @param aResult string to hold the boolean value. It is set to "1"
+ * if aValue equals PR_TRUE, "0" if aValue equals PR_FALSE.
+ */
static void GetBoolString(const PRBool aValue, nsAString& aResult);
static void GetRepChars(char& char1, char& char2) {
@@ -202,16 +216,6 @@ public:
static nsresult GetLocalizedString(const char * aPropFileName, const PRUnichar* aKey, nsString& oVal);
static const char * GetHTMLPropertiesFileName() { return FORM_PROPERTIES; }
- static nsresult GetDisabled(nsIContent* aContent, PRBool* oIsDisabled);
-
- // If the PresShell is null then the PresContext will get its own and use it
- static nsresult DoManualSubmitOrReset(nsIPresContext* aPresContext,
- nsIPresShell* aPresShell,
- nsIFrame* aFormFrame,
- nsIFrame* aFormControlFrame,
- PRBool aDoSubmit, // Submit = TRUE, Reset = FALSE
- PRBool aDoDOMEvent);
-
//
//-------------------------------------------------------------------------------------
// Utility methods for managing checkboxes and radiobuttons
@@ -355,6 +359,9 @@ public:
nsIStyleContext* aStyleContext, nsString& aLabel,
nsIFrame* aForFrame);
+ static void StyleChangeReflow(nsIPresContext* aPresContext,
+ nsIFrame* aFrame);
+
protected:
nsFormControlHelper();
virtual ~nsFormControlHelper();
diff --git a/mozilla/layout/html/forms/src/nsGfxButtonControlFrame.cpp b/mozilla/layout/html/forms/src/nsGfxButtonControlFrame.cpp
index 7ad9224a4d9..42992983f58 100644
--- a/mozilla/layout/html/forms/src/nsGfxButtonControlFrame.cpp
+++ b/mozilla/layout/html/forms/src/nsGfxButtonControlFrame.cpp
@@ -49,6 +49,7 @@
#include "nsIServiceManager.h"
#include "nsIDOMNode.h"
#include "nsLayoutAtoms.h"
+#include "nsReflowPath.h"
// MouseEvent suppression in PP
#include "nsGUIEvent.h"
@@ -538,13 +539,7 @@ nsGfxButtonControlFrame::Reflow(nsIPresContext* aPresContext,
DO_GLOBAL_REFLOW_COUNT("nsGfxButtonControlFrame", aReflowState.reason);
DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus);
- // The mFormFrame is set in the initial reflow within nsHTMLButtonControlFrame
nsresult rv = NS_OK;
- if (eReflowReason_Initial == aReflowState.reason) {
- if (!mFormFrame) {
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*, this));
- }
- }
#if 0
nsresult skiprv = nsFormControlFrame::SkipResizeReflow(mCacheSize, mCachedMaxElementSize, aPresContext,
diff --git a/mozilla/layout/html/forms/src/nsGfxCheckboxControlFrame.cpp b/mozilla/layout/html/forms/src/nsGfxCheckboxControlFrame.cpp
index 89dcf110a43..d0150eabd68 100644
--- a/mozilla/layout/html/forms/src/nsGfxCheckboxControlFrame.cpp
+++ b/mozilla/layout/html/forms/src/nsGfxCheckboxControlFrame.cpp
@@ -39,7 +39,6 @@
#include "nsICheckButton.h"
#include "nsHTMLAtoms.h"
#include "nsHTMLParts.h"
-#include "nsFormFrame.h"
#include "nsIFormControl.h"
#include "nsIContent.h"
#include "nsIComponentManager.h"
@@ -54,6 +53,7 @@
#endif
#include "nsIServiceManager.h"
#include "nsIDOMNode.h"
+#include "nsIDOMHTMLInputElement.h"
//------------------------------------------------------------
diff --git a/mozilla/layout/html/forms/src/nsGfxRadioControlFrame.cpp b/mozilla/layout/html/forms/src/nsGfxRadioControlFrame.cpp
index ab541bb0515..62cd0413829 100644
--- a/mozilla/layout/html/forms/src/nsGfxRadioControlFrame.cpp
+++ b/mozilla/layout/html/forms/src/nsGfxRadioControlFrame.cpp
@@ -38,7 +38,6 @@
#include "nsGfxRadioControlFrame.h"
#include "nsHTMLAtoms.h"
#include "nsHTMLParts.h"
-#include "nsFormFrame.h"
#include "nsIFormControl.h"
#include "nsIContent.h"
#include "nsWidgetsCID.h"
diff --git a/mozilla/layout/html/forms/src/nsGfxTextControlFrame2.cpp b/mozilla/layout/html/forms/src/nsGfxTextControlFrame2.cpp
index 38894b4e389..4e4e754a583 100644
--- a/mozilla/layout/html/forms/src/nsGfxTextControlFrame2.cpp
+++ b/mozilla/layout/html/forms/src/nsGfxTextControlFrame2.cpp
@@ -58,7 +58,6 @@
#include "nsIEditorController.h"
#include "nsIElementFactory.h"
#include "nsIHTMLContent.h"
-#include "nsFormFrame.h"
#include "nsIEditorIMESupport.h"
#include "nsIEditorObserver.h"
#include "nsIDOMHTMLTextAreaElement.h"
@@ -228,7 +227,6 @@ protected:
protected:
nsGfxTextControlFrame2* mFrame; // weak reference
- nsString mFocusedValue;
PRPackedBool mSelectionWasCollapsed;
PRPackedBool mKnowSelectionCollapsed;
@@ -317,33 +315,6 @@ nsTextInputListener::KeyPress(nsIDOMEvent* aKeyEvent)
mFrame->SetValueChanged(PR_TRUE);
- if (mFrame && mFrame->IsSingleLineTextControl())
- {
- PRUint32 keyCode;
- keyEvent->GetKeyCode(&keyCode);
-
- if (nsIDOMKeyEvent::DOM_VK_RETURN==keyCode ||
- nsIDOMKeyEvent::DOM_VK_ENTER==keyCode)
- {
- nsAutoString curValue;
- mFrame->GetText(&curValue);
-
- // If the text control's contents have changed, fire
- // off an onChange().
-
- if (!mFocusedValue.Equals(curValue))
- {
- mFocusedValue = curValue;
- mFrame->CallOnChange();
- }
-
- // Now try to submit the form. Be sure to check mFrame again
- // since CallOnChange() may have caused the deletion of mFrame.
-
- if (mFrame)
- mFrame->SubmitAttempt();
- }
- }
return NS_OK;
}
@@ -427,38 +398,26 @@ nsTextInputListener::Focus(nsIDOMEvent* aEvent)
if (!mFrame) return NS_OK;
nsCOMPtr editor;
mFrame->GetEditor(getter_AddRefs(editor));
- if (editor)
- {
+ if (editor) {
editor->AddEditorObserver(this);
}
- nsresult rv = mFrame->GetText(&mFocusedValue);
- if (NS_FAILED(rv)) return rv;
-
- return NS_OK;
+ return mFrame->InitFocusedValue();
}
nsresult
-nsTextInputListener::Blur (nsIDOMEvent* aEvent)
+nsTextInputListener::Blur(nsIDOMEvent* aEvent)
{
if (!mFrame)
return NS_OK;
- nsAutoString blurValue;
nsCOMPtr editor;
mFrame->GetEditor(getter_AddRefs(editor));
- if (editor)
- {
+ if (editor) {
editor->RemoveEditorObserver(this);
-
- }
- mFrame->GetText(&blurValue);
- if (!mFocusedValue.Equals(blurValue))//different fire onchange
- {
- mFocusedValue = blurValue;
- mFrame->CallOnChange();
}
- return NS_OK;
+
+ return mFrame->CheckFireOnChange();
}
//END focuslistener
@@ -1357,7 +1316,6 @@ nsGfxTextControlFrame2::nsGfxTextControlFrame2(nsIPresShell* aShell):nsStackFram
mUseEditor = PR_FALSE;
mIsProcessing = PR_FALSE;
mNotifyOnInput = PR_FALSE;
- mFormFrame = nsnull;
mSuggestedWidth = NS_FORMSIZE_NOTSET;
mSuggestedHeight = NS_FORMSIZE_NOTSET;
mScrollableView = nsnull;
@@ -1475,12 +1433,6 @@ nsGfxTextControlFrame2::PreDestroy(nsIPresContext* aPresContext)
//unregister self from content
mTextListener->SetFrame(nsnull);
nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_FALSE);
- if (mFormFrame)
- {
- mFormFrame->RemoveFormControlFrame(*this);
- mFormFrame = nsnull;
- mTextListener->SetFrame(nsnull);
- }
if (mTextListener)
{
nsCOMPtr erP = do_QueryInterface(mContent);
@@ -1804,7 +1756,7 @@ nsGfxTextControlFrame2::CreateFrameFor(nsIPresContext* aPresContext,
}
nsresult
-nsGfxTextControlFrame2::SetInitialValue()
+nsGfxTextControlFrame2::InitEditor()
{
// This method must be called during/after the text
// control frame's initial reflow to avoid any unintened
@@ -2241,12 +2193,11 @@ nsGfxTextControlFrame2::Reflow(nsIPresContext* aPresContext,
DO_GLOBAL_REFLOW_COUNT("nsGfxTextControlFrame2", aReflowState.reason);
DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus);
- SetInitialValue();
+ InitEditor();
// make sure the the form registers itself on the initial/first reflow
if (mState & NS_FRAME_FIRST_REFLOW) {
nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_TRUE);
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*, this));
mNotifyOnInput = PR_TRUE;//its ok to notify now. all has been prepared.
}
@@ -2341,7 +2292,7 @@ nsGfxTextControlFrame2::GetPrefSize(nsBoxLayoutState& aState, nsSize& aSize)
if (!aReflowState)
return NS_OK;
- SetInitialValue();
+ InitEditor();
if (mState & NS_FRAME_FIRST_REFLOW)
mNotifyOnInput = PR_TRUE;//its ok to notify now. all has been prepared.
@@ -2410,12 +2361,6 @@ nsGfxTextControlFrame2::GetAscent(nsBoxLayoutState& aState, nscoord& aAscent)
return rv;
}
-PRIntn
-nsGfxTextControlFrame2::GetSkipSides() const
-{
- return 0;
-}
-
//IMPLEMENTING NS_IFORMCONTROLFRAME
NS_IMETHODIMP
nsGfxTextControlFrame2::GetName(nsAString* aResult)
@@ -2522,13 +2467,6 @@ nsGfxTextControlFrame2::GetHorizontalInsidePadding(nsIPresContext* aPresContext,
}
-void
-nsGfxTextControlFrame2::SetFormFrame(nsFormFrame* aFormFrame)
-{
- mFormFrame = aFormFrame;
-}
-
-
NS_IMETHODIMP
nsGfxTextControlFrame2::SetSuggestedSize(nscoord aWidth, nscoord aHeight)
{
@@ -2961,7 +2899,7 @@ nsGfxTextControlFrame2::AttributeChanged(nsIPresContext* aPresContext,
// XXX If this should happen when value= attribute is set, shouldn't it
// happen when .value is set too?
if (aHint != NS_STYLE_HINT_REFLOW)
- nsFormFrame::StyleChangeReflow(aPresContext, this);
+ nsFormControlHelper::StyleChangeReflow(aPresContext, this);
}
else if (nsHTMLAtoms::maxlength == aAttribute)
{
@@ -3041,7 +2979,7 @@ nsGfxTextControlFrame2::AttributeChanged(nsIPresContext* aPresContext,
// but it appears there are some problems when you hold down the return key
mPrefSize.width = -1;
mPrefSize.height = -1;
- nsFormFrame::StyleChangeReflow(aPresContext, this);
+ nsFormControlHelper::StyleChangeReflow(aPresContext, this);
}
// Allow the base class to handle common attributes supported
// by all form elements...
@@ -3090,7 +3028,7 @@ void nsGfxTextControlFrame2::RemoveNewlines(nsString &aString)
}
-NS_IMETHODIMP
+nsresult
nsGfxTextControlFrame2::GetMaxLength(PRInt32* aSize)
{
*aSize = -1;
@@ -3108,7 +3046,7 @@ nsGfxTextControlFrame2::GetMaxLength(PRInt32* aSize)
return rv;
}
-NS_IMETHODIMP
+nsresult
nsGfxTextControlFrame2::DoesAttributeExist(nsIAtom *aAtt)
{
nsresult rv = NS_CONTENT_ATTR_NOT_THERE;
@@ -3122,57 +3060,6 @@ nsGfxTextControlFrame2::DoesAttributeExist(nsIAtom *aAtt)
return rv;
}
-void
-nsGfxTextControlFrame2::SubmitAttempt()
-{
- // Submit the form
- PRInt32 type;
- GetType(&type);
- if (mFormFrame && mTextSelImpl && NS_FORM_TEXTAREA != type) {
- nsWeakPtr &shell = mTextSelImpl->GetPresShell();
- nsCOMPtr presShell = do_QueryReferent(shell);
- if (!presShell) return;
- {
- nsCOMPtr context;
- if (NS_SUCCEEDED(presShell->GetPresContext(getter_AddRefs(context))) && context)
- {
- /*
- * We got here because somebody pressed in a text
- * input.
- *
- * Bug 99920 and bug 109463 -- Find the first submit button
- * and how many text inputs there are. If there is only one
- * text input, submit the form but do _not_ send the submit
- * button value (if any). If there are multiple text inputs,
- * we must have a submit button to submit and we want to
- * trigger a click event on the submit button. Triggering
- * this click eevent will fire the button's onclick handler
- * and submit the form.
- */
- PRInt32 inputTxtCnt;
- nsIFrame* submitBtn = mFormFrame->GetFirstSubmitButtonAndTxtCnt(inputTxtCnt);
- if (submitBtn && inputTxtCnt > 1) {
- // IE actually fires the button's onclick handler. Dispatch
- // the click event and let the button handle submitting the
- // form.
- nsCOMPtr buttonContent;
- submitBtn->GetContent(getter_AddRefs(buttonContent));
- nsGUIEvent event;
- event.eventStructType = NS_MOUSE_EVENT;
- event.message = NS_MOUSE_LEFT_CLICK;
- event.widget = nsnull;
- nsEventStatus status = nsEventStatus_eIgnore;
- presShell->HandleDOMEventWithTarget(buttonContent, &event, &status);
- } else if (inputTxtCnt == 1) {
- // do Submit & Frame processing of event
- nsFormControlHelper::DoManualSubmitOrReset(context, presShell, mFormFrame,
- this, PR_TRUE, PR_FALSE);
- }
- }
- }
- }
-}
-
// this is where we propagate a content changed event
NS_IMETHODIMP
nsGfxTextControlFrame2::InternalContentChanged()
@@ -3204,9 +3091,27 @@ nsGfxTextControlFrame2::InternalContentChanged()
return NS_ERROR_FAILURE;
}
+nsresult
+nsGfxTextControlFrame2::InitFocusedValue()
+{
+ return GetText(&mFocusedValue);
+}
NS_IMETHODIMP
-nsGfxTextControlFrame2::CallOnChange()
+nsGfxTextControlFrame2::CheckFireOnChange()
+{
+ nsString value;
+ GetText(&value);
+ if (!mFocusedValue.Equals(value))//different fire onchange
+ {
+ mFocusedValue = value;
+ FireOnChange();
+ }
+ return NS_OK;
+}
+
+nsresult
+nsGfxTextControlFrame2::FireOnChange()
{
// Dispatch th1e change event
nsCOMPtr content;
@@ -3226,8 +3131,7 @@ nsGfxTextControlFrame2::CallOnChange()
// Have the content handle the event.
nsWeakPtr &shell = mTextSelImpl->GetPresShell();
nsCOMPtr presShell = do_QueryReferent(shell);
- if (!presShell)
- return NS_ERROR_FAILURE;
+ NS_ENSURE_TRUE(presShell, NS_ERROR_FAILURE);
nsCOMPtr context;
if (NS_SUCCEEDED(presShell->GetPresContext(getter_AddRefs(context))) && context)
return presShell->HandleEventWithTarget(&event, nsnull, mContent, NS_EVENT_FLAG_INIT, &status);
diff --git a/mozilla/layout/html/forms/src/nsGfxTextControlFrame2.h b/mozilla/layout/html/forms/src/nsGfxTextControlFrame2.h
index ca7a8ea3f30..8c16344e1bf 100644
--- a/mozilla/layout/html/forms/src/nsGfxTextControlFrame2.h
+++ b/mozilla/layout/html/forms/src/nsGfxTextControlFrame2.h
@@ -52,7 +52,6 @@
#include "nsIScrollableViewProvider.h"
class nsIPresState;
-class nsFormFrame;
class nsISupportsArray;
class nsIHTMLContent;
class nsIEditor;
@@ -132,7 +131,6 @@ public:
virtual void SetFocus(PRBool aOn , PRBool aRepaint);
virtual void ScrollIntoView(nsIPresContext* aPresContext);
virtual void MouseClicked(nsIPresContext* aPresContext);
- virtual void SetFormFrame(nsFormFrame* aFrame);
virtual nscoord GetVerticalInsidePadding(nsIPresContext* aPresContext,
float aPixToTwip,
nscoord aInnerHeight) const;
@@ -158,6 +156,7 @@ public:
NS_IMETHOD OwnsValue(PRBool* aOwnsValue);
NS_IMETHOD GetValue(nsAString& aValue, PRBool aIgnoreWrap);
NS_IMETHOD GetTextLength(PRInt32* aTextLength);
+ NS_IMETHOD CheckFireOnChange();
NS_IMETHOD SetSelectionStart(PRInt32 aSelectionStart);
NS_IMETHOD SetSelectionEnd(PRInt32 aSelectionEnd);
NS_IMETHOD SetSelectionRange(PRInt32 aSelectionStart, PRInt32 aSelectionEnd);
@@ -182,23 +181,66 @@ public:
public: //for methods who access nsGfxTextControlFrame2 directly
- void SubmitAttempt();
NS_IMETHOD InternalContentChanged();//notify that we have some kind of change.
- NS_IMETHOD CallOnChange();
+ /**
+ * Find out whether this is a single line text control. (text or password)
+ * @return whether this is a single line text control
+ */
virtual PRBool IsSingleLineTextControl() const;
+ /**
+ * Find out whether this control edits plain text. (Currently always true.)
+ * @return whether this is a plain text control
+ */
virtual PRBool IsPlainTextControl() const;
+ /**
+ * Find out whether this is a password control (input type=password)
+ * @return whether this is a password ontrol
+ */
virtual PRBool IsPasswordTextControl() const;
void SetValueChanged(PRBool aValueChanged);
+ /** Called when the frame is focused, to remember the value for onChange. */
+ nsresult InitFocusedValue();
protected:
+ /**
+ * Find out whether this control is scrollable (i.e. if it is not a single
+ * line text control)
+ * @return whether this control is scrollable
+ */
PRBool IsScrollable() const;
- nsresult SetInitialValue();
- virtual PRIntn GetSkipSides() const;
+ /**
+ * Initialize mEditor with the proper flags and the default value.
+ * @throws NS_ERROR_NOT_INITIALIZED if mEditor has not been created
+ * @throws various and sundry other things
+ */
+ nsresult InitEditor();
+ /**
+ * Strip all \n, \r and nulls from the given string
+ * @param aString the string to remove newlines from [in/out]
+ */
void RemoveNewlines(nsString &aString);
- NS_IMETHOD GetMaxLength(PRInt32* aSize);
- NS_IMETHOD DoesAttributeExist(nsIAtom *aAtt);
- void PreDestroy(nsIPresContext* aPresContext); // remove yourself as a form control
+ /**
+ * Get the maxlength attribute
+ * @param aMaxLength the value of the max length attr
+ * @throws NS_CONTENT_ATTR_NOT_THERE if attr not defined
+ */
+ nsresult GetMaxLength(PRInt32* aMaxLength);
+ /**
+ * Find out whether an attribute exists on the content or not.
+ * @param aAtt the attribute to determine the existence of
+ * @throws NS_CONTENT_ATTR_NOT_THERE if it does not exist
+ */
+ nsresult DoesAttributeExist(nsIAtom *aAtt);
+ /**
+ * We call this when we are being destroyed or removed from the PFM.
+ * @param aPresContext the current pres context
+ */
+ void PreDestroy(nsIPresContext* aPresContext);
+ /**
+ * Fire the onChange event.
+ */
+ nsresult FireOnChange();
//helper methods
nsresult GetSizeFromContent(PRInt32* aSize) const;
@@ -265,10 +307,10 @@ private:
PRPackedBool mNotifyOnInput;//default this to off to stop any notifications until setup is complete
PRPackedBool mDidPreDestroy; // has PreDestroy been called
- nsFormFrame *mFormFrame;
nsTextInputSelectionImpl *mTextSelImpl;
nsTextInputListener *mTextListener;
nsIScrollableView *mScrollableView;
+ nsString mFocusedValue;
};
#endif
diff --git a/mozilla/layout/html/forms/src/nsHTMLButtonControlFrame.cpp b/mozilla/layout/html/forms/src/nsHTMLButtonControlFrame.cpp
index de537912a6e..23e74932e20 100644
--- a/mozilla/layout/html/forms/src/nsHTMLButtonControlFrame.cpp
+++ b/mozilla/layout/html/forms/src/nsHTMLButtonControlFrame.cpp
@@ -43,7 +43,6 @@
#include "nsIFormControlFrame.h"
#include "nsHTMLParts.h"
#include "nsIFormControl.h"
-#include "nsFormFrame.h"
#include "nsIRenderingContext.h"
#include "nsIPresContext.h"
@@ -68,6 +67,8 @@
#include "nsFormControlFrame.h"
#include "nsIFrameManager.h"
#include "nsINameSpaceManager.h"
+#include "nsReflowPath.h"
+#include "nsIServiceManager.h"
#ifdef ACCESSIBILITY
#include "nsIAccessibilityService.h"
#endif
@@ -114,10 +115,6 @@ NS_IMETHODIMP
nsHTMLButtonControlFrame::Destroy(nsIPresContext *aPresContext)
{
nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_FALSE);
- if (mFormFrame) {
- mFormFrame->RemoveFormControlFrame(*this);
- mFormFrame = nsnull;
- }
return nsHTMLContainerFrame::Destroy(aPresContext);
}
@@ -373,9 +370,6 @@ nsHTMLButtonControlFrame::SetInitialChildList(nsIPresContext* aPresContext,
nsIAtom* aListName,
nsIFrame* aChildList)
{
- // add ourself as an nsIFormControlFrame
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*, this));
-
// get the frame manager and the style context of the new parent frame
// this is used whent he children are reparented below
// NOTE: the whole reparenting should not need to happen: see bugzilla bug 51767
@@ -500,9 +494,8 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext,
DO_GLOBAL_REFLOW_COUNT("nsHTMLButtonControlFrame", aReflowState.reason);
DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus);
- if (!mFormFrame && (eReflowReason_Initial == aReflowState.reason)) {
+ if (eReflowReason_Initial == aReflowState.reason) {
nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_TRUE);
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*, this));
}
#if 0
@@ -604,8 +597,10 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext,
0, aStatus);
// calculate the min internal size so the contents gets centered correctly
- nscoord minInternalWidth = aReflowState.mComputedMinWidth == 0?0:aReflowState.mComputedMinWidth -
- (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right);
+ // minInternalWidth is not being used at all and causes a warning--commenting
+ // out until someone wants it.
+ // nscoord minInternalWidth = aReflowState.mComputedMinWidth == 0?0:aReflowState.mComputedMinWidth -
+ // (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right);
nscoord minInternalHeight = aReflowState.mComputedMinHeight == 0?0:aReflowState.mComputedMinHeight -
(aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom);
diff --git a/mozilla/layout/html/forms/src/nsHTMLButtonControlFrame.h b/mozilla/layout/html/forms/src/nsHTMLButtonControlFrame.h
index 9aa093d4536..a2ac8f9c034 100644
--- a/mozilla/layout/html/forms/src/nsHTMLButtonControlFrame.h
+++ b/mozilla/layout/html/forms/src/nsHTMLButtonControlFrame.h
@@ -44,7 +44,6 @@
#include "nsIFormControlFrame.h"
#include "nsHTMLParts.h"
#include "nsIFormControl.h"
-#include "nsFormFrame.h"
#include "nsIRenderingContext.h"
#include "nsIPresContext.h"
@@ -132,7 +131,6 @@ public:
NS_IMETHOD GetName(nsAString* aName);
NS_IMETHOD GetValue(nsAString* aName);
virtual void MouseClicked(nsIPresContext* aPresContext);
- virtual void SetFormFrame(nsFormFrame* aFormFrame) { mFormFrame = aFormFrame; }
NS_IMETHOD OnContentReset();
void SetFocus(PRBool aOn, PRBool aRepaint);
@@ -168,7 +166,6 @@ protected:
PRIntn GetSkipSides() const;
PRBool mInline;
- nsFormFrame* mFormFrame;
nsCursor mPreviousCursor;
nsRect mTranslatedRect;
PRBool mDidInit;
diff --git a/mozilla/layout/html/forms/src/nsImageControlFrame.cpp b/mozilla/layout/html/forms/src/nsImageControlFrame.cpp
index 542caa44f1d..f11c281bacb 100644
--- a/mozilla/layout/html/forms/src/nsImageControlFrame.cpp
+++ b/mozilla/layout/html/forms/src/nsImageControlFrame.cpp
@@ -57,10 +57,10 @@
#include "nsIImage.h"
#include "nsStyleUtil.h"
#include "nsStyleConsts.h"
-#include "nsFormFrame.h"
#include "nsFormControlFrame.h"
#include "nsGUIEvent.h"
#include "nsLayoutAtoms.h"
+#include "nsIServiceManager.h"
#ifdef ACCESSIBILITY
#include "nsIAccessibilityService.h"
#endif
@@ -121,8 +121,6 @@ public:
virtual void MouseClicked(nsIPresContext* aPresContext);
- virtual void SetFormFrame(nsFormFrame* aFormFrame) { mFormFrame = aFormFrame; }
-
NS_IMETHOD GetType(PRInt32* aType) const;
NS_IMETHOD GetName(nsAString* aName);
@@ -159,7 +157,6 @@ protected:
NS_IMETHOD_(nsrefcnt) AddRef(void);
NS_IMETHOD_(nsrefcnt) Release(void);
- nsFormFrame* mFormFrame;
nsMouseState mLastMouseState;
nsPoint mLastClickPoint;
nsCursor mPreviousCursor;
@@ -176,7 +173,6 @@ nsImageControlFrame::nsImageControlFrame()
mPreviousCursor = eCursor_standard;
mTranslatedRect = nsRect(0,0,0,0);
mGotFocus = PR_FALSE;
- mFormFrame = nsnull;
}
nsImageControlFrame::~nsImageControlFrame()
@@ -188,10 +184,6 @@ nsImageControlFrame::Destroy(nsIPresContext *aPresContext)
{
nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_FALSE);
- if (mFormFrame) {
- mFormFrame->RemoveFormControlFrame(*this);
- mFormFrame = nsnull;
- }
return nsImageControlFrameSuper::Destroy(aPresContext);
}
@@ -313,10 +305,8 @@ nsImageControlFrame::Reflow(nsIPresContext* aPresContext,
{
DO_GLOBAL_REFLOW_COUNT("nsImageControlFrame", aReflowState.reason);
DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus);
- if (!mFormFrame && (eReflowReason_Initial == aReflowState.reason)) {
+ if (aReflowState.reason == eReflowReason_Initial) {
nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_TRUE);
- // add ourself as an nsIFormControlFrame
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*, this));
}
return nsImageControlFrameSuper::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus);
}
@@ -339,7 +329,7 @@ nsImageControlFrame::HandleEvent(nsIPresContext* aPresContext,
if (uiStyle->mUserInput == NS_STYLE_USER_INPUT_NONE || uiStyle->mUserInput == NS_STYLE_USER_INPUT_DISABLED)
return nsFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
- if (nsFormFrame::GetDisabled(this)) { // XXX cache disabled
+ if (nsFormControlHelper::GetDisabled(mContent)) { // XXX cache disabled
return NS_OK;
}
@@ -414,7 +404,7 @@ nsImageControlFrame::GetName(nsAString* aResult)
if (nsnull == aResult) {
return NS_OK;
} else {
- return nsFormFrame::GetName(this, *aResult);
+ return nsFormControlHelper::GetName(mContent, aResult);
}
}
diff --git a/mozilla/layout/html/forms/src/nsListControlFrame.cpp b/mozilla/layout/html/forms/src/nsListControlFrame.cpp
index 910a18069de..d74e4deed9c 100644
--- a/mozilla/layout/html/forms/src/nsListControlFrame.cpp
+++ b/mozilla/layout/html/forms/src/nsListControlFrame.cpp
@@ -54,7 +54,6 @@
#include "nsIDOMHTMLOptionElement.h"
#include "nsIComboboxControlFrame.h"
#include "nsIViewManager.h"
-#include "nsFormFrame.h"
#include "nsIScrollableView.h"
#include "nsIDOMHTMLOptGroupElement.h"
#include "nsWidgetsCID.h"
@@ -77,6 +76,7 @@
#include "nsIDOMEventTarget.h"
#include "nsIDOMNSEvent.h"
#include "nsGUIEvent.h"
+#include "nsIServiceManager.h"
#ifdef ACCESSIBILITY
#include "nsIAccessibilityService.h"
#endif
@@ -84,6 +84,7 @@
#include "nsIPrivateDOMEvent.h"
#include "nsCSSRendering.h"
#include "nsILookAndFeel.h"
+#include "nsReflowPath.h"
// Timer Includes
#include "nsITimer.h"
@@ -393,7 +394,6 @@ nsListControlFrame::nsListControlFrame()
: mWeakReferent(this)
{
mComboboxFrame = nsnull;
- mFormFrame = nsnull;
mButtonDown = PR_FALSE;
mMaxWidth = 0;
mMaxHeight = 0;
@@ -433,10 +433,6 @@ nsListControlFrame::~nsListControlFrame()
}
mComboboxFrame = nsnull;
- if (mFormFrame) {
- mFormFrame->RemoveFormControlFrame(*this);
- mFormFrame = nsnull;
- }
NS_IF_RELEASE(mPresContext);
}
@@ -920,9 +916,8 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext,
// Add the list frame as a child of the form
if (eReflowReason_Initial == aReflowState.reason) {
- if (IsInDropDownMode() == PR_FALSE && !mFormFrame) {
+ if (!IsInDropDownMode()) {
nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_TRUE);
- nsFormFrame::AddFormControlFrame(aPresContext, *NS_STATIC_CAST(nsIFrame*, this));
}
}
@@ -1604,7 +1599,7 @@ nsListControlFrame::HandleEvent(nsIPresContext* aPresContext,
if (uiStyle->mUserInput == NS_STYLE_USER_INPUT_NONE || uiStyle->mUserInput == NS_STYLE_USER_INPUT_DISABLED)
return nsFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
- if (nsFormFrame::GetDisabled(this))
+ if (nsFormControlHelper::GetDisabled(mContent))
return NS_OK;
switch (aEvent->message) {
@@ -1929,13 +1924,6 @@ nsListControlFrame::GetType(PRInt32* aType) const
return NS_OK;
}
-//---------------------------------------------------------
-void
-nsListControlFrame::SetFormFrame(nsFormFrame* aFormFrame)
-{
- mFormFrame = aFormFrame;
-}
-
//---------------------------------------------------------
void
@@ -2742,7 +2730,7 @@ nsListControlFrame::MouseUp(nsIDOMEvent* aMouseEvent)
mButtonDown = PR_FALSE;
- if (nsFormFrame::GetDisabled(this)) {
+ if (nsFormControlHelper::GetDisabled(mContent)) {
return NS_OK;
}
@@ -2927,7 +2915,7 @@ nsListControlFrame::MouseDown(nsIDOMEvent* aMouseEvent)
mButtonDown = PR_TRUE;
- if (nsFormFrame::GetDisabled(this)) {
+ if (nsFormControlHelper::GetDisabled(mContent)) {
return NS_OK;
}
@@ -3250,7 +3238,7 @@ nsListControlFrame::KeyPress(nsIDOMEvent* aKeyEvent)
{
NS_ASSERTION(aKeyEvent != nsnull, "keyEvent is null.");
- if (nsFormFrame::GetDisabled(this))
+ if (nsFormControlHelper::GetDisabled(mContent))
return NS_OK;
nsresult rv = NS_ERROR_FAILURE;
diff --git a/mozilla/layout/html/forms/src/nsListControlFrame.h b/mozilla/layout/html/forms/src/nsListControlFrame.h
index 49b3b4cd391..51ccb93f33b 100644
--- a/mozilla/layout/html/forms/src/nsListControlFrame.h
+++ b/mozilla/layout/html/forms/src/nsListControlFrame.h
@@ -242,7 +242,6 @@ public:
virtual void SetFocus(PRBool aOn = PR_TRUE, PRBool aRepaint = PR_FALSE);
virtual void ScrollIntoView(nsIPresContext* aPresContext);
virtual void MouseClicked(nsIPresContext* aPresContext);
- virtual void SetFormFrame(nsFormFrame* aFrame);
virtual nscoord GetVerticalInsidePadding(nsIPresContext* aPresContext,
float aPixToTwip,
nscoord aInnerHeight) const;
@@ -381,8 +380,6 @@ protected:
void ItemsHaveBeenRemoved(nsIPresContext * aPresContext);
// Data Members
- nsFormFrame* mFormFrame;
-
PRInt32 mStartSelectionIndex;
PRInt32 mEndSelectionIndex;
PRPackedBool mChangesSinceDragStart;
diff --git a/mozilla/layout/macbuild/layout.xml b/mozilla/layout/macbuild/layout.xml
index e5e6d7a2f22..e2130e9acf4 100644
--- a/mozilla/layout/macbuild/layout.xml
+++ b/mozilla/layout/macbuild/layout.xml
@@ -1158,13 +1158,6 @@
Text
Debug
-
- Name
- nsFormFrame.cpp
- MacOS
- Text
- Debug
-
Name
nsFormControlFrame.cpp
@@ -2304,11 +2297,6 @@
nsHTMLReflowState.cpp
MacOS
-
- Name
- nsFormFrame.cpp
- MacOS
-
Name
nsFormControlFrame.cpp
@@ -4081,13 +4069,6 @@
Text
Debug
-
- Name
- nsFormFrame.cpp
- MacOS
- Text
- Debug
-
Name
nsFormControlFrame.cpp
@@ -5247,11 +5228,6 @@
nsHTMLReflowState.cpp
MacOS
-
- Name
- nsFormFrame.cpp
- MacOS
-
Name
nsFormControlFrame.cpp
@@ -6368,12 +6344,6 @@
nsFileControlFrame.cpp
MacOS
-
- layout.shlb
- Name
- nsFormFrame.cpp
- MacOS
-
layout.shlb
Name