Commit c0c8b9c3 authored by rune@opera.com's avatar rune@opera.com

When the ::first-letter pseudo element is added or removed, it causes a

Reattach which means everything will work fine for ::first-letter changes.

However, if there is a change in ::first-letter style, but the element had
::first-letter style both before and after the change, we would not try to
recalc any ::first-letter pseudo for LocalStyleChange.

The introduction of LocalStyleChange for :hover/:active/:focus caused a
regression for the combination of ::first-letter and e.g. :hover.

This fix does a SubtreeStyleChange for :hover/:active/:focus updates when
the existing renderStyle is marked as having ::first-letter pseudo.

::first-line is working fine. Added a layout test to make sure it will
continue to do so.

R=esprehn
BUG=344322

Review URL: https://codereview.chromium.org/169643002

git-svn-id: svn://svn.chromium.org/blink/trunk@168509 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 4f2ea592
<!DOCTYPE html>
<div style="width: 400px; height: 400px;">
<p><span style="background-color:green">X</span></p>
<p>The X above should have a green background when hovered.</p>
</div>
<!DOCTYPE html>
<style>
#t { width: 400px; height: 400px; }
#t::first-letter { background-color: red; }
#t:hover::first-letter { background-color: green; }
</style>
<div id="t">
<div>
<p>X</p>
<p>The X above should have a green background when hovered.</p>
</div>
</div>
<script>
document.body.offsetTop; // Force layout. The mouse is not tracked before first layout.
if (window.eventSender)
eventSender.mouseMoveTo(100, 100); // Hover.
document.body.offsetTop; // Update layout for the hovered state.
</script>
<!DOCTYPE html>
<div style="width: 600px; height: 400px;">
<p><span style="background-color:green">This text should have a green background when hovered.</span></p>
</div>
<!DOCTYPE html>
<style>
#t { width: 600px; height: 400px; }
#t::first-line { background-color: red; }
#t:hover::first-line { background-color: green; }
</style>
<div id="t">
<div>
<p>This text should have a green background when hovered.</p>
</div>
</div>
<script>
document.body.offsetTop; // Force layout. The mouse is not tracked before first layout.
if (window.eventSender)
eventSender.mouseMoveTo(100, 100); // Hover.
document.body.offsetTop; // Update layout for the hovered state.
</script>
...@@ -809,7 +809,8 @@ void ContainerNode::focusStateChanged() ...@@ -809,7 +809,8 @@ void ContainerNode::focusStateChanged()
if (!renderer()) if (!renderer())
return; return;
if (isElementNode() && toElement(this)->childrenAffectedByFocus()) if ((isElementNode() && toElement(this)->childrenAffectedByFocus())
|| (renderStyle()->affectedByFocus() && renderStyle()->hasPseudoStyle(FIRST_LETTER)))
setNeedsStyleRecalc(SubtreeStyleChange); setNeedsStyleRecalc(SubtreeStyleChange);
else if (renderStyle()->affectedByFocus()) else if (renderStyle()->affectedByFocus())
setNeedsStyleRecalc(LocalStyleChange); setNeedsStyleRecalc(LocalStyleChange);
...@@ -846,7 +847,8 @@ void ContainerNode::setActive(bool down) ...@@ -846,7 +847,8 @@ void ContainerNode::setActive(bool down)
// FIXME: Why does this not need to handle the display: none transition like :hover does? // FIXME: Why does this not need to handle the display: none transition like :hover does?
if (renderer()) { if (renderer()) {
if (isElementNode() && toElement(this)->childrenAffectedByActive()) if ((isElementNode() && toElement(this)->childrenAffectedByActive())
|| (renderStyle()->affectedByActive() && renderStyle()->hasPseudoStyle(FIRST_LETTER)))
setNeedsStyleRecalc(SubtreeStyleChange); setNeedsStyleRecalc(SubtreeStyleChange);
else if (renderStyle()->affectedByActive()) else if (renderStyle()->affectedByActive())
setNeedsStyleRecalc(LocalStyleChange); setNeedsStyleRecalc(LocalStyleChange);
...@@ -874,7 +876,8 @@ void ContainerNode::setHovered(bool over) ...@@ -874,7 +876,8 @@ void ContainerNode::setHovered(bool over)
return; return;
} }
if (isElementNode() && toElement(this)->childrenAffectedByHover()) if ((isElementNode() && toElement(this)->childrenAffectedByHover())
|| (renderStyle()->affectedByHover() && renderStyle()->hasPseudoStyle(FIRST_LETTER)))
setNeedsStyleRecalc(SubtreeStyleChange); setNeedsStyleRecalc(SubtreeStyleChange);
else if (renderStyle()->affectedByHover()) else if (renderStyle()->affectedByHover())
setNeedsStyleRecalc(LocalStyleChange); setNeedsStyleRecalc(LocalStyleChange);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment