diff --git a/mozilla/content/base/src/nsDocument.cpp b/mozilla/content/base/src/nsDocument.cpp index 9c05db55352..98eba614468 100644 --- a/mozilla/content/base/src/nsDocument.cpp +++ b/mozilla/content/base/src/nsDocument.cpp @@ -80,7 +80,6 @@ #include "nsIScrollableView.h" #include "nsIPresShell.h" #include "nsIPresContext.h" -#include "nsStyleSet.h" #include "nsContentUtils.h" #include "nsNodeInfoManager.h" #include "nsIXBLService.h" @@ -758,6 +757,8 @@ nsresult nsDocument::ResetStylesheetsToURI(nsIURI* aURI) { NS_PRECONDITION(aURI, "Null URI passed to ResetStylesheetsToURI"); + + mozAutoDocUpdate(this, UPDATE_STYLE, PR_TRUE); // The stylesheets should forget us PRInt32 indx = mStyleSheets.Count(); @@ -781,15 +782,34 @@ nsDocument::ResetStylesheetsToURI(nsIURI* aURI) // already set their owning document to null in the loop above, but // we'll reset it when we call AddStyleSheet on them. nsresult rv; + nsStyleSet::sheetType attrSheetType = GetAttrSheetType(); if (mAttrStyleSheet) { + // 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(attrSheetType, mAttrStyleSheet); + } rv = mAttrStyleSheet->Reset(aURI); } else { rv = NS_NewHTMLStyleSheet(getter_AddRefs(mAttrStyleSheet), aURI, this); } NS_ENSURE_SUCCESS(rv, rv); - - AddStyleSheet(mAttrStyleSheet, 0); + // Add mAttrStyleSheet to all the style sets. Prepend it, since it should be + // the most significant sheet in its level (whether UA or preshint). + PRInt32 count = mPresShells.Count(); + for (indx = 0; indx < count; ++indx) { + NS_STATIC_CAST(nsIPresShell*, mPresShells.ElementAt(indx))->StyleSet()-> + PrependStyleSheet(attrSheetType, mAttrStyleSheet); + } + NS_ENSURE_SUCCESS(rv, rv); + + // 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) { rv = mStyleAttrStyleSheet->Reset(aURI); } else { @@ -803,6 +823,12 @@ nsDocument::ResetStylesheetsToURI(nsIURI* aURI) return rv; } +nsStyleSet::sheetType +nsDocument::GetAttrSheetType() +{ + return nsStyleSet::eAgentSheet; +} + nsresult nsDocument::StartDocumentLoad(const char* aCommand, nsIChannel* aChannel, nsILoadGroup* aLoadGroup, diff --git a/mozilla/content/base/src/nsDocument.h b/mozilla/content/base/src/nsDocument.h index bcff4b5bf5e..f666ed24ef4 100644 --- a/mozilla/content/base/src/nsDocument.h +++ b/mozilla/content/base/src/nsDocument.h @@ -83,6 +83,8 @@ #include "nsHTMLStyleSheet.h" #include "nsIHTMLCSSStyleSheet.h" +#include "nsStyleSet.h" + #include "pldhash.h" @@ -100,7 +102,6 @@ class nsIDTD; class nsXPathDocumentTearoff; class nsIRadioVisitor; class nsIFormControl; -class nsStyleSet; struct nsRadioGroupStruct; @@ -511,6 +512,7 @@ protected: nsIPresShell** aInstancePtrResult); nsresult ResetStylesheetsToURI(nsIURI* aURI); + virtual nsStyleSet::sheetType GetAttrSheetType(); nsresult CreateElement(nsINodeInfo *aNodeInfo, nsIDOMElement** aResult); diff --git a/mozilla/content/base/src/nsStyleSet.cpp b/mozilla/content/base/src/nsStyleSet.cpp index 6484cef4133..7de859757fd 100644 --- a/mozilla/content/base/src/nsStyleSet.cpp +++ b/mozilla/content/base/src/nsStyleSet.cpp @@ -416,7 +416,13 @@ nsStyleSet::FileRules(nsIStyleRuleProcessor::EnumFunc aCollectorFunc, lastUserRN = mRuleWalker->GetCurrentNode(); } - nsRuleNode* lastDocRN = lastUserRN; + nsRuleNode* lastPresHintRN = lastUserRN; + if (mRuleProcessors[ePresHintSheet].Count()) { + mRuleProcessors[ePresHintSheet].EnumerateForwards(aCollectorFunc, aData); + lastPresHintRN = mRuleWalker->GetCurrentNode(); + } + + nsRuleNode* lastDocRN = lastPresHintRN; PRBool useRuleProcessors = PR_TRUE; if (mStyleRuleSupplier) { // We can supply additional document-level sheets that should be walked. @@ -436,6 +442,7 @@ nsStyleSet::FileRules(nsIStyleRuleProcessor::EnumFunc aCollectorFunc, AddImportantRules(lastDocRN, lastUserRN); //doc AddImportantRules(lastOvrRN, lastDocRN); //ovr + // There should be no imporant rules in the preshint level AddImportantRules(lastUserRN, lastAgentRN); //user AddImportantRules(lastAgentRN, nsnull); //agent @@ -453,6 +460,9 @@ nsStyleSet::WalkRuleProcessors(nsIStyleRuleProcessor::EnumFunc aFunc, // Walk the user rules next. mRuleProcessors[eUserSheet].EnumerateForwards(aFunc, aData); + // Walk preshint rules. + mRuleProcessors[ePresHintSheet].EnumerateForwards(aFunc, aData); + PRBool useRuleProcessors = PR_TRUE; if (mStyleRuleSupplier) { // We can supply additional document-level sheets that should be walked. @@ -513,9 +523,10 @@ nsStyleSet::ResolveStyleFor(nsIContent* aContent, "content must be element"); if (aContent && presContext) { - if (mRuleProcessors[eAgentSheet].Count() || - mRuleProcessors[eUserSheet].Count() || - mRuleProcessors[eDocSheet].Count() || + if (mRuleProcessors[eAgentSheet].Count() || + mRuleProcessors[eUserSheet].Count() || + mRuleProcessors[ePresHintSheet].Count() || + mRuleProcessors[eDocSheet].Count() || mRuleProcessors[eOverrideSheet].Count()) { RulesMatchingData data(presContext, aContent, mRuleWalker); FileRules(EnumRulesMatching, &data); @@ -536,9 +547,10 @@ nsStyleSet::ResolveStyleForNonElement(nsStyleContext* aParentContext) nsIPresContext *presContext = PresContext(); if (presContext) { - if (mRuleProcessors[eAgentSheet].Count() || - mRuleProcessors[eUserSheet].Count() || - mRuleProcessors[eDocSheet].Count() || + if (mRuleProcessors[eAgentSheet].Count() || + mRuleProcessors[eUserSheet].Count() || + mRuleProcessors[ePresHintSheet].Count() || + mRuleProcessors[eDocSheet].Count() || mRuleProcessors[eOverrideSheet].Count()) { result = GetContext(presContext, aParentContext, nsCSSAnonBoxes::mozNonElement).get(); @@ -588,9 +600,10 @@ nsStyleSet::ResolvePseudoStyleFor(nsIContent* aParentContent, "content (if non-null) must be element"); if (aPseudoTag && presContext) { - if (mRuleProcessors[eAgentSheet].Count() || - mRuleProcessors[eUserSheet].Count() || - mRuleProcessors[eDocSheet].Count() || + if (mRuleProcessors[eAgentSheet].Count() || + mRuleProcessors[eUserSheet].Count() || + mRuleProcessors[ePresHintSheet].Count() || + mRuleProcessors[eDocSheet].Count() || mRuleProcessors[eOverrideSheet].Count()) { PseudoRulesMatchingData data(presContext, aParentContent, aPseudoTag, aComparator, mRuleWalker); @@ -620,9 +633,10 @@ nsStyleSet::ProbePseudoStyleFor(nsIContent* aParentContent, "content (if non-null) must be element"); if (aPseudoTag && presContext) { - if (mRuleProcessors[eAgentSheet].Count() || - mRuleProcessors[eUserSheet].Count() || - mRuleProcessors[eDocSheet].Count() || + if (mRuleProcessors[eAgentSheet].Count() || + mRuleProcessors[eUserSheet].Count() || + mRuleProcessors[ePresHintSheet].Count() || + mRuleProcessors[eDocSheet].Count() || mRuleProcessors[eOverrideSheet].Count()) { PseudoRulesMatchingData data(presContext, aParentContent, aPseudoTag, nsnull, mRuleWalker); @@ -777,9 +791,10 @@ nsStyleSet::HasStateDependentStyle(nsIPresContext* aPresContext, nsReStyleHint result = nsReStyleHint(0); if (aContent->IsContentOfType(nsIContent::eELEMENT) && - (mRuleProcessors[eAgentSheet].Count() || - mRuleProcessors[eUserSheet].Count() || - mRuleProcessors[eDocSheet].Count() || + (mRuleProcessors[eAgentSheet].Count() || + mRuleProcessors[eUserSheet].Count() || + mRuleProcessors[ePresHintSheet].Count() || + mRuleProcessors[eDocSheet].Count() || mRuleProcessors[eOverrideSheet].Count())) { StatefulData data(aPresContext, aContent, aStateMask); WalkRuleProcessors(SheetHasStatefulStyle, &data); @@ -820,9 +835,10 @@ nsStyleSet::HasAttributeDependentStyle(nsIPresContext* aPresContext, nsReStyleHint result = nsReStyleHint(0); if (aContent->IsContentOfType(nsIContent::eELEMENT) && - (mRuleProcessors[eAgentSheet].Count() || - mRuleProcessors[eUserSheet].Count() || - mRuleProcessors[eDocSheet].Count() || + (mRuleProcessors[eAgentSheet].Count() || + mRuleProcessors[eUserSheet].Count() || + mRuleProcessors[ePresHintSheet].Count() || + mRuleProcessors[eDocSheet].Count() || mRuleProcessors[eOverrideSheet].Count())) { AttributeData data(aPresContext, aContent, aAttribute, aModType); WalkRuleProcessors(SheetHasAttributeStyle, &data); diff --git a/mozilla/content/base/src/nsStyleSet.h b/mozilla/content/base/src/nsStyleSet.h index e9c6f67ff3c..2548da5d535 100644 --- a/mozilla/content/base/src/nsStyleSet.h +++ b/mozilla/content/base/src/nsStyleSet.h @@ -155,6 +155,7 @@ class nsStyleSet enum sheetType { eAgentSheet, eUserSheet, + ePresHintSheet, eDocSheet, eOverrideSheet, eSheetTypeCount diff --git a/mozilla/content/html/document/src/nsHTMLDocument.cpp b/mozilla/content/html/document/src/nsHTMLDocument.cpp index 72db4487aa0..20ae270c0cd 100644 --- a/mozilla/content/html/document/src/nsHTMLDocument.cpp +++ b/mozilla/content/html/document/src/nsHTMLDocument.cpp @@ -392,6 +392,15 @@ nsHTMLDocument::ResetToURI(nsIURI *aURI, nsILoadGroup *aLoadGroup) mContentType = "text/html"; } +nsStyleSet::sheetType +nsHTMLDocument::GetAttrSheetType() +{ + if (IsXHTML()) { + return nsDocument::GetAttrSheetType(); + } + + return nsStyleSet::ePresHintSheet; +} nsresult nsHTMLDocument::CreateShell(nsIPresContext* aContext, diff --git a/mozilla/content/html/document/src/nsHTMLDocument.h b/mozilla/content/html/document/src/nsHTMLDocument.h index 106ef922324..7afc447573e 100644 --- a/mozilla/content/html/document/src/nsHTMLDocument.h +++ b/mozilla/content/html/document/src/nsHTMLDocument.h @@ -85,6 +85,7 @@ public: virtual void Reset(nsIChannel* aChannel, nsILoadGroup* aLoadGroup); virtual void ResetToURI(nsIURI* aURI, nsILoadGroup* aLoadGroup); + virtual nsStyleSet::sheetType GetAttrSheetType(); virtual nsresult CreateShell(nsIPresContext* aContext, nsIViewManager* aViewManager, diff --git a/mozilla/content/xml/document/src/Makefile.in b/mozilla/content/xml/document/src/Makefile.in index f5591829c8e..fe6e774baf1 100644 --- a/mozilla/content/xml/document/src/Makefile.in +++ b/mozilla/content/xml/document/src/Makefile.in @@ -67,6 +67,7 @@ REQUIRES = xpcom \ mimetype \ unicharutil \ windowwatcher \ + locale \ $(NULL) CPPSRCS = \ diff --git a/mozilla/layout/style/nsStyleSet.cpp b/mozilla/layout/style/nsStyleSet.cpp index 6484cef4133..7de859757fd 100644 --- a/mozilla/layout/style/nsStyleSet.cpp +++ b/mozilla/layout/style/nsStyleSet.cpp @@ -416,7 +416,13 @@ nsStyleSet::FileRules(nsIStyleRuleProcessor::EnumFunc aCollectorFunc, lastUserRN = mRuleWalker->GetCurrentNode(); } - nsRuleNode* lastDocRN = lastUserRN; + nsRuleNode* lastPresHintRN = lastUserRN; + if (mRuleProcessors[ePresHintSheet].Count()) { + mRuleProcessors[ePresHintSheet].EnumerateForwards(aCollectorFunc, aData); + lastPresHintRN = mRuleWalker->GetCurrentNode(); + } + + nsRuleNode* lastDocRN = lastPresHintRN; PRBool useRuleProcessors = PR_TRUE; if (mStyleRuleSupplier) { // We can supply additional document-level sheets that should be walked. @@ -436,6 +442,7 @@ nsStyleSet::FileRules(nsIStyleRuleProcessor::EnumFunc aCollectorFunc, AddImportantRules(lastDocRN, lastUserRN); //doc AddImportantRules(lastOvrRN, lastDocRN); //ovr + // There should be no imporant rules in the preshint level AddImportantRules(lastUserRN, lastAgentRN); //user AddImportantRules(lastAgentRN, nsnull); //agent @@ -453,6 +460,9 @@ nsStyleSet::WalkRuleProcessors(nsIStyleRuleProcessor::EnumFunc aFunc, // Walk the user rules next. mRuleProcessors[eUserSheet].EnumerateForwards(aFunc, aData); + // Walk preshint rules. + mRuleProcessors[ePresHintSheet].EnumerateForwards(aFunc, aData); + PRBool useRuleProcessors = PR_TRUE; if (mStyleRuleSupplier) { // We can supply additional document-level sheets that should be walked. @@ -513,9 +523,10 @@ nsStyleSet::ResolveStyleFor(nsIContent* aContent, "content must be element"); if (aContent && presContext) { - if (mRuleProcessors[eAgentSheet].Count() || - mRuleProcessors[eUserSheet].Count() || - mRuleProcessors[eDocSheet].Count() || + if (mRuleProcessors[eAgentSheet].Count() || + mRuleProcessors[eUserSheet].Count() || + mRuleProcessors[ePresHintSheet].Count() || + mRuleProcessors[eDocSheet].Count() || mRuleProcessors[eOverrideSheet].Count()) { RulesMatchingData data(presContext, aContent, mRuleWalker); FileRules(EnumRulesMatching, &data); @@ -536,9 +547,10 @@ nsStyleSet::ResolveStyleForNonElement(nsStyleContext* aParentContext) nsIPresContext *presContext = PresContext(); if (presContext) { - if (mRuleProcessors[eAgentSheet].Count() || - mRuleProcessors[eUserSheet].Count() || - mRuleProcessors[eDocSheet].Count() || + if (mRuleProcessors[eAgentSheet].Count() || + mRuleProcessors[eUserSheet].Count() || + mRuleProcessors[ePresHintSheet].Count() || + mRuleProcessors[eDocSheet].Count() || mRuleProcessors[eOverrideSheet].Count()) { result = GetContext(presContext, aParentContext, nsCSSAnonBoxes::mozNonElement).get(); @@ -588,9 +600,10 @@ nsStyleSet::ResolvePseudoStyleFor(nsIContent* aParentContent, "content (if non-null) must be element"); if (aPseudoTag && presContext) { - if (mRuleProcessors[eAgentSheet].Count() || - mRuleProcessors[eUserSheet].Count() || - mRuleProcessors[eDocSheet].Count() || + if (mRuleProcessors[eAgentSheet].Count() || + mRuleProcessors[eUserSheet].Count() || + mRuleProcessors[ePresHintSheet].Count() || + mRuleProcessors[eDocSheet].Count() || mRuleProcessors[eOverrideSheet].Count()) { PseudoRulesMatchingData data(presContext, aParentContent, aPseudoTag, aComparator, mRuleWalker); @@ -620,9 +633,10 @@ nsStyleSet::ProbePseudoStyleFor(nsIContent* aParentContent, "content (if non-null) must be element"); if (aPseudoTag && presContext) { - if (mRuleProcessors[eAgentSheet].Count() || - mRuleProcessors[eUserSheet].Count() || - mRuleProcessors[eDocSheet].Count() || + if (mRuleProcessors[eAgentSheet].Count() || + mRuleProcessors[eUserSheet].Count() || + mRuleProcessors[ePresHintSheet].Count() || + mRuleProcessors[eDocSheet].Count() || mRuleProcessors[eOverrideSheet].Count()) { PseudoRulesMatchingData data(presContext, aParentContent, aPseudoTag, nsnull, mRuleWalker); @@ -777,9 +791,10 @@ nsStyleSet::HasStateDependentStyle(nsIPresContext* aPresContext, nsReStyleHint result = nsReStyleHint(0); if (aContent->IsContentOfType(nsIContent::eELEMENT) && - (mRuleProcessors[eAgentSheet].Count() || - mRuleProcessors[eUserSheet].Count() || - mRuleProcessors[eDocSheet].Count() || + (mRuleProcessors[eAgentSheet].Count() || + mRuleProcessors[eUserSheet].Count() || + mRuleProcessors[ePresHintSheet].Count() || + mRuleProcessors[eDocSheet].Count() || mRuleProcessors[eOverrideSheet].Count())) { StatefulData data(aPresContext, aContent, aStateMask); WalkRuleProcessors(SheetHasStatefulStyle, &data); @@ -820,9 +835,10 @@ nsStyleSet::HasAttributeDependentStyle(nsIPresContext* aPresContext, nsReStyleHint result = nsReStyleHint(0); if (aContent->IsContentOfType(nsIContent::eELEMENT) && - (mRuleProcessors[eAgentSheet].Count() || - mRuleProcessors[eUserSheet].Count() || - mRuleProcessors[eDocSheet].Count() || + (mRuleProcessors[eAgentSheet].Count() || + mRuleProcessors[eUserSheet].Count() || + mRuleProcessors[ePresHintSheet].Count() || + mRuleProcessors[eDocSheet].Count() || mRuleProcessors[eOverrideSheet].Count())) { AttributeData data(aPresContext, aContent, aAttribute, aModType); WalkRuleProcessors(SheetHasAttributeStyle, &data); diff --git a/mozilla/layout/style/nsStyleSet.h b/mozilla/layout/style/nsStyleSet.h index e9c6f67ff3c..2548da5d535 100644 --- a/mozilla/layout/style/nsStyleSet.h +++ b/mozilla/layout/style/nsStyleSet.h @@ -155,6 +155,7 @@ class nsStyleSet enum sheetType { eAgentSheet, eUserSheet, + ePresHintSheet, eDocSheet, eOverrideSheet, eSheetTypeCount