Activate the first-letter special rule; fixed a memory leak

git-svn-id: svn://10.0.0.236/trunk@29634 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
kipp%netscape.com 1999-04-28 01:16:45 +00:00
parent eb2a815eb9
commit 1941a24365
3 changed files with 234 additions and 45 deletions

View File

@ -170,6 +170,8 @@ CSSFirstLineRule::MapStyleInto(nsIStyleContext* aContext,
}
}
}
NS_RELEASE(parentContext);
return NS_OK;
}
@ -194,26 +196,63 @@ CSSFirstLetterRule::CSSFirstLetterRule(nsIHTMLCSSStyleSheet* aSheet)
{
}
// Fixup the style context so that all of the properties that don't
// apply (CSS2 spec section 5.12.2) don't apply.
//
// These properties apply: font-properties, color-properties,
// backgorund-properties, text-decoration, vertical-align,
// text-transform, line-height, margin-properties,
// padding-properties, border-properties, float, text-shadow and
// clear.
//
// Everything else doesn't apply.
NS_IMETHODIMP
CSSFirstLetterRule::MapStyleInto(nsIStyleContext* aContext,
nsIPresContext* aPresContext)
{
// These properties apply: font-properties, color-properties,
// backgorund-properties, word-spacing, letter-spacing,
// text-decoration, vertical-align, text-transform, line-height,
// text-shadow, and clear.
//
// Everything else doesn't apply.
nsIStyleContext* parentContext;
parentContext = aContext->GetParent();
// Disable border
nsStyleSpacing* spacing = (nsStyleSpacing*)
aContext->GetMutableStyleData(eStyleStruct_Spacing);
if (spacing) {
spacing->SetBorderStyle(NS_SIDE_TOP, NS_STYLE_BORDER_STYLE_NONE);
spacing->SetBorderStyle(NS_SIDE_RIGHT, NS_STYLE_BORDER_STYLE_NONE);
spacing->SetBorderStyle(NS_SIDE_BOTTOM, NS_STYLE_BORDER_STYLE_NONE);
spacing->SetBorderStyle(NS_SIDE_LEFT, NS_STYLE_BORDER_STYLE_NONE);
// Undo any change made to "direction"
nsStyleDisplay* display = (nsStyleDisplay*)
aContext->GetMutableStyleData(eStyleStruct_Display);
if (parentContext) {
const nsStyleDisplay* parentDisplay = (const nsStyleDisplay*)
parentContext->GetStyleData(eStyleStruct_Display);
if (parentDisplay) {
display->mDirection = parentDisplay->mDirection;
}
}
// Undo any change made to "cursor"
nsStyleColor* color = (nsStyleColor*)
aContext->GetMutableStyleData(eStyleStruct_Color);
if (parentContext) {
const nsStyleColor* parentColor = (const nsStyleColor*)
parentContext->GetStyleData(eStyleStruct_Color);
if (parentColor) {
color->mCursor = parentColor->mCursor;
}
}
// Undo any change to quotes
nsStyleContent* content = (nsStyleContent*)
aContext->GetMutableStyleData(eStyleStruct_Content);
if (parentContext) {
const nsStyleContent* parentContent = (const nsStyleContent*)
parentContext->GetStyleData(eStyleStruct_Content);
if (parentContent) {
nsAutoString open, close;
PRUint32 i, n = parentContent->QuotesCount();
content->AllocateQuotes(n);
for (i = 0; i < n; i++) {
parentContent->GetQuotesAt(i, open, close);
content->SetQuotesAt(i, open, close);
}
}
}
NS_RELEASE(parentContext);
return NS_OK;
}
@ -282,6 +321,7 @@ protected:
nsIDocument* mDocument;
CSSFirstLineRule* mFirstLineRule;
CSSFirstLetterRule* mFirstLetterRule;
};
@ -325,7 +365,8 @@ HTMLCSSStyleSheetImpl::HTMLCSSStyleSheetImpl()
: nsIHTMLCSSStyleSheet(),
mURL(nsnull),
mDocument(nsnull),
mFirstLineRule(nsnull)
mFirstLineRule(nsnull),
mFirstLetterRule(nsnull)
{
NS_INIT_REFCNT();
}
@ -337,6 +378,10 @@ HTMLCSSStyleSheetImpl::~HTMLCSSStyleSheetImpl()
mFirstLineRule->mSheet = nsnull;
NS_RELEASE(mFirstLineRule);
}
if (nsnull != mFirstLetterRule) {
mFirstLetterRule->mSheet = nsnull;
NS_RELEASE(mFirstLetterRule);
}
}
NS_IMPL_ADDREF(HTMLCSSStyleSheetImpl)
@ -428,6 +473,20 @@ PRInt32 HTMLCSSStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
}
}
}
if (aPseudoTag == nsHTMLAtoms::firstLetterPseudo) {
if (aResults->Count()) {
if (nsnull == mFirstLetterRule) {
mFirstLetterRule = new CSSFirstLetterRule(this);
if (mFirstLetterRule) {
NS_ADDREF(mFirstLetterRule);
}
}
if (mFirstLetterRule) {
aResults->AppendElement(mFirstLetterRule);
return 1;
}
}
}
// else no pseudo frame style...
return 0;
}
@ -468,6 +527,10 @@ HTMLCSSStyleSheetImpl::Reset(nsIURL* aURL)
mFirstLineRule->mSheet = nsnull;
NS_RELEASE(mFirstLineRule);
}
if (nsnull != mFirstLetterRule) {
mFirstLetterRule->mSheet = nsnull;
NS_RELEASE(mFirstLetterRule);
}
return NS_OK;
}

