зеркало из https://github.com/mozilla/gecko-dev.git
Add comments (bug 159065), r=sicking, sr=bz/jst, a=asa
This commit is contained in:
Родитель
e158e2c710
Коммит
210e8b4a60
|
@ -68,41 +68,80 @@ class nsDOMAttributeMap;
|
||||||
class nsIURI;
|
class nsIURI;
|
||||||
class nsINodeInfo;
|
class nsINodeInfo;
|
||||||
|
|
||||||
// Class that holds the child list of a content element and also
|
/**
|
||||||
// implements the nsIDOMNodeList interface.
|
* Class that implements the nsIDOMNodeList interface (a list of children of
|
||||||
|
* the content), by holding a reference to the content and delegating GetLength
|
||||||
|
* and Item to its existing child list.
|
||||||
|
* @see nsIDOMNodeList
|
||||||
|
*/
|
||||||
class nsChildContentList : public nsGenericDOMNodeList
|
class nsChildContentList : public nsGenericDOMNodeList
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* @param aContent the content whose children will make up the list
|
||||||
|
*/
|
||||||
nsChildContentList(nsIContent *aContent);
|
nsChildContentList(nsIContent *aContent);
|
||||||
virtual ~nsChildContentList();
|
virtual ~nsChildContentList();
|
||||||
|
|
||||||
// nsIDOMNodeList interface
|
// nsIDOMNodeList interface
|
||||||
NS_DECL_NSIDOMNODELIST
|
NS_DECL_NSIDOMNODELIST
|
||||||
|
|
||||||
|
/** Drop the reference to the content */
|
||||||
void DropReference();
|
void DropReference();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/** The content whose children make up the list (weak reference) */
|
||||||
nsIContent *mContent;
|
nsIContent *mContent;
|
||||||
};
|
};
|
||||||
|
|
||||||
// There are a set of DOM- and scripting-specific instance variables
|
/**
|
||||||
// that may only be instantiated when a content object is accessed
|
* There are a set of DOM- and scripting-specific instance variables
|
||||||
// through the DOM. Rather than burn actual slots in the content
|
* that may only be instantiated when a content object is accessed
|
||||||
// objects for each of these instance variables, we put them off
|
* through the DOM. Rather than burn actual slots in the content
|
||||||
// in a side structure that's only allocated when the content is
|
* objects for each of these instance variables, we put them off
|
||||||
// accessed through the DOM.
|
* in a side structure that's only allocated when the content is
|
||||||
|
* accessed through the DOM.
|
||||||
|
*/
|
||||||
struct nsDOMSlots
|
struct nsDOMSlots
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* An object implementing nsIDOMNodeList for this content (childNodes)
|
||||||
|
* @see nsIDOMNodeList
|
||||||
|
* @see nsGenericHTMLLeafElement::GetChildNodes
|
||||||
|
*/
|
||||||
nsChildContentList *mChildNodes;
|
nsChildContentList *mChildNodes;
|
||||||
|
/**
|
||||||
|
* The .style attribute (an interface that forwards to the actual style rules)
|
||||||
|
* @see nsGenericHTMLElement::GetStyle
|
||||||
|
*/
|
||||||
nsDOMCSSDeclaration *mStyle;
|
nsDOMCSSDeclaration *mStyle;
|
||||||
|
/**
|
||||||
|
* An object implementing nsIDOMNamedNodeMap for this content (attributes)
|
||||||
|
* @see nsGenericElement::GetAttributes
|
||||||
|
*/
|
||||||
nsDOMAttributeMap* mAttributeMap;
|
nsDOMAttributeMap* mAttributeMap;
|
||||||
|
/**
|
||||||
|
* A list of ranges whose endpoints are contained within this nsIContent.
|
||||||
|
* @see nsGenericElement::GetRangeList
|
||||||
|
* @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/
|
||||||
|
*/
|
||||||
nsVoidArray *mRangeList;
|
nsVoidArray *mRangeList;
|
||||||
|
/**
|
||||||
|
* The event listener manager for this content (contains a list of listeners)
|
||||||
|
* @see nsGenericElement::GetListenerManager
|
||||||
|
*/
|
||||||
nsIEventListenerManager* mListenerManager;
|
nsIEventListenerManager* mListenerManager;
|
||||||
nsIContent* mBindingParent; // The nearest enclosing content node with a
|
/**
|
||||||
// binding that created us. [Weak]
|
* The nearest enclosing content node with a binding that created us. [weak]
|
||||||
|
* @see nsGenericElement::GetBindingParent
|
||||||
|
*/
|
||||||
|
nsIContent* mBindingParent;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A tearoff class for nsGenericElement to implement the nsIDOM3Node functions
|
||||||
|
*/
|
||||||
class nsNode3Tearoff : public nsIDOM3Node
|
class nsNode3Tearoff : public nsIDOM3Node
|
||||||
{
|
{
|
||||||
NS_DECL_ISUPPORTS
|
NS_DECL_ISUPPORTS
|
||||||
|
@ -120,12 +159,17 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// nsDOMEventRTTearoff is a tearoff class used by nsGenericElement and
|
|
||||||
// nsGenericDOMDataNode classes for implemeting the interfaces
|
|
||||||
// nsIDOMEventReceiver and nsIDOMEventTarget
|
|
||||||
|
|
||||||
#define NS_EVENT_TEAROFF_CACHE_SIZE 4
|
#define NS_EVENT_TEAROFF_CACHE_SIZE 4
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nsDOMEventRTTearoff is a tearoff class used by nsGenericElement and
|
||||||
|
* nsGenericDOMDataNode classes for implementing the interfaces
|
||||||
|
* nsIDOMEventReceiver and nsIDOMEventTarget
|
||||||
|
*
|
||||||
|
* Use the method nsDOMEventRTTearoff::Create() to create one of these babies.
|
||||||
|
* @see nsDOMEventRTTearoff::Create
|
||||||
|
*/
|
||||||
|
|
||||||
class nsDOMEventRTTearoff : public nsIDOMEventReceiver
|
class nsDOMEventRTTearoff : public nsIDOMEventReceiver
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
@ -140,9 +184,11 @@ private:
|
||||||
static nsDOMEventRTTearoff *mCachedEventTearoff[NS_EVENT_TEAROFF_CACHE_SIZE];
|
static nsDOMEventRTTearoff *mCachedEventTearoff[NS_EVENT_TEAROFF_CACHE_SIZE];
|
||||||
static PRUint32 mCachedEventTearoffCount;
|
static PRUint32 mCachedEventTearoffCount;
|
||||||
|
|
||||||
// This method gets called by Release() when it's time to delete the
|
/**
|
||||||
// this object, in stead of always deleting the object we'll put the
|
* This method gets called by Release() when it's time to delete the
|
||||||
// object in the cache if unless the cache is already full.
|
* this object, in stead of always deleting the object we'll put the
|
||||||
|
* object in the cache if unless the cache is already full.
|
||||||
|
*/
|
||||||
void LastRelease();
|
void LastRelease();
|
||||||
|
|
||||||
nsresult GetEventReceiver(nsIDOMEventReceiver **aReceiver);
|
nsresult GetEventReceiver(nsIDOMEventReceiver **aReceiver);
|
||||||
|
@ -150,9 +196,15 @@ private:
|
||||||
public:
|
public:
|
||||||
virtual ~nsDOMEventRTTearoff();
|
virtual ~nsDOMEventRTTearoff();
|
||||||
|
|
||||||
// Use this static method to create instances of this tearoff class.
|
/**
|
||||||
|
* Use this static method to create instances of nsDOMEventRTTearoff.
|
||||||
|
* @param aContent the content to create a tearoff for
|
||||||
|
*/
|
||||||
static nsDOMEventRTTearoff *Create(nsIContent *aContent);
|
static nsDOMEventRTTearoff *Create(nsIContent *aContent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call before shutdown to clear the cache and free memory for this class.
|
||||||
|
*/
|
||||||
static void Shutdown();
|
static void Shutdown();
|
||||||
|
|
||||||
// nsISupports
|
// nsISupports
|
||||||
|
@ -170,12 +222,18 @@ public:
|
||||||
NS_IMETHOD HandleEvent(nsIDOMEvent *aEvent);
|
NS_IMETHOD HandleEvent(nsIDOMEvent *aEvent);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Strong reference back to the content object from where an
|
/**
|
||||||
// instance of this class was 'torn off'
|
* Strong reference back to the content object from where an instance of this
|
||||||
|
* class was 'torn off'
|
||||||
|
*/
|
||||||
nsCOMPtr<nsIContent> mContent;
|
nsCOMPtr<nsIContent> mContent;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A generic base class for DOM elements, implementing many nsIContent,
|
||||||
|
* nsIDOMNode and nsIDOMElement methods.
|
||||||
|
*/
|
||||||
class nsGenericElement : public nsIHTMLContent
|
class nsGenericElement : public nsIHTMLContent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -184,13 +242,19 @@ public:
|
||||||
|
|
||||||
NS_DECL_ISUPPORTS
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize this element given a NodeInfo object
|
||||||
|
* @param aNodeInfo information about this type of node
|
||||||
|
*/
|
||||||
nsresult Init(nsINodeInfo *aNodeInfo);
|
nsresult Init(nsINodeInfo *aNodeInfo);
|
||||||
|
|
||||||
// If QI fails on an element, call this method to let the binding
|
/**
|
||||||
// manager have a chance...
|
* Called during QueryInterface to give the binding manager a chance to
|
||||||
|
* get an interface for this element.
|
||||||
|
*/
|
||||||
nsresult PostQueryInterface(REFNSIID aIID, void** aInstancePtr);
|
nsresult PostQueryInterface(REFNSIID aIID, void** aInstancePtr);
|
||||||
|
|
||||||
// Free globals, to be called from module destructor
|
/** Free globals, to be called from module destructor */
|
||||||
static void Shutdown();
|
static void Shutdown();
|
||||||
|
|
||||||
// nsIContent interface methods
|
// nsIContent interface methods
|
||||||
|
@ -340,19 +404,48 @@ public:
|
||||||
PRBool* aReturn);
|
PRBool* aReturn);
|
||||||
|
|
||||||
// Generic DOMNode implementations
|
// Generic DOMNode implementations
|
||||||
|
/**
|
||||||
|
* Generic implementation of InsertBefore to be called by subclasses
|
||||||
|
* @see nsIDOMNode::InsertBefore
|
||||||
|
*/
|
||||||
nsresult doInsertBefore(nsIDOMNode* aNewChild, nsIDOMNode* aRefChild,
|
nsresult doInsertBefore(nsIDOMNode* aNewChild, nsIDOMNode* aRefChild,
|
||||||
nsIDOMNode** aReturn);
|
nsIDOMNode** aReturn);
|
||||||
|
/**
|
||||||
|
* Generic implementation of ReplaceChild to be called by subclasses
|
||||||
|
* @see nsIDOMNode::ReplaceChild
|
||||||
|
*/
|
||||||
nsresult doReplaceChild(nsIDOMNode* aNewChild, nsIDOMNode* aOldChild,
|
nsresult doReplaceChild(nsIDOMNode* aNewChild, nsIDOMNode* aOldChild,
|
||||||
nsIDOMNode** aReturn);
|
nsIDOMNode** aReturn);
|
||||||
|
/**
|
||||||
|
* Generic implementation of RemoveChild to be called by subclasses
|
||||||
|
* @see nsIDOMNode::RemoveChild
|
||||||
|
*/
|
||||||
nsresult doRemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn);
|
nsresult doRemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn);
|
||||||
|
|
||||||
//----------------------------------------
|
//----------------------------------------
|
||||||
|
|
||||||
|
// XXX Unused. Remove.
|
||||||
nsresult RenderFrame(nsIPresContext*);
|
nsresult RenderFrame(nsIPresContext*);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a script event listener with the given attr name (like onclick)
|
||||||
|
* and with the value as JS
|
||||||
|
* @param aAttribute the event listener name
|
||||||
|
* @param aValue the JS to attach
|
||||||
|
*/
|
||||||
nsresult AddScriptEventListener(nsIAtom* aAttribute,
|
nsresult AddScriptEventListener(nsIAtom* aAttribute,
|
||||||
const nsAString& aValue);
|
const nsAString& aValue);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a link, putting together the proper URL from the pieces given.
|
||||||
|
* @param aPresContext the pres context.
|
||||||
|
* @param aVerb how the link will be loaded (replace page, new window, etc.)
|
||||||
|
* @param aBaseURL the base URL to start with (content.baseURL, may be null)
|
||||||
|
* @param aURLSpec the URL of the link (may be relative)
|
||||||
|
* @param aTargetSpec the target (like target=, may be null)
|
||||||
|
* @param aClick whether this was a click or not (if false, it assumes you
|
||||||
|
* just hovered over the link)
|
||||||
|
*/
|
||||||
nsresult TriggerLink(nsIPresContext* aPresContext,
|
nsresult TriggerLink(nsIPresContext* aPresContext,
|
||||||
nsLinkVerb aVerb,
|
nsLinkVerb aVerb,
|
||||||
nsIURI* aBaseURL,
|
nsIURI* aBaseURL,
|
||||||
|
@ -360,16 +453,45 @@ public:
|
||||||
const nsString& aTargetSpec,
|
const nsString& aTargetSpec,
|
||||||
PRBool aClick);
|
PRBool aClick);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Take two text nodes and append the second to the first.
|
||||||
|
* @param aFirst the node which will contain first + second [INOUT]
|
||||||
|
* @param aSecond the node which will be appended
|
||||||
|
*/
|
||||||
nsresult JoinTextNodes(nsIContent* aFirst,
|
nsresult JoinTextNodes(nsIContent* aFirst,
|
||||||
nsIContent* aSecond);
|
nsIContent* aSecond);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set .document in the immediate children of said content (but not in
|
||||||
|
* content itself). SetDocument() in the children will recursively call
|
||||||
|
* this.
|
||||||
|
*
|
||||||
|
* @param aContent the content to get the children of
|
||||||
|
* @param aDocument the document to set
|
||||||
|
* @param aCompileEventHandlers whether to initialize the event handlers in
|
||||||
|
* the document (used by nsXULElement)
|
||||||
|
*/
|
||||||
static void SetDocumentInChildrenOf(nsIContent* aContent,
|
static void SetDocumentInChildrenOf(nsIContent* aContent,
|
||||||
nsIDocument* aDocument, PRBool aCompileEventHandlers);
|
nsIDocument* aDocument, PRBool aCompileEventHandlers);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether a spec feature/version is supported.
|
||||||
|
* @param aFeature the feature ("Views", "Core", "HTML", "Range" ...)
|
||||||
|
* @param aVersion the version ("1.0", "2.0", ...)
|
||||||
|
* @param aReturn whether the feature is supported or not [OUT]
|
||||||
|
*/
|
||||||
static nsresult InternalIsSupported(const nsAString& aFeature,
|
static nsresult InternalIsSupported(const nsAString& aFeature,
|
||||||
const nsAString& aVersion,
|
const nsAString& aVersion,
|
||||||
PRBool* aReturn);
|
PRBool* aReturn);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Quick helper to determine whether there are any mutation listeners
|
||||||
|
* of a given type that apply to this content (are at or above it).
|
||||||
|
* @param aContent the content to look for listeners for
|
||||||
|
* @param aType the type of listener (NS_EVENT_BITS_MUTATION_*)
|
||||||
|
* @return whether there are mutation listeners of the specified type for
|
||||||
|
* this content or not
|
||||||
|
*/
|
||||||
static PRBool HasMutationListeners(nsIContent* aContent,
|
static PRBool HasMutationListeners(nsIContent* aContent,
|
||||||
PRUint32 aType);
|
PRUint32 aType);
|
||||||
|
|
||||||
|
@ -378,22 +500,47 @@ protected:
|
||||||
virtual PRUint32 BaseSizeOf(nsISizeOfHandler *aSizer) const;
|
virtual PRUint32 BaseSizeOf(nsISizeOfHandler *aSizer) const;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get mDOMSlots, or create it if it doesn't exist
|
||||||
|
* @returen the DOMSlots for this content object
|
||||||
|
*/
|
||||||
nsDOMSlots *GetDOMSlots();
|
nsDOMSlots *GetDOMSlots();
|
||||||
|
/**
|
||||||
|
* Clear mDOMSlots if there is nothing in it.
|
||||||
|
*/
|
||||||
void MaybeClearDOMSlots();
|
void MaybeClearDOMSlots();
|
||||||
|
|
||||||
|
/** The document for this content */
|
||||||
nsIDocument* mDocument; // WEAK
|
nsIDocument* mDocument; // WEAK
|
||||||
|
/** The parent content */
|
||||||
nsIContent* mParent; // WEAK
|
nsIContent* mParent; // WEAK
|
||||||
|
|
||||||
|
/** Information about this type of node */
|
||||||
nsINodeInfo* mNodeInfo; // OWNER
|
nsINodeInfo* mNodeInfo; // OWNER
|
||||||
|
/** The DOMSlots for this content (see nsDOMSlots for info) */
|
||||||
nsDOMSlots *mDOMSlots; // OWNER
|
nsDOMSlots *mDOMSlots; // OWNER
|
||||||
|
/**
|
||||||
|
* A unique content ID (used for layout save/restore)
|
||||||
|
* @see FrameManager::GenerateStateKey
|
||||||
|
*/
|
||||||
PRUint32 mContentID;
|
PRUint32 mContentID;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A generic element that contains children
|
||||||
|
*/
|
||||||
class nsGenericContainerElement : public nsGenericElement {
|
class nsGenericContainerElement : public nsGenericElement {
|
||||||
public:
|
public:
|
||||||
nsGenericContainerElement();
|
nsGenericContainerElement();
|
||||||
virtual ~nsGenericContainerElement();
|
virtual ~nsGenericContainerElement();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy attributes and children from another content object
|
||||||
|
* @param aSrcContent the object to copy from
|
||||||
|
* @param aDest the destination object
|
||||||
|
* @param aDeep whether to copy children
|
||||||
|
*/
|
||||||
|
// XXX This can probably be static
|
||||||
NS_IMETHOD CopyInnerTo(nsIContent* aSrcContent,
|
NS_IMETHOD CopyInnerTo(nsIContent* aSrcContent,
|
||||||
nsGenericContainerElement* aDest,
|
nsGenericContainerElement* aDest,
|
||||||
PRBool aDeep);
|
PRBool aDeep);
|
||||||
|
@ -481,7 +628,12 @@ protected:
|
||||||
virtual PRUint32 BaseSizeOf(nsISizeOfHandler *aSizer) const;
|
virtual PRUint32 BaseSizeOf(nsISizeOfHandler *aSizer) const;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The attributes (stored as nsGenericAttribute*)
|
||||||
|
* @see nsGenericAttribute
|
||||||
|
* */
|
||||||
nsVoidArray* mAttributes;
|
nsVoidArray* mAttributes;
|
||||||
|
/** The list of children (stored as nsIContent*) */
|
||||||
nsSmallVoidArray mChildren;
|
nsSmallVoidArray mChildren;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -494,24 +646,28 @@ protected:
|
||||||
{0x9c, 0x60, 0x6c, 0xa2, 0x75, 0x35, 0x09, 0xeb} }
|
{0x9c, 0x60, 0x6c, 0xa2, 0x75, 0x35, 0x09, 0xeb} }
|
||||||
|
|
||||||
// nsIDocumentFragment interface
|
// nsIDocumentFragment interface
|
||||||
|
/**
|
||||||
|
* These methods are supposed to be used when *all* children of a
|
||||||
|
* document fragment are moved at once into a new parent w/o
|
||||||
|
* changing the relationship between the children. If the moving
|
||||||
|
* operation fails and some children were moved to a new parent and
|
||||||
|
* some weren't, ReconnectChildren() should be called to remove the
|
||||||
|
* children from their possible new parent and re-insert the
|
||||||
|
* children into the document fragment. Once the operation is
|
||||||
|
* complete and all children are successfully moved into their new
|
||||||
|
* parent DropChildReferences() should be called so that the
|
||||||
|
* document fragment will loose its references to the children.
|
||||||
|
*/
|
||||||
class nsIDocumentFragment : public nsIDOMDocumentFragment
|
class nsIDocumentFragment : public nsIDOMDocumentFragment
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NS_DEFINE_STATIC_IID_ACCESSOR(NS_IDOCUMENTFRAGMENT_IID)
|
NS_DEFINE_STATIC_IID_ACCESSOR(NS_IDOCUMENTFRAGMENT_IID)
|
||||||
|
|
||||||
// These methods are supposed to be used when *all* children of a
|
/** Tell the children their parent is gone */
|
||||||
// document fragment are moved at once into a new parent w/o
|
|
||||||
// changing the relationship between the children. If the moving
|
|
||||||
// operation fails and some children were moved to a new parent and
|
|
||||||
// some weren't, ReconnectChildren() should be called to remove the
|
|
||||||
// children from their possible new parent and re-insert the
|
|
||||||
// children into the document fragment. Once the operation is
|
|
||||||
// complete and all children are successfully moved into their new
|
|
||||||
// parent DropChildReferences() should be called so that the
|
|
||||||
// document fragment will loose its references to the children.
|
|
||||||
|
|
||||||
NS_IMETHOD DisconnectChildren() = 0;
|
NS_IMETHOD DisconnectChildren() = 0;
|
||||||
|
/** Put all children back in the fragment */
|
||||||
NS_IMETHOD ReconnectChildren() = 0;
|
NS_IMETHOD ReconnectChildren() = 0;
|
||||||
|
/** Drop references to children */
|
||||||
NS_IMETHOD DropChildReferences() = 0;
|
NS_IMETHOD DropChildReferences() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче