Title: [140287] trunk
Revision
140287
Author
[email protected]
Date
2013-01-20 18:24:47 -0800 (Sun, 20 Jan 2013)

Log Message

[Shadow DOM] Specifying scrollbar style of an element having RenderLayer in ShadowDOM does not work.
https://bugs.webkit.org/show_bug.cgi?id=107222

Reviewed by Simon Fraser.

Source/WebCore:

When specifying scrollbar style in ShadowDOM, it's not used. If the host element of ShadowDOM has scrollbar style,
it's used instead.

The root cause of this bug is that RenderLayer always see shadowAncestorNode's style. Some elements having
UserAgent ShadowDOM (e.g. <textarea>) should see host's style, but most of elements should see its style.

Test: fast/dom/shadow/scrollbar.html

* rendering/RenderLayer.cpp:
(WebCore::rendererForScrollbar):
(WebCore):
(WebCore::RenderLayer::createScrollbar):
(WebCore::RenderLayer::updateScrollCornerStyle):
(WebCore::RenderLayer::updateResizerStyle):

LayoutTests:

* fast/dom/shadow/scrollbar-expected.html: Added.
* fast/dom/shadow/scrollbar.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (140286 => 140287)


--- trunk/LayoutTests/ChangeLog	2013-01-21 01:29:07 UTC (rev 140286)
+++ trunk/LayoutTests/ChangeLog	2013-01-21 02:24:47 UTC (rev 140287)
@@ -1,3 +1,13 @@
+2013-01-20  Shinya Kawanaka  <[email protected]>
+
+        [Shadow DOM] Specifying scrollbar style of an element having RenderLayer in ShadowDOM does not work.
+        https://bugs.webkit.org/show_bug.cgi?id=107222
+
+        Reviewed by Simon Fraser.
+
+        * fast/dom/shadow/scrollbar-expected.html: Added.
+        * fast/dom/shadow/scrollbar.html: Added.
+
 2013-01-20  Yoshifumi Inoue  <[email protected]>
 
         Dragging over an element with scrollbars should scroll the element when dragging near edges

Added: trunk/LayoutTests/fast/dom/shadow/scrollbar-expected.html (0 => 140287)


--- trunk/LayoutTests/fast/dom/shadow/scrollbar-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/shadow/scrollbar-expected.html	2013-01-21 02:24:47 UTC (rev 140287)
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><body>
+
+<style>
+#host {
+    width: 200px;
+    height: 100px;
+    background-color: blue;
+}
+
+#host::-webkit-scrollbar {
+   width: 20px;
+}
+
+#div1 {
+   position: fixed;
+   overflow: scroll;
+   width: 80px;
+   height: 80px;
+   background-color: red;
+}
+
+#div1::-webkit-scrollbar {
+   width: 20px;
+}
+</style>
+
+<div id="host"><div id="div1">some long text showing scrollbar</div></div>
+
+</body></html>

Added: trunk/LayoutTests/fast/dom/shadow/scrollbar.html (0 => 140287)


--- trunk/LayoutTests/fast/dom/shadow/scrollbar.html	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/shadow/scrollbar.html	2013-01-21 02:24:47 UTC (rev 140287)
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html><body>
+
+<style>
+#host {
+    width: 200px;
+    height: 100px;
+    background-color: blue;
+}
+
+#host::-webkit-scrollbar {
+   width: 50px;
+}
+
+#div1 {
+   position: fixed;
+   overflow: scroll;
+   width: 80px;
+   height: 80px;
+   background-color: red;
+}
+
+#div1::-webkit-scrollbar {
+   width: 20px;
+}
+</style>
+
+<div id="host"></div>
+
+<script>
+var shadowRoot = host.webkitCreateShadowRoot();
+shadowRoot.applyAuthorStyles = true;
+shadowRoot.innerHTML = '<div id="div1">some long text showing scrollbar</div>';
+</script>
+
+</body></html>

Modified: trunk/Source/WebCore/ChangeLog (140286 => 140287)


