mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-22 18:32:00 +00:00
Move things that aren't author stylesheets out of nsDocument's mStyleSheets array to simplify stylesheet management code. Add a level of the cascade for style attributes and ensure that there's only one rule processor per level of the cascade, and simplify the logic of nsCSSRuleProcessor creation. b=252578 r+sr=bzbarsky
This commit is contained in:
parent
1a1653605f
commit
2faa2566a0
@ -1428,13 +1428,13 @@ nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow)
|
||||
nsCOMArray<nsIStyleSheet> oldSheets;
|
||||
nsCOMArray<nsIStyleSheet> newSheets;
|
||||
|
||||
PRInt32 count = document->GetNumberOfStyleSheets(PR_FALSE);
|
||||
PRInt32 count = document->GetNumberOfStyleSheets();
|
||||
|
||||
// Iterate over the style sheets.
|
||||
PRInt32 i;
|
||||
for (i = 0; i < count; i++) {
|
||||
// Get the style sheet
|
||||
nsIStyleSheet *styleSheet = document->GetStyleSheetAt(i, PR_FALSE);
|
||||
nsIStyleSheet *styleSheet = document->GetStyleSheetAt(i);
|
||||
|
||||
if (!oldSheets.AppendObject(styleSheet)) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
@ -88,9 +88,10 @@ class nsHTMLStyleSheet;
|
||||
class nsIHTMLCSSStyleSheet;
|
||||
|
||||
// IID for the nsIDocument interface
|
||||
// c59c70e5-28d1-494b-9f8e-c18368d09ebc
|
||||
#define NS_IDOCUMENT_IID \
|
||||
{ 0x6a462127, 0x6382, 0x4b33, \
|
||||
{ 0x89, 0x34, 0x51, 0x47, 0x2a, 0xd6, 0x21, 0xa7 } }
|
||||
{ 0xc59c70e5, 0x28d1, 0x494b, \
|
||||
{ 0x9f, 0x8e, 0xc1, 0x83, 0x68, 0xd0, 0x9e, 0xbc } }
|
||||
|
||||
// The base value for the content ID counter.
|
||||
// This counter is used by the document to
|
||||
@ -362,25 +363,18 @@ public:
|
||||
/**
|
||||
* Get the number of stylesheets
|
||||
*
|
||||
* @param aIncludeSpecialSheets if this is set to true, all sheets
|
||||
* that are document sheets (including "special" sheets like
|
||||
* attribute sheets and inline style sheets) will be returned. If
|
||||
* false, only "normal" stylesheets will be returned
|
||||
* @return the number of stylesheets
|
||||
* @throws no exceptions
|
||||
*/
|
||||
virtual PRInt32 GetNumberOfStyleSheets(PRBool aIncludeSpecialSheets) const = 0;
|
||||
virtual PRInt32 GetNumberOfStyleSheets() const = 0;
|
||||
|
||||
/**
|
||||
* Get a particular stylesheet
|
||||
* @param aIndex the index the stylesheet lives at. This is zero-based
|
||||
* @param aIncludeSpecialSheets see GetNumberOfStyleSheets. If this
|
||||
* is false, not all sheets will be returnable
|
||||
* @return the stylesheet at aIndex. Null if aIndex is out of range.
|
||||
* @throws no exceptions
|
||||
*/
|
||||
virtual nsIStyleSheet* GetStyleSheetAt(PRInt32 aIndex,
|
||||
PRBool aIncludeSpecialSheets) const = 0;
|
||||
virtual nsIStyleSheet* GetStyleSheetAt(PRInt32 aIndex) const = 0;
|
||||
|
||||
/**
|
||||
* Insert a sheet at a particular spot in the stylesheet list (zero-based)
|
||||
@ -413,7 +407,7 @@ public:
|
||||
/**
|
||||
* Add a stylesheet to the document
|
||||
*/
|
||||
virtual void AddStyleSheet(nsIStyleSheet* aSheet, PRUint32 aFlags) = 0;
|
||||
virtual void AddStyleSheet(nsIStyleSheet* aSheet) = 0;
|
||||
|
||||
/**
|
||||
* Remove a stylesheet from the document
|
||||
@ -427,6 +421,14 @@ public:
|
||||
virtual void SetStyleSheetApplicableState(nsIStyleSheet* aSheet,
|
||||
PRBool aApplicable) = 0;
|
||||
|
||||
/**
|
||||
* Just like the style sheet API, but for "catalog" sheets,
|
||||
* extra sheets inserted at the UA level.
|
||||
*/
|
||||
virtual PRInt32 GetNumberOfCatalogStyleSheets() const = 0;
|
||||
virtual nsIStyleSheet* GetCatalogStyleSheetAt(PRInt32 aIndex) const = 0;
|
||||
virtual void AddCatalogStyleSheet(nsIStyleSheet* aSheet) = 0;
|
||||
|
||||
/**
|
||||
* Get this document's CSSLoader. May return null in error
|
||||
* conditions (OOM)
|
||||
|
@ -227,9 +227,12 @@ public:
|
||||
*
|
||||
* @param aDocument The document being observed
|
||||
* @param aStyleSheet the StyleSheet that has been added
|
||||
* @param aDocumentSheet True if sheet is in document's style sheet list,
|
||||
* false if sheet is not (i.e., UA or user sheet)
|
||||
*/
|
||||
virtual void StyleSheetAdded(nsIDocument *aDocument,
|
||||
nsIStyleSheet* aStyleSheet) = 0;
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aDocumentSheet) = 0;
|
||||
|
||||
/**
|
||||
* A StyleSheet has just been removed from the document. This
|
||||
@ -239,9 +242,12 @@ public:
|
||||
*
|
||||
* @param aDocument The document being observed
|
||||
* @param aStyleSheet the StyleSheet that has been removed
|
||||
* @param aDocumentSheet True if sheet is in document's style sheet list,
|
||||
* false if sheet is not (i.e., UA or user sheet)
|
||||
*/
|
||||
virtual void StyleSheetRemoved(nsIDocument *aDocument,
|
||||
nsIStyleSheet* aStyleSheet) = 0;
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aDocumentSheet) = 0;
|
||||
|
||||
/**
|
||||
* A StyleSheet has just changed its applicable state.
|
||||
@ -360,9 +366,11 @@ public:
|
||||
nsIContent* aChild, \
|
||||
PRInt32 aIndexInContainer); \
|
||||
virtual void StyleSheetAdded(nsIDocument* aDocument, \
|
||||
nsIStyleSheet* aStyleSheet); \
|
||||
nsIStyleSheet* aStyleSheet, \
|
||||
PRBool aDocumentSheet); \
|
||||
virtual void StyleSheetRemoved(nsIDocument* aDocument, \
|
||||
nsIStyleSheet* aStyleSheet); \
|
||||
nsIStyleSheet* aStyleSheet, \
|
||||
PRBool aDocumentSheet); \
|
||||
virtual void StyleSheetApplicableStateChanged(nsIDocument* aDocument, \
|
||||
nsIStyleSheet* aStyleSheet,\
|
||||
PRBool aApplicable); \
|
||||
@ -463,12 +471,14 @@ _class::ContentRemoved(nsIDocument* aDocument, \
|
||||
#define NS_IMPL_NSIDOCUMENTOBSERVER_STYLE_STUB(_class) \
|
||||
void \
|
||||
_class::StyleSheetAdded(nsIDocument* aDocument, \
|
||||
nsIStyleSheet* aStyleSheet) \
|
||||
nsIStyleSheet* aStyleSheet, \
|
||||
PRBool aDocumentSheet) \
|
||||
{ \
|
||||
} \
|
||||
void \
|
||||
_class::StyleSheetRemoved(nsIDocument* aDocument, \
|
||||
nsIStyleSheet* aStyleSheet) \
|
||||
nsIStyleSheet* aStyleSheet, \
|
||||
PRBool aDocumentSheet) \
|
||||
{ \
|
||||
} \
|
||||
void \
|
||||
|
@ -50,10 +50,19 @@ class nsIContent;
|
||||
class nsIDocument;
|
||||
class nsIStyleRuleProcessor;
|
||||
|
||||
// IID for the nsIStyleSheet interface {8c4a80a0-ad6a-11d1-8031-006008159b5a}
|
||||
// IID for the nsIStyleSheet interface
|
||||
// 6fbfb2cb-a1c0-4576-9354-a4af4e0029ad
|
||||
#define NS_ISTYLE_SHEET_IID \
|
||||
{0x8c4a80a0, 0xad6a, 0x11d1, {0x80, 0x31, 0x00, 0x60, 0x08, 0x15, 0x9b, 0x5a}}
|
||||
{0x6fbfb2cb, 0xa1c0, 0x4576, {0x93, 0x54, 0xa4, 0xaf, 0x4e, 0x00, 0x29, 0xad}}
|
||||
|
||||
/**
|
||||
* A style sheet is a thing associated with a document that has style
|
||||
* rules. Those style rules can be reached in one of two ways, depending
|
||||
* on which level of the nsStyleSet it is in:
|
||||
* 1) It can be |QueryInterface|d to nsIStyleRuleProcessor
|
||||
* 2) It can be |QueryInterface|d to nsICSSStyleSheet, with which the
|
||||
* |nsStyleSet| uses an |nsCSSRuleProcessor| to access the rules.
|
||||
*/
|
||||
class nsIStyleSheet : public nsISupports {
|
||||
public:
|
||||
NS_DEFINE_STATIC_IID_ACCESSOR(NS_ISTYLE_SHEET_IID)
|
||||
@ -93,10 +102,6 @@ public:
|
||||
NS_IMETHOD GetOwningDocument(nsIDocument*& aDocument) const = 0; // may be null
|
||||
NS_IMETHOD SetOwningDocument(nsIDocument* aDocument) = 0;
|
||||
|
||||
// style rule processor access
|
||||
NS_IMETHOD GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor,
|
||||
nsIStyleRuleProcessor* aPrevProcessor) = 0;
|
||||
|
||||
#ifdef DEBUG
|
||||
virtual void List(FILE* out = stdout, PRInt32 aIndent = 0) const = 0;
|
||||
#endif
|
||||
|
@ -200,12 +200,12 @@ nsDOMStyleSheetList::GetLength(PRUint32* aLength)
|
||||
// observer notification to figure out if new ones have
|
||||
// been added or removed.
|
||||
if (-1 == mLength) {
|
||||
mLength = mDocument->GetNumberOfStyleSheets(PR_FALSE);
|
||||
mLength = mDocument->GetNumberOfStyleSheets();
|
||||
|
||||
#ifdef DEBUG
|
||||
PRInt32 i;
|
||||
for (i = 0; i < mLength; i++) {
|
||||
nsIStyleSheet *sheet = mDocument->GetStyleSheetAt(i, PR_FALSE);
|
||||
nsIStyleSheet *sheet = mDocument->GetStyleSheetAt(i);
|
||||
nsCOMPtr<nsIDOMStyleSheet> domss(do_QueryInterface(sheet));
|
||||
NS_ASSERTION(domss, "All \"normal\" sheets implement nsIDOMStyleSheet");
|
||||
}
|
||||
@ -225,9 +225,9 @@ nsDOMStyleSheetList::Item(PRUint32 aIndex, nsIDOMStyleSheet** aReturn)
|
||||
{
|
||||
*aReturn = nsnull;
|
||||
if (mDocument) {
|
||||
PRInt32 count = mDocument->GetNumberOfStyleSheets(PR_FALSE);
|
||||
PRInt32 count = mDocument->GetNumberOfStyleSheets();
|
||||
if (aIndex < (PRUint32)count) {
|
||||
nsIStyleSheet *sheet = mDocument->GetStyleSheetAt(aIndex, PR_FALSE);
|
||||
nsIStyleSheet *sheet = mDocument->GetStyleSheetAt(aIndex);
|
||||
NS_ASSERTION(sheet, "Must have a sheet");
|
||||
return CallQueryInterface(sheet, aReturn);
|
||||
}
|
||||
@ -247,9 +247,10 @@ nsDOMStyleSheetList::DocumentWillBeDestroyed(nsIDocument *aDocument)
|
||||
|
||||
void
|
||||
nsDOMStyleSheetList::StyleSheetAdded(nsIDocument *aDocument,
|
||||
nsIStyleSheet* aStyleSheet)
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aDocumentSheet)
|
||||
{
|
||||
if (-1 != mLength) {
|
||||
if (aDocumentSheet && -1 != mLength) {
|
||||
nsCOMPtr<nsIDOMStyleSheet> domss(do_QueryInterface(aStyleSheet));
|
||||
if (domss) {
|
||||
mLength++;
|
||||
@ -259,9 +260,10 @@ nsDOMStyleSheetList::StyleSheetAdded(nsIDocument *aDocument,
|
||||
|
||||
void
|
||||
nsDOMStyleSheetList::StyleSheetRemoved(nsIDocument *aDocument,
|
||||
nsIStyleSheet* aStyleSheet)
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aDocumentSheet)
|
||||
{
|
||||
if (-1 != mLength) {
|
||||
if (aDocumentSheet && -1 != mLength) {
|
||||
nsCOMPtr<nsIDOMStyleSheet> domss(do_QueryInterface(aStyleSheet));
|
||||
if (domss) {
|
||||
mLength--;
|
||||
@ -572,6 +574,14 @@ nsDocument::~nsDocument()
|
||||
while (--indx >= 0) {
|
||||
mStyleSheets[indx]->SetOwningDocument(nsnull);
|
||||
}
|
||||
indx = mCatalogSheets.Count();
|
||||
while (--indx >= 0) {
|
||||
mCatalogSheets[indx]->SetOwningDocument(nsnull);
|
||||
}
|
||||
if (mAttrStyleSheet)
|
||||
mAttrStyleSheet->SetOwningDocument(nsnull);
|
||||
if (mStyleAttrStyleSheet)
|
||||
mStyleAttrStyleSheet->SetOwningDocument(nsnull);
|
||||
|
||||
if (mChildNodes) {
|
||||
mChildNodes->DropReference();
|
||||
@ -798,12 +808,31 @@ nsDocument::ResetStylesheetsToURI(nsIURI* aURI)
|
||||
// XXX Tell observers?
|
||||
}
|
||||
|
||||
indx = mCatalogSheets.Count();
|
||||
while (--indx >= 0) {
|
||||
nsIStyleSheet* sheet = mCatalogSheets[indx];
|
||||
sheet->SetOwningDocument(nsnull);
|
||||
|
||||
PRBool applicable;
|
||||
sheet->GetApplicable(applicable);
|
||||
if (applicable) {
|
||||
for (PRInt32 i = 0, i_end = mPresShells.Count(); i < i_end; ++i) {
|
||||
NS_STATIC_CAST(nsIPresShell*, mPresShells.ElementAt(i))->StyleSet()->
|
||||
RemoveStyleSheet(nsStyleSet::eAgentSheet, sheet);
|
||||
}
|
||||
}
|
||||
|
||||
// XXX Tell observers?
|
||||
}
|
||||
|
||||
|
||||
// Release all the sheets
|
||||
mStyleSheets.Clear();
|
||||
// NOTE: We don't release the catalog sheets. It doesn't really matter
|
||||
// now, but it could in the future -- in which case not releasing them
|
||||
// is probably the right thing to do.
|
||||
|
||||
// Now reset our inline style and attribute sheets. Note that we
|
||||
// already set their owning document to null in the loop above, but
|
||||
// we'll reset it when we call AddStyleSheet on them.
|
||||
// Now reset our inline style and attribute sheets.
|
||||
nsresult rv;
|
||||
nsStyleSet::sheetType attrSheetType = GetAttrSheetType();
|
||||
if (mAttrStyleSheet) {
|
||||
@ -821,10 +850,15 @@ nsDocument::ResetStylesheetsToURI(nsIURI* aURI)
|
||||
|
||||
// Don't use AddStyleSheet, since it'll put the sheet into style
|
||||
// sets in the document level, which is not desirable here.
|
||||
InternalAddStyleSheet(mAttrStyleSheet, 0);
|
||||
mAttrStyleSheet->SetOwningDocument(this);
|
||||
|
||||
if (mStyleAttrStyleSheet) {
|
||||
// Remove this sheet from all style sets
|
||||
PRInt32 count = mPresShells.Count();
|
||||
for (indx = 0; indx < count; ++indx) {
|
||||
NS_STATIC_CAST(nsIPresShell*, mPresShells.ElementAt(indx))->StyleSet()->
|
||||
RemoveStyleSheet(nsStyleSet::eStyleAttrSheet, mStyleAttrStyleSheet);
|
||||
}
|
||||
rv = mStyleAttrStyleSheet->Reset(aURI);
|
||||
} else {
|
||||
rv = NS_NewHTMLCSSStyleSheet(getter_AddRefs(mStyleAttrStyleSheet), aURI,
|
||||
@ -834,7 +868,6 @@ nsDocument::ResetStylesheetsToURI(nsIURI* aURI)
|
||||
|
||||
// The loop over style sets below will handle putting this sheet
|
||||
// into style sets as needed.
|
||||
InternalAddStyleSheet(mStyleAttrStyleSheet, 0);
|
||||
mStyleAttrStyleSheet->SetOwningDocument(this);
|
||||
|
||||
// Now set up our style sets
|
||||
@ -863,27 +896,34 @@ nsDocument::FillStyleSet(nsStyleSet* aStyleSet)
|
||||
"Style set already has a HTML preshint sheet?");
|
||||
NS_PRECONDITION(aStyleSet->SheetCount(nsStyleSet::eDocSheet) == 0,
|
||||
"Style set already has document sheets?");
|
||||
NS_PRECONDITION(aStyleSet->SheetCount(nsStyleSet::eStyleAttrSheet) == 0,
|
||||
"Style set already has style attr sheets?");
|
||||
NS_PRECONDITION(mStyleAttrStyleSheet, "No style attr stylesheet?");
|
||||
NS_PRECONDITION(mAttrStyleSheet, "No attr stylesheet?");
|
||||
NS_PRECONDITION(mAttrStyleSheet == GetStyleSheetAt(0, PR_TRUE),
|
||||
"Unexpected first sheet");
|
||||
|
||||
// First, place the attribute style sheet in the style set. Prepend it,
|
||||
// since it should be the most significant sheet in its level.
|
||||
aStyleSet->PrependStyleSheet(GetAttrSheetType(), mAttrStyleSheet);
|
||||
aStyleSet->AppendStyleSheet(GetAttrSheetType(), mAttrStyleSheet);
|
||||
|
||||
// Now that we've handled the attribute sheet, do the other sheets. The
|
||||
// attribute sheet should be at position 0, hence the loop termination
|
||||
// condition.
|
||||
PRInt32 index;
|
||||
PRBool sheetApplicable;
|
||||
for (index = GetNumberOfStyleSheets(PR_TRUE) - 1; index > 0; --index) {
|
||||
nsIStyleSheet* sheet = GetStyleSheetAt(index, PR_TRUE);
|
||||
aStyleSet->AppendStyleSheet(nsStyleSet::eStyleAttrSheet,
|
||||
mStyleAttrStyleSheet);
|
||||
|
||||
PRInt32 i;
|
||||
for (i = mStyleSheets.Count() - 1; i >= 0; --i) {
|
||||
nsIStyleSheet* sheet = mStyleSheets[i];
|
||||
PRBool sheetApplicable;
|
||||
sheet->GetApplicable(sheetApplicable);
|
||||
if (sheetApplicable) {
|
||||
aStyleSet->AddDocStyleSheet(sheet, this);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = mCatalogSheets.Count() - 1; i >= 0; --i) {
|
||||
nsIStyleSheet* sheet = mCatalogSheets[i];
|
||||
PRBool sheetApplicable;
|
||||
sheet->GetApplicable(sheetApplicable);
|
||||
if (sheetApplicable) {
|
||||
aStyleSet->AppendStyleSheet(nsStyleSet::eAgentSheet, sheet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
nsresult
|
||||
@ -1172,6 +1212,8 @@ nsDocument::SetHeaderData(nsIAtom* aHeaderField, const nsAString& aData)
|
||||
|
||||
if (aHeaderField == nsHTMLAtoms::headerDefaultStyle) {
|
||||
// switch alternate style sheets based on default
|
||||
// XXXldb What if we don't have all the sheets yet? Should this use
|
||||
// the DOM API for preferred stylesheet set that's "coming soon"?
|
||||
nsAutoString type;
|
||||
nsAutoString title;
|
||||
PRInt32 index;
|
||||
@ -1463,56 +1505,24 @@ nsDocument::GetChildCount() const
|
||||
}
|
||||
|
||||
PRInt32
|
||||
nsDocument::InternalGetNumberOfStyleSheets() const
|
||||
nsDocument::GetNumberOfStyleSheets() const
|
||||
{
|
||||
return mStyleSheets.Count();
|
||||
}
|
||||
|
||||
PRInt32
|
||||
nsDocument::GetNumberOfStyleSheets(PRBool aIncludeSpecialSheets) const
|
||||
{
|
||||
if (aIncludeSpecialSheets) {
|
||||
return mStyleSheets.Count();
|
||||
}
|
||||
|
||||
return InternalGetNumberOfStyleSheets();
|
||||
}
|
||||
|
||||
nsIStyleSheet*
|
||||
nsDocument::InternalGetStyleSheetAt(PRInt32 aIndex) const
|
||||
nsDocument::GetStyleSheetAt(PRInt32 aIndex) const
|
||||
{
|
||||
NS_ASSERTION(aIndex >= 0 && aIndex < mStyleSheets.Count(), "Invalid index");
|
||||
NS_ENSURE_TRUE(0 <= aIndex && aIndex < mStyleSheets.Count(), nsnull);
|
||||
return mStyleSheets[aIndex];
|
||||
}
|
||||
|
||||
nsIStyleSheet*
|
||||
nsDocument::GetStyleSheetAt(PRInt32 aIndex, PRBool aIncludeSpecialSheets) const
|
||||
{
|
||||
if (aIncludeSpecialSheets) {
|
||||
if (aIndex < 0 || aIndex >= mStyleSheets.Count()) {
|
||||
NS_ERROR("Index out of range");
|
||||
return nsnull;
|
||||
}
|
||||
|
||||
return mStyleSheets[aIndex];
|
||||
}
|
||||
|
||||
return InternalGetStyleSheetAt(aIndex);
|
||||
}
|
||||
|
||||
PRInt32
|
||||
nsDocument::GetIndexOfStyleSheet(nsIStyleSheet* aSheet) const
|
||||
{
|
||||
return mStyleSheets.IndexOf(aSheet);
|
||||
}
|
||||
|
||||
// subclass hooks for sheet ordering
|
||||
void
|
||||
nsDocument::InternalAddStyleSheet(nsIStyleSheet* aSheet, PRUint32 aFlags)
|
||||
{
|
||||
mStyleSheets.AppendObject(aSheet);
|
||||
}
|
||||
|
||||
void
|
||||
nsDocument::AddStyleSheetToStyleSets(nsIStyleSheet* aSheet)
|
||||
{
|
||||
@ -1525,10 +1535,10 @@ nsDocument::AddStyleSheetToStyleSets(nsIStyleSheet* aSheet)
|
||||
}
|
||||
|
||||
void
|
||||
nsDocument::AddStyleSheet(nsIStyleSheet* aSheet, PRUint32 aFlags)
|
||||
nsDocument::AddStyleSheet(nsIStyleSheet* aSheet)
|
||||
{
|
||||
NS_PRECONDITION(aSheet, "null arg");
|
||||
InternalAddStyleSheet(aSheet, aFlags);
|
||||
mStyleSheets.AppendObject(aSheet);
|
||||
aSheet->SetOwningDocument(this);
|
||||
|
||||
PRBool applicable;
|
||||
@ -1544,19 +1554,16 @@ nsDocument::AddStyleSheet(nsIStyleSheet* aSheet, PRUint32 aFlags)
|
||||
nsIDocumentObserver* observer =
|
||||
NS_STATIC_CAST(nsIDocumentObserver *, mObservers.ElementAt(i));
|
||||
|
||||
observer->StyleSheetAdded(this, aSheet);
|
||||
observer->StyleSheetAdded(this, aSheet, PR_TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nsDocument::RemoveStyleSheetFromStyleSets(nsIStyleSheet* aSheet)
|
||||
{
|
||||
PRInt32 count = mPresShells.Count();
|
||||
PRInt32 indx;
|
||||
for (indx = 0; indx < count; ++indx) {
|
||||
NS_STATIC_CAST(nsIPresShell*, mPresShells.ElementAt(indx))->StyleSet()->
|
||||
for (PRInt32 i = 0, i_end = mPresShells.Count(); i < i_end; ++i)
|
||||
NS_STATIC_CAST(nsIPresShell*, mPresShells.ElementAt(i))->StyleSet()->
|
||||
RemoveStyleSheet(nsStyleSet::eDocSheet, aSheet);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@ -1584,7 +1591,7 @@ nsDocument::RemoveStyleSheet(nsIStyleSheet* aSheet)
|
||||
nsIDocumentObserver *observer =
|
||||
NS_STATIC_CAST(nsIDocumentObserver *, mObservers.ElementAt(indx));
|
||||
|
||||
observer->StyleSheetRemoved(this, aSheet);
|
||||
observer->StyleSheetRemoved(this, aSheet, PR_TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1635,7 +1642,7 @@ nsDocument::UpdateStyleSheets(nsCOMArray<nsIStyleSheet>& aOldSheets,
|
||||
nsIDocumentObserver *observer =
|
||||
NS_STATIC_CAST(nsIDocumentObserver *, mObservers.ElementAt(obsIndx));
|
||||
|
||||
observer->StyleSheetAdded(this, newSheet);
|
||||
observer->StyleSheetAdded(this, newSheet, PR_TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1648,19 +1655,11 @@ nsDocument::UpdateStyleSheets(nsCOMArray<nsIStyleSheet>& aOldSheets,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
nsDocument::InternalInsertStyleSheetAt(nsIStyleSheet* aSheet, PRInt32 aIndex)
|
||||
{
|
||||
// subclass hook for sheet ordering
|
||||
mStyleSheets.InsertObjectAt(aSheet, aIndex);
|
||||
}
|
||||
|
||||
void
|
||||
nsDocument::InsertStyleSheetAt(nsIStyleSheet* aSheet, PRInt32 aIndex)
|
||||
{
|
||||
NS_PRECONDITION(aSheet, "null ptr");
|
||||
InternalInsertStyleSheetAt(aSheet, aIndex);
|
||||
mStyleSheets.InsertObjectAt(aSheet, aIndex);
|
||||
|
||||
aSheet->SetOwningDocument(this);
|
||||
|
||||
@ -1678,7 +1677,7 @@ nsDocument::InsertStyleSheetAt(nsIStyleSheet* aSheet, PRInt32 aIndex)
|
||||
nsIDocumentObserver *observer =
|
||||
NS_STATIC_CAST(nsIDocumentObserver *, mObservers.ElementAt(i));
|
||||
|
||||
observer->StyleSheetAdded(this, aSheet);
|
||||
observer->StyleSheetAdded(this, aSheet, PR_TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1711,6 +1710,48 @@ nsDocument::SetStyleSheetApplicableState(nsIStyleSheet* aSheet,
|
||||
}
|
||||
}
|
||||
|
||||
// These three functions are a lot like the implementation of the
|
||||
// corresponding API for regular stylesheets.
|
||||
|
||||
PRInt32
|
||||
nsDocument::GetNumberOfCatalogStyleSheets() const
|
||||
{
|
||||
return mCatalogSheets.Count();
|
||||
}
|
||||
|
||||
nsIStyleSheet*
|
||||
nsDocument::GetCatalogStyleSheetAt(PRInt32 aIndex) const
|
||||
{
|
||||
NS_ENSURE_TRUE(0 <= aIndex && aIndex < mCatalogSheets.Count(), nsnull);
|
||||
return mCatalogSheets[aIndex];
|
||||
}
|
||||
|
||||
void
|
||||
nsDocument::AddCatalogStyleSheet(nsIStyleSheet* aSheet)
|
||||
{
|
||||
mCatalogSheets.AppendObject(aSheet);
|
||||
aSheet->SetOwningDocument(this);
|
||||
|
||||
PRBool applicable;
|
||||
aSheet->GetApplicable(applicable);
|
||||
|
||||
if (applicable) {
|
||||
// This is like |AddStyleSheetToStyleSets|, but for an agent sheet.
|
||||
for (PRInt32 i = 0, i_end = mPresShells.Count(); i < i_end; ++i)
|
||||
NS_STATIC_CAST(nsIPresShell*, mPresShells.ElementAt(i))->StyleSet()->
|
||||
AppendStyleSheet(nsStyleSet::eAgentSheet, aSheet);
|
||||
}
|
||||
|
||||
// if an observer removes itself, we're ok (not if it removes others though)
|
||||
PRInt32 i;
|
||||
for (i = mObservers.Count() - 1; i >= 0; --i) {
|
||||
nsIDocumentObserver* observer =
|
||||
NS_STATIC_CAST(nsIDocumentObserver *, mObservers.ElementAt(i));
|
||||
|
||||
observer->StyleSheetAdded(this, aSheet, PR_FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
nsIScriptGlobalObject*
|
||||
nsDocument::GetScriptGlobalObject() const
|
||||
{
|
||||
|
@ -158,9 +158,11 @@ public:
|
||||
// nsIDocumentObserver
|
||||
virtual void DocumentWillBeDestroyed(nsIDocument *aDocument);
|
||||
virtual void StyleSheetAdded(nsIDocument *aDocument,
|
||||
nsIStyleSheet* aStyleSheet);
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aDocumentSheet);
|
||||
virtual void StyleSheetRemoved(nsIDocument *aDocument,
|
||||
nsIStyleSheet* aStyleSheet);
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aDocumentSheet);
|
||||
|
||||
protected:
|
||||
PRInt32 mLength;
|
||||
@ -304,11 +306,10 @@ public:
|
||||
* Get the style sheets owned by this document.
|
||||
* These are ordered, highest priority last
|
||||
*/
|
||||
virtual PRInt32 GetNumberOfStyleSheets(PRBool aIncludeSpecialSheets) const;
|
||||
virtual nsIStyleSheet* GetStyleSheetAt(PRInt32 aIndex,
|
||||
PRBool aIncludeSpecialSheets) const;
|
||||
virtual PRInt32 GetNumberOfStyleSheets() const;
|
||||
virtual nsIStyleSheet* GetStyleSheetAt(PRInt32 aIndex) const;
|
||||
virtual PRInt32 GetIndexOfStyleSheet(nsIStyleSheet* aSheet) const;
|
||||
virtual void AddStyleSheet(nsIStyleSheet* aSheet, PRUint32 aFlags);
|
||||
virtual void AddStyleSheet(nsIStyleSheet* aSheet);
|
||||
virtual void RemoveStyleSheet(nsIStyleSheet* aSheet);
|
||||
|
||||
virtual void UpdateStyleSheets(nsCOMArray<nsIStyleSheet>& aOldSheets,
|
||||
@ -320,6 +321,11 @@ public:
|
||||
virtual void SetStyleSheetApplicableState(nsIStyleSheet* aSheet,
|
||||
PRBool aApplicable);
|
||||
|
||||
virtual PRInt32 GetNumberOfCatalogStyleSheets() const;
|
||||
virtual nsIStyleSheet* GetCatalogStyleSheetAt(PRInt32 aIndex) const;
|
||||
virtual void AddCatalogStyleSheet(nsIStyleSheet* aSheet);
|
||||
|
||||
|
||||
/**
|
||||
* Get this document's attribute stylesheet. May return null if
|
||||
* there isn't one.
|
||||
@ -503,13 +509,6 @@ public:
|
||||
nsIContent **aResult);
|
||||
|
||||
protected:
|
||||
// subclass hooks for sheet ordering
|
||||
virtual void InternalAddStyleSheet(nsIStyleSheet* aSheet,
|
||||
PRUint32 aFlags);
|
||||
virtual void InternalInsertStyleSheetAt(nsIStyleSheet* aSheet,
|
||||
PRInt32 aIndex);
|
||||
virtual nsIStyleSheet* InternalGetStyleSheetAt(PRInt32 aIndex) const;
|
||||
virtual PRInt32 InternalGetNumberOfStyleSheets() const;
|
||||
|
||||
void RetrieveRelevantHeaders(nsIChannel *aChannel);
|
||||
|
||||
@ -551,6 +550,7 @@ protected:
|
||||
nsCOMArray<nsIContent> mChildren;
|
||||
|
||||
nsCOMArray<nsIStyleSheet> mStyleSheets;
|
||||
nsCOMArray<nsIStyleSheet> mCatalogSheets;
|
||||
|
||||
// Basically always has at least 1 entry
|
||||
nsAutoVoidArray mObservers;
|
||||
|
@ -1752,7 +1752,7 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
|
||||
}
|
||||
|
||||
if (sheet)
|
||||
styleSet->PrependStyleSheet(nsStyleSet::eUserSheet, sheet);
|
||||
styleSet->AppendStyleSheet(nsStyleSet::eUserSheet, sheet);
|
||||
|
||||
// Append chrome sheets (scrollbars + forms).
|
||||
PRBool shouldOverride = PR_FALSE;
|
||||
@ -1783,7 +1783,7 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
|
||||
cssLoader->LoadAgentSheet(uri, getter_AddRefs(csssheet));
|
||||
if (!sheet) continue;
|
||||
|
||||
styleSet->AppendStyleSheet(nsStyleSet::eAgentSheet, csssheet);
|
||||
styleSet->PrependStyleSheet(nsStyleSet::eAgentSheet, csssheet);
|
||||
shouldOverride = PR_TRUE;
|
||||
}
|
||||
nsMemory::Free(str);
|
||||
@ -1794,17 +1794,17 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
|
||||
if (!shouldOverride) {
|
||||
sheet = nsLayoutStylesheetCache::ScrollbarsSheet();
|
||||
if (sheet) {
|
||||
styleSet->AppendStyleSheet(nsStyleSet::eAgentSheet, sheet);
|
||||
styleSet->PrependStyleSheet(nsStyleSet::eAgentSheet, sheet);
|
||||
}
|
||||
}
|
||||
|
||||
sheet = nsLayoutStylesheetCache::FormsSheet();
|
||||
if (sheet) {
|
||||
styleSet->AppendStyleSheet(nsStyleSet::eAgentSheet, sheet);
|
||||
styleSet->PrependStyleSheet(nsStyleSet::eAgentSheet, sheet);
|
||||
}
|
||||
|
||||
if (mUAStyleSheet) {
|
||||
styleSet->AppendStyleSheet(nsStyleSet::eAgentSheet, mUAStyleSheet);
|
||||
styleSet->PrependStyleSheet(nsStyleSet::eAgentSheet, mUAStyleSheet);
|
||||
}
|
||||
|
||||
// Caller will handle calling EndUpdate, per contract.
|
||||
|
@ -45,6 +45,7 @@
|
||||
#include "nsICSSStyleRule.h"
|
||||
#include "nsCSSAnonBoxes.h"
|
||||
#include "nsCSSPseudoElements.h"
|
||||
#include "nsCSSRuleProcessor.h"
|
||||
#include "nsIContent.h"
|
||||
#include "nsIFrame.h"
|
||||
|
||||
@ -90,42 +91,33 @@ nsStyleSet::Init(nsIPresContext *aPresContext)
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
struct RuleProcessorEnumData {
|
||||
RuleProcessorEnumData(nsCOMArray<nsIStyleRuleProcessor> *aRuleProcessors)
|
||||
: mRuleProcessors(aRuleProcessors),
|
||||
mPrevProcessor(nsnull)
|
||||
{}
|
||||
|
||||
nsCOMArray<nsIStyleRuleProcessor>* mRuleProcessors;
|
||||
nsIStyleRuleProcessor* mPrevProcessor;
|
||||
};
|
||||
|
||||
static PRBool
|
||||
EnumRuleProcessor(nsIStyleSheet *aSheet, void* aData)
|
||||
{
|
||||
RuleProcessorEnumData* data = (RuleProcessorEnumData*)aData;
|
||||
|
||||
nsCOMPtr<nsIStyleRuleProcessor> processor;
|
||||
nsresult result = aSheet->GetStyleRuleProcessor(*getter_AddRefs(processor),
|
||||
data->mPrevProcessor);
|
||||
if (NS_SUCCEEDED(result) && processor) {
|
||||
if (processor != data->mPrevProcessor) {
|
||||
if (!data->mRuleProcessors->AppendObject(processor))
|
||||
return PR_FALSE;
|
||||
data->mPrevProcessor = processor; // ref is held by array
|
||||
}
|
||||
}
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsStyleSet::GatherRuleProcessors(PRInt32 aType)
|
||||
nsStyleSet::GatherRuleProcessors(sheetType aType)
|
||||
{
|
||||
mRuleProcessors[aType].Clear();
|
||||
mRuleProcessors[aType] = nsnull;
|
||||
if (mSheets[aType].Count()) {
|
||||
RuleProcessorEnumData data(&mRuleProcessors[aType]);
|
||||
if (!mSheets[aType].EnumerateBackwards(EnumRuleProcessor, &data))
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
switch (aType) {
|
||||
case eAgentSheet:
|
||||
case eUserSheet:
|
||||
case eDocSheet:
|
||||
case eOverrideSheet: {
|
||||
// levels containing CSS stylesheets
|
||||
nsCOMArray<nsIStyleSheet>& sheets = mSheets[aType];
|
||||
nsCOMArray<nsICSSStyleSheet> cssSheets(sheets.Count());
|
||||
for (PRInt32 i = 0, i_end = sheets.Count(); i < i_end; ++i) {
|
||||
nsCOMPtr<nsICSSStyleSheet> cssSheet = do_QueryInterface(sheets[i]);
|
||||
NS_ASSERTION(cssSheet, "not a CSS sheet");
|
||||
cssSheets.AppendObject(cssSheet);
|
||||
}
|
||||
mRuleProcessors[aType] = new nsCSSRuleProcessor(cssSheets);
|
||||
} break;
|
||||
|
||||
default:
|
||||
// levels containing non-CSS stylesheets
|
||||
NS_ASSERTION(mSheets[aType].Count() == 1, "only one sheet per level");
|
||||
mRuleProcessors[aType] = do_QueryInterface(mSheets[aType][0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
@ -217,23 +209,18 @@ nsStyleSet::AddDocStyleSheet(nsIStyleSheet* aSheet, nsIDocument* aDocument)
|
||||
nsCOMArray<nsIStyleSheet>& docSheets = mSheets[eDocSheet];
|
||||
|
||||
docSheets.RemoveObject(aSheet);
|
||||
// lowest index last
|
||||
// lowest index first
|
||||
PRInt32 newDocIndex = aDocument->GetIndexOfStyleSheet(aSheet);
|
||||
PRInt32 count = docSheets.Count();
|
||||
for (PRInt32 index = 0; index < count; index++) {
|
||||
PRInt32 index;
|
||||
for (index = 0; index < count; index++) {
|
||||
nsIStyleSheet* sheet = docSheets.ObjectAt(index);
|
||||
PRInt32 sheetDocIndex = aDocument->GetIndexOfStyleSheet(sheet);
|
||||
if (sheetDocIndex < newDocIndex) {
|
||||
if (!docSheets.InsertObjectAt(aSheet, index))
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
index = count; // break loop
|
||||
}
|
||||
}
|
||||
if (docSheets.Count() == count) { // didn't insert it
|
||||
if (!docSheets.AppendObject(aSheet))
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
if (sheetDocIndex > newDocIndex)
|
||||
break;
|
||||
}
|
||||
if (!docSheets.InsertObjectAt(aSheet, index))
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
if (!mBatching)
|
||||
return GatherRuleProcessors(eDocSheet);
|
||||
|
||||
@ -261,7 +248,7 @@ nsStyleSet::EndUpdate()
|
||||
|
||||
for (int i = 0; i < eSheetTypeCount; ++i) {
|
||||
if (mDirty & (1 << i)) {
|
||||
nsresult rv = GatherRuleProcessors(i);
|
||||
nsresult rv = GatherRuleProcessors(sheetType(i));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
}
|
||||
@ -302,12 +289,11 @@ nsStyleSet::EnableQuirkStyleSheet(PRBool aEnable)
|
||||
NS_ASSERTION(mQuirkStyleSheet, "no quirk stylesheet");
|
||||
if (mQuirkStyleSheet) {
|
||||
#ifdef DEBUG_dbaron_off // XXX Make this |DEBUG| once it stops firing.
|
||||
PRInt32 count = mRuleProcessors[eAgentSheet].Count()
|
||||
PRBool applicableNow;
|
||||
mQuirkStyleSheet->GetApplicable(applicableNow);
|
||||
NS_ASSERTION(count == 0 || aEnable == applicableNow,
|
||||
NS_ASSERTION(!mRuleProcessors[eAgentSheet] || aEnable == applicableNow,
|
||||
"enabling/disabling quirk stylesheet too late or incomplete quirk stylesheet");
|
||||
if (count != 0 && aEnable == applicableNow)
|
||||
if (mRuleProcessors[eAgentSheet] && aEnable == applicableNow)
|
||||
printf("WARNING: We set the quirks mode too many times.\n"); // we do!
|
||||
#endif
|
||||
mQuirkStyleSheet->SetEnabled(aEnable);
|
||||
@ -442,47 +428,36 @@ nsStyleSet::FileRules(nsIStyleRuleProcessor::EnumFunc aCollectorFunc,
|
||||
SheetCount(eHTMLPresHintSheet) == 0,
|
||||
"Can't have both types of preshint sheets at once!");
|
||||
|
||||
nsRuleNode* lastAgentRN = nsnull;
|
||||
if (mRuleProcessors[eAgentSheet].Count()) {
|
||||
mRuleProcessors[eAgentSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastAgentRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
if (mRuleProcessors[eAgentSheet])
|
||||
(*aCollectorFunc)(mRuleProcessors[eAgentSheet], aData);
|
||||
nsRuleNode* lastAgentRN = mRuleWalker->GetCurrentNode();
|
||||
|
||||
nsRuleNode* lastPresHintRN = lastAgentRN;
|
||||
if (mRuleProcessors[ePresHintSheet].Count()) {
|
||||
mRuleProcessors[ePresHintSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastPresHintRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
if (mRuleProcessors[ePresHintSheet])
|
||||
(*aCollectorFunc)(mRuleProcessors[ePresHintSheet], aData);
|
||||
nsRuleNode* lastPresHintRN = mRuleWalker->GetCurrentNode();
|
||||
|
||||
nsRuleNode* lastUserRN = lastPresHintRN;
|
||||
if (mRuleProcessors[eUserSheet].Count()) {
|
||||
mRuleProcessors[eUserSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastUserRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
if (mRuleProcessors[eUserSheet])
|
||||
(*aCollectorFunc)(mRuleProcessors[eUserSheet], aData);
|
||||
nsRuleNode* lastUserRN = mRuleWalker->GetCurrentNode();
|
||||
|
||||
nsRuleNode* lastHTMLPresHintRN = lastUserRN;
|
||||
if (mRuleProcessors[eHTMLPresHintSheet].Count()) {
|
||||
mRuleProcessors[eHTMLPresHintSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastHTMLPresHintRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
if (mRuleProcessors[eHTMLPresHintSheet])
|
||||
(*aCollectorFunc)(mRuleProcessors[eHTMLPresHintSheet], aData);
|
||||
nsRuleNode* lastHTMLPresHintRN = mRuleWalker->GetCurrentNode();
|
||||
|
||||
nsRuleNode* lastDocRN = lastHTMLPresHintRN;
|
||||
PRBool useRuleProcessors = PR_TRUE;
|
||||
if (mStyleRuleSupplier) {
|
||||
// We can supply additional document-level sheets that should be walked.
|
||||
mStyleRuleSupplier->WalkRules(this, aCollectorFunc, aData);
|
||||
mStyleRuleSupplier->UseDocumentRules(aData->mContent, &useRuleProcessors);
|
||||
}
|
||||
if (useRuleProcessors && mRuleProcessors[eDocSheet].Count()) {
|
||||
mRuleProcessors[eDocSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
}
|
||||
lastDocRN = mRuleWalker->GetCurrentNode();
|
||||
if (useRuleProcessors && mRuleProcessors[eDocSheet]) // NOTE: different
|
||||
(*aCollectorFunc)(mRuleProcessors[eDocSheet], aData);
|
||||
if (mRuleProcessors[eStyleAttrSheet])
|
||||
(*aCollectorFunc)(mRuleProcessors[eStyleAttrSheet], aData);
|
||||
|
||||
nsRuleNode* lastOvrRN = lastDocRN;
|
||||
if (mRuleProcessors[eOverrideSheet].Count()) {
|
||||
mRuleProcessors[eOverrideSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastOvrRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
if (mRuleProcessors[eOverrideSheet])
|
||||
(*aCollectorFunc)(mRuleProcessors[eOverrideSheet], aData);
|
||||
nsRuleNode* lastOvrRN = mRuleWalker->GetCurrentNode();
|
||||
|
||||
// There should be no important rules in the preshint or HTMLpreshint level
|
||||
AddImportantRules(lastOvrRN, lastHTMLPresHintRN); // doc and override
|
||||
@ -509,17 +484,14 @@ nsStyleSet::WalkRuleProcessors(nsIStyleRuleProcessor::EnumFunc aFunc,
|
||||
SheetCount(eHTMLPresHintSheet) == 0,
|
||||
"Can't have both types of preshint sheets at once!");
|
||||
|
||||
// Walk the agent rules first.
|
||||
mRuleProcessors[eAgentSheet].EnumerateForwards(aFunc, aData);
|
||||
|
||||
// Walk preshint rules.
|
||||
mRuleProcessors[ePresHintSheet].EnumerateForwards(aFunc, aData);
|
||||
|
||||
// Walk the user rules next.
|
||||
mRuleProcessors[eUserSheet].EnumerateForwards(aFunc, aData);
|
||||
|
||||
// Walk HTML preshint rules.
|
||||
mRuleProcessors[eHTMLPresHintSheet].EnumerateForwards(aFunc, aData);
|
||||
if (mRuleProcessors[eAgentSheet])
|
||||
(*aFunc)(mRuleProcessors[eAgentSheet], aData);
|
||||
if (mRuleProcessors[ePresHintSheet])
|
||||
(*aFunc)(mRuleProcessors[ePresHintSheet], aData);
|
||||
if (mRuleProcessors[eUserSheet])
|
||||
(*aFunc)(mRuleProcessors[eUserSheet], aData);
|
||||
if (mRuleProcessors[eHTMLPresHintSheet])
|
||||
(*aFunc)(mRuleProcessors[eHTMLPresHintSheet], aData);
|
||||
|
||||
PRBool useRuleProcessors = PR_TRUE;
|
||||
if (mStyleRuleSupplier) {
|
||||
@ -527,13 +499,12 @@ nsStyleSet::WalkRuleProcessors(nsIStyleRuleProcessor::EnumFunc aFunc,
|
||||
mStyleRuleSupplier->WalkRules(this, aFunc, aData);
|
||||
mStyleRuleSupplier->UseDocumentRules(aData->mContent, &useRuleProcessors);
|
||||
}
|
||||
|
||||
// Now walk the doc rules.
|
||||
if (useRuleProcessors)
|
||||
mRuleProcessors[eDocSheet].EnumerateForwards(aFunc, aData);
|
||||
|
||||
// Walk the override rules last.
|
||||
mRuleProcessors[eOverrideSheet].EnumerateForwards(aFunc, aData);
|
||||
if (useRuleProcessors && mRuleProcessors[eDocSheet]) // NOTE: different
|
||||
(*aFunc)(mRuleProcessors[eDocSheet], aData);
|
||||
if (mRuleProcessors[eStyleAttrSheet])
|
||||
(*aFunc)(mRuleProcessors[eStyleAttrSheet], aData);
|
||||
if (mRuleProcessors[eOverrideSheet])
|
||||
(*aFunc)(mRuleProcessors[eOverrideSheet], aData);
|
||||
}
|
||||
|
||||
PRBool nsStyleSet::BuildDefaultStyleData(nsIPresContext* aPresContext)
|
||||
@ -581,12 +552,13 @@ nsStyleSet::ResolveStyleFor(nsIContent* aContent,
|
||||
"content must be element");
|
||||
|
||||
if (aContent && presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
if (mRuleProcessors[eAgentSheet] ||
|
||||
mRuleProcessors[ePresHintSheet] ||
|
||||
mRuleProcessors[eUserSheet] ||
|
||||
mRuleProcessors[eHTMLPresHintSheet] ||
|
||||
mRuleProcessors[eDocSheet] ||
|
||||
mRuleProcessors[eStyleAttrSheet] ||
|
||||
mRuleProcessors[eOverrideSheet]) {
|
||||
RulesMatchingData data(presContext, aContent, mRuleWalker);
|
||||
FileRules(EnumRulesMatching, &data);
|
||||
result = GetContext(presContext, aParentContext, nsnull).get();
|
||||
@ -606,12 +578,13 @@ nsStyleSet::ResolveStyleForNonElement(nsStyleContext* aParentContext)
|
||||
nsIPresContext *presContext = PresContext();
|
||||
|
||||
if (presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
if (mRuleProcessors[eAgentSheet] ||
|
||||
mRuleProcessors[ePresHintSheet] ||
|
||||
mRuleProcessors[eUserSheet] ||
|
||||
mRuleProcessors[eHTMLPresHintSheet] ||
|
||||
mRuleProcessors[eDocSheet] ||
|
||||
mRuleProcessors[eStyleAttrSheet] ||
|
||||
mRuleProcessors[eOverrideSheet]) {
|
||||
result = GetContext(presContext, aParentContext,
|
||||
nsCSSAnonBoxes::mozNonElement).get();
|
||||
NS_ASSERTION(mRuleWalker->AtRoot(), "rule walker must be at root");
|
||||
@ -660,12 +633,13 @@ nsStyleSet::ResolvePseudoStyleFor(nsIContent* aParentContent,
|
||||
"content (if non-null) must be element");
|
||||
|
||||
if (aPseudoTag && presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
if (mRuleProcessors[eAgentSheet] ||
|
||||
mRuleProcessors[ePresHintSheet] ||
|
||||
mRuleProcessors[eUserSheet] ||
|
||||
mRuleProcessors[eHTMLPresHintSheet] ||
|
||||
mRuleProcessors[eDocSheet] ||
|
||||
mRuleProcessors[eStyleAttrSheet] ||
|
||||
mRuleProcessors[eOverrideSheet]) {
|
||||
PseudoRulesMatchingData data(presContext, aParentContent, aPseudoTag,
|
||||
aComparator, mRuleWalker);
|
||||
FileRules(EnumPseudoRulesMatching, &data);
|
||||
@ -694,12 +668,13 @@ nsStyleSet::ProbePseudoStyleFor(nsIContent* aParentContent,
|
||||
"content (if non-null) must be element");
|
||||
|
||||
if (aPseudoTag && presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
if (mRuleProcessors[eAgentSheet] ||
|
||||
mRuleProcessors[ePresHintSheet] ||
|
||||
mRuleProcessors[eUserSheet] ||
|
||||
mRuleProcessors[eHTMLPresHintSheet] ||
|
||||
mRuleProcessors[eDocSheet] ||
|
||||
mRuleProcessors[eStyleAttrSheet] ||
|
||||
mRuleProcessors[eOverrideSheet]) {
|
||||
PseudoRulesMatchingData data(presContext, aParentContent, aPseudoTag,
|
||||
nsnull, mRuleWalker);
|
||||
FileRules(EnumPseudoRulesMatching, &data);
|
||||
@ -853,12 +828,13 @@ nsStyleSet::HasStateDependentStyle(nsIPresContext* aPresContext,
|
||||
nsReStyleHint result = nsReStyleHint(0);
|
||||
|
||||
if (aContent->IsContentOfType(nsIContent::eELEMENT) &&
|
||||
(mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count())) {
|
||||
(mRuleProcessors[eAgentSheet] ||
|
||||
mRuleProcessors[ePresHintSheet] ||
|
||||
mRuleProcessors[eUserSheet] ||
|
||||
mRuleProcessors[eHTMLPresHintSheet] ||
|
||||
mRuleProcessors[eDocSheet] ||
|
||||
mRuleProcessors[eStyleAttrSheet] ||
|
||||
mRuleProcessors[eOverrideSheet])) {
|
||||
StatefulData data(aPresContext, aContent, aStateMask);
|
||||
WalkRuleProcessors(SheetHasStatefulStyle, &data);
|
||||
result = data.mHint;
|
||||
@ -898,12 +874,13 @@ nsStyleSet::HasAttributeDependentStyle(nsIPresContext* aPresContext,
|
||||
nsReStyleHint result = nsReStyleHint(0);
|
||||
|
||||
if (aContent->IsContentOfType(nsIContent::eELEMENT) &&
|
||||
(mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count())) {
|
||||
(mRuleProcessors[eAgentSheet] ||
|
||||
mRuleProcessors[ePresHintSheet] ||
|
||||
mRuleProcessors[eUserSheet] ||
|
||||
mRuleProcessors[eHTMLPresHintSheet] ||
|
||||
mRuleProcessors[eDocSheet] ||
|
||||
mRuleProcessors[eStyleAttrSheet] ||
|
||||
mRuleProcessors[eOverrideSheet])) {
|
||||
AttributeData data(aPresContext, aContent, aAttribute, aModType);
|
||||
WalkRuleProcessors(SheetHasAttributeStyle, &data);
|
||||
result = data.mHint;
|
||||
|
@ -153,13 +153,16 @@ class nsStyleSet
|
||||
// APIs to manipulate the style sheet lists.
|
||||
// All sheet types are ordered most-significant-first.
|
||||
enum sheetType {
|
||||
eAgentSheet,
|
||||
eAgentSheet, // CSS
|
||||
ePresHintSheet,
|
||||
eUserSheet,
|
||||
eUserSheet, // CSS
|
||||
eHTMLPresHintSheet,
|
||||
eDocSheet,
|
||||
eOverrideSheet,
|
||||
eDocSheet, // CSS
|
||||
eStyleAttrSheet,
|
||||
eOverrideSheet, // CSS
|
||||
eSheetTypeCount
|
||||
// be sure to keep the number of bits in |mDirty| below updated when
|
||||
// changing the number of sheet types
|
||||
};
|
||||
|
||||
nsresult AppendStyleSheet(sheetType aType, nsIStyleSheet *aSheet);
|
||||
@ -190,7 +193,7 @@ class nsStyleSet
|
||||
PRBool BuildDefaultStyleData(nsIPresContext* aPresContext);
|
||||
|
||||
// Update the rule processor list after a change to the style sheet list.
|
||||
nsresult GatherRuleProcessors(PRInt32 aType);
|
||||
nsresult GatherRuleProcessors(sheetType aType);
|
||||
|
||||
void AddImportantRules(nsRuleNode* aCurrLevelNode,
|
||||
nsRuleNode* aLastPrevLevelNode);
|
||||
@ -229,7 +232,7 @@ class nsStyleSet
|
||||
|
||||
nsCOMArray<nsIStyleSheet> mSheets[eSheetTypeCount];
|
||||
|
||||
nsCOMArray<nsIStyleRuleProcessor> mRuleProcessors[eSheetTypeCount];
|
||||
nsCOMPtr<nsIStyleRuleProcessor> mRuleProcessors[eSheetTypeCount];
|
||||
|
||||
// cached instance for enabling/disabling
|
||||
nsCOMPtr<nsIStyleSheet> mQuirkStyleSheet;
|
||||
|
@ -49,7 +49,6 @@
|
||||
#include "nsIXMLContentSink.h"
|
||||
#include "nsHTMLParts.h"
|
||||
#include "nsHTMLStyleSheet.h"
|
||||
#include "nsIHTMLCSSStyleSheet.h"
|
||||
#include "nsHTMLAtoms.h"
|
||||
#include "nsLayoutAtoms.h"
|
||||
#include "nsIPresShell.h"
|
||||
@ -1069,77 +1068,6 @@ nsHTMLDocument::GetImageMap(const nsAString& aMapName)
|
||||
return nsnull;
|
||||
}
|
||||
|
||||
// subclass hooks for sheet ordering
|
||||
void
|
||||
nsHTMLDocument::InternalAddStyleSheet(nsIStyleSheet* aSheet, PRUint32 aFlags)
|
||||
{
|
||||
if (aSheet == mAttrStyleSheet) { // always first
|
||||
NS_ASSERTION(mStyleSheets.Count() == 0 ||
|
||||
mAttrStyleSheet != mStyleSheets[0],
|
||||
"Adding attr sheet twice!");
|
||||
mStyleSheets.InsertObjectAt(aSheet, 0);
|
||||
}
|
||||
else if (aSheet == mStyleAttrStyleSheet) { // always last
|
||||
NS_ASSERTION(mStyleSheets.Count() == 0 ||
|
||||
mStyleSheets[mStyleSheets.Count() - 1] != mStyleAttrStyleSheet,
|
||||
"Adding style attr sheet twice!");
|
||||
mStyleSheets.AppendObject(aSheet);
|
||||
}
|
||||
else {
|
||||
PRInt32 count = mStyleSheets.Count();
|
||||
if (count != 0 && mStyleAttrStyleSheet == mStyleSheets[count - 1]) {
|
||||
// keep attr sheet last
|
||||
mStyleSheets.InsertObjectAt(aSheet, count - 1);
|
||||
}
|
||||
else {
|
||||
mStyleSheets.AppendObject(aSheet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nsHTMLDocument::InternalInsertStyleSheetAt(nsIStyleSheet* aSheet,
|
||||
PRInt32 aIndex)
|
||||
{
|
||||
NS_ASSERTION(0 <= aIndex &&
|
||||
aIndex <= (
|
||||
mStyleSheets.Count()
|
||||
/* Don't count Attribute stylesheet */
|
||||
- 1
|
||||
/* No insertion allowed after StyleAttr stylesheet */
|
||||
- ((mStyleAttrStyleSheet &&
|
||||
mStyleSheets.Count() > 0 &&
|
||||
mStyleAttrStyleSheet ==
|
||||
mStyleSheets[mStyleSheets.Count() - 1]) ? 1: 0)
|
||||
),
|
||||
"index out of bounds");
|
||||
|
||||
// offset one for the attr style sheet
|
||||
mStyleSheets.InsertObjectAt(aSheet, aIndex + 1);
|
||||
}
|
||||
|
||||
nsIStyleSheet*
|
||||
nsHTMLDocument::InternalGetStyleSheetAt(PRInt32 aIndex) const
|
||||
{
|
||||
PRInt32 count = InternalGetNumberOfStyleSheets();
|
||||
if (aIndex >= 0 && aIndex < count) {
|
||||
return mStyleSheets[aIndex + 1];
|
||||
} else {
|
||||
NS_ERROR("Index out of range");
|
||||
return nsnull;
|
||||
}
|
||||
}
|
||||
|
||||
PRInt32
|
||||
nsHTMLDocument::InternalGetNumberOfStyleSheets() const
|
||||
{
|
||||
PRInt32 count = mStyleSheets.Count();
|
||||
if (count != 0 && mStyleAttrStyleSheet == mStyleSheets[count - 1])
|
||||
--count;
|
||||
--count; // for the attr sheet
|
||||
NS_ASSERTION(count >= 0, "Why did we end up with a negative count?");
|
||||
return count;
|
||||
}
|
||||
|
||||
nsICSSLoader*
|
||||
nsHTMLDocument::GetCSSLoader()
|
||||
|
@ -51,7 +51,6 @@
|
||||
#include "nsIRDFService.h"
|
||||
#include "pldhash.h"
|
||||
#include "nsIHttpChannel.h"
|
||||
#include "nsIHTMLCSSStyleSheet.h"
|
||||
#include "nsHTMLStyleSheet.h"
|
||||
|
||||
// Document.Write() related
|
||||
@ -225,13 +224,6 @@ protected:
|
||||
|
||||
nsIContent *MatchId(nsIContent *aContent, const nsAString& aId);
|
||||
|
||||
virtual void InternalAddStyleSheet(nsIStyleSheet* aSheet,
|
||||
PRUint32 aFlags);
|
||||
virtual void InternalInsertStyleSheetAt(nsIStyleSheet* aSheet,
|
||||
PRInt32 aIndex);
|
||||
virtual nsIStyleSheet* InternalGetStyleSheetAt(PRInt32 aIndex) const;
|
||||
virtual PRInt32 InternalGetNumberOfStyleSheets() const;
|
||||
|
||||
static PRBool MatchLinks(nsIContent *aContent, PRInt32 aNamespaceID,
|
||||
nsIAtom* aAtom, const nsAString& aData);
|
||||
static PRBool MatchAnchors(nsIContent *aContent, PRInt32 aNamespaceID,
|
||||
|
@ -43,14 +43,15 @@
|
||||
class nsICSSRule;
|
||||
class nsIDOMNode;
|
||||
class nsINameSpace;
|
||||
class nsICSSStyleRuleProcessor;
|
||||
class nsCSSRuleProcessor;
|
||||
class nsIMediaList;
|
||||
class nsICSSGroupRule;
|
||||
class nsICSSImportRule;
|
||||
|
||||
// IID for the nsICSSStyleSheet interface {8f83b0f0-b21a-11d1-8031-006008159b5a}
|
||||
// IID for the nsICSSStyleSheet interface
|
||||
// d148e93e-7f1d-4f95-853f-ac356eba3d70
|
||||
#define NS_ICSS_STYLE_SHEET_IID \
|
||||
{0x8f83b0f0, 0xb21a, 0x11d1, {0x80, 0x31, 0x00, 0x60, 0x08, 0x15, 0x9b, 0x5a}}
|
||||
{0xd148e93e, 0x7f1d, 0x4f95, {0x85, 0x3f, 0xac, 0x35, 0x6e, 0xba, 0x3d, 0x70}}
|
||||
|
||||
class nsICSSStyleSheet : public nsIStyleSheet {
|
||||
public:
|
||||
@ -101,7 +102,8 @@ public:
|
||||
NS_IMETHOD IsModified(PRBool* aModified) const = 0; // returns the mDirty status of the sheet
|
||||
NS_IMETHOD SetModified(PRBool aModified) = 0;
|
||||
|
||||
NS_IMETHOD DropRuleProcessorReference(nsICSSStyleRuleProcessor* aProcessor) = 0;
|
||||
NS_IMETHOD AddRuleProcessor(nsCSSRuleProcessor* aProcessor) = 0;
|
||||
NS_IMETHOD DropRuleProcessor(nsCSSRuleProcessor* aProcessor) = 0;
|
||||
};
|
||||
|
||||
// XXX for backwards compatibility and convenience
|
||||
|
@ -96,7 +96,6 @@ CPPSRCS = \
|
||||
EXPORTS = \
|
||||
nsDOMCSSDeclaration.h \
|
||||
nsCSSValue.h \
|
||||
nsICSSStyleRuleProcessor.h \
|
||||
nsICSSRule.h \
|
||||
nsICSSGroupRule.h \
|
||||
nsICSSStyleRule.h \
|
||||
|
@ -1149,7 +1149,7 @@ CSSLoaderImpl::InsertSheetInDoc(nsICSSStyleSheet* aSheet,
|
||||
|
||||
// XXX Need to cancel pending sheet loads for this element, if any
|
||||
|
||||
PRInt32 sheetCount = aDocument->GetNumberOfStyleSheets(PR_FALSE);
|
||||
PRInt32 sheetCount = aDocument->GetNumberOfStyleSheets();
|
||||
|
||||
/*
|
||||
* Start the walk at the _end_ of the list, since in the typical
|
||||
@ -1161,8 +1161,7 @@ CSSLoaderImpl::InsertSheetInDoc(nsICSSStyleSheet* aSheet,
|
||||
*/
|
||||
PRInt32 insertionPoint;
|
||||
for (insertionPoint = sheetCount - 1; insertionPoint >= 0; --insertionPoint) {
|
||||
nsIStyleSheet *curSheet = aDocument->GetStyleSheetAt(insertionPoint,
|
||||
PR_FALSE);
|
||||
nsIStyleSheet *curSheet = aDocument->GetStyleSheetAt(insertionPoint);
|
||||
NS_ASSERTION(curSheet, "There must be a sheet here!");
|
||||
nsCOMPtr<nsIDOMStyleSheet> domSheet = do_QueryInterface(curSheet);
|
||||
NS_ASSERTION(domSheet, "All the \"normal\" sheets implement nsIDOMStyleSheet");
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
// vim:cindent:tabstop=2:expandtab:shiftwidth=2:
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
@ -20,6 +21,7 @@
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* L. David Baron <dbaron@dbaron.org>
|
||||
*
|
||||
* 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"),
|
||||
@ -34,36 +36,57 @@
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#ifndef nsICSSStyleRuleProcessor_h___
|
||||
#define nsICSSStyleRuleProcessor_h___
|
||||
|
||||
#ifndef nsCSSRuleProcessor_h_
|
||||
#define nsCSSRuleProcessor_h_
|
||||
|
||||
#include "nsIStyleRuleProcessor.h"
|
||||
|
||||
struct RuleCascadeData;
|
||||
class nsICSSStyleSheet;
|
||||
|
||||
// IID for the nsICSSStyleRuleProcessor interface {98bf169c-7b7c-11d3-ba05-001083023c2b}
|
||||
#define NS_ICSS_STYLE_RULE_PROCESSOR_IID \
|
||||
{0x98bf169c, 0x7b7c, 0x11d3, {0xba, 0x05, 0x00, 0x10, 0x83, 0x02, 0x3c, 0x2b}}
|
||||
|
||||
/* The CSS style rule processor provides a mechanism for sibling style sheets
|
||||
* to combine their rule processing in order to allow proper cascading to happen.
|
||||
/**
|
||||
* The CSS style rule processor provides a mechanism for sibling style
|
||||
* sheets to combine their rule processing in order to allow proper
|
||||
* cascading to happen.
|
||||
*
|
||||
* When queried for a rule processor, a CSS style sheet will append itself to
|
||||
* the previous CSS processor if present, and return nsnull. Otherwise it will
|
||||
* create a new processor for itself.
|
||||
*
|
||||
* CSS style rule processors keep a live reference on all style sheets bound to them
|
||||
* The CSS style sheets keep a weak reference on all the processors that they are
|
||||
* bound to (many to many). The CSS style sheet is told when the rule processor is
|
||||
* going away (via DropRuleProcessorReference).
|
||||
* CSS style rule processors keep a live reference on all style sheets
|
||||
* bound to them. The CSS style sheets keep a weak reference to all the
|
||||
* processors that they are bound to (many to many). The CSS style sheet
|
||||
* is told when the rule processor is going away (via DropRuleProcessor).
|
||||
*/
|
||||
class nsICSSStyleRuleProcessor: public nsIStyleRuleProcessor {
|
||||
|
||||
class nsCSSRuleProcessor: public nsIStyleRuleProcessor {
|
||||
public:
|
||||
NS_DEFINE_STATIC_IID_ACCESSOR(NS_ICSS_STYLE_RULE_PROCESSOR_IID)
|
||||
nsCSSRuleProcessor(const nsCOMArray<nsICSSStyleSheet>& aSheets);
|
||||
virtual ~nsCSSRuleProcessor();
|
||||
|
||||
NS_IMETHOD AppendStyleSheet(nsICSSStyleSheet* aStyleSheet) = 0;
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD ClearRuleCascades(void) = 0;
|
||||
public:
|
||||
nsresult ClearRuleCascades();
|
||||
|
||||
// nsIStyleRuleProcessor
|
||||
NS_IMETHOD RulesMatching(ElementRuleProcessorData* aData,
|
||||
nsIAtom* aMedium);
|
||||
|
||||
NS_IMETHOD RulesMatching(PseudoRuleProcessorData* aData,
|
||||
nsIAtom* aMedium);
|
||||
|
||||
NS_IMETHOD HasStateDependentStyle(StateRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult);
|
||||
|
||||
NS_IMETHOD HasAttributeDependentStyle(AttributeRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult);
|
||||
|
||||
protected:
|
||||
RuleCascadeData* GetRuleCascade(nsIPresContext* aPresContext, nsIAtom* aMedium);
|
||||
|
||||
nsCOMArray<nsICSSStyleSheet> mSheets;
|
||||
|
||||
RuleCascadeData* mRuleCascades;
|
||||
};
|
||||
|
||||
#endif /* nsICSSStyleRuleProcessor_h___ */
|
||||
#endif /* nsCSSRuleProcessor_h_ */
|
@ -53,7 +53,7 @@
|
||||
#include "pldhash.h"
|
||||
#include "nsHashtable.h"
|
||||
#include "nsICSSPseudoComparator.h"
|
||||
#include "nsICSSStyleRuleProcessor.h"
|
||||
#include "nsCSSRuleProcessor.h"
|
||||
#include "nsICSSStyleRule.h"
|
||||
#include "nsICSSNameSpaceRule.h"
|
||||
#include "nsICSSMediaRule.h"
|
||||
@ -107,13 +107,17 @@ struct RuleValue {
|
||||
* |RuleHash|, to act as rule/selector pairs. |Add| is called when
|
||||
* they are added to the |RuleHash|, and can be considered the second
|
||||
* half of the constructor.
|
||||
*
|
||||
* |RuleValue|s are added to the rule hash from highest weight/order
|
||||
* to lowest (since this is the fast way to build a singly linked
|
||||
* list), so the index used to remember the order is backwards.
|
||||
*/
|
||||
RuleValue(nsICSSStyleRule* aRule, nsCSSSelector* aSelector)
|
||||
: mRule(aRule), mSelector(aSelector) {}
|
||||
|
||||
RuleValue* Add(PRInt32 aIndex, RuleValue *aNext)
|
||||
RuleValue* Add(PRInt32 aBackwardIndex, RuleValue *aNext)
|
||||
{
|
||||
mIndex = aIndex;
|
||||
mBackwardIndex = aBackwardIndex;
|
||||
mNext = aNext;
|
||||
return this;
|
||||
}
|
||||
@ -136,7 +140,7 @@ struct RuleValue {
|
||||
|
||||
nsICSSStyleRule* mRule;
|
||||
nsCSSSelector* mSelector; // which of |mRule|'s selectors
|
||||
PRInt32 mIndex; // High index means low weight/order.
|
||||
PRInt32 mBackwardIndex; // High index means low weight/order.
|
||||
RuleValue* mNext;
|
||||
};
|
||||
|
||||
@ -603,9 +607,9 @@ void RuleHash::EnumerateAllRules(PRInt32 aNameSpace, nsIAtom* aTag,
|
||||
// Merge the lists while there are still multiple lists to merge.
|
||||
while (valueCount > 1) {
|
||||
PRInt32 valueIndex = 0;
|
||||
PRInt32 highestRuleIndex = mEnumList[valueIndex]->mIndex;
|
||||
PRInt32 highestRuleIndex = mEnumList[valueIndex]->mBackwardIndex;
|
||||
for (PRInt32 index = 1; index < valueCount; ++index) {
|
||||
PRInt32 ruleIndex = mEnumList[index]->mIndex;
|
||||
PRInt32 ruleIndex = mEnumList[index]->mBackwardIndex;
|
||||
if (ruleIndex > highestRuleIndex) {
|
||||
valueIndex = index;
|
||||
highestRuleIndex = ruleIndex;
|
||||
@ -719,48 +723,6 @@ RuleCascadeData::AttributeListFor(nsIAtom* aAttribute)
|
||||
return entry->mSelectors;
|
||||
}
|
||||
|
||||
// -------------------------------
|
||||
// CSS Style Rule processor
|
||||
//
|
||||
|
||||
class CSSRuleProcessor: public nsICSSStyleRuleProcessor {
|
||||
public:
|
||||
CSSRuleProcessor(void);
|
||||
virtual ~CSSRuleProcessor(void);
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
public:
|
||||
// nsICSSStyleRuleProcessor
|
||||
NS_IMETHOD AppendStyleSheet(nsICSSStyleSheet* aStyleSheet);
|
||||
|
||||
NS_IMETHOD ClearRuleCascades(void);
|
||||
|
||||
// nsIStyleRuleProcessor
|
||||
NS_IMETHOD RulesMatching(ElementRuleProcessorData* aData,
|
||||
nsIAtom* aMedium);
|
||||
|
||||
NS_IMETHOD RulesMatching(PseudoRuleProcessorData* aData,
|
||||
nsIAtom* aMedium);
|
||||
|
||||
NS_IMETHOD HasStateDependentStyle(StateRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult);
|
||||
|
||||
NS_IMETHOD HasAttributeDependentStyle(AttributeRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult);
|
||||
|
||||
protected:
|
||||
RuleCascadeData* GetRuleCascade(nsIPresContext* aPresContext, nsIAtom* aMedium);
|
||||
|
||||
static PRBool CascadeSheetRulesInto(nsISupports* aSheet, void* aData);
|
||||
|
||||
nsISupportsArray* mSheets;
|
||||
|
||||
RuleCascadeData* mRuleCascades;
|
||||
};
|
||||
|
||||
// -------------------------------
|
||||
// CSS Style Sheet Inner Data Container
|
||||
//
|
||||
@ -795,6 +757,7 @@ public:
|
||||
class CSSImportsCollectionImpl;
|
||||
class CSSRuleListImpl;
|
||||
class DOMMediaListImpl;
|
||||
static PRBool CascadeSheetRulesInto(nsICSSStyleSheet* aSheet, void* aData);
|
||||
|
||||
class CSSStyleSheetImpl : public nsICSSStyleSheet,
|
||||
public nsIDOMCSSStyleSheet,
|
||||
@ -836,9 +799,8 @@ public:
|
||||
NS_IMETHOD SetOwnerRule(nsICSSImportRule* aOwnerRule);
|
||||
NS_IMETHOD GetOwnerRule(nsICSSImportRule** aOwnerRule);
|
||||
|
||||
NS_IMETHOD GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor,
|
||||
nsIStyleRuleProcessor* aPrevProcessor);
|
||||
NS_IMETHOD DropRuleProcessorReference(nsICSSStyleRuleProcessor* aProcessor);
|
||||
NS_IMETHOD AddRuleProcessor(nsCSSRuleProcessor* aProcessor);
|
||||
NS_IMETHOD DropRuleProcessor(nsCSSRuleProcessor* aProcessor);
|
||||
|
||||
|
||||
NS_IMETHOD ContainsStyleSheet(nsIURI* aURL, PRBool& aContains, nsIStyleSheet** aTheChild=nsnull);
|
||||
@ -920,8 +882,8 @@ protected:
|
||||
|
||||
nsAutoVoidArray* mRuleProcessors;
|
||||
|
||||
friend class CSSRuleProcessor;
|
||||
friend class DOMMediaListImpl;
|
||||
friend PRBool CascadeSheetRulesInto(nsICSSStyleSheet* aSheet, void* aData);
|
||||
};
|
||||
|
||||
|
||||
@ -1696,57 +1658,30 @@ NS_IMPL_RELEASE(CSSStyleSheetImpl)
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor,
|
||||
nsIStyleRuleProcessor* aPrevProcessor)
|
||||
CSSStyleSheetImpl::AddRuleProcessor(nsCSSRuleProcessor* aProcessor)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
nsICSSStyleRuleProcessor* cssProcessor = nsnull;
|
||||
|
||||
if (aPrevProcessor) {
|
||||
result = aPrevProcessor->QueryInterface(NS_GET_IID(nsICSSStyleRuleProcessor), (void**)&cssProcessor);
|
||||
if (! mRuleProcessors) {
|
||||
mRuleProcessors = new nsAutoVoidArray();
|
||||
if (!mRuleProcessors)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
if (! cssProcessor) {
|
||||
CSSRuleProcessor* processor = new CSSRuleProcessor();
|
||||
if (processor) {
|
||||
result = processor->QueryInterface(NS_GET_IID(nsICSSStyleRuleProcessor), (void**)&cssProcessor);
|
||||
if (NS_FAILED(result)) {
|
||||
delete processor;
|
||||
cssProcessor = nsnull;
|
||||
}
|
||||
}
|
||||
else {
|
||||
result = NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
}
|
||||
if (NS_SUCCEEDED(result) && cssProcessor) {
|
||||
cssProcessor->AppendStyleSheet(this);
|
||||
if (! mRuleProcessors) {
|
||||
mRuleProcessors = new nsAutoVoidArray();
|
||||
}
|
||||
if (mRuleProcessors) {
|
||||
NS_ASSERTION(-1 == mRuleProcessors->IndexOf(cssProcessor), "processor already registered");
|
||||
mRuleProcessors->AppendElement(cssProcessor); // weak ref
|
||||
}
|
||||
}
|
||||
aProcessor = cssProcessor;
|
||||
NS_ASSERTION(-1 == mRuleProcessors->IndexOf(aProcessor),
|
||||
"processor already registered");
|
||||
mRuleProcessors->AppendElement(aProcessor); // weak ref
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::DropRuleProcessorReference(nsICSSStyleRuleProcessor* aProcessor)
|
||||
CSSStyleSheetImpl::DropRuleProcessor(nsCSSRuleProcessor* aProcessor)
|
||||
{
|
||||
NS_ASSERTION(mRuleProcessors, "no rule processors registered");
|
||||
if (mRuleProcessors) {
|
||||
NS_ASSERTION(-1 != mRuleProcessors->IndexOf(aProcessor), "not a registered processor");
|
||||
mRuleProcessors->RemoveElement(aProcessor);
|
||||
}
|
||||
return NS_OK;
|
||||
if (!mRuleProcessors)
|
||||
return NS_ERROR_FAILURE;
|
||||
return mRuleProcessors->RemoveElement(aProcessor)
|
||||
? NS_OK
|
||||
: NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::SetURL(nsIURI* aURL)
|
||||
{
|
||||
@ -2367,7 +2302,8 @@ void CSSStyleSheetImpl::List(FILE* out, PRInt32 aIndent) const
|
||||
static PRBool PR_CALLBACK
|
||||
EnumClearRuleCascades(void* aProcessor, void* aData)
|
||||
{
|
||||
nsICSSStyleRuleProcessor* processor = (nsICSSStyleRuleProcessor*)aProcessor;
|
||||
nsCSSRuleProcessor* processor =
|
||||
NS_STATIC_CAST(nsCSSRuleProcessor*, aProcessor);
|
||||
processor->ClearRuleCascades();
|
||||
return PR_TRUE;
|
||||
}
|
||||
@ -3011,72 +2947,23 @@ NS_NewCSSStyleSheet(nsICSSStyleSheet** aInstancePtrResult)
|
||||
// CSS Style rule processor implementation
|
||||
//
|
||||
|
||||
CSSRuleProcessor::CSSRuleProcessor(void)
|
||||
: mSheets(nsnull),
|
||||
nsCSSRuleProcessor::nsCSSRuleProcessor(const nsCOMArray<nsICSSStyleSheet>& aSheets)
|
||||
: mSheets(aSheets),
|
||||
mRuleCascades(nsnull)
|
||||
{
|
||||
for (PRInt32 i = mSheets.Count() - 1; i >= 0; --i)
|
||||
mSheets[i]->AddRuleProcessor(this);
|
||||
}
|
||||
|
||||
static PRBool
|
||||
DropProcessorReference(nsISupports* aSheet, void* aProcessor)
|
||||
nsCSSRuleProcessor::~nsCSSRuleProcessor(void)
|
||||
{
|
||||
nsICSSStyleSheet* sheet = (nsICSSStyleSheet*)aSheet;
|
||||
nsICSSStyleRuleProcessor* processor = (nsICSSStyleRuleProcessor*)aProcessor;
|
||||
sheet->DropRuleProcessorReference(processor);
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
CSSRuleProcessor::~CSSRuleProcessor(void)
|
||||
{
|
||||
if (mSheets) {
|
||||
mSheets->EnumerateForwards(DropProcessorReference, this);
|
||||
NS_RELEASE(mSheets);
|
||||
}
|
||||
for (PRInt32 i = mSheets.Count() - 1; i >= 0; --i)
|
||||
mSheets[i]->DropRuleProcessor(this);
|
||||
mSheets.Clear();
|
||||
ClearRuleCascades();
|
||||
}
|
||||
|
||||
NS_IMPL_ADDREF(CSSRuleProcessor)
|
||||
NS_IMPL_RELEASE(CSSRuleProcessor)
|
||||
|
||||
nsresult
|
||||
CSSRuleProcessor::QueryInterface(REFNSIID aIID, void** aInstancePtrResult)
|
||||
{
|
||||
if (NULL == aInstancePtrResult) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
if (aIID.Equals(NS_GET_IID(nsICSSStyleRuleProcessor))) {
|
||||
*aInstancePtrResult = (void*)this;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
if (aIID.Equals(NS_GET_IID(nsIStyleRuleProcessor))) {
|
||||
*aInstancePtrResult = (void*)this;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
*aInstancePtrResult = (void*)this;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSRuleProcessor::AppendStyleSheet(nsICSSStyleSheet* aStyleSheet)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
if (! mSheets) {
|
||||
result = NS_NewISupportsArray(&mSheets);
|
||||
}
|
||||
if (mSheets) {
|
||||
mSheets->AppendElement(aStyleSheet);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
NS_IMPL_ISUPPORTS1(nsCSSRuleProcessor, nsIStyleRuleProcessor)
|
||||
|
||||
MOZ_DECL_CTOR_COUNTER(RuleProcessorData)
|
||||
|
||||
@ -3869,8 +3756,8 @@ static void ContentEnumFunc(nsICSSStyleRule* aRule, nsCSSSelector* aSelector,
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSRuleProcessor::RulesMatching(ElementRuleProcessorData *aData,
|
||||
nsIAtom* aMedium)
|
||||
nsCSSRuleProcessor::RulesMatching(ElementRuleProcessorData *aData,
|
||||
nsIAtom* aMedium)
|
||||
{
|
||||
NS_PRECONDITION(aData->mContent->IsContentOfType(nsIContent::eELEMENT),
|
||||
"content must be element");
|
||||
@ -3939,8 +3826,8 @@ static void PseudoEnumFunc(nsICSSStyleRule* aRule, nsCSSSelector* aSelector,
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSRuleProcessor::RulesMatching(PseudoRuleProcessorData* aData,
|
||||
nsIAtom* aMedium)
|
||||
nsCSSRuleProcessor::RulesMatching(PseudoRuleProcessorData* aData,
|
||||
nsIAtom* aMedium)
|
||||
{
|
||||
NS_PRECONDITION(!aData->mContent ||
|
||||
aData->mContent->IsContentOfType(nsIContent::eELEMENT),
|
||||
@ -3987,9 +3874,9 @@ PR_STATIC_CALLBACK(PRBool) StateEnumFunc(void* aSelector, void* aData)
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSRuleProcessor::HasStateDependentStyle(StateRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult)
|
||||
nsCSSRuleProcessor::HasStateDependentStyle(StateRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult)
|
||||
{
|
||||
NS_PRECONDITION(aData->mContent->IsContentOfType(nsIContent::eELEMENT),
|
||||
"content must be element");
|
||||
@ -4038,9 +3925,9 @@ PR_STATIC_CALLBACK(PRBool) AttributeEnumFunc(void* aSelector, void* aData)
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSRuleProcessor::HasAttributeDependentStyle(AttributeRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult)
|
||||
nsCSSRuleProcessor::HasAttributeDependentStyle(AttributeRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult)
|
||||
{
|
||||
NS_PRECONDITION(aData->mContent->IsContentOfType(nsIContent::eELEMENT),
|
||||
"content must be element");
|
||||
@ -4087,7 +3974,7 @@ CSSRuleProcessor::HasAttributeDependentStyle(AttributeRuleProcessorData* aData,
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSRuleProcessor::ClearRuleCascades(void)
|
||||
nsCSSRuleProcessor::ClearRuleCascades(void)
|
||||
{
|
||||
RuleCascadeData *data = mRuleCascades;
|
||||
mRuleCascades = nsnull;
|
||||
@ -4229,19 +4116,18 @@ InsertRuleByWeight(nsISupports* aRule, void* aData)
|
||||
}
|
||||
|
||||
|
||||
PRBool
|
||||
CSSRuleProcessor::CascadeSheetRulesInto(nsISupports* aSheet, void* aData)
|
||||
static PRBool
|
||||
CascadeSheetRulesInto(nsICSSStyleSheet* aSheet, void* aData)
|
||||
{
|
||||
nsICSSStyleSheet* iSheet = (nsICSSStyleSheet*)aSheet;
|
||||
CSSStyleSheetImpl* sheet = (CSSStyleSheetImpl*)iSheet;
|
||||
CascadeEnumData* data = (CascadeEnumData*)aData;
|
||||
CSSStyleSheetImpl* sheet = NS_STATIC_CAST(CSSStyleSheetImpl*, aSheet);
|
||||
CascadeEnumData* data = NS_STATIC_CAST(CascadeEnumData*, aData);
|
||||
PRBool bSheetApplicable = PR_TRUE;
|
||||
sheet->GetApplicable(bSheetApplicable);
|
||||
|
||||
if (bSheetApplicable && sheet->UseForMedium(data->mMedium)) {
|
||||
CSSStyleSheetImpl* child = sheet->mFirstChild;
|
||||
CSSStyleSheetImpl* child = sheet->mFirstChild;
|
||||
while (child) {
|
||||
CascadeSheetRulesInto((nsICSSStyleSheet*)child, data);
|
||||
CascadeSheetRulesInto(child, data);
|
||||
child = child->mNext;
|
||||
}
|
||||
|
||||
@ -4311,7 +4197,8 @@ static void PutRulesInList(nsObjectHashtable* aRuleArrays,
|
||||
}
|
||||
|
||||
RuleCascadeData*
|
||||
CSSRuleProcessor::GetRuleCascade(nsIPresContext* aPresContext, nsIAtom* aMedium)
|
||||
nsCSSRuleProcessor::GetRuleCascade(nsIPresContext* aPresContext,
|
||||
nsIAtom* aMedium)
|
||||
{
|
||||
RuleCascadeData **cascadep = &mRuleCascades;
|
||||
RuleCascadeData *cascade;
|
||||
@ -4321,15 +4208,17 @@ CSSRuleProcessor::GetRuleCascade(nsIPresContext* aPresContext, nsIAtom* aMedium)
|
||||
cascadep = &cascade->mNext;
|
||||
}
|
||||
|
||||
if (mSheets) {
|
||||
if (mSheets.Count() != 0) {
|
||||
cascade = new RuleCascadeData(aMedium,
|
||||
eCompatibility_NavQuirks == aPresContext->CompatibilityMode());
|
||||
if (cascade) {
|
||||
CascadeEnumData data(aMedium, cascade->mRuleHash.Arena());
|
||||
mSheets->EnumerateForwards(CascadeSheetRulesInto, &data);
|
||||
mSheets.EnumerateForwards(CascadeSheetRulesInto, &data);
|
||||
nsVoidArray weightedRules;
|
||||
PutRulesInList(&data.mRuleArrays, &weightedRules);
|
||||
|
||||
// Put things into the rule hash backwards because it's easier to
|
||||
// build a singly linked list lowest-first that way.
|
||||
if (!weightedRules.EnumerateBackwards(AddRule, cascade)) {
|
||||
delete cascade;
|
||||
cascade = nsnull;
|
||||
|
@ -367,9 +367,6 @@ public:
|
||||
NS_IMETHOD GetOwningDocument(nsIDocument*& aDocument) const;
|
||||
NS_IMETHOD SetOwningDocument(nsIDocument* aDocument);
|
||||
|
||||
NS_IMETHOD GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor,
|
||||
nsIStyleRuleProcessor* aPrevProcessor);
|
||||
|
||||
// nsIStyleRuleProcessor api
|
||||
NS_IMETHOD RulesMatching(ElementRuleProcessorData* aData,
|
||||
nsIAtom* aMedium);
|
||||
@ -434,15 +431,6 @@ NS_IMPL_ISUPPORTS3(HTMLCSSStyleSheetImpl,
|
||||
nsIStyleSheet,
|
||||
nsIStyleRuleProcessor)
|
||||
|
||||
NS_IMETHODIMP
|
||||
HTMLCSSStyleSheetImpl::GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor,
|
||||
nsIStyleRuleProcessor* /*aPrevProcessor*/)
|
||||
{
|
||||
aProcessor = this;
|
||||
NS_ADDREF(aProcessor);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
HTMLCSSStyleSheetImpl::RulesMatching(ElementRuleProcessorData* aData,
|
||||
nsIAtom* aMedium)
|
||||
|
@ -499,15 +499,6 @@ nsHTMLStyleSheet::~nsHTMLStyleSheet()
|
||||
|
||||
NS_IMPL_ISUPPORTS2(nsHTMLStyleSheet, nsIStyleSheet, nsIStyleRuleProcessor)
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsHTMLStyleSheet::GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor,
|
||||
nsIStyleRuleProcessor* /*aPrevProcessor*/)
|
||||
{
|
||||
aProcessor = this;
|
||||
NS_ADDREF(aProcessor);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
static nsresult GetBodyColor(nsIPresContext* aPresContext, nscolor* aColor)
|
||||
{
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
|
@ -68,8 +68,6 @@ public:
|
||||
NS_IMETHOD GetParentSheet(nsIStyleSheet*& aParent) const; // will be null
|
||||
NS_IMETHOD GetOwningDocument(nsIDocument*& aDocument) const;
|
||||
NS_IMETHOD SetOwningDocument(nsIDocument* aDocumemt);
|
||||
NS_IMETHOD GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor,
|
||||
nsIStyleRuleProcessor* aPrevProcessor);
|
||||
#ifdef DEBUG
|
||||
virtual void List(FILE* out = stdout, PRInt32 aIndent = 0) const;
|
||||
#endif
|
||||
|
@ -1271,18 +1271,6 @@ nsBindingManager::WalkRules(nsStyleSet* aStyleSet,
|
||||
// Null out the scoped root that we set repeatedly in the other |WalkRules|.
|
||||
aData->mScopedRoot = nsnull;
|
||||
|
||||
if (parent) {
|
||||
// We cut ourselves off, but we still need to walk the document's attribute sheet
|
||||
// so that inline style continues to work on anonymous content.
|
||||
nsIDocument* doc = content->GetDocument();
|
||||
if (doc) {
|
||||
nsCOMPtr<nsIStyleRuleProcessor> inlineCSS(
|
||||
do_QueryInterface(doc->GetInlineStyleSheet()));
|
||||
if (inlineCSS)
|
||||
(*aFunc)(inlineCSS, aData);
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -1068,9 +1068,9 @@ nsXBLBinding::WalkRules(nsIStyleRuleProcessor::EnumFunc aFunc, void* aData)
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsCOMArray<nsIStyleRuleProcessor> *rules = mPrototypeBinding->GetRuleProcessors();
|
||||
nsIStyleRuleProcessor *rules = mPrototypeBinding->GetRuleProcessor();
|
||||
if (rules)
|
||||
rules->EnumerateForwards(aFunc, aData);
|
||||
(*aFunc)(rules, aData);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
@ -912,11 +912,11 @@ nsXBLPrototypeBinding::SetInitialAttributes(nsIContent* aBoundElement, nsIConten
|
||||
}
|
||||
}
|
||||
|
||||
nsCOMArray<nsIStyleRuleProcessor>*
|
||||
nsXBLPrototypeBinding::GetRuleProcessors()
|
||||
nsIStyleRuleProcessor*
|
||||
nsXBLPrototypeBinding::GetRuleProcessor()
|
||||
{
|
||||
if (mResources) {
|
||||
return &mResources->mRuleProcessors;
|
||||
return mResources->mRuleProcessor;
|
||||
}
|
||||
|
||||
return nsnull;
|
||||
|
@ -117,7 +117,7 @@ public:
|
||||
|
||||
void SetInitialAttributes(nsIContent* aBoundElement, nsIContent* aAnonymousContent);
|
||||
|
||||
nsCOMArray<nsIStyleRuleProcessor>* GetRuleProcessors();
|
||||
nsIStyleRuleProcessor* GetRuleProcessor();
|
||||
nsCOMArray<nsICSSStyleSheet>* GetStyleSheets();
|
||||
|
||||
PRBool HasInsertionPoints() { return mInsertionPointTable != nsnull; }
|
||||
|
@ -49,6 +49,7 @@
|
||||
#include "nsICSSLoader.h"
|
||||
#include "nsIURI.h"
|
||||
#include "nsLayoutCID.h"
|
||||
#include "nsCSSRuleProcessor.h"
|
||||
|
||||
static NS_DEFINE_CID(kCSSLoaderCID, NS_CSS_LOADER_CID);
|
||||
|
||||
@ -116,12 +117,11 @@ nsXBLPrototypeResources::FlushSkinSheets()
|
||||
// We have scoped stylesheets. Reload any chrome stylesheets we
|
||||
// encounter. (If they aren't skin sheets, it doesn't matter, since
|
||||
// they'll still be in the chrome cache.
|
||||
mRuleProcessors.Clear();
|
||||
mRuleProcessor = nsnull;
|
||||
|
||||
nsCOMArray<nsICSSStyleSheet> oldSheets(mStyleSheetList);
|
||||
mStyleSheetList.Clear();
|
||||
|
||||
nsCOMPtr<nsIStyleRuleProcessor> prevProcessor;
|
||||
PRInt32 i;
|
||||
PRInt32 count = oldSheets.Count();
|
||||
for (i = 0; i < count; i++) {
|
||||
@ -140,14 +140,8 @@ nsXBLPrototypeResources::FlushSkinSheets()
|
||||
}
|
||||
|
||||
mStyleSheetList.AppendObject(newSheet);
|
||||
|
||||
nsCOMPtr<nsIStyleRuleProcessor> processor;
|
||||
newSheet->GetStyleRuleProcessor(*getter_AddRefs(processor), prevProcessor);
|
||||
if (processor != prevProcessor) {
|
||||
mRuleProcessors.AppendObject(processor);
|
||||
prevProcessor = processor;
|
||||
}
|
||||
}
|
||||
mRuleProcessor = new nsCSSRuleProcessor(mStyleSheetList);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -71,7 +71,9 @@ public:
|
||||
// MEMBER VARIABLES
|
||||
nsXBLResourceLoader* mLoader; // A loader object. Exists only long enough to load resources, and then it dies.
|
||||
nsCOMArray<nsICSSStyleSheet> mStyleSheetList; // A list of loaded stylesheets for this binding.
|
||||
nsCOMArray<nsIStyleRuleProcessor> mRuleProcessors; // The list of stylesheets converted to rule processors.
|
||||
|
||||
// The list of stylesheets converted to a rule processor.
|
||||
nsCOMPtr<nsIStyleRuleProcessor> mRuleProcessor;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -56,6 +56,7 @@
|
||||
#include "nsFrameManager.h"
|
||||
#include "nsStyleContext.h"
|
||||
#include "nsXBLPrototypeBinding.h"
|
||||
#include "nsCSSRuleProcessor.h"
|
||||
|
||||
NS_IMPL_ISUPPORTS1(nsXBLResourceLoader, nsICSSLoaderObserver)
|
||||
|
||||
@ -185,19 +186,8 @@ nsXBLResourceLoader::StyleSheetLoaded(nsICSSStyleSheet* aSheet, PRBool aNotify)
|
||||
|
||||
if (mPendingSheets == 0) {
|
||||
// All stylesheets are loaded.
|
||||
nsCOMPtr<nsIStyleRuleProcessor> prevProcessor;
|
||||
mResources->mRuleProcessors.Clear();
|
||||
PRInt32 count = mResources->mStyleSheetList.Count();
|
||||
for (PRInt32 i = 0; i < count; i++) {
|
||||
nsICSSStyleSheet* sheet = mResources->mStyleSheetList[i];
|
||||
|
||||
nsCOMPtr<nsIStyleRuleProcessor> processor;
|
||||
sheet->GetStyleRuleProcessor(*getter_AddRefs(processor), prevProcessor);
|
||||
if (processor != prevProcessor) {
|
||||
mResources->mRuleProcessors.AppendObject(processor);
|
||||
prevProcessor = processor;
|
||||
}
|
||||
}
|
||||
mResources->mRuleProcessor =
|
||||
new nsCSSRuleProcessor(mResources->mStyleSheetList);
|
||||
|
||||
// XXX Check for mPendingScripts when scripts also come online.
|
||||
if (!mInLoadResourcesFunc)
|
||||
|
@ -871,9 +871,9 @@ NS_NewMathMLElement(nsIContent** aResult, nsINodeInfo* aNodeInfo)
|
||||
PRBool enabled;
|
||||
if (cssLoader && NS_SUCCEEDED(cssLoader->GetEnabled(&enabled)) && enabled) {
|
||||
PRBool alreadyLoaded = PR_FALSE;
|
||||
PRInt32 sheetCount = doc->GetNumberOfStyleSheets(PR_TRUE);
|
||||
PRInt32 sheetCount = doc->GetNumberOfCatalogStyleSheets();
|
||||
for (PRInt32 i = 0; i < sheetCount; i++) {
|
||||
nsIStyleSheet* sheet = doc->GetStyleSheetAt(i, PR_TRUE);
|
||||
nsIStyleSheet* sheet = doc->GetCatalogStyleSheetAt(i);
|
||||
NS_ASSERTION(sheet, "unexpected null stylesheet in the document");
|
||||
if (sheet) {
|
||||
nsCOMPtr<nsIURI> uri;
|
||||
@ -900,7 +900,7 @@ NS_NewMathMLElement(nsIContent** aResult, nsINodeInfo* aNodeInfo)
|
||||
#endif
|
||||
if (sheet) {
|
||||
doc->BeginUpdate(UPDATE_STYLE);
|
||||
doc->AddStyleSheet(sheet, NS_STYLESHEET_FROM_CATALOG);
|
||||
doc->AddCatalogStyleSheet(sheet);
|
||||
doc->EndUpdate(UPDATE_STYLE);
|
||||
}
|
||||
}
|
||||
@ -1157,7 +1157,7 @@ nsXMLContentSink::HandleDoctypeDecl(const nsAString & aSubset,
|
||||
#endif
|
||||
if (sheet) {
|
||||
mDocument->BeginUpdate(UPDATE_STYLE);
|
||||
mDocument->AddStyleSheet(sheet, NS_STYLESHEET_FROM_CATALOG);
|
||||
mDocument->AddCatalogStyleSheet(sheet);
|
||||
mDocument->EndUpdate(UPDATE_STYLE);
|
||||
}
|
||||
}
|
||||
|
@ -644,92 +644,6 @@ nsXMLDocument::EndLoad()
|
||||
nsDocument::EndLoad();
|
||||
}
|
||||
|
||||
// subclass hook for sheet ordering
|
||||
void
|
||||
nsXMLDocument::InternalAddStyleSheet(nsIStyleSheet* aSheet, PRUint32 aFlags)
|
||||
{
|
||||
// XXXbz this catalog stuff should be in the UA level in the cascade!
|
||||
if (aFlags & NS_STYLESHEET_FROM_CATALOG) {
|
||||
// always after other catalog sheets
|
||||
mStyleSheets.InsertObjectAt(aSheet, mCatalogSheetCount);
|
||||
++mCatalogSheetCount;
|
||||
}
|
||||
else if (aSheet == mAttrStyleSheet) { // always after catalog sheets
|
||||
NS_ASSERTION(mStyleSheets.Count() == 0 ||
|
||||
mAttrStyleSheet != mStyleSheets[0],
|
||||
"Adding attr sheet twice!");
|
||||
mStyleSheets.InsertObjectAt(aSheet, mCatalogSheetCount);
|
||||
}
|
||||
else if (aSheet == mStyleAttrStyleSheet) { // always last
|
||||
NS_ASSERTION(mStyleSheets.Count() == 0 ||
|
||||
mStyleSheets[mStyleSheets.Count() - 1] != mStyleAttrStyleSheet,
|
||||
"Adding style attr sheet twice!");
|
||||
mStyleSheets.AppendObject(aSheet);
|
||||
}
|
||||
else {
|
||||
PRInt32 count = mStyleSheets.Count();
|
||||
if (count != 0 && mStyleAttrStyleSheet == mStyleSheets[count - 1]) {
|
||||
// keep attr sheet last
|
||||
mStyleSheets.InsertObjectAt(aSheet, count - 1);
|
||||
}
|
||||
else {
|
||||
mStyleSheets.AppendObject(aSheet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nsXMLDocument::InternalInsertStyleSheetAt(nsIStyleSheet* aSheet, PRInt32 aIndex)
|
||||
{
|
||||
NS_ASSERTION(0 <= aIndex &&
|
||||
aIndex <= (
|
||||
mStyleSheets.Count()
|
||||
/* Don't count Attribute stylesheet */
|
||||
- 1
|
||||
/* Don't count catalog sheets */
|
||||
- mCatalogSheetCount
|
||||
/* No insertion allowed after StyleAttr stylesheet */
|
||||
- (mStyleAttrStyleSheet ? 1: 0)
|
||||
),
|
||||
"index out of bounds");
|
||||
// offset w.r.t. catalog style sheets and the attr style sheet
|
||||
mStyleSheets.InsertObjectAt(aSheet, aIndex + mCatalogSheetCount + 1);
|
||||
}
|
||||
|
||||
nsIStyleSheet*
|
||||
nsXMLDocument::InternalGetStyleSheetAt(PRInt32 aIndex) const
|
||||
{
|
||||
PRInt32 count = InternalGetNumberOfStyleSheets();
|
||||
|
||||
if (aIndex >= 0 && aIndex < count) {
|
||||
return mStyleSheets[aIndex + mCatalogSheetCount + 1];
|
||||
} else {
|
||||
NS_ERROR("Index out of range");
|
||||
return nsnull;
|
||||
}
|
||||
}
|
||||
|
||||
PRInt32
|
||||
nsXMLDocument::InternalGetNumberOfStyleSheets() const
|
||||
{
|
||||
PRInt32 count = mStyleSheets.Count();
|
||||
|
||||
if (count != 0 && mStyleAttrStyleSheet == mStyleSheets[count - 1]) {
|
||||
// subtract the inline style sheet
|
||||
--count;
|
||||
}
|
||||
|
||||
if (count != 0 && mAttrStyleSheet == mStyleSheets[mCatalogSheetCount]) {
|
||||
// subtract the attr sheet
|
||||
--count;
|
||||
}
|
||||
|
||||
count -= mCatalogSheetCount;
|
||||
|
||||
NS_ASSERTION(count >= 0, "How did we get a negative count?");
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
// nsIDOMNode interface
|
||||
|
||||
|
@ -61,10 +61,7 @@ public:
|
||||
nsXMLDocument();
|
||||
virtual ~nsXMLDocument();
|
||||
|
||||
NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr);
|
||||
|
||||
NS_IMETHOD_(nsrefcnt) AddRef(void);
|
||||
NS_IMETHOD_(nsrefcnt) Release(void);
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
|
||||
virtual void Reset(nsIChannel* aChannel, nsILoadGroup* aLoadGroup);
|
||||
|
||||
@ -98,19 +95,8 @@ public:
|
||||
virtual nsresult Init();
|
||||
|
||||
protected:
|
||||
// subclass hooks for sheet ordering
|
||||
virtual void InternalAddStyleSheet(nsIStyleSheet* aSheet, PRUint32 aFlags);
|
||||
virtual void InternalInsertStyleSheetAt(nsIStyleSheet* aSheet, PRInt32 aIndex);
|
||||
virtual nsIStyleSheet* InternalGetStyleSheetAt(PRInt32 aIndex) const;
|
||||
virtual PRInt32 InternalGetNumberOfStyleSheets() const;
|
||||
|
||||
virtual nsresult GetLoadGroup(nsILoadGroup **aLoadGroup);
|
||||
|
||||
// For additional catalog sheets (if any) needed to layout the XML vocabulary
|
||||
// of the document. Catalog sheets are kept at the beginning of our array of
|
||||
// style sheets and this counter is used as an offset to distinguish them
|
||||
PRInt32 mCatalogSheetCount;
|
||||
|
||||
nsCOMPtr<nsIEventQueueService> mEventQService;
|
||||
|
||||
nsCOMPtr<nsIScriptContext> mScriptContext;
|
||||
|
@ -432,6 +432,8 @@ nsXULDocument::~nsXULDocument()
|
||||
// from happening.
|
||||
if (mIsPopup) {
|
||||
mStyleSheets.Clear();
|
||||
mStyleAttrStyleSheet = nsnull;
|
||||
mAttrStyleSheet = nsnull;
|
||||
}
|
||||
|
||||
// This is done in nsDocument::~nsDocument() too, but since this
|
||||
@ -721,7 +723,7 @@ nsXULDocument::EndLoad()
|
||||
continue;
|
||||
}
|
||||
|
||||
AddStyleSheet(sheet, 0);
|
||||
AddStyleSheet(sheet);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3577,7 +3579,7 @@ nsXULDocument::AddPrototypeSheets()
|
||||
// prototype's list, but until then, don't propagate the failure
|
||||
// from LoadAgentSheet (and thus exit the loop).
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
AddStyleSheet(sheet, 0);
|
||||
AddStyleSheet(sheet);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -55,7 +55,7 @@ AddStyleSheet(nsIEditor* aEditor, nsIStyleSheet* aSheet)
|
||||
nsCOMPtr<nsIDocument> doc = do_QueryInterface(domDoc);
|
||||
if (doc) {
|
||||
doc->BeginUpdate(UPDATE_STYLE);
|
||||
doc->AddStyleSheet(aSheet, 0);
|
||||
doc->AddStyleSheet(aSheet);
|
||||
doc->EndUpdate(UPDATE_STYLE);
|
||||
}
|
||||
}
|
||||
|
@ -1752,7 +1752,7 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
|
||||
}
|
||||
|
||||
if (sheet)
|
||||
styleSet->PrependStyleSheet(nsStyleSet::eUserSheet, sheet);
|
||||
styleSet->AppendStyleSheet(nsStyleSet::eUserSheet, sheet);
|
||||
|
||||
// Append chrome sheets (scrollbars + forms).
|
||||
PRBool shouldOverride = PR_FALSE;
|
||||
@ -1783,7 +1783,7 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
|
||||
cssLoader->LoadAgentSheet(uri, getter_AddRefs(csssheet));
|
||||
if (!sheet) continue;
|
||||
|
||||
styleSet->AppendStyleSheet(nsStyleSet::eAgentSheet, csssheet);
|
||||
styleSet->PrependStyleSheet(nsStyleSet::eAgentSheet, csssheet);
|
||||
shouldOverride = PR_TRUE;
|
||||
}
|
||||
nsMemory::Free(str);
|
||||
@ -1794,17 +1794,17 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
|
||||
if (!shouldOverride) {
|
||||
sheet = nsLayoutStylesheetCache::ScrollbarsSheet();
|
||||
if (sheet) {
|
||||
styleSet->AppendStyleSheet(nsStyleSet::eAgentSheet, sheet);
|
||||
styleSet->PrependStyleSheet(nsStyleSet::eAgentSheet, sheet);
|
||||
}
|
||||
}
|
||||
|
||||
sheet = nsLayoutStylesheetCache::FormsSheet();
|
||||
if (sheet) {
|
||||
styleSet->AppendStyleSheet(nsStyleSet::eAgentSheet, sheet);
|
||||
styleSet->PrependStyleSheet(nsStyleSet::eAgentSheet, sheet);
|
||||
}
|
||||
|
||||
if (mUAStyleSheet) {
|
||||
styleSet->AppendStyleSheet(nsStyleSet::eAgentSheet, mUAStyleSheet);
|
||||
styleSet->PrependStyleSheet(nsStyleSet::eAgentSheet, mUAStyleSheet);
|
||||
}
|
||||
|
||||
// Caller will handle calling EndUpdate, per contract.
|
||||
|
@ -1281,9 +1281,11 @@ public:
|
||||
virtual void ContentRemoved(nsIDocument* aDocument, nsIContent* aContainer,
|
||||
nsIContent* aChild, PRInt32 aIndexInContainer);
|
||||
virtual void StyleSheetAdded(nsIDocument* aDocument,
|
||||
nsIStyleSheet* aStyleSheet);
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aDocumentSheet);
|
||||
virtual void StyleSheetRemoved(nsIDocument* aDocument,
|
||||
nsIStyleSheet* aStyleSheet);
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aDocumentSheet);
|
||||
virtual void StyleSheetApplicableStateChanged(nsIDocument* aDocument,
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aApplicable);
|
||||
@ -2075,11 +2077,11 @@ PresShell::SelectAlternateStyleSheet(const nsString& aSheetTitle)
|
||||
{
|
||||
if (mDocument && mStyleSet) {
|
||||
mStyleSet->BeginUpdate();
|
||||
PRInt32 count = mDocument->GetNumberOfStyleSheets(PR_FALSE);
|
||||
PRInt32 count = mDocument->GetNumberOfStyleSheets();
|
||||
PRInt32 index;
|
||||
NS_NAMED_LITERAL_STRING(textHtml,"text/html");
|
||||
for (index = 0; index < count; index++) {
|
||||
nsIStyleSheet *sheet = mDocument->GetStyleSheetAt(index, PR_FALSE);
|
||||
nsIStyleSheet *sheet = mDocument->GetStyleSheetAt(index);
|
||||
PRBool complete;
|
||||
sheet->GetComplete(complete);
|
||||
if (complete) {
|
||||
@ -2111,11 +2113,11 @@ PresShell::ListAlternateStyleSheets(nsStringArray& aTitleList)
|
||||
{
|
||||
// XXX should this be returning incomplete sheets? Probably.
|
||||
if (mDocument) {
|
||||
PRInt32 count = mDocument->GetNumberOfStyleSheets(PR_FALSE);
|
||||
PRInt32 count = mDocument->GetNumberOfStyleSheets();
|
||||
PRInt32 index;
|
||||
NS_NAMED_LITERAL_STRING(textHtml,"text/html");
|
||||
for (index = 0; index < count; index++) {
|
||||
nsIStyleSheet *sheet = mDocument->GetStyleSheetAt(index, PR_FALSE);
|
||||
nsIStyleSheet *sheet = mDocument->GetStyleSheetAt(index);
|
||||
if (sheet) {
|
||||
nsAutoString type;
|
||||
sheet->GetType(type);
|
||||
@ -5268,7 +5270,8 @@ PresShell::ReconstructStyleData()
|
||||
|
||||
void
|
||||
PresShell::StyleSheetAdded(nsIDocument *aDocument,
|
||||
nsIStyleSheet* aStyleSheet)
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aDocumentSheet)
|
||||
{
|
||||
// We only care when enabled sheets are added
|
||||
NS_PRECONDITION(aStyleSheet, "Must have a style sheet!");
|
||||
@ -5282,7 +5285,8 @@ PresShell::StyleSheetAdded(nsIDocument *aDocument,
|
||||
|
||||
void
|
||||
PresShell::StyleSheetRemoved(nsIDocument *aDocument,
|
||||
nsIStyleSheet* aStyleSheet)
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aDocumentSheet)
|
||||
{
|
||||
// We only care when enabled sheets are removed
|
||||
NS_PRECONDITION(aStyleSheet, "Must have a style sheet!");
|
||||
@ -6100,7 +6104,7 @@ PresShell::SetAgentStyleSheets(const nsCOMArray<nsIStyleSheet>& aSheets)
|
||||
nsresult
|
||||
PresShell::AddOverrideStyleSheet(nsIStyleSheet *aSheet)
|
||||
{
|
||||
return mStyleSet->AppendStyleSheet(nsStyleSet::eOverrideSheet, aSheet);
|
||||
return mStyleSet->PrependStyleSheet(nsStyleSet::eOverrideSheet, aSheet);
|
||||
}
|
||||
|
||||
nsresult
|
||||
|
@ -1281,9 +1281,11 @@ public:
|
||||
virtual void ContentRemoved(nsIDocument* aDocument, nsIContent* aContainer,
|
||||
nsIContent* aChild, PRInt32 aIndexInContainer);
|
||||
virtual void StyleSheetAdded(nsIDocument* aDocument,
|
||||
nsIStyleSheet* aStyleSheet);
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aDocumentSheet);
|
||||
virtual void StyleSheetRemoved(nsIDocument* aDocument,
|
||||
nsIStyleSheet* aStyleSheet);
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aDocumentSheet);
|
||||
virtual void StyleSheetApplicableStateChanged(nsIDocument* aDocument,
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aApplicable);
|
||||
@ -2075,11 +2077,11 @@ PresShell::SelectAlternateStyleSheet(const nsString& aSheetTitle)
|
||||
{
|
||||
if (mDocument && mStyleSet) {
|
||||
mStyleSet->BeginUpdate();
|
||||
PRInt32 count = mDocument->GetNumberOfStyleSheets(PR_FALSE);
|
||||
PRInt32 count = mDocument->GetNumberOfStyleSheets();
|
||||
PRInt32 index;
|
||||
NS_NAMED_LITERAL_STRING(textHtml,"text/html");
|
||||
for (index = 0; index < count; index++) {
|
||||
nsIStyleSheet *sheet = mDocument->GetStyleSheetAt(index, PR_FALSE);
|
||||
nsIStyleSheet *sheet = mDocument->GetStyleSheetAt(index);
|
||||
PRBool complete;
|
||||
sheet->GetComplete(complete);
|
||||
if (complete) {
|
||||
@ -2111,11 +2113,11 @@ PresShell::ListAlternateStyleSheets(nsStringArray& aTitleList)
|
||||
{
|
||||
// XXX should this be returning incomplete sheets? Probably.
|
||||
if (mDocument) {
|
||||
PRInt32 count = mDocument->GetNumberOfStyleSheets(PR_FALSE);
|
||||
PRInt32 count = mDocument->GetNumberOfStyleSheets();
|
||||
PRInt32 index;
|
||||
NS_NAMED_LITERAL_STRING(textHtml,"text/html");
|
||||
for (index = 0; index < count; index++) {
|
||||
nsIStyleSheet *sheet = mDocument->GetStyleSheetAt(index, PR_FALSE);
|
||||
nsIStyleSheet *sheet = mDocument->GetStyleSheetAt(index);
|
||||
if (sheet) {
|
||||
nsAutoString type;
|
||||
sheet->GetType(type);
|
||||
@ -5268,7 +5270,8 @@ PresShell::ReconstructStyleData()
|
||||
|
||||
void
|
||||
PresShell::StyleSheetAdded(nsIDocument *aDocument,
|
||||
nsIStyleSheet* aStyleSheet)
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aDocumentSheet)
|
||||
{
|
||||
// We only care when enabled sheets are added
|
||||
NS_PRECONDITION(aStyleSheet, "Must have a style sheet!");
|
||||
@ -5282,7 +5285,8 @@ PresShell::StyleSheetAdded(nsIDocument *aDocument,
|
||||
|
||||
void
|
||||
PresShell::StyleSheetRemoved(nsIDocument *aDocument,
|
||||
nsIStyleSheet* aStyleSheet)
|
||||
nsIStyleSheet* aStyleSheet,
|
||||
PRBool aDocumentSheet)
|
||||
{
|
||||
// We only care when enabled sheets are removed
|
||||
NS_PRECONDITION(aStyleSheet, "Must have a style sheet!");
|
||||
@ -6100,7 +6104,7 @@ PresShell::SetAgentStyleSheets(const nsCOMArray<nsIStyleSheet>& aSheets)
|
||||
nsresult
|
||||
PresShell::AddOverrideStyleSheet(nsIStyleSheet *aSheet)
|
||||
{
|
||||
return mStyleSet->AppendStyleSheet(nsStyleSet::eOverrideSheet, aSheet);
|
||||
return mStyleSet->PrependStyleSheet(nsStyleSet::eOverrideSheet, aSheet);
|
||||
}
|
||||
|
||||
nsresult
|
||||
|
@ -563,7 +563,8 @@ GetMathMLAttributeStyleSheet(nsIPresContext* aPresContext,
|
||||
cssSheet->SetComplete();
|
||||
|
||||
// insert the stylesheet into the styleset without notifying observers
|
||||
styleSet->AppendStyleSheet(nsStyleSet::eAgentSheet, cssSheet);
|
||||
// XXX Should this be at a different level?
|
||||
styleSet->PrependStyleSheet(nsStyleSet::eAgentSheet, cssSheet);
|
||||
*aSheet = cssSheet;
|
||||
NS_ADDREF(*aSheet);
|
||||
}
|
||||
|
@ -1149,7 +1149,7 @@ CSSLoaderImpl::InsertSheetInDoc(nsICSSStyleSheet* aSheet,
|
||||
|
||||
// XXX Need to cancel pending sheet loads for this element, if any
|
||||
|
||||
PRInt32 sheetCount = aDocument->GetNumberOfStyleSheets(PR_FALSE);
|
||||
PRInt32 sheetCount = aDocument->GetNumberOfStyleSheets();
|
||||
|
||||
/*
|
||||
* Start the walk at the _end_ of the list, since in the typical
|
||||
@ -1161,8 +1161,7 @@ CSSLoaderImpl::InsertSheetInDoc(nsICSSStyleSheet* aSheet,
|
||||
*/
|
||||
PRInt32 insertionPoint;
|
||||
for (insertionPoint = sheetCount - 1; insertionPoint >= 0; --insertionPoint) {
|
||||
nsIStyleSheet *curSheet = aDocument->GetStyleSheetAt(insertionPoint,
|
||||
PR_FALSE);
|
||||
nsIStyleSheet *curSheet = aDocument->GetStyleSheetAt(insertionPoint);
|
||||
NS_ASSERTION(curSheet, "There must be a sheet here!");
|
||||
nsCOMPtr<nsIDOMStyleSheet> domSheet = do_QueryInterface(curSheet);
|
||||
NS_ASSERTION(domSheet, "All the \"normal\" sheets implement nsIDOMStyleSheet");
|
||||
|
92
layout/style/nsCSSRuleProcessor.h
Normal file
92
layout/style/nsCSSRuleProcessor.h
Normal file
@ -0,0 +1,92 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
// vim:cindent:tabstop=2:expandtab:shiftwidth=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 <dbaron@dbaron.org>
|
||||
*
|
||||
* 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 ***** */
|
||||
|
||||
#ifndef nsCSSRuleProcessor_h_
|
||||
#define nsCSSRuleProcessor_h_
|
||||
|
||||
#include "nsIStyleRuleProcessor.h"
|
||||
|
||||
struct RuleCascadeData;
|
||||
class nsICSSStyleSheet;
|
||||
|
||||
/**
|
||||
* The CSS style rule processor provides a mechanism for sibling style
|
||||
* sheets to combine their rule processing in order to allow proper
|
||||
* cascading to happen.
|
||||
*
|
||||
* CSS style rule processors keep a live reference on all style sheets
|
||||
* bound to them. The CSS style sheets keep a weak reference to all the
|
||||
* processors that they are bound to (many to many). The CSS style sheet
|
||||
* is told when the rule processor is going away (via DropRuleProcessor).
|
||||
*/
|
||||
|
||||
class nsCSSRuleProcessor: public nsIStyleRuleProcessor {
|
||||
public:
|
||||
nsCSSRuleProcessor(const nsCOMArray<nsICSSStyleSheet>& aSheets);
|
||||
virtual ~nsCSSRuleProcessor();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
public:
|
||||
nsresult ClearRuleCascades();
|
||||
|
||||
// nsIStyleRuleProcessor
|
||||
NS_IMETHOD RulesMatching(ElementRuleProcessorData* aData,
|
||||
nsIAtom* aMedium);
|
||||
|
||||
NS_IMETHOD RulesMatching(PseudoRuleProcessorData* aData,
|
||||
nsIAtom* aMedium);
|
||||
|
||||
NS_IMETHOD HasStateDependentStyle(StateRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult);
|
||||
|
||||
NS_IMETHOD HasAttributeDependentStyle(AttributeRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult);
|
||||
|
||||
protected:
|
||||
RuleCascadeData* GetRuleCascade(nsIPresContext* aPresContext, nsIAtom* aMedium);
|
||||
|
||||
nsCOMArray<nsICSSStyleSheet> mSheets;
|
||||
|
||||
RuleCascadeData* mRuleCascades;
|
||||
};
|
||||
|
||||
#endif /* nsCSSRuleProcessor_h_ */
|
@ -53,7 +53,7 @@
|
||||
#include "pldhash.h"
|
||||
#include "nsHashtable.h"
|
||||
#include "nsICSSPseudoComparator.h"
|
||||
#include "nsICSSStyleRuleProcessor.h"
|
||||
#include "nsCSSRuleProcessor.h"
|
||||
#include "nsICSSStyleRule.h"
|
||||
#include "nsICSSNameSpaceRule.h"
|
||||
#include "nsICSSMediaRule.h"
|
||||
@ -107,13 +107,17 @@ struct RuleValue {
|
||||
* |RuleHash|, to act as rule/selector pairs. |Add| is called when
|
||||
* they are added to the |RuleHash|, and can be considered the second
|
||||
* half of the constructor.
|
||||
*
|
||||
* |RuleValue|s are added to the rule hash from highest weight/order
|
||||
* to lowest (since this is the fast way to build a singly linked
|
||||
* list), so the index used to remember the order is backwards.
|
||||
*/
|
||||
RuleValue(nsICSSStyleRule* aRule, nsCSSSelector* aSelector)
|
||||
: mRule(aRule), mSelector(aSelector) {}
|
||||
|
||||
RuleValue* Add(PRInt32 aIndex, RuleValue *aNext)
|
||||
RuleValue* Add(PRInt32 aBackwardIndex, RuleValue *aNext)
|
||||
{
|
||||
mIndex = aIndex;
|
||||
mBackwardIndex = aBackwardIndex;
|
||||
mNext = aNext;
|
||||
return this;
|
||||
}
|
||||
@ -136,7 +140,7 @@ struct RuleValue {
|
||||
|
||||
nsICSSStyleRule* mRule;
|
||||
nsCSSSelector* mSelector; // which of |mRule|'s selectors
|
||||
PRInt32 mIndex; // High index means low weight/order.
|
||||
PRInt32 mBackwardIndex; // High index means low weight/order.
|
||||
RuleValue* mNext;
|
||||
};
|
||||
|
||||
@ -603,9 +607,9 @@ void RuleHash::EnumerateAllRules(PRInt32 aNameSpace, nsIAtom* aTag,
|
||||
// Merge the lists while there are still multiple lists to merge.
|
||||
while (valueCount > 1) {
|
||||
PRInt32 valueIndex = 0;
|
||||
PRInt32 highestRuleIndex = mEnumList[valueIndex]->mIndex;
|
||||
PRInt32 highestRuleIndex = mEnumList[valueIndex]->mBackwardIndex;
|
||||
for (PRInt32 index = 1; index < valueCount; ++index) {
|
||||
PRInt32 ruleIndex = mEnumList[index]->mIndex;
|
||||
PRInt32 ruleIndex = mEnumList[index]->mBackwardIndex;
|
||||
if (ruleIndex > highestRuleIndex) {
|
||||
valueIndex = index;
|
||||
highestRuleIndex = ruleIndex;
|
||||
@ -719,48 +723,6 @@ RuleCascadeData::AttributeListFor(nsIAtom* aAttribute)
|
||||
return entry->mSelectors;
|
||||
}
|
||||
|
||||
// -------------------------------
|
||||
// CSS Style Rule processor
|
||||
//
|
||||
|
||||
class CSSRuleProcessor: public nsICSSStyleRuleProcessor {
|
||||
public:
|
||||
CSSRuleProcessor(void);
|
||||
virtual ~CSSRuleProcessor(void);
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
public:
|
||||
// nsICSSStyleRuleProcessor
|
||||
NS_IMETHOD AppendStyleSheet(nsICSSStyleSheet* aStyleSheet);
|
||||
|
||||
NS_IMETHOD ClearRuleCascades(void);
|
||||
|
||||
// nsIStyleRuleProcessor
|
||||
NS_IMETHOD RulesMatching(ElementRuleProcessorData* aData,
|
||||
nsIAtom* aMedium);
|
||||
|
||||
NS_IMETHOD RulesMatching(PseudoRuleProcessorData* aData,
|
||||
nsIAtom* aMedium);
|
||||
|
||||
NS_IMETHOD HasStateDependentStyle(StateRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult);
|
||||
|
||||
NS_IMETHOD HasAttributeDependentStyle(AttributeRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult);
|
||||
|
||||
protected:
|
||||
RuleCascadeData* GetRuleCascade(nsIPresContext* aPresContext, nsIAtom* aMedium);
|
||||
|
||||
static PRBool CascadeSheetRulesInto(nsISupports* aSheet, void* aData);
|
||||
|
||||
nsISupportsArray* mSheets;
|
||||
|
||||
RuleCascadeData* mRuleCascades;
|
||||
};
|
||||
|
||||
// -------------------------------
|
||||
// CSS Style Sheet Inner Data Container
|
||||
//
|
||||
@ -795,6 +757,7 @@ public:
|
||||
class CSSImportsCollectionImpl;
|
||||
class CSSRuleListImpl;
|
||||
class DOMMediaListImpl;
|
||||
static PRBool CascadeSheetRulesInto(nsICSSStyleSheet* aSheet, void* aData);
|
||||
|
||||
class CSSStyleSheetImpl : public nsICSSStyleSheet,
|
||||
public nsIDOMCSSStyleSheet,
|
||||
@ -836,9 +799,8 @@ public:
|
||||
NS_IMETHOD SetOwnerRule(nsICSSImportRule* aOwnerRule);
|
||||
NS_IMETHOD GetOwnerRule(nsICSSImportRule** aOwnerRule);
|
||||
|
||||
NS_IMETHOD GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor,
|
||||
nsIStyleRuleProcessor* aPrevProcessor);
|
||||
NS_IMETHOD DropRuleProcessorReference(nsICSSStyleRuleProcessor* aProcessor);
|
||||
NS_IMETHOD AddRuleProcessor(nsCSSRuleProcessor* aProcessor);
|
||||
NS_IMETHOD DropRuleProcessor(nsCSSRuleProcessor* aProcessor);
|
||||
|
||||
|
||||
NS_IMETHOD ContainsStyleSheet(nsIURI* aURL, PRBool& aContains, nsIStyleSheet** aTheChild=nsnull);
|
||||
@ -920,8 +882,8 @@ protected:
|
||||
|
||||
nsAutoVoidArray* mRuleProcessors;
|
||||
|
||||
friend class CSSRuleProcessor;
|
||||
friend class DOMMediaListImpl;
|
||||
friend PRBool CascadeSheetRulesInto(nsICSSStyleSheet* aSheet, void* aData);
|
||||
};
|
||||
|
||||
|
||||
@ -1696,57 +1658,30 @@ NS_IMPL_RELEASE(CSSStyleSheetImpl)
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor,
|
||||
nsIStyleRuleProcessor* aPrevProcessor)
|
||||
CSSStyleSheetImpl::AddRuleProcessor(nsCSSRuleProcessor* aProcessor)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
nsICSSStyleRuleProcessor* cssProcessor = nsnull;
|
||||
|
||||
if (aPrevProcessor) {
|
||||
result = aPrevProcessor->QueryInterface(NS_GET_IID(nsICSSStyleRuleProcessor), (void**)&cssProcessor);
|
||||
if (! mRuleProcessors) {
|
||||
mRuleProcessors = new nsAutoVoidArray();
|
||||
if (!mRuleProcessors)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
if (! cssProcessor) {
|
||||
CSSRuleProcessor* processor = new CSSRuleProcessor();
|
||||
if (processor) {
|
||||
result = processor->QueryInterface(NS_GET_IID(nsICSSStyleRuleProcessor), (void**)&cssProcessor);
|
||||
if (NS_FAILED(result)) {
|
||||
delete processor;
|
||||
cssProcessor = nsnull;
|
||||
}
|
||||
}
|
||||
else {
|
||||
result = NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
}
|
||||
if (NS_SUCCEEDED(result) && cssProcessor) {
|
||||
cssProcessor->AppendStyleSheet(this);
|
||||
if (! mRuleProcessors) {
|
||||
mRuleProcessors = new nsAutoVoidArray();
|
||||
}
|
||||
if (mRuleProcessors) {
|
||||
NS_ASSERTION(-1 == mRuleProcessors->IndexOf(cssProcessor), "processor already registered");
|
||||
mRuleProcessors->AppendElement(cssProcessor); // weak ref
|
||||
}
|
||||
}
|
||||
aProcessor = cssProcessor;
|
||||
NS_ASSERTION(-1 == mRuleProcessors->IndexOf(aProcessor),
|
||||
"processor already registered");
|
||||
mRuleProcessors->AppendElement(aProcessor); // weak ref
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::DropRuleProcessorReference(nsICSSStyleRuleProcessor* aProcessor)
|
||||
CSSStyleSheetImpl::DropRuleProcessor(nsCSSRuleProcessor* aProcessor)
|
||||
{
|
||||
NS_ASSERTION(mRuleProcessors, "no rule processors registered");
|
||||
if (mRuleProcessors) {
|
||||
NS_ASSERTION(-1 != mRuleProcessors->IndexOf(aProcessor), "not a registered processor");
|
||||
mRuleProcessors->RemoveElement(aProcessor);
|
||||
}
|
||||
return NS_OK;
|
||||
if (!mRuleProcessors)
|
||||
return NS_ERROR_FAILURE;
|
||||
return mRuleProcessors->RemoveElement(aProcessor)
|
||||
? NS_OK
|
||||
: NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::SetURL(nsIURI* aURL)
|
||||
{
|
||||
@ -2367,7 +2302,8 @@ void CSSStyleSheetImpl::List(FILE* out, PRInt32 aIndent) const
|
||||
static PRBool PR_CALLBACK
|
||||
EnumClearRuleCascades(void* aProcessor, void* aData)
|
||||
{
|
||||
nsICSSStyleRuleProcessor* processor = (nsICSSStyleRuleProcessor*)aProcessor;
|
||||
nsCSSRuleProcessor* processor =
|
||||
NS_STATIC_CAST(nsCSSRuleProcessor*, aProcessor);
|
||||
processor->ClearRuleCascades();
|
||||
return PR_TRUE;
|
||||
}
|
||||
@ -3011,72 +2947,23 @@ NS_NewCSSStyleSheet(nsICSSStyleSheet** aInstancePtrResult)
|
||||
// CSS Style rule processor implementation
|
||||
//
|
||||
|
||||
CSSRuleProcessor::CSSRuleProcessor(void)
|
||||
: mSheets(nsnull),
|
||||
nsCSSRuleProcessor::nsCSSRuleProcessor(const nsCOMArray<nsICSSStyleSheet>& aSheets)
|
||||
: mSheets(aSheets),
|
||||
mRuleCascades(nsnull)
|
||||
{
|
||||
for (PRInt32 i = mSheets.Count() - 1; i >= 0; --i)
|
||||
mSheets[i]->AddRuleProcessor(this);
|
||||
}
|
||||
|
||||
static PRBool
|
||||
DropProcessorReference(nsISupports* aSheet, void* aProcessor)
|
||||
nsCSSRuleProcessor::~nsCSSRuleProcessor(void)
|
||||
{
|
||||
nsICSSStyleSheet* sheet = (nsICSSStyleSheet*)aSheet;
|
||||
nsICSSStyleRuleProcessor* processor = (nsICSSStyleRuleProcessor*)aProcessor;
|
||||
sheet->DropRuleProcessorReference(processor);
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
CSSRuleProcessor::~CSSRuleProcessor(void)
|
||||
{
|
||||
if (mSheets) {
|
||||
mSheets->EnumerateForwards(DropProcessorReference, this);
|
||||
NS_RELEASE(mSheets);
|
||||
}
|
||||
for (PRInt32 i = mSheets.Count() - 1; i >= 0; --i)
|
||||
mSheets[i]->DropRuleProcessor(this);
|
||||
mSheets.Clear();
|
||||
ClearRuleCascades();
|
||||
}
|
||||
|
||||
NS_IMPL_ADDREF(CSSRuleProcessor)
|
||||
NS_IMPL_RELEASE(CSSRuleProcessor)
|
||||
|
||||
nsresult
|
||||
CSSRuleProcessor::QueryInterface(REFNSIID aIID, void** aInstancePtrResult)
|
||||
{
|
||||
if (NULL == aInstancePtrResult) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
if (aIID.Equals(NS_GET_IID(nsICSSStyleRuleProcessor))) {
|
||||
*aInstancePtrResult = (void*)this;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
if (aIID.Equals(NS_GET_IID(nsIStyleRuleProcessor))) {
|
||||
*aInstancePtrResult = (void*)this;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
*aInstancePtrResult = (void*)this;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSRuleProcessor::AppendStyleSheet(nsICSSStyleSheet* aStyleSheet)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
if (! mSheets) {
|
||||
result = NS_NewISupportsArray(&mSheets);
|
||||
}
|
||||
if (mSheets) {
|
||||
mSheets->AppendElement(aStyleSheet);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
NS_IMPL_ISUPPORTS1(nsCSSRuleProcessor, nsIStyleRuleProcessor)
|
||||
|
||||
MOZ_DECL_CTOR_COUNTER(RuleProcessorData)
|
||||
|
||||
@ -3869,8 +3756,8 @@ static void ContentEnumFunc(nsICSSStyleRule* aRule, nsCSSSelector* aSelector,
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSRuleProcessor::RulesMatching(ElementRuleProcessorData *aData,
|
||||
nsIAtom* aMedium)
|
||||
nsCSSRuleProcessor::RulesMatching(ElementRuleProcessorData *aData,
|
||||
nsIAtom* aMedium)
|
||||
{
|
||||
NS_PRECONDITION(aData->mContent->IsContentOfType(nsIContent::eELEMENT),
|
||||
"content must be element");
|
||||
@ -3939,8 +3826,8 @@ static void PseudoEnumFunc(nsICSSStyleRule* aRule, nsCSSSelector* aSelector,
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSRuleProcessor::RulesMatching(PseudoRuleProcessorData* aData,
|
||||
nsIAtom* aMedium)
|
||||
nsCSSRuleProcessor::RulesMatching(PseudoRuleProcessorData* aData,
|
||||
nsIAtom* aMedium)
|
||||
{
|
||||
NS_PRECONDITION(!aData->mContent ||
|
||||
aData->mContent->IsContentOfType(nsIContent::eELEMENT),
|
||||
@ -3987,9 +3874,9 @@ PR_STATIC_CALLBACK(PRBool) StateEnumFunc(void* aSelector, void* aData)
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSRuleProcessor::HasStateDependentStyle(StateRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult)
|
||||
nsCSSRuleProcessor::HasStateDependentStyle(StateRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult)
|
||||
{
|
||||
NS_PRECONDITION(aData->mContent->IsContentOfType(nsIContent::eELEMENT),
|
||||
"content must be element");
|
||||
@ -4038,9 +3925,9 @@ PR_STATIC_CALLBACK(PRBool) AttributeEnumFunc(void* aSelector, void* aData)
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSRuleProcessor::HasAttributeDependentStyle(AttributeRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult)
|
||||
nsCSSRuleProcessor::HasAttributeDependentStyle(AttributeRuleProcessorData* aData,
|
||||
nsIAtom* aMedium,
|
||||
nsReStyleHint* aResult)
|
||||
{
|
||||
NS_PRECONDITION(aData->mContent->IsContentOfType(nsIContent::eELEMENT),
|
||||
"content must be element");
|
||||
@ -4087,7 +3974,7 @@ CSSRuleProcessor::HasAttributeDependentStyle(AttributeRuleProcessorData* aData,
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSRuleProcessor::ClearRuleCascades(void)
|
||||
nsCSSRuleProcessor::ClearRuleCascades(void)
|
||||
{
|
||||
RuleCascadeData *data = mRuleCascades;
|
||||
mRuleCascades = nsnull;
|
||||
@ -4229,19 +4116,18 @@ InsertRuleByWeight(nsISupports* aRule, void* aData)
|
||||
}
|
||||
|
||||
|
||||
PRBool
|
||||
CSSRuleProcessor::CascadeSheetRulesInto(nsISupports* aSheet, void* aData)
|
||||
static PRBool
|
||||
CascadeSheetRulesInto(nsICSSStyleSheet* aSheet, void* aData)
|
||||
{
|
||||
nsICSSStyleSheet* iSheet = (nsICSSStyleSheet*)aSheet;
|
||||
CSSStyleSheetImpl* sheet = (CSSStyleSheetImpl*)iSheet;
|
||||
CascadeEnumData* data = (CascadeEnumData*)aData;
|
||||
CSSStyleSheetImpl* sheet = NS_STATIC_CAST(CSSStyleSheetImpl*, aSheet);
|
||||
CascadeEnumData* data = NS_STATIC_CAST(CascadeEnumData*, aData);
|
||||
PRBool bSheetApplicable = PR_TRUE;
|
||||
sheet->GetApplicable(bSheetApplicable);
|
||||
|
||||
if (bSheetApplicable && sheet->UseForMedium(data->mMedium)) {
|
||||
CSSStyleSheetImpl* child = sheet->mFirstChild;
|
||||
CSSStyleSheetImpl* child = sheet->mFirstChild;
|
||||
while (child) {
|
||||
CascadeSheetRulesInto((nsICSSStyleSheet*)child, data);
|
||||
CascadeSheetRulesInto(child, data);
|
||||
child = child->mNext;
|
||||
}
|
||||
|
||||
@ -4311,7 +4197,8 @@ static void PutRulesInList(nsObjectHashtable* aRuleArrays,
|
||||
}
|
||||
|
||||
RuleCascadeData*
|
||||
CSSRuleProcessor::GetRuleCascade(nsIPresContext* aPresContext, nsIAtom* aMedium)
|
||||
nsCSSRuleProcessor::GetRuleCascade(nsIPresContext* aPresContext,
|
||||
nsIAtom* aMedium)
|
||||
{
|
||||
RuleCascadeData **cascadep = &mRuleCascades;
|
||||
RuleCascadeData *cascade;
|
||||
@ -4321,15 +4208,17 @@ CSSRuleProcessor::GetRuleCascade(nsIPresContext* aPresContext, nsIAtom* aMedium)
|
||||
cascadep = &cascade->mNext;
|
||||
}
|
||||
|
||||
if (mSheets) {
|
||||
if (mSheets.Count() != 0) {
|
||||
cascade = new RuleCascadeData(aMedium,
|
||||
eCompatibility_NavQuirks == aPresContext->CompatibilityMode());
|
||||
if (cascade) {
|
||||
CascadeEnumData data(aMedium, cascade->mRuleHash.Arena());
|
||||
mSheets->EnumerateForwards(CascadeSheetRulesInto, &data);
|
||||
mSheets.EnumerateForwards(CascadeSheetRulesInto, &data);
|
||||
nsVoidArray weightedRules;
|
||||
PutRulesInList(&data.mRuleArrays, &weightedRules);
|
||||
|
||||
// Put things into the rule hash backwards because it's easier to
|
||||
// build a singly linked list lowest-first that way.
|
||||
if (!weightedRules.EnumerateBackwards(AddRule, cascade)) {
|
||||
delete cascade;
|
||||
cascade = nsnull;
|
||||
|
@ -367,9 +367,6 @@ public:
|
||||
NS_IMETHOD GetOwningDocument(nsIDocument*& aDocument) const;
|
||||
NS_IMETHOD SetOwningDocument(nsIDocument* aDocument);
|
||||
|
||||
NS_IMETHOD GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor,
|
||||
nsIStyleRuleProcessor* aPrevProcessor);
|
||||
|
||||
// nsIStyleRuleProcessor api
|
||||
NS_IMETHOD RulesMatching(ElementRuleProcessorData* aData,
|
||||
nsIAtom* aMedium);
|
||||
@ -434,15 +431,6 @@ NS_IMPL_ISUPPORTS3(HTMLCSSStyleSheetImpl,
|
||||
nsIStyleSheet,
|
||||
nsIStyleRuleProcessor)
|
||||
|
||||
NS_IMETHODIMP
|
||||
HTMLCSSStyleSheetImpl::GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor,
|
||||
nsIStyleRuleProcessor* /*aPrevProcessor*/)
|
||||
{
|
||||
aProcessor = this;
|
||||
NS_ADDREF(aProcessor);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
HTMLCSSStyleSheetImpl::RulesMatching(ElementRuleProcessorData* aData,
|
||||
nsIAtom* aMedium)
|
||||
|
@ -499,15 +499,6 @@ nsHTMLStyleSheet::~nsHTMLStyleSheet()
|
||||
|
||||
NS_IMPL_ISUPPORTS2(nsHTMLStyleSheet, nsIStyleSheet, nsIStyleRuleProcessor)
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsHTMLStyleSheet::GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor,
|
||||
nsIStyleRuleProcessor* /*aPrevProcessor*/)
|
||||
{
|
||||
aProcessor = this;
|
||||
NS_ADDREF(aProcessor);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
static nsresult GetBodyColor(nsIPresContext* aPresContext, nscolor* aColor)
|
||||
{
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
|
@ -68,8 +68,6 @@ public:
|
||||
NS_IMETHOD GetParentSheet(nsIStyleSheet*& aParent) const; // will be null
|
||||
NS_IMETHOD GetOwningDocument(nsIDocument*& aDocument) const;
|
||||
NS_IMETHOD SetOwningDocument(nsIDocument* aDocumemt);
|
||||
NS_IMETHOD GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor,
|
||||
nsIStyleRuleProcessor* aPrevProcessor);
|
||||
#ifdef DEBUG
|
||||
virtual void List(FILE* out = stdout, PRInt32 aIndent = 0) const;
|
||||
#endif
|
||||
|
@ -43,14 +43,15 @@
|
||||
class nsICSSRule;
|
||||
class nsIDOMNode;
|
||||
class nsINameSpace;
|
||||
class nsICSSStyleRuleProcessor;
|
||||
class nsCSSRuleProcessor;
|
||||
class nsIMediaList;
|
||||
class nsICSSGroupRule;
|
||||
class nsICSSImportRule;
|
||||
|
||||
// IID for the nsICSSStyleSheet interface {8f83b0f0-b21a-11d1-8031-006008159b5a}
|
||||
// IID for the nsICSSStyleSheet interface
|
||||
// d148e93e-7f1d-4f95-853f-ac356eba3d70
|
||||
#define NS_ICSS_STYLE_SHEET_IID \
|
||||
{0x8f83b0f0, 0xb21a, 0x11d1, {0x80, 0x31, 0x00, 0x60, 0x08, 0x15, 0x9b, 0x5a}}
|
||||
{0xd148e93e, 0x7f1d, 0x4f95, {0x85, 0x3f, 0xac, 0x35, 0x6e, 0xba, 0x3d, 0x70}}
|
||||
|
||||
class nsICSSStyleSheet : public nsIStyleSheet {
|
||||
public:
|
||||
@ -101,7 +102,8 @@ public:
|
||||
NS_IMETHOD IsModified(PRBool* aModified) const = 0; // returns the mDirty status of the sheet
|
||||
NS_IMETHOD SetModified(PRBool aModified) = 0;
|
||||
|
||||
NS_IMETHOD DropRuleProcessorReference(nsICSSStyleRuleProcessor* aProcessor) = 0;
|
||||
NS_IMETHOD AddRuleProcessor(nsCSSRuleProcessor* aProcessor) = 0;
|
||||
NS_IMETHOD DropRuleProcessor(nsCSSRuleProcessor* aProcessor) = 0;
|
||||
};
|
||||
|
||||
// XXX for backwards compatibility and convenience
|
||||
|
@ -50,10 +50,19 @@ class nsIContent;
|
||||
class nsIDocument;
|
||||
class nsIStyleRuleProcessor;
|
||||
|
||||
// IID for the nsIStyleSheet interface {8c4a80a0-ad6a-11d1-8031-006008159b5a}
|
||||
// IID for the nsIStyleSheet interface
|
||||
// 6fbfb2cb-a1c0-4576-9354-a4af4e0029ad
|
||||
#define NS_ISTYLE_SHEET_IID \
|
||||
{0x8c4a80a0, 0xad6a, 0x11d1, {0x80, 0x31, 0x00, 0x60, 0x08, 0x15, 0x9b, 0x5a}}
|
||||
{0x6fbfb2cb, 0xa1c0, 0x4576, {0x93, 0x54, 0xa4, 0xaf, 0x4e, 0x00, 0x29, 0xad}}
|
||||
|
||||
/**
|
||||
* A style sheet is a thing associated with a document that has style
|
||||
* rules. Those style rules can be reached in one of two ways, depending
|
||||
* on which level of the nsStyleSet it is in:
|
||||
* 1) It can be |QueryInterface|d to nsIStyleRuleProcessor
|
||||
* 2) It can be |QueryInterface|d to nsICSSStyleSheet, with which the
|
||||
* |nsStyleSet| uses an |nsCSSRuleProcessor| to access the rules.
|
||||
*/
|
||||
class nsIStyleSheet : public nsISupports {
|
||||
public:
|
||||
NS_DEFINE_STATIC_IID_ACCESSOR(NS_ISTYLE_SHEET_IID)
|
||||
@ -93,10 +102,6 @@ public:
|
||||
NS_IMETHOD GetOwningDocument(nsIDocument*& aDocument) const = 0; // may be null
|
||||
NS_IMETHOD SetOwningDocument(nsIDocument* aDocument) = 0;
|
||||
|
||||
// style rule processor access
|
||||
NS_IMETHOD GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor,
|
||||
nsIStyleRuleProcessor* aPrevProcessor) = 0;
|
||||
|
||||
#ifdef DEBUG
|
||||
virtual void List(FILE* out = stdout, PRInt32 aIndent = 0) const = 0;
|
||||
#endif
|
||||
|
@ -45,6 +45,7 @@
|
||||
#include "nsICSSStyleRule.h"
|
||||
#include "nsCSSAnonBoxes.h"
|
||||
#include "nsCSSPseudoElements.h"
|
||||
#include "nsCSSRuleProcessor.h"
|
||||
#include "nsIContent.h"
|
||||
#include "nsIFrame.h"
|
||||
|
||||
@ -90,42 +91,33 @@ nsStyleSet::Init(nsIPresContext *aPresContext)
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
struct RuleProcessorEnumData {
|
||||
RuleProcessorEnumData(nsCOMArray<nsIStyleRuleProcessor> *aRuleProcessors)
|
||||
: mRuleProcessors(aRuleProcessors),
|
||||
mPrevProcessor(nsnull)
|
||||
{}
|
||||
|
||||
nsCOMArray<nsIStyleRuleProcessor>* mRuleProcessors;
|
||||
nsIStyleRuleProcessor* mPrevProcessor;
|
||||
};
|
||||
|
||||
static PRBool
|
||||
EnumRuleProcessor(nsIStyleSheet *aSheet, void* aData)
|
||||
{
|
||||
RuleProcessorEnumData* data = (RuleProcessorEnumData*)aData;
|
||||
|
||||
nsCOMPtr<nsIStyleRuleProcessor> processor;
|
||||
nsresult result = aSheet->GetStyleRuleProcessor(*getter_AddRefs(processor),
|
||||
data->mPrevProcessor);
|
||||
if (NS_SUCCEEDED(result) && processor) {
|
||||
if (processor != data->mPrevProcessor) {
|
||||
if (!data->mRuleProcessors->AppendObject(processor))
|
||||
return PR_FALSE;
|
||||
data->mPrevProcessor = processor; // ref is held by array
|
||||
}
|
||||
}
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsStyleSet::GatherRuleProcessors(PRInt32 aType)
|
||||
nsStyleSet::GatherRuleProcessors(sheetType aType)
|
||||
{
|
||||
mRuleProcessors[aType].Clear();
|
||||
mRuleProcessors[aType] = nsnull;
|
||||
if (mSheets[aType].Count()) {
|
||||
RuleProcessorEnumData data(&mRuleProcessors[aType]);
|
||||
if (!mSheets[aType].EnumerateBackwards(EnumRuleProcessor, &data))
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
switch (aType) {
|
||||
case eAgentSheet:
|
||||
case eUserSheet:
|
||||
case eDocSheet:
|
||||
case eOverrideSheet: {
|
||||
// levels containing CSS stylesheets
|
||||
nsCOMArray<nsIStyleSheet>& sheets = mSheets[aType];
|
||||
nsCOMArray<nsICSSStyleSheet> cssSheets(sheets.Count());
|
||||
for (PRInt32 i = 0, i_end = sheets.Count(); i < i_end; ++i) {
|
||||
nsCOMPtr<nsICSSStyleSheet> cssSheet = do_QueryInterface(sheets[i]);
|
||||
NS_ASSERTION(cssSheet, "not a CSS sheet");
|
||||
cssSheets.AppendObject(cssSheet);
|
||||
}
|
||||
mRuleProcessors[aType] = new nsCSSRuleProcessor(cssSheets);
|
||||
} break;
|
||||
|
||||
default:
|
||||
// levels containing non-CSS stylesheets
|
||||
NS_ASSERTION(mSheets[aType].Count() == 1, "only one sheet per level");
|
||||
mRuleProcessors[aType] = do_QueryInterface(mSheets[aType][0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
@ -217,23 +209,18 @@ nsStyleSet::AddDocStyleSheet(nsIStyleSheet* aSheet, nsIDocument* aDocument)
|
||||
nsCOMArray<nsIStyleSheet>& docSheets = mSheets[eDocSheet];
|
||||
|
||||
docSheets.RemoveObject(aSheet);
|
||||
// lowest index last
|
||||
// lowest index first
|
||||
PRInt32 newDocIndex = aDocument->GetIndexOfStyleSheet(aSheet);
|
||||
PRInt32 count = docSheets.Count();
|
||||
for (PRInt32 index = 0; index < count; index++) {
|
||||
PRInt32 index;
|
||||
for (index = 0; index < count; index++) {
|
||||
nsIStyleSheet* sheet = docSheets.ObjectAt(index);
|
||||
PRInt32 sheetDocIndex = aDocument->GetIndexOfStyleSheet(sheet);
|
||||
if (sheetDocIndex < newDocIndex) {
|
||||
if (!docSheets.InsertObjectAt(aSheet, index))
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
index = count; // break loop
|
||||
}
|
||||
}
|
||||
if (docSheets.Count() == count) { // didn't insert it
|
||||
if (!docSheets.AppendObject(aSheet))
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
if (sheetDocIndex > newDocIndex)
|
||||
break;
|
||||
}
|
||||
if (!docSheets.InsertObjectAt(aSheet, index))
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
if (!mBatching)
|
||||
return GatherRuleProcessors(eDocSheet);
|
||||
|
||||
@ -261,7 +248,7 @@ nsStyleSet::EndUpdate()
|
||||
|
||||
for (int i = 0; i < eSheetTypeCount; ++i) {
|
||||
if (mDirty & (1 << i)) {
|
||||
nsresult rv = GatherRuleProcessors(i);
|
||||
nsresult rv = GatherRuleProcessors(sheetType(i));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
}
|
||||
@ -302,12 +289,11 @@ nsStyleSet::EnableQuirkStyleSheet(PRBool aEnable)
|
||||
NS_ASSERTION(mQuirkStyleSheet, "no quirk stylesheet");
|
||||
if (mQuirkStyleSheet) {
|
||||
#ifdef DEBUG_dbaron_off // XXX Make this |DEBUG| once it stops firing.
|
||||
PRInt32 count = mRuleProcessors[eAgentSheet].Count()
|
||||
PRBool applicableNow;
|
||||
mQuirkStyleSheet->GetApplicable(applicableNow);
|
||||
NS_ASSERTION(count == 0 || aEnable == applicableNow,
|
||||
NS_ASSERTION(!mRuleProcessors[eAgentSheet] || aEnable == applicableNow,
|
||||
"enabling/disabling quirk stylesheet too late or incomplete quirk stylesheet");
|
||||
if (count != 0 && aEnable == applicableNow)
|
||||
if (mRuleProcessors[eAgentSheet] && aEnable == applicableNow)
|
||||
printf("WARNING: We set the quirks mode too many times.\n"); // we do!
|
||||
#endif
|
||||
mQuirkStyleSheet->SetEnabled(aEnable);
|
||||
@ -442,47 +428,36 @@ nsStyleSet::FileRules(nsIStyleRuleProcessor::EnumFunc aCollectorFunc,
|
||||
SheetCount(eHTMLPresHintSheet) == 0,
|
||||
"Can't have both types of preshint sheets at once!");
|
||||
|
||||
nsRuleNode* lastAgentRN = nsnull;
|
||||
if (mRuleProcessors[eAgentSheet].Count()) {
|
||||
mRuleProcessors[eAgentSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastAgentRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
if (mRuleProcessors[eAgentSheet])
|
||||
(*aCollectorFunc)(mRuleProcessors[eAgentSheet], aData);
|
||||
nsRuleNode* lastAgentRN = mRuleWalker->GetCurrentNode();
|
||||
|
||||
nsRuleNode* lastPresHintRN = lastAgentRN;
|
||||
if (mRuleProcessors[ePresHintSheet].Count()) {
|
||||
mRuleProcessors[ePresHintSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastPresHintRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
if (mRuleProcessors[ePresHintSheet])
|
||||
(*aCollectorFunc)(mRuleProcessors[ePresHintSheet], aData);
|
||||
nsRuleNode* lastPresHintRN = mRuleWalker->GetCurrentNode();
|
||||
|
||||
nsRuleNode* lastUserRN = lastPresHintRN;
|
||||
if (mRuleProcessors[eUserSheet].Count()) {
|
||||
mRuleProcessors[eUserSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastUserRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
if (mRuleProcessors[eUserSheet])
|
||||
(*aCollectorFunc)(mRuleProcessors[eUserSheet], aData);
|
||||
nsRuleNode* lastUserRN = mRuleWalker->GetCurrentNode();
|
||||
|
||||
nsRuleNode* lastHTMLPresHintRN = lastUserRN;
|
||||
if (mRuleProcessors[eHTMLPresHintSheet].Count()) {
|
||||
mRuleProcessors[eHTMLPresHintSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastHTMLPresHintRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
if (mRuleProcessors[eHTMLPresHintSheet])
|
||||
(*aCollectorFunc)(mRuleProcessors[eHTMLPresHintSheet], aData);
|
||||
nsRuleNode* lastHTMLPresHintRN = mRuleWalker->GetCurrentNode();
|
||||
|
||||
nsRuleNode* lastDocRN = lastHTMLPresHintRN;
|
||||
PRBool useRuleProcessors = PR_TRUE;
|
||||
if (mStyleRuleSupplier) {
|
||||
// We can supply additional document-level sheets that should be walked.
|
||||
mStyleRuleSupplier->WalkRules(this, aCollectorFunc, aData);
|
||||
mStyleRuleSupplier->UseDocumentRules(aData->mContent, &useRuleProcessors);
|
||||
}
|
||||
if (useRuleProcessors && mRuleProcessors[eDocSheet].Count()) {
|
||||
mRuleProcessors[eDocSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
}
|
||||
lastDocRN = mRuleWalker->GetCurrentNode();
|
||||
if (useRuleProcessors && mRuleProcessors[eDocSheet]) // NOTE: different
|
||||
(*aCollectorFunc)(mRuleProcessors[eDocSheet], aData);
|
||||
if (mRuleProcessors[eStyleAttrSheet])
|
||||
(*aCollectorFunc)(mRuleProcessors[eStyleAttrSheet], aData);
|
||||
|
||||
nsRuleNode* lastOvrRN = lastDocRN;
|
||||
if (mRuleProcessors[eOverrideSheet].Count()) {
|
||||
mRuleProcessors[eOverrideSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastOvrRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
if (mRuleProcessors[eOverrideSheet])
|
||||
(*aCollectorFunc)(mRuleProcessors[eOverrideSheet], aData);
|
||||
nsRuleNode* lastOvrRN = mRuleWalker->GetCurrentNode();
|
||||
|
||||
// There should be no important rules in the preshint or HTMLpreshint level
|
||||
AddImportantRules(lastOvrRN, lastHTMLPresHintRN); // doc and override
|
||||
@ -509,17 +484,14 @@ nsStyleSet::WalkRuleProcessors(nsIStyleRuleProcessor::EnumFunc aFunc,
|
||||
SheetCount(eHTMLPresHintSheet) == 0,
|
||||
"Can't have both types of preshint sheets at once!");
|
||||
|
||||
// Walk the agent rules first.
|
||||
mRuleProcessors[eAgentSheet].EnumerateForwards(aFunc, aData);
|
||||
|
||||
// Walk preshint rules.
|
||||
mRuleProcessors[ePresHintSheet].EnumerateForwards(aFunc, aData);
|
||||
|
||||
// Walk the user rules next.
|
||||
mRuleProcessors[eUserSheet].EnumerateForwards(aFunc, aData);
|
||||
|
||||
// Walk HTML preshint rules.
|
||||
mRuleProcessors[eHTMLPresHintSheet].EnumerateForwards(aFunc, aData);
|
||||
if (mRuleProcessors[eAgentSheet])
|
||||
(*aFunc)(mRuleProcessors[eAgentSheet], aData);
|
||||
if (mRuleProcessors[ePresHintSheet])
|
||||
(*aFunc)(mRuleProcessors[ePresHintSheet], aData);
|
||||
if (mRuleProcessors[eUserSheet])
|
||||
(*aFunc)(mRuleProcessors[eUserSheet], aData);
|
||||
if (mRuleProcessors[eHTMLPresHintSheet])
|
||||
(*aFunc)(mRuleProcessors[eHTMLPresHintSheet], aData);
|
||||
|
||||
PRBool useRuleProcessors = PR_TRUE;
|
||||
if (mStyleRuleSupplier) {
|
||||
@ -527,13 +499,12 @@ nsStyleSet::WalkRuleProcessors(nsIStyleRuleProcessor::EnumFunc aFunc,
|
||||
mStyleRuleSupplier->WalkRules(this, aFunc, aData);
|
||||
mStyleRuleSupplier->UseDocumentRules(aData->mContent, &useRuleProcessors);
|
||||
}
|
||||
|
||||
// Now walk the doc rules.
|
||||
if (useRuleProcessors)
|
||||
mRuleProcessors[eDocSheet].EnumerateForwards(aFunc, aData);
|
||||
|
||||
// Walk the override rules last.
|
||||
mRuleProcessors[eOverrideSheet].EnumerateForwards(aFunc, aData);
|
||||
if (useRuleProcessors && mRuleProcessors[eDocSheet]) // NOTE: different
|
||||
(*aFunc)(mRuleProcessors[eDocSheet], aData);
|
||||
if (mRuleProcessors[eStyleAttrSheet])
|
||||
(*aFunc)(mRuleProcessors[eStyleAttrSheet], aData);
|
||||
if (mRuleProcessors[eOverrideSheet])
|
||||
(*aFunc)(mRuleProcessors[eOverrideSheet], aData);
|
||||
}
|
||||
|
||||
PRBool nsStyleSet::BuildDefaultStyleData(nsIPresContext* aPresContext)
|
||||
@ -581,12 +552,13 @@ nsStyleSet::ResolveStyleFor(nsIContent* aContent,
|
||||
"content must be element");
|
||||
|
||||
if (aContent && presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
if (mRuleProcessors[eAgentSheet] ||
|
||||
mRuleProcessors[ePresHintSheet] ||
|
||||
mRuleProcessors[eUserSheet] ||
|
||||
mRuleProcessors[eHTMLPresHintSheet] ||
|
||||
mRuleProcessors[eDocSheet] ||
|
||||
mRuleProcessors[eStyleAttrSheet] ||
|
||||
mRuleProcessors[eOverrideSheet]) {
|
||||
RulesMatchingData data(presContext, aContent, mRuleWalker);
|
||||
FileRules(EnumRulesMatching, &data);
|
||||
result = GetContext(presContext, aParentContext, nsnull).get();
|
||||
@ -606,12 +578,13 @@ nsStyleSet::ResolveStyleForNonElement(nsStyleContext* aParentContext)
|
||||
nsIPresContext *presContext = PresContext();
|
||||
|
||||
if (presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
if (mRuleProcessors[eAgentSheet] ||
|
||||
mRuleProcessors[ePresHintSheet] ||
|
||||
mRuleProcessors[eUserSheet] ||
|
||||
mRuleProcessors[eHTMLPresHintSheet] ||
|
||||
mRuleProcessors[eDocSheet] ||
|
||||
mRuleProcessors[eStyleAttrSheet] ||
|
||||
mRuleProcessors[eOverrideSheet]) {
|
||||
result = GetContext(presContext, aParentContext,
|
||||
nsCSSAnonBoxes::mozNonElement).get();
|
||||
NS_ASSERTION(mRuleWalker->AtRoot(), "rule walker must be at root");
|
||||
@ -660,12 +633,13 @@ nsStyleSet::ResolvePseudoStyleFor(nsIContent* aParentContent,
|
||||
"content (if non-null) must be element");
|
||||
|
||||
if (aPseudoTag && presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
if (mRuleProcessors[eAgentSheet] ||
|
||||
mRuleProcessors[ePresHintSheet] ||
|
||||
mRuleProcessors[eUserSheet] ||
|
||||
mRuleProcessors[eHTMLPresHintSheet] ||
|
||||
mRuleProcessors[eDocSheet] ||
|
||||
mRuleProcessors[eStyleAttrSheet] ||
|
||||
mRuleProcessors[eOverrideSheet]) {
|
||||
PseudoRulesMatchingData data(presContext, aParentContent, aPseudoTag,
|
||||
aComparator, mRuleWalker);
|
||||
FileRules(EnumPseudoRulesMatching, &data);
|
||||
@ -694,12 +668,13 @@ nsStyleSet::ProbePseudoStyleFor(nsIContent* aParentContent,
|
||||
"content (if non-null) must be element");
|
||||
|
||||
if (aPseudoTag && presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
if (mRuleProcessors[eAgentSheet] ||
|
||||
mRuleProcessors[ePresHintSheet] ||
|
||||
mRuleProcessors[eUserSheet] ||
|
||||
mRuleProcessors[eHTMLPresHintSheet] ||
|
||||
mRuleProcessors[eDocSheet] ||
|
||||
mRuleProcessors[eStyleAttrSheet] ||
|
||||
mRuleProcessors[eOverrideSheet]) {
|
||||
PseudoRulesMatchingData data(presContext, aParentContent, aPseudoTag,
|
||||
nsnull, mRuleWalker);
|
||||
FileRules(EnumPseudoRulesMatching, &data);
|
||||
@ -853,12 +828,13 @@ nsStyleSet::HasStateDependentStyle(nsIPresContext* aPresContext,
|
||||
nsReStyleHint result = nsReStyleHint(0);
|
||||
|
||||
if (aContent->IsContentOfType(nsIContent::eELEMENT) &&
|
||||
(mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count())) {
|
||||
(mRuleProcessors[eAgentSheet] ||
|
||||
mRuleProcessors[ePresHintSheet] ||
|
||||
mRuleProcessors[eUserSheet] ||
|
||||
mRuleProcessors[eHTMLPresHintSheet] ||
|
||||
mRuleProcessors[eDocSheet] ||
|
||||
mRuleProcessors[eStyleAttrSheet] ||
|
||||
mRuleProcessors[eOverrideSheet])) {
|
||||
StatefulData data(aPresContext, aContent, aStateMask);
|
||||
WalkRuleProcessors(SheetHasStatefulStyle, &data);
|
||||
result = data.mHint;
|
||||
@ -898,12 +874,13 @@ nsStyleSet::HasAttributeDependentStyle(nsIPresContext* aPresContext,
|
||||
nsReStyleHint result = nsReStyleHint(0);
|
||||
|
||||
if (aContent->IsContentOfType(nsIContent::eELEMENT) &&
|
||||
(mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count())) {
|
||||
(mRuleProcessors[eAgentSheet] ||
|
||||
mRuleProcessors[ePresHintSheet] ||
|
||||
mRuleProcessors[eUserSheet] ||
|
||||
mRuleProcessors[eHTMLPresHintSheet] ||
|
||||
mRuleProcessors[eDocSheet] ||
|
||||
mRuleProcessors[eStyleAttrSheet] ||
|
||||
mRuleProcessors[eOverrideSheet])) {
|
||||
AttributeData data(aPresContext, aContent, aAttribute, aModType);
|
||||
WalkRuleProcessors(SheetHasAttributeStyle, &data);
|
||||
result = data.mHint;
|
||||
|
@ -153,13 +153,16 @@ class nsStyleSet
|
||||
// APIs to manipulate the style sheet lists.
|
||||
// All sheet types are ordered most-significant-first.
|
||||
enum sheetType {
|
||||
eAgentSheet,
|
||||
eAgentSheet, // CSS
|
||||
ePresHintSheet,
|
||||
eUserSheet,
|
||||
eUserSheet, // CSS
|
||||
eHTMLPresHintSheet,
|
||||
eDocSheet,
|
||||
eOverrideSheet,
|
||||
eDocSheet, // CSS
|
||||
eStyleAttrSheet,
|
||||
eOverrideSheet, // CSS
|
||||
eSheetTypeCount
|
||||
// be sure to keep the number of bits in |mDirty| below updated when
|
||||
// changing the number of sheet types
|
||||
};
|
||||
|
||||
nsresult AppendStyleSheet(sheetType aType, nsIStyleSheet *aSheet);
|
||||
@ -190,7 +193,7 @@ class nsStyleSet
|
||||
PRBool BuildDefaultStyleData(nsIPresContext* aPresContext);
|
||||
|
||||
// Update the rule processor list after a change to the style sheet list.
|
||||
nsresult GatherRuleProcessors(PRInt32 aType);
|
||||
nsresult GatherRuleProcessors(sheetType aType);
|
||||
|
||||
void AddImportantRules(nsRuleNode* aCurrLevelNode,
|
||||
nsRuleNode* aLastPrevLevelNode);
|
||||
@ -229,7 +232,7 @@ class nsStyleSet
|
||||
|
||||
nsCOMArray<nsIStyleSheet> mSheets[eSheetTypeCount];
|
||||
|
||||
nsCOMArray<nsIStyleRuleProcessor> mRuleProcessors[eSheetTypeCount];
|
||||
nsCOMPtr<nsIStyleRuleProcessor> mRuleProcessors[eSheetTypeCount];
|
||||
|
||||
// cached instance for enabling/disabling
|
||||
nsCOMPtr<nsIStyleSheet> mQuirkStyleSheet;
|
||||
|
@ -1449,13 +1449,13 @@ nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow)
|
||||
nsCOMArray<nsIStyleSheet> oldSheets;
|
||||
nsCOMArray<nsIStyleSheet> newSheets;
|
||||
|
||||
PRInt32 count = document->GetNumberOfStyleSheets(PR_FALSE);
|
||||
PRInt32 count = document->GetNumberOfStyleSheets();
|
||||
|
||||
// Iterate over the style sheets.
|
||||
PRInt32 i;
|
||||
for (i = 0; i < count; i++) {
|
||||
// Get the style sheet
|
||||
nsIStyleSheet *styleSheet = document->GetStyleSheetAt(i, PR_FALSE);
|
||||
nsIStyleSheet *styleSheet = document->GetStyleSheetAt(i);
|
||||
|
||||
if (!oldSheets.AppendObject(styleSheet)) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
Loading…
x
Reference in New Issue
Block a user