content/base/src/nsMappedAttributes.h

branch
TOR_BUG_9701
changeset 11
deefc01c0e14
equal deleted inserted replaced
-1:000000000000 0:9b728e4d51ad
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___ */

mercurial