Changeset 47744 in webkit


Ignore:
Timestamp:
Aug 25, 2009 5:04:25 AM (15 years ago)
Author:
eric@webkit.org
Message:

2009-08-25 Alpha Lam <hclam@chromium.org>

Reviewed by David Levin.

Media controls panel does not have a volume control slider
https://bugs.webkit.org/show_bug.cgi?id=28241

Introduced "-webkit-media-controls-volume-slider",
"-webkit-media-controls-volume-slider-container" and the supporting
implementation. Also added appearances of "media-volume-slider" and
"media-volume-slider-container".

The implementation of the controls are in WebCore::MediaControlElements.
Logic to trigger the display of the volume controls are in WebCore::RenderMedia.

No new tests since this change doesn't have theme implementation and the
volume slider is disabled by default.

  • accessibility/AccessibilitySlider.cpp: (WebCore::AccessibilitySlider::orientation): Marks that volume slider is vertical.
  • css/CSSPrimitiveValueMappings.h: (WebCore::CSSPrimitiveValue::CSSPrimitiveValue): Added corresponding CSS values.
  • css/CSSSelector.cpp: (WebCore::CSSSelector::extractPseudoType): ditto.
  • css/CSSSelector.h: (WebCore::CSSSelector::): ditto.
  • css/CSSStyleSelector.cpp: (WebCore::CSSStyleSelector::SelectorChecker::checkOneSelector): ditto.
  • css/CSSValueKeywords.in: ditto.
  • css/mediaControls.css: Makes the volume slider disabled by default.
  • platform/ThemeTypes.h: Defines theme parts for volume slider and its container. (WebCore::):
  • rendering/MediaControlElements.cpp: (WebCore::MediaControlVolumeSliderContainerElement::MediaControlVolumeSliderContainerElement): (WebCore::MediaControlVolumeSliderContainerElement::styleForElement): Adjust the CSS values for "display", "postion", "left" and "top" according to member variables. (WebCore::MediaControlVolumeSliderContainerElement::setVisible): Affects the "display" CSS value. (WebCore::MediaControlVolumeSliderContainerElement::setPosition): Affects the "left" and "top" CSS values. (WebCore::MediaControlVolumeSliderContainerElement::hitTest): Hit testing this element. (WebCore::MediaControlVolumeSliderElement::MediaControlVolumeSliderElement): (WebCore::MediaControlVolumeSliderElement::defaultEventHandler): Modifies the volume using the slider value, allows dragging.
  • rendering/MediaControlElements.h: (WebCore::): Added definition for MediaControlVolumeSliderElement and MediaControlVolumeSliderContainerElement. (WebCore::MediaControlVolumeSliderContainerElement::isVisible): Inline getter.
  • rendering/RenderMedia.cpp: (WebCore::RenderMedia::styleDidChange): Updates styles for volume container and volume slider. (WebCore::RenderMedia::createVolumeSliderContainer): Creates volume slider container and attach to panel. (WebCore::RenderMedia::createVolumeSlider): Creates volume slider and attach to volume slider container. (WebCore::RenderMedia::updateControls): Updates volume container and volume slider. (WebCore::RenderMedia::updateVolumeSliderContainer): Sets the visibility and position of volume slider container and its child. (WebCore::RenderMedia::forwardEvent): Hit testing the volume slider container and volume slider to toggle the visibility and forward events to slider.
  • rendering/RenderMedia.h: Added definition for RenderMedia::updateVolumeSliderContainer().
  • rendering/RenderMediaControls.cpp: (WebCore::RenderMediaControls::paintMediaControlsPart): Not implemented.
  • rendering/RenderSlider.cpp: (WebCore::RenderSlider::createThumbStyle): Makes volume slider vertical. (WebCore::RenderSlider::thumbRect): ditto. (WebCore::RenderSlider::mouseEventIsInThumb): ditto. (WebCore::RenderSlider::setValueForPosition): ditto. (WebCore::RenderSlider::positionForOffset): ditto. (WebCore::RenderSlider::currentPosition): ditto. (WebCore::RenderSlider::trackSize): ditto.
  • rendering/RenderTheme.cpp: (WebCore::RenderTheme::adjustStyle): Adjust style for volume slider thumb. (WebCore::RenderTheme::paint): Paints volume control parts using theme.
  • rendering/RenderTheme.h: (WebCore::RenderTheme::paintMediaVolumeSliderContainer): Naive implementation to be overridden. (WebCore::RenderTheme::paintMediaVolumeSliderTrack): ditto. (WebCore::RenderTheme::paintMediaVolumeSliderThumb): ditto.
  • rendering/style/RenderStyleConstants.h: (WebCore::): Constants for volume control parts.
