Changeset 88415 in webkit


Ignore:
Timestamp:
Jun 8, 2011 7:06:38 PM (13 years ago)
Author:
tkent@chromium.org
Message:

Allow drawing a slider thumb for any nodes.
https://bugs.webkit.org/show_bug.cgi?id=62196

Reviewed by Dimitri Glazkov.

Source/WebCore:

RenderObject::node() should provide various information which is
necessary for rendering. We don't need to refer the parent renderer.

  • dom/Node.cpp:

(WebCore::Node::focusDe1egate): Added.

  • dom/Node.h: Added a declaration.
  • html/shadow/MediaControlElements.cpp:

(WebCore::toParentMediaElement):

Added an overload of toParentMediaElement() with Node* parameter.

  • html/shadow/MediaControlElements.h:

(WebCore::toParentMediaElement): ditto.

  • html/shadow/SliderThumbElement.cpp:

(WebCore::SliderThumbElement::isEnabledFormControl):

Returns the status of the host node.

(WebCore::SliderThumbElement::isReadOnlyFormControl): ditto.
(WebCore::SliderThumbElement::focusDe1egate):

Returns the host node so that RenderTheme::isFocused() returns true.

(WebCore::SliderThumbElement::detach): Style nit.
(WebCore::SliderThumbElement::hostInput):

Make it const because it is called by const functions.

  • html/shadow/SliderThumbElement.h:
    • Remove inDragMode()
    • Update declarations
  • platform/qt/RenderThemeQt.cpp:

(WebCore::RenderThemeQt::paintMediaSliderThumb):

Use Node::shadowAncestorNode() instead of RenderObject::parent() to
support deeper thumb nodes.

  • rendering/RenderMediaControlsChromium.cpp:

(WebCore::paintMediaSliderThumb): ditto.
(WebCore::paintMediaVolumeSliderThumb): Remove isSlider() check.

  • rendering/RenderSlider.cpp:

(WebCore::RenderSlider::inDragMode):

SliderThumbElement::inDragMode() was removed, and Node::active() has
the same information.

  • rendering/RenderTheme.cpp:

(WebCore::RenderTheme::paint): Remove isSlider() checks.
(WebCore::RenderTheme::isFocused): Apply Node::focusDelegate().

  • rendering/RenderThemeChromiumLinux.cpp:

(WebCore::RenderThemeChromiumLinux::paintSliderThumb):

isPressed() is enough.

  • rendering/RenderThemeChromiumWin.cpp: isEnabled(), isFocused(), and isPressed() are enough.

(WebCore::RenderThemeChromiumWin::determineSliderThumbState):
(WebCore::RenderThemeChromiumWin::determineClassicState):

  • rendering/RenderThemeMac.mm:

(WebCore::RenderThemeMac::paintSliderThumb):

  • Remove isSlider() check.
  • Passing 'o' to udpateFooState functions is enough.
  • isPressed() is enough.
  • rendering/RenderThemeSafari.cpp:

(WebCore::RenderThemeSafari::paintSliderThumb):

We don't need special handling anymore.

  • rendering/RenderThemeWin.cpp:

(WebCore::RenderThemeWin::determineSliderThumbState):

isEnabled(), isFocused(), and isPressed() are enough.

LayoutTests:

The behavior was changed. We should show slider thumbs for any nodes with
-webkit-appearance:slidertumb-horizontal/vertical.

  • fast/forms/thumbslider-no-parent-slider.html:
  • platform/chromium/test_expections.txt: Expect to fail with thumbslider-no-parent-slider.html.
  • platform/mac/fast/forms/thumbslider-no-parent-slider-expected.png:
  • platform/mac/fast/forms/thumbslider-no-parent-slider-expected.txt:
