1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* ***** BEGIN LICENSE BLOCK *****
3 : * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 : *
5 : * The contents of this file are subject to the Mozilla Public License Version
6 : * 1.1 (the "License"); you may not use this file except in compliance with
7 : * the License. You may obtain a copy of the License at
8 : * http://www.mozilla.org/MPL/
9 : *
10 : * Software distributed under the License is distributed on an "AS IS" basis,
11 : * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 : * for the specific language governing rights and limitations under the
13 : * License.
14 : *
15 : * The Original Code is Mozilla Communicator client code.
16 : *
17 : * The Initial Developer of the Original Code is
18 : * Netscape Communications Corporation.
19 : * Portions created by the Initial Developer are Copyright (C) 1998
20 : * the Initial Developer. All Rights Reserved.
21 : *
22 : * Contributor(s):
23 : *
24 : * Alternatively, the contents of this file may be used under the terms of
25 : * either of the GNU General Public License Version 2 or later (the "GPL"),
26 : * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 : * in which case the provisions of the GPL or the LGPL are applicable instead
28 : * of those above. If you wish to allow use of your version of this file only
29 : * under the terms of either the GPL or the LGPL, and not to allow others to
30 : * use your version of this file under the terms of the MPL, indicate your
31 : * decision by deleting the provisions above and replace them with the notice
32 : * and other provisions required by the GPL or the LGPL. If you do not delete
33 : * the provisions above, a recipient may use your version of this file under
34 : * the terms of any one of the MPL, the GPL or the LGPL.
35 : *
36 : * ***** END LICENSE BLOCK ***** */
37 :
38 : /*
39 : * Implementation of DOM Core's nsIDOMAttr node.
40 : */
41 :
42 : #ifndef nsDOMAttribute_h___
43 : #define nsDOMAttribute_h___
44 :
45 : #include "nsIAttribute.h"
46 : #include "nsIDOMAttr.h"
47 : #include "nsIDOMText.h"
48 : #include "nsIDOMNodeList.h"
49 : #include "nsString.h"
50 : #include "nsCOMPtr.h"
51 : #include "nsINodeInfo.h"
52 : #include "nsDOMAttributeMap.h"
53 : #include "nsCycleCollectionParticipant.h"
54 : #include "nsStubMutationObserver.h"
55 :
56 : // Attribute helper class used to wrap up an attribute with a dom
57 : // object that implements nsIDOMAttr and nsIDOMNode
58 : class nsDOMAttribute : public nsIAttribute,
59 : public nsIDOMAttr,
60 : public nsStubMutationObserver
61 : {
62 : public:
63 : nsDOMAttribute(nsDOMAttributeMap* aAttrMap,
64 : already_AddRefed<nsINodeInfo> aNodeInfo,
65 : const nsAString& aValue,
66 : bool aNsAware);
67 : virtual ~nsDOMAttribute();
68 :
69 945 : NS_DECL_CYCLE_COLLECTING_ISUPPORTS
70 :
71 : // nsIDOMNode interface
72 : NS_DECL_NSIDOMNODE
73 :
74 : // nsIDOMAttr interface
75 : NS_DECL_NSIDOMATTR
76 :
77 : virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor);
78 :
79 : // nsIAttribute interface
80 : void SetMap(nsDOMAttributeMap *aMap);
81 : nsIContent *GetContent() const;
82 : nsresult SetOwnerDocument(nsIDocument* aDocument);
83 :
84 : // nsINode interface
85 : virtual bool IsNodeOfType(PRUint32 aFlags) const;
86 : virtual PRUint32 GetChildCount() const;
87 : virtual nsIContent *GetChildAt(PRUint32 aIndex) const;
88 : virtual nsIContent * const * GetChildArray(PRUint32* aChildCount) const;
89 : virtual PRInt32 IndexOf(nsINode* aPossibleChild) const;
90 : virtual nsresult InsertChildAt(nsIContent* aKid, PRUint32 aIndex,
91 : bool aNotify);
92 : virtual nsresult AppendChildTo(nsIContent* aKid, bool aNotify);
93 : virtual nsresult RemoveChildAt(PRUint32 aIndex, bool aNotify);
94 : virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
95 : virtual already_AddRefed<nsIURI> GetBaseURI() const;
96 :
97 : static void Initialize();
98 : static void Shutdown();
99 :
100 31270 : NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsDOMAttribute,
101 : nsIAttribute)
102 :
103 : NS_DECL_NSIMUTATIONOBSERVER_ATTRIBUTECHANGED
104 :
105 : virtual nsXPCClassInfo* GetClassInfo();
106 : protected:
107 0 : virtual mozilla::dom::Element* GetNameSpaceElement()
108 : {
109 0 : return GetContentInternal();
110 : }
111 :
112 : static bool sInitialized;
113 :
114 : private:
115 : already_AddRefed<nsIAtom> GetNameAtom(nsIContent* aContent);
116 :
117 : void EnsureChildState();
118 :
119 : /**
120 : * Really removing the attribute child (unbind and release).
121 : */
122 : void doRemoveChild(bool aNotify);
123 :
124 : nsString mValue;
125 : // XXX For now, there's only a single child - a text element
126 : // representing the value. This is strong ref, but we use a raw
127 : // pointer so we can implement GetChildArray().
128 : nsIContent* mChild;
129 :
130 7516 : mozilla::dom::Element *GetContentInternal() const
131 : {
132 7516 : return mAttrMap ? mAttrMap->GetContent() : nsnull;
133 : }
134 : };
135 :
136 :
137 : #endif /* nsDOMAttribute_h___ */
|