summaryrefslogtreecommitdiffstats
path: root/layout/style/nsIStyleRuleProcessor.h
diff options
context:
space:
mode:
Diffstat (limited to 'layout/style/nsIStyleRuleProcessor.h')
-rw-r--r--layout/style/nsIStyleRuleProcessor.h140
1 files changed, 140 insertions, 0 deletions
diff --git a/layout/style/nsIStyleRuleProcessor.h b/layout/style/nsIStyleRuleProcessor.h
new file mode 100644
index 000000000..2075050d4
--- /dev/null
+++ b/layout/style/nsIStyleRuleProcessor.h
@@ -0,0 +1,140 @@
+/* -*- 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/. */
+
+/*
+ * internal abstract interface for containers (roughly origins within
+ * the CSS cascade) that provide style rules matching an element or
+ * pseudo-element
+ */
+
+#ifndef nsIStyleRuleProcessor_h___
+#define nsIStyleRuleProcessor_h___
+
+#include "mozilla/MemoryReporting.h"
+#include "nsISupports.h"
+#include "nsChangeHint.h"
+
+struct RuleProcessorData;
+struct ElementRuleProcessorData;
+struct PseudoElementRuleProcessorData;
+struct AnonBoxRuleProcessorData;
+#ifdef MOZ_XUL
+struct XULTreeRuleProcessorData;
+#endif
+struct StateRuleProcessorData;
+struct PseudoElementStateRuleProcessorData;
+struct AttributeRuleProcessorData;
+class nsPresContext;
+
+// IID for the nsIStyleRuleProcessor interface
+// {c1d6001e-4fcb-4c40-bce1-5eba80bfd8f3}
+#define NS_ISTYLE_RULE_PROCESSOR_IID \
+{ 0xc1d6001e, 0x4fcb, 0x4c40, \
+ {0xbc, 0xe1, 0x5e, 0xba, 0x80, 0xbf, 0xd8, 0xf3} }
+
+
+/* The style rule processor interface is a mechanism to separate the matching
+ * of style rules from style sheet instances.
+ * Simple style sheets can and will act as their own processor.
+ * Sheets where rule ordering interlaces between multiple sheets, will need to
+ * share a single rule processor between them (CSS sheets do this for cascading order)
+ *
+ * @see nsIStyleRule (for significantly more detailed comments)
+ */
+class nsIStyleRuleProcessor : public nsISupports {
+public:
+ NS_DECLARE_STATIC_IID_ACCESSOR(NS_ISTYLE_RULE_PROCESSOR_IID)
+
+ // Shorthand for:
+ // nsCOMArray<nsIStyleRuleProcessor>::nsCOMArrayEnumFunc
+ typedef bool (* EnumFunc)(nsIStyleRuleProcessor*, void*);
+
+ /**
+ * Find the |nsIStyleRule|s matching the given content node and
+ * position the given |nsRuleWalker| at the |nsRuleNode| in the rule
+ * tree representing that ordered list of rules (with higher
+ * precedence being farther from the root of the lexicographic tree).
+ */
+ virtual void RulesMatching(ElementRuleProcessorData* aData) = 0;
+
+ /**
+ * Just like the previous |RulesMatching|, except for a given content
+ * node <em>and pseudo-element</em>.
+ */
+ virtual void RulesMatching(PseudoElementRuleProcessorData* aData) = 0;
+
+ /**
+ * Just like the previous |RulesMatching|, except for a given anonymous box.
+ */
+ virtual void RulesMatching(AnonBoxRuleProcessorData* aData) = 0;
+
+#ifdef MOZ_XUL
+ /**
+ * Just like the previous |RulesMatching|, except for a given content
+ * node <em>and tree pseudo</em>.
+ */
+ virtual void RulesMatching(XULTreeRuleProcessorData* aData) = 0;
+#endif
+
+ /**
+ * Return whether style can depend on a change of the given document state.
+ *
+ * Document states are defined in nsIDocument.h.
+ */
+ virtual bool
+ HasDocumentStateDependentStyle(StateRuleProcessorData* aData) = 0;
+
+ /**
+ * Return how (as described by nsRestyleHint) style can depend on a
+ * change of the given content state on the given content node. This
+ * test is used for optimization only, and may err on the side of
+ * reporting more dependencies than really exist.
+ *
+ * Event states are defined in mozilla/EventStates.h.
+ */
+ virtual nsRestyleHint
+ HasStateDependentStyle(StateRuleProcessorData* aData) = 0;
+ virtual nsRestyleHint
+ HasStateDependentStyle(PseudoElementStateRuleProcessorData* aData) = 0;
+
+ /**
+ * This method will be called twice for every attribute change.
+ * During the first call, aData->mAttrHasChanged will be false and
+ * the attribute change will not have happened yet. During the
+ * second call, aData->mAttrHasChanged will be true and the
+ * change will have already happened. The bitwise OR of the two
+ * return values must describe the style changes that are needed due
+ * to the attribute change. It's up to the rule processor
+ * implementation to decide how to split the bits up amongst the two
+ * return values. For example, it could return the bits needed by
+ * rules that might stop matching the node from the first call and
+ * the bits needed by rules that might have started matching the
+ * node from the second call. This test is used for optimization
+ * only, and may err on the side of reporting more dependencies than
+ * really exist.
+ */
+ virtual nsRestyleHint HasAttributeDependentStyle(
+ AttributeRuleProcessorData* aData,
+ mozilla::RestyleHintData& aRestyleHintDataResult) = 0;
+
+ /**
+ * Do any processing that needs to happen as a result of a change in
+ * the characteristics of the medium, and return whether this rule
+ * processor's rules have changed (e.g., because of media queries).
+ */
+ virtual bool MediumFeaturesChanged(nsPresContext* aPresContext) = 0;
+
+ /**
+ * Report the size of this style rule processor to about:memory. A
+ * processor may return 0.
+ */
+ virtual size_t SizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const = 0;
+ virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const = 0;
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(nsIStyleRuleProcessor,
+ NS_ISTYLE_RULE_PROCESSOR_IID)
+
+#endif /* nsIStyleRuleProcessor_h___ */