diff --git a/mozilla/content/html/style/src/nsHTMLStyleSheet.cpp b/mozilla/content/html/style/src/nsHTMLStyleSheet.cpp
index 55ae7b40799..45b0719ba65 100644
--- a/mozilla/content/html/style/src/nsHTMLStyleSheet.cpp
+++ b/mozilla/content/html/style/src/nsHTMLStyleSheet.cpp
@@ -29,6 +29,9 @@
#include "nsIPresContext.h"
#include "nsILinkHandler.h"
#include "nsIDocument.h"
+#include "nsTableCell.h"
+#include "nsTableColFrame.h"
+#include "nsTableFrame.h"
static NS_DEFINE_IID(kIHTMLStyleSheetIID, NS_IHTML_STYLE_SHEET_IID);
static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID);
@@ -87,7 +90,7 @@ void HTMLAnchorRule::List(FILE* out, PRInt32 aIndent) const
{
}
-
+// -----------------------------------------------------------
class HTMLStyleSheetImpl : public nsIHTMLStyleSheet {
public:
@@ -224,6 +227,54 @@ nsresult HTMLStyleSheetImpl::QueryInterface(const nsIID& aIID,
return NS_NOINTERFACE;
}
+struct AppendData
+{
+ AppendData(PRInt32 aBackstopCount, PRInt32 aInsertPoint, nsISupportsArray* aResults)
+ : mCount(0),
+ mBackstop(aBackstopCount),
+ mInsert(aInsertPoint),
+ mResults(aResults)
+ {}
+
+ PRInt32 mCount;
+ PRInt32 mBackstop;
+ PRInt32 mInsert;
+ nsISupportsArray* mResults;
+};
+
+PRBool AppendFunc(nsISupports* aElement, void *aData)
+{
+ AppendData* data = (AppendData*)aData;
+ if (data->mCount < data->mBackstop) {
+ data->mResults->InsertElementAt(aElement, data->mInsert++);
+ }
+ else {
+ data->mResults->AppendElement(aElement);
+ }
+ data->mCount++;
+ return PR_TRUE;
+}
+
+PRInt32 AppendRulesFrom(nsIFrame* aFrame, nsIPresContext* aPresContext, PRInt32& aInsertPoint, nsISupportsArray* aResults)
+{
+ PRInt32 count = 0;
+ nsIStyleContext* context;
+ aFrame->GetStyleContext(aPresContext, context);
+ if (nsnull != context) {
+ count = context->GetStyleRuleCount();
+ if (0 < count) {
+ PRInt32 backstopCount = context->GetBackstopStyleRuleCount();
+ nsISupportsArray* rules = context->GetStyleRules();
+
+ AppendData data(backstopCount, aInsertPoint, aResults);
+ rules->EnumerateForwards(AppendFunc, &data);
+ aInsertPoint = data.mInsert;
+ }
+ NS_RELEASE(context);
+ }
+ return count;
+}
+
PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
nsIContent* aContent,
nsIFrame* aParentFrame,
@@ -244,10 +295,10 @@ PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
if (aContent != parentContent) { // if not a pseudo frame...
nsIHTMLContent* htmlContent;
if (NS_OK == aContent->QueryInterface(kIHTMLContentIID, (void**)&htmlContent)) {
+ nsIAtom* tag = htmlContent->GetTag();
// if we have anchor colors, check if this is an anchor with an href
- if ((nsnull != mLinkRule) || (nsnull != mVisitedRule) || (nsnull != mActiveRule)) {
- nsIAtom* tag = htmlContent->GetTag();
- if (tag == nsHTMLAtoms::a) {
+ if (tag == nsHTMLAtoms::a) {
+ if ((nsnull != mLinkRule) || (nsnull != mVisitedRule) || (nsnull != mActiveRule)) {
// test link state
nsILinkHandler* linkHandler;
@@ -296,8 +347,32 @@ PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
NS_RELEASE(linkHandler);
}
}
- NS_IF_RELEASE(tag);
- }
+ } // end A tag
+ else if ((tag == nsHTMLAtoms::td) || (tag == nsHTMLAtoms::th)) {
+ // propogate row/col style rules
+ PRInt32 backstopInsertPoint = 0;
+ nsTableCell* cell = (nsTableCell*)aContent;
+ PRInt32 colIndex = cell->GetColIndex();
+
+ nsIFrame* rowFrame = aParentFrame;
+ nsIFrame* rowGroupFrame;
+ nsIFrame* tableFrame;
+
+ rowFrame->GetContentParent(rowGroupFrame);
+ rowGroupFrame->GetContentParent(tableFrame);
+
+ nsTableColFrame* colFrame;
+ nsIFrame* colGroupFrame;
+
+ ((nsTableFrame*)tableFrame)->GetColumnFrame(colIndex, colFrame);
+ colFrame->GetContentParent(colGroupFrame);
+
+ matchCount += AppendRulesFrom(colGroupFrame, aPresContext, backstopInsertPoint, aResults);
+ matchCount += AppendRulesFrom(colFrame, aPresContext, backstopInsertPoint, aResults);
+ matchCount += AppendRulesFrom(rowGroupFrame, aPresContext, backstopInsertPoint, aResults);
+ matchCount += AppendRulesFrom(rowFrame, aPresContext, backstopInsertPoint, aResults);
+
+ } // end TD/TH tag
// just get the one and only style rule from the content
nsIStyleRule* rule = htmlContent->GetStyleRule();
@@ -308,6 +383,7 @@ PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
matchCount++;
}
+ NS_IF_RELEASE(tag);
NS_RELEASE(htmlContent);
}
}
diff --git a/mozilla/layout/html/style/src/nsHTMLStyleSheet.cpp b/mozilla/layout/html/style/src/nsHTMLStyleSheet.cpp
index 55ae7b40799..45b0719ba65 100644
--- a/mozilla/layout/html/style/src/nsHTMLStyleSheet.cpp
+++ b/mozilla/layout/html/style/src/nsHTMLStyleSheet.cpp
@@ -29,6 +29,9 @@
#include "nsIPresContext.h"
#include "nsILinkHandler.h"
#include "nsIDocument.h"
+#include "nsTableCell.h"
+#include "nsTableColFrame.h"
+#include "nsTableFrame.h"
static NS_DEFINE_IID(kIHTMLStyleSheetIID, NS_IHTML_STYLE_SHEET_IID);
static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID);
@@ -87,7 +90,7 @@ void HTMLAnchorRule::List(FILE* out, PRInt32 aIndent) const
{
}
-
+// -----------------------------------------------------------
class HTMLStyleSheetImpl : public nsIHTMLStyleSheet {
public:
@@ -224,6 +227,54 @@ nsresult HTMLStyleSheetImpl::QueryInterface(const nsIID& aIID,
return NS_NOINTERFACE;
}
+struct AppendData
+{
+ AppendData(PRInt32 aBackstopCount, PRInt32 aInsertPoint, nsISupportsArray* aResults)
+ : mCount(0),
+ mBackstop(aBackstopCount),
+ mInsert(aInsertPoint),
+ mResults(aResults)
+ {}
+
+ PRInt32 mCount;
+ PRInt32 mBackstop;
+ PRInt32 mInsert;
+ nsISupportsArray* mResults;
+};
+
+PRBool AppendFunc(nsISupports* aElement, void *aData)
+{
+ AppendData* data = (AppendData*)aData;
+ if (data->mCount < data->mBackstop) {
+ data->mResults->InsertElementAt(aElement, data->mInsert++);
+ }
+ else {
+ data->mResults->AppendElement(aElement);
+ }
+ data->mCount++;
+ return PR_TRUE;
+}
+
+PRInt32 AppendRulesFrom(nsIFrame* aFrame, nsIPresContext* aPresContext, PRInt32& aInsertPoint, nsISupportsArray* aResults)
+{
+ PRInt32 count = 0;
+ nsIStyleContext* context;
+ aFrame->GetStyleContext(aPresContext, context);
+ if (nsnull != context) {
+ count = context->GetStyleRuleCount();
+ if (0 < count) {
+ PRInt32 backstopCount = context->GetBackstopStyleRuleCount();
+ nsISupportsArray* rules = context->GetStyleRules();
+
+ AppendData data(backstopCount, aInsertPoint, aResults);
+ rules->EnumerateForwards(AppendFunc, &data);
+ aInsertPoint = data.mInsert;
+ }
+ NS_RELEASE(context);
+ }
+ return count;
+}
+
PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
nsIContent* aContent,
nsIFrame* aParentFrame,
@@ -244,10 +295,10 @@ PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
if (aContent != parentContent) { // if not a pseudo frame...
nsIHTMLContent* htmlContent;
if (NS_OK == aContent->QueryInterface(kIHTMLContentIID, (void**)&htmlContent)) {
+ nsIAtom* tag = htmlContent->GetTag();
// if we have anchor colors, check if this is an anchor with an href
- if ((nsnull != mLinkRule) || (nsnull != mVisitedRule) || (nsnull != mActiveRule)) {
- nsIAtom* tag = htmlContent->GetTag();
- if (tag == nsHTMLAtoms::a) {
+ if (tag == nsHTMLAtoms::a) {
+ if ((nsnull != mLinkRule) || (nsnull != mVisitedRule) || (nsnull != mActiveRule)) {
// test link state
nsILinkHandler* linkHandler;
@@ -296,8 +347,32 @@ PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
NS_RELEASE(linkHandler);
}
}
- NS_IF_RELEASE(tag);
- }
+ } // end A tag
+ else if ((tag == nsHTMLAtoms::td) || (tag == nsHTMLAtoms::th)) {
+ // propogate row/col style rules
+ PRInt32 backstopInsertPoint = 0;
+ nsTableCell* cell = (nsTableCell*)aContent;
+ PRInt32 colIndex = cell->GetColIndex();
+
+ nsIFrame* rowFrame = aParentFrame;
+ nsIFrame* rowGroupFrame;
+ nsIFrame* tableFrame;
+
+ rowFrame->GetContentParent(rowGroupFrame);
+ rowGroupFrame->GetContentParent(tableFrame);
+
+ nsTableColFrame* colFrame;
+ nsIFrame* colGroupFrame;
+
+ ((nsTableFrame*)tableFrame)->GetColumnFrame(colIndex, colFrame);
+ colFrame->GetContentParent(colGroupFrame);
+
+ matchCount += AppendRulesFrom(colGroupFrame, aPresContext, backstopInsertPoint, aResults);
+ matchCount += AppendRulesFrom(colFrame, aPresContext, backstopInsertPoint, aResults);
+ matchCount += AppendRulesFrom(rowGroupFrame, aPresContext, backstopInsertPoint, aResults);
+ matchCount += AppendRulesFrom(rowFrame, aPresContext, backstopInsertPoint, aResults);
+
+ } // end TD/TH tag
// just get the one and only style rule from the content
nsIStyleRule* rule = htmlContent->GetStyleRule();
@@ -308,6 +383,7 @@ PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
matchCount++;
}
+ NS_IF_RELEASE(tag);
NS_RELEASE(htmlContent);
}
}
diff --git a/mozilla/layout/style/nsHTMLStyleSheet.cpp b/mozilla/layout/style/nsHTMLStyleSheet.cpp
index 55ae7b40799..45b0719ba65 100644
--- a/mozilla/layout/style/nsHTMLStyleSheet.cpp
+++ b/mozilla/layout/style/nsHTMLStyleSheet.cpp
@@ -29,6 +29,9 @@
#include "nsIPresContext.h"
#include "nsILinkHandler.h"
#include "nsIDocument.h"
+#include "nsTableCell.h"
+#include "nsTableColFrame.h"
+#include "nsTableFrame.h"
static NS_DEFINE_IID(kIHTMLStyleSheetIID, NS_IHTML_STYLE_SHEET_IID);
static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID);
@@ -87,7 +90,7 @@ void HTMLAnchorRule::List(FILE* out, PRInt32 aIndent) const
{
}
-
+// -----------------------------------------------------------
class HTMLStyleSheetImpl : public nsIHTMLStyleSheet {
public:
@@ -224,6 +227,54 @@ nsresult HTMLStyleSheetImpl::QueryInterface(const nsIID& aIID,
return NS_NOINTERFACE;
}
+struct AppendData
+{
+ AppendData(PRInt32 aBackstopCount, PRInt32 aInsertPoint, nsISupportsArray* aResults)
+ : mCount(0),
+ mBackstop(aBackstopCount),
+ mInsert(aInsertPoint),
+ mResults(aResults)
+ {}
+
+ PRInt32 mCount;
+ PRInt32 mBackstop;
+ PRInt32 mInsert;
+ nsISupportsArray* mResults;
+};
+
+PRBool AppendFunc(nsISupports* aElement, void *aData)
+{
+ AppendData* data = (AppendData*)aData;
+ if (data->mCount < data->mBackstop) {
+ data->mResults->InsertElementAt(aElement, data->mInsert++);
+ }
+ else {
+ data->mResults->AppendElement(aElement);
+ }
+ data->mCount++;
+ return PR_TRUE;
+}
+
+PRInt32 AppendRulesFrom(nsIFrame* aFrame, nsIPresContext* aPresContext, PRInt32& aInsertPoint, nsISupportsArray* aResults)
+{
+ PRInt32 count = 0;
+ nsIStyleContext* context;
+ aFrame->GetStyleContext(aPresContext, context);
+ if (nsnull != context) {
+ count = context->GetStyleRuleCount();
+ if (0 < count) {
+ PRInt32 backstopCount = context->GetBackstopStyleRuleCount();
+ nsISupportsArray* rules = context->GetStyleRules();
+
+ AppendData data(backstopCount, aInsertPoint, aResults);
+ rules->EnumerateForwards(AppendFunc, &data);
+ aInsertPoint = data.mInsert;
+ }
+ NS_RELEASE(context);
+ }
+ return count;
+}
+
PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
nsIContent* aContent,
nsIFrame* aParentFrame,
@@ -244,10 +295,10 @@ PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
if (aContent != parentContent) { // if not a pseudo frame...
nsIHTMLContent* htmlContent;
if (NS_OK == aContent->QueryInterface(kIHTMLContentIID, (void**)&htmlContent)) {
+ nsIAtom* tag = htmlContent->GetTag();
// if we have anchor colors, check if this is an anchor with an href
- if ((nsnull != mLinkRule) || (nsnull != mVisitedRule) || (nsnull != mActiveRule)) {
- nsIAtom* tag = htmlContent->GetTag();
- if (tag == nsHTMLAtoms::a) {
+ if (tag == nsHTMLAtoms::a) {
+ if ((nsnull != mLinkRule) || (nsnull != mVisitedRule) || (nsnull != mActiveRule)) {
// test link state
nsILinkHandler* linkHandler;
@@ -296,8 +347,32 @@ PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
NS_RELEASE(linkHandler);
}
}
- NS_IF_RELEASE(tag);
- }
+ } // end A tag
+ else if ((tag == nsHTMLAtoms::td) || (tag == nsHTMLAtoms::th)) {
+ // propogate row/col style rules
+ PRInt32 backstopInsertPoint = 0;
+ nsTableCell* cell = (nsTableCell*)aContent;
+ PRInt32 colIndex = cell->GetColIndex();
+
+ nsIFrame* rowFrame = aParentFrame;
+ nsIFrame* rowGroupFrame;
+ nsIFrame* tableFrame;
+
+ rowFrame->GetContentParent(rowGroupFrame);
+ rowGroupFrame->GetContentParent(tableFrame);
+
+ nsTableColFrame* colFrame;
+ nsIFrame* colGroupFrame;
+
+ ((nsTableFrame*)tableFrame)->GetColumnFrame(colIndex, colFrame);
+ colFrame->GetContentParent(colGroupFrame);
+
+ matchCount += AppendRulesFrom(colGroupFrame, aPresContext, backstopInsertPoint, aResults);
+ matchCount += AppendRulesFrom(colFrame, aPresContext, backstopInsertPoint, aResults);
+ matchCount += AppendRulesFrom(rowGroupFrame, aPresContext, backstopInsertPoint, aResults);
+ matchCount += AppendRulesFrom(rowFrame, aPresContext, backstopInsertPoint, aResults);
+
+ } // end TD/TH tag
// just get the one and only style rule from the content
nsIStyleRule* rule = htmlContent->GetStyleRule();
@@ -308,6 +383,7 @@ PRInt32 HTMLStyleSheetImpl::RulesMatching(nsIPresContext* aPresContext,
matchCount++;
}
+ NS_IF_RELEASE(tag);
NS_RELEASE(htmlContent);
}
}