Location:
trunk/WebCore
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r47743 r47744  
     12009-08-25  Alpha Lam  <hclam@chromium.org>
     2
     3        Reviewed by David Levin.
     4
     5        Media controls panel does not have a volume control slider
     6        https://bugs.webkit.org/show_bug.cgi?id=28241
     7
     8        Introduced "-webkit-media-controls-volume-slider",
     9        "-webkit-media-controls-volume-slider-container" and the supporting
     10        implementation. Also added appearances of "media-volume-slider" and
     11        "media-volume-slider-container".
     12
     13        The implementation of the controls are in WebCore::MediaControlElements.
     14        Logic to trigger the display of the volume controls are in WebCore::RenderMedia.
     15
     16        No new tests since this change doesn't have theme implementation and the
     17        volume slider is disabled by default.
     18
     19        * accessibility/AccessibilitySlider.cpp:
     20        (WebCore::AccessibilitySlider::orientation): Marks that volume slider is vertical.
     21        * css/CSSPrimitiveValueMappings.h:
     22        (WebCore::CSSPrimitiveValue::CSSPrimitiveValue): Added corresponding CSS values.
     23        * css/CSSSelector.cpp:
     24        (WebCore::CSSSelector::extractPseudoType): ditto.
     25        * css/CSSSelector.h:
     26        (WebCore::CSSSelector::): ditto.
     27        * css/CSSStyleSelector.cpp:
     28        (WebCore::CSSStyleSelector::SelectorChecker::checkOneSelector): ditto.
     29        * css/CSSValueKeywords.in: ditto.
     30        * css/mediaControls.css: Makes the volume slider disabled by default.
     31        * platform/ThemeTypes.h: Defines theme parts for volume slider and its container.
     32        (WebCore::):
     33        * rendering/MediaControlElements.cpp:
     34        (WebCore::MediaControlVolumeSliderContainerElement::MediaControlVolumeSliderContainerElement):
     35        (WebCore::MediaControlVolumeSliderContainerElement::styleForElement):
     36        Adjust the CSS values for "display", "postion", "left" and "top" according to member variables.
     37        (WebCore::MediaControlVolumeSliderContainerElement::setVisible): Affects the "display" CSS value.
     38        (WebCore::MediaControlVolumeSliderContainerElement::setPosition): Affects the "left" and "top" CSS values.
     39        (WebCore::MediaControlVolumeSliderContainerElement::hitTest): Hit testing this element.
     40        (WebCore::MediaControlVolumeSliderElement::MediaControlVolumeSliderElement):
     41        (WebCore::MediaControlVolumeSliderElement::defaultEventHandler): Modifies the volume using the slider value, allows dragging.
     42        * rendering/MediaControlElements.h:
     43        (WebCore::): Added definition for MediaControlVolumeSliderElement and MediaControlVolumeSliderContainerElement.
     44        (WebCore::MediaControlVolumeSliderContainerElement::isVisible): Inline getter.
     45        * rendering/RenderMedia.cpp:
     46        (WebCore::RenderMedia::styleDidChange): Updates styles for volume container and volume slider.
     47        (WebCore::RenderMedia::createVolumeSliderContainer): Creates volume slider container and attach to panel.
     48        (WebCore::RenderMedia::createVolumeSlider): Creates volume slider and attach to volume slider container.
     49        (WebCore::RenderMedia::updateControls): Updates volume container and volume slider.
     50        (WebCore::RenderMedia::updateVolumeSliderContainer): Sets the visibility and position of volume slider container and its child.
     51        (WebCore::RenderMedia::forwardEvent):
     52        Hit testing the volume slider container and volume slider to toggle the visibility and forward events to slider.
     53        * rendering/RenderMedia.h:
     54        Added definition for RenderMedia::updateVolumeSliderContainer().
     55        * rendering/RenderMediaControls.cpp:
     56        (WebCore::RenderMediaControls::paintMediaControlsPart): Not implemented.
     57        * rendering/RenderSlider.cpp:
     58        (WebCore::RenderSlider::createThumbStyle): Makes volume slider vertical.
     59        (WebCore::RenderSlider::thumbRect): ditto.
     60        (WebCore::RenderSlider::mouseEventIsInThumb): ditto.
     61        (WebCore::RenderSlider::setValueForPosition): ditto.
     62        (WebCore::RenderSlider::positionForOffset): ditto.
     63        (WebCore::RenderSlider::currentPosition): ditto.
     64        (WebCore::RenderSlider::trackSize): ditto.
     65        * rendering/RenderTheme.cpp:
     66        (WebCore::RenderTheme::adjustStyle): Adjust style for volume slider thumb.
     67        (WebCore::RenderTheme::paint): Paints volume control parts using theme.
     68        * rendering/RenderTheme.h:
     69        (WebCore::RenderTheme::paintMediaVolumeSliderContainer): Naive implementation to be overridden.
     70        (WebCore::RenderTheme::paintMediaVolumeSliderTrack): ditto.
     71        (WebCore::RenderTheme::paintMediaVolumeSliderThumb): ditto.
     72        * rendering/style/RenderStyleConstants.h:
     73        (WebCore::): Constants for volume control parts.
     74
    1752009-08-25  Tor Arne Vestbø  <tor.arne.vestbo@nokia.com>
    276
  • trunk/WebCore/accessibility/AccessibilitySlider.cpp

    r46815 r47744  
    7676        case SliderThumbVerticalPart:
    7777        case SliderVerticalPart:
     78        case MediaVolumeSliderPart:
    7879            return AccessibilityOrientationVertical;
    7980           
  • trunk/WebCore/css/CSSPrimitiveValueMappings.h

    r47648 r47744  
    229229            m_value.ident = CSSValueMediaSliderthumb;
    230230            break;
     231        case MediaVolumeSliderContainerPart:
     232            m_value.ident = CSSValueMediaVolumeSliderContainer;
     233            break;
     234        case MediaVolumeSliderPart:
     235            m_value.ident = CSSValueMediaVolumeSlider;
     236            break;
     237        case MediaVolumeSliderThumbPart:
     238            m_value.ident = CSSValueMediaVolumeSliderthumb;
     239            break;
    231240        case MediaControlsBackgroundPart:
    232241            m_value.ident = CSSValueMediaControlsBackground;
  • trunk/WebCore/css/CSSSelector.cpp

    r47444 r47744  
    109109    DEFINE_STATIC_LOCAL(AtomicString, mediaControlsPlayButton, ("-webkit-media-controls-play-button"));
    110110    DEFINE_STATIC_LOCAL(AtomicString, mediaControlsTimeline, ("-webkit-media-controls-timeline"));
     111    DEFINE_STATIC_LOCAL(AtomicString, mediaControlsVolumeSlider, ("-webkit-media-controls-volume-slider"));
    111112    DEFINE_STATIC_LOCAL(AtomicString, mediaControlsSeekBackButton, ("-webkit-media-controls-seek-back-button"));
    112113    DEFINE_STATIC_LOCAL(AtomicString, mediaControlsSeekForwardButton, ("-webkit-media-controls-seek-forward-button"));
     
    116117    DEFINE_STATIC_LOCAL(AtomicString, mediaControlsFullscreenButton, ("-webkit-media-controls-fullscreen-button"));
    117118    DEFINE_STATIC_LOCAL(AtomicString, mediaControlsTimelineContainer, ("-webkit-media-controls-timeline-container"));
     119    DEFINE_STATIC_LOCAL(AtomicString, mediaControlsVolumeSliderContainer, ("-webkit-media-controls-volume-slider-container"));
    118120    DEFINE_STATIC_LOCAL(AtomicString, mediaControlsCurrentTimeDisplay, ("-webkit-media-controls-current-time-display"));
    119121    DEFINE_STATIC_LOCAL(AtomicString, mediaControlsTimeRemainingDisplay, ("-webkit-media-controls-time-remaining-display"));
     
    245247        m_pseudoType = PseudoMediaControlsTimeline;
    246248        element = true;
     249    } else if (m_value == mediaControlsVolumeSlider) {
     250        m_pseudoType = PseudoMediaControlsVolumeSlider;
     251        element = true;
    247252    } else if (m_value == mediaControlsSeekBackButton) {
    248253        m_pseudoType = PseudoMediaControlsSeekBackButton;
     
    265270    } else if (m_value == mediaControlsTimelineContainer) {
    266271        m_pseudoType = PseudoMediaControlsTimelineContainer;
     272        element = true;
     273    } else if (m_value == mediaControlsVolumeSliderContainer) {
     274        m_pseudoType = PseudoMediaControlsVolumeSliderContainer;
    267275        element = true;
    268276    } else if (m_value == notStr)
  • trunk/WebCore/css/CSSSelector.h

    r47444 r47744  
    174174            PseudoMediaControlsPlayButton,
    175175            PseudoMediaControlsTimelineContainer,
     176            PseudoMediaControlsVolumeSliderContainer,
    176177            PseudoMediaControlsCurrentTimeDisplay,
    177178            PseudoMediaControlsTimeRemainingDisplay,
    178179            PseudoMediaControlsTimeline,
     180            PseudoMediaControlsVolumeSlider,
    179181            PseudoMediaControlsSeekBackButton,
    180182            PseudoMediaControlsSeekForwardButton,
  • trunk/WebCore/css/CSSStyleSelector.cpp

    r47630 r47744  
    25082508            case CSSSelector::PseudoMediaControlsTimelineContainer:
    25092509                dynamicPseudo = MEDIA_CONTROLS_TIMELINE_CONTAINER;
    2510                  return true;
     2510                return true;
     2511            case CSSSelector::PseudoMediaControlsVolumeSliderContainer:
     2512                dynamicPseudo = MEDIA_CONTROLS_VOLUME_SLIDER_CONTAINER;
     2513                return true;
    25112514            case CSSSelector::PseudoMediaControlsCurrentTimeDisplay:
    25122515                dynamicPseudo = MEDIA_CONTROLS_CURRENT_TIME_DISPLAY;
     
    25172520            case CSSSelector::PseudoMediaControlsTimeline:
    25182521                dynamicPseudo = MEDIA_CONTROLS_TIMELINE;
     2522                return true;
     2523            case CSSSelector::PseudoMediaControlsVolumeSlider:
     2524                dynamicPseudo = MEDIA_CONTROLS_VOLUME_SLIDER;
    25192525                return true;
    25202526            case CSSSelector::PseudoMediaControlsSeekBackButton:
  • trunk/WebCore/css/CSSValueKeywords.in

    r47648 r47744  
    513513media-slider
    514514media-sliderthumb
     515media-volume-slider-container
     516media-volume-slider
     517media-volume-sliderthumb
    515518media-controls-background
    516519media-current-time-display
  • trunk/WebCore/css/mediaControls.css

    r45474 r47744  
    8989}
    9090
     91audio::-webkit-media-controls-volume-slider-container, video::-webkit-media-controls-volume-slider-container {
     92    display: none;
     93}
     94
     95audio::-webkit-media-controls-volume-slider, video::-webkit-media-controls-volume-slider {
     96    display: none;
     97}
     98
    9199audio::-webkit-media-controls-seek-back-button, video::-webkit-media-controls-seek-back-button {
    92100    -webkit-appearance: media-seek-back-button;
  • trunk/WebCore/platform/ThemeTypes.h

    r45474 r47744  
    5050    MediaFullscreenButtonPart, MediaMuteButtonPart, MediaPlayButtonPart, MediaSeekBackButtonPart,
    5151    MediaSeekForwardButtonPart, MediaRewindButtonPart, MediaReturnToRealtimeButtonPart,
    52     MediaSliderPart,
    53     MediaSliderThumbPart, MediaControlsBackgroundPart,
    54     MediaCurrentTimePart, MediaTimeRemainingPart,
     52    MediaSliderPart, MediaSliderThumbPart, MediaVolumeSliderContainerPart, MediaVolumeSliderPart, MediaVolumeSliderThumbPart,
     53    MediaControlsBackgroundPart, MediaCurrentTimePart, MediaTimeRemainingPart,
    5554    MenulistPart, MenulistButtonPart, MenulistTextPart, MenulistTextFieldPart,
    5655    SliderHorizontalPart, SliderVerticalPart, SliderThumbHorizontalPart,
  • trunk/WebCore/rendering/MediaControlElements.cpp

    r47515 r47744  
    184184}
    185185
    186    
     186// ----------------------------
     187
     188MediaControlVolumeSliderContainerElement::MediaControlVolumeSliderContainerElement(Document* doc, HTMLMediaElement* element)
     189    : MediaControlElement(doc, MEDIA_CONTROLS_VOLUME_SLIDER_CONTAINER, element)
     190    , m_isVisible(false)
     191    , m_x(0)
     192    , m_y(0)
     193{
     194}
     195
     196PassRefPtr<RenderStyle> MediaControlVolumeSliderContainerElement::styleForElement()
     197{
     198    RefPtr<RenderStyle> style = MediaControlElement::styleForElement();
     199    style->setPosition(AbsolutePosition);
     200    style->setLeft(Length(m_x, Fixed));
     201    style->setTop(Length(m_y, Fixed));
     202    style->setDisplay(m_isVisible ? BLOCK : NONE);
     203    return style;
     204}
     205
     206void MediaControlVolumeSliderContainerElement::setVisible(bool visible)
     207{
     208    if (visible == m_isVisible)
     209        return;
     210    m_isVisible = visible;
     211}
     212
     213void MediaControlVolumeSliderContainerElement::setPosition(int x, int y)
     214{
     215    if (x == m_x && y == m_y)
     216        return;
     217    m_x = x;
     218    m_y = y;
     219}
     220
     221bool MediaControlVolumeSliderContainerElement::hitTest(const IntPoint& absPoint)
     222{
     223    if (renderer() && renderer()->style()->hasAppearance())
     224        return renderer()->theme()->hitTestMediaControlPart(renderer(), absPoint);
     225
     226    return false;
     227}
     228
    187229// ----------------------------
    188230
     
    529571// ----------------------------
    530572
     573MediaControlVolumeSliderElement::MediaControlVolumeSliderElement(Document* document, HTMLMediaElement* element)
     574    : MediaControlInputElement(document, MEDIA_CONTROLS_VOLUME_SLIDER, "range", element, MediaVolumeSlider)
     575{
     576    setAttribute(maxAttr, "1");
     577}
     578
     579void MediaControlVolumeSliderElement::defaultEventHandler(Event* event)
     580{
     581    // Left button is 0. Rejects mouse events not from left button.
     582    if (event->isMouseEvent() && static_cast<MouseEvent*>(event)->button())
     583        return;
     584
     585    MediaControlInputElement::defaultEventHandler(event);
     586
     587    if (event->type() == eventNames().mouseoverEvent || event->type() == eventNames().mouseoutEvent || event->type() == eventNames().mousemoveEvent)
     588        return;
     589
     590    float volume = narrowPrecisionToFloat(value().toDouble());
     591    if (volume != m_mediaElement->volume()) {
     592        ExceptionCode ec = 0;
     593        m_mediaElement->setVolume(volume, ec);
     594        ASSERT(!ec);
     595    }
     596}
     597
     598// ----------------------------
     599
    531600MediaControlFullscreenButtonElement::MediaControlFullscreenButtonElement(Document* document, HTMLMediaElement* element)
    532601    : MediaControlInputElement(document, MEDIA_CONTROLS_FULLSCREEN_BUTTON, "button", element, MediaFullscreenButton)
  • trunk/WebCore/rendering/MediaControlElements.h

    r47515 r47744  
    5858    MediaPauseButton,
    5959    MediaTimelineContainer,
    60     MediaCurrentTimeDisplay, 
     60    MediaCurrentTimeDisplay,
    6161    MediaTimeRemainingDisplay,
    6262    MediaStatusDisplay,
    63     MediaControlsPanel
     63    MediaControlsPanel,
     64    MediaVolumeSliderContainer,
     65    MediaVolumeSlider,
     66    MediaVolumeSliderThumb
    6467};
    6568
     
    101104    MediaControlTimelineContainerElement(Document*, HTMLMediaElement*);
    102105    virtual bool rendererIsNeeded(RenderStyle*);
     106};
     107
     108// ----------------------------
     109
     110class MediaControlVolumeSliderContainerElement : public MediaControlElement {
     111public:
     112    MediaControlVolumeSliderContainerElement(Document*, HTMLMediaElement*);
     113    virtual PassRefPtr<RenderStyle> styleForElement();
     114    void setVisible(bool);
     115    bool isVisible() { return m_isVisible; }
     116    void setPosition(int x, int y);
     117    bool hitTest(const IntPoint& absPoint);
     118
     119private:
     120    bool m_isVisible;
     121    int m_x, m_y;
    103122};
    104123
     
    208227// ----------------------------
    209228
     229class MediaControlVolumeSliderElement : public MediaControlInputElement {
     230public:
     231    MediaControlVolumeSliderElement(Document*, HTMLMediaElement*);
     232    virtual void defaultEventHandler(Event*);
     233};
     234
     235// ----------------------------
     236
    210237class MediaControlFullscreenButtonElement : public MediaControlInputElement {
    211238public:
  • trunk/WebCore/rendering/RenderMedia.cpp

    r47140 r47744  
    3434#include "MediaControlElements.h"
    3535#include "MouseEvent.h"
     36#include "RenderTheme.h"
    3637#include <wtf/CurrentTime.h>
    3738#include <wtf/MathExtras.h>
     
    133134        if (m_timeRemainingDisplay)
    134135            m_timeRemainingDisplay->updateStyle();
     136        if (m_volumeSliderContainer)
     137            m_volumeSliderContainer->updateStyle();
     138        if (m_volumeSlider)
     139            m_volumeSlider->updateStyle();
    135140    }
    136141}
     
    239244    m_timeline->setAttribute(precisionAttr, "float");
    240245    m_timeline->attachToParent(m_timelineContainer.get());
     246}
     247
     248void RenderMedia::createVolumeSliderContainer()
     249{
     250    ASSERT(!m_volumeSliderContainer);
     251    m_volumeSliderContainer = new MediaControlVolumeSliderContainerElement(document(), mediaElement());
     252    m_volumeSliderContainer->attachToParent(m_panel.get());
     253}
     254
     255void RenderMedia::createVolumeSlider()
     256{
     257    ASSERT(!m_volumeSlider);
     258    m_volumeSlider = new MediaControlVolumeSliderElement(document(), mediaElement());
     259    m_volumeSlider->setAttribute(precisionAttr, "float");
     260    m_volumeSlider->attachToParent(m_volumeSliderContainer.get());
    241261}
    242262
     
    286306            m_timeRemainingDisplay = 0;
    287307            m_fullscreenButton = 0;
     308            m_volumeSliderContainer = 0;
     309            m_volumeSlider = 0;
    288310            m_controlsShadowRoot = 0;
    289311        }
     
    304326            createStatusDisplay();
    305327            createTimelineContainer();
     328            createVolumeSliderContainer();
    306329            createSeekBackButton();
    307330            createSeekForwardButton();
    308331            createFullscreenButton();
     332            if (m_volumeSliderContainer)
     333                createVolumeSlider();
    309334            if (m_timelineContainer) {
    310335                createCurrentTimeDisplay();
     
    337362    if (m_timelineContainer)
    338363        m_timelineContainer->update();
     364    if (m_volumeSliderContainer)
     365        m_volumeSliderContainer->update();
    339366    if (m_timeline)
    340367        m_timeline->update();
     
    355382    if (m_fullscreenButton)
    356383        m_fullscreenButton->update();
     384    if (m_volumeSlider)
     385        m_volumeSlider->update();
    357386
    358387    updateTimeDisplay();
     
    464493}
    465494
     495void RenderMedia::updateVolumeSliderContainer(bool visible)
     496{
     497    if (!mediaElement()->hasAudio() || !m_volumeSliderContainer || !m_volumeSlider)
     498        return;
     499
     500    if (visible && !m_volumeSliderContainer->isVisible()) {
     501        if (!m_muteButton || !m_muteButton->renderer() || !m_muteButton->renderBox())
     502            return;
     503
     504        RefPtr<RenderStyle> s = m_volumeSliderContainer->styleForElement();
     505        int height = s->height().isPercent() ? 0 : s->height().value();
     506        int x = m_muteButton->renderBox()->offsetLeft();
     507        int y = m_muteButton->renderBox()->offsetTop() - height;
     508        FloatPoint absPoint = m_muteButton->renderer()->localToAbsolute(FloatPoint(x, y), true, true);
     509        if (absPoint.y() < 0)
     510            y = m_muteButton->renderBox()->offsetTop() + m_muteButton->renderBox()->height();
     511        m_volumeSliderContainer->setVisible(true);
     512        m_volumeSliderContainer->setPosition(x, y);
     513        m_volumeSliderContainer->update();
     514        m_volumeSlider->update();
     515    } else if (!visible && m_volumeSliderContainer->isVisible()) {
     516        m_volumeSliderContainer->setVisible(false);
     517        m_volumeSliderContainer->updateStyle();
     518    }
     519}
     520
    466521void RenderMedia::forwardEvent(Event* event)
    467522{
     
    469524        MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
    470525        IntPoint point(mouseEvent->absoluteLocation());
    471         if (m_muteButton && m_muteButton->hitTest(point))
     526        bool showVolumeSlider = false;
     527        if (m_muteButton && m_muteButton->hitTest(point)) {
    472528            m_muteButton->defaultEventHandler(event);
     529            if (event->type() != eventNames().mouseoutEvent)
     530                showVolumeSlider = true;
     531        }
     532
     533        if (m_volumeSliderContainer && m_volumeSliderContainer->hitTest(point))
     534            showVolumeSlider = true;
     535
     536        if (m_volumeSlider && m_volumeSlider->hitTest(point)) {
     537            m_volumeSlider->defaultEventHandler(event);
     538            showVolumeSlider = true;
     539        }
     540
     541        updateVolumeSliderContainer(showVolumeSlider);
    473542
    474543        if (m_playButton && m_playButton->hitTest(point))
  • trunk/WebCore/rendering/RenderMedia.h

    r47140 r47744  
    4242class MediaControlReturnToRealtimeButtonElement;
    4343class MediaControlTimelineElement;
     44class MediaControlVolumeSliderElement;
    4445class MediaControlFullscreenButtonElement;
    4546class MediaControlTimeDisplayElement;
    4647class MediaControlStatusDisplayElement;
    4748class MediaControlTimelineContainerElement;
     49class MediaControlVolumeSliderContainerElement;
    4850class MediaControlElement;
    4951class MediaPlayer;
     
    100102    void createTimelineContainer();
    101103    void createTimeline();
     104    void createVolumeSliderContainer();
     105    void createVolumeSlider();
    102106    void createCurrentTimeDisplay();
    103107    void createTimeRemainingDisplay();
     
    109113    void changeOpacity(HTMLElement*, float opacity);
    110114    void opacityAnimationTimerFired(Timer<RenderMedia>*);
     115
     116    void updateVolumeSliderContainer(bool visible);
    111117
    112118    virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
     
    121127    RefPtr<MediaControlReturnToRealtimeButtonElement> m_returnToRealtimeButton;
    122128    RefPtr<MediaControlTimelineElement> m_timeline;
     129    RefPtr<MediaControlVolumeSliderElement> m_volumeSlider;
    123130    RefPtr<MediaControlFullscreenButtonElement> m_fullscreenButton;
    124131    RefPtr<MediaControlTimelineContainerElement> m_timelineContainer;
     132    RefPtr<MediaControlVolumeSliderContainerElement> m_volumeSliderContainer;
    125133    RefPtr<MediaControlTimeDisplayElement> m_currentTimeDisplay;
    126134    RefPtr<MediaControlTimeDisplayElement> m_timeRemainingDisplay;
  • trunk/WebCore/rendering/RenderMediaControls.cpp

    r44758 r47744  
    129129            paintThemePart(SafariTheme::MediaSliderThumbPart, paintInfo.context->platformContext(), r, NSRegularControlSize, determineState(o));
    130130            break;
     131        case MediaVolumeSliderContainer:
     132            // FIXME: Implement volume slider.
     133            ASSERT_NOT_REACHED();
     134            break;
     135        case MediaVolumeSlider:
     136            // FIXME: Implement volume slider.
     137            ASSERT_NOT_REACHED();
     138            break;
     139        case MediaVolumeSliderThumb:
     140            // FIXME: Implement volume slider.
     141            ASSERT_NOT_REACHED();
     142            break;
    131143        case MediaTimelineContainer:
    132144            ASSERT_NOT_REACHED();
  • trunk/WebCore/rendering/RenderSlider.cpp

    r47440 r47744  
    282282    else if (parentStyle->appearance() == MediaSliderPart)
    283283        style->setAppearance(MediaSliderThumbPart);
     284    else if (parentStyle->appearance() == MediaVolumeSliderPart)
     285        style->setAppearance(MediaVolumeSliderThumbPart);
    284286
    285287    return style.release();
     
    299301    double fraction = sliderPosition(static_cast<HTMLInputElement*>(node()));
    300302    IntRect contentRect = contentBoxRect();
    301     if (style()->appearance() == SliderVerticalPart) {
     303    if (style()->appearance() == SliderVerticalPart || style()->appearance() == MediaVolumeSliderPart) {
    302304        thumbRect.setX(contentRect.x() + (contentRect.width() - thumbRect.width()) / 2);
    303305        thumbRect.setY(contentRect.y() + static_cast<int>(nextafter((contentRect.height() - thumbRect.height()) + 1, 0) * (1 - fraction)));
     
    392394
    393395#if ENABLE(VIDEO)
    394     if (style()->appearance() == MediaSliderPart) {
     396    if (style()->appearance() == MediaSliderPart || style()->appearance() == MediaVolumeSliderPart) {
    395397        MediaControlInputElement *sliderThumb = static_cast<MediaControlInputElement*>(m_thumb->renderer()->node());
    396398        return sliderThumb->hitTest(evt->absoluteLocation());
     
    424426    SliderRange range(element);
    425427    double fraction = static_cast<double>(position) / trackSize();
    426     if (style()->appearance() == SliderVerticalPart)
     428    if (style()->appearance() == SliderVerticalPart || style()->appearance() == MediaVolumeSliderPart)
    427429        fraction = 1 - fraction;
    428430    double value = range.clampValue(range.valueFromProportion(fraction));
     
    445447
    446448    int position;
    447     if (style()->appearance() == SliderVerticalPart)
     449    if (style()->appearance() == SliderVerticalPart || style()->appearance() == MediaVolumeSliderPart)
    448450        position = p.y() - m_thumb->renderBox()->height() / 2;
    449451    else
     
    458460    ASSERT(m_thumb->renderer());
    459461
    460     if (style()->appearance() == SliderVerticalPart)
     462    if (style()->appearance() == SliderVerticalPart || style()->appearance() == MediaVolumeSliderPart)
    461463        return toRenderBox(m_thumb->renderer())->y() - contentBoxRect().y();
    462464    return toRenderBox(m_thumb->renderer())->x() - contentBoxRect().x();
     
    468470    ASSERT(m_thumb->renderer());
    469471
    470     if (style()->appearance() == SliderVerticalPart)
     472    if (style()->appearance() == SliderVerticalPart || style()->appearance() == MediaVolumeSliderPart)
    471473        return contentHeight() - m_thumb->renderBox()->height();
    472474    return contentWidth() - m_thumb->renderBox()->width();
  • trunk/WebCore/rendering/RenderTheme.cpp

    r46148 r47744  
    184184            return adjustMenuListButtonStyle(selector, style, e);
    185185        case MediaSliderPart:
     186        case MediaVolumeSliderPart:
    186187        case SliderHorizontalPart:
    187188        case SliderVerticalPart:
     
    278279            if (o->parent()->isSlider())
    279280                return paintMediaSliderThumb(o, paintInfo, r);
     281            break;
     282        case MediaVolumeSliderContainerPart:
     283            return paintMediaVolumeSliderContainer(o, paintInfo, r);
     284        case MediaVolumeSliderPart:
     285            return paintMediaVolumeSliderTrack(o, paintInfo, r);
     286        case MediaVolumeSliderThumbPart:
     287            if (o->parent()->isSlider())
     288                return paintMediaVolumeSliderThumb(o, paintInfo, r);
    280289            break;
    281290        case MediaTimeRemainingPart:
  • trunk/WebCore/rendering/RenderTheme.h

    r45569 r47744  
    245245    virtual bool paintMediaSliderTrack(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
    246246    virtual bool paintMediaSliderThumb(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
     247    virtual bool paintMediaVolumeSliderContainer(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
     248    virtual bool paintMediaVolumeSliderTrack(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
     249    virtual bool paintMediaVolumeSliderThumb(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
    247250    virtual bool paintMediaRewindButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
    248251    virtual bool paintMediaReturnToRealtimeButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
  • trunk/WebCore/rendering/style/RenderStyleConstants.h

    r47648 r47744  
    7070    SLIDER_THUMB, SEARCH_CANCEL_BUTTON, SEARCH_DECORATION, SEARCH_RESULTS_DECORATION, SEARCH_RESULTS_BUTTON, MEDIA_CONTROLS_PANEL,
    7171    MEDIA_CONTROLS_PLAY_BUTTON, MEDIA_CONTROLS_MUTE_BUTTON, MEDIA_CONTROLS_TIMELINE, MEDIA_CONTROLS_TIMELINE_CONTAINER,
    72     MEDIA_CONTROLS_CURRENT_TIME_DISPLAY, MEDIA_CONTROLS_TIME_REMAINING_DISPLAY, MEDIA_CONTROLS_SEEK_BACK_BUTTON,
    73     MEDIA_CONTROLS_SEEK_FORWARD_BUTTON, MEDIA_CONTROLS_FULLSCREEN_BUTTON, MEDIA_CONTROLS_REWIND_BUTTON,
    74     MEDIA_CONTROLS_RETURN_TO_REALTIME_BUTTON, MEDIA_CONTROLS_STATUS_DISPLAY,
    75     SCROLLBAR_THUMB, SCROLLBAR_BUTTON, SCROLLBAR_TRACK, SCROLLBAR_TRACK_PIECE, SCROLLBAR_CORNER, RESIZER,
     72    MEDIA_CONTROLS_VOLUME_SLIDER, MEDIA_CONTROLS_VOLUME_SLIDER_CONTAINER, MEDIA_CONTROLS_CURRENT_TIME_DISPLAY, MEDIA_CONTROLS_TIME_REMAINING_DISPLAY, MEDIA_CONTROLS_SEEK_BACK_BUTTON,
     73    MEDIA_CONTROLS_SEEK_FORWARD_BUTTON, MEDIA_CONTROLS_FULLSCREEN_BUTTON, MEDIA_CONTROLS_REWIND_BUTTON, MEDIA_CONTROLS_RETURN_TO_REALTIME_BUTTON,
     74    MEDIA_CONTROLS_STATUS_DISPLAY, SCROLLBAR_THUMB, SCROLLBAR_BUTTON, SCROLLBAR_TRACK, SCROLLBAR_TRACK_PIECE, SCROLLBAR_CORNER, RESIZER,
    7675
    7776    FIRST_INTERNAL_PSEUDOID = FILE_UPLOAD_BUTTON
Note: See TracChangeset for help on using the changeset viewer.