Bug 183348. Fix cloning of sheets with @import rules. Also fixes bug 290018, bug 436261, bug 444723, bug 445415. r+sr=dbaron

This commit is contained in:
Boris Zbarsky 2008-09-09 14:08:11 -04:00
Родитель ff7706a544
Коммит e1f03a883b
25 изменённых файлов: 385 добавлений и 106 удалений

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

@ -0,0 +1,13 @@
<!DOCTYPE html>
<body>
<iframe></iframe>
<script>
var win = window.frames[0];
win.document.open();
win.document.write("<!DOCTYPE html><html><head></head><body></body></html>");
win.document.close();
win.document.body.innerHTML = "<link rel='stylesheet' type='text/css' href='outer-sheet.css' />";
win.document.body.innerHTML += "<p>test</p>";
</script>
</body>

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

@ -0,0 +1,11 @@
<!DOCTYPE html>
<body>
<iframe></iframe>
<script>
var win = window.frames[0];
win.document.open();
win.document.write("<!DOCTYPE html><html><head><link rel='stylesheet' type='text/css' href='outer-sheet.css' /></head><body><p>test</p></body></html>");
win.document.close();
</script>
</body>

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

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<body>
<script type="text/javascript">
var el = document.createElement("link");
el.type = "text/css";
el.rel = "stylesheet";
el.href = "outer-sheet.css";
var h = document.getElementsByTagName("HEAD")[0];
h.appendChild(el);
el.title = "theme"; // comment this line to make the test work!
</script>
<p>test</p>
</body>
</html>

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

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<link type="text/css" rel="stylesheet" media="print"
href="outer-sheet.css">
<link type="text/css" rel="stylesheet" media="screen"
href="outer-sheet.css">
</head>
<body>
<p>test</p>
</body>
</html>

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

@ -0,0 +1,21 @@
<html>
<body>
<script type="text/javascript">
var el = document.createElement("link");
el.type = "text/css";
el.rel = "stylesheet";
el.media = "print"
el.href = "outer-sheet.css";
var h = document.getElementsByTagName("HEAD")[0];
h.appendChild(el);
el = document.createElement("link");
el.type = "text/css";
el.rel = "stylesheet";
el.href = "outer-sheet.css";
var h = document.getElementsByTagName("HEAD")[0];
h.appendChild(el);
</script>
<p>test</p>
</body>
</html>

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

@ -0,0 +1,6 @@
<!DOCTYPE html>
<html>
<body>
<p style="background-color: green; color: white">test</p>
</body>
</html>

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

@ -0,0 +1,20 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<link rel="stylesheet" media="screen" type="text/css"
href="outermost-sheet.css" title="A"/>
<link rel="alternate stylesheet" media="screen" type="text/css"
href="outer-sheet.css" title="B"/>
</head>
<body>
<ul>
<li class="outermost">purple</li>
<li class="outer">blue</li>
<li class="inner">yellow</li>
</ul>
</body>
</html>

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

@ -0,0 +1,20 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<link rel="alternate stylesheet" media="screen" type="text/css"
href="outer-sheet.css" title="B"/>
<link rel="stylesheet" media="screen" type="text/css"
href="outermost-sheet.css" title="A"/>
</head>
<body>
<ul>
<li class="outermost">purple</li>
<li class="outer">blue</li>
<li class="inner">yellow</li>
</ul>
</body>
</html>

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

