mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-18 06:45:33 +00:00
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:
parent
ff7706a544
commit
e1f03a883b
13
layout/reftests/css-import/290018-1.html
Normal file
13
layout/reftests/css-import/290018-1.html
Normal file
@ -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>
|
||||
|
11
layout/reftests/css-import/290018-ref.html
Normal file
11
layout/reftests/css-import/290018-ref.html
Normal file
@ -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>
|
||||
|
15
layout/reftests/css-import/436261-1.html
Normal file
15
layout/reftests/css-import/436261-1.html
Normal file
@ -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>
|
12
layout/reftests/css-import/436261-2.html
Normal file
12
layout/reftests/css-import/436261-2.html
Normal file
@ -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>
|
21
layout/reftests/css-import/436261-3.html
Normal file
21
layout/reftests/css-import/436261-3.html
Normal file
@ -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>
|
6
layout/reftests/css-import/436261-ref.html
Normal file
6
layout/reftests/css-import/436261-ref.html
Normal file
@ -0,0 +1,6 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
<p style="background-color: green; color: white">test</p>
|
||||
</body>
|
||||
</html>
|
20
layout/reftests/css-import/444723-1.html
Normal file
20
layout/reftests/css-import/444723-1.html
Normal file
@ -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>
|
20
layout/reftests/css-import/444723-2.html
Normal file
20
layout/reftests/css-import/444723-2.html
Normal file
@ -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>
|
12
layout/reftests/css-import/444723-ref.html
Normal file
12
layout/reftests/css-import/444723-ref.html
Normal file
@ -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>
|
12
layout/reftests/css-import/445415-1-ref.xhtml
Normal file
12
layout/reftests/css-import/445415-1-ref.xhtml
Normal file
@ -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>
|
19
layout/reftests/css-import/445415-1a.xhtml
Normal file
19
layout/reftests/css-import/445415-1a.xhtml
Normal file
@ -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>
|
19
layout/reftests/css-import/445415-1b.xhtml
Normal file
19
layout/reftests/css-import/445415-1b.xhtml
Normal file
@ -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>
|
12
layout/reftests/css-import/445415-2-ref.xhtml
Normal file
12
layout/reftests/css-import/445415-2-ref.xhtml
Normal file
@ -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>
|
19
layout/reftests/css-import/445415-2a.xhtml
Normal file
19
layout/reftests/css-import/445415-2a.xhtml
Normal file
@ -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>
|
19
layout/reftests/css-import/445415-2b.xhtml
Normal file
19
layout/reftests/css-import/445415-2b.xhtml
Normal file
@ -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>
|
2
layout/reftests/css-import/inner-sheet.css
Normal file
2
layout/reftests/css-import/inner-sheet.css
Normal file
@ -0,0 +1,2 @@
|
||||
p { background-color: green; color: white }
|
||||
.inner { color: yellow; }
|
3
layout/reftests/css-import/other-outermost-sheet.css
Normal file
3
layout/reftests/css-import/other-outermost-sheet.css
Normal file
@ -0,0 +1,3 @@
|
||||
@import url("outer-sheet.css");
|
||||
|
||||
.outermost { color: cyan; }
|
2
layout/reftests/css-import/outer-sheet.css
Normal file
2
layout/reftests/css-import/outer-sheet.css
Normal file
@ -0,0 +1,2 @@
|
||||
@import url("inner-sheet.css");
|
||||
.outer { color: blue; }
|
3
layout/reftests/css-import/outermost-sheet.css
Normal file
3
layout/reftests/css-import/outermost-sheet.css
Normal file
@ -0,0 +1,3 @@
|
||||
@import url("outer-sheet.css");
|
||||
|
||||
.outermost { color: purple; }
|
10
layout/reftests/css-import/reftest.list
Normal file
10
layout/reftests/css-import/reftest.list
Normal file
@ -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_) */
|
||||
|
Loading…
x
Reference in New Issue
Block a user