WebCore:
authorhyatt@apple.com <hyatt@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 10 Oct 2008 07:04:38 +0000 (07:04 +0000)
committerhyatt@apple.com <hyatt@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 10 Oct 2008 07:04:38 +0000 (07:04 +0000)
2008-10-09  David Hyatt  <hyatt@apple.com>

        Add support for scrollbar orientation as a pseudoclass.  Add support for whether or not the scrollbar
        is active as well.

        Reviewed by Tim Hatcher

        Added scrollbars/scrollbar-orientation.html

        * css/CSSSelector.cpp:
        (WebCore::CSSSelector::extractPseudoType):
        * css/CSSSelector.h:
        (WebCore::CSSSelector::):
        * css/CSSStyleSelector.cpp:
        (WebCore::CSSStyleSelector::SelectorChecker::checkScrollbarPseudoClass):
        * platform/Scrollbar.cpp:
        (WebCore::Scrollbar::isWindowActive):
        * platform/Scrollbar.h:
        * rendering/RenderScrollbar.cpp:
        (WebCore::RenderScrollbar::paint):
        (WebCore::RenderScrollbar::partForStyleResolve):
        * rendering/RenderScrollbar.h:

LayoutTests:

2008-10-09  David Hyatt  <hyatt@apple.com>

        Add layout test for scrollbars honoring orientation and window active state.

        Reviewed by Tim Hatcher

        * platform/mac/scrollbars/scrollbar-orientation-expected.checksum: Added.
        * platform/mac/scrollbars/scrollbar-orientation-expected.png: Added.
        * platform/mac/scrollbars/scrollbar-orientation-expected.txt: Added.
        * scrollbars/scrollbar-orientation.html: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@37475 268f45cc-cd09-0410-ab3c-d52691b4dbfc

13 files changed:
LayoutTests/ChangeLog
LayoutTests/platform/mac/scrollbars/scrollbar-orientation-expected.checksum [new file with mode: 0644]
LayoutTests/platform/mac/scrollbars/scrollbar-orientation-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/scrollbars/scrollbar-orientation-expected.txt [new file with mode: 0644]
LayoutTests/scrollbars/scrollbar-orientation.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/css/CSSSelector.cpp
WebCore/css/CSSSelector.h
WebCore/css/CSSStyleSelector.cpp
WebCore/platform/Scrollbar.cpp
WebCore/platform/Scrollbar.h
WebCore/rendering/RenderScrollbar.cpp
WebCore/rendering/RenderScrollbar.h

index faf73b2..9dcfd22 100644 (file)
@@ -1,5 +1,16 @@
 2008-10-09  David Hyatt  <hyatt@apple.com>
 
+        Add layout test for scrollbars honoring orientation and window active state.
+
+        Reviewed by Tim Hatcher
+
+        * platform/mac/scrollbars/scrollbar-orientation-expected.checksum: Added.
+        * platform/mac/scrollbars/scrollbar-orientation-expected.png: Added.
+        * platform/mac/scrollbars/scrollbar-orientation-expected.txt: Added.
+        * scrollbars/scrollbar-orientation.html: Added.
+
+2008-10-09  David Hyatt  <hyatt@apple.com>
+
         Add test case for disabled scrollbars.
 
         Reviewed by Tim Hatcher
