|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 /* |
|
7 * A unique per-element set of attributes that is used as an |
|
8 * nsIStyleRule; used to implement presentational attributes. |
|
9 */ |
|
10 |
|
11 #ifndef nsMappedAttributes_h___ |
|
12 #define nsMappedAttributes_h___ |
|
13 |
|
14 #include "nsAttrAndChildArray.h" |
|
15 #include "nsMappedAttributeElement.h" |
|
16 #include "nsIStyleRule.h" |
|
17 #include "mozilla/Attributes.h" |
|
18 #include "mozilla/MemoryReporting.h" |
|
19 |
|
20 class nsIAtom; |
|
21 class nsHTMLStyleSheet; |
|
22 class nsRuleWalker; |
|
23 |
|
24 class nsMappedAttributes MOZ_FINAL : public nsIStyleRule |
|
25 { |
|
26 public: |
|
27 nsMappedAttributes(nsHTMLStyleSheet* aSheet, |
|
28 nsMapRuleToAttributesFunc aMapRuleFunc); |
|
29 |
|
30 // Do not return null. |
|
31 void* operator new(size_t size, uint32_t aAttrCount = 1) CPP_THROW_NEW; |
|
32 nsMappedAttributes* Clone(bool aWillAddAttr); |
|
33 |
|
34 NS_DECL_ISUPPORTS |
|
35 |
|
36 void SetAndTakeAttr(nsIAtom* aAttrName, nsAttrValue& aValue); |
|
37 const nsAttrValue* GetAttr(nsIAtom* aAttrName) const; |
|
38 const nsAttrValue* GetAttr(const nsAString& aAttrName) const; |
|
39 |
|
40 uint32_t Count() const |
|
41 { |
|
42 return mAttrCount; |
|
43 } |
|
44 |
|
45 bool Equals(const nsMappedAttributes* aAttributes) const; |
|
46 uint32_t HashValue() const; |
|
47 |
|
48 void DropStyleSheetReference() |
|
49 { |
|
50 mSheet = nullptr; |
|
51 } |
|
52 void SetStyleSheet(nsHTMLStyleSheet* aSheet); |
|
53 nsHTMLStyleSheet* GetStyleSheet() |
|
54 { |
|
55 return mSheet; |
|
56 } |
|
57 |
|
58 const nsAttrName* NameAt(uint32_t aPos) const |
|
59 { |
|
60 NS_ASSERTION(aPos < mAttrCount, "out-of-bounds"); |
|
61 return &Attrs()[aPos].mName; |
|
62 } |
|
63 const nsAttrValue* AttrAt(uint32_t aPos) const |
|
64 { |
|
65 NS_ASSERTION(aPos < mAttrCount, "out-of-bounds"); |
|
66 return &Attrs()[aPos].mValue; |
|
67 } |
|
68 // Remove the attr at position aPos. The value of the attr is placed in |
|
69 // aValue; any value that was already in aValue is destroyed. |
|
70 void RemoveAttrAt(uint32_t aPos, nsAttrValue& aValue); |
|
71 const nsAttrName* GetExistingAttrNameFromQName(const nsAString& aName) const; |
|
72 int32_t IndexOfAttr(nsIAtom* aLocalName) const; |
|
73 |
|
74 |
|
75 // nsIStyleRule |
|
76 virtual void MapRuleInfoInto(nsRuleData* aRuleData) MOZ_OVERRIDE; |
|
77 #ifdef DEBUG |
|
78 virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE; |
|
79 #endif |
|
80 |
|
81 size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const; |
|
82 |
|
83 private: |
|
84 nsMappedAttributes(const nsMappedAttributes& aCopy); |
|
85 ~nsMappedAttributes(); |
|
86 |
|
87 struct InternalAttr |
|
88 { |
|
89 nsAttrName mName; |
|
90 nsAttrValue mValue; |
|
91 }; |
|
92 |
|
93 /** |
|
94 * Due to a compiler bug in VisualAge C++ for AIX, we need to return the |
|
95 * address of the first index into mAttrs here, instead of simply |
|
96 * returning mAttrs itself. |
|
97 * |
|
98 * See Bug 231104 for more information. |
|
99 */ |
|
100 const InternalAttr* Attrs() const |
|
101 { |
|
102 return reinterpret_cast<const InternalAttr*>(&(mAttrs[0])); |
|
103 } |
|
104 InternalAttr* Attrs() |
|
105 { |
|
106 return reinterpret_cast<InternalAttr*>(&(mAttrs[0])); |
|
107 } |
|
108 |
|
109 uint16_t mAttrCount; |
|
110 #ifdef DEBUG |
|
111 uint16_t mBufferSize; |
|
112 #endif |
|
113 nsHTMLStyleSheet* mSheet; //weak |
|
114 nsMapRuleToAttributesFunc mRuleMapper; |
|
115 void* mAttrs[1]; |
|
116 }; |
|
117 |
|
118 #endif /* nsMappedAttributes_h___ */ |