View File

@ -170,6 +170,8 @@ CSSFirstLineRule::MapStyleInto(nsIStyleContext* aContext,
}
}
}
NS_RELEASE(parentContext);
return NS_OK;
}
@ -194,26 +196,63 @@ CSSFirstLetterRule::CSSFirstLetterRule(nsIHTMLCSSStyleSheet* aSheet)
{
}
// Fixup the style context so that all of the properties that don't
// apply (CSS2 spec section 5.12.2) don't apply.
//
// These properties apply: font-properties, color-properties,
// backgorund-properties, text-decoration, vertical-align,
// text-transform, line-height, margin-properties,
// padding-properties, border-properties, float, text-shadow and
// clear.
//
// Everything else doesn't apply.
NS_IMETHODIMP
CSSFirstLetterRule::MapStyleInto(nsIStyleContext* aContext,
nsIPresContext* aPresContext)
{
// These properties apply: font-properties, color-properties,
// backgorund-properties, word-spacing, letter-spacing,
// text-decoration, vertical-align, text-transform, line-height,
// text-shadow, and clear.
//
// Everything else doesn't apply.
nsIStyleContext* parentContext;
parentContext = aContext->GetParent();
// Disable border
nsStyleSpacing* spacing = (nsStyleSpacing*)
aContext->GetMutableStyleData(eStyleStruct_Spacing);
if (spacing) {
spacing->SetBorderStyle(NS_SIDE_TOP, NS_STYLE_BORDER_STYLE_NONE);
spacing->SetBorderStyle(NS_SIDE_RIGHT, NS_STYLE_BORDER_STYLE_NONE);
spacing->SetBorderStyle(NS_SIDE_BOTTOM, NS_STYLE_BORDER_STYLE_NONE);
spacing->SetBorderStyle(NS_SIDE_LEFT, NS_STYLE_BORDER_STYLE_NONE);
// Undo any change made to "direction"
nsStyleDisplay* display = (nsStyleDisplay*)
aContext->GetMutableStyleData(eStyleStruct_Display);
if (parentContext) {
const nsStyleDisplay* parentDisplay = (const nsStyleDisplay*)
parentContext->GetStyleData(eStyleStruct_Display);
if (parentDisplay) {
display->mDirection = parentDisplay->mDirection;
}
}
// Undo any change made to "cursor"
nsStyleColor* color = (nsStyleColor*)
aContext->GetMutableStyleData(eStyleStruct_Color);
if (parentContext) {
const nsStyleColor* parentColor = (const nsStyleColor*)
parentContext->GetStyleData(eStyleStruct_Color);
if (parentColor) {
color->mCursor = parentColor->mCursor;
}
}
// Undo any change to quotes
nsStyleContent* content = (nsStyleContent*)
aContext->GetMutableStyleData(eStyleStruct_Content);
if (parentContext) {
const nsStyleContent* parentContent = (const nsStyleContent*)
parentContext->GetStyleData(eStyleStruct_Content);
if (parentContent) {
nsAutoString open, close;
PRUint32 i, n = parentContent->QuotesCount();
content->AllocateQuotes(n);
for (i = 0; i < n; i++) {
parentContent->GetQuotesAt(i, open, close);
content->SetQuotesAt(i, open, close);
}
}
}
NS_RELEASE(parentContext);
return NS_OK;
}
@ -282,6 +321,7 @@ protected:
nsIDocument* mDocument;
CSSFirstLineRule* mFirstLineRule;
CSSFirstLetterRule* mFirstLetterRule;
};
@ -325,7 +365,8 @@ HTMLCSSStyleSheetImpl::HTMLCSSStyleSheetImpl()
: nsIHTMLCSSStyleSheet(),
mURL(nsnull),
mDocument(nsnull),
mFirstLineRule(nsnull)
mFirstLineRule(nsnull),
mFirstLetterRule(nsnull)
{
NS_INIT_REFCNT();
}
@ -337,6 +378,10 @@ HTMLCSSStyleSheetImpl::~HTMLCSSStyleSheetImpl()
mFirstLineRule->mSheet = nsnull;
NS_RELEASE(mFirstLineRule);
}
if (nsnull != mFirstLetterRule) {
mFirstLetterRule->mSheet = nsnull;
NS_RELEASE(mFirstLetterRule);
}
}
NS_IMPL_ADDREF(HTMLCSSStyleSheetImpl)
@ -428,6 +473,20 @@ PRInt32 HTMLCSSStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
}
}
}
if (aPseudoTag == nsHTMLAtoms::firstLetterPseudo) {
if (aResults->Count()) {
if (nsnull == mFirstLetterRule) {
mFirstLetterRule = new CSSFirstLetterRule(this);
if (mFirstLetterRule) {
NS_ADDREF(mFirstLetterRule);
}
}
if (mFirstLetterRule) {
aResults->AppendElement(mFirstLetterRule);
return 1;
}
}
}
// else no pseudo frame style...
return 0;
}
@ -468,6 +527,10 @@ HTMLCSSStyleSheetImpl::Reset(nsIURL* aURL)
mFirstLineRule->mSheet = nsnull;
NS_RELEASE(mFirstLineRule);
}
if (nsnull != mFirstLetterRule) {
mFirstLetterRule->mSheet = nsnull;
NS_RELEASE(mFirstLetterRule);
}
return NS_OK;
}

