Title: [143300] trunk
Revision
143300
Author
[email protected]
Date
2013-02-18 23:31:43 -0800 (Mon, 18 Feb 2013)

Log Message

:before/:after pseudo elements do not always apply to the proper element
https://bugs.webkit.org/show_bug.cgi?id=93925

Reviewed by Dimitri Glazkov.

Source/WebCore:

Disable sharing a style with siblings if :after or :before pseudo style
is unique.

Test: fast/css/before-after-pseudo-class.html

* css/StyleResolver.cpp:
(WebCore::StyleResolver::canShareStyleWithElement):
Added a new condition, hasUniquePseudoStyle.
* rendering/style/RenderStyle.cpp:
(WebCore::RenderStyle::hasUniquePseudoStyle):
Added to check whether any pseudo style has unique bit or not.
(WebCore):
* rendering/style/RenderStyle.h:

LayoutTests:

* fast/css/before-after-pseudo-class-expected.html: Added.
* fast/css/before-after-pseudo-class.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (143299 => 143300)


--- trunk/LayoutTests/ChangeLog	2013-02-19 07:22:32 UTC (rev 143299)
+++ trunk/LayoutTests/ChangeLog	2013-02-19 07:31:43 UTC (rev 143300)
@@ -1,3 +1,13 @@
+2013-02-18  Takashi Sakamoto  <[email protected]>
+
+        :before/:after pseudo elements do not always apply to the proper element
+        https://bugs.webkit.org/show_bug.cgi?id=93925
+
+        Reviewed by Dimitri Glazkov.
+
+        * fast/css/before-after-pseudo-class-expected.html: Added.
+        * fast/css/before-after-pseudo-class.html: Added.
+
 2013-02-18  Andy Estes  <[email protected]>
 
         Focusing a new frame (via window.focus()) should blur the active element in the current frame

Added: trunk/LayoutTests/fast/css/before-after-pseudo-class-expected.html (0 => 143300)


--- trunk/LayoutTests/fast/css/before-after-pseudo-class-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css/before-after-pseudo-class-expected.html	2013-02-19 07:31:43 UTC (rev 143300)
@@ -0,0 +1,13 @@
+<!doctype html>
+<html>
+<body>
+<p>
+    <div>GoogleGoogle</div>
+    <div>Example</div>
+</p>
+<div>
+    <div>WikipediaWikipedia</div>
+    <div>Example2</div>
+</div>
+</body>
+</html>

Added: trunk/LayoutTests/fast/css/before-after-pseudo-class.html (0 => 143300)


--- trunk/LayoutTests/fast/css/before-after-pseudo-class.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css/before-after-pseudo-class.html	2013-02-19 07:31:43 UTC (rev 143300)
@@ -0,0 +1,22 @@
+<!doctype html>
+<html>
+<head>
+<style type="text/css">
+div[rel^="http://www.google.com"]:before { content:"Google" }
+div[rel^="http://www.wikipedia.org"]:after { content:"Wikipedia" }
+</style>
+</head>
+<body>
+<!-- Test for Bug 93925 https://bugs.webkit.org/show_bug.cgi?id=93925 -->
+<!-- :before/:after pseudo elements do not always apply to the proper element -->
+<!-- The test passes if "GoogleGoogle", "Example", "WikipediaWikipedia", and "Example2" are shown.-->
+<p>
+  <div rel="http://www.google.com">Google</div>
+  <div rel="http://www.example.com">Example</div>
+</p>
+<div>
+  <div rel="http://www.wikipedia.org">Wikipedia</div>
+  <div rel="http://www2.example.com">Example2</div>
+</div>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (143299 => 143300)


--- trunk/Source/WebCore/ChangeLog	2013-02-19 07:22:32 UTC (rev 143299)
+++ trunk/Source/WebCore/ChangeLog	2013-02-19 07:31:43 UTC (rev 143300)
@@ -1,3 +1,24 @@
+2013-02-18  Takashi Sakamoto  <[email protected]>
+
+        :before/:after pseudo elements do not always apply to the proper element
+        https://bugs.webkit.org/show_bug.cgi?id=93925
+
+        Reviewed by Dimitri Glazkov.
+
+        Disable sharing a style with siblings if :after or :before pseudo style
+        is unique.
+
+        Test: fast/css/before-after-pseudo-class.html
+
+        * css/StyleResolver.cpp:
+        (WebCore::StyleResolver::canShareStyleWithElement):
+        Added a new condition, hasUniquePseudoStyle.
+        * rendering/style/RenderStyle.cpp:
+        (WebCore::RenderStyle::hasUniquePseudoStyle):
+        Added to check whether any pseudo style has unique bit or not.
+        (WebCore):
+        * rendering/style/RenderStyle.h:
+
 2013-02-18  Andy Estes  <[email protected]>
 
         Focusing a new frame (via window.focus()) should blur the active element in the current frame

Modified: trunk/Source/WebCore/css/StyleResolver.cpp (143299 => 143300)


--- trunk/Source/WebCore/css/StyleResolver.cpp	2013-02-19 07:22:32 UTC (rev 143299)
+++ trunk/Source/WebCore/css/StyleResolver.cpp	2013-02-19 07:31:43 UTC (rev 143300)
@@ -1013,6 +1013,8 @@
         return false;
     if (style->unique())
         return false;
+    if (style->hasUniquePseudoStyle())
+        return false;
     if (element->tagQName() != state.element()->tagQName())
         return false;
     if (element->inlineStyle())

Modified: trunk/Source/WebCore/rendering/style/RenderStyle.cpp (143299 => 143300)


--- trunk/Source/WebCore/rendering/style/RenderStyle.cpp	2013-02-19 07:22:32 UTC (rev 143299)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.cpp	2013-02-19 07:31:43 UTC (rev 143300)
@@ -261,6 +261,20 @@
     noninherited_flags._pseudoBits |= pseudoBit(pseudo);
 }
 
+bool RenderStyle::hasUniquePseudoStyle() const
+{
+    if (!m_cachedPseudoStyles || styleType() != NOPSEUDO)
+        return false;
+
+    for (size_t i = 0; i < m_cachedPseudoStyles->size(); ++i) {
+        RenderStyle* pseudoStyle = m_cachedPseudoStyles->at(i).get();
+        if (pseudoStyle->unique())
+            return true;
+    }
+
+    return false;
+}
+
 RenderStyle* RenderStyle::getCachedPseudoStyle(PseudoId pid) const
 {
     if (!m_cachedPseudoStyles || !m_cachedPseudoStyles->size())

Modified: trunk/Source/WebCore/rendering/style/RenderStyle.h (143299 => 143300)


--- trunk/Source/WebCore/rendering/style/RenderStyle.h	2013-02-19 07:22:32 UTC (rev 143299)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.h	2013-02-19 07:31:43 UTC (rev 143300)
@@ -423,6 +423,7 @@
     bool hasAnyPublicPseudoStyles() const;
     bool hasPseudoStyle(PseudoId pseudo) const;
     void setHasPseudoStyle(PseudoId pseudo);
+    bool hasUniquePseudoStyle() const;
 
     // attribute getter methods
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to