forked from mirrors/gecko-dev
		
	 265e672179
			
		
	
	
		265e672179
		
	
	
	
	
		
			
			# ignore-this-changeset --HG-- extra : amend_source : 4d301d3b0b8711c4692392aa76088ba7fd7d1022
		
			
				
	
	
		
			128 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- 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;
 | |
| template <class T>
 | |
| class RefPtr;
 | |
| 
 | |
| namespace mozilla {
 | |
| namespace dom {
 | |
| class HTMLFormElement;
 | |
| class HTMLImageElement;
 | |
| class OwningRadioNodeListOrElement;
 | |
| template <typename>
 | |
| struct Nullable;
 | |
| 
 | |
| class HTMLFormControlsCollection final : public nsIHTMLCollection,
 | |
|                                          public nsWrapperCache {
 | |
|  public:
 | |
|   explicit HTMLFormControlsCollection(HTMLFormElement* aForm);
 | |
| 
 | |
|   void DropFormReference();
 | |
| 
 | |
|   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
 | |
| 
 | |
|   virtual uint32_t Length() override;
 | |
|   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<OwningRadioNodeListOrElement>& aResult);
 | |
|   void NamedItem(const nsAString& aName,
 | |
|                  Nullable<OwningRadioNodeListOrElement>& aResult) {
 | |
|     bool dummy;
 | |
|     NamedGetter(aName, dummy, aResult);
 | |
|   }
 | |
|   virtual void GetSupportedNames(nsTArray<nsString>& 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<RefPtr<nsGenericHTMLFormElement>>& aControls) const;
 | |
| 
 | |
|   // nsWrapperCache
 | |
|   using nsWrapperCache::GetWrapperPreserveColor;
 | |
|   using nsWrapperCache::PreserveWrapper;
 | |
|   virtual JSObject* WrapObject(JSContext* aCx,
 | |
|                                JS::Handle<JSObject*> aGivenProto) override;
 | |
| 
 | |
|  protected:
 | |
|   virtual ~HTMLFormControlsCollection();
 | |
|   virtual JSObject* GetWrapperPreserveColorInternal() override {
 | |
|     return nsWrapperCache::GetWrapperPreserveColor();
 | |
|   }
 | |
|   virtual void PreserveWrapperInternal(
 | |
|       nsISupports* aScriptObjectHolder) override {
 | |
|     nsWrapperCache::PreserveWrapper(aScriptObjectHolder);
 | |
|   }
 | |
| 
 | |
|  public:
 | |
|   static bool ShouldBeInElements(nsIFormControl* aFormControl);
 | |
| 
 | |
|   HTMLFormElement* mForm;  // WEAK - the form owns me
 | |
| 
 | |
|   nsTArray<nsGenericHTMLFormElement*>
 | |
|       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<nsGenericHTMLFormElement*> 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<nsStringHashKey, nsISupports> mNameLookupTable;
 | |
| };
 | |
| 
 | |
| }  // namespace dom
 | |
| }  // namespace mozilla
 | |
| 
 | |
| #endif  // mozilla_dom_HTMLFormControlsCollection_h
 |