summaryrefslogtreecommitdiffstats
path: root/layout/style/nsRuleData.h
diff options
context:
space:
mode:
Diffstat (limited to 'layout/style/nsRuleData.h')
-rw-r--r--layout/style/nsRuleData.h128
1 files changed, 128 insertions, 0 deletions
diff --git a/layout/style/nsRuleData.h b/layout/style/nsRuleData.h
new file mode 100644
index 000000000..d51d50cb3
--- /dev/null
+++ b/layout/style/nsRuleData.h
@@ -0,0 +1,128 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/. */
+
+/*
+ * temporary (expanded) representation of property-value pairs used to
+ * hold data from matched rules during style data computation.
+ */
+
+#ifndef nsRuleData_h_
+#define nsRuleData_h_
+
+#include "mozilla/CSSVariableDeclarations.h"
+#include "mozilla/RuleNodeCacheConditions.h"
+#include "mozilla/SheetType.h"
+#include "nsAutoPtr.h"
+#include "nsCSSProps.h"
+#include "nsCSSValue.h"
+#include "nsStyleStructFwd.h"
+
+class nsPresContext;
+class nsStyleContext;
+struct nsRuleData;
+
+typedef void (*nsPostResolveFunc)(void* aStyleStruct, nsRuleData* aData);
+
+struct nsRuleData
+{
+ const uint32_t mSIDs;
+ mozilla::RuleNodeCacheConditions mConditions;
+ bool mIsImportantRule;
+ mozilla::SheetType mLevel;
+ nsPresContext* const mPresContext;
+ nsStyleContext* const mStyleContext;
+
+ // We store nsCSSValues needed to compute the data for one or more
+ // style structs (specified by the bitfield mSIDs). These are stored
+ // in a single array allocation (which our caller allocates; see
+ // AutoCSSValueArray) The offset of each property |prop| in
+ // mValueStorage is the sum of
+ // mValueOffsets[nsCSSProps::kSIDTable[prop]] and
+ // nsCSSProps::PropertyIndexInStruct(prop). The only place we gather
+ // more than one style struct's data at a time is
+ // nsRuleNode::HasAuthorSpecifiedRules; therefore some code that we
+ // know is not called from HasAuthorSpecifiedRules assumes that the
+ // mValueOffsets for the one struct in mSIDs is zero.
+ nsCSSValue* const mValueStorage; // our user owns this array
+ size_t mValueOffsets[nsStyleStructID_Length];
+
+ nsAutoPtr<mozilla::CSSVariableDeclarations> mVariables;
+
+ nsRuleData(uint32_t aSIDs, nsCSSValue* aValueStorage,
+ nsPresContext* aContext, nsStyleContext* aStyleContext);
+
+#ifdef DEBUG
+ ~nsRuleData();
+#else
+ ~nsRuleData() {}
+#endif
+
+ /**
+ * Return a pointer to the value object within |this| corresponding
+ * to property |aProperty|.
+ *
+ * This function must only be called if the given property is in
+ * mSIDs.
+ */
+ nsCSSValue* ValueFor(nsCSSPropertyID aProperty)
+ {
+ MOZ_ASSERT(aProperty < eCSSProperty_COUNT_no_shorthands,
+ "invalid or shorthand property");
+
+ nsStyleStructID sid = nsCSSProps::kSIDTable[aProperty];
+ size_t indexInStruct = nsCSSProps::PropertyIndexInStruct(aProperty);
+
+ // This should really be nsCachedStyleData::GetBitForSID, but we can't
+ // include that here since it includes us.
+ MOZ_ASSERT(mSIDs & (1 << sid),
+ "calling nsRuleData::ValueFor on property not in mSIDs");
+ MOZ_ASSERT(indexInStruct != size_t(-1),
+ "logical property");
+
+ return mValueStorage + mValueOffsets[sid] + indexInStruct;
+ }
+
+ const nsCSSValue* ValueFor(nsCSSPropertyID aProperty) const {
+ return const_cast<nsRuleData*>(this)->ValueFor(aProperty);
+ }
+
+ /**
+ * Getters like ValueFor(aProperty), but for each property by name
+ * (ValueForBackgroundColor, etc.), and more efficient than ValueFor.
+ * These use the names used for the property on DOM interfaces (the
+ * 'method' field in nsCSSPropList.h).
+ *
+ * Like ValueFor(), the caller must check that the property is within
+ * mSIDs.
+ */
+ #define CSS_PROP_PUBLIC_OR_PRIVATE(publicname_, privatename_) privatename_
+ #define CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_, \
+ kwtable_, stylestruct_, stylestructoffset_, animtype_) \
+ nsCSSValue* ValueFor##method_() { \
+ MOZ_ASSERT(mSIDs & NS_STYLE_INHERIT_BIT(stylestruct_), \
+ "Calling nsRuleData::ValueFor" #method_ " without " \
+ "NS_STYLE_INHERIT_BIT(" #stylestruct_ " in mSIDs."); \
+ nsStyleStructID sid = eStyleStruct_##stylestruct_; \
+ size_t indexInStruct = \
+ nsCSSProps::PropertyIndexInStruct(eCSSProperty_##id_); \
+ MOZ_ASSERT(indexInStruct != size_t(-1), \
+ "logical property"); \
+ return mValueStorage + mValueOffsets[sid] + indexInStruct; \
+ } \
+ const nsCSSValue* ValueFor##method_() const { \
+ return const_cast<nsRuleData*>(this)->ValueFor##method_(); \
+ }
+ #define CSS_PROP_LIST_EXCLUDE_LOGICAL
+ #include "nsCSSPropList.h"
+ #undef CSS_PROP_LIST_EXCLUDE_LOGICAL
+ #undef CSS_PROP
+ #undef CSS_PROP_PUBLIC_OR_PRIVATE
+
+private:
+ inline size_t GetPoisonOffset();
+
+};
+
+#endif