View File

@ -170,6 +170,8 @@ CSSFirstLineRule::MapStyleInto(nsIStyleContext* aContext,
}
}
}
NS_RELEASE(parentContext);
return NS_OK;
}
@ -194,26 +196,63 @@ CSSFirstLetterRule::CSSFirstLetterRule(nsIHTMLCSSStyleSheet* aSheet)
{
}
// Fixup the style context so that all of the properties that don't
// apply (CSS2 spec section 5.12.2) don't apply.
//
// These properties apply: font-properties, color-properties,
// backgorund-properties, text-decoration, vertical-align,
// text-transform, line-height, margin-properties,
// padding-properties, border-properties, float, text-shadow and
// clear.
//
// Everything else doesn't apply.
NS_IMETHODIMP
CSSFirstLetterRule::MapStyleInto(nsIStyleContext* aContext,
nsIPresContext* aPresContext)
{
// These properties apply: font-properties, color-properties,
// backgorund-properties, word-spacing, letter-spacing,
// text-decoration, vertical-align, text-transform, line-height,
// text-shadow, and clear.
//
// Everything else doesn't apply.
nsIStyleContext* parentContext;
parentContext = aContext->GetParent();
// Disable border
nsStyleSpacing* spacing = (nsStyleSpacing*)
aContext->GetMutableStyleData(eStyleStruct_Spacing);
if (spacing) {
spacing->SetBorderStyle(NS_SIDE_TOP, NS_STYLE_BORDER_STYLE_NONE);
spacing->SetBorderStyle(NS_SIDE_RIGHT, NS_STYLE_BORDER_STYLE_NONE);
spacing->SetBorderStyle(NS_SIDE_BOTTOM, NS_STYLE_BORDER_STYLE_NONE);
spacing->SetBorderStyle(NS_SIDE_LEFT, NS_STYLE_BORDER_STYLE_NONE);
// Undo any change made to "direction"
nsStyleDisplay* display = (nsStyleDisplay*)
aContext->GetMutableStyleData(eStyleStruct_Display);
if (parentContext) {
const nsStyleDisplay* parentDisplay = (const nsStyleDisplay*)
parentContext->GetStyleData(eStyleStruct_Display);
if (parentDisplay) {
display->mDirection = parentDisplay->mDirection;
}
}
// Undo any change made to "cursor"
nsStyleColor* color = (nsStyleColor*)
aContext->GetMutableStyleData(eStyleStruct_Color);
if (parentContext) {
const nsStyleColor* parentColor = (const nsStyleColor*)
parentContext->GetStyleData(eStyleStruct_Color);
if (parentColor) {
color->mCursor = parentColor->mCursor;
}
}
// Undo any change to quotes
nsStyleContent* content = (nsStyleContent*)
aContext->GetMutableStyleData(eStyleStruct_Content);
if (parentContext) {
const nsStyleContent* parentContent = (const nsStyleContent*)
parentContext->GetStyleData(eStyleStruct_Content);
if (parentContent) {
nsAutoString open, close;
PRUint32 i, n = parentContent->QuotesCount();
content->AllocateQuotes(n);
for (i = 0; i < n; i++) {
parentContent->GetQuotesAt(i, open, close);
content->SetQuotesAt(i, open, close);
}
}
}
NS_RELEASE(parentContext);
return NS_OK;
}
@ -282,6 +321,7 @@ protected:
nsIDocument* mDocument;
CSSFirstLineRule* mFirstLineRule;
CSSFirstLetterRule* mFirstLetterRule;
};
@ -325,7 +365,8 @@ HTMLCSSStyleSheetImpl::HTMLCSSStyleSheetImpl()
: nsIHTMLCSSStyleSheet(),
mURL(nsnull),
mDocument(nsnull),
mFirstLineRule(nsnull)
mFirstLineRule(nsnull),
mFirstLetterRule(nsnull)
{
NS_INIT_REFCNT();
}
@ -337,6 +378,10 @@ HTMLCSSStyleSheetImpl::~HTMLCSSStyleSheetImpl()
mFirstLineRule->mSheet = nsnull;
NS_RELEASE(mFirstLineRule);
}
if (nsnull != mFirstLetterRule) {
mFirstLetterRule->mSheet = nsnull;
NS_RELEASE(mFirstLetterRule);
}
}
NS_IMPL_ADDREF(HTMLCSSStyleSheetImpl)
@ -428,6 +473,20 @@ PRInt32 HTMLCSSStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
}
}
}
if (aPseudoTag == nsHTMLAtoms::firstLetterPseudo) {
if (aResults->Count()) {
if (nsnull == mFirstLetterRule) {
mFirstLetterRule = new CSSFirstLetterRule(this);
if (mFirstLetterRule) {
NS_ADDREF(mFirstLetterRule);
}
}
if (mFirstLetterRule) {
aResults->AppendElement(mFirstLetterRule);
return 1;
}
}
}
// else no pseudo frame style...
return 0;
}
@ -468,6 +527,10 @@ HTMLCSSStyleSheetImpl::Reset(nsIURL* aURL)
mFirstLineRule->mSheet = nsnull;
NS_RELEASE(mFirstLineRule);
}
if (nsnull != mFirstLetterRule) {
mFirstLetterRule->mSheet = nsnull;
NS_RELEASE(mFirstLetterRule);
}
return NS_OK;
}