2004-01-08 01:30:53 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 15:12:37 +04:00
|
|
|
/* 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/. */
|
2004-01-08 01:30:53 +03:00
|
|
|
|
2006-03-25 08:47:31 +03:00
|
|
|
/*
|
|
|
|
* the container for the style sheets that apply to a presentation, and
|
|
|
|
* the internal API that the style system exposes for creating (and
|
|
|
|
* potentially re-creating) style contexts
|
|
|
|
*/
|
|
|
|
|
2004-01-08 01:30:53 +03:00
|
|
|
#ifndef nsStyleSet_h_
|
|
|
|
#define nsStyleSet_h_
|
|
|
|
|
2011-12-16 23:42:07 +04:00
|
|
|
#include "mozilla/Attributes.h"
|
2013-06-23 16:03:39 +04:00
|
|
|
#include "mozilla/MemoryReporting.h"
|
2011-12-16 23:42:07 +04:00
|
|
|
|
2004-01-08 01:30:53 +03:00
|
|
|
#include "nsIStyleRuleProcessor.h"
|
2009-12-31 18:56:33 +03:00
|
|
|
#include "nsCSSStyleSheet.h"
|
2007-02-17 02:02:08 +03:00
|
|
|
#include "nsBindingManager.h"
|
2004-01-08 01:30:53 +03:00
|
|
|
#include "nsRuleNode.h"
|
2007-07-25 21:14:13 +04:00
|
|
|
#include "nsTArray.h"
|
|
|
|
#include "nsCOMArray.h"
|
2008-11-26 02:22:38 +03:00
|
|
|
#include "nsAutoPtr.h"
|
2008-12-12 21:59:03 +03:00
|
|
|
#include "nsIStyleRule.h"
|
2009-12-11 10:37:40 +03:00
|
|
|
#include "nsCSSPseudoElements.h"
|
2013-05-20 06:59:20 +04:00
|
|
|
#include "gfxFontFeatures.h"
|
2004-01-08 01:30:53 +03:00
|
|
|
|
2008-11-26 02:22:38 +03:00
|
|
|
class nsCSSFontFaceRule;
|
2011-04-12 10:18:43 +04:00
|
|
|
class nsCSSKeyframesRule;
|
2013-05-20 06:59:20 +04:00
|
|
|
class nsCSSFontFeatureValuesRule;
|
2012-09-01 01:21:28 +04:00
|
|
|
class nsCSSPageRule;
|
2009-08-01 19:53:40 +04:00
|
|
|
class nsRuleWalker;
|
2012-11-14 23:09:01 +04:00
|
|
|
struct ElementDependentRuleProcessorData;
|
2011-03-29 21:29:21 +04:00
|
|
|
struct TreeMatchContext;
|
2004-01-08 01:30:53 +03:00
|
|
|
|
2012-06-19 07:26:34 +04:00
|
|
|
class nsEmptyStyleRule MOZ_FINAL : public nsIStyleRule
|
2008-12-12 21:59:03 +03:00
|
|
|
{
|
|
|
|
NS_DECL_ISUPPORTS
|
2013-05-14 20:33:23 +04:00
|
|
|
virtual void MapRuleInfoInto(nsRuleData* aRuleData) MOZ_OVERRIDE;
|
2008-12-12 21:59:03 +03:00
|
|
|
#ifdef DEBUG
|
2012-09-14 20:10:08 +04:00
|
|
|
virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE;
|
2008-12-12 21:59:03 +03:00
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
2012-06-19 07:26:34 +04:00
|
|
|
class nsInitialStyleRule MOZ_FINAL : public nsIStyleRule
|
2011-08-23 03:34:12 +04:00
|
|
|
{
|
|
|
|
NS_DECL_ISUPPORTS
|
2013-05-14 20:33:23 +04:00
|
|
|
virtual void MapRuleInfoInto(nsRuleData* aRuleData) MOZ_OVERRIDE;
|
2011-08-23 03:34:12 +04:00
|
|
|
#ifdef DEBUG
|
2012-09-14 20:10:08 +04:00
|
|
|
virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE;
|
2011-08-23 03:34:12 +04:00
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
2013-06-29 07:28:50 +04:00
|
|
|
class nsDisableTextZoomStyleRule MOZ_FINAL : public nsIStyleRule
|
|
|
|
{
|
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
virtual void MapRuleInfoInto(nsRuleData* aRuleData) MOZ_OVERRIDE;
|
|
|
|
#ifdef DEBUG
|
|
|
|
virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE;
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
2004-01-08 22:23:12 +03:00
|
|
|
// The style set object is created by the document viewer and ownership is
|
|
|
|
// then handed off to the PresShell. Only the PresShell should delete a
|
|
|
|
// style set.
|
|
|
|
|
2004-01-08 01:30:53 +03:00
|
|
|
class nsStyleSet
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
nsStyleSet();
|
|
|
|
|
2013-06-23 16:03:39 +04:00
|
|
|
size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
|
2011-08-01 22:24:38 +04:00
|
|
|
|
2013-04-01 02:08:29 +04:00
|
|
|
void Init(nsPresContext *aPresContext);
|
2004-01-08 01:30:53 +03:00
|
|
|
|
2009-01-30 07:39:23 +03:00
|
|
|
nsRuleNode* GetRuleTree() { return mRuleTree; }
|
|
|
|
|
2004-01-08 01:30:53 +03:00
|
|
|
// enable / disable the Quirk style sheet
|
2011-09-29 10:19:26 +04:00
|
|
|
void EnableQuirkStyleSheet(bool aEnable);
|
2004-01-08 01:30:53 +03:00
|
|
|
|
|
|
|
// get a style context for a non-pseudo frame.
|
|
|
|
already_AddRefed<nsStyleContext>
|
2010-04-30 17:12:06 +04:00
|
|
|
ResolveStyleFor(mozilla::dom::Element* aElement,
|
|
|
|
nsStyleContext* aParentContext);
|
2004-01-08 01:30:53 +03:00
|
|
|
|
2011-03-29 21:29:21 +04:00
|
|
|
already_AddRefed<nsStyleContext>
|
|
|
|
ResolveStyleFor(mozilla::dom::Element* aElement,
|
|
|
|
nsStyleContext* aParentContext,
|
|
|
|
TreeMatchContext& aTreeMatchContext);
|
|
|
|
|
2010-04-03 05:58:25 +04:00
|
|
|
// Get a style context (with the given parent) for the
|
|
|
|
// sequence of style rules in the |aRules| array.
|
2007-07-25 22:21:34 +04:00
|
|
|
already_AddRefed<nsStyleContext>
|
2009-08-11 02:52:29 +04:00
|
|
|
ResolveStyleForRules(nsStyleContext* aParentContext,
|
2012-10-18 01:01:56 +04:00
|
|
|
const nsTArray< nsCOMPtr<nsIStyleRule> > &aRules);
|
2007-07-25 22:21:34 +04:00
|
|
|
|
2012-12-12 01:12:43 +04:00
|
|
|
// used in ResolveStyleForRules below
|
|
|
|
struct RuleAndLevel
|
|
|
|
{
|
|
|
|
nsIStyleRule* mRule;
|
|
|
|
uint8_t mLevel;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Get a new style context for aElement for the rules in aRules
|
|
|
|
// aRules is an array of rules and their levels in reverse order,
|
|
|
|
// that is from the leaf-most to the root-most rule in the rule tree.
|
|
|
|
already_AddRefed<nsStyleContext>
|
|
|
|
ResolveStyleForRules(nsStyleContext* aParentContext,
|
|
|
|
nsStyleContext* aOldStyle,
|
|
|
|
const nsTArray<RuleAndLevel>& aRules);
|
|
|
|
|
2010-04-03 05:58:25 +04:00
|
|
|
// Get a style context that represents aBaseContext, but as though
|
|
|
|
// it additionally matched the rules in the aRules array (in that
|
|
|
|
// order, as more specific than any other rules).
|
|
|
|
already_AddRefed<nsStyleContext>
|
|
|
|
ResolveStyleByAddingRules(nsStyleContext* aBaseContext,
|
|
|
|
const nsCOMArray<nsIStyleRule> &aRules);
|
|
|
|
|
2005-09-12 03:17:28 +04:00
|
|
|
// Get a style context for a non-element (which no rules will match),
|
|
|
|
// such as text nodes, placeholder frames, and the nsFirstLetterFrame
|
|
|
|
// for everything after the first letter.
|
|
|
|
//
|
|
|
|
// Perhaps this should go away and we shouldn't even create style
|
2004-01-08 01:30:53 +03:00
|
|
|
// contexts for such content nodes. However, not doing any rule
|
|
|
|
// matching for them is a first step.
|
|
|
|
already_AddRefed<nsStyleContext>
|
2004-01-28 03:18:22 +03:00
|
|
|
ResolveStyleForNonElement(nsStyleContext* aParentContext);
|
2004-01-08 01:30:53 +03:00
|
|
|
|
2010-04-30 17:12:06 +04:00
|
|
|
// Get a style context for a pseudo-element. aParentElement must be
|
2009-12-11 10:37:40 +03:00
|
|
|
// non-null. aPseudoID is the nsCSSPseudoElements::Type for the
|
|
|
|
// pseudo-element.
|
|
|
|
already_AddRefed<nsStyleContext>
|
2010-04-30 17:12:06 +04:00
|
|
|
ResolvePseudoElementStyle(mozilla::dom::Element* aParentElement,
|
2009-12-11 10:37:40 +03:00
|
|
|
nsCSSPseudoElements::Type aType,
|
2009-12-11 10:37:40 +03:00
|
|
|
nsStyleContext* aParentContext);
|
2009-12-11 10:37:40 +03:00
|
|
|
|
|
|
|
// This functions just like ResolvePseudoElementStyle except that it will
|
2012-07-30 18:20:58 +04:00
|
|
|
// return nullptr if there are no explicit style rules for that
|
2009-12-11 10:37:40 +03:00
|
|
|
// pseudo element.
|
|
|
|
already_AddRefed<nsStyleContext>
|
2010-04-30 17:12:06 +04:00
|
|
|
ProbePseudoElementStyle(mozilla::dom::Element* aParentElement,
|
2009-12-11 10:37:40 +03:00
|
|
|
nsCSSPseudoElements::Type aType,
|
|
|
|
nsStyleContext* aParentContext);
|
2011-03-29 21:29:21 +04:00
|
|
|
already_AddRefed<nsStyleContext>
|
|
|
|
ProbePseudoElementStyle(mozilla::dom::Element* aParentElement,
|
|
|
|
nsCSSPseudoElements::Type aType,
|
|
|
|
nsStyleContext* aParentContext,
|
|
|
|
TreeMatchContext& aTreeMatchContext);
|
2013-05-20 06:59:20 +04:00
|
|
|
|
2009-12-11 10:37:40 +03:00
|
|
|
// Get a style context for an anonymous box. aPseudoTag is the
|
|
|
|
// pseudo-tag to use and must be non-null.
|
|
|
|
already_AddRefed<nsStyleContext>
|
2009-12-11 10:37:40 +03:00
|
|
|
ResolveAnonymousBoxStyle(nsIAtom* aPseudoTag, nsStyleContext* aParentContext);
|
2009-12-11 10:37:40 +03:00
|
|
|
|
|
|
|
#ifdef MOZ_XUL
|
|
|
|
// Get a style context for a XUL tree pseudo. aPseudoTag is the
|
|
|
|
// pseudo-tag to use and must be non-null. aParentContent must be
|
|
|
|
// non-null. aComparator must be non-null.
|
|
|
|
already_AddRefed<nsStyleContext>
|
2010-04-30 17:12:06 +04:00
|
|
|
ResolveXULTreePseudoStyle(mozilla::dom::Element* aParentElement,
|
2009-12-11 10:37:40 +03:00
|
|
|
nsIAtom* aPseudoTag,
|
|
|
|
nsStyleContext* aParentContext,
|
2009-12-11 10:37:40 +03:00
|
|
|
nsICSSPseudoComparator* aComparator);
|
2009-12-11 10:37:40 +03:00
|
|
|
#endif
|
|
|
|
|
2008-11-26 02:22:38 +03:00
|
|
|
// Append all the currently-active font face rules to aArray. Return
|
|
|
|
// true for success and false for failure.
|
2011-09-29 10:19:26 +04:00
|
|
|
bool AppendFontFaceRules(nsPresContext* aPresContext,
|
2008-11-27 06:50:16 +03:00
|
|
|
nsTArray<nsFontFaceRuleContainer>& aArray);
|
2008-11-26 02:22:38 +03:00
|
|
|
|
2013-08-15 08:58:37 +04:00
|
|
|
// Return the winning (in the cascade) @keyframes rule for the given name.
|
|
|
|
nsCSSKeyframesRule* KeyframesRuleForName(nsPresContext* aPresContext,
|
|
|
|
const nsString& aName);
|
2011-04-12 10:18:43 +04:00
|
|
|
|
2013-05-20 06:59:20 +04:00
|
|
|
// Fetch object for looking up font feature values
|
|
|
|
already_AddRefed<gfxFontFeatureValueSet> GetFontFeatureValuesLookup();
|
|
|
|
|
|
|
|
// Append all the currently-active font feature values rules to aArray.
|
|
|
|
// Return true for success and false for failure.
|
|
|
|
bool AppendFontFeatureValuesRules(nsPresContext* aPresContext,
|
|
|
|
nsTArray<nsCSSFontFeatureValuesRule*>& aArray);
|
|
|
|
|
2012-09-01 01:21:28 +04:00
|
|
|
// Append all the currently-active page rules to aArray. Return
|
|
|
|
// true for success and false for failure.
|
|
|
|
bool AppendPageRules(nsPresContext* aPresContext,
|
|
|
|
nsTArray<nsCSSPageRule*>& aArray);
|
|
|
|
|
2004-01-08 01:30:53 +03:00
|
|
|
// Begin ignoring style context destruction, to avoid lots of unnecessary
|
|
|
|
// work on document teardown.
|
2004-08-01 03:15:21 +04:00
|
|
|
void BeginShutdown(nsPresContext* aPresContext);
|
2004-01-08 01:30:53 +03:00
|
|
|
|
|
|
|
// Free all of the data associated with this style set.
|
2004-08-01 03:15:21 +04:00
|
|
|
void Shutdown(nsPresContext* aPresContext);
|
2004-01-08 01:30:53 +03:00
|
|
|
|
|
|
|
// Notification that a style context is being destroyed.
|
2004-08-01 03:15:21 +04:00
|
|
|
void NotifyStyleContextDestroyed(nsPresContext* aPresContext,
|
2004-01-08 01:30:53 +03:00
|
|
|
nsStyleContext* aStyleContext);
|
|
|
|
|
|
|
|
// Get a new style context that lives in a different parent
|
|
|
|
// The new context will be the same as the old if the new parent is the
|
|
|
|
// same as the old parent.
|
2010-06-23 08:46:27 +04:00
|
|
|
// aElement should be non-null if this is a style context for an
|
|
|
|
// element or pseudo-element; in the latter case it should be the
|
|
|
|
// real element the pseudo-element is for.
|
2004-01-08 01:30:53 +03:00
|
|
|
already_AddRefed<nsStyleContext>
|
2010-04-02 10:07:42 +04:00
|
|
|
ReparentStyleContext(nsStyleContext* aStyleContext,
|
2010-06-23 08:46:27 +04:00
|
|
|
nsStyleContext* aNewParentContext,
|
|
|
|
mozilla::dom::Element* aElement);
|
2004-01-08 01:30:53 +03:00
|
|
|
|
2010-03-17 20:10:57 +03:00
|
|
|
// Test if style is dependent on a document state.
|
2011-09-29 10:19:26 +04:00
|
|
|
bool HasDocumentStateDependentStyle(nsPresContext* aPresContext,
|
2010-03-17 20:10:57 +03:00
|
|
|
nsIContent* aContent,
|
2010-10-20 15:26:32 +04:00
|
|
|
nsEventStates aStateMask);
|
2010-03-17 20:10:57 +03:00
|
|
|
|
2004-01-08 01:30:53 +03:00
|
|
|
// Test if style is dependent on content state
|
2010-04-01 04:43:32 +04:00
|
|
|
nsRestyleHint HasStateDependentStyle(nsPresContext* aPresContext,
|
2010-05-14 21:04:51 +04:00
|
|
|
mozilla::dom::Element* aElement,
|
2010-10-20 15:26:32 +04:00
|
|
|
nsEventStates aStateMask);
|
2004-01-08 01:30:53 +03:00
|
|
|
|
|
|
|
// Test if style is dependent on the presence of an attribute.
|
2010-04-01 04:43:32 +04:00
|
|
|
nsRestyleHint HasAttributeDependentStyle(nsPresContext* aPresContext,
|
2010-05-14 21:04:51 +04:00
|
|
|
mozilla::dom::Element* aElement,
|
2007-07-13 00:05:45 +04:00
|
|
|
nsIAtom* aAttribute,
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t aModType,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool aAttrHasChanged);
|
2004-01-08 01:30:53 +03:00
|
|
|
|
2008-07-26 20:14:48 +04:00
|
|
|
/*
|
|
|
|
* Do any processing that needs to happen as a result of a change in
|
|
|
|
* the characteristics of the medium, and return whether style rules
|
|
|
|
* may have changed as a result.
|
|
|
|
*/
|
2011-09-29 10:19:26 +04:00
|
|
|
bool MediumFeaturesChanged(nsPresContext* aPresContext);
|
2008-07-26 20:14:48 +04:00
|
|
|
|
2004-01-08 01:30:53 +03:00
|
|
|
// APIs for registering objects that can supply additional
|
|
|
|
// rules during processing.
|
2007-02-17 02:02:08 +03:00
|
|
|
void SetBindingManager(nsBindingManager* aBindingManager)
|
2004-01-08 01:30:53 +03:00
|
|
|
{
|
2007-02-17 02:02:08 +03:00
|
|
|
mBindingManager = aBindingManager;
|
2004-01-08 01:30:53 +03:00
|
|
|
}
|
|
|
|
|
2005-08-20 05:24:00 +04:00
|
|
|
// The "origins" of the CSS cascade, from lowest precedence to
|
|
|
|
// highest (for non-!important rules).
|
2004-01-08 01:30:53 +03:00
|
|
|
enum sheetType {
|
2004-07-28 11:08:41 +04:00
|
|
|
eAgentSheet, // CSS
|
|
|
|
eUserSheet, // CSS
|
2011-01-15 05:14:41 +03:00
|
|
|
ePresHintSheet,
|
2004-07-28 11:08:41 +04:00
|
|
|
eDocSheet, // CSS
|
2013-01-09 03:25:47 +04:00
|
|
|
eScopedDocSheet,
|
2004-07-28 11:08:41 +04:00
|
|
|
eStyleAttrSheet,
|
|
|
|
eOverrideSheet, // CSS
|
2011-04-12 10:18:44 +04:00
|
|
|
eAnimationSheet,
|
2011-05-01 02:16:19 +04:00
|
|
|
eTransitionSheet,
|
2004-01-08 01:30:53 +03:00
|
|
|
eSheetTypeCount
|
2007-05-17 01:08:51 +04:00
|
|
|
// be sure to keep the number of bits in |mDirty| below and in
|
|
|
|
// NS_RULE_NODE_LEVEL_MASK updated when changing the number of sheet
|
|
|
|
// types
|
2004-01-08 01:30:53 +03:00
|
|
|
};
|
|
|
|
|
2005-08-20 05:24:00 +04:00
|
|
|
// APIs to manipulate the style sheet lists. The sheets in each
|
|
|
|
// list are stored with the most significant sheet last.
|
2004-01-08 01:30:53 +03:00
|
|
|
nsresult AppendStyleSheet(sheetType aType, nsIStyleSheet *aSheet);
|
|
|
|
nsresult PrependStyleSheet(sheetType aType, nsIStyleSheet *aSheet);
|
|
|
|
nsresult RemoveStyleSheet(sheetType aType, nsIStyleSheet *aSheet);
|
|
|
|
nsresult ReplaceSheets(sheetType aType,
|
|
|
|
const nsCOMArray<nsIStyleSheet> &aNewSheets);
|
2012-10-29 15:21:15 +04:00
|
|
|
nsresult InsertStyleSheetBefore(sheetType aType, nsIStyleSheet *aNewSheet,
|
|
|
|
nsIStyleSheet *aReferenceSheet);
|
2004-01-08 01:30:53 +03:00
|
|
|
|
2013-06-14 09:34:37 +04:00
|
|
|
nsresult DirtyRuleProcessors(sheetType aType);
|
|
|
|
|
2013-01-09 03:25:47 +04:00
|
|
|
// Enable/Disable entire author style level (Doc, ScopedDoc & PresHint levels)
|
2011-09-29 10:19:26 +04:00
|
|
|
bool GetAuthorStyleDisabled();
|
|
|
|
nsresult SetAuthorStyleDisabled(bool aStyleDisabled);
|
2004-08-05 15:38:42 +04:00
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t SheetCount(sheetType aType) const {
|
2004-01-08 01:30:53 +03:00
|
|
|
return mSheets[aType].Count();
|
|
|
|
}
|
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
nsIStyleSheet* StyleSheetAt(sheetType aType, int32_t aIndex) const {
|
2004-01-08 01:30:53 +03:00
|
|
|
return mSheets[aType].ObjectAt(aIndex);
|
|
|
|
}
|
|
|
|
|
2013-01-09 03:25:47 +04:00
|
|
|
nsresult RemoveDocStyleSheet(nsIStyleSheet* aSheet);
|
2004-01-08 01:30:53 +03:00
|
|
|
nsresult AddDocStyleSheet(nsIStyleSheet* aSheet, nsIDocument* aDocument);
|
|
|
|
|
|
|
|
void BeginUpdate();
|
|
|
|
nsresult EndUpdate();
|
|
|
|
|
2007-07-25 21:14:13 +04:00
|
|
|
// Methods for reconstructing the tree; BeginReconstruct basically moves the
|
|
|
|
// old rule tree root and style context roots out of the way,
|
|
|
|
// and EndReconstruct destroys the old rule tree when we're done
|
|
|
|
nsresult BeginReconstruct();
|
|
|
|
// Note: EndReconstruct should not be called if BeginReconstruct fails
|
|
|
|
void EndReconstruct();
|
|
|
|
|
2008-11-03 05:29:51 +03:00
|
|
|
// Let the style set know that a particular sheet is the quirks sheet. This
|
|
|
|
// sheet must already have been added to the UA sheets. The pointer must not
|
|
|
|
// be null. This should only be called once for a given style set.
|
|
|
|
void SetQuirkStyleSheet(nsIStyleSheet* aQuirkStyleSheet);
|
2008-12-29 18:07:36 +03:00
|
|
|
|
|
|
|
// Return whether the rule tree has cached data such that we need to
|
|
|
|
// do dynamic change handling for changes that change the results of
|
|
|
|
// media queries or require rebuilding all style data.
|
|
|
|
// We don't care whether we have cached rule processors or whether
|
|
|
|
// they have cached rule cascades; getting the rule cascades again in
|
|
|
|
// order to do rule matching will get the correct rule cascade.
|
2011-09-29 10:19:26 +04:00
|
|
|
bool HasCachedStyleData() const {
|
2008-12-29 18:07:36 +03:00
|
|
|
return (mRuleTree && mRuleTree->TreeHasCachedData()) || !mRoots.IsEmpty();
|
|
|
|
}
|
2009-09-24 21:59:43 +04:00
|
|
|
|
|
|
|
// Notify the style set that a rulenode is no longer in use, or was
|
|
|
|
// just created and is not in use yet.
|
|
|
|
void RuleNodeUnused() {
|
|
|
|
++mUnusedRuleNodeCount;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Notify the style set that a rulenode that wasn't in use now is
|
|
|
|
void RuleNodeInUse() {
|
|
|
|
--mUnusedRuleNodeCount;
|
|
|
|
}
|
2009-12-31 18:56:33 +03:00
|
|
|
|
|
|
|
nsCSSStyleSheet::EnsureUniqueInnerResult EnsureUniqueInnerOnCSSSheets();
|
|
|
|
|
2011-08-23 03:34:12 +04:00
|
|
|
nsIStyleRule* InitialStyleRule();
|
|
|
|
|
2004-01-08 01:30:53 +03:00
|
|
|
private:
|
2011-12-16 23:42:07 +04:00
|
|
|
nsStyleSet(const nsStyleSet& aCopy) MOZ_DELETE;
|
|
|
|
nsStyleSet& operator=(const nsStyleSet& aCopy) MOZ_DELETE;
|
2004-01-08 01:30:53 +03:00
|
|
|
|
2009-01-30 07:39:23 +03:00
|
|
|
// Run mark-and-sweep GC on mRuleTree and mOldRuleTrees, based on mRoots.
|
|
|
|
void GCRuleTrees();
|
|
|
|
|
2004-01-08 01:30:53 +03:00
|
|
|
// Update the rule processor list after a change to the style sheet list.
|
2004-07-28 11:08:41 +04:00
|
|
|
nsresult GatherRuleProcessors(sheetType aType);
|
2004-01-08 01:30:53 +03:00
|
|
|
|
|
|
|
void AddImportantRules(nsRuleNode* aCurrLevelNode,
|
2009-10-03 01:06:42 +04:00
|
|
|
nsRuleNode* aLastPrevLevelNode,
|
|
|
|
nsRuleWalker* aRuleWalker);
|
2004-01-08 01:30:53 +03:00
|
|
|
|
2009-10-03 01:06:42 +04:00
|
|
|
// Move aRuleWalker forward by the appropriate rule if we need to add
|
2008-12-12 21:59:03 +03:00
|
|
|
// a rule due to property restrictions on pseudo-elements.
|
2009-12-11 10:37:40 +03:00
|
|
|
void WalkRestrictionRule(nsCSSPseudoElements::Type aPseudoType,
|
2009-10-03 01:06:42 +04:00
|
|
|
nsRuleWalker* aRuleWalker);
|
2008-12-12 21:59:03 +03:00
|
|
|
|
2013-06-29 07:28:50 +04:00
|
|
|
void WalkDisableTextZoomRule(mozilla::dom::Element* aElement,
|
|
|
|
nsRuleWalker* aRuleWalker);
|
|
|
|
|
2004-07-16 00:30:30 +04:00
|
|
|
#ifdef DEBUG
|
|
|
|
// Just like AddImportantRules except it doesn't actually add anything; it
|
|
|
|
// just asserts that there are no important rules between aCurrLevelNode and
|
|
|
|
// aLastPrevLevelNode.
|
|
|
|
void AssertNoImportantRules(nsRuleNode* aCurrLevelNode,
|
|
|
|
nsRuleNode* aLastPrevLevelNode);
|
|
|
|
|
|
|
|
// Just like AddImportantRules except it doesn't actually add anything; it
|
|
|
|
// just asserts that there are no CSS rules between aCurrLevelNode and
|
2011-01-15 05:14:41 +03:00
|
|
|
// aLastPrevLevelNode. Mostly useful for the preshint level.
|
2004-07-16 00:30:30 +04:00
|
|
|
void AssertNoCSSRules(nsRuleNode* aCurrLevelNode,
|
|
|
|
nsRuleNode* aLastPrevLevelNode);
|
|
|
|
#endif
|
|
|
|
|
2004-01-08 01:30:53 +03:00
|
|
|
// Enumerate the rules in a way that cares about the order of the
|
|
|
|
// rules.
|
2013-01-09 03:25:47 +04:00
|
|
|
// aElement is the element the rules are for. It might be null. aData
|
2009-12-11 10:37:40 +03:00
|
|
|
// is the closure to pass to aCollectorFunc. If aContent is not null,
|
|
|
|
// aData must be a RuleProcessorData*
|
2004-01-08 01:30:53 +03:00
|
|
|
void FileRules(nsIStyleRuleProcessor::EnumFunc aCollectorFunc,
|
2013-01-09 03:25:47 +04:00
|
|
|
RuleProcessorData* aData, mozilla::dom::Element* aElement,
|
2012-11-14 23:09:01 +04:00
|
|
|
nsRuleWalker* aRuleWalker);
|
2004-01-08 01:30:53 +03:00
|
|
|
|
|
|
|
// Enumerate all the rules in a way that doesn't care about the order
|
|
|
|
// of the rules and break out if the enumeration is halted.
|
|
|
|
void WalkRuleProcessors(nsIStyleRuleProcessor::EnumFunc aFunc,
|
2012-11-14 23:09:01 +04:00
|
|
|
ElementDependentRuleProcessorData* aData,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool aWalkAllXBLStylesheets);
|
2004-01-08 01:30:53 +03:00
|
|
|
|
2013-02-01 20:02:29 +04:00
|
|
|
/**
|
|
|
|
* Bit-flags that can be passed to GetContext() in its parameter 'aFlags'.
|
|
|
|
*/
|
|
|
|
enum {
|
|
|
|
eNoFlags = 0,
|
|
|
|
eIsLink = 1 << 0,
|
|
|
|
eIsVisitedLink = 1 << 1,
|
2013-02-21 11:34:58 +04:00
|
|
|
eDoAnimation = 1 << 2,
|
|
|
|
|
|
|
|
// Indicates that we should skip the flex-item-specific chunk of
|
|
|
|
// ApplyStyleFixups(). This is useful if our parent has "display: flex"
|
|
|
|
// but we can tell it's not going to actually be a flex container (e.g. if
|
|
|
|
// it's the outer frame of a button widget, and we're the inline frame for
|
|
|
|
// the button's label).
|
|
|
|
eSkipFlexItemStyleFixup = 1 << 3
|
2013-02-01 20:02:29 +04:00
|
|
|
};
|
|
|
|
|
2010-04-02 10:07:42 +04:00
|
|
|
already_AddRefed<nsStyleContext>
|
|
|
|
GetContext(nsStyleContext* aParentContext,
|
|
|
|
nsRuleNode* aRuleNode,
|
2010-04-03 05:58:27 +04:00
|
|
|
nsRuleNode* aVisitedRuleNode,
|
2010-04-02 10:07:42 +04:00
|
|
|
nsIAtom* aPseudoTag,
|
2011-04-12 10:18:44 +04:00
|
|
|
nsCSSPseudoElements::Type aPseudoType,
|
2013-02-01 20:02:29 +04:00
|
|
|
mozilla::dom::Element* aElementForAnimation,
|
|
|
|
uint32_t aFlags);
|
2004-01-08 01:30:53 +03:00
|
|
|
|
2013-02-17 01:04:54 +04:00
|
|
|
nsPresContext* PresContext() { return mRuleTree->PresContext(); }
|
2004-01-28 03:18:22 +03:00
|
|
|
|
2006-06-08 18:32:20 +04:00
|
|
|
// The sheets in each array in mSheets are stored with the most significant
|
|
|
|
// sheet last.
|
2013-06-14 09:34:37 +04:00
|
|
|
// The arrays for ePresHintSheet, eStyleAttrSheet, eTransitionSheet,
|
|
|
|
// and eAnimationSheet are always empty. (FIXME: We should reduce
|
|
|
|
// the storage needed for them.)
|
2004-01-08 01:30:53 +03:00
|
|
|
nsCOMArray<nsIStyleSheet> mSheets[eSheetTypeCount];
|
|
|
|
|
2013-01-09 03:25:47 +04:00
|
|
|
// mRuleProcessors[eScopedDocSheet] is always null; rule processors
|
|
|
|
// for scoped style sheets are stored in mScopedDocSheetRuleProcessors.
|
2004-07-28 11:08:41 +04:00
|
|
|
nsCOMPtr<nsIStyleRuleProcessor> mRuleProcessors[eSheetTypeCount];
|
2004-01-08 01:30:53 +03:00
|
|
|
|
2013-01-09 03:25:47 +04:00
|
|
|
// Rule processors for HTML5 scoped style sheets, one per scope.
|
|
|
|
nsTArray<nsCOMPtr<nsIStyleRuleProcessor> > mScopedDocSheetRuleProcessors;
|
|
|
|
|
2004-01-08 01:30:53 +03:00
|
|
|
// cached instance for enabling/disabling
|
|
|
|
nsCOMPtr<nsIStyleSheet> mQuirkStyleSheet;
|
|
|
|
|
2007-02-17 02:02:08 +03:00
|
|
|
nsRefPtr<nsBindingManager> mBindingManager;
|
2004-01-08 01:30:53 +03:00
|
|
|
|
|
|
|
nsRuleNode* mRuleTree; // This is the root of our rule tree. It is a
|
|
|
|
// lexicographic tree of matched rules that style
|
|
|
|
// contexts use to look up properties.
|
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
uint16_t mBatching;
|
2012-04-17 23:22:49 +04:00
|
|
|
|
|
|
|
unsigned mInShutdown : 1;
|
|
|
|
unsigned mAuthorStyleDisabled: 1;
|
|
|
|
unsigned mInReconstruct : 1;
|
2013-05-20 06:59:20 +04:00
|
|
|
unsigned mInitFontFeatureValuesLookup : 1;
|
2013-01-09 03:25:47 +04:00
|
|
|
unsigned mDirty : 9; // one dirty bit is used per sheet type
|
2012-04-17 23:22:49 +04:00
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t mUnusedRuleNodeCount; // used to batch rule node GC
|
2007-07-25 21:14:13 +04:00
|
|
|
nsTArray<nsStyleContext*> mRoots; // style contexts with no parent
|
2004-01-08 01:30:53 +03:00
|
|
|
|
2008-12-12 21:59:03 +03:00
|
|
|
// Empty style rules to force things that restrict which properties
|
|
|
|
// apply into different branches of the rule tree.
|
2012-11-09 14:25:52 +04:00
|
|
|
nsRefPtr<nsEmptyStyleRule> mFirstLineRule, mFirstLetterRule, mPlaceholderRule;
|
2008-12-12 21:59:03 +03:00
|
|
|
|
2011-08-23 03:34:12 +04:00
|
|
|
// Style rule which sets all properties to their initial values for
|
|
|
|
// determining when context-sensitive values are in use.
|
|
|
|
nsRefPtr<nsInitialStyleRule> mInitialStyleRule;
|
|
|
|
|
2013-06-29 07:28:50 +04:00
|
|
|
// Style rule that sets the internal -x-text-zoom property on
|
|
|
|
// <svg:text> elements to disable the effect of text zooming.
|
|
|
|
nsRefPtr<nsDisableTextZoomStyleRule> mDisableTextZoomStyleRule;
|
|
|
|
|
2009-01-30 07:39:23 +03:00
|
|
|
// Old rule trees, which should only be non-empty between
|
|
|
|
// BeginReconstruct and EndReconstruct, but in case of bugs that cause
|
|
|
|
// style contexts to exist too long, may last longer.
|
|
|
|
nsTArray<nsRuleNode*> mOldRuleTrees;
|
2013-05-20 06:59:20 +04:00
|
|
|
|
|
|
|
// whether font feature values lookup object needs initialization
|
|
|
|
nsRefPtr<gfxFontFeatureValueSet> mFontFeatureValuesLookup;
|
2004-01-08 01:30:53 +03:00
|
|
|
};
|
|
|
|
|
2013-03-16 08:31:38 +04:00
|
|
|
#ifdef MOZILLA_INTERNAL_API
|
2009-09-24 21:59:43 +04:00
|
|
|
inline
|
2010-04-07 01:52:17 +04:00
|
|
|
void nsRuleNode::AddRef()
|
2009-09-24 21:59:43 +04:00
|
|
|
{
|
|
|
|
if (mRefCnt++ == 0 && !IsRoot()) {
|
|
|
|
mPresContext->StyleSet()->RuleNodeInUse();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
inline
|
2010-04-07 01:52:17 +04:00
|
|
|
void nsRuleNode::Release()
|
2009-09-24 21:59:43 +04:00
|
|
|
{
|
|
|
|
if (--mRefCnt == 0 && !IsRoot()) {
|
|
|
|
mPresContext->StyleSet()->RuleNodeUnused();
|
|
|
|
}
|
|
|
|
}
|
2004-01-08 01:30:53 +03:00
|
|
|
#endif
|
2010-04-19 19:41:39 +04:00
|
|
|
|
|
|
|
#endif
|