@ -0,0 +1,12 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<body>
<ul>
<li style="color: purple">purple</li>
<li style="color: blue">blue</li>
<li style="color: yellow">yellow</li>
</ul>
</body>
</html>

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

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<div style="color: purple">purple</div>
<div style="color: blue">blue</div>
<div style="color: yellow">yellow</div>
</body>
</html>

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

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="stylesheet" type="text/css" href="other-outermost-sheet.css"
media="print" />
<link rel="stylesheet" type="text/css" href="outermost-sheet.css"
media="screen" />
</head>
<body>
<div class="outermost">purple</div>
<div class="outer">blue</div>
<div class="inner">yellow</div>
</body>
</html>

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

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="stylesheet" type="text/css" href="outermost-sheet.css"
media="screen" />
<link rel="stylesheet" type="text/css" href="other-outermost-sheet.css"
media="print" />
</head>
<body>
<div class="outermost">purple</div>
<div class="outer">blue</div>
<div class="inner">yellow</div>
</body>
</html>

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

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" class="reftest-print">
<body>
<div style="color: cyan">cyan</div>
<div style="color: blue">blue</div>
<div style="color: yellow">yellow</div>
</body>
</html>

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

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" class="reftest-print">
<head>
<link rel="stylesheet" type="text/css" href="other-outermost-sheet.css"
media="print" />
<link rel="stylesheet" type="text/css" href="outermost-sheet.css"
media="screen" />
</head>
<body>
<div class="outermost">cyan</div>
<div class="outer">blue</div>
<div class="inner">yellow</div>
</body>
</html>

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

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" class="reftest-print">
<head>
<link rel="stylesheet" type="text/css" href="outermost-sheet.css"
media="screen" />
<link rel="stylesheet" type="text/css" href="other-outermost-sheet.css"
media="print" />
</head>
<body>
<div class="outermost">cyan</div>
<div class="outer">blue</div>
<div class="inner">yellow</div>
</body>
</html>

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

@ -0,0 +1,2 @@
p { background-color: green; color: white }
.inner { color: yellow; }

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

@ -0,0 +1,3 @@
@import url("outer-sheet.css");
.outermost { color: cyan; }

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

@ -0,0 +1,2 @@
@import url("inner-sheet.css");
.outer { color: blue; }

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

@ -0,0 +1,3 @@
@import url("outer-sheet.css");
.outermost { color: purple; }

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

@ -0,0 +1,10 @@
== 290018-1.html 290018-ref.html
== 436261-1.html 436261-ref.html
== 436261-2.html 436261-ref.html
== 436261-3.html 436261-ref.html
== 444723-1.html 444723-ref.html
== 444723-2.html 444723-ref.html
== 445415-1a.xhtml 445415-1-ref.xhtml
== 445415-1b.xhtml 445415-1-ref.xhtml
== 445415-2a.xhtml 445415-2-ref.xhtml
== 445415-2b.xhtml 445415-2-ref.xhtml

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

@ -29,6 +29,9 @@ include bugs/reftest.list
# canvas 2D
include canvas/reftest.list
# css @import tests
include css-import/reftest.list
# columns/
include columns/reftest.list

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

@ -531,7 +531,8 @@ protected:
// Sheet section we're in. This is used to enforce correct ordering of the
// various rule types (eg the fact that a @charset rule must come before
// anything else).
// anything else). Note that there are checks of similar things in various
// places in nsCSSStyleSheet.cpp (e.g in insertRule, RebuildChildList).
enum nsCSSSection {
eCSSSection_Charset,
eCSSSection_Import,

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

@ -2333,17 +2333,16 @@ CascadeSheetRulesInto(nsICSSStyleSheet* aSheet, void* aData)
sheet->GetApplicable(bSheetApplicable);
if (bSheetApplicable &&
sheet->UseForPresentation(data->mPresContext, data->mCacheKey)) {
nsCSSStyleSheet* child = sheet->mFirstChild;
sheet->UseForPresentation(data->mPresContext, data->mCacheKey) &&
sheet->mInner) {
nsCSSStyleSheet* child = sheet->mInner->mFirstChild;
while (child) {
CascadeSheetRulesInto(child, data);
child = child->mNext;
}
if (sheet->mInner) {
if (!sheet->mInner->mOrderedRules.EnumerateForwards(InsertRuleByWeight, data))
return PR_FALSE;
}
if (!sheet->mInner->mOrderedRules.EnumerateForwards(InsertRuleByWeight, data))
return PR_FALSE;
}
return PR_TRUE;
}

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

