Avoid attempting to do CSS selector matching on text nodes, comments, or processing instructions by adding a 'NonElement' style resolution method that assumes that no rules match (temporarily, until we don't have style contexts for text nodes) and by cleaning code that was using textPseudo (the usual case) or passing the text node directly (only a few unusual cases). b=56117 r=hyatt sr=attinasi

This commit is contained in:
dbaron%fas.harvard.edu 2001-10-30 06:02:05 +00:00
Родитель b0af214b90
Коммит c13d4f0b0c
28 изменённых файлов: 583 добавлений и 469 удалений

Просмотреть файл

@ -118,6 +118,11 @@ public:
nsIStyleContext* aParentContext,
PRBool aForceUnique = PR_FALSE);
virtual nsIStyleContext* ResolveStyleForNonElement(
nsIPresContext* aPresContext,
nsIStyleContext* aParentContext,
PRBool aForceUnique = PR_FALSE);
virtual nsIStyleContext* ResolvePseudoStyleFor(nsIPresContext* aPresContext,
nsIContent* aParentContent,
nsIAtom* aPseudoTag,
@ -856,6 +861,8 @@ nsIStyleContext* StyleSetImpl::ResolveStyleFor(nsIPresContext* aPresContext,
NS_ASSERTION(aContent, "must have content");
NS_ASSERTION(aPresContext, "must have pres context");
NS_ASSERTION(aContent->IsContentOfType(nsIContent::eELEMENT),
"content must be element");
if (aContent && aPresContext) {
GatherRuleProcessors();
@ -881,6 +888,35 @@ nsIStyleContext* StyleSetImpl::ResolveStyleFor(nsIPresContext* aPresContext,
return result;
}
nsIStyleContext* StyleSetImpl::ResolveStyleForNonElement(
nsIPresContext* aPresContext,
nsIStyleContext* aParentContext,
PRBool aForceUnique)
{
MOZ_TIMER_DEBUGLOG(("Start: StyleSetImpl::ResolveStyleForNonElement(), this=%p\n", this));
STYLESET_START_TIMER(NS_TIMER_STYLE_RESOLUTION);
nsIStyleContext* result = nsnull;
NS_ASSERTION(aPresContext, "must have pres context");
if (aPresContext) {
GatherRuleProcessors();
if (mBackstopRuleProcessors ||
mDocRuleProcessors ||
mOverrideRuleProcessors) {
EnsureRuleWalker(aPresContext);
result = GetContext(aPresContext, aParentContext, nsnull, aForceUnique);
NS_ASSERTION(mRuleWalker->AtRoot(), "rule walker must be at root");
}
}
MOZ_TIMER_DEBUGLOG(("Stop: StyleSetImpl::ResolveStyleForNonElement(), this=%p\n", this));
STYLESET_STOP_TIMER(NS_TIMER_STYLE_RESOLUTION);
return result;
}
struct PseudoRulesMatchingData {
PseudoRulesMatchingData(nsIPresContext* aPresContext,
nsIAtom* aMedium,
@ -933,6 +969,9 @@ nsIStyleContext* StyleSetImpl::ResolvePseudoStyleFor(nsIPresContext* aPresContex
NS_ASSERTION(aPseudoTag, "must have pseudo tag");
NS_ASSERTION(aPresContext, "must have pres context");
NS_ASSERTION(!aParentContent ||
aParentContent->IsContentOfType(nsIContent::eELEMENT),
"content (if non-null) must be element");
if (aPseudoTag && aPresContext) {
GatherRuleProcessors();
@ -972,6 +1011,9 @@ nsIStyleContext* StyleSetImpl::ProbePseudoStyleFor(nsIPresContext* aPresContext,
NS_ASSERTION(aPseudoTag, "must have pseudo tag");
NS_ASSERTION(aPresContext, "must have pres context");
NS_ASSERTION(!aParentContent ||
aParentContent->IsContentOfType(nsIContent::eELEMENT),
"content (if non-null) must be element");
if (aPseudoTag && aPresContext) {
GatherRuleProcessors();
@ -1168,7 +1210,11 @@ StyleSetImpl::HasStateDependentStyle(nsIPresContext* aPresContext,
nsIContent* aContent)
{
GatherRuleProcessors();
if (mBackstopRuleProcessors || mDocRuleProcessors || mOverrideRuleProcessors) {
if (aContent->IsContentOfType(nsIContent::eELEMENT) &&
(mBackstopRuleProcessors ||
mDocRuleProcessors ||
mOverrideRuleProcessors)) {
nsIAtom* medium = nsnull;
aPresContext->GetMedium(&medium);
StatefulData data(aPresContext, medium, aContent);

Просмотреть файл

@ -119,7 +119,6 @@ HTML_ATOM(cols, "cols")
HTML_ATOM(colspan, "colspan")
HTML_ATOM(combobox, "combobox")
HTML_ATOM(columnPseudo, ":body-column")
HTML_ATOM(commentPseudo, ":-moz-comment")
HTML_ATOM(compact, "compact")
HTML_ATOM(content, "content")
HTML_ATOM(coords, "coords")
@ -235,7 +234,6 @@ HTML_ATOM(param, "param")
HTML_ATOM(placeholderPseudo, ":placeholder-frame")
HTML_ATOM(pointSize, "point-size")
HTML_ATOM(pre, "pre")
HTML_ATOM(processingInstructionPseudo, ":-moz-pi")
HTML_ATOM(profile, "profile")
HTML_ATOM(prompt, "prompt")
HTML_ATOM(radioPseudo, ":-moz-radio")
@ -287,7 +285,6 @@ HTML_ATOM(tfoot, "tfoot")
HTML_ATOM(thead, "thead")
HTML_ATOM(text, "text")
HTML_ATOM(textarea, "textarea")
HTML_ATOM(textPseudo, ":-moz-text")
HTML_ATOM(th, "th")
HTML_ATOM(title, "title")
HTML_ATOM(top, "top")

Просмотреть файл

@ -3226,7 +3226,8 @@ MOZ_DECL_CTOR_COUNTER(SelectorMatchesData)
struct SelectorMatchesData {
SelectorMatchesData(nsIPresContext* aPresContext, nsIContent* aContent,
nsRuleWalker* aRuleWalker, nsCompatibility* aCompat = nsnull);
nsRuleWalker* aRuleWalker,
nsCompatibility* aCompat = nsnull);
virtual ~SelectorMatchesData()
{
@ -3274,12 +3275,16 @@ struct SelectorMatchesData {
SelectorMatchesData* mParentData;
};
SelectorMatchesData::SelectorMatchesData(nsIPresContext* aPresContext, nsIContent* aContent,
nsRuleWalker* aRuleWalker,
nsCompatibility* aCompat /*= nsnull*/)
SelectorMatchesData::SelectorMatchesData(nsIPresContext* aPresContext,
nsIContent* aContent,
nsRuleWalker* aRuleWalker,
nsCompatibility* aCompat /*= nsnull*/)
{
MOZ_COUNT_CTOR(SelectorMatchesData);
NS_ASSERTION(!aContent || aContent->IsContentOfType(nsIContent::eELEMENT),
"non-element leaked into SelectorMatches");
mPresContext = aPresContext;
mContent = aContent;
mParentContent = nsnull;
@ -3404,7 +3409,7 @@ static PRBool ValueIncludes(const nsString& aValueList, const nsString& aValue,
return PR_FALSE;
}
static PRBool IsEventPseudo(nsIAtom* aAtom)
inline PRBool IsEventPseudo(nsIAtom* aAtom)
{
return PRBool ((nsCSSAtoms::activePseudo == aAtom) ||
(nsCSSAtoms::dragOverPseudo == aAtom) ||
@ -3414,14 +3419,14 @@ static PRBool IsEventPseudo(nsIAtom* aAtom)
// XXX selected, enabled, disabled, selection?
}
static PRBool IsLinkPseudo(nsIAtom* aAtom)
inline PRBool IsLinkPseudo(nsIAtom* aAtom)
{
return PRBool ((nsCSSAtoms::linkPseudo == aAtom) ||
(nsCSSAtoms::visitedPseudo == aAtom) ||
(nsCSSAtoms::anyLinkPseudo == aAtom));
}
static PRBool PR_CALLBACK IsEventSensitive(nsIAtom *aPseudo, nsIAtom *aContentTag, PRBool aSelectorIsGlobal)
inline PRBool IsEventSensitive(nsIAtom *aPseudo, nsIAtom *aContentTag, PRBool aSelectorIsGlobal)
{
// if the selector is global, meaning it is not tied to a tag, then
// we restrict the application of the event pseudo to the following tags
@ -3433,11 +3438,7 @@ static PRBool PR_CALLBACK IsEventSensitive(nsIAtom *aPseudo, nsIAtom *aContentTa
(nsHTMLAtoms::li == aContentTag) ||
(nsHTMLAtoms::label == aContentTag) ||
(nsHTMLAtoms::select == aContentTag) ||
(nsHTMLAtoms::textarea == aContentTag) ||
(nsHTMLAtoms::textPseudo == aContentTag) ||
// We require a Layout Atom too
(nsLayoutAtoms::textTagName == aContentTag)
);
(nsHTMLAtoms::textarea == aContentTag));
} else {
// selector is not global, so apply the event pseudo to everything except HTML and BODY
return PRBool ((nsHTMLAtoms::html != aContentTag) &&
@ -3952,6 +3953,8 @@ CSSRuleProcessor::RulesMatching(nsIPresContext* aPresContext,
NS_PRECONDITION(nsnull != aPresContext, "null arg");
NS_PRECONDITION(nsnull != aContent, "null arg");
NS_PRECONDITION(nsnull != aRuleWalker, "null arg");
NS_PRECONDITION(aContent->IsContentOfType(nsIContent::eELEMENT),
"content must be element");
RuleCascadeData* cascade = GetRuleCascade(aPresContext, aMedium);
@ -4066,6 +4069,9 @@ CSSRuleProcessor::RulesMatching(nsIPresContext* aPresContext,
NS_PRECONDITION(nsnull != aPresContext, "null arg");
NS_PRECONDITION(nsnull != aPseudoTag, "null arg");
NS_PRECONDITION(nsnull != aRuleWalker, "null arg");
NS_PRECONDITION(!aParentContent ||
aParentContent->IsContentOfType(nsIContent::eELEMENT),
"content (if present) must be element");
RuleCascadeData* cascade = GetRuleCascade(aPresContext, aMedium);
@ -4116,6 +4122,9 @@ CSSRuleProcessor::HasStateDependentStyle(nsIPresContext* aPresContext,
nsIAtom* aMedium,
nsIContent* aContent)
{
NS_PRECONDITION(aContent->IsContentOfType(nsIContent::eELEMENT),
"content must be element");
PRBool isStateful = PR_FALSE;
RuleCascadeData* cascade = GetRuleCascade(aPresContext, aMedium);
@ -4288,7 +4297,6 @@ CSSRuleProcessor::ClearRuleCascades(void)
delete data;
data = next;
}
mRuleCascades = nsnull;
return NS_OK;
}
@ -4302,7 +4310,7 @@ PRBool BuildHashEnum(nsISupports* aRule, void* aHash)
return PR_TRUE;
}
static
inline
PRBool IsStateSelector(nsCSSSelector& aSelector)
{
nsAtomList* pseudoClass = aSelector.mPseudoClassList;

Просмотреть файл

@ -119,7 +119,6 @@ HTML_ATOM(cols, "cols")
HTML_ATOM(colspan, "colspan")
HTML_ATOM(combobox, "combobox")
HTML_ATOM(columnPseudo, ":body-column")
HTML_ATOM(commentPseudo, ":-moz-comment")
HTML_ATOM(compact, "compact")
HTML_ATOM(content, "content")
HTML_ATOM(coords, "coords")
@ -235,7 +234,6 @@ HTML_ATOM(param, "param")
HTML_ATOM(placeholderPseudo, ":placeholder-frame")
HTML_ATOM(pointSize, "point-size")
HTML_ATOM(pre, "pre")
HTML_ATOM(processingInstructionPseudo, ":-moz-pi")
HTML_ATOM(profile, "profile")
HTML_ATOM(prompt, "prompt")
HTML_ATOM(radioPseudo, ":-moz-radio")
@ -287,7 +285,6 @@ HTML_ATOM(tfoot, "tfoot")
HTML_ATOM(thead, "thead")
HTML_ATOM(text, "text")
HTML_ATOM(textarea, "textarea")
HTML_ATOM(textPseudo, ":-moz-text")
HTML_ATOM(th, "th")
HTML_ATOM(title, "title")
HTML_ATOM(top, "top")

Просмотреть файл

@ -1433,6 +1433,9 @@ nsCSSFrameConstructor::CreateGeneratedContentFrame(nsIPresShell* aPresShe
{
*aResult = nsnull; // initialize OUT parameter
if (!aContent->IsContentOfType(nsIContent::eELEMENT))
return PR_FALSE;
// Probe for the existence of the pseudo-element
nsCOMPtr<nsIStyleContext> pseudoStyleContext;
aPresContext->ProbePseudoStyleContextFor(aContent, aPseudoElement, aStyleContext,
@ -1476,9 +1479,9 @@ nsCSSFrameConstructor::CreateGeneratedContentFrame(nsIPresShell* aPresShe
// Create another pseudo style context to use for all the generated child
// frames
nsIStyleContext* textStyleContext;
aPresContext->ResolvePseudoStyleContextFor(aContent, nsHTMLAtoms::textPseudo,
pseudoStyleContext, PR_FALSE,
&textStyleContext);
aPresContext->ResolveStyleContextForNonElement(
pseudoStyleContext, PR_FALSE,
&textStyleContext);
// Now create content objects (and child frames) for each value of the
// 'content' property
@ -2937,8 +2940,12 @@ nsCSSFrameConstructor::TableProcessChildren(nsIPresShell* aPresShell,
iter != last;
++iter) {
nsCOMPtr<nsIContent> childContent = *iter;
if (childContent && NeedFrameFor(aParentFrame, childContent)) {
rv = TableProcessChild(aPresShell, aPresContext, aState, *childContent, aParentFrame,
if (childContent &&
(childContent->IsContentOfType(nsIContent::eELEMENT) ||
childContent->IsContentOfType(nsIContent::eTEXT)) &&
NeedFrameFor(aParentFrame, childContent)) {
rv = TableProcessChild(aPresShell, aPresContext, aState, childContent,
aContent, aParentFrame,
parentFrameType, parentStyleContext,
aTableCreator, aChildItems, aCaption);
}
@ -2958,7 +2965,8 @@ nsresult
nsCSSFrameConstructor::TableProcessChild(nsIPresShell* aPresShell,
nsIPresContext* aPresContext,
nsFrameConstructorState& aState,
nsIContent& aChildContent,
nsIContent* aChildContent,
nsIContent* aParentContent,
nsIFrame* aParentFrame,
nsIAtom* aParentFrameType,
nsIStyleContext* aParentStyleContext,
@ -2975,15 +2983,15 @@ nsCSSFrameConstructor::TableProcessChild(nsIPresShell* aPresShell,
nsCOMPtr<nsIStyleContext> childStyleContext;
// Resolve the style context and get its display
aPresContext->ResolveStyleContextFor(&aChildContent, aParentStyleContext, PR_FALSE,
getter_AddRefs(childStyleContext));
ResolveStyleContext(aPresContext, aParentFrame, aChildContent,
getter_AddRefs(childStyleContext));
const nsStyleDisplay* styleDisplay = (const nsStyleDisplay*)
childStyleContext->GetStyleData(eStyleStruct_Display);
switch (styleDisplay->mDisplay) {
case NS_STYLE_DISPLAY_TABLE:
nsIFrame* innerTableFrame;
rv = ConstructTableFrame(aPresShell, aPresContext, aState, &aChildContent, aParentFrame,
rv = ConstructTableFrame(aPresShell, aPresContext, aState, aChildContent, aParentFrame,
childStyleContext, aTableCreator, PR_FALSE, aChildItems,
childFrame, innerTableFrame, isPseudoParent);
break;
@ -2991,7 +2999,7 @@ nsCSSFrameConstructor::TableProcessChild(nsIPresShell* aPresShell,
case NS_STYLE_DISPLAY_TABLE_CAPTION:
if (!aCaption) { // only allow one caption
nsIFrame* parentFrame = GetOuterTableFrame(aParentFrame);
rv = ConstructTableCaptionFrame(aPresShell, aPresContext, aState, &aChildContent,
rv = ConstructTableCaptionFrame(aPresShell, aPresContext, aState, aChildContent,
parentFrame, childStyleContext, aTableCreator,
aChildItems, aCaption, isPseudoParent);
}
@ -2999,7 +3007,7 @@ nsCSSFrameConstructor::TableProcessChild(nsIPresShell* aPresShell,
break;
case NS_STYLE_DISPLAY_TABLE_COLUMN_GROUP:
rv = ConstructTableColGroupFrame(aPresShell, aPresContext, aState, &aChildContent,
rv = ConstructTableColGroupFrame(aPresShell, aPresContext, aState, aChildContent,
aParentFrame, childStyleContext, aTableCreator,
PR_FALSE, aChildItems, childFrame, isPseudoParent);
break;
@ -3007,19 +3015,19 @@ nsCSSFrameConstructor::TableProcessChild(nsIPresShell* aPresShell,
case NS_STYLE_DISPLAY_TABLE_HEADER_GROUP:
case NS_STYLE_DISPLAY_TABLE_FOOTER_GROUP:
case NS_STYLE_DISPLAY_TABLE_ROW_GROUP:
rv = ConstructTableRowGroupFrame(aPresShell, aPresContext, aState, &aChildContent,
rv = ConstructTableRowGroupFrame(aPresShell, aPresContext, aState, aChildContent,
aParentFrame, childStyleContext, aTableCreator,
PR_FALSE, aChildItems, childFrame, isPseudoParent);
break;
case NS_STYLE_DISPLAY_TABLE_ROW:
rv = ConstructTableRowFrame(aPresShell, aPresContext, aState, &aChildContent,
rv = ConstructTableRowFrame(aPresShell, aPresContext, aState, aChildContent,
aParentFrame, childStyleContext, aTableCreator,
PR_FALSE, aChildItems, childFrame, isPseudoParent);
break;
case NS_STYLE_DISPLAY_TABLE_COLUMN:
rv = ConstructTableColFrame(aPresShell, aPresContext, aState, &aChildContent,
rv = ConstructTableColFrame(aPresShell, aPresContext, aState, aChildContent,
aParentFrame, childStyleContext, aTableCreator,
PR_FALSE, aChildItems, childFrame, isPseudoParent);
break;
@ -3027,13 +3035,16 @@ nsCSSFrameConstructor::TableProcessChild(nsIPresShell* aPresShell,
case NS_STYLE_DISPLAY_TABLE_CELL:
nsIFrame* innerCell;
rv = ConstructTableCellFrame(aPresShell, aPresContext, aState, &aChildContent,
rv = ConstructTableCellFrame(aPresShell, aPresContext, aState, aChildContent,
aParentFrame, childStyleContext, aTableCreator, PR_FALSE,
aChildItems, childFrame, innerCell, isPseudoParent);
break;
case NS_STYLE_DISPLAY_NONE:
break;
default:
rv = ConstructTableForeignFrame(aPresShell, aPresContext, aState, &aChildContent,
rv = ConstructTableForeignFrame(aPresShell, aPresContext, aState, aChildContent,
aParentFrame, childStyleContext, aTableCreator,
aChildItems, childFrame, isPseudoParent);
break;
@ -3230,9 +3241,8 @@ nsCSSFrameConstructor::ConstructDocElementFrame(nsIPresShell* aPresShell,
}
if (resolveStyle) {
nsCOMPtr<nsIAtom> tag;
aDocElement->GetTag(*getter_AddRefs(tag));
rv = ResolveStyleContext(aPresContext, aParentFrame, aDocElement, tag, getter_AddRefs(styleContext));
rv = ResolveStyleContext(aPresContext, aParentFrame, aDocElement,
getter_AddRefs(styleContext));
if (NS_FAILED(rv))
return rv;
}
@ -6506,7 +6516,6 @@ nsresult
nsCSSFrameConstructor::ResolveStyleContext(nsIPresContext* aPresContext,
nsIFrame* aParentFrame,
nsIContent* aContent,
nsIAtom* aTag,
nsIStyleContext** aStyleContext)
{
nsresult rv = NS_OK;
@ -6515,43 +6524,23 @@ nsCSSFrameConstructor::ResolveStyleContext(nsIPresContext* aPresContext,
nsCOMPtr<nsIStyleContext> parentStyleContext;
aParentFrame->GetStyleContext(getter_AddRefs(parentStyleContext));
if (nsLayoutAtoms::textTagName == aTag) {
// Use a special pseudo element style context for text
nsCOMPtr<nsIContent> parentContent;
if (nsnull != aParentFrame) {
aParentFrame->GetContent(getter_AddRefs(parentContent));
}
rv = aPresContext->ResolvePseudoStyleContextFor(parentContent,
nsHTMLAtoms::textPseudo,
parentStyleContext,
PR_FALSE,
aStyleContext);
} else if (nsLayoutAtoms::commentTagName == aTag) {
// Use a special pseudo element style context for comments
nsCOMPtr<nsIContent> parentContent;
if (nsnull != aParentFrame) {
aParentFrame->GetContent(getter_AddRefs(parentContent));
}
rv = aPresContext->ResolvePseudoStyleContextFor(parentContent,
nsHTMLAtoms::commentPseudo,
parentStyleContext,
PR_FALSE,
aStyleContext);
} else if (nsLayoutAtoms::processingInstructionTagName == aTag) {
// Use a special pseudo element style context for comments
nsCOMPtr<nsIContent> parentContent;
if (nsnull != aParentFrame) {
aParentFrame->GetContent(getter_AddRefs(parentContent));
}
rv = aPresContext->ResolvePseudoStyleContextFor(parentContent,
nsHTMLAtoms::processingInstructionPseudo,
parentStyleContext,
PR_FALSE,
aStyleContext);
} else {
if (aContent->IsContentOfType(nsIContent::eELEMENT)) {
rv = aPresContext->ResolveStyleContextFor(aContent, parentStyleContext,
PR_FALSE,
aStyleContext);
} else {
#ifdef DEBUG
{
nsCOMPtr<nsIAtom> tag;
aContent->GetTag(*getter_AddRefs(tag));
NS_ASSERTION(tag == nsLayoutAtoms::textTagName,
"shouldn't waste time creating style contexts for "
"comments and processing instructions");
}
#endif
rv = aPresContext->ResolveStyleContextForNonElement(parentStyleContext,
PR_FALSE,
aStyleContext);
}
return rv;
}
@ -6926,8 +6915,14 @@ nsCSSFrameConstructor::ConstructFrame(nsIPresShell* aPresShell,
nsCOMPtr<nsIAtom> tag;
aContent->GetTag(*getter_AddRefs(tag));
// never create frames for comments on PIs
if (tag == nsLayoutAtoms::commentTagName ||
tag == nsLayoutAtoms::processingInstructionTagName)
return rv;
nsCOMPtr<nsIStyleContext> styleContext;
rv = ResolveStyleContext(aPresContext, aParentFrame, aContent, tag, getter_AddRefs(styleContext));
rv = ResolveStyleContext(aPresContext, aParentFrame, aContent,
getter_AddRefs(styleContext));
if (NS_SUCCEEDED(rv)) {
@ -6984,7 +6979,8 @@ nsCSSFrameConstructor::ConstructFrameInternal( nsIPresShell* aPresShe
return NS_OK;
if (resolveStyle) {
rv = ResolveStyleContext(aPresContext, aParentFrame, aContent, aTag, getter_AddRefs(styleContext));
rv = ResolveStyleContext(aPresContext, aParentFrame, aContent,
getter_AddRefs(styleContext));
if (NS_FAILED(rv))
return rv;
}
@ -8294,6 +8290,9 @@ nsCSSFrameConstructor::ContentInserted(nsIPresContext* aPresContext,
PRInt32 aIndexInContainer,
nsILayoutHistoryState* aFrameState)
{
// XXXldb Do we need to re-resolve style to handle the CSS2 + combinator and
// the :empty pseudo-class?
#ifdef DEBUG
if (gNoisyContentUpdates) {
printf("nsCSSFrameConstructor::ContentInserted container=%p child=%p index=%d\n",
@ -8360,9 +8359,8 @@ nsCSSFrameConstructor::ContentInserted(nsIPresContext* aPresContext,
// to check it for subsequent display changes (e.g., when you next
// reopen).
nsCOMPtr<nsIStyleContext> styleContext;
nsCOMPtr<nsIAtom> tagName;
aChild->GetTag(*getter_AddRefs(tagName));
ResolveStyleContext(aPresContext, innerFrame, aChild, tagName, getter_AddRefs(styleContext));
ResolveStyleContext(aPresContext, innerFrame, aChild,
getter_AddRefs(styleContext));
// Pre-check for display "none" - if we find that, don't reflow at all.
const nsStyleDisplay* display = (const nsStyleDisplay*)
@ -8998,6 +8996,9 @@ nsCSSFrameConstructor::ContentRemoved(nsIPresContext* aPresContext,
nsIContent* aChild,
PRInt32 aIndexInContainer)
{
// XXXldb Do we need to re-resolve style to handle the CSS2 + combinator and
// the :empty pseudo-class?
#ifdef DEBUG
if (gNoisyContentUpdates) {
printf("nsCSSFrameConstructor::ContentRemoved container=%p child=%p index=%d\n",
@ -10295,9 +10296,8 @@ nsCSSFrameConstructor::ConstructAlternateFrame(nsIPresShell* aPresShell,
nsIStyleContext* textStyleContext;
NS_NewTextFrame(aPresShell, &textFrame);
aPresContext->ResolvePseudoStyleContextFor(aContent, nsHTMLAtoms::textPseudo,
aStyleContext, PR_FALSE,
&textStyleContext);
aPresContext->ResolveStyleContextForNonElement(aStyleContext, PR_FALSE,
&textStyleContext);
textFrame->Init(aPresContext, altTextContent, containerFrame,
textStyleContext, nsnull);
@ -12528,15 +12528,9 @@ nsCSSFrameConstructor::CreateTreeWidgetContent(nsIPresContext* aPresContext,
GetFloaterContainingBlock(aPresContext, aParentFrame),
mTempFrameTreeState);
// Get the element's tag
nsCOMPtr<nsIAtom> tag;
aChild->GetTag(*getter_AddRefs(tag));
PRInt32 namespaceID;
aChild->GetNameSpaceID(namespaceID);
nsCOMPtr<nsIStyleContext> styleContext;
rv = ResolveStyleContext(aPresContext, aParentFrame, aChild, tag, getter_AddRefs(styleContext));
rv = ResolveStyleContext(aPresContext, aParentFrame, aChild,
getter_AddRefs(styleContext));
if (NS_SUCCEEDED(rv)) {
// Pre-check for display "none" - only if we find that, do we create
@ -12550,6 +12544,12 @@ nsCSSFrameConstructor::CreateTreeWidgetContent(nsIPresContext* aPresContext,
}
}
nsCOMPtr<nsIAtom> tag;
aChild->GetTag(*getter_AddRefs(tag));
PRInt32 namespaceID;
aChild->GetNameSpaceID(namespaceID);
rv = ConstructFrameInternal(shell, aPresContext, state, aChild, aParentFrame, tag, namespaceID,
styleContext, frameItems, PR_FALSE);

Просмотреть файл

@ -192,7 +192,6 @@ protected:
nsresult ResolveStyleContext(nsIPresContext* aPresContext,
nsIFrame* aParentFrame,
nsIContent* aContent,
nsIAtom* aTag,
nsIStyleContext** aStyleContext);
nsresult ConstructFrame(nsIPresShell* aPresShell,
@ -427,7 +426,8 @@ protected:
nsresult TableProcessChild(nsIPresShell* aPresShell,
nsIPresContext* aPresContext,
nsFrameConstructorState& aState,
nsIContent& aChildContent,
nsIContent* aChildContent,
nsIContent* aParentContent,
nsIFrame* aParentFrame,
nsIAtom* aParentFrameType,
nsIStyleContext* aParentStyleContext,

Просмотреть файл

@ -1631,7 +1631,13 @@ FrameManager::ReResolveStyleContext(nsIPresContext* aPresContext,
}
else {
NS_ASSERTION(localContent, "non pseudo-element frame without content node");
aPresContext->ResolveStyleContextFor(content, aParentContext, PR_TRUE, &newContext);
if (content->IsContentOfType(nsIContent::eELEMENT)) {
aPresContext->ResolveStyleContextFor(content, aParentContext,
PR_TRUE, &newContext);
} else {
aPresContext->ResolveStyleContextForNonElement(aParentContext,
PR_TRUE, &newContext);
}
}
NS_ASSERTION(newContext, "failed to get new style context");
if (newContext) {
@ -1845,7 +1851,13 @@ FrameManager::ReResolveStyleContext(nsIPresContext* aPresContext,
}
else {
NS_ASSERTION(localContent, "non pseudo-element frame without content node");
aPresContext->ResolveStyleContextFor(content, aParentContext, PR_TRUE, &newContext);
if (content->IsContentOfType(nsIContent::eELEMENT)) {
aPresContext->ResolveStyleContextFor(content, aParentContext,
PR_TRUE, &newContext);
} else {
aPresContext->ResolveStyleContextForNonElement(aParentContext,
PR_TRUE, &newContext);
}
}
NS_ASSERTION(newContext, "failed to get new style context");
if (newContext) {
@ -1927,13 +1939,20 @@ FrameManager::ReResolveStyleContext(nsIPresContext* aPresContext,
nsIStyleContext* undisplayedContext = nsnull;
undisplayed->mStyle->GetPseudoType(pseudoTag);
if (undisplayed->mContent && pseudoTag == nsnull) { // child content
aPresContext->ResolveStyleContextFor(undisplayed->mContent, newContext,
PR_TRUE, &undisplayedContext);
if (undisplayed->mContent->IsContentOfType(nsIContent::eELEMENT)) {
aPresContext->ResolveStyleContextFor(undisplayed->mContent,
newContext,
PR_TRUE, &undisplayedContext);
} else {
aPresContext->ResolveStyleContextForNonElement(newContext,
PR_TRUE, &undisplayedContext);
}
}
else { // pseudo element
NS_ASSERTION(pseudoTag, "pseudo element without tag");
aPresContext->ResolvePseudoStyleContextFor(localContent, pseudoTag, newContext, PR_FALSE,
&undisplayedContext);
aPresContext->ResolvePseudoStyleContextFor(localContent, pseudoTag,
newContext, PR_FALSE,
&undisplayedContext);
}
NS_IF_RELEASE(pseudoTag);
if (undisplayedContext) {

Просмотреть файл

@ -692,10 +692,7 @@ nsPresContext::SetShell(nsIPresShell* aShell)
NS_IMETHODIMP
nsPresContext::GetShell(nsIPresShell** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mShell;
NS_IF_ADDREF(mShell);
return NS_OK;
@ -750,10 +747,7 @@ nsPresContext::Observe(nsISupports* aSubject,
NS_IMETHODIMP
nsPresContext::GetCompatibilityMode(nsCompatibility* aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mCompatibilityMode;
return NS_OK;
}
@ -782,7 +776,7 @@ nsPresContext::SetCompatibilityMode(nsCompatibility aMode)
NS_IMETHODIMP
nsPresContext::GetWidgetRenderingMode(nsWidgetRendering* aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
NS_PRECONDITION(aResult, "null out param");
*aResult = mWidgetRenderingMode;
return NS_OK;
}
@ -798,7 +792,7 @@ nsPresContext::SetWidgetRenderingMode(nsWidgetRendering aMode)
NS_IMETHODIMP
nsPresContext::GetImageAnimationMode(nsImageAnimation* aModeResult)
{
NS_ENSURE_ARG_POINTER(aModeResult);
NS_PRECONDITION(aModeResult, "null out param");
*aModeResult = mImageAnimationMode;
return NS_OK;
}
@ -818,10 +812,7 @@ nsPresContext::SetImageAnimationMode(nsImageAnimation aMode)
NS_IMETHODIMP
nsPresContext::GetLookAndFeel(nsILookAndFeel** aLookAndFeel)
{
NS_PRECONDITION(nsnull != aLookAndFeel, "null ptr");
if (nsnull == aLookAndFeel) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aLookAndFeel, "null out param");
nsresult result = NS_OK;
if (! mLookAndFeel) {
mLookAndFeel = do_GetService(kLookAndFeelCID,&result);
@ -836,10 +827,7 @@ nsPresContext::GetLookAndFeel(nsILookAndFeel** aLookAndFeel)
NS_IMETHODIMP
nsPresContext::GetBaseURL(nsIURI** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mBaseURL;
NS_IF_ADDREF(*aResult);
return NS_OK;
@ -851,10 +839,7 @@ nsPresContext::ResolveStyleContextFor(nsIContent* aContent,
PRBool aForceUnique,
nsIStyleContext** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
nsIStyleContext* result = nsnull;
nsCOMPtr<nsIStyleSet> set;
@ -872,6 +857,27 @@ nsPresContext::ResolveStyleContextFor(nsIContent* aContent,
return rv;
}
NS_IMETHODIMP
nsPresContext::ResolveStyleContextForNonElement(
nsIStyleContext* aParentContext,
PRBool aForceUnique,
nsIStyleContext** aResult)
{
NS_PRECONDITION(aResult, "null out param");
nsIStyleContext* result = nsnull;
nsCOMPtr<nsIStyleSet> set;
nsresult rv = mShell->GetStyleSet(getter_AddRefs(set));
if (NS_SUCCEEDED(rv) && set) {
result = set->ResolveStyleForNonElement(this, aParentContext,
aForceUnique);
if (!result)
rv = NS_ERROR_OUT_OF_MEMORY;
}
*aResult = result;
return rv;
}
NS_IMETHODIMP
nsPresContext::ResolvePseudoStyleContextFor(nsIContent* aParentContent,
nsIAtom* aPseudoTag,
@ -891,10 +897,7 @@ nsPresContext::ResolvePseudoStyleWithComparator(nsIContent* aParentContent,
nsICSSPseudoComparator* aComparator,
nsIStyleContext** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
nsIStyleContext* result = nsnull;
nsCOMPtr<nsIStyleSet> set;
@ -919,10 +922,7 @@ nsPresContext::ProbePseudoStyleContextFor(nsIContent* aParentContent,
PRBool aForceUnique,
nsIStyleContext** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
nsIStyleContext* result = nsnull;
nsCOMPtr<nsIStyleSet> set;
@ -973,10 +973,7 @@ nsPresContext::FreeToShell(size_t aSize, void* aFreeChunk)
NS_IMETHODIMP
nsPresContext::GetMetricsFor(const nsFont& aFont, nsIFontMetrics** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
nsIFontMetrics* metrics = nsnull;
if (mDeviceContext) {
@ -1065,10 +1062,7 @@ nsPresContext::SetDefaultFont(const PRUint8 aFontID, const nsFont& aFont)
NS_IMETHODIMP
nsPresContext::GetFontScaler(PRInt32* aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mFontScaler;
return NS_OK;
@ -1084,10 +1078,7 @@ nsPresContext::SetFontScaler(PRInt32 aScaler)
NS_IMETHODIMP
nsPresContext::GetDefaultColor(nscolor* aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mDefaultColor;
return NS_OK;
@ -1096,10 +1087,7 @@ nsPresContext::GetDefaultColor(nscolor* aResult)
NS_IMETHODIMP
nsPresContext::GetDefaultBackgroundColor(nscolor* aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mDefaultBackgroundColor;
return NS_OK;
@ -1115,8 +1103,7 @@ nsPresContext::GetDefaultBackgroundImage(nsString& aImage)
NS_IMETHODIMP
nsPresContext::GetDefaultBackgroundImageRepeat(PRUint8* aRepeat)
{
NS_PRECONDITION(nsnull != aRepeat, "null ptr");
if (nsnull == aRepeat) { return NS_ERROR_NULL_POINTER; }
NS_PRECONDITION(aRepeat, "null out param");
*aRepeat = mDefaultBackgroundImageRepeat;
return NS_OK;
}
@ -1124,8 +1111,7 @@ nsPresContext::GetDefaultBackgroundImageRepeat(PRUint8* aRepeat)
NS_IMETHODIMP
nsPresContext::GetDefaultBackgroundImageOffset(nscoord* aX, nscoord* aY)
{
NS_PRECONDITION((nsnull != aX) && (nsnull != aY), "null ptr");
if (!aX || !aY) { return NS_ERROR_NULL_POINTER; }
NS_PRECONDITION(aX && aY, "null out param");
*aX = mDefaultBackgroundImageOffsetX;
*aY = mDefaultBackgroundImageOffsetY;
return NS_OK;
@ -1134,8 +1120,7 @@ nsPresContext::GetDefaultBackgroundImageOffset(nscoord* aX, nscoord* aY)
NS_IMETHODIMP
nsPresContext::GetDefaultBackgroundImageAttachment(PRUint8* aAttachment)
{
NS_PRECONDITION(nsnull != aAttachment, "null ptr");
if (nsnull == aAttachment) { return NS_ERROR_NULL_POINTER; }
NS_PRECONDITION(aAttachment, "null out param");
*aAttachment = mDefaultBackgroundImageAttachment;
return NS_OK;
}
@ -1143,23 +1128,17 @@ nsPresContext::GetDefaultBackgroundImageAttachment(PRUint8* aAttachment)
NS_IMETHODIMP
nsPresContext::GetDefaultLinkColor(nscolor* aColor)
{
NS_PRECONDITION(nsnull != aColor, "null argument");
if (aColor) {
*aColor = mLinkColor;
return NS_OK;
}
return NS_ERROR_NULL_POINTER;
NS_PRECONDITION(aColor, "null out param");
*aColor = mLinkColor;
return NS_OK;
}
NS_IMETHODIMP
nsPresContext::GetDefaultVisitedLinkColor(nscolor* aColor)
{
NS_PRECONDITION(nsnull != aColor, "null argument");
if (aColor) {
*aColor = mVisitedLinkColor;
return NS_OK;
}
return NS_ERROR_NULL_POINTER;
NS_PRECONDITION(aColor, "null out param");
*aColor = mVisitedLinkColor;
return NS_OK;
}
@ -1182,35 +1161,26 @@ nsPresContext::GetUseFocusColors(PRBool& aUseFocusColors)
NS_IMETHODIMP
nsPresContext::GetFocusTextColor(nscolor* aColor)
{
NS_PRECONDITION(nsnull != aColor, "null argument");
if (aColor) {
*aColor = mFocusTextColor;
return NS_OK;
}
return NS_ERROR_NULL_POINTER;
NS_PRECONDITION(aColor, "null out param");
*aColor = mFocusTextColor;
return NS_OK;
}
NS_IMETHODIMP
nsPresContext::GetFocusBackgroundColor(nscolor* aColor)
{
NS_PRECONDITION(nsnull != aColor, "null argument");
if (aColor) {
*aColor = mFocusBackgroundColor;
return NS_OK;
}
return NS_ERROR_NULL_POINTER;
NS_PRECONDITION(aColor, "null out param");
*aColor = mFocusBackgroundColor;
return NS_OK;
}
NS_IMETHODIMP
nsPresContext::GetFocusRingWidth(PRUint8 *aFocusRingWidth)
{
NS_PRECONDITION(nsnull != aFocusRingWidth, "null argument");
if (aFocusRingWidth) {
*aFocusRingWidth = mFocusRingWidth;
return NS_OK;
}
return NS_ERROR_NULL_POINTER;
NS_PRECONDITION(aFocusRingWidth, "null out param");
*aFocusRingWidth = mFocusRingWidth;
return NS_OK;
}
@ -1288,10 +1258,7 @@ nsPresContext::SetVisibleArea(const nsRect& r)
NS_IMETHODIMP
nsPresContext::GetPixelsToTwips(float* aResult) const
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
float p2t = 1.0f;
if (mDeviceContext) {
@ -1304,10 +1271,7 @@ nsPresContext::GetPixelsToTwips(float* aResult) const
NS_IMETHODIMP
nsPresContext::GetTwipsToPixels(float* aResult) const
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
float app2dev = 1.0f;
if (mDeviceContext) {
@ -1320,10 +1284,7 @@ nsPresContext::GetTwipsToPixels(float* aResult) const
NS_IMETHODIMP
nsPresContext::GetScaledPixelsToTwips(float* aResult) const
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
float scale = 1.0f;
if (mDeviceContext)
@ -1340,10 +1301,7 @@ nsPresContext::GetScaledPixelsToTwips(float* aResult) const
NS_IMETHODIMP
nsPresContext::GetDeviceContext(nsIDeviceContext** aResult) const
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mDeviceContext;
NS_IF_ADDREF(*aResult);
return NS_OK;
@ -1429,10 +1387,7 @@ nsPresContext::SetLinkHandler(nsILinkHandler* aHandler)
NS_IMETHODIMP
nsPresContext::GetLinkHandler(nsILinkHandler** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mLinkHandler;
NS_IF_ADDREF(mLinkHandler);
return NS_OK;
@ -1451,10 +1406,7 @@ nsPresContext::SetContainer(nsISupports* aHandler)
NS_IMETHODIMP
nsPresContext::GetContainer(nsISupports** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mContainer;
NS_IF_ADDREF(mContainer);
return NS_OK;
@ -1619,7 +1571,7 @@ nsPresContext::GetBidiCharset(nsAWritableString &aCharSet)
NS_IMETHODIMP
nsPresContext::GetLanguage(nsILanguageAtom** aLanguage)
{
NS_ENSURE_ARG_POINTER(aLanguage);
NS_PRECONDITION(aLanguage, "null out param");
*aLanguage = mLanguage;
NS_IF_ADDREF(*aLanguage);
@ -1631,7 +1583,7 @@ NS_IMETHODIMP
nsPresContext::GetLanguageSpecificTransformType(
nsLanguageSpecificTransformType* aType)
{
NS_ENSURE_ARG_POINTER(aType);
NS_PRECONDITION(aType, "null out param");
*aType = mLanguageSpecificTransformType;
return NS_OK;
@ -1640,7 +1592,7 @@ nsPresContext::GetLanguageSpecificTransformType(
NS_IMETHODIMP
nsPresContext::IsRenderingOnlySelection(PRBool* aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
NS_PRECONDITION(aResult, "null out param");
*aResult = mIsRenderingOnlySelection;
return NS_OK;

Просмотреть файл

@ -199,6 +199,20 @@ public:
PRBool aForceUnique,
nsIStyleContext** aResult) = 0;
/**
* Resolve style for a non-element content node (i.e., one that is
* guaranteed not to match any rules). Eventually such nodes
* shouldn't have style contexts at all, but this at least prevents
* the rule matching.
*
* XXX This is temporary. It should go away when we stop creating
* style contexts for text nodes.
*/
NS_IMETHOD ResolveStyleContextForNonElement(
nsIStyleContext* aParentContext,
PRBool aForceUnique,
nsIStyleContext** aResult) = 0;
/**
* Resolve style for a pseudo frame within the given aParentContent & aParentContext.
* The tag should be lowercase and inclue the colon.

Просмотреть файл

@ -199,6 +199,20 @@ public:
PRBool aForceUnique,
nsIStyleContext** aResult) = 0;
/**
* Resolve style for a non-element content node (i.e., one that is
* guaranteed not to match any rules). Eventually such nodes
* shouldn't have style contexts at all, but this at least prevents
* the rule matching.
*
* XXX This is temporary. It should go away when we stop creating
* style contexts for text nodes.
*/
NS_IMETHOD ResolveStyleContextForNonElement(
nsIStyleContext* aParentContext,
PRBool aForceUnique,
nsIStyleContext** aResult) = 0;
/**
* Resolve style for a pseudo frame within the given aParentContent & aParentContext.
* The tag should be lowercase and inclue the colon.

Просмотреть файл

@ -125,7 +125,21 @@ public:
nsIStyleContext* aParentContext,
PRBool aForceUnique = PR_FALSE) = 0;
// get a style context for a pseudo-frame (ie: tag = NS_NewAtom(":first-line");
// Get a style context for a non-element (which no rules will match).
// Eventually, this should go away and we shouldn't even create style
// contexts for such content nodes. However, not doing any rule
// matching for them is a first step.
//
// XXX This is temporary. It should go away when we stop creating
// style contexts for text nodes.
//
virtual nsIStyleContext* ResolveStyleForNonElement(
nsIPresContext* aPresContext,
nsIStyleContext* aParentContext,
PRBool aForceUnique = PR_FALSE) = 0;
// get a style context for a pseudo-element (i.e.,
// |aPseudoTag == NS_NewAtom(":first-line")|;
virtual nsIStyleContext* ResolvePseudoStyleFor(nsIPresContext* aPresContext,
nsIContent* aParentContent,
nsIAtom* aPseudoTag,

Просмотреть файл

@ -199,6 +199,20 @@ public:
PRBool aForceUnique,
nsIStyleContext** aResult) = 0;
/**
* Resolve style for a non-element content node (i.e., one that is
* guaranteed not to match any rules). Eventually such nodes
* shouldn't have style contexts at all, but this at least prevents
* the rule matching.
*
* XXX This is temporary. It should go away when we stop creating
* style contexts for text nodes.
*/
NS_IMETHOD ResolveStyleContextForNonElement(
nsIStyleContext* aParentContext,
PRBool aForceUnique,
nsIStyleContext** aResult) = 0;
/**
* Resolve style for a pseudo frame within the given aParentContent & aParentContext.
* The tag should be lowercase and inclue the colon.

Просмотреть файл

@ -692,10 +692,7 @@ nsPresContext::SetShell(nsIPresShell* aShell)
NS_IMETHODIMP
nsPresContext::GetShell(nsIPresShell** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mShell;
NS_IF_ADDREF(mShell);
return NS_OK;
@ -750,10 +747,7 @@ nsPresContext::Observe(nsISupports* aSubject,
NS_IMETHODIMP
nsPresContext::GetCompatibilityMode(nsCompatibility* aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mCompatibilityMode;
return NS_OK;
}
@ -782,7 +776,7 @@ nsPresContext::SetCompatibilityMode(nsCompatibility aMode)
NS_IMETHODIMP
nsPresContext::GetWidgetRenderingMode(nsWidgetRendering* aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
NS_PRECONDITION(aResult, "null out param");
*aResult = mWidgetRenderingMode;
return NS_OK;
}
@ -798,7 +792,7 @@ nsPresContext::SetWidgetRenderingMode(nsWidgetRendering aMode)
NS_IMETHODIMP
nsPresContext::GetImageAnimationMode(nsImageAnimation* aModeResult)
{
NS_ENSURE_ARG_POINTER(aModeResult);
NS_PRECONDITION(aModeResult, "null out param");
*aModeResult = mImageAnimationMode;
return NS_OK;
}
@ -818,10 +812,7 @@ nsPresContext::SetImageAnimationMode(nsImageAnimation aMode)
NS_IMETHODIMP
nsPresContext::GetLookAndFeel(nsILookAndFeel** aLookAndFeel)
{
NS_PRECONDITION(nsnull != aLookAndFeel, "null ptr");
if (nsnull == aLookAndFeel) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aLookAndFeel, "null out param");
nsresult result = NS_OK;
if (! mLookAndFeel) {
mLookAndFeel = do_GetService(kLookAndFeelCID,&result);
@ -836,10 +827,7 @@ nsPresContext::GetLookAndFeel(nsILookAndFeel** aLookAndFeel)
NS_IMETHODIMP
nsPresContext::GetBaseURL(nsIURI** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mBaseURL;
NS_IF_ADDREF(*aResult);
return NS_OK;
@ -851,10 +839,7 @@ nsPresContext::ResolveStyleContextFor(nsIContent* aContent,
PRBool aForceUnique,
nsIStyleContext** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
nsIStyleContext* result = nsnull;
nsCOMPtr<nsIStyleSet> set;
@ -872,6 +857,27 @@ nsPresContext::ResolveStyleContextFor(nsIContent* aContent,
return rv;
}
NS_IMETHODIMP
nsPresContext::ResolveStyleContextForNonElement(
nsIStyleContext* aParentContext,
PRBool aForceUnique,
nsIStyleContext** aResult)
{
NS_PRECONDITION(aResult, "null out param");
nsIStyleContext* result = nsnull;
nsCOMPtr<nsIStyleSet> set;
nsresult rv = mShell->GetStyleSet(getter_AddRefs(set));
if (NS_SUCCEEDED(rv) && set) {
result = set->ResolveStyleForNonElement(this, aParentContext,
aForceUnique);
if (!result)
rv = NS_ERROR_OUT_OF_MEMORY;
}
*aResult = result;
return rv;
}
NS_IMETHODIMP
nsPresContext::ResolvePseudoStyleContextFor(nsIContent* aParentContent,
nsIAtom* aPseudoTag,
@ -891,10 +897,7 @@ nsPresContext::ResolvePseudoStyleWithComparator(nsIContent* aParentContent,
nsICSSPseudoComparator* aComparator,
nsIStyleContext** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
nsIStyleContext* result = nsnull;
nsCOMPtr<nsIStyleSet> set;
@ -919,10 +922,7 @@ nsPresContext::ProbePseudoStyleContextFor(nsIContent* aParentContent,
PRBool aForceUnique,
nsIStyleContext** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
nsIStyleContext* result = nsnull;
nsCOMPtr<nsIStyleSet> set;
@ -973,10 +973,7 @@ nsPresContext::FreeToShell(size_t aSize, void* aFreeChunk)
NS_IMETHODIMP
nsPresContext::GetMetricsFor(const nsFont& aFont, nsIFontMetrics** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
nsIFontMetrics* metrics = nsnull;
if (mDeviceContext) {
@ -1065,10 +1062,7 @@ nsPresContext::SetDefaultFont(const PRUint8 aFontID, const nsFont& aFont)
NS_IMETHODIMP
nsPresContext::GetFontScaler(PRInt32* aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mFontScaler;
return NS_OK;
@ -1084,10 +1078,7 @@ nsPresContext::SetFontScaler(PRInt32 aScaler)
NS_IMETHODIMP
nsPresContext::GetDefaultColor(nscolor* aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mDefaultColor;
return NS_OK;
@ -1096,10 +1087,7 @@ nsPresContext::GetDefaultColor(nscolor* aResult)
NS_IMETHODIMP
nsPresContext::GetDefaultBackgroundColor(nscolor* aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mDefaultBackgroundColor;
return NS_OK;
@ -1115,8 +1103,7 @@ nsPresContext::GetDefaultBackgroundImage(nsString& aImage)
NS_IMETHODIMP
nsPresContext::GetDefaultBackgroundImageRepeat(PRUint8* aRepeat)
{
NS_PRECONDITION(nsnull != aRepeat, "null ptr");
if (nsnull == aRepeat) { return NS_ERROR_NULL_POINTER; }
NS_PRECONDITION(aRepeat, "null out param");
*aRepeat = mDefaultBackgroundImageRepeat;
return NS_OK;
}
@ -1124,8 +1111,7 @@ nsPresContext::GetDefaultBackgroundImageRepeat(PRUint8* aRepeat)
NS_IMETHODIMP
nsPresContext::GetDefaultBackgroundImageOffset(nscoord* aX, nscoord* aY)
{
NS_PRECONDITION((nsnull != aX) && (nsnull != aY), "null ptr");
if (!aX || !aY) { return NS_ERROR_NULL_POINTER; }
NS_PRECONDITION(aX && aY, "null out param");
*aX = mDefaultBackgroundImageOffsetX;
*aY = mDefaultBackgroundImageOffsetY;
return NS_OK;
@ -1134,8 +1120,7 @@ nsPresContext::GetDefaultBackgroundImageOffset(nscoord* aX, nscoord* aY)
NS_IMETHODIMP
nsPresContext::GetDefaultBackgroundImageAttachment(PRUint8* aAttachment)
{
NS_PRECONDITION(nsnull != aAttachment, "null ptr");
if (nsnull == aAttachment) { return NS_ERROR_NULL_POINTER; }
NS_PRECONDITION(aAttachment, "null out param");
*aAttachment = mDefaultBackgroundImageAttachment;
return NS_OK;
}
@ -1143,23 +1128,17 @@ nsPresContext::GetDefaultBackgroundImageAttachment(PRUint8* aAttachment)
NS_IMETHODIMP
nsPresContext::GetDefaultLinkColor(nscolor* aColor)
{
NS_PRECONDITION(nsnull != aColor, "null argument");
if (aColor) {
*aColor = mLinkColor;
return NS_OK;
}
return NS_ERROR_NULL_POINTER;
NS_PRECONDITION(aColor, "null out param");
*aColor = mLinkColor;
return NS_OK;
}
NS_IMETHODIMP
nsPresContext::GetDefaultVisitedLinkColor(nscolor* aColor)
{
NS_PRECONDITION(nsnull != aColor, "null argument");
if (aColor) {
*aColor = mVisitedLinkColor;
return NS_OK;
}
return NS_ERROR_NULL_POINTER;
NS_PRECONDITION(aColor, "null out param");
*aColor = mVisitedLinkColor;
return NS_OK;
}
@ -1182,35 +1161,26 @@ nsPresContext::GetUseFocusColors(PRBool& aUseFocusColors)
NS_IMETHODIMP
nsPresContext::GetFocusTextColor(nscolor* aColor)
{
NS_PRECONDITION(nsnull != aColor, "null argument");
if (aColor) {
*aColor = mFocusTextColor;
return NS_OK;
}
return NS_ERROR_NULL_POINTER;
NS_PRECONDITION(aColor, "null out param");
*aColor = mFocusTextColor;
return NS_OK;
}
NS_IMETHODIMP
nsPresContext::GetFocusBackgroundColor(nscolor* aColor)
{
NS_PRECONDITION(nsnull != aColor, "null argument");
if (aColor) {
*aColor = mFocusBackgroundColor;
return NS_OK;
}
return NS_ERROR_NULL_POINTER;
NS_PRECONDITION(aColor, "null out param");
*aColor = mFocusBackgroundColor;
return NS_OK;
}
NS_IMETHODIMP
nsPresContext::GetFocusRingWidth(PRUint8 *aFocusRingWidth)
{
NS_PRECONDITION(nsnull != aFocusRingWidth, "null argument");
if (aFocusRingWidth) {
*aFocusRingWidth = mFocusRingWidth;
return NS_OK;
}
return NS_ERROR_NULL_POINTER;
NS_PRECONDITION(aFocusRingWidth, "null out param");
*aFocusRingWidth = mFocusRingWidth;
return NS_OK;
}
@ -1288,10 +1258,7 @@ nsPresContext::SetVisibleArea(const nsRect& r)
NS_IMETHODIMP
nsPresContext::GetPixelsToTwips(float* aResult) const
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
float p2t = 1.0f;
if (mDeviceContext) {
@ -1304,10 +1271,7 @@ nsPresContext::GetPixelsToTwips(float* aResult) const
NS_IMETHODIMP
nsPresContext::GetTwipsToPixels(float* aResult) const
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
float app2dev = 1.0f;
if (mDeviceContext) {
@ -1320,10 +1284,7 @@ nsPresContext::GetTwipsToPixels(float* aResult) const
NS_IMETHODIMP
nsPresContext::GetScaledPixelsToTwips(float* aResult) const
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
float scale = 1.0f;
if (mDeviceContext)
@ -1340,10 +1301,7 @@ nsPresContext::GetScaledPixelsToTwips(float* aResult) const
NS_IMETHODIMP
nsPresContext::GetDeviceContext(nsIDeviceContext** aResult) const
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mDeviceContext;
NS_IF_ADDREF(*aResult);
return NS_OK;
@ -1429,10 +1387,7 @@ nsPresContext::SetLinkHandler(nsILinkHandler* aHandler)
NS_IMETHODIMP
nsPresContext::GetLinkHandler(nsILinkHandler** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mLinkHandler;
NS_IF_ADDREF(mLinkHandler);
return NS_OK;
@ -1451,10 +1406,7 @@ nsPresContext::SetContainer(nsISupports* aHandler)
NS_IMETHODIMP
nsPresContext::GetContainer(nsISupports** aResult)
{
NS_PRECONDITION(nsnull != aResult, "null ptr");
if (nsnull == aResult) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aResult, "null out param");
*aResult = mContainer;
NS_IF_ADDREF(mContainer);
return NS_OK;
@ -1619,7 +1571,7 @@ nsPresContext::GetBidiCharset(nsAWritableString &aCharSet)
NS_IMETHODIMP
nsPresContext::GetLanguage(nsILanguageAtom** aLanguage)
{
NS_ENSURE_ARG_POINTER(aLanguage);
NS_PRECONDITION(aLanguage, "null out param");
*aLanguage = mLanguage;
NS_IF_ADDREF(*aLanguage);
@ -1631,7 +1583,7 @@ NS_IMETHODIMP
nsPresContext::GetLanguageSpecificTransformType(
nsLanguageSpecificTransformType* aType)
{
NS_ENSURE_ARG_POINTER(aType);
NS_PRECONDITION(aType, "null out param");
*aType = mLanguageSpecificTransformType;
return NS_OK;
@ -1640,7 +1592,7 @@ nsPresContext::GetLanguageSpecificTransformType(
NS_IMETHODIMP
nsPresContext::IsRenderingOnlySelection(PRBool* aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
NS_PRECONDITION(aResult, "null out param");
*aResult = mIsRenderingOnlySelection;
return NS_OK;

Просмотреть файл

@ -2269,11 +2269,10 @@ nsComboboxControlFrame::CreateDisplayFrame(nsIPresContext* aPresContext)
if (NS_FAILED(rv)) { return rv; }
if (!mTextFrame) { return NS_ERROR_NULL_POINTER; }
nsCOMPtr<nsIStyleContext> textStyleContext;
rv = aPresContext->ResolvePseudoStyleContextFor(mContent,
nsHTMLAtoms::mozDisplayComboboxControlFrame,
styleContext,
PR_FALSE,
getter_AddRefs(textStyleContext));
rv = aPresContext->ResolveStyleContextForNonElement(
styleContext,
PR_FALSE,
getter_AddRefs(textStyleContext));
if (NS_FAILED(rv)) { return rv; }
if (!textStyleContext) { return NS_ERROR_NULL_POINTER; }
nsCOMPtr<nsIContent> content(do_QueryInterface(mDisplayContent));
@ -2325,11 +2324,10 @@ nsComboboxControlFrame::CreateAnonymousContent(nsIPresContext* aPresContext,
// Add a child text content node for the label
nsresult result;
nsCOMPtr<nsIContent> labelContent(do_CreateInstance(kTextNodeCID,&result));
nsAutoString value; value.AssignWithConversion("X");
if (NS_SUCCEEDED(result) && labelContent) {
// set the value of the text node
mDisplayContent = do_QueryInterface(labelContent);
mDisplayContent->SetText(value.get(), value.Length(), PR_TRUE);
mDisplayContent->SetText(NS_LITERAL_STRING("X"), PR_TRUE);
nsCOMPtr<nsIDocument> doc;
mContent->GetDocument(*getter_AddRefs(doc));
@ -2400,7 +2398,7 @@ nsComboboxControlFrame::CreateFrameFor(nsIPresContext* aPresContext,
// create the style context for the anonymous block frame
nsCOMPtr<nsIStyleContext> styleContext;
rv = aPresContext->ResolvePseudoStyleContextFor(content,
rv = aPresContext->ResolvePseudoStyleContextFor(mContent,
nsHTMLAtoms::mozDisplayComboboxControlFrame,
mStyleContext,
PR_FALSE,
@ -2413,11 +2411,10 @@ nsComboboxControlFrame::CreateFrameFor(nsIPresContext* aPresContext,
if (NS_FAILED(rv)) { return rv; }
if (!mTextFrame) { return NS_ERROR_NULL_POINTER; }
nsCOMPtr<nsIStyleContext> textStyleContext;
rv = aPresContext->ResolvePseudoStyleContextFor(content,
nsHTMLAtoms::mozDisplayComboboxControlFrame,//nsHTMLAtoms::textPseudo,
styleContext,
PR_FALSE,
getter_AddRefs(textStyleContext));
rv = aPresContext->ResolveStyleContextForNonElement(
styleContext,
PR_FALSE,
getter_AddRefs(textStyleContext));
if (NS_FAILED(rv)) { return rv; }
if (!textStyleContext) { return NS_ERROR_NULL_POINTER; }

Просмотреть файл

@ -481,11 +481,10 @@ nsGfxButtonControlFrame::CreateFrameFor(nsIPresContext* aPresContext,
if (NS_FAILED(rv)) { return rv; }
if (!newFrame) { return NS_ERROR_NULL_POINTER; }
nsCOMPtr<nsIStyleContext> textStyleContext;
rv = aPresContext->ResolvePseudoStyleContextFor(content,
nsHTMLAtoms::textPseudo,
styleContext,
PR_FALSE,
getter_AddRefs(textStyleContext));
rv = aPresContext->ResolveStyleContextForNonElement(
styleContext,
PR_FALSE,
getter_AddRefs(textStyleContext));
if (NS_FAILED(rv)) { return rv; }
if (!textStyleContext) { return NS_ERROR_NULL_POINTER; }

Просмотреть файл

@ -332,31 +332,30 @@ nsBlockFrame::Destroy(nsIPresContext* aPresContext)
NS_IMETHODIMP
nsBlockFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
{
if (NULL == aInstancePtr) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aInstancePtr, "null out param");
if (aIID.Equals(kBlockFrameCID)) {
nsBlockFrame* tmp = this;
*aInstancePtr = (void*) tmp;
*aInstancePtr = NS_STATIC_CAST(void*, NS_STATIC_CAST(nsBlockFrame*, this));
return NS_OK;
}
if ( aIID.Equals(NS_GET_IID(nsILineIterator)) ||
aIID.Equals(NS_GET_IID(nsILineIteratorNavigator)) )
if (aIID.Equals(NS_GET_IID(nsILineIterator)) ||
aIID.Equals(NS_GET_IID(nsILineIteratorNavigator)))
{
nsLineIterator* it = new nsLineIterator;
if (!it) {
*aInstancePtr = nsnull;
return NS_ERROR_OUT_OF_MEMORY;
}
NS_ADDREF(it); // reference passed to caller
const nsStyleVisibility* visibility;
GetStyleData(eStyleStruct_Visibility, (const nsStyleStruct*&) visibility);
nsresult rv = it->Init(mLines,
visibility->mDirection == NS_STYLE_DIRECTION_RTL);
if (NS_FAILED(rv)) {
delete it;
NS_RELEASE(it);
return rv;
}
NS_ADDREF((nsILineIterator *) (*aInstancePtr = (void *) it));
*aInstancePtr = NS_STATIC_CAST(void*,
NS_STATIC_CAST(nsILineIteratorNavigator*, it));
return NS_OK;
}
return nsBlockFrameSuper::QueryInterface(aIID, aInstancePtr);
@ -1400,6 +1399,7 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
// If we're requested to update our maximum width, then compute it
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
// We need to add in for the right border/padding
// XXXldb Why right and not left?
aMetrics.mMaximumWidth = aState.mMaximumWidth + borderPadding.right;
#ifdef NOISY_MAXIMUM_WIDTH
printf("nsBlockFrame::ComputeFinalSize block %p setting aMetrics.mMaximumWidth to %d\n", this, aMetrics.mMaximumWidth);
@ -4060,6 +4060,7 @@ nsBlockFrame::PlaceLine(nsBlockReflowState& aState,
nsRect combinedArea;
aLineLayout.RelativePositionFrames(combinedArea); // XXXldb This returned width as -15, 2001-06-12, Bugzilla
// XXX Changing the combined area here seems wrong. - LDB
aLine->SetCombinedArea(combinedArea);
if (addedBullet) {
aLineLayout.RemoveBulletFrame(mBullet);
@ -5977,6 +5978,16 @@ nsBlockFrame::Init(nsIPresContext* aPresContext,
nsIStyleContext*
nsBlockFrame::GetFirstLetterStyle(nsIPresContext* aPresContext)
{
// This check is here because nsComboboxControlFrame creates
// nsBlockFrame objects that have an |mContent| pointing to a text
// node. This check ensures we don't try to do selector matching on
// that text node.
//
// XXX This check should go away once we fix nsComboboxControlFrame.
//
if (!mContent->IsContentOfType(nsIContent::eELEMENT))
return nsnull;
nsIStyleContext* fls;
aPresContext->ProbePseudoStyleContextFor(mContent,
nsHTMLAtoms::firstLetterPseudo,

Просмотреть файл

@ -332,31 +332,30 @@ nsBlockFrame::Destroy(nsIPresContext* aPresContext)
NS_IMETHODIMP
nsBlockFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
{
if (NULL == aInstancePtr) {
return NS_ERROR_NULL_POINTER;
}
NS_PRECONDITION(aInstancePtr, "null out param");
if (aIID.Equals(kBlockFrameCID)) {
nsBlockFrame* tmp = this;
*aInstancePtr = (void*) tmp;
*aInstancePtr = NS_STATIC_CAST(void*, NS_STATIC_CAST(nsBlockFrame*, this));
return NS_OK;
}
if ( aIID.Equals(NS_GET_IID(nsILineIterator)) ||
aIID.Equals(NS_GET_IID(nsILineIteratorNavigator)) )
if (aIID.Equals(NS_GET_IID(nsILineIterator)) ||
aIID.Equals(NS_GET_IID(nsILineIteratorNavigator)))
{
nsLineIterator* it = new nsLineIterator;
if (!it) {
*aInstancePtr = nsnull;
return NS_ERROR_OUT_OF_MEMORY;
}
NS_ADDREF(it); // reference passed to caller
const nsStyleVisibility* visibility;
GetStyleData(eStyleStruct_Visibility, (const nsStyleStruct*&) visibility);
nsresult rv = it->Init(mLines,
visibility->mDirection == NS_STYLE_DIRECTION_RTL);
if (NS_FAILED(rv)) {
delete it;
NS_RELEASE(it);
return rv;
}
NS_ADDREF((nsILineIterator *) (*aInstancePtr = (void *) it));
*aInstancePtr = NS_STATIC_CAST(void*,
NS_STATIC_CAST(nsILineIteratorNavigator*, it));
return NS_OK;
}
return nsBlockFrameSuper::QueryInterface(aIID, aInstancePtr);
@ -1400,6 +1399,7 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
// If we're requested to update our maximum width, then compute it
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
// We need to add in for the right border/padding
// XXXldb Why right and not left?
aMetrics.mMaximumWidth = aState.mMaximumWidth + borderPadding.right;
#ifdef NOISY_MAXIMUM_WIDTH
printf("nsBlockFrame::ComputeFinalSize block %p setting aMetrics.mMaximumWidth to %d\n", this, aMetrics.mMaximumWidth);
@ -4060,6 +4060,7 @@ nsBlockFrame::PlaceLine(nsBlockReflowState& aState,
nsRect combinedArea;
aLineLayout.RelativePositionFrames(combinedArea); // XXXldb This returned width as -15, 2001-06-12, Bugzilla
// XXX Changing the combined area here seems wrong. - LDB
aLine->SetCombinedArea(combinedArea);
if (addedBullet) {
aLineLayout.RemoveBulletFrame(mBullet);
@ -5977,6 +5978,16 @@ nsBlockFrame::Init(nsIPresContext* aPresContext,
nsIStyleContext*
nsBlockFrame::GetFirstLetterStyle(nsIPresContext* aPresContext)
{
// This check is here because nsComboboxControlFrame creates
// nsBlockFrame objects that have an |mContent| pointing to a text
// node. This check ensures we don't try to do selector matching on
// that text node.
//
// XXX This check should go away once we fix nsComboboxControlFrame.
//
if (!mContent->IsContentOfType(nsIContent::eELEMENT))
return nsnull;
nsIStyleContext* fls;
aPresContext->ProbePseudoStyleContextFor(mContent,
nsHTMLAtoms::firstLetterPseudo,

Просмотреть файл

@ -1631,7 +1631,13 @@ FrameManager::ReResolveStyleContext(nsIPresContext* aPresContext,
}
else {
NS_ASSERTION(localContent, "non pseudo-element frame without content node");
aPresContext->ResolveStyleContextFor(content, aParentContext, PR_TRUE, &newContext);
if (content->IsContentOfType(nsIContent::eELEMENT)) {
aPresContext->ResolveStyleContextFor(content, aParentContext,
PR_TRUE, &newContext);
} else {
aPresContext->ResolveStyleContextForNonElement(aParentContext,
PR_TRUE, &newContext);
}
}
NS_ASSERTION(newContext, "failed to get new style context");
if (newContext) {
@ -1845,7 +1851,13 @@ FrameManager::ReResolveStyleContext(nsIPresContext* aPresContext,
}
else {
NS_ASSERTION(localContent, "non pseudo-element frame without content node");
aPresContext->ResolveStyleContextFor(content, aParentContext, PR_TRUE, &newContext);
if (content->IsContentOfType(nsIContent::eELEMENT)) {
aPresContext->ResolveStyleContextFor(content, aParentContext,
PR_TRUE, &newContext);
} else {
aPresContext->ResolveStyleContextForNonElement(aParentContext,
PR_TRUE, &newContext);
}
}
NS_ASSERTION(newContext, "failed to get new style context");
if (newContext) {
@ -1927,13 +1939,20 @@ FrameManager::ReResolveStyleContext(nsIPresContext* aPresContext,
nsIStyleContext* undisplayedContext = nsnull;
undisplayed->mStyle->GetPseudoType(pseudoTag);
if (undisplayed->mContent && pseudoTag == nsnull) { // child content
aPresContext->ResolveStyleContextFor(undisplayed->mContent, newContext,
PR_TRUE, &undisplayedContext);
if (undisplayed->mContent->IsContentOfType(nsIContent::eELEMENT)) {
aPresContext->ResolveStyleContextFor(undisplayed->mContent,
newContext,
PR_TRUE, &undisplayedContext);
} else {
aPresContext->ResolveStyleContextForNonElement(newContext,
PR_TRUE, &undisplayedContext);
}
}
else { // pseudo element
NS_ASSERTION(pseudoTag, "pseudo element without tag");
aPresContext->ResolvePseudoStyleContextFor(localContent, pseudoTag, newContext, PR_FALSE,
&undisplayedContext);
aPresContext->ResolvePseudoStyleContextFor(localContent, pseudoTag,
newContext, PR_FALSE,
&undisplayedContext);
}
NS_IF_RELEASE(pseudoTag);
if (undisplayedContext) {

Просмотреть файл

@ -217,7 +217,7 @@ input[disabled],
textarea[disabled],
option[disabled],
select[disabled],
select[disabled] > :-moz-display-comboboxcontrol-frame {
select[disabled]:-moz-display-comboboxcontrol-frame {
color: GrayText;
cursor: default;
}

Просмотреть файл

@ -432,7 +432,7 @@ noframes {
/* hidden elements */
area, base, basefont, head, meta, script, style, title,
noembed, noscript, param, *|*:-moz-comment, *|*:-moz-pi {
noembed, noscript, param {
display: none;
}

Просмотреть файл

@ -2269,11 +2269,10 @@ nsComboboxControlFrame::CreateDisplayFrame(nsIPresContext* aPresContext)
if (NS_FAILED(rv)) { return rv; }
if (!mTextFrame) { return NS_ERROR_NULL_POINTER; }
nsCOMPtr<nsIStyleContext> textStyleContext;
rv = aPresContext->ResolvePseudoStyleContextFor(mContent,
nsHTMLAtoms::mozDisplayComboboxControlFrame,
styleContext,
PR_FALSE,
getter_AddRefs(textStyleContext));
rv = aPresContext->ResolveStyleContextForNonElement(
styleContext,
PR_FALSE,
getter_AddRefs(textStyleContext));
if (NS_FAILED(rv)) { return rv; }
if (!textStyleContext) { return NS_ERROR_NULL_POINTER; }
nsCOMPtr<nsIContent> content(do_QueryInterface(mDisplayContent));
@ -2325,11 +2324,10 @@ nsComboboxControlFrame::CreateAnonymousContent(nsIPresContext* aPresContext,
// Add a child text content node for the label
nsresult result;
nsCOMPtr<nsIContent> labelContent(do_CreateInstance(kTextNodeCID,&result));
nsAutoString value; value.AssignWithConversion("X");
if (NS_SUCCEEDED(result) && labelContent) {
// set the value of the text node
mDisplayContent = do_QueryInterface(labelContent);
mDisplayContent->SetText(value.get(), value.Length(), PR_TRUE);
mDisplayContent->SetText(NS_LITERAL_STRING("X"), PR_TRUE);
nsCOMPtr<nsIDocument> doc;
mContent->GetDocument(*getter_AddRefs(doc));
@ -2400,7 +2398,7 @@ nsComboboxControlFrame::CreateFrameFor(nsIPresContext* aPresContext,
// create the style context for the anonymous block frame
nsCOMPtr<nsIStyleContext> styleContext;
rv = aPresContext->ResolvePseudoStyleContextFor(content,
rv = aPresContext->ResolvePseudoStyleContextFor(mContent,
nsHTMLAtoms::mozDisplayComboboxControlFrame,
mStyleContext,
PR_FALSE,
@ -2413,11 +2411,10 @@ nsComboboxControlFrame::CreateFrameFor(nsIPresContext* aPresContext,
if (NS_FAILED(rv)) { return rv; }
if (!mTextFrame) { return NS_ERROR_NULL_POINTER; }
nsCOMPtr<nsIStyleContext> textStyleContext;
rv = aPresContext->ResolvePseudoStyleContextFor(content,
nsHTMLAtoms::mozDisplayComboboxControlFrame,//nsHTMLAtoms::textPseudo,
styleContext,
PR_FALSE,
getter_AddRefs(textStyleContext));
rv = aPresContext->ResolveStyleContextForNonElement(
styleContext,
PR_FALSE,
getter_AddRefs(textStyleContext));
if (NS_FAILED(rv)) { return rv; }
if (!textStyleContext) { return NS_ERROR_NULL_POINTER; }

Просмотреть файл

@ -481,11 +481,10 @@ nsGfxButtonControlFrame::CreateFrameFor(nsIPresContext* aPresContext,
if (NS_FAILED(rv)) { return rv; }
if (!newFrame) { return NS_ERROR_NULL_POINTER; }
nsCOMPtr<nsIStyleContext> textStyleContext;
rv = aPresContext->ResolvePseudoStyleContextFor(content,
nsHTMLAtoms::textPseudo,
styleContext,
PR_FALSE,
getter_AddRefs(textStyleContext));
rv = aPresContext->ResolveStyleContextForNonElement(
styleContext,
PR_FALSE,
getter_AddRefs(textStyleContext));
if (NS_FAILED(rv)) { return rv; }
if (!textStyleContext) { return NS_ERROR_NULL_POINTER; }

Просмотреть файл

@ -1433,6 +1433,9 @@ nsCSSFrameConstructor::CreateGeneratedContentFrame(nsIPresShell* aPresShe
{
*aResult = nsnull; // initialize OUT parameter
if (!aContent->IsContentOfType(nsIContent::eELEMENT))
return PR_FALSE;
// Probe for the existence of the pseudo-element
nsCOMPtr<nsIStyleContext> pseudoStyleContext;
aPresContext->ProbePseudoStyleContextFor(aContent, aPseudoElement, aStyleContext,
@ -1476,9 +1479,9 @@ nsCSSFrameConstructor::CreateGeneratedContentFrame(nsIPresShell* aPresShe
// Create another pseudo style context to use for all the generated child
// frames
nsIStyleContext* textStyleContext;
aPresContext->ResolvePseudoStyleContextFor(aContent, nsHTMLAtoms::textPseudo,
pseudoStyleContext, PR_FALSE,
&textStyleContext);
aPresContext->ResolveStyleContextForNonElement(
pseudoStyleContext, PR_FALSE,
&textStyleContext);
// Now create content objects (and child frames) for each value of the
// 'content' property
@ -2937,8 +2940,12 @@ nsCSSFrameConstructor::TableProcessChildren(nsIPresShell* aPresShell,
iter != last;
++iter) {
nsCOMPtr<nsIContent> childContent = *iter;
if (childContent && NeedFrameFor(aParentFrame, childContent)) {
rv = TableProcessChild(aPresShell, aPresContext, aState, *childContent, aParentFrame,
if (childContent &&
(childContent->IsContentOfType(nsIContent::eELEMENT) ||
childContent->IsContentOfType(nsIContent::eTEXT)) &&
NeedFrameFor(aParentFrame, childContent)) {
rv = TableProcessChild(aPresShell, aPresContext, aState, childContent,
aContent, aParentFrame,
parentFrameType, parentStyleContext,
aTableCreator, aChildItems, aCaption);
}
@ -2958,7 +2965,8 @@ nsresult
nsCSSFrameConstructor::TableProcessChild(nsIPresShell* aPresShell,
nsIPresContext* aPresContext,
nsFrameConstructorState& aState,
nsIContent& aChildContent,
nsIContent* aChildContent,
nsIContent* aParentContent,
nsIFrame* aParentFrame,
nsIAtom* aParentFrameType,
nsIStyleContext* aParentStyleContext,
@ -2975,15 +2983,15 @@ nsCSSFrameConstructor::TableProcessChild(nsIPresShell* aPresShell,
nsCOMPtr<nsIStyleContext> childStyleContext;
// Resolve the style context and get its display
aPresContext->ResolveStyleContextFor(&aChildContent, aParentStyleContext, PR_FALSE,
getter_AddRefs(childStyleContext));
ResolveStyleContext(aPresContext, aParentFrame, aChildContent,
getter_AddRefs(childStyleContext));
const nsStyleDisplay* styleDisplay = (const nsStyleDisplay*)
childStyleContext->GetStyleData(eStyleStruct_Display);
switch (styleDisplay->mDisplay) {
case NS_STYLE_DISPLAY_TABLE:
nsIFrame* innerTableFrame;
rv = ConstructTableFrame(aPresShell, aPresContext, aState, &aChildContent, aParentFrame,
rv = ConstructTableFrame(aPresShell, aPresContext, aState, aChildContent, aParentFrame,
childStyleContext, aTableCreator, PR_FALSE, aChildItems,
childFrame, innerTableFrame, isPseudoParent);
break;
@ -2991,7 +2999,7 @@ nsCSSFrameConstructor::TableProcessChild(nsIPresShell* aPresShell,
case NS_STYLE_DISPLAY_TABLE_CAPTION:
if (!aCaption) { // only allow one caption
nsIFrame* parentFrame = GetOuterTableFrame(aParentFrame);
rv = ConstructTableCaptionFrame(aPresShell, aPresContext, aState, &aChildContent,
rv = ConstructTableCaptionFrame(aPresShell, aPresContext, aState, aChildContent,
parentFrame, childStyleContext, aTableCreator,
aChildItems, aCaption, isPseudoParent);
}
@ -2999,7 +3007,7 @@ nsCSSFrameConstructor::TableProcessChild(nsIPresShell* aPresShell,
break;
case NS_STYLE_DISPLAY_TABLE_COLUMN_GROUP:
rv = ConstructTableColGroupFrame(aPresShell, aPresContext, aState, &aChildContent,
rv = ConstructTableColGroupFrame(aPresShell, aPresContext, aState, aChildContent,
aParentFrame, childStyleContext, aTableCreator,
PR_FALSE, aChildItems, childFrame, isPseudoParent);
break;
@ -3007,19 +3015,19 @@ nsCSSFrameConstructor::TableProcessChild(nsIPresShell* aPresShell,
case NS_STYLE_DISPLAY_TABLE_HEADER_GROUP:
case NS_STYLE_DISPLAY_TABLE_FOOTER_GROUP:
case NS_STYLE_DISPLAY_TABLE_ROW_GROUP:
rv = ConstructTableRowGroupFrame(aPresShell, aPresContext, aState, &aChildContent,
rv = ConstructTableRowGroupFrame(aPresShell, aPresContext, aState, aChildContent,
aParentFrame, childStyleContext, aTableCreator,
PR_FALSE, aChildItems, childFrame, isPseudoParent);
break;
case NS_STYLE_DISPLAY_TABLE_ROW:
rv = ConstructTableRowFrame(aPresShell, aPresContext, aState, &aChildContent,
rv = ConstructTableRowFrame(aPresShell, aPresContext, aState, aChildContent,
aParentFrame, childStyleContext, aTableCreator,
PR_FALSE, aChildItems, childFrame, isPseudoParent);
break;
case NS_STYLE_DISPLAY_TABLE_COLUMN:
rv = ConstructTableColFrame(aPresShell, aPresContext, aState, &aChildContent,
rv = ConstructTableColFrame(aPresShell, aPresContext, aState, aChildContent,
aParentFrame, childStyleContext, aTableCreator,
PR_FALSE, aChildItems, childFrame, isPseudoParent);
break;
@ -3027,13 +3035,16 @@ nsCSSFrameConstructor::TableProcessChild(nsIPresShell* aPresShell,
case NS_STYLE_DISPLAY_TABLE_CELL:
nsIFrame* innerCell;
rv = ConstructTableCellFrame(aPresShell, aPresContext, aState, &aChildContent,
rv = ConstructTableCellFrame(aPresShell, aPresContext, aState, aChildContent,
aParentFrame, childStyleContext, aTableCreator, PR_FALSE,
aChildItems, childFrame, innerCell, isPseudoParent);
break;
case NS_STYLE_DISPLAY_NONE:
break;
default:
rv = ConstructTableForeignFrame(aPresShell, aPresContext, aState, &aChildContent,
rv = ConstructTableForeignFrame(aPresShell, aPresContext, aState, aChildContent,
aParentFrame, childStyleContext, aTableCreator,
aChildItems, childFrame, isPseudoParent);
break;
@ -3230,9 +3241,8 @@ nsCSSFrameConstructor::ConstructDocElementFrame(nsIPresShell* aPresShell,
}
if (resolveStyle) {
nsCOMPtr<nsIAtom> tag;
aDocElement->GetTag(*getter_AddRefs(tag));
rv = ResolveStyleContext(aPresContext, aParentFrame, aDocElement, tag, getter_AddRefs(styleContext));
rv = ResolveStyleContext(aPresContext, aParentFrame, aDocElement,
getter_AddRefs(styleContext));
if (NS_FAILED(rv))
return rv;
}
@ -6506,7 +6516,6 @@ nsresult
nsCSSFrameConstructor::ResolveStyleContext(nsIPresContext* aPresContext,
nsIFrame* aParentFrame,
nsIContent* aContent,
nsIAtom* aTag,
nsIStyleContext** aStyleContext)
{
nsresult rv = NS_OK;
@ -6515,43 +6524,23 @@ nsCSSFrameConstructor::ResolveStyleContext(nsIPresContext* aPresContext,
nsCOMPtr<nsIStyleContext> parentStyleContext;
aParentFrame->GetStyleContext(getter_AddRefs(parentStyleContext));
if (nsLayoutAtoms::textTagName == aTag) {
// Use a special pseudo element style context for text
nsCOMPtr<nsIContent> parentContent;
if (nsnull != aParentFrame) {
aParentFrame->GetContent(getter_AddRefs(parentContent));
}
rv = aPresContext->ResolvePseudoStyleContextFor(parentContent,
nsHTMLAtoms::textPseudo,
parentStyleContext,
PR_FALSE,
aStyleContext);
} else if (nsLayoutAtoms::commentTagName == aTag) {
// Use a special pseudo element style context for comments
nsCOMPtr<nsIContent> parentContent;
if (nsnull != aParentFrame) {
aParentFrame->GetContent(getter_AddRefs(parentContent));
}
rv = aPresContext->ResolvePseudoStyleContextFor(parentContent,
nsHTMLAtoms::commentPseudo,
parentStyleContext,
PR_FALSE,
aStyleContext);
} else if (nsLayoutAtoms::processingInstructionTagName == aTag) {
// Use a special pseudo element style context for comments
nsCOMPtr<nsIContent> parentContent;
if (nsnull != aParentFrame) {
aParentFrame->GetContent(getter_AddRefs(parentContent));
}
rv = aPresContext->ResolvePseudoStyleContextFor(parentContent,
nsHTMLAtoms::processingInstructionPseudo,
parentStyleContext,
PR_FALSE,
aStyleContext);
} else {
if (aContent->IsContentOfType(nsIContent::eELEMENT)) {
rv = aPresContext->ResolveStyleContextFor(aContent, parentStyleContext,
PR_FALSE,
aStyleContext);
} else {
#ifdef DEBUG
{
nsCOMPtr<nsIAtom> tag;
aContent->GetTag(*getter_AddRefs(tag));
NS_ASSERTION(tag == nsLayoutAtoms::textTagName,
"shouldn't waste time creating style contexts for "
"comments and processing instructions");
}
#endif
rv = aPresContext->ResolveStyleContextForNonElement(parentStyleContext,
PR_FALSE,
aStyleContext);
}
return rv;
}
@ -6926,8 +6915,14 @@ nsCSSFrameConstructor::ConstructFrame(nsIPresShell* aPresShell,
nsCOMPtr<nsIAtom> tag;
aContent->GetTag(*getter_AddRefs(tag));
// never create frames for comments on PIs
if (tag == nsLayoutAtoms::commentTagName ||
tag == nsLayoutAtoms::processingInstructionTagName)
return rv;
nsCOMPtr<nsIStyleContext> styleContext;
rv = ResolveStyleContext(aPresContext, aParentFrame, aContent, tag, getter_AddRefs(styleContext));
rv = ResolveStyleContext(aPresContext, aParentFrame, aContent,
getter_AddRefs(styleContext));
if (NS_SUCCEEDED(rv)) {
@ -6984,7 +6979,8 @@ nsCSSFrameConstructor::ConstructFrameInternal( nsIPresShell* aPresShe
return NS_OK;
if (resolveStyle) {
rv = ResolveStyleContext(aPresContext, aParentFrame, aContent, aTag, getter_AddRefs(styleContext));
rv = ResolveStyleContext(aPresContext, aParentFrame, aContent,
getter_AddRefs(styleContext));
if (NS_FAILED(rv))
return rv;
}
@ -8294,6 +8290,9 @@ nsCSSFrameConstructor::ContentInserted(nsIPresContext* aPresContext,
PRInt32 aIndexInContainer,
nsILayoutHistoryState* aFrameState)
{
// XXXldb Do we need to re-resolve style to handle the CSS2 + combinator and
// the :empty pseudo-class?
#ifdef DEBUG
if (gNoisyContentUpdates) {
printf("nsCSSFrameConstructor::ContentInserted container=%p child=%p index=%d\n",
@ -8360,9 +8359,8 @@ nsCSSFrameConstructor::ContentInserted(nsIPresContext* aPresContext,
// to check it for subsequent display changes (e.g., when you next
// reopen).
nsCOMPtr<nsIStyleContext> styleContext;
nsCOMPtr<nsIAtom> tagName;
aChild->GetTag(*getter_AddRefs(tagName));
ResolveStyleContext(aPresContext, innerFrame, aChild, tagName, getter_AddRefs(styleContext));
ResolveStyleContext(aPresContext, innerFrame, aChild,
getter_AddRefs(styleContext));
// Pre-check for display "none" - if we find that, don't reflow at all.
const nsStyleDisplay* display = (const nsStyleDisplay*)
@ -8998,6 +8996,9 @@ nsCSSFrameConstructor::ContentRemoved(nsIPresContext* aPresContext,
nsIContent* aChild,
PRInt32 aIndexInContainer)
{
// XXXldb Do we need to re-resolve style to handle the CSS2 + combinator and
// the :empty pseudo-class?
#ifdef DEBUG
if (gNoisyContentUpdates) {
printf("nsCSSFrameConstructor::ContentRemoved container=%p child=%p index=%d\n",
@ -10295,9 +10296,8 @@ nsCSSFrameConstructor::ConstructAlternateFrame(nsIPresShell* aPresShell,
nsIStyleContext* textStyleContext;
NS_NewTextFrame(aPresShell, &textFrame);
aPresContext->ResolvePseudoStyleContextFor(aContent, nsHTMLAtoms::textPseudo,
aStyleContext, PR_FALSE,
&textStyleContext);
aPresContext->ResolveStyleContextForNonElement(aStyleContext, PR_FALSE,
&textStyleContext);
textFrame->Init(aPresContext, altTextContent, containerFrame,
textStyleContext, nsnull);
@ -12528,15 +12528,9 @@ nsCSSFrameConstructor::CreateTreeWidgetContent(nsIPresContext* aPresContext,
GetFloaterContainingBlock(aPresContext, aParentFrame),
mTempFrameTreeState);
// Get the element's tag
nsCOMPtr<nsIAtom> tag;
aChild->GetTag(*getter_AddRefs(tag));
PRInt32 namespaceID;
aChild->GetNameSpaceID(namespaceID);
nsCOMPtr<nsIStyleContext> styleContext;
rv = ResolveStyleContext(aPresContext, aParentFrame, aChild, tag, getter_AddRefs(styleContext));
rv = ResolveStyleContext(aPresContext, aParentFrame, aChild,
getter_AddRefs(styleContext));
if (NS_SUCCEEDED(rv)) {
// Pre-check for display "none" - only if we find that, do we create
@ -12550,6 +12544,12 @@ nsCSSFrameConstructor::CreateTreeWidgetContent(nsIPresContext* aPresContext,
}
}
nsCOMPtr<nsIAtom> tag;
aChild->GetTag(*getter_AddRefs(tag));
PRInt32 namespaceID;
aChild->GetNameSpaceID(namespaceID);
rv = ConstructFrameInternal(shell, aPresContext, state, aChild, aParentFrame, tag, namespaceID,
styleContext, frameItems, PR_FALSE);

Просмотреть файл

@ -192,7 +192,6 @@ protected:
nsresult ResolveStyleContext(nsIPresContext* aPresContext,
nsIFrame* aParentFrame,
nsIContent* aContent,
nsIAtom* aTag,
nsIStyleContext** aStyleContext);
nsresult ConstructFrame(nsIPresShell* aPresShell,
@ -427,7 +426,8 @@ protected:
nsresult TableProcessChild(nsIPresShell* aPresShell,
nsIPresContext* aPresContext,
nsFrameConstructorState& aState,
nsIContent& aChildContent,
nsIContent* aChildContent,
nsIContent* aParentContent,
nsIFrame* aParentFrame,
nsIAtom* aParentFrameType,
nsIStyleContext* aParentStyleContext,

Просмотреть файл

@ -217,7 +217,7 @@ input[disabled],
textarea[disabled],
option[disabled],
select[disabled],
select[disabled] > :-moz-display-comboboxcontrol-frame {
select[disabled]:-moz-display-comboboxcontrol-frame {
color: GrayText;
cursor: default;
}

Просмотреть файл

@ -432,7 +432,7 @@ noframes {
/* hidden elements */
area, base, basefont, head, meta, script, style, title,
noembed, noscript, param, *|*:-moz-comment, *|*:-moz-pi {
noembed, noscript, param {
display: none;
}

Просмотреть файл

@ -3226,7 +3226,8 @@ MOZ_DECL_CTOR_COUNTER(SelectorMatchesData)
struct SelectorMatchesData {
SelectorMatchesData(nsIPresContext* aPresContext, nsIContent* aContent,
nsRuleWalker* aRuleWalker, nsCompatibility* aCompat = nsnull);
nsRuleWalker* aRuleWalker,
nsCompatibility* aCompat = nsnull);
virtual ~SelectorMatchesData()
{
@ -3274,12 +3275,16 @@ struct SelectorMatchesData {
SelectorMatchesData* mParentData;
};
SelectorMatchesData::SelectorMatchesData(nsIPresContext* aPresContext, nsIContent* aContent,
nsRuleWalker* aRuleWalker,
nsCompatibility* aCompat /*= nsnull*/)
SelectorMatchesData::SelectorMatchesData(nsIPresContext* aPresContext,
nsIContent* aContent,
nsRuleWalker* aRuleWalker,
nsCompatibility* aCompat /*= nsnull*/)
{
MOZ_COUNT_CTOR(SelectorMatchesData);
NS_ASSERTION(!aContent || aContent->IsContentOfType(nsIContent::eELEMENT),
"non-element leaked into SelectorMatches");
mPresContext = aPresContext;
mContent = aContent;
mParentContent = nsnull;
@ -3404,7 +3409,7 @@ static PRBool ValueIncludes(const nsString& aValueList, const nsString& aValue,
return PR_FALSE;
}
static PRBool IsEventPseudo(nsIAtom* aAtom)
inline PRBool IsEventPseudo(nsIAtom* aAtom)
{
return PRBool ((nsCSSAtoms::activePseudo == aAtom) ||
(nsCSSAtoms::dragOverPseudo == aAtom) ||
@ -3414,14 +3419,14 @@ static PRBool IsEventPseudo(nsIAtom* aAtom)
// XXX selected, enabled, disabled, selection?
}
static PRBool IsLinkPseudo(nsIAtom* aAtom)
inline PRBool IsLinkPseudo(nsIAtom* aAtom)
{
return PRBool ((nsCSSAtoms::linkPseudo == aAtom) ||
(nsCSSAtoms::visitedPseudo == aAtom) ||
(nsCSSAtoms::anyLinkPseudo == aAtom));
}
static PRBool PR_CALLBACK IsEventSensitive(nsIAtom *aPseudo, nsIAtom *aContentTag, PRBool aSelectorIsGlobal)
inline PRBool IsEventSensitive(nsIAtom *aPseudo, nsIAtom *aContentTag, PRBool aSelectorIsGlobal)
{
// if the selector is global, meaning it is not tied to a tag, then
// we restrict the application of the event pseudo to the following tags
@ -3433,11 +3438,7 @@ static PRBool PR_CALLBACK IsEventSensitive(nsIAtom *aPseudo, nsIAtom *aContentTa
(nsHTMLAtoms::li == aContentTag) ||
(nsHTMLAtoms::label == aContentTag) ||
(nsHTMLAtoms::select == aContentTag) ||
(nsHTMLAtoms::textarea == aContentTag) ||
(nsHTMLAtoms::textPseudo == aContentTag) ||
// We require a Layout Atom too
(nsLayoutAtoms::textTagName == aContentTag)
);
(nsHTMLAtoms::textarea == aContentTag));
} else {
// selector is not global, so apply the event pseudo to everything except HTML and BODY
return PRBool ((nsHTMLAtoms::html != aContentTag) &&
@ -3952,6 +3953,8 @@ CSSRuleProcessor::RulesMatching(nsIPresContext* aPresContext,
NS_PRECONDITION(nsnull != aPresContext, "null arg");
NS_PRECONDITION(nsnull != aContent, "null arg");
NS_PRECONDITION(nsnull != aRuleWalker, "null arg");
NS_PRECONDITION(aContent->IsContentOfType(nsIContent::eELEMENT),
"content must be element");
RuleCascadeData* cascade = GetRuleCascade(aPresContext, aMedium);
@ -4066,6 +4069,9 @@ CSSRuleProcessor::RulesMatching(nsIPresContext* aPresContext,
NS_PRECONDITION(nsnull != aPresContext, "null arg");
NS_PRECONDITION(nsnull != aPseudoTag, "null arg");
NS_PRECONDITION(nsnull != aRuleWalker, "null arg");
NS_PRECONDITION(!aParentContent ||
aParentContent->IsContentOfType(nsIContent::eELEMENT),
"content (if present) must be element");
RuleCascadeData* cascade = GetRuleCascade(aPresContext, aMedium);
@ -4116,6 +4122,9 @@ CSSRuleProcessor::HasStateDependentStyle(nsIPresContext* aPresContext,
nsIAtom* aMedium,
nsIContent* aContent)
{
NS_PRECONDITION(aContent->IsContentOfType(nsIContent::eELEMENT),
"content must be element");
PRBool isStateful = PR_FALSE;
RuleCascadeData* cascade = GetRuleCascade(aPresContext, aMedium);
@ -4288,7 +4297,6 @@ CSSRuleProcessor::ClearRuleCascades(void)
delete data;
data = next;
}
mRuleCascades = nsnull;
return NS_OK;
}
@ -4302,7 +4310,7 @@ PRBool BuildHashEnum(nsISupports* aRule, void* aHash)
return PR_TRUE;
}
static
inline
PRBool IsStateSelector(nsCSSSelector& aSelector)
{
nsAtomList* pseudoClass = aSelector.mPseudoClassList;

Просмотреть файл

@ -118,6 +118,11 @@ public:
nsIStyleContext* aParentContext,
PRBool aForceUnique = PR_FALSE);
virtual nsIStyleContext* ResolveStyleForNonElement(
nsIPresContext* aPresContext,
nsIStyleContext* aParentContext,
PRBool aForceUnique = PR_FALSE);
virtual nsIStyleContext* ResolvePseudoStyleFor(nsIPresContext* aPresContext,
nsIContent* aParentContent,
nsIAtom* aPseudoTag,
@ -856,6 +861,8 @@ nsIStyleContext* StyleSetImpl::ResolveStyleFor(nsIPresContext* aPresContext,
NS_ASSERTION(aContent, "must have content");
NS_ASSERTION(aPresContext, "must have pres context");
NS_ASSERTION(aContent->IsContentOfType(nsIContent::eELEMENT),
"content must be element");
if (aContent && aPresContext) {
GatherRuleProcessors();
@ -881,6 +888,35 @@ nsIStyleContext* StyleSetImpl::ResolveStyleFor(nsIPresContext* aPresContext,
return result;
}
nsIStyleContext* StyleSetImpl::ResolveStyleForNonElement(
nsIPresContext* aPresContext,
nsIStyleContext* aParentContext,
PRBool aForceUnique)
{
MOZ_TIMER_DEBUGLOG(("Start: StyleSetImpl::ResolveStyleForNonElement(), this=%p\n", this));
STYLESET_START_TIMER(NS_TIMER_STYLE_RESOLUTION);
nsIStyleContext* result = nsnull;
NS_ASSERTION(aPresContext, "must have pres context");
if (aPresContext) {
GatherRuleProcessors();
if (mBackstopRuleProcessors ||
mDocRuleProcessors ||
mOverrideRuleProcessors) {
EnsureRuleWalker(aPresContext);
result = GetContext(aPresContext, aParentContext, nsnull, aForceUnique);
NS_ASSERTION(mRuleWalker->AtRoot(), "rule walker must be at root");
}
}
MOZ_TIMER_DEBUGLOG(("Stop: StyleSetImpl::ResolveStyleForNonElement(), this=%p\n", this));
STYLESET_STOP_TIMER(NS_TIMER_STYLE_RESOLUTION);
return result;
}
struct PseudoRulesMatchingData {
PseudoRulesMatchingData(nsIPresContext* aPresContext,
nsIAtom* aMedium,
@ -933,6 +969,9 @@ nsIStyleContext* StyleSetImpl::ResolvePseudoStyleFor(nsIPresContext* aPresContex
NS_ASSERTION(aPseudoTag, "must have pseudo tag");
NS_ASSERTION(aPresContext, "must have pres context");
NS_ASSERTION(!aParentContent ||
aParentContent->IsContentOfType(nsIContent::eELEMENT),
"content (if non-null) must be element");
if (aPseudoTag && aPresContext) {
GatherRuleProcessors();
@ -972,6 +1011,9 @@ nsIStyleContext* StyleSetImpl::ProbePseudoStyleFor(nsIPresContext* aPresContext,
NS_ASSERTION(aPseudoTag, "must have pseudo tag");
NS_ASSERTION(aPresContext, "must have pres context");
NS_ASSERTION(!aParentContent ||
aParentContent->IsContentOfType(nsIContent::eELEMENT),
"content (if non-null) must be element");
if (aPseudoTag && aPresContext) {
GatherRuleProcessors();
@ -1168,7 +1210,11 @@ StyleSetImpl::HasStateDependentStyle(nsIPresContext* aPresContext,
nsIContent* aContent)
{
GatherRuleProcessors();
if (mBackstopRuleProcessors || mDocRuleProcessors || mOverrideRuleProcessors) {
if (aContent->IsContentOfType(nsIContent::eELEMENT) &&
(mBackstopRuleProcessors ||
mDocRuleProcessors ||
mOverrideRuleProcessors)) {
nsIAtom* medium = nsnull;
aPresContext->GetMedium(&medium);
StatefulData data(aPresContext, medium, aContent);