mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-03-02 22:37:50 +00:00
Fix preshints in anonymous content some more (by moving all document sheet
styleset munging out of the document viewer and into the document and splitting out the preshint levels completely from the other CSS levels). Bug 234861, r+sr=dbaron
This commit is contained in:
parent
3ece6a2483
commit
89005ed71c
@ -817,15 +817,6 @@ nsDocument::ResetStylesheetsToURI(nsIURI* aURI)
|
||||
}
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// 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);
|
||||
@ -839,7 +830,17 @@ nsDocument::ResetStylesheetsToURI(nsIURI* aURI)
|
||||
}
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
AddStyleSheet(mStyleAttrStyleSheet, 0);
|
||||
// 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
|
||||
PRInt32 count = mPresShells.Count();
|
||||
for (indx = 0; indx < count; ++indx) {
|
||||
FillStyleSet(NS_STATIC_CAST(nsIPresShell*,
|
||||
mPresShells.ElementAt(indx))->StyleSet());
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
@ -847,7 +848,40 @@ nsDocument::ResetStylesheetsToURI(nsIURI* aURI)
|
||||
nsStyleSet::sheetType
|
||||
nsDocument::GetAttrSheetType()
|
||||
{
|
||||
return nsStyleSet::eAgentSheet;
|
||||
return nsStyleSet::ePresHintSheet;
|
||||
}
|
||||
|
||||
void
|
||||
nsDocument::FillStyleSet(nsStyleSet* aStyleSet)
|
||||
{
|
||||
NS_PRECONDITION(aStyleSet, "Must have a style set");
|
||||
NS_PRECONDITION(aStyleSet->SheetCount(nsStyleSet::ePresHintSheet) == 0,
|
||||
"Style set already has a preshint sheet?");
|
||||
NS_PRECONDITION(aStyleSet->SheetCount(nsStyleSet::eHTMLPresHintSheet) == 0,
|
||||
"Style set already has a HTML preshint sheet?");
|
||||
NS_PRECONDITION(aStyleSet->SheetCount(nsStyleSet::eDocSheet) == 0,
|
||||
"Style set already has document 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);
|
||||
|
||||
// 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);
|
||||
sheet->GetApplicable(sheetApplicable);
|
||||
if (sheetApplicable) {
|
||||
aStyleSet->AddDocStyleSheet(sheet, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
nsresult
|
||||
@ -1207,6 +1241,10 @@ nsDocument::doCreateShell(nsIPresContext* aContext,
|
||||
nsCompatibility aCompatMode,
|
||||
nsIPresShell** aInstancePtrResult)
|
||||
{
|
||||
*aInstancePtrResult = nsnull;
|
||||
|
||||
FillStyleSet(aStyleSet);
|
||||
|
||||
nsCOMPtr<nsIPresShell> shell;
|
||||
nsresult rv = NS_NewPresShell(getter_AddRefs(shell));
|
||||
if (NS_FAILED(rv)) {
|
||||
@ -1218,8 +1256,7 @@ nsDocument::doCreateShell(nsIPresContext* aContext,
|
||||
|
||||
// Note: we don't hold a ref to the shell (it holds a ref to us)
|
||||
mPresShells.AppendElement(shell);
|
||||
*aInstancePtrResult = shell.get();
|
||||
NS_ADDREF(*aInstancePtrResult);
|
||||
shell.swap(*aInstancePtrResult);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -524,6 +524,7 @@ protected:
|
||||
|
||||
nsresult ResetStylesheetsToURI(nsIURI* aURI);
|
||||
virtual nsStyleSet::sheetType GetAttrSheetType();
|
||||
void FillStyleSet(nsStyleSet* aStyleSet);
|
||||
|
||||
nsresult CreateElement(nsIAtom *aName, nsIAtom *aPrefix,
|
||||
PRInt32 aNamespaceID, PRInt32 aElementType,
|
||||
|
@ -647,6 +647,9 @@ DocumentViewerImpl::InitPresentationStuff(PRBool aDoInitialReflow)
|
||||
return rv;
|
||||
}
|
||||
|
||||
// We're done creating the style set
|
||||
styleSet->EndUpdate();
|
||||
|
||||
if (aDoInitialReflow) {
|
||||
// Since InitialReflow() will create frames for *all* items
|
||||
// that are currently in the document tree, we need to flush
|
||||
@ -1317,6 +1320,9 @@ DocumentViewerImpl::SetDOMDocument(nsIDOMDocument *aDocument)
|
||||
return rv;
|
||||
}
|
||||
|
||||
// We're done creating the style set
|
||||
styleSet->EndUpdate();
|
||||
|
||||
// The pres shell owns the style set now.
|
||||
|
||||
mPresShell->BeginObservingDocument();
|
||||
@ -1730,27 +1736,11 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
PRInt32 index = aDocument->GetNumberOfStyleSheets(PR_TRUE);
|
||||
|
||||
styleSet->BeginUpdate();
|
||||
|
||||
while (0 < index--) {
|
||||
nsIStyleSheet *sheet = aDocument->GetStyleSheetAt(index, PR_TRUE);
|
||||
|
||||
/*
|
||||
* GetStyleSheetAt will return all style sheets in the document but
|
||||
* we're only interested in the ones that are enabled.
|
||||
*/
|
||||
|
||||
PRBool styleApplicable;
|
||||
sheet->GetApplicable(styleApplicable);
|
||||
|
||||
if (styleApplicable) {
|
||||
styleSet->AddDocStyleSheet(sheet, aDocument);
|
||||
}
|
||||
}
|
||||
|
||||
// Now handle the user sheets.
|
||||
|
||||
// The document will fill in the document sheets when we create the presshell
|
||||
|
||||
// Handle the user sheets.
|
||||
nsCOMPtr<nsIDocShellTreeItem> docShell(do_QueryInterface(mContainer));
|
||||
PRInt32 shellType;
|
||||
docShell->GetItemType(&shellType);
|
||||
@ -1818,7 +1808,7 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
|
||||
styleSet->AppendStyleSheet(nsStyleSet::eAgentSheet, mUAStyleSheet);
|
||||
}
|
||||
|
||||
styleSet->EndUpdate();
|
||||
// Caller will handle calling EndUpdate, per contract.
|
||||
*aStyleSet = styleSet;
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -71,6 +71,9 @@ public:
|
||||
|
||||
virtual PRBool GetIsCreatingPrintPreview() = 0;
|
||||
|
||||
// The style set returned by CreateStyleSet is in the middle of an
|
||||
// update batch so that the caller can add sheets to it if needed.
|
||||
// Callers should call EndUpdate() on it when ready to use.
|
||||
virtual nsresult CreateStyleSet(nsIDocument* aDocument, nsStyleSet** aStyleSet) = 0;
|
||||
|
||||
virtual nsresult GetDocumentSelection(nsISelection **aSelection,
|
||||
|
@ -2624,6 +2624,8 @@ nsPrintEngine::ReflowPrintObject(nsPrintObject * aPO, PRBool aDoCalcShrink)
|
||||
return rv;
|
||||
}
|
||||
|
||||
aPO->mStyleSet->EndUpdate();
|
||||
|
||||
// The pres shell now owns the style set object.
|
||||
|
||||
PRInt32 pageWidth, pageHeight;
|
||||
|
@ -386,43 +386,87 @@ nsStyleSet::AddImportantRules(nsRuleNode* aCurrLevelNode,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
void
|
||||
nsStyleSet::AssertNoImportantRules(nsRuleNode* aCurrLevelNode,
|
||||
nsRuleNode* aLastPrevLevelNode)
|
||||
{
|
||||
if (!aCurrLevelNode || aCurrLevelNode == aLastPrevLevelNode)
|
||||
return;
|
||||
|
||||
AssertNoImportantRules(aCurrLevelNode->GetParent(), aLastPrevLevelNode);
|
||||
|
||||
nsIStyleRule *rule = aCurrLevelNode->GetRule();
|
||||
nsCOMPtr<nsICSSStyleRule> cssRule(do_QueryInterface(rule));
|
||||
if (cssRule) {
|
||||
nsCOMPtr<nsIStyleRule> impRule = cssRule->GetImportantRule();
|
||||
NS_ASSERTION(!impRule, "Unexpected important rule");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nsStyleSet::AssertNoCSSRules(nsRuleNode* aCurrLevelNode,
|
||||
nsRuleNode* aLastPrevLevelNode)
|
||||
{
|
||||
if (!aCurrLevelNode || aCurrLevelNode == aLastPrevLevelNode)
|
||||
return;
|
||||
|
||||
AssertNoImportantRules(aCurrLevelNode->GetParent(), aLastPrevLevelNode);
|
||||
|
||||
nsIStyleRule *rule = aCurrLevelNode->GetRule();
|
||||
nsCOMPtr<nsICSSStyleRule> cssRule(do_QueryInterface(rule));
|
||||
NS_ASSERTION(!cssRule, "Unexpected CSS rule");
|
||||
}
|
||||
#endif
|
||||
|
||||
// Enumerate the rules in a way that cares about the order of the rules.
|
||||
void
|
||||
nsStyleSet::FileRules(nsIStyleRuleProcessor::EnumFunc aCollectorFunc,
|
||||
RuleProcessorData* aData)
|
||||
{
|
||||
|
||||
// Cascading order:
|
||||
// [least important]
|
||||
// 1. UA normal rules = Agent normal
|
||||
// 2. User normal rules = User normal
|
||||
// 3. Author normal rules = Document normal
|
||||
// 4. Override normal rules = Override normal
|
||||
// 5. Author !important rules = Document !important
|
||||
// 6. Override !important rules = Override !important
|
||||
// 7. User !important rules = User !important
|
||||
// 8. UA !important rules = Agent !important
|
||||
// 1. UA normal rules = Agent normal
|
||||
// 2. Presentation hints = PresHint normal
|
||||
// 3. User normal rules = User normal
|
||||
// 2. HTML Presentation hints = HTMLPresHint normal
|
||||
// 5. Author normal rules = Document normal
|
||||
// 6. Override normal rules = Override normal
|
||||
// 7. Author !important rules = Document !important
|
||||
// 8. Override !important rules = Override !important
|
||||
// 9. User !important rules = User !important
|
||||
// 10. UA !important rules = Agent !important
|
||||
// [most important]
|
||||
|
||||
NS_PRECONDITION(SheetCount(ePresHintSheet) == 0 ||
|
||||
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();
|
||||
}
|
||||
|
||||
nsRuleNode* lastUserRN = lastAgentRN;
|
||||
if (mRuleProcessors[eUserSheet].Count()) {
|
||||
mRuleProcessors[eUserSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastUserRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
|
||||
nsRuleNode* lastPresHintRN = lastUserRN;
|
||||
nsRuleNode* lastPresHintRN = lastAgentRN;
|
||||
if (mRuleProcessors[ePresHintSheet].Count()) {
|
||||
mRuleProcessors[ePresHintSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastPresHintRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
|
||||
nsRuleNode* lastDocRN = lastPresHintRN;
|
||||
nsRuleNode* lastUserRN = lastPresHintRN;
|
||||
if (mRuleProcessors[eUserSheet].Count()) {
|
||||
mRuleProcessors[eUserSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastUserRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
|
||||
nsRuleNode* lastHTMLPresHintRN = lastUserRN;
|
||||
if (mRuleProcessors[eHTMLPresHintSheet].Count()) {
|
||||
mRuleProcessors[eHTMLPresHintSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastHTMLPresHintRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
|
||||
nsRuleNode* lastDocRN = lastHTMLPresHintRN;
|
||||
PRBool useRuleProcessors = PR_TRUE;
|
||||
if (mStyleRuleSupplier) {
|
||||
// We can supply additional document-level sheets that should be walked.
|
||||
@ -440,10 +484,17 @@ nsStyleSet::FileRules(nsIStyleRuleProcessor::EnumFunc aCollectorFunc,
|
||||
lastOvrRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
|
||||
AddImportantRules(lastDocRN, lastUserRN); //doc
|
||||
AddImportantRules(lastOvrRN, lastDocRN); //ovr
|
||||
// There should be no imporant rules in the preshint level
|
||||
AddImportantRules(lastUserRN, lastAgentRN); //user
|
||||
// There should be no important rules in the preshint or HTMLpreshint level
|
||||
AddImportantRules(lastOvrRN, lastHTMLPresHintRN); // doc and override
|
||||
#ifdef DEBUG
|
||||
AssertNoCSSRules(lastHTMLPresHintRN, lastUserRN);
|
||||
AssertNoImportantRules(lastHTMLPresHintRN, lastUserRN); // HTML preshints
|
||||
#endif
|
||||
AddImportantRules(lastUserRN, lastPresHintRN); //user
|
||||
#ifdef DEBUG
|
||||
AssertNoCSSRules(lastPresHintRN, lastAgentRN);
|
||||
AssertNoImportantRules(lastPresHintRN, lastAgentRN); // preshints
|
||||
#endif
|
||||
AddImportantRules(lastAgentRN, nsnull); //agent
|
||||
|
||||
}
|
||||
@ -454,14 +505,21 @@ void
|
||||
nsStyleSet::WalkRuleProcessors(nsIStyleRuleProcessor::EnumFunc aFunc,
|
||||
RuleProcessorData* aData)
|
||||
{
|
||||
NS_PRECONDITION(SheetCount(ePresHintSheet) == 0 ||
|
||||
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 preshint rules.
|
||||
mRuleProcessors[ePresHintSheet].EnumerateForwards(aFunc, aData);
|
||||
// Walk HTML preshint rules.
|
||||
mRuleProcessors[eHTMLPresHintSheet].EnumerateForwards(aFunc, aData);
|
||||
|
||||
PRBool useRuleProcessors = PR_TRUE;
|
||||
if (mStyleRuleSupplier) {
|
||||
@ -523,10 +581,11 @@ nsStyleSet::ResolveStyleFor(nsIContent* aContent,
|
||||
"content must be element");
|
||||
|
||||
if (aContent && presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
RulesMatchingData data(presContext, aContent, mRuleWalker);
|
||||
FileRules(EnumRulesMatching, &data);
|
||||
@ -547,10 +606,11 @@ nsStyleSet::ResolveStyleForNonElement(nsStyleContext* aParentContext)
|
||||
nsIPresContext *presContext = PresContext();
|
||||
|
||||
if (presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
result = GetContext(presContext, aParentContext,
|
||||
nsCSSAnonBoxes::mozNonElement).get();
|
||||
@ -600,10 +660,11 @@ nsStyleSet::ResolvePseudoStyleFor(nsIContent* aParentContent,
|
||||
"content (if non-null) must be element");
|
||||
|
||||
if (aPseudoTag && presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
PseudoRulesMatchingData data(presContext, aParentContent, aPseudoTag,
|
||||
aComparator, mRuleWalker);
|
||||
@ -633,10 +694,11 @@ nsStyleSet::ProbePseudoStyleFor(nsIContent* aParentContent,
|
||||
"content (if non-null) must be element");
|
||||
|
||||
if (aPseudoTag && presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
PseudoRulesMatchingData data(presContext, aParentContent, aPseudoTag,
|
||||
nsnull, mRuleWalker);
|
||||
@ -791,10 +853,11 @@ nsStyleSet::HasStateDependentStyle(nsIPresContext* aPresContext,
|
||||
nsReStyleHint result = nsReStyleHint(0);
|
||||
|
||||
if (aContent->IsContentOfType(nsIContent::eELEMENT) &&
|
||||
(mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
(mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count())) {
|
||||
StatefulData data(aPresContext, aContent, aStateMask);
|
||||
WalkRuleProcessors(SheetHasStatefulStyle, &data);
|
||||
@ -835,10 +898,11 @@ nsStyleSet::HasAttributeDependentStyle(nsIPresContext* aPresContext,
|
||||
nsReStyleHint result = nsReStyleHint(0);
|
||||
|
||||
if (aContent->IsContentOfType(nsIContent::eELEMENT) &&
|
||||
(mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
(mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count())) {
|
||||
AttributeData data(aPresContext, aContent, aAttribute, aModType);
|
||||
WalkRuleProcessors(SheetHasAttributeStyle, &data);
|
||||
|
@ -154,8 +154,9 @@ class nsStyleSet
|
||||
// All sheet types are ordered most-significant-first.
|
||||
enum sheetType {
|
||||
eAgentSheet,
|
||||
eUserSheet,
|
||||
ePresHintSheet,
|
||||
eUserSheet,
|
||||
eHTMLPresHintSheet,
|
||||
eDocSheet,
|
||||
eOverrideSheet,
|
||||
eSheetTypeCount
|
||||
@ -194,6 +195,20 @@ class nsStyleSet
|
||||
void AddImportantRules(nsRuleNode* aCurrLevelNode,
|
||||
nsRuleNode* aLastPrevLevelNode);
|
||||
|
||||
#ifdef DEBUG
|
||||
// Just like AddImportantRules except it doesn't actually add anything; it
|
||||
// just asserts that there are no important rules between aCurrLevelNode and
|
||||
// aLastPrevLevelNode.
|
||||
void AssertNoImportantRules(nsRuleNode* aCurrLevelNode,
|
||||
nsRuleNode* aLastPrevLevelNode);
|
||||
|
||||
// Just like AddImportantRules except it doesn't actually add anything; it
|
||||
// just asserts that there are no CSS rules between aCurrLevelNode and
|
||||
// aLastPrevLevelNode. Mostly useful for the preshint levels.
|
||||
void AssertNoCSSRules(nsRuleNode* aCurrLevelNode,
|
||||
nsRuleNode* aLastPrevLevelNode);
|
||||
#endif
|
||||
|
||||
// Enumerate the rules in a way that cares about the order of the
|
||||
// rules.
|
||||
void FileRules(nsIStyleRuleProcessor::EnumFunc aCollectorFunc,
|
||||
|
@ -404,7 +404,7 @@ nsHTMLDocument::GetAttrSheetType()
|
||||
return nsDocument::GetAttrSheetType();
|
||||
}
|
||||
|
||||
return nsStyleSet::ePresHintSheet;
|
||||
return nsStyleSet::eHTMLPresHintSheet;
|
||||
}
|
||||
|
||||
nsresult
|
||||
|
@ -647,6 +647,9 @@ DocumentViewerImpl::InitPresentationStuff(PRBool aDoInitialReflow)
|
||||
return rv;
|
||||
}
|
||||
|
||||
// We're done creating the style set
|
||||
styleSet->EndUpdate();
|
||||
|
||||
if (aDoInitialReflow) {
|
||||
// Since InitialReflow() will create frames for *all* items
|
||||
// that are currently in the document tree, we need to flush
|
||||
@ -1317,6 +1320,9 @@ DocumentViewerImpl::SetDOMDocument(nsIDOMDocument *aDocument)
|
||||
return rv;
|
||||
}
|
||||
|
||||
// We're done creating the style set
|
||||
styleSet->EndUpdate();
|
||||
|
||||
// The pres shell owns the style set now.
|
||||
|
||||
mPresShell->BeginObservingDocument();
|
||||
@ -1730,27 +1736,11 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
PRInt32 index = aDocument->GetNumberOfStyleSheets(PR_TRUE);
|
||||
|
||||
styleSet->BeginUpdate();
|
||||
|
||||
while (0 < index--) {
|
||||
nsIStyleSheet *sheet = aDocument->GetStyleSheetAt(index, PR_TRUE);
|
||||
|
||||
/*
|
||||
* GetStyleSheetAt will return all style sheets in the document but
|
||||
* we're only interested in the ones that are enabled.
|
||||
*/
|
||||
|
||||
PRBool styleApplicable;
|
||||
sheet->GetApplicable(styleApplicable);
|
||||
|
||||
if (styleApplicable) {
|
||||
styleSet->AddDocStyleSheet(sheet, aDocument);
|
||||
}
|
||||
}
|
||||
|
||||
// Now handle the user sheets.
|
||||
|
||||
// The document will fill in the document sheets when we create the presshell
|
||||
|
||||
// Handle the user sheets.
|
||||
nsCOMPtr<nsIDocShellTreeItem> docShell(do_QueryInterface(mContainer));
|
||||
PRInt32 shellType;
|
||||
docShell->GetItemType(&shellType);
|
||||
@ -1818,7 +1808,7 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
|
||||
styleSet->AppendStyleSheet(nsStyleSet::eAgentSheet, mUAStyleSheet);
|
||||
}
|
||||
|
||||
styleSet->EndUpdate();
|
||||
// Caller will handle calling EndUpdate, per contract.
|
||||
*aStyleSet = styleSet;
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -71,6 +71,9 @@ public:
|
||||
|
||||
virtual PRBool GetIsCreatingPrintPreview() = 0;
|
||||
|
||||
// The style set returned by CreateStyleSet is in the middle of an
|
||||
// update batch so that the caller can add sheets to it if needed.
|
||||
// Callers should call EndUpdate() on it when ready to use.
|
||||
virtual nsresult CreateStyleSet(nsIDocument* aDocument, nsStyleSet** aStyleSet) = 0;
|
||||
|
||||
virtual nsresult GetDocumentSelection(nsISelection **aSelection,
|
||||
|
@ -2624,6 +2624,8 @@ nsPrintEngine::ReflowPrintObject(nsPrintObject * aPO, PRBool aDoCalcShrink)
|
||||
return rv;
|
||||
}
|
||||
|
||||
aPO->mStyleSet->EndUpdate();
|
||||
|
||||
// The pres shell now owns the style set object.
|
||||
|
||||
PRInt32 pageWidth, pageHeight;
|
||||
|
@ -386,43 +386,87 @@ nsStyleSet::AddImportantRules(nsRuleNode* aCurrLevelNode,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
void
|
||||
nsStyleSet::AssertNoImportantRules(nsRuleNode* aCurrLevelNode,
|
||||
nsRuleNode* aLastPrevLevelNode)
|
||||
{
|
||||
if (!aCurrLevelNode || aCurrLevelNode == aLastPrevLevelNode)
|
||||
return;
|
||||
|
||||
AssertNoImportantRules(aCurrLevelNode->GetParent(), aLastPrevLevelNode);
|
||||
|
||||
nsIStyleRule *rule = aCurrLevelNode->GetRule();
|
||||
nsCOMPtr<nsICSSStyleRule> cssRule(do_QueryInterface(rule));
|
||||
if (cssRule) {
|
||||
nsCOMPtr<nsIStyleRule> impRule = cssRule->GetImportantRule();
|
||||
NS_ASSERTION(!impRule, "Unexpected important rule");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nsStyleSet::AssertNoCSSRules(nsRuleNode* aCurrLevelNode,
|
||||
nsRuleNode* aLastPrevLevelNode)
|
||||
{
|
||||
if (!aCurrLevelNode || aCurrLevelNode == aLastPrevLevelNode)
|
||||
return;
|
||||
|
||||
AssertNoImportantRules(aCurrLevelNode->GetParent(), aLastPrevLevelNode);
|
||||
|
||||
nsIStyleRule *rule = aCurrLevelNode->GetRule();
|
||||
nsCOMPtr<nsICSSStyleRule> cssRule(do_QueryInterface(rule));
|
||||
NS_ASSERTION(!cssRule, "Unexpected CSS rule");
|
||||
}
|
||||
#endif
|
||||
|
||||
// Enumerate the rules in a way that cares about the order of the rules.
|
||||
void
|
||||
nsStyleSet::FileRules(nsIStyleRuleProcessor::EnumFunc aCollectorFunc,
|
||||
RuleProcessorData* aData)
|
||||
{
|
||||
|
||||
// Cascading order:
|
||||
// [least important]
|
||||
// 1. UA normal rules = Agent normal
|
||||
// 2. User normal rules = User normal
|
||||
// 3. Author normal rules = Document normal
|
||||
// 4. Override normal rules = Override normal
|
||||
// 5. Author !important rules = Document !important
|
||||
// 6. Override !important rules = Override !important
|
||||
// 7. User !important rules = User !important
|
||||
// 8. UA !important rules = Agent !important
|
||||
// 1. UA normal rules = Agent normal
|
||||
// 2. Presentation hints = PresHint normal
|
||||
// 3. User normal rules = User normal
|
||||
// 2. HTML Presentation hints = HTMLPresHint normal
|
||||
// 5. Author normal rules = Document normal
|
||||
// 6. Override normal rules = Override normal
|
||||
// 7. Author !important rules = Document !important
|
||||
// 8. Override !important rules = Override !important
|
||||
// 9. User !important rules = User !important
|
||||
// 10. UA !important rules = Agent !important
|
||||
// [most important]
|
||||
|
||||
NS_PRECONDITION(SheetCount(ePresHintSheet) == 0 ||
|
||||
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();
|
||||
}
|
||||
|
||||
nsRuleNode* lastUserRN = lastAgentRN;
|
||||
if (mRuleProcessors[eUserSheet].Count()) {
|
||||
mRuleProcessors[eUserSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastUserRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
|
||||
nsRuleNode* lastPresHintRN = lastUserRN;
|
||||
nsRuleNode* lastPresHintRN = lastAgentRN;
|
||||
if (mRuleProcessors[ePresHintSheet].Count()) {
|
||||
mRuleProcessors[ePresHintSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastPresHintRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
|
||||
nsRuleNode* lastDocRN = lastPresHintRN;
|
||||
nsRuleNode* lastUserRN = lastPresHintRN;
|
||||
if (mRuleProcessors[eUserSheet].Count()) {
|
||||
mRuleProcessors[eUserSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastUserRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
|
||||
nsRuleNode* lastHTMLPresHintRN = lastUserRN;
|
||||
if (mRuleProcessors[eHTMLPresHintSheet].Count()) {
|
||||
mRuleProcessors[eHTMLPresHintSheet].EnumerateForwards(aCollectorFunc, aData);
|
||||
lastHTMLPresHintRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
|
||||
nsRuleNode* lastDocRN = lastHTMLPresHintRN;
|
||||
PRBool useRuleProcessors = PR_TRUE;
|
||||
if (mStyleRuleSupplier) {
|
||||
// We can supply additional document-level sheets that should be walked.
|
||||
@ -440,10 +484,17 @@ nsStyleSet::FileRules(nsIStyleRuleProcessor::EnumFunc aCollectorFunc,
|
||||
lastOvrRN = mRuleWalker->GetCurrentNode();
|
||||
}
|
||||
|
||||
AddImportantRules(lastDocRN, lastUserRN); //doc
|
||||
AddImportantRules(lastOvrRN, lastDocRN); //ovr
|
||||
// There should be no imporant rules in the preshint level
|
||||
AddImportantRules(lastUserRN, lastAgentRN); //user
|
||||
// There should be no important rules in the preshint or HTMLpreshint level
|
||||
AddImportantRules(lastOvrRN, lastHTMLPresHintRN); // doc and override
|
||||
#ifdef DEBUG
|
||||
AssertNoCSSRules(lastHTMLPresHintRN, lastUserRN);
|
||||
AssertNoImportantRules(lastHTMLPresHintRN, lastUserRN); // HTML preshints
|
||||
#endif
|
||||
AddImportantRules(lastUserRN, lastPresHintRN); //user
|
||||
#ifdef DEBUG
|
||||
AssertNoCSSRules(lastPresHintRN, lastAgentRN);
|
||||
AssertNoImportantRules(lastPresHintRN, lastAgentRN); // preshints
|
||||
#endif
|
||||
AddImportantRules(lastAgentRN, nsnull); //agent
|
||||
|
||||
}
|
||||
@ -454,14 +505,21 @@ void
|
||||
nsStyleSet::WalkRuleProcessors(nsIStyleRuleProcessor::EnumFunc aFunc,
|
||||
RuleProcessorData* aData)
|
||||
{
|
||||
NS_PRECONDITION(SheetCount(ePresHintSheet) == 0 ||
|
||||
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 preshint rules.
|
||||
mRuleProcessors[ePresHintSheet].EnumerateForwards(aFunc, aData);
|
||||
// Walk HTML preshint rules.
|
||||
mRuleProcessors[eHTMLPresHintSheet].EnumerateForwards(aFunc, aData);
|
||||
|
||||
PRBool useRuleProcessors = PR_TRUE;
|
||||
if (mStyleRuleSupplier) {
|
||||
@ -523,10 +581,11 @@ nsStyleSet::ResolveStyleFor(nsIContent* aContent,
|
||||
"content must be element");
|
||||
|
||||
if (aContent && presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
RulesMatchingData data(presContext, aContent, mRuleWalker);
|
||||
FileRules(EnumRulesMatching, &data);
|
||||
@ -547,10 +606,11 @@ nsStyleSet::ResolveStyleForNonElement(nsStyleContext* aParentContext)
|
||||
nsIPresContext *presContext = PresContext();
|
||||
|
||||
if (presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
result = GetContext(presContext, aParentContext,
|
||||
nsCSSAnonBoxes::mozNonElement).get();
|
||||
@ -600,10 +660,11 @@ nsStyleSet::ResolvePseudoStyleFor(nsIContent* aParentContent,
|
||||
"content (if non-null) must be element");
|
||||
|
||||
if (aPseudoTag && presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
PseudoRulesMatchingData data(presContext, aParentContent, aPseudoTag,
|
||||
aComparator, mRuleWalker);
|
||||
@ -633,10 +694,11 @@ nsStyleSet::ProbePseudoStyleFor(nsIContent* aParentContent,
|
||||
"content (if non-null) must be element");
|
||||
|
||||
if (aPseudoTag && presContext) {
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
if (mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count()) {
|
||||
PseudoRulesMatchingData data(presContext, aParentContent, aPseudoTag,
|
||||
nsnull, mRuleWalker);
|
||||
@ -791,10 +853,11 @@ nsStyleSet::HasStateDependentStyle(nsIPresContext* aPresContext,
|
||||
nsReStyleHint result = nsReStyleHint(0);
|
||||
|
||||
if (aContent->IsContentOfType(nsIContent::eELEMENT) &&
|
||||
(mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
(mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count())) {
|
||||
StatefulData data(aPresContext, aContent, aStateMask);
|
||||
WalkRuleProcessors(SheetHasStatefulStyle, &data);
|
||||
@ -835,10 +898,11 @@ nsStyleSet::HasAttributeDependentStyle(nsIPresContext* aPresContext,
|
||||
nsReStyleHint result = nsReStyleHint(0);
|
||||
|
||||
if (aContent->IsContentOfType(nsIContent::eELEMENT) &&
|
||||
(mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
(mRuleProcessors[eAgentSheet].Count() ||
|
||||
mRuleProcessors[ePresHintSheet].Count() ||
|
||||
mRuleProcessors[eUserSheet].Count() ||
|
||||
mRuleProcessors[eHTMLPresHintSheet].Count() ||
|
||||
mRuleProcessors[eDocSheet].Count() ||
|
||||
mRuleProcessors[eOverrideSheet].Count())) {
|
||||
AttributeData data(aPresContext, aContent, aAttribute, aModType);
|
||||
WalkRuleProcessors(SheetHasAttributeStyle, &data);
|
||||
|
@ -154,8 +154,9 @@ class nsStyleSet
|
||||
// All sheet types are ordered most-significant-first.
|
||||
enum sheetType {
|
||||
eAgentSheet,
|
||||
eUserSheet,
|
||||
ePresHintSheet,
|
||||
eUserSheet,
|
||||
eHTMLPresHintSheet,
|
||||
eDocSheet,
|
||||
eOverrideSheet,
|
||||
eSheetTypeCount
|
||||
@ -194,6 +195,20 @@ class nsStyleSet
|
||||
void AddImportantRules(nsRuleNode* aCurrLevelNode,
|
||||
nsRuleNode* aLastPrevLevelNode);
|
||||
|
||||
#ifdef DEBUG
|
||||
// Just like AddImportantRules except it doesn't actually add anything; it
|
||||
// just asserts that there are no important rules between aCurrLevelNode and
|
||||
// aLastPrevLevelNode.
|
||||
void AssertNoImportantRules(nsRuleNode* aCurrLevelNode,
|
||||
nsRuleNode* aLastPrevLevelNode);
|
||||
|
||||
// Just like AddImportantRules except it doesn't actually add anything; it
|
||||
// just asserts that there are no CSS rules between aCurrLevelNode and
|
||||
// aLastPrevLevelNode. Mostly useful for the preshint levels.
|
||||
void AssertNoCSSRules(nsRuleNode* aCurrLevelNode,
|
||||
nsRuleNode* aLastPrevLevelNode);
|
||||
#endif
|
||||
|
||||
// Enumerate the rules in a way that cares about the order of the
|
||||
// rules.
|
||||
void FileRules(nsIStyleRuleProcessor::EnumFunc aCollectorFunc,
|
||||
|
Loading…
x
Reference in New Issue
Block a user