--- trunk/Source/WebCore/ChangeLog	2013-01-21 01:29:07 UTC (rev 140286)
+++ trunk/Source/WebCore/ChangeLog	2013-01-21 02:24:47 UTC (rev 140287)
@@ -1,3 +1,25 @@
+2013-01-20  Shinya Kawanaka  <[email protected]>
+
+        [Shadow DOM] Specifying scrollbar style of an element having RenderLayer in ShadowDOM does not work.
+        https://bugs.webkit.org/show_bug.cgi?id=107222
+
+        Reviewed by Simon Fraser.
+
+        When specifying scrollbar style in ShadowDOM, it's not used. If the host element of ShadowDOM has scrollbar style,
+        it's used instead.
+
+        The root cause of this bug is that RenderLayer always see shadowAncestorNode's style. Some elements having
+        UserAgent ShadowDOM (e.g. <textarea>) should see host's style, but most of elements should see its style.
+
+        Test: fast/dom/shadow/scrollbar.html
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::rendererForScrollbar):
+        (WebCore):
+        (WebCore::RenderLayer::createScrollbar):
+        (WebCore::RenderLayer::updateScrollCornerStyle):
+        (WebCore::RenderLayer::updateResizerStyle):
+
 2013-01-20  Yoshifumi Inoue  <[email protected]>
 
         Dragging over an element with scrollbars should scroll the element when dragging near edges

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (140286 => 140287)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2013-01-21 01:29:07 UTC (rev 140286)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2013-01-21 02:24:47 UTC (rev 140287)
@@ -93,6 +93,7 @@
 #include "ScrollbarTheme.h"
 #include "ScrollingCoordinator.h"
 #include "Settings.h"
+#include "ShadowRoot.h"
 #include "SourceGraphic.h"
 #include "StylePropertySet.h"
 #include "StyleResolver.h"
@@ -2697,10 +2698,22 @@
         m_resizer->repaintRectangle(rect);
 }
 
+static inline RenderObject* rendererForScrollbar(RenderObject* renderer)
+{
+    if (Node* node = renderer->node()) {
+        if (ShadowRoot* shadowRoot = node->containingShadowRoot()) {
+            if (shadowRoot->type() == ShadowRoot::UserAgentShadowRoot)
+                return shadowRoot->host()->renderer();
+        }
+    }
+
+    return renderer;
+}
+
 PassRefPtr<Scrollbar> RenderLayer::createScrollbar(ScrollbarOrientation orientation)
 {
     RefPtr<Scrollbar> widget;
-    RenderObject* actualRenderer = renderer()->node() ? renderer()->node()->shadowAncestorNode()->renderer() : renderer();
+    RenderObject* actualRenderer = rendererForScrollbar(renderer());
     bool hasCustomScrollbarStyle = actualRenderer->isBox() && actualRenderer->style()->hasPseudoStyle(SCROLLBAR);
     if (hasCustomScrollbarStyle)
         widget = RenderScrollbar::createCustomScrollbar(this, orientation, actualRenderer->node());
@@ -5563,7 +5576,7 @@
 
 void RenderLayer::updateScrollCornerStyle()
 {
-    RenderObject* actualRenderer = renderer()->node() ? renderer()->node()->shadowAncestorNode()->renderer() : renderer();
+    RenderObject* actualRenderer = rendererForScrollbar(renderer());
     RefPtr<RenderStyle> corner = renderer()->hasOverflowClip() ? actualRenderer->getUncachedPseudoStyle(SCROLLBAR_CORNER, actualRenderer->style()) : PassRefPtr<RenderStyle>(0);
     if (corner) {
         if (!m_scrollCorner) {
@@ -5579,7 +5592,7 @@
 
 void RenderLayer::updateResizerStyle()
 {
-    RenderObject* actualRenderer = renderer()->node() ? renderer()->node()->shadowAncestorNode()->renderer() : renderer();
+    RenderObject* actualRenderer = rendererForScrollbar(renderer());
     RefPtr<RenderStyle> resizer = renderer()->hasOverflowClip() ? actualRenderer->getUncachedPseudoStyle(RESIZER, actualRenderer->style()) : PassRefPtr<RenderStyle>(0);
     if (resizer) {
         if (!m_resizer) {
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to