Home | History | Annotate | Download | only in rendering
      1 /*
      2  * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #ifndef RenderMedia_h
     27 #define RenderMedia_h
     28 
     29 #if ENABLE(VIDEO)
     30 
     31 #include "RenderImage.h"
     32 #include "Timer.h"
     33 
     34 namespace WebCore {
     35 
     36 class HTMLInputElement;
     37 class HTMLMediaElement;
     38 class MediaControlMuteButtonElement;
     39 class MediaControlPlayButtonElement;
     40 class MediaControlSeekButtonElement;
     41 class MediaControlRewindButtonElement;
     42 class MediaControlReturnToRealtimeButtonElement;
     43 class MediaControlToggleClosedCaptionsButtonElement;
     44 class MediaControlTimelineElement;
     45 class MediaControlVolumeSliderElement;
     46 class MediaControlFullscreenButtonElement;
     47 class MediaControlTimeDisplayElement;
     48 class MediaControlStatusDisplayElement;
     49 class MediaControlTimelineContainerElement;
     50 class MediaControlVolumeSliderContainerElement;
     51 class MediaControlElement;
     52 class MediaPlayer;
     53 
     54 class RenderMedia : public RenderImage {
     55 public:
     56     RenderMedia(HTMLMediaElement*);
     57     RenderMedia(HTMLMediaElement*, const IntSize& intrinsicSize);
     58     virtual ~RenderMedia();
     59 
     60     const RenderObjectChildList* children() const { return &m_children; }
     61     RenderObjectChildList* children() { return &m_children; }
     62 
     63     HTMLMediaElement* mediaElement() const;
     64     MediaPlayer* player() const;
     65 
     66     bool shouldShowTimeDisplayControls() const;
     67 
     68     void updateFromElement();
     69     void updatePlayer();
     70     void updateControls();
     71     void updateTimeDisplay();
     72 
     73     void forwardEvent(Event*);
     74 
     75 protected:
     76     virtual void layout();
     77 
     78 private:
     79     virtual RenderObjectChildList* virtualChildren() { return children(); }
     80     virtual const RenderObjectChildList* virtualChildren() const { return children(); }
     81 
     82     virtual void destroy();
     83 
     84     virtual const char* renderName() const { return "RenderMedia"; }
     85     virtual bool isMedia() const { return true; }
     86     virtual bool isImage() const { return false; }
     87 
     88     virtual int lowestPosition(bool includeOverflowInterior = true, bool includeSelf = true) const;
     89     virtual int rightmostPosition(bool includeOverflowInterior = true, bool includeSelf = true) const;
     90     virtual int leftmostPosition(bool includeOverflowInterior = true, bool includeSelf = true) const;
     91 
     92     void createControlsShadowRoot();
     93     void destroyControlsShadowRoot();
     94     void createPanel();
     95     void createMuteButton();
     96     void createPlayButton();
     97     void createSeekBackButton();
     98     void createSeekForwardButton();
     99     void createRewindButton();
    100     void createReturnToRealtimeButton();
    101     void createToggleClosedCaptionsButton();
    102     void createStatusDisplay();
    103     void createTimelineContainer();
    104     void createTimeline();
    105     void createVolumeSliderContainer();
    106     void createVolumeSlider();
    107     void createCurrentTimeDisplay();
    108     void createTimeRemainingDisplay();
    109     void createFullscreenButton();
    110 
    111     void timeUpdateTimerFired(Timer<RenderMedia>*);
    112 
    113     void updateControlVisibility();
    114     void changeOpacity(HTMLElement*, float opacity);
    115     void opacityAnimationTimerFired(Timer<RenderMedia>*);
    116 
    117     void updateVolumeSliderContainer(bool visible);
    118 
    119     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
    120 
    121     RefPtr<HTMLElement> m_controlsShadowRoot;
    122     RefPtr<MediaControlElement> m_panel;
    123     RefPtr<MediaControlMuteButtonElement> m_muteButton;
    124     RefPtr<MediaControlPlayButtonElement> m_playButton;
    125     RefPtr<MediaControlSeekButtonElement> m_seekBackButton;
    126     RefPtr<MediaControlSeekButtonElement> m_seekForwardButton;
    127     RefPtr<MediaControlRewindButtonElement> m_rewindButton;
    128     RefPtr<MediaControlReturnToRealtimeButtonElement> m_returnToRealtimeButton;
    129     RefPtr<MediaControlToggleClosedCaptionsButtonElement> m_toggleClosedCaptionsButton;
    130     RefPtr<MediaControlTimelineElement> m_timeline;
    131     RefPtr<MediaControlVolumeSliderElement> m_volumeSlider;
    132     RefPtr<MediaControlFullscreenButtonElement> m_fullscreenButton;
    133     RefPtr<MediaControlTimelineContainerElement> m_timelineContainer;
    134     RefPtr<MediaControlVolumeSliderContainerElement> m_volumeSliderContainer;
    135     RefPtr<MediaControlTimeDisplayElement> m_currentTimeDisplay;
    136     RefPtr<MediaControlTimeDisplayElement> m_timeRemainingDisplay;
    137     RefPtr<MediaControlStatusDisplayElement> m_statusDisplay;
    138     RenderObjectChildList m_children;
    139     Node* m_lastUnderNode;
    140     Node* m_nodeUnderMouse;
    141 
    142     Timer<RenderMedia> m_timeUpdateTimer;
    143     Timer<RenderMedia> m_opacityAnimationTimer;
    144     bool m_mouseOver;
    145     double m_opacityAnimationStartTime;
    146     double m_opacityAnimationDuration;
    147     float m_opacityAnimationFrom;
    148     float m_opacityAnimationTo;
    149 };
    150 
    151 inline RenderMedia* toRenderMedia(RenderObject* object)
    152 {
    153     ASSERT(!object || object->isMedia());
    154     return static_cast<RenderMedia*>(object);
    155 }
    156 
    157 // This will catch anyone doing an unnecessary cast.
    158 void toRenderMedia(const RenderMedia*);
    159 
    160 } // namespace WebCore
    161 
    162 #endif
    163 #endif // RenderMedia_h
    164