Changeset 60822 in webkit


Ignore:
Timestamp:
Jun 7, 2010 11:26:06 PM (14 years ago)
Author:
morrita@google.com
Message:

2010-06-07 MORITA Hajime <morrita@google.com>

Reviewed by Kent Tamura.

[Mac] <meter> elements should be rendered as level indicators.
https://bugs.webkit.org/show_bug.cgi?id=40217

  • fast/dom/HTMLMeterElement/meter-appearances-capacity.html: Added.
  • fast/dom/HTMLMeterElement/meter-appearances-rating-relevancy.html: Added.
  • fast/dom/HTMLMeterElement/meter-optimums.html: Added.
  • platform/chromium/test_expectations.txt:
  • platform/gtk/Skipped:
  • platform/mac/Skipped: removed <meter> related tests.
  • platform/mac/fast/dom/HTMLMeterElement/meter-appearances-capacity-expected.checksum: Added.
  • platform/mac/fast/dom/HTMLMeterElement/meter-appearances-capacity-expected.png: Added.
  • platform/mac/fast/dom/HTMLMeterElement/meter-appearances-capacity-expected.txt: Added.
  • platform/mac/fast/dom/HTMLMeterElement/meter-appearances-rating-relevancy-expected.checksum: Added.
  • platform/mac/fast/dom/HTMLMeterElement/meter-appearances-rating-relevancy-expected.png: Added.
  • platform/mac/fast/dom/HTMLMeterElement/meter-appearances-rating-relevancy-expected.txt: Added.
  • platform/mac/fast/dom/HTMLMeterElement/meter-element-expected.checksum: Added.
  • platform/mac/fast/dom/HTMLMeterElement/meter-element-expected.png: Added.
  • platform/mac/fast/dom/HTMLMeterElement/meter-element-expected.txt: Copied from LayoutTests/platform/qt/fast/dom/HTMLMeterElement/meter-element-expected.txt.
  • platform/mac/fast/dom/HTMLMeterElement/meter-optimums-expected.checksum: Added.
  • platform/mac/fast/dom/HTMLMeterElement/meter-optimums-expected.png: Added.
  • platform/mac/fast/dom/HTMLMeterElement/meter-optimums-expected.txt: Added.
  • platform/win/Skipped:

2010-06-07 MORITA Hajime <morrita@google.com>

Reviewed by Kent Tamura.

[Mac] <meter> elements should be rendered as level indicators.
https://bugs.webkit.org/show_bug.cgi?id=40217

Implemented RenderThemeMac::paintMeter() using NSLevelIndicatorCell.

This change also added new -webkit-appearance values to select the
style of level indicators:

  • relevancy-level-indicator,
  • continuous-capacity-level-indicator,
  • discrete-capacity-level-indicator, and
  • rating-level-indicator.

The size of elements are adjusted based on the bounds of the indicator
to make room for painting whole indicator cells.

Tests: fast/dom/HTMLMeterElement/meter-appearances-capacity.html

fast/dom/HTMLMeterElement/meter-appearances-rating-relevancy.html
fast/dom/HTMLMeterElement/meter-optimums.html

  • css/CSSPrimitiveValueMappings.h: (WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
  • css/CSSValueKeywords.in:
  • html/HTMLMeterElement.cpp: (WebCore::HTMLMeterElement::gaugeRegion):
  • html/HTMLMeterElement.h: (WebCore::HTMLMeterElement::):
  • platform/ThemeTypes.h: (WebCore::):
  • rendering/RenderMeter.cpp: (WebCore::RenderMeter::calcWidth): (WebCore::RenderMeter::calcHeight):
  • rendering/RenderMeter.h:
  • rendering/RenderTheme.cpp: (WebCore::RenderTheme::adjustStyle): (WebCore::RenderTheme::paint): (WebCore::RenderTheme::paintBorderOnly): (WebCore::RenderTheme::paintDecorations): (WebCore::RenderTheme::meterSizeForBounds):
  • rendering/RenderTheme.h:
  • rendering/RenderThemeMac.h:
  • rendering/RenderThemeMac.mm: (WebCore::RenderThemeMac::meterSizeForBounds): (WebCore::RenderThemeMac::paintMeter): (WebCore::RenderThemeMac::levelIndicatorStyleFor): (WebCore::RenderThemeMac::levelIndicatorFor):
Location:
trunk
Files:
16 added
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r60805 r60822  
     12010-06-07  MORITA Hajime  <morrita@google.com>
     2
     3        Reviewed by Kent Tamura.
     4
     5        [Mac] <meter> elements should be rendered as level indicators.       
     6        https://bugs.webkit.org/show_bug.cgi?id=40217
     7
     8        * fast/dom/HTMLMeterElement/meter-appearances-capacity.html: Added.
     9        * fast/dom/HTMLMeterElement/meter-appearances-rating-relevancy.html: Added.
     10        * fast/dom/HTMLMeterElement/meter-optimums.html: Added.
     11        * platform/chromium/test_expectations.txt:
     12        * platform/gtk/Skipped:
     13        * platform/mac/Skipped: removed <meter> related tests.
     14        * platform/mac/fast/dom/HTMLMeterElement/meter-appearances-capacity-expected.checksum: Added.
     15        * platform/mac/fast/dom/HTMLMeterElement/meter-appearances-capacity-expected.png: Added.
     16        * platform/mac/fast/dom/HTMLMeterElement/meter-appearances-capacity-expected.txt: Added.
     17        * platform/mac/fast/dom/HTMLMeterElement/meter-appearances-rating-relevancy-expected.checksum: Added.
     18        * platform/mac/fast/dom/HTMLMeterElement/meter-appearances-rating-relevancy-expected.png: Added.
     19        * platform/mac/fast/dom/HTMLMeterElement/meter-appearances-rating-relevancy-expected.txt: Added.
     20        * platform/mac/fast/dom/HTMLMeterElement/meter-element-expected.checksum: Added.
     21        * platform/mac/fast/dom/HTMLMeterElement/meter-element-expected.png: Added.
     22        * platform/mac/fast/dom/HTMLMeterElement/meter-element-expected.txt: Copied from LayoutTests/platform/qt/fast/dom/HTMLMeterElement/meter-element-expected.txt.
     23        * platform/mac/fast/dom/HTMLMeterElement/meter-optimums-expected.checksum: Added.
     24        * platform/mac/fast/dom/HTMLMeterElement/meter-optimums-expected.png: Added.
     25        * platform/mac/fast/dom/HTMLMeterElement/meter-optimums-expected.txt: Added.
     26        * platform/win/Skipped:
     27
    1282010-06-07  Martin Robinson  <mrobinson@igalia.com>
    229
  • trunk/LayoutTests/platform/chromium/test_expectations.txt

    r60706 r60822  
    26282628BUGWK37074 DEFER : fast/dom/HTMLMeterElement/meter-element.html = MISSING
    26292629BUGWK37074 DEFER : fast/dom/HTMLMeterElement/set-meter-properties.html = TEXT
     2630BUGWK37074 DEFER : fast/dom/HTMLMeterElement/meter-appearances-capacity.html = MISSING
     2631BUGWK37074 DEFER : fast/dom/HTMLMeterElement/meter-appearances-rating-relevancy.html = MISSING
     2632BUGWK37074 DEFER : fast/dom/HTMLMeterElement/meter-optimums.html = MISSING
    26302633
    26312634// WebKit roll 56004 -> 56026
  • trunk/LayoutTests/platform/gtk/Skipped

    r60805 r60822  
    56975697fast/dom/HTMLMeterElement/meter-element.html
    56985698fast/dom/HTMLMeterElement/set-meter-properties.html
     5699fast/dom/HTMLMeterElement/meter-appearances-capacity.html
     5700fast/dom/HTMLMeterElement/meter-appearances-rating-relevancy.html
     5701fast/dom/HTMLMeterElement/meter-optimums.html
    56995702
    57005703# Needs mock support, and build slave Geolocation service
  • trunk/LayoutTests/platform/mac/Skipped

    r60685 r60822  
    136136# The animation causes the result of this test to depend on the speed of executing it, and that will cause it to be flaky
    137137fast/dom/HTMLProgressElement/progress-element.html
    138 
    139 # meter element is not supported
    140 fast/dom/HTMLMeterElement/meter-element.html
    141 fast/dom/HTMLMeterElement/set-meter-properties.html
    142138
    143139# event.dataTransfer.setData('text/uri-list') not correctly implemented on Mac
  • trunk/LayoutTests/platform/win/Skipped

    r60727 r60822  
    836836fast/dom/HTMLMeterElement/meter-element.html
    837837fast/dom/HTMLMeterElement/set-meter-properties.html
     838fast/dom/HTMLMeterElement/meter-appearances-capacity.html
     839fast/dom/HTMLMeterElement/meter-appearances-rating-relevancy.html
     840fast/dom/HTMLMeterElement/meter-optimums.html
    838841
    839842# No Widgets 1.0 support
  • trunk/WebCore/ChangeLog

    r60820 r60822  
     12010-06-07  MORITA Hajime  <morrita@google.com>
     2
     3        Reviewed by Kent Tamura.
     4
     5        [Mac] <meter> elements should be rendered as level indicators.       
     6        https://bugs.webkit.org/show_bug.cgi?id=40217
     7
     8        Implemented RenderThemeMac::paintMeter() using NSLevelIndicatorCell.
     9       
     10        This change also added new -webkit-appearance values to select the
     11        style of level indicators:
     12       
     13        - relevancy-level-indicator,
     14        - continuous-capacity-level-indicator,
     15        - discrete-capacity-level-indicator, and
     16        - rating-level-indicator.
     17       
     18        The size of elements are adjusted based on the bounds of the indicator
     19        to make room for painting whole indicator cells.
     20
     21        Tests: fast/dom/HTMLMeterElement/meter-appearances-capacity.html
     22               fast/dom/HTMLMeterElement/meter-appearances-rating-relevancy.html
     23               fast/dom/HTMLMeterElement/meter-optimums.html
     24
     25        * css/CSSPrimitiveValueMappings.h:
     26        (WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
     27        * css/CSSValueKeywords.in:
     28        * html/HTMLMeterElement.cpp:
     29        (WebCore::HTMLMeterElement::gaugeRegion):
     30        * html/HTMLMeterElement.h:
     31        (WebCore::HTMLMeterElement::):
     32        * platform/ThemeTypes.h:
     33        (WebCore::):
     34        * rendering/RenderMeter.cpp:
     35        (WebCore::RenderMeter::calcWidth):
     36        (WebCore::RenderMeter::calcHeight):
     37        * rendering/RenderMeter.h:
     38        * rendering/RenderTheme.cpp:
     39        (WebCore::RenderTheme::adjustStyle):
     40        (WebCore::RenderTheme::paint):
     41        (WebCore::RenderTheme::paintBorderOnly):
     42        (WebCore::RenderTheme::paintDecorations):
     43        (WebCore::RenderTheme::meterSizeForBounds):
     44        * rendering/RenderTheme.h:
     45        * rendering/RenderThemeMac.h:
     46        * rendering/RenderThemeMac.mm:
     47        (WebCore::RenderThemeMac::meterSizeForBounds):
     48        (WebCore::RenderThemeMac::paintMeter):
     49        (WebCore::RenderThemeMac::levelIndicatorStyleFor):
     50        (WebCore::RenderThemeMac::levelIndicatorFor):
     51
    1522010-06-07  MORITA Hajime  <morrita@google.com>
    253       
  • trunk/WebCore/css/CSSPrimitiveValueMappings.h

    r59541 r60822  
    279279            m_value.ident = CSSValueMeter;
    280280            break;
     281        case RelevancyLevelIndicatorPart:
     282            m_value.ident = CSSValueRelevancyLevelIndicator;
     283            break;
     284        case ContinuousCapacityLevelIndicatorPart:
     285            m_value.ident = CSSValueContinuousCapacityLevelIndicator;
     286            break;
     287        case DiscreteCapacityLevelIndicatorPart:
     288            m_value.ident = CSSValueDiscreteCapacityLevelIndicator;
     289            break;
     290        case RatingLevelIndicatorPart:
     291            m_value.ident = CSSValueRatingLevelIndicator;
     292            break;
    281293        case OuterSpinButtonPart:
    282294            m_value.ident = CSSValueOuterSpinButton;
  • trunk/WebCore/css/CSSValueKeywords.in

    r59541 r60822  
    605605searchfield-cancel-button
    606606textfield
     607caps-lock-indicator
     608relevancy-level-indicator
     609continuous-capacity-level-indicator
     610discrete-capacity-level-indicator
     611rating-level-indicator
    607612textarea
    608 caps-lock-indicator
    609613
    610614#
  • trunk/WebCore/html/HTMLMeterElement.cpp

    r60799 r60822  
    164164}
    165165
     166HTMLMeterElement::GaugeRegion HTMLMeterElement::gaugeRegion() const
     167{
     168    double lowValue = low();
     169    double highValue = high();
     170    double theValue = value();
     171    double optimumValue = optimum();
     172
     173    if (optimumValue <= lowValue) {
     174        // The optimum range stays under low
     175        if (theValue <= lowValue)
     176            return GaugeRegionOptimum;
     177        if (theValue <= highValue)
     178            return GaugeRegionSuboptimal;
     179        return GaugeRegionEvenLessGood;
     180    }
     181   
     182    if (highValue <= optimumValue) {
     183        // The optimum range stays over high
     184        if (highValue <= theValue)
     185            return GaugeRegionOptimum;
     186        if (lowValue <= theValue)
     187            return GaugeRegionSuboptimal;
     188        return GaugeRegionEvenLessGood;
     189    }
     190
     191    // The optimum range stays between high and low
     192    if (lowValue < highValue && theValue < highValue)
     193        return GaugeRegionOptimum;
     194    if (theValue == min() || max() == theValue)
     195        return GaugeRegionEvenLessGood;
     196    return GaugeRegionSuboptimal;
     197}
     198
    166199} // namespace
    167200#endif
  • trunk/WebCore/html/HTMLMeterElement.h

    r59773 r60822  
    3131    static PassRefPtr<HTMLMeterElement> create(const QualifiedName&, Document*);
    3232
     33    enum GaugeRegion {
     34        GaugeRegionOptimum,
     35        GaugeRegionSuboptimal,
     36        GaugeRegionEvenLessGood
     37    };
     38
    3339    double min() const;
    3440    void setMin(double, ExceptionCode&);
     
    4955    void setOptimum(double, ExceptionCode&);
    5056
     57    GaugeRegion gaugeRegion() const;
    5158private:
    5259    HTMLMeterElement(const QualifiedName&, Document*);
  • trunk/WebCore/platform/ThemeTypes.h

    r59541 r60822  
    5757    SliderThumbVerticalPart, CaretPart, SearchFieldPart, SearchFieldDecorationPart,
    5858    SearchFieldResultsDecorationPart, SearchFieldResultsButtonPart,
    59     SearchFieldCancelButtonPart, TextFieldPart, TextAreaPart, CapsLockIndicatorPart
     59    SearchFieldCancelButtonPart, TextFieldPart, CapsLockIndicatorPart,
     60    RelevancyLevelIndicatorPart, ContinuousCapacityLevelIndicatorPart, DiscreteCapacityLevelIndicatorPart, RatingLevelIndicatorPart,
     61    TextAreaPart
    6062};
    6163
  • trunk/WebCore/rendering/RenderMeter.cpp

    r59541 r60822  
    3838}
    3939
     40void RenderMeter::calcWidth()
     41{
     42    RenderBox::calcWidth();
     43    setWidth(theme()->meterSizeForBounds(this, frameRect()).width());
     44}
     45
     46void RenderMeter::calcHeight()
     47{
     48    RenderBox::calcHeight();
     49    setHeight(theme()->meterSizeForBounds(this, frameRect()).height());
     50}
     51
    4052void RenderMeter::layout()
    4153{
  • trunk/WebCore/rendering/RenderMeter.h

    r59541 r60822  
    3939    virtual void layout();
    4040    virtual void updateFromElement();
     41    virtual void calcWidth();
     42    virtual void calcHeight();
    4143};
    4244
  • trunk/WebCore/rendering/RenderTheme.cpp

    r60767 r60822  
    223223#if ENABLE(METER_TAG)
    224224        case MeterPart:
     225        case RelevancyLevelIndicatorPart:
     226        case ContinuousCapacityLevelIndicatorPart:
     227        case DiscreteCapacityLevelIndicatorPart:
     228        case RatingLevelIndicatorPart:
    225229            return adjustMeterStyle(selector, style, e);
    226230#endif
     
    285289#if ENABLE(METER_TAG)
    286290        case MeterPart:
     291        case RelevancyLevelIndicatorPart:
     292        case ContinuousCapacityLevelIndicatorPart:
     293        case DiscreteCapacityLevelIndicatorPart:
     294        case RatingLevelIndicatorPart:
    287295            return paintMeter(o, paintInfo, r);
    288296#endif
     
    383391#if ENABLE(METER_TAG)
    384392        case MeterPart:
     393        case RelevancyLevelIndicatorPart:
     394        case ContinuousCapacityLevelIndicatorPart:
     395        case DiscreteCapacityLevelIndicatorPart:
     396        case RatingLevelIndicatorPart:
    385397#endif
    386398#if ENABLE(PROGRESS_TAG)
     
    424436#if ENABLE(METER_TAG)
    425437        case MeterPart:
     438        case RelevancyLevelIndicatorPart:
     439        case ContinuousCapacityLevelIndicatorPart:
     440        case DiscreteCapacityLevelIndicatorPart:
     441        case RatingLevelIndicatorPart:
    426442#endif
    427443#if ENABLE(PROGRESS_TAG)
     
    892908{
    893909    style->setBoxShadow(0);
     910}
     911
     912IntSize RenderTheme::meterSizeForBounds(const RenderMeter*, const IntRect& bounds) const
     913{
     914    return bounds.size();
    894915}
    895916
  • trunk/WebCore/rendering/RenderTheme.h

    r59541 r60822  
    4040class PopupMenu;
    4141class RenderMenuList;
     42#if ENABLE(METER_TAG)
     43class RenderMeter;
     44#endif
    4245#if ENABLE(PROGRESS_TAG)
    4346class RenderProgress;
     
    189192    virtual String formatMediaControlsCurrentTime(float currentTime, float duration) const;
    190193    virtual String formatMediaControlsRemainingTime(float currentTime, float duration) const;
     194#endif
     195
     196#if ENABLE(METER_TAG)
     197    virtual IntSize meterSizeForBounds(const RenderMeter*, const IntRect&) const;
    191198#endif
    192199
  • trunk/WebCore/rendering/RenderThemeMac.h

    r58943 r60822  
    8080   
    8181    virtual bool paintCapsLockIndicator(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
     82
     83#if ENABLE(METER_TAG)
     84    virtual IntSize meterSizeForBounds(const RenderMeter*, const IntRect&) const;
     85    virtual bool paintMeter(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
     86#endif
    8287
    8388#if ENABLE(PROGRESS_TAG)
     
    202207    NSSliderCell* sliderThumbVertical() const;
    203208
     209#if ENABLE(METER_TAG)
     210    NSLevelIndicatorStyle levelIndicatorStyleFor(ControlPart) const;
     211    NSLevelIndicatorCell* levelIndicatorFor(const RenderMeter*) const;
     212#endif
     213
    204214private:
    205215    mutable RetainPtr<NSPopUpButtonCell> m_popupButton;
     
    208218    mutable RetainPtr<NSSliderCell> m_sliderThumbHorizontal;
    209219    mutable RetainPtr<NSSliderCell> m_sliderThumbVertical;
     220    mutable RetainPtr<NSLevelIndicatorCell> m_levelIndicator;
    210221
    211222    bool m_isSliderThumbHorizontalPressed;
  • trunk/WebCore/rendering/RenderThemeMac.mm

    r60767 r60822  
    5252#import "RenderProgress.h"
    5353
     54#if ENABLE(METER_TAG)
     55#include "RenderMeter.h"
     56#include "HTMLMeterElement.h"
     57#endif
     58
    5459#ifdef BUILDING_ON_TIGER
    5560typedef int NSInteger;
     
    802807    return false;
    803808}
    804    
     809
     810#if ENABLE(METER_TAG)
     811
     812IntSize RenderThemeMac::meterSizeForBounds(const RenderMeter* renderMeter, const IntRect& bounds) const
     813{
     814    if (NoControlPart == renderMeter->style()->appearance())
     815        return bounds.size();
     816
     817    NSLevelIndicatorCell* cell = levelIndicatorFor(renderMeter);
     818    // Makes enough room for cell's intrinsic size.
     819    NSSize cellSize = [cell cellSizeForBounds:IntRect(IntPoint(), bounds.size())];
     820    return IntSize(bounds.width() < cellSize.width ? cellSize.width : bounds.width(),
     821                   bounds.height() < cellSize.height ? cellSize.height : bounds.height());
     822}
     823
     824bool RenderThemeMac::paintMeter(RenderObject* renderObject, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
     825{
     826    if (!renderObject->isMeter())
     827        return true;
     828
     829    // Becaue NSLevelIndicatorCell doesn't support vertical gauge, we use a portable version
     830    if (rect.width() < rect.height())
     831        return RenderTheme::paintMeter(renderObject, paintInfo, rect);
     832
     833    NSLevelIndicatorCell* cell = levelIndicatorFor(toRenderMeter(renderObject));
     834    paintInfo.context->save();
     835    [cell drawWithFrame:rect inView:documentViewFor(renderObject)];
     836    [cell setControlView:nil];
     837    paintInfo.context->restore();
     838
     839    return false;
     840}
     841
     842NSLevelIndicatorStyle RenderThemeMac::levelIndicatorStyleFor(ControlPart part) const
     843{
     844    switch (part) {
     845    case RelevancyLevelIndicatorPart:
     846        return NSRelevancyLevelIndicatorStyle;
     847    case DiscreteCapacityLevelIndicatorPart:
     848        return NSDiscreteCapacityLevelIndicatorStyle;
     849    case RatingLevelIndicatorPart:
     850        return NSRatingLevelIndicatorStyle;
     851    case MeterPart:
     852    case ContinuousCapacityLevelIndicatorPart:
     853    default:
     854        return NSContinuousCapacityLevelIndicatorStyle;
     855    }
     856   
     857}
     858
     859NSLevelIndicatorCell* RenderThemeMac::levelIndicatorFor(const RenderMeter* renderMeter) const
     860{
     861    RenderStyle* style = renderMeter->style();
     862    ASSERT(style->appearance() != NoControlPart);
     863
     864    if (!m_levelIndicator)
     865        m_levelIndicator.adoptNS([[NSLevelIndicatorCell alloc] initWithLevelIndicatorStyle:NSContinuousCapacityLevelIndicatorStyle]);
     866    NSLevelIndicatorCell* cell = m_levelIndicator.get();
     867
     868    HTMLMeterElement* element = static_cast<HTMLMeterElement*>(renderMeter->node());
     869    double value = element->value();
     870
     871    // Because NSLevelIndicatorCell does not support optimum-in-the-middle type coloring,
     872    // we explicitly control the color instead giving low and high value to NSLevelIndicatorCell as is.
     873    switch (element->gaugeRegion()) {
     874    case HTMLMeterElement::GaugeRegionOptimum:
     875        // Make meter the green
     876        [cell setWarningValue:value + 1];
     877        [cell setCriticalValue:value + 2];
     878        break;
     879    case HTMLMeterElement::GaugeRegionSuboptimal:
     880        // Make the meter yellow
     881        [cell setWarningValue:value - 1];
     882        [cell setCriticalValue:value + 1];
     883        break;
     884    case HTMLMeterElement::GaugeRegionEvenLessGood:
     885        // Make the meter red
     886        [cell setWarningValue:value - 2];
     887        [cell setCriticalValue:value - 1];
     888        break;
     889    }
     890
     891    [cell setLevelIndicatorStyle:levelIndicatorStyleFor(style->appearance())];
     892    [cell setBaseWritingDirection:style->direction() == LTR ? NSWritingDirectionLeftToRight : NSWritingDirectionRightToLeft];
     893    [cell setMinValue:element->min()];
     894    [cell setMaxValue:element->max()];
     895    RetainPtr<NSNumber> valueObject = [NSNumber numberWithDouble:value];
     896    [cell setObjectValue:valueObject.get()];
     897
     898    return cell;
     899}
     900
     901#endif
     902
    805903#if ENABLE(PROGRESS_TAG)
    806904
Note: See TracChangeset for help on using the changeset viewer.