Bug 1721349 - Move mSubmitter from HTMLFormSubmission to FormData and make it participate in cycle collection; r=mccr8

Differential Revision: https://phabricator.services.mozilla.com/D120334
This commit is contained in:
Edgar Chen
2021-07-21 09:52:20 +00:00
parent ad9339a492
commit 2a45c41a27
20 changed files with 66 additions and 76 deletions

View File

@@ -18,13 +18,15 @@ using namespace mozilla::dom;
FormData::FormData(nsISupports* aOwner, NotNull<const Encoding*> aEncoding,
Element* aSubmitter)
: HTMLFormSubmission(nullptr, u""_ns, aEncoding, aSubmitter),
mOwner(aOwner) {}
: HTMLFormSubmission(nullptr, u""_ns, aEncoding),
mOwner(aOwner),
mSubmitter(aSubmitter) {}
FormData::FormData(const FormData& aFormData)
: HTMLFormSubmission(aFormData.mActionURL, aFormData.mTarget,
aFormData.mEncoding, aFormData.mSubmitter) {
aFormData.mEncoding) {
mOwner = aFormData.mOwner;
mSubmitter = aFormData.mSubmitter;
mFormData = aFormData.mFormData.Clone();
}
@@ -71,6 +73,7 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(FormData)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(FormData)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mOwner)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mSubmitter)
for (uint32_t i = 0, len = tmp->mFormData.Length(); i < len; ++i) {
ImplCycleCollectionUnlink(tmp->mFormData[i].value);
@@ -81,6 +84,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(FormData)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwner)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSubmitter)
for (uint32_t i = 0, len = tmp->mFormData.Length(); i < len; ++i) {
ImplCycleCollectionTraverse(cb, tmp->mFormData[i].value,

View File

@@ -149,9 +149,14 @@ class FormData final : public nsISupports,
nsresult CopySubmissionDataTo(HTMLFormSubmission* aFormSubmission) const;
Element* GetSubmitterElement() const { return mSubmitter.get(); }
private:
nsCOMPtr<nsISupports> mOwner;
// Submitter element.
RefPtr<Element> mSubmitter;
nsTArray<FormDataTuple> mFormData;
};

View File

@@ -7,8 +7,8 @@
#include "mozilla/dom/HTMLButtonElement.h"
#include "HTMLFormSubmissionConstants.h"
#include "mozilla/dom/FormData.h"
#include "mozilla/dom/HTMLButtonElementBinding.h"
#include "mozilla/dom/HTMLFormSubmission.h"
#include "nsAttrValueInlines.h"
#include "nsGkAtoms.h"
#include "nsStyleConsts.h"
@@ -288,11 +288,11 @@ NS_IMETHODIMP
HTMLButtonElement::Reset() { return NS_OK; }
NS_IMETHODIMP
HTMLButtonElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
HTMLButtonElement::SubmitNamesValues(FormData* aFormData) {
//
// We only submit if we were the button pressed
//
if (aFormSubmission->GetSubmitterElement() != this) {
if (aFormData->GetSubmitterElement() != this) {
return NS_OK;
}
@@ -319,7 +319,7 @@ HTMLButtonElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
//
// Submit
//
return aFormSubmission->AddNameValuePair(name, value);
return aFormData->AddNameValuePair(name, value);
}
void HTMLButtonElement::DoneCreatingElement() {

View File

@@ -15,6 +15,7 @@ namespace mozilla {
class EventChainPostVisitor;
class EventChainPreVisitor;
namespace dom {
class FormData;
class HTMLButtonElement final : public nsGenericHTMLFormElementWithState,
public nsIConstraintValidation {
@@ -40,7 +41,7 @@ class HTMLButtonElement final : public nsGenericHTMLFormElementWithState,
// overriden nsIFormControl methods
NS_IMETHOD Reset() override;
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
NS_IMETHOD SubmitNamesValues(FormData* aFormData) override;
NS_IMETHOD SaveState() override;
bool RestoreState(PresState* aState) override;
virtual bool IsDisabledForEvents(WidgetEvent* aEvent) override;

View File

@@ -114,11 +114,6 @@ nsIHTMLCollection* HTMLFieldSetElement::Elements() {
nsresult HTMLFieldSetElement::Reset() { return NS_OK; }
NS_IMETHODIMP
HTMLFieldSetElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
return NS_OK;
}
void HTMLFieldSetElement::InsertChildBefore(nsIContent* aChild,
nsIContent* aBeforeThis,
bool aNotify, ErrorResult& aRv) {

View File

@@ -10,13 +10,13 @@
#include "mozilla/Attributes.h"
#include "nsGenericHTMLElement.h"
#include "nsIConstraintValidation.h"
#include "mozilla/dom/HTMLFormElement.h"
#include "mozilla/dom/ValidityState.h"
namespace mozilla {
class ErrorResult;
class EventChainPreVisitor;
namespace dom {
class FormData;
class HTMLFieldSetElement final : public nsGenericHTMLFormElement,
public nsIConstraintValidation {
@@ -47,7 +47,7 @@ class HTMLFieldSetElement final : public nsGenericHTMLFormElement,
// nsIFormControl
NS_IMETHOD Reset() override;
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
NS_IMETHOD SubmitNamesValues(FormData* aFormData) override { return NS_OK; }
virtual bool IsDisabledForEvents(WidgetEvent* aEvent) override;
virtual nsresult Clone(dom::NodeInfo*, nsINode** aResult) const override;

View File

@@ -32,7 +32,9 @@ namespace mozilla {
class EventChainPostVisitor;
class EventChainPreVisitor;
namespace dom {
class DialogFormSubmission;
class HTMLFormControlsCollection;
class HTMLFormSubmission;
class HTMLImageElement;
class FormData;

View File

@@ -687,11 +687,10 @@ nsresult FSTextPlain::GetEncodedSubmission(nsIURI* aURI,
HTMLFormSubmission::HTMLFormSubmission(
nsIURI* aActionURL, const nsAString& aTarget,
mozilla::NotNull<const mozilla::Encoding*> aEncoding, Element* aSubmitter)
mozilla::NotNull<const mozilla::Encoding*> aEncoding)
: mActionURL(aActionURL),
mTarget(aTarget),
mEncoding(aEncoding),
mSubmitter(aSubmitter),
mInitiatedFromUserInput(UserActivation::IsHandlingUserInput()) {
MOZ_COUNT_CTOR(HTMLFormSubmission);
}
@@ -699,7 +698,7 @@ HTMLFormSubmission::HTMLFormSubmission(
EncodingFormSubmission::EncodingFormSubmission(
nsIURI* aActionURL, const nsAString& aTarget,
NotNull<const Encoding*> aEncoding, Element* aSubmitter)
: HTMLFormSubmission(aActionURL, aTarget, aEncoding, aSubmitter) {
: HTMLFormSubmission(aActionURL, aTarget, aEncoding) {
if (!aEncoding->CanEncodeEverything()) {
nsAutoCString name;
aEncoding->Name(name);
@@ -847,8 +846,8 @@ nsresult HTMLFormSubmission::GetFromForm(HTMLFormElement* aForm,
if (aSubmitter) {
aSubmitter->ResultForDialogSubmit(result);
}
*aFormSubmission = new DialogFormSubmission(result, actionURL, target,
aEncoding, aSubmitter, dialog);
*aFormSubmission =
new DialogFormSubmission(result, actionURL, target, aEncoding, dialog);
return NS_OK;
}

View File

@@ -23,6 +23,7 @@ namespace mozilla {
namespace dom {
class Blob;
class DialogFormSubmission;
class Directory;
class Element;
class HTMLFormElement;
@@ -93,8 +94,6 @@ class HTMLFormSubmission {
*/
void GetCharset(nsACString& aCharset) { mEncoding->Name(aCharset); }
Element* GetSubmitterElement() const { return mSubmitter.get(); }
/**
* Get the action URI that will be used for submission.
*/
@@ -117,11 +116,9 @@ class HTMLFormSubmission {
* Can only be constructed by subclasses.
*
* @param aEncoding the character encoding of the form
* @param aSubmitter the submitter element (can be null)
*/
HTMLFormSubmission(nsIURI* aActionURL, const nsAString& aTarget,
mozilla::NotNull<const mozilla::Encoding*> aEncoding,
Element* aSubmitter);
mozilla::NotNull<const mozilla::Encoding*> aEncoding);
// The action url.
nsCOMPtr<nsIURI> mActionURL;
@@ -132,9 +129,6 @@ class HTMLFormSubmission {
// The character encoding of this form submission
mozilla::NotNull<const mozilla::Encoding*> mEncoding;
// Submitter element.
RefPtr<Element> mSubmitter;
// Keep track of whether this form submission was user-initiated or not
bool mInitiatedFromUserInput;
};
@@ -177,9 +171,9 @@ class DialogFormSubmission final : public HTMLFormSubmission {
public:
DialogFormSubmission(nsAString& aResult, nsIURI* aActionURL,
const nsAString& aTarget,
NotNull<const Encoding*> aEncoding, Element* aSubmitter,
NotNull<const Encoding*> aEncoding,
HTMLDialogElement* aDialogElement)
: HTMLFormSubmission(aActionURL, aTarget, aEncoding, aSubmitter),
: HTMLFormSubmission(aActionURL, aTarget, aEncoding),
mDialogElement(aDialogElement),
mReturnValue(aResult) {}
nsresult AddNameValuePair(const nsAString& aName,

View File

@@ -17,8 +17,8 @@
#include "mozilla/dom/DocumentOrShadowRoot.h"
#include "mozilla/dom/ElementBinding.h"
#include "mozilla/dom/FileSystemUtils.h"
#include "mozilla/dom/FormData.h"
#include "mozilla/dom/GetFilesHelper.h"
#include "mozilla/dom/HTMLFormSubmission.h"
#include "mozilla/dom/WindowContext.h"
#include "mozilla/dom/InputType.h"
#include "mozilla/dom/UserActivation.h"
@@ -5656,7 +5656,7 @@ HTMLInputElement::Reset() {
}
NS_IMETHODIMP
HTMLInputElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
HTMLInputElement::SubmitNamesValues(FormData* aFormData) {
// Disabled elements don't submit
// For type=reset, and type=button, we just never submit, period.
// For type=image and type=button, we only submit if we were the button
@@ -5666,7 +5666,7 @@ HTMLInputElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
mType == FormControlType::InputButton ||
((mType == FormControlType::InputSubmit ||
mType == FormControlType::InputImage) &&
aFormSubmission->GetSubmitterElement() != this) ||
aFormData->GetSubmitterElement() != this) ||
((mType == FormControlType::InputRadio ||
mType == FormControlType::InputCheckbox) &&
!mChecked)) {
@@ -5696,13 +5696,13 @@ HTMLInputElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
yVal.AppendInt(y);
if (!name.IsEmpty()) {
aFormSubmission->AddNameValuePair(name + u".x"_ns, xVal);
aFormSubmission->AddNameValuePair(name + u".y"_ns, yVal);
aFormData->AddNameValuePair(name + u".x"_ns, xVal);
aFormData->AddNameValuePair(name + u".y"_ns, yVal);
} else {
// If the Image Element has no name, simply return x and y
// to Nav and IE compatibility.
aFormSubmission->AddNameValuePair(u"x"_ns, xVal);
aFormSubmission->AddNameValuePair(u"y"_ns, yVal);
aFormData->AddNameValuePair(u"x"_ns, xVal);
aFormData->AddNameValuePair(u"y"_ns, yVal);
}
return NS_OK;
@@ -5730,7 +5730,7 @@ HTMLInputElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
RefPtr<File> file = blob->ToFile(u""_ns, rv);
if (!rv.Failed()) {
aFormSubmission->AddNameBlobPair(name, file);
aFormData->AddNameBlobPair(name, file);
}
return rv.StealNSResult();
@@ -5738,10 +5738,10 @@ HTMLInputElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
for (uint32_t i = 0; i < files.Length(); ++i) {
if (files[i].IsFile()) {
aFormSubmission->AddNameBlobPair(name, files[i].GetAsFile());
aFormData->AddNameBlobPair(name, files[i].GetAsFile());
} else {
MOZ_ASSERT(files[i].IsDirectory());
aFormSubmission->AddNameDirectoryPair(name, files[i].GetAsDirectory());
aFormData->AddNameDirectoryPair(name, files[i].GetAsDirectory());
}
}
@@ -5751,9 +5751,8 @@ HTMLInputElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
if (mType == FormControlType::InputHidden &&
name.LowerCaseEqualsLiteral("_charset_")) {
nsCString charset;
aFormSubmission->GetCharset(charset);
return aFormSubmission->AddNameValuePair(name,
NS_ConvertASCIItoUTF16(charset));
aFormData->GetCharset(charset);
return aFormData->AddNameValuePair(name, NS_ConvertASCIItoUTF16(charset));
}
//
@@ -5773,7 +5772,7 @@ HTMLInputElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
value = defaultValue;
}
return aFormSubmission->AddNameValuePair(name, value);
return aFormData->AddNameValuePair(name, value);
}
static nsTArray<FileContentData> SaveFileContentData(

View File

@@ -50,6 +50,7 @@ class DispatchChangeEventCallback;
class File;
class FileList;
class FileSystemEntry;
class FormData;
class GetFilesHelper;
class InputType;
@@ -151,7 +152,7 @@ class HTMLInputElement final : public TextControlElement,
// Overriden nsIFormControl methods
MOZ_CAN_RUN_SCRIPT_BOUNDARY
NS_IMETHOD Reset() override;
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
NS_IMETHOD SubmitNamesValues(FormData* aFormData) override;
NS_IMETHOD SaveState() override;
MOZ_CAN_RUN_SCRIPT_BOUNDARY
virtual bool RestoreState(PresState* aState) override;

View File

@@ -6,7 +6,6 @@
#include "mozilla/EventStates.h"
#include "mozilla/dom/BindContext.h"
#include "mozilla/dom/HTMLFormSubmission.h"
#include "mozilla/dom/HTMLObjectElement.h"
#include "mozilla/dom/HTMLObjectElementBinding.h"
#include "mozilla/dom/ElementInlines.h"

View File

@@ -15,7 +15,7 @@
namespace mozilla {
namespace dom {
class HTMLFormSubmission;
class FormData;
template <typename T>
struct Nullable;
class WindowProxyHolder;
@@ -49,9 +49,7 @@ class HTMLObjectElement final : public nsGenericHTMLFormElement,
// Overriden nsIFormControl methods
NS_IMETHOD Reset() override { return NS_OK; }
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override {
return NS_OK;
}
NS_IMETHOD SubmitNamesValues(FormData* aFormData) override { return NS_OK; }
virtual void DoneAddingChildren(bool aHaveNotified) override;
virtual bool IsDoneAddingChildren() override;

View File

@@ -9,7 +9,6 @@
#include "mozAutoDocUpdate.h"
#include "mozilla/EventStates.h"
#include "mozilla/dom/HTMLFormElement.h"
#include "mozilla/dom/HTMLFormSubmission.h"
#include "mozilla/dom/HTMLOutputElementBinding.h"
#include "nsContentUtils.h"
#include "nsDOMTokenList.h"
@@ -54,12 +53,6 @@ HTMLOutputElement::Reset() {
return nsContentUtils::SetNodeTextContent(this, mDefaultValue, true);
}
NS_IMETHODIMP
HTMLOutputElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
// The output element is not submittable.
return NS_OK;
}
bool HTMLOutputElement::ParseAttribute(int32_t aNamespaceID, nsAtom* aAttribute,
const nsAString& aValue,
nsIPrincipal* aMaybeScriptedPrincipal,

View File

@@ -15,7 +15,7 @@
namespace mozilla {
namespace dom {
class HTMLFormSubmission;
class FormData;
class HTMLOutputElement final : public nsGenericHTMLFormElement,
public nsStubMutationObserver,
@@ -32,7 +32,8 @@ class HTMLOutputElement final : public nsGenericHTMLFormElement,
// nsIFormControl
NS_IMETHOD Reset() override;
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
// The output element is not submittable.
NS_IMETHOD SubmitNamesValues(FormData* aFormData) override { return NS_OK; }
nsresult Clone(dom::NodeInfo*, nsINode** aResult) const override;

View File

@@ -12,7 +12,7 @@
#include "mozilla/EventDispatcher.h"
#include "mozilla/EventStates.h"
#include "mozilla/dom/Element.h"
#include "mozilla/dom/HTMLFormSubmission.h"
#include "mozilla/dom/FormData.h"
#include "mozilla/dom/HTMLOptGroupElement.h"
#include "mozilla/dom/HTMLOptionElement.h"
#include "mozilla/dom/HTMLSelectElementBinding.h"
@@ -1388,7 +1388,7 @@ HTMLSelectElement::Reset() {
}
NS_IMETHODIMP
HTMLSelectElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
HTMLSelectElement::SubmitNamesValues(FormData* aFormData) {
// Disabled elements don't submit
if (IsDisabled()) {
return NS_OK;
@@ -1423,7 +1423,7 @@ HTMLSelectElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
nsString value;
option->GetValue(value);
aFormSubmission->AddNameValuePair(name, value);
aFormData->AddNameValuePair(name, value);
}
return NS_OK;

View File

@@ -34,7 +34,7 @@ class PresState;
namespace dom {
class HTMLFormSubmission;
class FormData;
class HTMLSelectElement;
class MOZ_STACK_CLASS SafeOptionListMutation {
@@ -205,7 +205,7 @@ class HTMLSelectElement final : public nsGenericHTMLFormElementWithState,
// Overriden nsIFormControl methods
NS_IMETHOD Reset() override;
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
NS_IMETHOD SubmitNamesValues(FormData* aFormData) override;
NS_IMETHOD SaveState() override;
virtual bool RestoreState(PresState* aState) override;
virtual bool IsDisabledForEvents(WidgetEvent* aEvent) override;

View File

@@ -9,7 +9,7 @@
#include "mozAutoDocUpdate.h"
#include "mozilla/AsyncEventDispatcher.h"
#include "mozilla/Attributes.h"
#include "mozilla/dom/HTMLFormSubmission.h"
#include "mozilla/dom/FormData.h"
#include "mozilla/dom/HTMLTextAreaElementBinding.h"
#include "mozilla/dom/MutationEventBinding.h"
#include "mozilla/EventDispatcher.h"
@@ -677,7 +677,7 @@ nsresult HTMLTextAreaElement::Reset() {
}
NS_IMETHODIMP
HTMLTextAreaElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
HTMLTextAreaElement::SubmitNamesValues(FormData* aFormData) {
// Disabled elements don't submit
if (IsDisabled()) {
return NS_OK;
@@ -701,7 +701,7 @@ HTMLTextAreaElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
//
// Submit
//
return aFormSubmission->AddNameValuePair(name, value);
return aFormData->AddNameValuePair(name, value);
}
NS_IMETHODIMP

View File

@@ -32,7 +32,7 @@ class PresState;
namespace dom {
class HTMLFormSubmission;
class FormData;
class HTMLTextAreaElement final : public TextControlElement,
public nsStubMutationObserver,
@@ -59,7 +59,7 @@ class HTMLTextAreaElement final : public TextControlElement,
// nsIFormControl
MOZ_CAN_RUN_SCRIPT_BOUNDARY
NS_IMETHOD Reset() override;
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
NS_IMETHOD SubmitNamesValues(FormData* aFormData) override;
NS_IMETHOD SaveState() override;
virtual bool RestoreState(PresState* aState) override;
virtual bool IsDisabledForEvents(WidgetEvent* aEvent) override;

View File

@@ -14,9 +14,8 @@ namespace mozilla {
class PresState;
namespace dom {
class Element;
class FormData;
class HTMLFieldSetElement;
class HTMLFormSubmission;
class DialogFormSubmission;
class HTMLFormElement;
} // namespace dom
} // namespace mozilla
@@ -139,13 +138,13 @@ class nsIFormControl : public nsISupports {
NS_IMETHOD Reset() = 0;
/**
* Tells the form control to submit its names and values to the form
* submission object
* @param aFormSubmission the form submission to notify of names/values/files
* to submit
* Tells the form control to submit its names and values to the form data
* object
*
* @param aFormData the form data to notify of names/values/files to submit
*/
NS_IMETHOD
SubmitNamesValues(mozilla::dom::HTMLFormSubmission* aFormSubmission) = 0;
SubmitNamesValues(mozilla::dom::FormData* aFormData) = 0;
/**
* Save to presentation state. The form control will determine whether it