From 5f8de423f190bbb79a62f804151bc24824fa32d8 Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Fri, 2 Feb 2018 04:16:08 -0500 Subject: Add m-esr52 at 52.6.0 --- dom/html/HTMLFormControlsCollection.h | 125 ++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 dom/html/HTMLFormControlsCollection.h (limited to 'dom/html/HTMLFormControlsCollection.h') diff --git a/dom/html/HTMLFormControlsCollection.h b/dom/html/HTMLFormControlsCollection.h new file mode 100644 index 000000000..1b8e1e62b --- /dev/null +++ b/dom/html/HTMLFormControlsCollection.h @@ -0,0 +1,125 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_dom_HTMLFormControlsCollection_h +#define mozilla_dom_HTMLFormControlsCollection_h + +#include "mozilla/dom/Element.h" // DOMProxyHandler::getOwnPropertyDescriptor +#include "nsIHTMLCollection.h" +#include "nsInterfaceHashtable.h" +#include "nsTArray.h" +#include "nsWrapperCache.h" + +class nsGenericHTMLFormElement; +class nsIFormControl; + +namespace mozilla { +namespace dom { +class HTMLFormElement; +class HTMLImageElement; +class OwningRadioNodeListOrElement; +template struct Nullable; + +class HTMLFormControlsCollection final : public nsIHTMLCollection + , public nsWrapperCache +{ +public: + explicit HTMLFormControlsCollection(HTMLFormElement* aForm); + + void DropFormReference(); + + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + + // nsIDOMHTMLCollection interface + NS_DECL_NSIDOMHTMLCOLLECTION + + virtual Element* GetElementAt(uint32_t index) override; + virtual nsINode* GetParentObject() override; + + virtual Element* + GetFirstNamedElement(const nsAString& aName, bool& aFound) override; + + void + NamedGetter(const nsAString& aName, + bool& aFound, + Nullable& aResult); + void + NamedItem(const nsAString& aName, + Nullable& aResult) + { + bool dummy; + NamedGetter(aName, dummy, aResult); + } + virtual void GetSupportedNames(nsTArray& aNames) override; + + nsresult AddElementToTable(nsGenericHTMLFormElement* aChild, + const nsAString& aName); + nsresult AddImageElementToTable(HTMLImageElement* aChild, + const nsAString& aName); + nsresult RemoveElementFromTable(nsGenericHTMLFormElement* aChild, + const nsAString& aName); + nsresult IndexOfControl(nsIFormControl* aControl, + int32_t* aIndex); + + nsISupports* NamedItemInternal(const nsAString& aName, bool aFlushContent); + + /** + * Create a sorted list of form control elements. This list is sorted + * in document order and contains the controls in the mElements and + * mNotInElements list. This function does not add references to the + * elements. + * + * @param aControls The list of sorted controls[out]. + * @return NS_OK or NS_ERROR_OUT_OF_MEMORY. + */ + nsresult GetSortedControls(nsTArray& aControls) const; + + // nsWrapperCache + using nsWrapperCache::GetWrapperPreserveColor; + virtual JSObject* WrapObject(JSContext* aCx, JS::Handle aGivenProto) override; +protected: + virtual ~HTMLFormControlsCollection(); + virtual JSObject* GetWrapperPreserveColorInternal() override + { + return nsWrapperCache::GetWrapperPreserveColor(); + } +public: + + static bool ShouldBeInElements(nsIFormControl* aFormControl); + + HTMLFormElement* mForm; // WEAK - the form owns me + + nsTArray mElements; // Holds WEAK references - bug 36639 + + // This array holds on to all form controls that are not contained + // in mElements (form.elements in JS, see ShouldBeInFormControl()). + // This is needed to properly clean up the bi-directional references + // (both weak and strong) between the form and its form controls. + + nsTArray mNotInElements; // Holds WEAK references + + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(HTMLFormControlsCollection) + +protected: + // Drop all our references to the form elements + void Clear(); + + // Flush out the content model so it's up to date. + void FlushPendingNotifications(); + + // A map from an ID or NAME attribute to the form control(s), this + // hash holds strong references either to the named form control, or + // to a list of named form controls, in the case where this hash + // holds on to a list of named form controls the list has weak + // references to the form control. + + nsInterfaceHashtable mNameLookupTable; +}; + +} // namespace dom +} // namespace mozilla + +#endif // mozilla_dom_HTMLFormControlsCollection_h -- cgit v1.2.3