Location:
trunk
Files:
21 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r88414 r88415  
     12011-06-08  Kent Tamura  <tkent@chromium.org>
     2
     3        Reviewed by Dimitri Glazkov.
     4
     5        Allow drawing a slider thumb for any nodes.
     6        https://bugs.webkit.org/show_bug.cgi?id=62196
     7
     8        The behavior was changed. We should show slider thumbs for any nodes with
     9        -webkit-appearance:slidertumb-horizontal/vertical.
     10
     11        * fast/forms/thumbslider-no-parent-slider.html:
     12        * platform/chromium/test_expections.txt: Expect to fail with thumbslider-no-parent-slider.html.
     13        * platform/mac/fast/forms/thumbslider-no-parent-slider-expected.png:
     14        * platform/mac/fast/forms/thumbslider-no-parent-slider-expected.txt:
     15
    1162011-06-08  James Kozianski  <koz@chromium.org>
    217
  • trunk/LayoutTests/fast/forms/thumbslider-no-parent-slider.html

    r23840 r88415  
    11<html>
    22<head>
    3     <style type="text/css">
    4         #thumbHorizontal { -webkit-appearance: sliderthumb-horizontal; }
    5         #thumbVertical { -webkit-appearance: sliderthumb-vertical; }
    6     </style>
     3<style type="text/css">
     4#thumbHorizontal {
     5    -webkit-appearance: sliderthumb-horizontal;
     6    display: inline-block;
     7    width: 20px;
     8    height: 20px;
     9}
     10#thumbVertical {
     11    -webkit-appearance: sliderthumb-vertical;
     12    display: inline-block;
     13    width: 20px;
     14    height: 20px;
     15}
     16</style>
    717</head>
    818<body>
    9     There should be no thumbsliders below, you should only see the words "Hello World" twice.
    10     <br>
    11     <br>
    12     <span id="thumbHorizontal">Hello World</span><br>
    13     <span id="thumbVertical">Hello World</span>
     19<!-- There should be a horizontal slider thumb and a vertical slider thumb. -->
     20<span id="thumbHorizontal"></span><br>
     21<span id="thumbVertical"></span>
    1422</body>
    1523</html>
  • trunk/LayoutTests/platform/chromium/test_expectations.txt

    r88414 r88415  
    32093209BUG_TKENT LEOPARD : fast/forms/input-appearance-spinbutton-visibility.html = IMAGE
    32103210BUG_TKENT LEOPARD : fast/forms/input-appearance-spinbutton-layer.html= IMAGE
     3211BUGWK62196 : fast/forms/thumbslider-no-parent-slider.html = FAIL
    32113212
    32123213// Need expectations
  • trunk/LayoutTests/platform/mac/fast/forms/thumbslider-no-parent-slider-expected.txt

    r63403 r88415  
    44  RenderBlock {HTML} at (0,0) size 800x600
    55    RenderBody {BODY} at (8,8) size 784x584
    6       RenderText {#text} at (0,0) size 592x18
    7         text run at (0,0) width 592: "There should be no thumbsliders below, you should only see the words \"Hello World\" twice. "
    8       RenderBR {BR} at (0,0) size 0x0
    9       RenderBR {BR} at (0,18) size 0x18
    10       RenderBlock {SPAN} at (0,36) size 79x18
    11         RenderText {#text} at (0,0) size 79x18
    12           text run at (0,0) width 79: "Hello World"
    13       RenderBR {BR} at (79,50) size 0x0
    14       RenderBlock {SPAN} at (0,54) size 79x18
    15         RenderText {#text} at (0,0) size 79x18
    16           text run at (0,0) width 79: "Hello World"
     6      RenderBlock {SPAN} at (0,0) size 20x20
     7      RenderBR {BR} at (20,20) size 0x0
     8      RenderBlock {SPAN} at (0,20) size 20x20
    179      RenderText {#text} at (0,0) size 0x0
  • trunk/Source/WebCore/ChangeLog

    r88411 r88415  
     12011-06-08  Kent Tamura  <tkent@chromium.org>
     2
     3        Reviewed by Dimitri Glazkov.
     4
     5        Allow drawing a slider thumb for any nodes.
     6        https://bugs.webkit.org/show_bug.cgi?id=62196
     7
     8        RenderObject::node() should provide various information which is
     9        necessary for rendering. We don't need to refer the parent renderer.
     10
     11        * dom/Node.cpp:
     12        (WebCore::Node::focusDe1egate): Added.
     13        * dom/Node.h: Added a declaration.
     14        * html/shadow/MediaControlElements.cpp:
     15        (WebCore::toParentMediaElement):
     16          Added an overload of toParentMediaElement() with Node* parameter.
     17        * html/shadow/MediaControlElements.h:
     18        (WebCore::toParentMediaElement): ditto.
     19        * html/shadow/SliderThumbElement.cpp:
     20        (WebCore::SliderThumbElement::isEnabledFormControl):
     21          Returns the status of the host node.
     22        (WebCore::SliderThumbElement::isReadOnlyFormControl): ditto.
     23        (WebCore::SliderThumbElement::focusDe1egate):
     24          Returns the host node so that RenderTheme::isFocused() returns true.
     25        (WebCore::SliderThumbElement::detach): Style nit.
     26        (WebCore::SliderThumbElement::hostInput):
     27          Make it const because it is called by const functions.
     28        * html/shadow/SliderThumbElement.h:
     29          - Remove inDragMode()
     30          - Update declarations
     31        * platform/qt/RenderThemeQt.cpp:
     32        (WebCore::RenderThemeQt::paintMediaSliderThumb):
     33          Use Node::shadowAncestorNode() instead of RenderObject::parent() to
     34          support deeper thumb nodes.
     35        * rendering/RenderMediaControlsChromium.cpp:
     36        (WebCore::paintMediaSliderThumb): ditto.
     37        (WebCore::paintMediaVolumeSliderThumb): Remove isSlider() check.
     38        * rendering/RenderSlider.cpp:
     39        (WebCore::RenderSlider::inDragMode):
     40          SliderThumbElement::inDragMode() was removed, and Node::active() has
     41          the same information.
     42        * rendering/RenderTheme.cpp:
     43        (WebCore::RenderTheme::paint): Remove isSlider() checks.
     44        (WebCore::RenderTheme::isFocused): Apply Node::focusDelegate().
     45        * rendering/RenderThemeChromiumLinux.cpp:
     46        (WebCore::RenderThemeChromiumLinux::paintSliderThumb):
     47          isPressed() is enough.
     48        * rendering/RenderThemeChromiumWin.cpp:
     49          isEnabled(), isFocused(), and isPressed() are enough.
     50        (WebCore::RenderThemeChromiumWin::determineSliderThumbState):
     51        (WebCore::RenderThemeChromiumWin::determineClassicState):
     52        * rendering/RenderThemeMac.mm:
     53        (WebCore::RenderThemeMac::paintSliderThumb):
     54          - Remove isSlider() check.
     55          - Passing 'o' to udpateFooState functions is enough.
     56          - isPressed() is enough.
     57        * rendering/RenderThemeSafari.cpp:
     58        (WebCore::RenderThemeSafari::paintSliderThumb):
     59          We don't need special handling anymore.
     60        * rendering/RenderThemeWin.cpp:
     61        (WebCore::RenderThemeWin::determineSliderThumbState):
     62          isEnabled(), isFocused(), and isPressed() are enough.
     63
    1642011-06-08  Adam Barth  <abarth@webkit.org>
    265
  • trunk/Source/WebCore/dom/Node.cpp

    r88297 r88415  
    964964}
    965965
     966Node* Node::focusDelegate()
     967{
     968    return this;
     969}
     970
    966971unsigned Node::nodeIndex() const
    967972{
  • trunk/Source/WebCore/dom/Node.h

    r87885 r88415  
    336336    virtual bool isKeyboardFocusable(KeyboardEvent*) const;
    337337    virtual bool isMouseFocusable() const;
     338    virtual Node* focusDelegate();
    338339
    339340    bool isContentEditable() const;
  • trunk/Source/WebCore/html/shadow/MediaControlElements.cpp

    r87692 r88415  
    5353using namespace HTMLNames;
    5454
    55 HTMLMediaElement* toParentMediaElement(RenderObject* o)
    56 {
    57     Node* node = o->node();
     55HTMLMediaElement* toParentMediaElement(Node* node)
     56{
    5857    Node* mediaNode = node ? node->shadowAncestorNode() : 0;
    5958    if (!mediaNode || (!mediaNode->hasTagName(HTMLNames::videoTag) && !mediaNode->hasTagName(HTMLNames::audioTag)))
  • trunk/Source/WebCore/html/shadow/MediaControlElements.h

    r87692 r88415  
    7171};
    7272
    73 HTMLMediaElement* toParentMediaElement(RenderObject*);
     73HTMLMediaElement* toParentMediaElement(Node*);
     74inline HTMLMediaElement* toParentMediaElement(RenderObject* renderer) { return toParentMediaElement(renderer->node()); }
    7475
    7576// ----------------------------
  • trunk/Source/WebCore/html/shadow/SliderThumbElement.cpp

    r88405 r88415  
    9696}
    9797
     98bool SliderThumbElement::isEnabledFormControl() const
     99{
     100    return hostInput()->isEnabledFormControl();
     101}
     102
     103bool SliderThumbElement::isReadOnlyFormControl() const
     104{
     105    return hostInput()->isReadOnlyFormControl();
     106}
     107
     108Node* SliderThumbElement::focusDelegate()
     109{
     110    return hostInput();
     111}
     112
    98113void SliderThumbElement::dragFrom(const IntPoint& point)
    99114{
     
    192207    if (m_inDragMode) {
    193208        if (Frame* frame = document()->frame())
    194             frame->eventHandler()->setCapturingMouseEventsNode(0);     
     209            frame->eventHandler()->setCapturingMouseEventsNode(0);
    195210    }
    196211    HTMLDivElement::detach();
    197212}
    198213
    199 HTMLInputElement* SliderThumbElement::hostInput()
    200 {
    201     ASSERT(parentNode());
    202     return static_cast<HTMLInputElement*>(parentNode()->shadowHost());
     214HTMLInputElement* SliderThumbElement::hostInput() const
     215{
     216    // Only HTMLInputElement creates SliderThumbElement instances as its shadow nodes.
     217    // So, shadowAncestorNode() must be an HTMLInputElement.
     218    HTMLInputElement* input = shadowAncestorNode()->toInputElement();
     219    return input;
    203220}
    204221
  • trunk/Source/WebCore/html/shadow/SliderThumbElement.h

    r87995 r88415  
    5050    static PassRefPtr<SliderThumbElement> create(Document*);
    5151
    52     bool inDragMode() const { return m_inDragMode; }
    5352    void setPositionFromValue();
    5453
     
    6261    virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
    6362    virtual PassRefPtr<Element> cloneElementWithoutAttributesAndChildren() const;
     63    virtual bool isEnabledFormControl() const;
     64    virtual bool isReadOnlyFormControl() const;
     65    virtual Node* focusDelegate();
    6466    void startDragging();
    6567    void stopDragging();
    6668    void setPositionFromPoint(const IntPoint&);
    67     HTMLInputElement* hostInput();
     69    HTMLInputElement* hostInput() const;
    6870
    6971    bool m_inDragMode;
  • trunk/Source/WebCore/platform/qt/RenderThemeQt.cpp

    r88405 r88415  
    14431443bool RenderThemeQt::paintMediaSliderThumb(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
    14441444{
    1445     if (!o->parent()->isSlider())
    1446         return false;
    1447 
    1448     // We can get the HTMLMediaElement from the parent of the thumb : MediaControlTimelineElement.
    1449     HTMLMediaElement* mediaElement = toParentMediaElement(o->parent());
     1445    ASSERT(o->node());
     1446    Node* hostNode = o->node()->shadowAncestorNode();
     1447    ASSERT(hostNode);
     1448    HTMLMediaElement* mediaElement = toParentMediaElement(hostNode);
    14501449    if (!mediaElement)
    14511450        return false;
     
    14581457
    14591458    p.painter->setPen(Qt::NoPen);
    1460     p.painter->setBrush(getMediaControlForegroundColor(o->parent()));
     1459    p.painter->setBrush(getMediaControlForegroundColor(hostNode->renderer()));
    14611460    p.painter->drawRect(r.x(), r.y(), r.width(), r.height());
    14621461
  • trunk/Source/WebCore/rendering/RenderMediaControlsChromium.cpp

    r88405 r88415  
    168168static bool paintMediaSliderThumb(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
    169169{
    170     if (!object->parent()->isSlider())
    171         return false;
    172 
    173     HTMLMediaElement* mediaElement = toParentMediaElement(object->parent());
     170    ASSERT(object->node());
     171    Node* hostNode = object->node()->shadowAncestorNode();
     172    ASSERT(hostNode);
     173    HTMLMediaElement* mediaElement = toParentMediaElement(hostNode);
    174174    if (!mediaElement)
    175175        return false;
     
    203203static bool paintMediaVolumeSliderThumb(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
    204204{
    205     if (!object->parent()->isSlider())
    206         return false;
    207 
    208205    static Image* mediaVolumeSliderThumb = platformResource("mediaVolumeSliderThumb");
    209206    return paintMediaButton(paintInfo.context, rect, mediaVolumeSliderThumb);
  • trunk/Source/WebCore/rendering/RenderSlider.cpp

    r88405 r88415  
    187187{
    188188    SliderThumbElement* thumbElement = shadowSliderThumb();
    189     return thumbElement && thumbElement->inDragMode();
     189    return thumbElement && thumbElement->active();
    190190}
    191191
  • trunk/Source/WebCore/rendering/RenderTheme.cpp

    r88405 r88415  
    307307        case SliderThumbHorizontalPart:
    308308        case SliderThumbVerticalPart:
    309             if (o->parent()->isSlider())
    310                 return paintSliderThumb(o, paintInfo, r);
    311             // We don't support drawing a slider thumb without a parent slider
    312             break;
     309            return paintSliderThumb(o, paintInfo, r);
    313310        case MediaFullscreenButtonPart:
    314311            return paintMediaFullscreenButton(o, paintInfo, r);
     
    330327            return paintMediaSliderTrack(o, paintInfo, r);
    331328        case MediaSliderThumbPart:
    332             if (o->parent()->isSlider())
    333                 return paintMediaSliderThumb(o, paintInfo, r);
    334             break;
     329            return paintMediaSliderThumb(o, paintInfo, r);
    335330        case MediaVolumeSliderMuteButtonPart:
    336331            return paintMediaMuteButton(o, paintInfo, r);
     
    340335            return paintMediaVolumeSliderTrack(o, paintInfo, r);
    341336        case MediaVolumeSliderThumbPart:
    342             if (o->parent()->isSlider())
    343                 return paintMediaVolumeSliderThumb(o, paintInfo, r);
    344             break;
     337            return paintMediaVolumeSliderThumb(o, paintInfo, r);
    345338        case MediaTimeRemainingPart:
    346339            return paintMediaTimeRemaining(o, paintInfo, r);
     
    778771    if (!node)
    779772        return false;
     773
     774    node = node->focusDelegate();
    780775    Document* document = node->document();
    781776    Frame* frame = document->frame();
  • trunk/Source/WebCore/rendering/RenderThemeChromiumLinux.cpp

    r88405 r88415  
    297297    PlatformBridge::ThemePaintExtraParams extraParams;
    298298    extraParams.slider.vertical = o->style()->appearance() == SliderThumbVerticalPart;
    299     extraParams.slider.inDrag = toRenderSlider(o->parent())->inDragMode();
     299    extraParams.slider.inDrag = isPressed(o);
    300300
    301301    PlatformBridge::paintThemePart(i.context, PlatformBridge::PartSliderThumb, getWebThemeState(this, o), rect, &extraParams);
  • trunk/Source/WebCore/rendering/RenderThemeChromiumWin.cpp

    r88405 r88415  
    561561{
    562562    unsigned result = TUS_NORMAL;
    563     if (!isEnabled(o->parent()))
     563    if (!isEnabled(o))
    564564        result = TUS_DISABLED;
    565     else if (supportsFocus(o->style()->appearance()) && isFocused(o->parent()))
     565    else if (supportsFocus(o->style()->appearance()) && isFocused(o))
    566566        result = TUS_FOCUSED;
    567     else if (toRenderSlider(o->parent())->inDragMode())
     567    else if (isPressed(o))
    568568        result = TUS_PRESSED;
    569569    else if (isHovered(o))
     
    587587
    588588    if (part == SliderThumbHorizontalPart || part == SliderThumbVerticalPart) {
    589         if (!isEnabled(o->parent()))
     589        if (!isEnabled(o))
    590590            result = DFCS_INACTIVE;
    591         else if (toRenderSlider(o->parent())->inDragMode()) // Active supersedes hover
     591        else if (isPressed(o)) // Active supersedes hover
    592592            result = DFCS_PUSHED;
    593593        else if (isHovered(o))
  • trunk/Source/WebCore/rendering/RenderThemeMac.mm

    r88405 r88415  
    13001300bool RenderThemeMac::paintSliderThumb(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
    13011301{
    1302     ASSERT(o->parent()->isSlider());
    1303 
    13041302    NSSliderCell* sliderThumbCell = o->style()->appearance() == SliderThumbVerticalPart
    13051303        ? sliderThumbVertical()
     
    13091307
    13101308    // Update the various states we respond to.
    1311     updateActiveState(sliderThumbCell, o->parent());
    1312     updateEnabledState(sliderThumbCell, o->parent());
    1313     updateFocusedState(sliderThumbCell, o->parent());
     1309    updateActiveState(sliderThumbCell, o);
     1310    updateEnabledState(sliderThumbCell, o);
     1311    updateFocusedState(sliderThumbCell, o);
    13141312
    13151313    // Update the pressed state using the NSCell tracking methods, since that's how NSSliderCell keeps track of it.
     
    13201318        oldPressed = m_isSliderThumbHorizontalPressed;
    13211319
    1322     bool pressed = toRenderSlider(o->parent())->inDragMode();
     1320    bool pressed = isPressed(o);
    13231321
    13241322    if (o->style()->appearance() == SliderThumbVerticalPart)
  • trunk/Source/WebCore/rendering/RenderThemeSafari.cpp

    r88405 r88415  
    10001000{
    10011001    ASSERT(SafariThemeLibrary());
    1002 
    1003     ASSERT(o->parent()->isSlider());
    1004 
    1005     bool pressed = toRenderSlider(o->parent())->inDragMode();
    1006     ThemeControlState state = determineState(o->parent());
    1007     state &= ~SafariTheme::PressedState;
    1008     if (pressed)
    1009         state |= SafariTheme::PressedState;
    1010 
    1011     paintThemePart(SliderThumbPart, paintInfo.context->platformContext(), r, NSSmallControlSize, state);
     1002    paintThemePart(SliderThumbPart, paintInfo.context->platformContext(), r, NSSmallControlSize, determineState(o));
    10121003    return false;
    10131004}
  • trunk/Source/WebCore/rendering/RenderThemeWin.cpp

    r88405 r88415  
    464464{
    465465    unsigned result = TUS_NORMAL;
    466     if (!isEnabled(o->parent()))
     466    if (!isEnabled(o))
    467467        result = TUS_DISABLED;
    468     else if (supportsFocus(o->style()->appearance()) && isFocused(o->parent()))
     468    else if (supportsFocus(o->style()->appearance()) && isFocused(o))
    469469        result = TUS_FOCUSED;
    470     else if (toRenderSlider(o->parent())->inDragMode())
     470    else if (isPressed(o))
    471471        result = TUS_PRESSED;
    472472    else if (isHovered(o))
Note: See TracChangeset for help on using the changeset viewer.