diff --git a/content/base/src/nsContentUtils.cpp b/content/base/src/nsContentUtils.cpp index 967a46c1dcbf..d3ad9dbb930e 100644 --- a/content/base/src/nsContentUtils.cpp +++ b/content/base/src/nsContentUtils.cpp @@ -165,6 +165,7 @@ static NS_DEFINE_CID(kXTFServiceCID, NS_XTFSERVICE_CID); #include "nsIDOMDragEvent.h" #include "nsDOMDataTransfer.h" #include "nsHtml5Module.h" +#include "nsPresContext.h" #ifdef IBMBIDI #include "nsIBidiKeyboard.h" diff --git a/content/base/src/nsGenericElement.cpp b/content/base/src/nsGenericElement.cpp index 11ad999a9b2d..df5875a4fc82 100644 --- a/content/base/src/nsGenericElement.cpp +++ b/content/base/src/nsGenericElement.cpp @@ -134,6 +134,7 @@ #include "nsXBLInsertionPoint.h" #include "nsICSSStyleRule.h" /* For nsCSSSelectorList */ #include "nsCSSRuleProcessor.h" +#include "nsRuleProcessorData.h" #ifdef MOZ_XUL #include "nsIXULDocument.h" diff --git a/content/xbl/src/nsBindingManager.cpp b/content/xbl/src/nsBindingManager.cpp index 837de33cd3f1..b8ee33788859 100644 --- a/content/xbl/src/nsBindingManager.cpp +++ b/content/xbl/src/nsBindingManager.cpp @@ -69,6 +69,7 @@ #include "nsIHTMLCSSStyleSheet.h" #include "nsIStyleRuleProcessor.h" +#include "nsRuleProcessorData.h" #include "nsIWeakReference.h" #include "jsapi.h" diff --git a/content/xbl/src/nsXBLPrototypeHandler.cpp b/content/xbl/src/nsXBLPrototypeHandler.cpp index 03f63f479b62..0eeab2da8956 100644 --- a/content/xbl/src/nsXBLPrototypeHandler.cpp +++ b/content/xbl/src/nsXBLPrototypeHandler.cpp @@ -81,6 +81,7 @@ #include "nsCRT.h" #include "nsXBLEventHandler.h" #include "nsEventDispatcher.h" +#include "nsPresContext.h" static NS_DEFINE_CID(kDOMScriptObjectFactoryCID, NS_DOM_SCRIPT_OBJECT_FACTORY_CID); diff --git a/layout/style/Makefile.in b/layout/style/Makefile.in index 16543c5a5c6c..1a38bc73fde7 100644 --- a/layout/style/Makefile.in +++ b/layout/style/Makefile.in @@ -114,6 +114,7 @@ EXPORTS = \ nsLayoutStylesheetCache.h \ nsRuleData.h \ nsRuleNode.h \ + nsRuleProcessorData.h \ nsRuleWalker.h \ nsStyleContext.h \ nsStyleCoord.h \ diff --git a/layout/style/nsCSSRuleProcessor.cpp b/layout/style/nsCSSRuleProcessor.cpp index a25fcafc9e76..5f1df105ddd0 100644 --- a/layout/style/nsCSSRuleProcessor.cpp +++ b/layout/style/nsCSSRuleProcessor.cpp @@ -46,6 +46,7 @@ */ #include "nsCSSRuleProcessor.h" +#include "nsRuleProcessorData.h" #define PL_ARENA_CONST_ALIGN_MASK 7 #define NS_RULEHASH_ARENA_BLOCK_SIZE (256) diff --git a/layout/style/nsCSSRuleProcessor.h b/layout/style/nsCSSRuleProcessor.h index 6863f404e313..cfd5b2a70b93 100644 --- a/layout/style/nsCSSRuleProcessor.h +++ b/layout/style/nsCSSRuleProcessor.h @@ -49,10 +49,10 @@ #include "nsCSSStyleSheet.h" #include "nsTArray.h" #include "nsAutoPtr.h" +#include "nsCSSRules.h" struct RuleCascadeData; struct nsCSSSelectorList; -class nsCSSFontFaceRule; /** * The CSS style rule processor provides a mechanism for sibling style diff --git a/layout/style/nsHTMLCSSStyleSheet.cpp b/layout/style/nsHTMLCSSStyleSheet.cpp index 8739e465731b..07726191a518 100644 --- a/layout/style/nsHTMLCSSStyleSheet.cpp +++ b/layout/style/nsHTMLCSSStyleSheet.cpp @@ -54,6 +54,7 @@ #include "nsCOMPtr.h" #include "nsRuleWalker.h" #include "nsRuleData.h" +#include "nsRuleProcessorData.h" // ----------------------------------------------------------- diff --git a/layout/style/nsHTMLStyleSheet.cpp b/layout/style/nsHTMLStyleSheet.cpp index 7ecbf9289a11..eb6a6f84fe08 100644 --- a/layout/style/nsHTMLStyleSheet.cpp +++ b/layout/style/nsHTMLStyleSheet.cpp @@ -69,6 +69,7 @@ #include "nsRuleWalker.h" #include "nsRuleData.h" #include "nsContentErrors.h" +#include "nsRuleProcessorData.h" NS_IMPL_ISUPPORTS1(nsHTMLStyleSheet::HTMLColorRule, nsIStyleRule) diff --git a/layout/style/nsHTMLStyleSheet.h b/layout/style/nsHTMLStyleSheet.h index d0727af34da6..fc5cc7aebef1 100644 --- a/layout/style/nsHTMLStyleSheet.h +++ b/layout/style/nsHTMLStyleSheet.h @@ -50,6 +50,7 @@ #include "nsIStyleRule.h" #include "pldhash.h" #include "nsCOMPtr.h" +#include "nsColor.h" class nsMappedAttributes; class nsHTMLStyleSheet : public nsIStyleSheet, public nsIStyleRuleProcessor { diff --git a/layout/style/nsIStyleRuleProcessor.h b/layout/style/nsIStyleRuleProcessor.h index 4588b9499484..4363dc495b04 100644 --- a/layout/style/nsIStyleRuleProcessor.h +++ b/layout/style/nsIStyleRuleProcessor.h @@ -45,179 +45,16 @@ #ifndef nsIStyleRuleProcessor_h___ #define nsIStyleRuleProcessor_h___ -#include - #include "nsISupports.h" -#include "nsPresContext.h" // for nsCompatability -#include "nsString.h" #include "nsChangeHint.h" #include "nsIContent.h" -class nsIStyleSheet; +struct RuleProcessorData; +struct ElementRuleProcessorData; +struct PseudoRuleProcessorData; +struct StateRuleProcessorData; +struct AttributeRuleProcessorData; class nsPresContext; -class nsIAtom; -class nsICSSPseudoComparator; -class nsRuleWalker; -class nsAttrValue; - -// The implementation of the constructor and destructor are currently in -// nsCSSRuleProcessor.cpp. - -struct RuleProcessorData { - RuleProcessorData(nsPresContext* aPresContext, - nsIContent* aContent, - nsRuleWalker* aRuleWalker, - nsCompatibility* aCompat = nsnull); - - // NOTE: not |virtual| - ~RuleProcessorData(); - - // This should be used for all heap-allocation of RuleProcessorData - static RuleProcessorData* Create(nsPresContext* aPresContext, - nsIContent* aContent, - nsRuleWalker* aRuleWalker, - nsCompatibility aCompat) - { - if (NS_LIKELY(aPresContext)) { - return new (aPresContext) RuleProcessorData(aPresContext, aContent, - aRuleWalker, &aCompat); - } - - return new RuleProcessorData(aPresContext, aContent, aRuleWalker, - &aCompat); - } - - void Destroy() { - nsPresContext * pc = mPresContext; - if (NS_LIKELY(pc)) { - this->~RuleProcessorData(); - pc->FreeToShell(sizeof(RuleProcessorData), this); - return; - } - delete this; - } - - // For placement new - void* operator new(size_t sz, RuleProcessorData* aSlot) CPP_THROW_NEW { - return aSlot; - } -private: - void* operator new(size_t sz, nsPresContext* aContext) CPP_THROW_NEW { - return aContext->AllocateFromShell(sz); - } - void* operator new(size_t sz) CPP_THROW_NEW { - return ::operator new(sz); - } -public: - const nsString* GetLang(); - - // Returns a 1-based index of the child in its parent. If the child - // is not in its parent's child list (i.e., it is anonymous content), - // returns 0. - // If aCheckEdgeOnly is true, the function will return 1 if the result - // is 1, and something other than 1 (maybe or maybe not a valid - // result) otherwise. - PRInt32 GetNthIndex(PRBool aIsOfType, PRBool aIsFromEnd, - PRBool aCheckEdgeOnly); - - nsPresContext* mPresContext; - nsIContent* mContent; // weak ref - nsIContent* mParentContent; // if content, content->GetParent(); weak ref - nsRuleWalker* mRuleWalker; // Used to add rules to our results. - nsIContent* mScopedRoot; // Root of scoped stylesheet (set and unset by the supplier of the scoped stylesheet - - nsIAtom* mContentTag; // if content, then content->GetTag() - nsIAtom* mContentID; // if styled content, then weak reference to styledcontent->GetID() - PRPackedBool mIsHTMLContent; // if content, then does QI on HTMLContent, true or false - PRPackedBool mIsLink; // if content, calls nsStyleUtil::IsHTMLLink or nsStyleUtil::IsLink - PRPackedBool mHasAttributes; // if content, content->GetAttrCount() > 0 - nsCompatibility mCompatMode; // Possibly remove use of this in SelectorMatches? - nsLinkState mLinkState; // if a link, this is the state, otherwise unknown - PRInt32 mEventState; // if content, eventStateMgr->GetContentState() - PRInt32 mNameSpaceID; // if content, content->GetNameSapce() - const nsAttrValue* mClasses; // if styled content, styledcontent->GetClasses() - // mPreviousSiblingData and mParentData are always RuleProcessorData - // and never a derived class. They are allocated lazily, when - // selectors require matching of prior siblings or ancestors. - RuleProcessorData* mPreviousSiblingData; - RuleProcessorData* mParentData; - -protected: - nsString *mLanguage; // NULL means we haven't found out the language yet - - // This node's index for :nth-child(), :nth-last-child(), - // :nth-of-type(), :nth-last-of-type(). If -2, needs to be computed. - // If -1, needs to be computed but known not to be 1. - // If 0, the node is not at any index in its parent. - // The first subscript is 0 for -child and 1 for -of-type, the second - // subscript is 0 for nth- and 1 for nth-last-. - PRInt32 mNthIndices[2][2]; -}; - -struct ElementRuleProcessorData : public RuleProcessorData { - ElementRuleProcessorData(nsPresContext* aPresContext, - nsIContent* aContent, - nsRuleWalker* aRuleWalker) - : RuleProcessorData(aPresContext,aContent,aRuleWalker) - { - NS_PRECONDITION(aPresContext, "null pointer"); - NS_PRECONDITION(aContent, "null pointer"); - NS_PRECONDITION(aRuleWalker, "null pointer"); - } -}; - -struct PseudoRuleProcessorData : public RuleProcessorData { - PseudoRuleProcessorData(nsPresContext* aPresContext, - nsIContent* aParentContent, - nsIAtom* aPseudoTag, - nsICSSPseudoComparator* aComparator, - nsRuleWalker* aRuleWalker) - : RuleProcessorData(aPresContext, aParentContent, aRuleWalker) - { - NS_PRECONDITION(aPresContext, "null pointer"); - NS_PRECONDITION(aPseudoTag, "null pointer"); - NS_PRECONDITION(aRuleWalker, "null pointer"); - mPseudoTag = aPseudoTag; - mComparator = aComparator; - } - - nsIAtom* mPseudoTag; - nsICSSPseudoComparator* mComparator; -}; - -struct StateRuleProcessorData : public RuleProcessorData { - StateRuleProcessorData(nsPresContext* aPresContext, - nsIContent* aContent, - PRInt32 aStateMask) - : RuleProcessorData(aPresContext, aContent, nsnull), - mStateMask(aStateMask) - { - NS_PRECONDITION(aPresContext, "null pointer"); - NS_PRECONDITION(aContent, "null pointer"); - } - const PRInt32 mStateMask; // |HasStateDependentStyle| for which state(s)? - // Constants defined in nsIEventStateManager.h . -}; - -struct AttributeRuleProcessorData : public RuleProcessorData { - AttributeRuleProcessorData(nsPresContext* aPresContext, - nsIContent* aContent, - nsIAtom* aAttribute, - PRInt32 aModType, - PRUint32 aStateMask) - : RuleProcessorData(aPresContext, aContent, nsnull), - mAttribute(aAttribute), - mModType(aModType), - mStateMask(aStateMask) - { - NS_PRECONDITION(aPresContext, "null pointer"); - NS_PRECONDITION(aContent, "null pointer"); - } - nsIAtom* mAttribute; // |HasAttributeDependentStyle| for which attribute? - PRInt32 mModType; // The type of modification (see nsIDOMMutationEvent). - PRUint32 mStateMask; // The states that changed with the attr change. -}; - // IID for the nsIStyleRuleProcessor interface {015575fe-7b6c-11d3-ba05-001083023c2b} #define NS_ISTYLE_RULE_PROCESSOR_IID \ diff --git a/layout/style/nsRuleProcessorData.h b/layout/style/nsRuleProcessorData.h new file mode 100644 index 000000000000..f28b7311e030 --- /dev/null +++ b/layout/style/nsRuleProcessorData.h @@ -0,0 +1,217 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * L. David Baron , Mozilla Corporation + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +/* + * data structures passed to nsIStyleRuleProcessor methods (to pull loop + * invariant computations out of the loop) + */ + +#ifndef nsRuleProcessorData_h_ +#define nsRuleProcessorData_h_ + +#include "nsPresContext.h" // for nsCompatability +#include "nsString.h" +#include "nsChangeHint.h" +#include "nsIContent.h" + +class nsIStyleSheet; +class nsPresContext; +class nsIAtom; +class nsICSSPseudoComparator; +class nsRuleWalker; +class nsAttrValue; + +// The implementation of the constructor and destructor are currently in +// nsCSSRuleProcessor.cpp. + +struct RuleProcessorData { + RuleProcessorData(nsPresContext* aPresContext, + nsIContent* aContent, + nsRuleWalker* aRuleWalker, + nsCompatibility* aCompat = nsnull); + + // NOTE: not |virtual| + ~RuleProcessorData(); + + // This should be used for all heap-allocation of RuleProcessorData + static RuleProcessorData* Create(nsPresContext* aPresContext, + nsIContent* aContent, + nsRuleWalker* aRuleWalker, + nsCompatibility aCompat) + { + if (NS_LIKELY(aPresContext)) { + return new (aPresContext) RuleProcessorData(aPresContext, aContent, + aRuleWalker, &aCompat); + } + + return new RuleProcessorData(aPresContext, aContent, aRuleWalker, + &aCompat); + } + + void Destroy() { + nsPresContext * pc = mPresContext; + if (NS_LIKELY(pc)) { + this->~RuleProcessorData(); + pc->FreeToShell(sizeof(RuleProcessorData), this); + return; + } + delete this; + } + + // For placement new + void* operator new(size_t sz, RuleProcessorData* aSlot) CPP_THROW_NEW { + return aSlot; + } +private: + void* operator new(size_t sz, nsPresContext* aContext) CPP_THROW_NEW { + return aContext->AllocateFromShell(sz); + } + void* operator new(size_t sz) CPP_THROW_NEW { + return ::operator new(sz); + } +public: + const nsString* GetLang(); + + // Returns a 1-based index of the child in its parent. If the child + // is not in its parent's child list (i.e., it is anonymous content), + // returns 0. + // If aCheckEdgeOnly is true, the function will return 1 if the result + // is 1, and something other than 1 (maybe or maybe not a valid + // result) otherwise. + PRInt32 GetNthIndex(PRBool aIsOfType, PRBool aIsFromEnd, + PRBool aCheckEdgeOnly); + + nsPresContext* mPresContext; + nsIContent* mContent; // weak ref + nsIContent* mParentContent; // if content, content->GetParent(); weak ref + nsRuleWalker* mRuleWalker; // Used to add rules to our results. + nsIContent* mScopedRoot; // Root of scoped stylesheet (set and unset by the supplier of the scoped stylesheet + + nsIAtom* mContentTag; // if content, then content->GetTag() + nsIAtom* mContentID; // if styled content, then weak reference to styledcontent->GetID() + PRPackedBool mIsHTMLContent; // if content, then does QI on HTMLContent, true or false + PRPackedBool mIsLink; // if content, calls nsStyleUtil::IsHTMLLink or nsStyleUtil::IsLink + PRPackedBool mHasAttributes; // if content, content->GetAttrCount() > 0 + nsCompatibility mCompatMode; // Possibly remove use of this in SelectorMatches? + nsLinkState mLinkState; // if a link, this is the state, otherwise unknown + PRInt32 mEventState; // if content, eventStateMgr->GetContentState() + PRInt32 mNameSpaceID; // if content, content->GetNameSapce() + const nsAttrValue* mClasses; // if styled content, styledcontent->GetClasses() + // mPreviousSiblingData and mParentData are always RuleProcessorData + // and never a derived class. They are allocated lazily, when + // selectors require matching of prior siblings or ancestors. + RuleProcessorData* mPreviousSiblingData; + RuleProcessorData* mParentData; + +protected: + nsString *mLanguage; // NULL means we haven't found out the language yet + + // This node's index for :nth-child(), :nth-last-child(), + // :nth-of-type(), :nth-last-of-type(). If -2, needs to be computed. + // If -1, needs to be computed but known not to be 1. + // If 0, the node is not at any index in its parent. + // The first subscript is 0 for -child and 1 for -of-type, the second + // subscript is 0 for nth- and 1 for nth-last-. + PRInt32 mNthIndices[2][2]; +}; + +struct ElementRuleProcessorData : public RuleProcessorData { + ElementRuleProcessorData(nsPresContext* aPresContext, + nsIContent* aContent, + nsRuleWalker* aRuleWalker) + : RuleProcessorData(aPresContext,aContent,aRuleWalker) + { + NS_PRECONDITION(aPresContext, "null pointer"); + NS_PRECONDITION(aContent, "null pointer"); + NS_PRECONDITION(aRuleWalker, "null pointer"); + } +}; + +struct PseudoRuleProcessorData : public RuleProcessorData { + PseudoRuleProcessorData(nsPresContext* aPresContext, + nsIContent* aParentContent, + nsIAtom* aPseudoTag, + nsICSSPseudoComparator* aComparator, + nsRuleWalker* aRuleWalker) + : RuleProcessorData(aPresContext, aParentContent, aRuleWalker) + { + NS_PRECONDITION(aPresContext, "null pointer"); + NS_PRECONDITION(aPseudoTag, "null pointer"); + NS_PRECONDITION(aRuleWalker, "null pointer"); + mPseudoTag = aPseudoTag; + mComparator = aComparator; + } + + nsIAtom* mPseudoTag; + nsICSSPseudoComparator* mComparator; +}; + +struct StateRuleProcessorData : public RuleProcessorData { + StateRuleProcessorData(nsPresContext* aPresContext, + nsIContent* aContent, + PRInt32 aStateMask) + : RuleProcessorData(aPresContext, aContent, nsnull), + mStateMask(aStateMask) + { + NS_PRECONDITION(aPresContext, "null pointer"); + NS_PRECONDITION(aContent, "null pointer"); + } + const PRInt32 mStateMask; // |HasStateDependentStyle| for which state(s)? + // Constants defined in nsIEventStateManager.h . +}; + +struct AttributeRuleProcessorData : public RuleProcessorData { + AttributeRuleProcessorData(nsPresContext* aPresContext, + nsIContent* aContent, + nsIAtom* aAttribute, + PRInt32 aModType, + PRUint32 aStateMask) + : RuleProcessorData(aPresContext, aContent, nsnull), + mAttribute(aAttribute), + mModType(aModType), + mStateMask(aStateMask) + { + NS_PRECONDITION(aPresContext, "null pointer"); + NS_PRECONDITION(aContent, "null pointer"); + } + nsIAtom* mAttribute; // |HasAttributeDependentStyle| for which attribute? + PRInt32 mModType; // The type of modification (see nsIDOMMutationEvent). + PRUint32 mStateMask; // The states that changed with the attr change. +}; + +#endif /* !defined(nsRuleProcessorData_h_) */ diff --git a/layout/style/nsStyleSet.cpp b/layout/style/nsStyleSet.cpp index 2a9493683afd..fa735f0ab83e 100644 --- a/layout/style/nsStyleSet.cpp +++ b/layout/style/nsStyleSet.cpp @@ -57,6 +57,7 @@ #include "nsIContent.h" #include "nsIFrame.h" #include "nsContentUtils.h" +#include "nsRuleProcessorData.h" NS_IMPL_ISUPPORTS1(nsEmptyStyleRule, nsIStyleRule) diff --git a/layout/style/nsStyleSet.h b/layout/style/nsStyleSet.h index ee991f9d7d66..29fa28addaa4 100644 --- a/layout/style/nsStyleSet.h +++ b/layout/style/nsStyleSet.h @@ -58,6 +58,8 @@ class nsIURI; class nsCSSFontFaceRule; +class nsRuleWalker; +struct RuleProcessorData; class nsEmptyStyleRule : public nsIStyleRule {