Bug 748692. Don't reparse inline stylesheets on random attribute changes. r=sicking

This commit is contained in:
Boris Zbarsky 2012-06-01 00:30:42 -04:00
parent 94b5beb86f
commit 11bf7acee3
6 changed files with 66 additions and 26 deletions

View File

@ -274,20 +274,23 @@ nsHTMLLinkElement::SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
Link::ResetLinkState(!!aNotify); Link::ResetLinkState(!!aNotify);
} }
if (NS_SUCCEEDED(rv)) { if (NS_SUCCEEDED(rv) && aNameSpaceID == kNameSpaceID_None &&
(aName == nsGkAtoms::href ||
aName == nsGkAtoms::rel ||
aName == nsGkAtoms::title ||
aName == nsGkAtoms::media ||
aName == nsGkAtoms::type)) {
bool dropSheet = false; bool dropSheet = false;
if (aNameSpaceID == kNameSpaceID_None && aName == nsGkAtoms::rel && if (aName == nsGkAtoms::rel && GetStyleSheet()) {
GetStyleSheet()) {
PRUint32 linkTypes = nsStyleLinkElement::ParseLinkTypes(aValue); PRUint32 linkTypes = nsStyleLinkElement::ParseLinkTypes(aValue);
dropSheet = !(linkTypes & STYLESHEET); dropSheet = !(linkTypes & STYLESHEET);
} }
UpdateStyleSheetInternal(nsnull, UpdateStyleSheetInternal(nsnull,
dropSheet || dropSheet ||
(aNameSpaceID == kNameSpaceID_None && (aName == nsGkAtoms::title ||
(aName == nsGkAtoms::title || aName == nsGkAtoms::media ||
aName == nsGkAtoms::media || aName == nsGkAtoms::type));
aName == nsGkAtoms::type)));
} }
return rv; return rv;
@ -299,13 +302,15 @@ nsHTMLLinkElement::UnsetAttr(PRInt32 aNameSpaceID, nsIAtom* aAttribute,
{ {
nsresult rv = nsGenericHTMLElement::UnsetAttr(aNameSpaceID, aAttribute, nsresult rv = nsGenericHTMLElement::UnsetAttr(aNameSpaceID, aAttribute,
aNotify); aNotify);
if (NS_SUCCEEDED(rv)) { // Since removing href or rel makes us no longer link to a
UpdateStyleSheetInternal(nsnull, // stylesheet, force updates for those too.
aNameSpaceID == kNameSpaceID_None && if (NS_SUCCEEDED(rv) && aNameSpaceID == kNameSpaceID_None &&
(aAttribute == nsGkAtoms::rel || (aAttribute == nsGkAtoms::href ||
aAttribute == nsGkAtoms::title || aAttribute == nsGkAtoms::rel ||
aAttribute == nsGkAtoms::media || aAttribute == nsGkAtoms::title ||
aAttribute == nsGkAtoms::type)); aAttribute == nsGkAtoms::media ||
aAttribute == nsGkAtoms::type)) {
UpdateStyleSheetInternal(nsnull, true);
} }
// The ordering of the parent class's UnsetAttr call and Link::ResetLinkState // The ordering of the parent class's UnsetAttr call and Link::ResetLinkState

View File

@ -237,12 +237,11 @@ nsHTMLStyleElement::SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
{ {
nsresult rv = nsGenericHTMLElement::SetAttr(aNameSpaceID, aName, aPrefix, nsresult rv = nsGenericHTMLElement::SetAttr(aNameSpaceID, aName, aPrefix,
aValue, aNotify); aValue, aNotify);
if (NS_SUCCEEDED(rv)) { if (NS_SUCCEEDED(rv) && aNameSpaceID == kNameSpaceID_None &&
UpdateStyleSheetInternal(nsnull, (aName == nsGkAtoms::title ||
aNameSpaceID == kNameSpaceID_None && aName == nsGkAtoms::media ||
(aName == nsGkAtoms::title || aName == nsGkAtoms::type)) {
aName == nsGkAtoms::media || UpdateStyleSheetInternal(nsnull, true);
aName == nsGkAtoms::type));
} }
return rv; return rv;
@ -254,12 +253,11 @@ nsHTMLStyleElement::UnsetAttr(PRInt32 aNameSpaceID, nsIAtom* aAttribute,
{ {
nsresult rv = nsGenericHTMLElement::UnsetAttr(aNameSpaceID, aAttribute, nsresult rv = nsGenericHTMLElement::UnsetAttr(aNameSpaceID, aAttribute,
aNotify); aNotify);
if (NS_SUCCEEDED(rv)) { if (NS_SUCCEEDED(rv) && aNameSpaceID == kNameSpaceID_None &&
UpdateStyleSheetInternal(nsnull, (aAttribute == nsGkAtoms::title ||
aNameSpaceID == kNameSpaceID_None && aAttribute == nsGkAtoms::media ||
(aAttribute == nsGkAtoms::title || aAttribute == nsGkAtoms::type)) {
aAttribute == nsGkAtoms::media || UpdateStyleSheetInternal(nsnull, true);
aAttribute == nsGkAtoms::type));
} }
return rv; return rv;

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<head>
<style>
body { color: green; }
</style>
</head>
<body>
This text should be green
</body>

View File

@ -0,0 +1,13 @@
<!DOCTYPE html>
<head>
<style>
body { color: red; }
</style>
<script>
document.styleSheets[0].insertRule("body { color: green; }", 1);
document.querySelector("style").className = "foo";
</script>
</head>
<body>
This text should be green
</body>

View File

@ -0,0 +1,13 @@
<!DOCTYPE html>
<head>
<style class="foo">
body { color: red; }
</style>
<script>
document.styleSheets[0].insertRule("body { color: green; }", 1);
document.querySelector("style").removeAttribute("class");
</script>
</head>
<body>
This text should be green
</body>

View File

@ -1704,3 +1704,5 @@ needs-focus == 731726-1.html 731726-1-ref.html
== 751012-1a.html 751012-1-ref.html == 751012-1a.html 751012-1-ref.html
== 751012-1b.html 751012-1-ref.html == 751012-1b.html 751012-1-ref.html
== 690643-1.html 690643-1-ref.html == 690643-1.html 690643-1-ref.html
== 748692-1a.html 748692-1-ref.html
== 748692-1b.html 748692-1-ref.html