@ -752,15 +752,7 @@ nsMediaList::Append(const nsAString& aNewMedium)
//
static PRBool SetStyleSheetReference(nsICSSRule* aRule, void* aSheet)
{
if (aRule) {
aRule->SetStyleSheet((nsICSSStyleSheet*)aSheet);
}
return PR_TRUE;
}
nsCSSStyleSheetInner::nsCSSStyleSheetInner(nsICSSStyleSheet* aParentSheet)
nsCSSStyleSheetInner::nsCSSStyleSheetInner(nsICSSStyleSheet* aPrimarySheet)
: mSheets(),
mComplete(PR_FALSE)
#ifdef DEBUG
@ -768,11 +760,19 @@ nsCSSStyleSheetInner::nsCSSStyleSheetInner(nsICSSStyleSheet* aParentSheet)
#endif
{
MOZ_COUNT_CTOR(nsCSSStyleSheetInner);
mSheets.AppendElement(aParentSheet);
mSheets.AppendElement(aPrimarySheet);
mPrincipal = do_CreateInstance("@mozilla.org/nullprincipal;1");
}
static PRBool SetStyleSheetReference(nsICSSRule* aRule, void* aSheet)
{
if (aRule) {
aRule->SetStyleSheet((nsICSSStyleSheet*)aSheet);
}
return PR_TRUE;
}
static PRBool
CloneRuleInto(nsICSSRule* aRule, void* aArray)
{
@ -785,8 +785,56 @@ CloneRuleInto(nsICSSRule* aRule, void* aArray)
return PR_TRUE;
}
struct ChildSheetListBuilder {
nsRefPtr<nsCSSStyleSheet>* sheetSlot;
nsCSSStyleSheet* parent;
void SetParentLinks(nsCSSStyleSheet* aSheet) {
aSheet->mParent = parent;
aSheet->SetOwningDocument(parent->mDocument);
}
};
static PRBool
RebuildChildList(nsICSSRule* aRule, void* aBuilder)
{
PRInt32 type;
aRule->GetType(type);
if (type == nsICSSRule::CHARSET_RULE) {
return PR_TRUE;
}
if (type == nsICSSRule::NAMESPACE_RULE || type == nsICSSRule::MEDIA_RULE ||
type == nsICSSRule::STYLE_RULE) {
return PR_FALSE;
}
ChildSheetListBuilder* builder =
static_cast<ChildSheetListBuilder*>(aBuilder);
// XXXbz We really need to decomtaminate all this stuff. Is there a reason
// that I can't just QI to nsICSSImportRule and get an nsCSSStyleSheet
// directly from it?
nsCOMPtr<nsIDOMCSSImportRule> importRule(do_QueryInterface(aRule));
NS_ASSERTION(importRule, "GetType lied");
nsCOMPtr<nsIDOMCSSStyleSheet> childSheet;
importRule->GetStyleSheet(getter_AddRefs(childSheet));
// Have to do this QI to be safe, since XPConnect can fake
// nsIDOMCSSStyleSheets
nsCOMPtr<nsICSSStyleSheet> cssSheet = do_QueryInterface(childSheet);
if (!cssSheet) {
return PR_TRUE;
}
(*builder->sheetSlot) = static_cast<nsCSSStyleSheet*>(cssSheet.get());
builder->SetParentLinks(*builder->sheetSlot);
return PR_TRUE;
}
nsCSSStyleSheetInner::nsCSSStyleSheetInner(nsCSSStyleSheetInner& aCopy,
nsICSSStyleSheet* aParentSheet)
nsCSSStyleSheet* aPrimarySheet)
: mSheets(),
mSheetURI(aCopy.mSheetURI),
mOriginalSheetURI(aCopy.mOriginalSheetURI),
@ -798,9 +846,13 @@ nsCSSStyleSheetInner::nsCSSStyleSheetInner(nsCSSStyleSheetInner& aCopy,
#endif
{
MOZ_COUNT_CTOR(nsCSSStyleSheetInner);
mSheets.AppendElement(aParentSheet);
mSheets.AppendElement(aPrimarySheet);
aCopy.mOrderedRules.EnumerateForwards(CloneRuleInto, &mOrderedRules);
mOrderedRules.EnumerateForwards(SetStyleSheetReference, aParentSheet);
mOrderedRules.EnumerateForwards(SetStyleSheetReference, aPrimarySheet);
ChildSheetListBuilder builder = { &mFirstChild, aPrimarySheet };
mOrderedRules.EnumerateForwards(RebuildChildList, &builder);
RebuildNameSpaces();
}
@ -811,33 +863,33 @@ nsCSSStyleSheetInner::~nsCSSStyleSheetInner()
}
nsCSSStyleSheetInner*
nsCSSStyleSheetInner::CloneFor(nsICSSStyleSheet* aParentSheet)
nsCSSStyleSheetInner::CloneFor(nsCSSStyleSheet* aPrimarySheet)
{
return new nsCSSStyleSheetInner(*this, aParentSheet);
return new nsCSSStyleSheetInner(*this, aPrimarySheet);
}
void
nsCSSStyleSheetInner::AddSheet(nsICSSStyleSheet* aParentSheet)
nsCSSStyleSheetInner::AddSheet(nsICSSStyleSheet* aSheet)
{
mSheets.AppendElement(aParentSheet);
mSheets.AppendElement(aSheet);
}
void
nsCSSStyleSheetInner::RemoveSheet(nsICSSStyleSheet* aParentSheet)
nsCSSStyleSheetInner::RemoveSheet(nsICSSStyleSheet* aSheet)
{
if (1 == mSheets.Count()) {
NS_ASSERTION(aParentSheet == (nsICSSStyleSheet*)mSheets.ElementAt(0), "bad parent");
NS_ASSERTION(aSheet == (nsICSSStyleSheet*)mSheets.ElementAt(0), "bad parent");
delete this;
return;
}
if (aParentSheet == (nsICSSStyleSheet*)mSheets.ElementAt(0)) {
if (aSheet == (nsICSSStyleSheet*)mSheets.ElementAt(0)) {
mSheets.RemoveElementAt(0);
NS_ASSERTION(mSheets.Count(), "no parents");
mOrderedRules.EnumerateForwards(SetStyleSheetReference,
(nsICSSStyleSheet*)mSheets.ElementAt(0));
}
else {
mSheets.RemoveElement(aParentSheet);
mSheets.RemoveElement(aSheet);
}
}
@ -889,8 +941,6 @@ nsCSSStyleSheet::nsCSSStyleSheet()
mRefCnt(0),
mTitle(),
mMedia(nsnull),
mFirstChild(nsnull),
mNext(nsnull),
mParent(nsnull),
mOwnerRule(nsnull),
mRuleCollection(nsnull),
@ -913,8 +963,6 @@ nsCSSStyleSheet::nsCSSStyleSheet(const nsCSSStyleSheet& aCopy,
mRefCnt(0),
mTitle(aCopy.mTitle),
mMedia(nsnull),
mFirstChild(nsnull),
mNext(nsnull),
mParent(aParentToUse),
mOwnerRule(aOwnerRuleToUse),
mRuleCollection(nsnull), // re-created lazily
@ -935,43 +983,24 @@ nsCSSStyleSheet::nsCSSStyleSheet(const nsCSSStyleSheet& aCopy,
}
if (aCopy.mMedia) {
// XXX This is wrong; we should be keeping @import rules and
// sheets in sync!
aCopy.mMedia->Clone(getter_AddRefs(mMedia));
}
if (aCopy.mFirstChild) {
nsCSSStyleSheet* otherChild = aCopy.mFirstChild;
nsCSSStyleSheet** ourSlot = &mFirstChild;
do {
// XXX This is wrong; we should be keeping @import rules and
// sheets in sync!
nsCSSStyleSheet* child = new nsCSSStyleSheet(*otherChild,
this,
nsnull,
aDocumentToUse,
nsnull);
if (child) {
NS_ADDREF(child);
(*ourSlot) = child;
ourSlot = &(child->mNext);
}
otherChild = otherChild->mNext;
}
while (otherChild && ourSlot);
}
}
nsCSSStyleSheet::~nsCSSStyleSheet()
{
if (mFirstChild) {
nsCSSStyleSheet* child = mFirstChild;
do {
for (nsCSSStyleSheet* child = mInner->mFirstChild;
child;
child = child->mNext) {
// XXXbz this is a little bogus; see the XXX comment where we
// declare mFirstChild.
if (child->mParent == this) {
child->mParent = nsnull;
child->mDocument = nsnull;
child = child->mNext;
} while (child);
NS_RELEASE(mFirstChild);
}
}
NS_IF_RELEASE(mNext);
if (nsnull != mRuleCollection) {
mRuleCollection->DropReference();
NS_RELEASE(mRuleCollection);
@ -1185,8 +1214,13 @@ nsCSSStyleSheet::SetOwningDocument(nsIDocument* aDocument)
{ // not ref counted
mDocument = aDocument;
// Now set the same document on all our child sheets....
for (nsCSSStyleSheet* child = mFirstChild; child; child = child->mNext) {
child->SetOwningDocument(aDocument);
// XXXbz this is a little bogus; see the XXX comment where we
// declare mFirstChild.
for (nsCSSStyleSheet* child = mInner->mFirstChild;
child; child = child->mNext) {
if (child->mParent == this) {
child->SetOwningDocument(aDocument);
}
}
return NS_OK;
}
@ -1234,17 +1268,16 @@ nsCSSStyleSheet::ContainsStyleSheet(nsIURI* aURL, PRBool& aContains, nsIStyleShe
if (aContains) {
// if we found it and the out-param is there, set it and addref
if (aTheChild) {
rv = QueryInterface( NS_GET_IID(nsIStyleSheet), (void **)aTheChild);
rv = CallQueryInterface(this, aTheChild);
}
} else {
nsCSSStyleSheet* child = mFirstChild;
// now check the chil'ins out (recursively)
while ((PR_FALSE == aContains) && (nsnull != child)) {
for (nsCSSStyleSheet* child = mInner->mFirstChild;
child;
child = child->mNext) {
child->ContainsStyleSheet(aURL, aContains, aTheChild);
if (aContains) {
break;
} else {
child = child->mNext;
}
}
}
@ -1260,19 +1293,13 @@ nsCSSStyleSheet::AppendStyleSheet(nsICSSStyleSheet* aSheet)
NS_PRECONDITION(nsnull != aSheet, "null arg");
if (NS_SUCCEEDED(WillDirty())) {
NS_ADDREF(aSheet);
nsCSSStyleSheet* sheet = (nsCSSStyleSheet*)aSheet;
if (! mFirstChild) {
mFirstChild = sheet;
}
else {
nsCSSStyleSheet* child = mFirstChild;
while (child->mNext) {
child = child->mNext;
}
child->mNext = sheet;
nsRefPtr<nsCSSStyleSheet>* tail = &mInner->mFirstChild;
while (*tail) {
tail = &(*tail)->mNext;
}
*tail - sheet;
// This is not reference counted. Our parent tells us when
// it's going away.
@ -1291,21 +1318,15 @@ nsCSSStyleSheet::InsertStyleSheetAt(nsICSSStyleSheet* aSheet, PRInt32 aIndex)
nsresult result = WillDirty();
if (NS_SUCCEEDED(result)) {
NS_ADDREF(aSheet);
nsCSSStyleSheet* sheet = (nsCSSStyleSheet*)aSheet;
nsCSSStyleSheet* child = mFirstChild;
if (aIndex && child) {
while ((0 < --aIndex) && child->mNext) {
child = child->mNext;
}
sheet->mNext = child->mNext;
child->mNext = sheet;
}
else {
sheet->mNext = mFirstChild;
mFirstChild = sheet;
nsRefPtr<nsCSSStyleSheet>* tail = &mInner->mFirstChild;
while (*tail && aIndex) {
--aIndex;
tail = &(*tail)->mNext;
}
sheet->mNext = *tail;
*tail = sheet;
// This is not reference counted. Our parent tells us when
// it's going away.
@ -1427,7 +1448,7 @@ nsCSSStyleSheet::StyleSheetCount(PRInt32& aCount) const
// consider storing the children in an array.
aCount = 0;
const nsCSSStyleSheet* child = mFirstChild;
const nsCSSStyleSheet* child = mInner->mFirstChild;
while (child) {
aCount++;
child = child->mNext;
@ -1444,16 +1465,13 @@ nsCSSStyleSheet::GetStyleSheetAt(PRInt32 aIndex, nsICSSStyleSheet*& aSheet) cons
// underlying storage mechanism
aSheet = nsnull;
if (mFirstChild) {
const nsCSSStyleSheet* child = mFirstChild;
while ((child) && (0 != aIndex)) {
--aIndex;
child = child->mNext;
}
aSheet = (nsICSSStyleSheet*)child;
NS_IF_ADDREF(aSheet);
nsCSSStyleSheet* child = mInner->mFirstChild;
while (child && (0 != aIndex)) {
--aIndex;
child = child->mNext;
}
NS_IF_ADDREF(aSheet = child);
return NS_OK;
}
@ -1536,10 +1554,10 @@ void nsCSSStyleSheet::List(FILE* out, PRInt32 aIndent) const
}
fputs("\n", out);
const nsCSSStyleSheet* child = mFirstChild;
while (nsnull != child) {
for (const nsCSSStyleSheet* child = mInner->mFirstChild;
child;
child = child->mNext) {
child->List(out, aIndent + 1);
child = child->mNext;
}
fputs("Rules in source order:\n", out);

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

@ -56,6 +56,7 @@
class nsIURI;
class nsMediaList;
class nsMediaQueryResultCacheKey;
class nsCSSStyleSheet;
// -------------------------------
// CSS Style Sheet Inner Data Container
@ -64,10 +65,10 @@ class nsMediaQueryResultCacheKey;
class nsCSSStyleSheetInner {
public:
nsCSSStyleSheetInner(nsICSSStyleSheet* aParentSheet);
nsCSSStyleSheetInner(nsCSSStyleSheetInner& aCopy, nsICSSStyleSheet* aParentSheet);
nsCSSStyleSheetInner(nsCSSStyleSheetInner& aCopy, nsCSSStyleSheet* aParentSheet);
virtual ~nsCSSStyleSheetInner();
virtual nsCSSStyleSheetInner* CloneFor(nsICSSStyleSheet* aParentSheet);
virtual nsCSSStyleSheetInner* CloneFor(nsCSSStyleSheet* aParentSheet);
virtual void AddSheet(nsICSSStyleSheet* aParentSheet);
virtual void RemoveSheet(nsICSSStyleSheet* aParentSheet);
@ -81,6 +82,12 @@ public:
nsCOMArray<nsICSSRule> mOrderedRules;
nsAutoPtr<nsXMLNameSpaceMap> mNameSpaceMap;
PRBool mComplete;
// Linked list of child sheets. This is al fundamentally broken, because
// each of the child sheets has a unique parent... We can only hope (and
// currently this is the case) that any time page JS can get ts hands on a
// child sheet that means we've already ensured unique inners throughout its
// parent chain and things are good.
nsRefPtr<nsCSSStyleSheet> mFirstChild;
#ifdef DEBUG
PRBool mPrincipalSet;
@ -94,6 +101,7 @@ public:
class CSSRuleListImpl;
static PRBool CascadeSheetRulesInto(nsICSSStyleSheet* aSheet, void* aData);
struct ChildSheetListBuilder;
class nsCSSStyleSheet : public nsICSSStyleSheet,
public nsIDOMCSSStyleSheet,
@ -200,8 +208,7 @@ protected:
protected:
nsString mTitle;
nsCOMPtr<nsMediaList> mMedia;
nsCSSStyleSheet* mFirstChild;
nsCSSStyleSheet* mNext;
nsRefPtr<nsCSSStyleSheet> mNext;
nsICSSStyleSheet* mParent; // weak ref
nsICSSImportRule* mOwnerRule; // weak ref
@ -218,6 +225,7 @@ protected:
friend class nsMediaList;
friend PRBool CascadeSheetRulesInto(nsICSSStyleSheet* aSheet, void* aData);
friend nsresult NS_NewCSSStyleSheet(nsICSSStyleSheet** aInstancePtrResult);
friend struct ChildSheetListBuilder;
};
#endif /* !defined(nsCSSStyleSheet_h_) */