diff --git a/LayoutTests/platform/mac/scrollbars/scrollbar-orientation-expected.checksum b/LayoutTests/platform/mac/scrollbars/scrollbar-orientation-expected.checksum
new file mode 100644 (file)
index 0000000..4604c40
--- /dev/null
@@ -0,0 +1 @@
+df7594c98e4f2401178795cee2570b7b
\ No newline at end of file
diff --git a/LayoutTests/platform/mac/scrollbars/scrollbar-orientation-expected.png b/LayoutTests/platform/mac/scrollbars/scrollbar-orientation-expected.png
new file mode 100644 (file)
index 0000000..83486b6
Binary files /dev/null and b/LayoutTests/platform/mac/scrollbars/scrollbar-orientation-expected.png differ
diff --git a/LayoutTests/platform/mac/scrollbars/scrollbar-orientation-expected.txt b/LayoutTests/platform/mac/scrollbars/scrollbar-orientation-expected.txt
new file mode 100644 (file)
index 0000000..377799b
--- /dev/null
@@ -0,0 +1,139 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+layer at (8,8) size 200x200 clip at (8,8) size 183x183 scrollWidth 317 scrollHeight 792
+  RenderBlock {DIV} at (0,0) size 200x200
+    RenderText {#text} at (0,0) size 35x18
+      text run at (0,0) width 35: "Hello"
+    RenderBR {BR} at (35,14) size 0x0
+    RenderText {#text} at (0,18) size 35x18
+      text run at (0,18) width 35: "Hello"
+    RenderBR {BR} at (35,32) size 0x0
+    RenderText {#text} at (0,36) size 35x18
+      text run at (0,36) width 35: "Hello"
+    RenderBR {BR} at (35,50) size 0x0
+    RenderText {#text} at (0,54) size 35x18
+      text run at (0,54) width 35: "Hello"
+    RenderBR {BR} at (35,68) size 0x0
+    RenderText {#text} at (0,72) size 35x18
+      text run at (0,72) width 35: "Hello"
+    RenderBR {BR} at (35,86) size 0x0
+    RenderText {#text} at (0,90) size 35x18
+      text run at (0,90) width 35: "Hello"
+    RenderBR {BR} at (35,104) size 0x0
+    RenderText {#text} at (0,108) size 35x18
+      text run at (0,108) width 35: "Hello"
+    RenderBR {BR} at (35,122) size 0x0
+    RenderText {#text} at (0,126) size 35x18
+      text run at (0,126) width 35: "Hello"
+    RenderBR {BR} at (35,140) size 0x0
+    RenderText {#text} at (0,144) size 35x18
+      text run at (0,144) width 35: "Hello"
+    RenderBR {BR} at (35,158) size 0x0
+    RenderText {#text} at (0,162) size 35x18
+      text run at (0,162) width 35: "Hello"
+    RenderBR {BR} at (35,176) size 0x0
+    RenderText {#text} at (0,180) size 35x18
+      text run at (0,180) width 35: "Hello"
+    RenderBR {BR} at (35,194) size 0x0
+    RenderText {#text} at (0,198) size 35x18
+      text run at (0,198) width 35: "Hello"
+    RenderBR {BR} at (35,212) size 0x0
+    RenderText {#text} at (0,216) size 35x18
+      text run at (0,216) width 35: "Hello"
+    RenderBR {BR} at (35,230) size 0x0
+    RenderText {#text} at (0,234) size 35x18
+      text run at (0,234) width 35: "Hello"
+    RenderBR {BR} at (35,248) size 0x0
+    RenderText {#text} at (0,252) size 35x18
+      text run at (0,252) width 35: "Hello"
+    RenderBR {BR} at (35,266) size 0x0
+    RenderText {#text} at (0,270) size 35x18
+      text run at (0,270) width 35: "Hello"
+    RenderBR {BR} at (35,284) size 0x0
+    RenderInline {SPAN} at (0,0) size 317x18
+      RenderText {#text} at (0,288) size 317x18
+        text run at (0,288) width 317: "Hello world this is a long string and will not wrap."
+    RenderText {#text} at (0,306) size 35x18
+      text run at (0,306) width 35: "Hello"
+    RenderBR {BR} at (35,320) size 0x0
+    RenderText {#text} at (0,324) size 35x18
+      text run at (0,324) width 35: "Hello"
+    RenderBR {BR} at (35,338) size 0x0
+    RenderText {#text} at (0,342) size 35x18
+      text run at (0,342) width 35: "Hello"
+    RenderBR {BR} at (35,356) size 0x0
+    RenderText {#text} at (0,360) size 35x18
+      text run at (0,360) width 35: "Hello"
+    RenderBR {BR} at (35,374) size 0x0
+    RenderText {#text} at (0,378) size 35x18
+      text run at (0,378) width 35: "Hello"
+    RenderBR {BR} at (35,392) size 0x0
+    RenderText {#text} at (0,396) size 35x18
+      text run at (0,396) width 35: "Hello"
+    RenderBR {BR} at (35,410) size 0x0
+    RenderText {#text} at (0,414) size 35x18
+      text run at (0,414) width 35: "Hello"
+    RenderBR {BR} at (35,428) size 0x0
+    RenderText {#text} at (0,432) size 35x18
+      text run at (0,432) width 35: "Hello"
+    RenderBR {BR} at (35,446) size 0x0
+    RenderText {#text} at (0,450) size 35x18
+      text run at (0,450) width 35: "Hello"
+    RenderBR {BR} at (35,464) size 0x0
+    RenderText {#text} at (0,468) size 35x18
+      text run at (0,468) width 35: "Hello"
+    RenderBR {BR} at (35,482) size 0x0
+    RenderText {#text} at (0,486) size 35x18
+      text run at (0,486) width 35: "Hello"
+    RenderBR {BR} at (35,500) size 0x0
+    RenderText {#text} at (0,504) size 35x18
+      text run at (0,504) width 35: "Hello"
+    RenderBR {BR} at (35,518) size 0x0
+    RenderText {#text} at (0,522) size 35x18
+      text run at (0,522) width 35: "Hello"
+    RenderBR {BR} at (35,536) size 0x0
+    RenderText {#text} at (0,540) size 35x18
+      text run at (0,540) width 35: "Hello"
+    RenderBR {BR} at (35,554) size 0x0
+    RenderText {#text} at (0,558) size 35x18
+      text run at (0,558) width 35: "Hello"
+    RenderBR {BR} at (35,572) size 0x0
+    RenderText {#text} at (0,576) size 35x18
+      text run at (0,576) width 35: "Hello"
+    RenderBR {BR} at (35,590) size 0x0
+    RenderText {#text} at (0,594) size 35x18
+      text run at (0,594) width 35: "Hello"
+    RenderBR {BR} at (35,608) size 0x0
+    RenderText {#text} at (0,612) size 35x18
+      text run at (0,612) width 35: "Hello"
+    RenderBR {BR} at (35,626) size 0x0
+    RenderText {#text} at (0,630) size 35x18
+      text run at (0,630) width 35: "Hello"
+    RenderBR {BR} at (35,644) size 0x0
+    RenderText {#text} at (0,648) size 35x18
+      text run at (0,648) width 35: "Hello"
+    RenderBR {BR} at (35,662) size 0x0
+    RenderText {#text} at (0,666) size 35x18
+      text run at (0,666) width 35: "Hello"
+    RenderBR {BR} at (35,680) size 0x0
+    RenderText {#text} at (0,684) size 35x18
+      text run at (0,684) width 35: "Hello"
+    RenderBR {BR} at (35,698) size 0x0
+    RenderText {#text} at (0,702) size 35x18
+      text run at (0,702) width 35: "Hello"
+    RenderBR {BR} at (35,716) size 0x0
+    RenderText {#text} at (0,720) size 35x18
+      text run at (0,720) width 35: "Hello"
+    RenderBR {BR} at (35,734) size 0x0
+    RenderText {#text} at (0,738) size 35x18
+      text run at (0,738) width 35: "Hello"
+    RenderBR {BR} at (35,752) size 0x0
+    RenderText {#text} at (0,756) size 35x18
+      text run at (0,756) width 35: "Hello"
+    RenderBR {BR} at (35,770) size 0x0
+    RenderText {#text} at (0,774) size 35x18
+      text run at (0,774) width 35: "Hello"
+    RenderBR {BR} at (35,788) size 0x0
diff --git a/LayoutTests/scrollbars/scrollbar-orientation.html b/LayoutTests/scrollbars/scrollbar-orientation.html
new file mode 100644 (file)
index 0000000..8734f73
--- /dev/null
@@ -0,0 +1,64 @@
+<head>
+<style>
+div::-webkit-scrollbar {
+  width:17px;
+  height:17px;
+}
+
+div::-webkit-scrollbar-button {
+  width: 17px;
+  height: 17px;
+}
+
+div::-webkit-scrollbar-button:-webkit-scrollbar-vertical {
+  background-color:lightblue;
+  border:2px solid black;
+}
+
+div::-webkit-scrollbar-button:-webkit-scrollbar-horizontal {
+  background-color:#208020;
+  border:2px solid black;
+}
+
+div::-webkit-scrollbar-thumb {
+  min-width:20px;
+  min-height:20px;
+  background-color: navy;
+  border:2px solid #cccccc;
+}
+
+div::-webkit-scrollbar-thumb:-webkit-scrollbar-horizontal {
+  background-color: #004000;
+}
+
+div::-webkit-scrollbar-button:disabled {
+  display:none
+}
+
+div::-webkit-scrollbar-track {
+  background-color: olive;
+}
+
+div::-webkit-scrollbar-track:-webkit-window-active {
+  background-color: #2060a0;
+}
+
+div::-webkit-scrollbar-track:-webkit-scrollbar-horizontal {
+  background-color: #40a040;
+}
+</style>
+</head>
+<body>
+<div style="width:200px; height:200px; overflow-y:scroll; overflow-x:scroll">
+Hello<br>
+Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>
+Hello<br>Hello<br>Hello<br>Hello<br>
+Hello<br>Hello<br>Hello<br>Hello<br>
+<span style="white-space:nowrap">Hello world this is a long string and will not wrap.</span>
+Hello<br>Hello<br>Hello<br>Hello<br>
+Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>
+Hello<br>Hello<br>Hello<br>Hello<br>
+Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>
+Hello<br>Hello<br>Hello<br>Hello<br>
+Hello<br>Hello<br>Hello<br>
+</div>
index a554c65..12b4537 100644 (file)
@@ -1,5 +1,28 @@
 2008-10-09  David Hyatt  <hyatt@apple.com>
 
+        Add support for scrollbar orientation as a pseudoclass.  Add support for whether or not the scrollbar
+        is active as well.
+
+        Reviewed by Tim Hatcher
+
+        Added scrollbars/scrollbar-orientation.html
+
+        * css/CSSSelector.cpp:
+        (WebCore::CSSSelector::extractPseudoType):
+        * css/CSSSelector.h:
+        (WebCore::CSSSelector::):
+        * css/CSSStyleSelector.cpp:
+        (WebCore::CSSStyleSelector::SelectorChecker::checkScrollbarPseudoClass):
+        * platform/Scrollbar.cpp:
+        (WebCore::Scrollbar::isWindowActive):
+        * platform/Scrollbar.h:
+        * rendering/RenderScrollbar.cpp:
+        (WebCore::RenderScrollbar::paint):
+        (WebCore::RenderScrollbar::partForStyleResolve):
+        * rendering/RenderScrollbar.h:
+
+2008-10-09  David Hyatt  <hyatt@apple.com>
+
         Add support for pseudo classes on scrollbar pseudo elements.  As an initial proof of concept only
         :enabled/:disabled are supported.  More pseudo classes will follow quickly now that this works.
 
index 5b8b4c2..a8862b5 100644 (file)
@@ -106,7 +106,6 @@ void CSSSelector::extractPseudoType() const
     static AtomicString onlyOfType("only-of-type");
     static AtomicString root("root");
     static AtomicString scrollbar("-webkit-scrollbar");
-    static AtomicString scrollbarActive("-webkit-scrollbar-active");
     static AtomicString scrollbarBack("-webkit-scrollbar-back");
     static AtomicString scrollbarButton("-webkit-scrollbar-button");
     static AtomicString scrollbarCorner("-webkit-scrollbar-corner");
@@ -124,7 +123,8 @@ void CSSSelector::extractPseudoType() const
     static AtomicString sliderThumb("-webkit-slider-thumb");
     static AtomicString target("target");
     static AtomicString visited("visited");
-    
+    static AtomicString windowActive("-webkit-window-active");
+
     bool element = false; // pseudo-element
     bool compat = false; // single colon compatbility mode
 
@@ -234,8 +234,8 @@ void CSSSelector::extractPseudoType() const
     else if (m_value == scrollbar) {
         element = true;
         m_pseudoType = PseudoScrollbar;
-    } else if (m_value == scrollbarActive)
-        m_pseudoType = PseudoScrollbarActive;
+    } else if (m_value == windowActive)
+        m_pseudoType = PseudoWindowActive;
     else if (m_value == scrollbarBack)
         m_pseudoType = PseudoScrollbarBack;
     else if (m_value == scrollbarButton) {
index b4a27a4..db4255b 100644 (file)
@@ -151,7 +151,6 @@ namespace WebCore {
             PseudoNot,
             PseudoRoot,
             PseudoScrollbar,
-            PseudoScrollbarActive,
             PseudoScrollbarBack,
             PseudoScrollbarButton,
             PseudoScrollbarCorner,
@@ -161,6 +160,7 @@ namespace WebCore {
             PseudoScrollbarTrack,
             PseudoScrollbarTrackPiece,
             PseudoScrollbarVertical,
+            PseudoWindowActive,
             PseudoSelection,
             PseudoFileUploadButton,
             PseudoSliderThumb,
index d43ed75..d7b9720 100644 (file)
@@ -2382,12 +2382,20 @@ bool CSSStyleSelector::SelectorChecker::checkOneSelector(CSSSelector* sel, Eleme
 bool CSSStyleSelector::SelectorChecker::checkScrollbarPseudoClass(CSSSelector* sel, RenderStyle::PseudoId& dynamicPseudo) const
 {
     RenderScrollbar* scrollbar = RenderScrollbar::scrollbarForStyleResolve();
-    ASSERT(sel->m_match == CSSSelector::PseudoClass && scrollbar);
+    ScrollbarPart part = RenderScrollbar::partForStyleResolve();
+    
+    ASSERT(sel->m_match == CSSSelector::PseudoClass && scrollbar && part != NoPart);
     switch (sel->pseudoType()) {
         case CSSSelector::PseudoEnabled:
             return scrollbar->enabled();
         case CSSSelector::PseudoDisabled:
             return !scrollbar->enabled();
+        case CSSSelector::PseudoScrollbarHorizontal:
+            return scrollbar->orientation() == HorizontalScrollbar;
+        case CSSSelector::PseudoScrollbarVertical:
+            return scrollbar->orientation() == VerticalScrollbar;
+        case CSSSelector::PseudoWindowActive:
+            return scrollbar->isWindowActive();
         default:
             return false;
     }
index d368de2..9985626 100644 (file)
@@ -418,6 +418,11 @@ void Scrollbar::setEnabled(bool e)
     invalidate();
 }
 
+bool Scrollbar::isWindowActive() const
+{
+    return m_client->isActive();
+}
 void Scrollbar::invalidateRect(const IntRect& rect)
 {
     if (suppressInvalidation())
index 802bcd7..aac15e7 100644 (file)
@@ -88,6 +88,8 @@ public:
     bool enabled() const { return m_enabled; }
     virtual void setEnabled(bool e);
 
+    bool isWindowActive() const;
+
     // These methods are used for platform scrollbars to give :hover feedback.  They will not get called
     // when the mouse went down in a scrollbar, since it is assumed the scrollbar will start
     // grabbing all events in that case anyway.
index 96b9083..c98058d 100644 (file)
@@ -64,6 +64,13 @@ void RenderScrollbar::setEnabled(bool e)
         updateScrollbarParts();
 }
 
+void RenderScrollbar::paint(GraphicsContext* context, const IntRect& damageRect)
+{
+    if (context->updatingControlTints())
+        updateScrollbarParts();
+    Scrollbar::paint(context, damageRect);
+}
+
 static ScrollbarPart s_styleResolvePart;
 static RenderScrollbar* s_styleResolveScrollbar;
 
@@ -72,6 +79,11 @@ RenderScrollbar* RenderScrollbar::scrollbarForStyleResolve()
     return s_styleResolveScrollbar;
 }
 
+ScrollbarPart RenderScrollbar::partForStyleResolve()
+{
+    return s_styleResolvePart;
+}
+
 RenderStyle* RenderScrollbar::getScrollbarPseudoStyle(ScrollbarPart partType, RenderStyle::PseudoId pseudoId)
 {
     s_styleResolvePart = partType;
index 268e422..b46ed69 100644 (file)
@@ -48,6 +48,8 @@ public:
     virtual void setParent(ScrollView*);
     virtual void setEnabled(bool);
 
+    virtual void paint(GraphicsContext*, const IntRect& damageRect);
+
     void updateScrollbarParts(RenderStyle* = 0, bool destroy = false);
 
     static ScrollbarPart partForStyleResolve();