1/* 2 * Copyright (C) 2008, 2009 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 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#ifndef MediaControlElements_h 30#define MediaControlElements_h 31 32#if ENABLE(VIDEO) 33 34#include "HTMLDivElement.h" 35#include "HTMLInputElement.h" 36#include "HTMLMediaElement.h" 37#include "RenderBlock.h" 38 39// These are the shadow elements used in RenderMedia 40 41namespace WebCore { 42 43class Event; 44class Frame; 45 46// Must match WebKitSystemInterface.h 47enum MediaControlElementType { 48 MediaFullscreenButton = 0, 49 MediaMuteButton, 50 MediaPlayButton, 51 MediaSeekBackButton, 52 MediaSeekForwardButton, 53 MediaSlider, 54 MediaSliderThumb, 55 MediaRewindButton, 56 MediaReturnToRealtimeButton, 57 MediaShowClosedCaptionsButton, 58 MediaHideClosedCaptionsButton, 59 MediaUnMuteButton, 60 MediaPauseButton, 61 MediaTimelineContainer, 62 MediaCurrentTimeDisplay, 63 MediaTimeRemainingDisplay, 64 MediaStatusDisplay, 65 MediaControlsPanel, 66 MediaVolumeSliderContainer, 67 MediaVolumeSlider, 68 MediaVolumeSliderThumb 69}; 70 71HTMLMediaElement* toParentMediaElement(RenderObject*); 72 73class MediaControlShadowRootElement : public HTMLDivElement { 74public: 75 MediaControlShadowRootElement(Document*, HTMLMediaElement*); 76 77 virtual bool isShadowNode() const { return true; } 78 virtual Node* shadowParentNode() { return m_mediaElement; } 79 80 void updateStyle(); 81 82private: 83 HTMLMediaElement* m_mediaElement; 84}; 85 86// ---------------------------- 87 88class MediaControlElement : public HTMLDivElement { 89public: 90 MediaControlElement(Document*, PseudoId, HTMLMediaElement*); 91 virtual void attach(); 92 virtual bool rendererIsNeeded(RenderStyle*); 93 94 virtual PassRefPtr<RenderStyle> styleForElement(); 95 void attachToParent(Element*); 96 void update(); 97 virtual void updateStyle(); 98 99 MediaControlElementType displayType() const { return m_displayType; } 100 101 HTMLMediaElement* mediaElement() const { return m_mediaElement; } 102 virtual bool isMediaControlElement() const { return true; } 103 104protected: 105 HTMLMediaElement* m_mediaElement; 106 PseudoId m_pseudoStyleId; 107 MediaControlElementType m_displayType; // some elements can show multiple types (e.g. play/pause) 108}; 109 110// ---------------------------- 111 112class MediaControlTimelineContainerElement : public MediaControlElement { 113public: 114 MediaControlTimelineContainerElement(Document*, HTMLMediaElement*); 115 virtual bool rendererIsNeeded(RenderStyle*); 116}; 117 118// ---------------------------- 119 120class MediaControlVolumeSliderContainerElement : public MediaControlElement { 121public: 122 MediaControlVolumeSliderContainerElement(Document*, HTMLMediaElement*); 123 virtual PassRefPtr<RenderStyle> styleForElement(); 124 void setVisible(bool); 125 bool isVisible() { return m_isVisible; } 126 void setPosition(int x, int y); 127 bool hitTest(const IntPoint& absPoint); 128 129private: 130 bool m_isVisible; 131 int m_x, m_y; 132}; 133 134// ---------------------------- 135 136class MediaControlStatusDisplayElement : public MediaControlElement { 137public: 138 MediaControlStatusDisplayElement(Document*, HTMLMediaElement*); 139 virtual void update(); 140 virtual bool rendererIsNeeded(RenderStyle*); 141private: 142 enum StateBeingDisplayed { Nothing, Loading, LiveBroadcast }; 143 StateBeingDisplayed m_stateBeingDisplayed; 144}; 145 146// ---------------------------- 147 148class MediaControlInputElement : public HTMLInputElement { 149public: 150 MediaControlInputElement(Document*, PseudoId, const String& type, HTMLMediaElement*); 151 virtual void attach(); 152 virtual bool rendererIsNeeded(RenderStyle*); 153 154 virtual PassRefPtr<RenderStyle> styleForElement(); 155 void attachToParent(Element*); 156 void update(); 157 void updateStyle(); 158 159 bool hitTest(const IntPoint& absPoint); 160 MediaControlElementType displayType() const { return m_displayType; } 161 162 HTMLMediaElement* mediaElement() const { return m_mediaElement; } 163 virtual bool isMediaControlElement() const { return true; } 164 165protected: 166 virtual void updateDisplayType() { } 167 void setDisplayType(MediaControlElementType); 168 169 HTMLMediaElement* m_mediaElement; 170 PseudoId m_pseudoStyleId; 171 MediaControlElementType m_displayType; 172}; 173 174// ---------------------------- 175 176class MediaControlMuteButtonElement : public MediaControlInputElement { 177public: 178 MediaControlMuteButtonElement(Document*, HTMLMediaElement*); 179 virtual void defaultEventHandler(Event*); 180 virtual void updateDisplayType(); 181}; 182 183// ---------------------------- 184 185class MediaControlPlayButtonElement : public MediaControlInputElement { 186public: 187 MediaControlPlayButtonElement(Document*, HTMLMediaElement*); 188 virtual void defaultEventHandler(Event*); 189 virtual void updateDisplayType(); 190}; 191 192// ---------------------------- 193 194class MediaControlSeekButtonElement : public MediaControlInputElement { 195public: 196 MediaControlSeekButtonElement(Document*, HTMLMediaElement*, bool forward); 197 virtual void defaultEventHandler(Event*); 198 virtual void detach(); 199 void seekTimerFired(Timer<MediaControlSeekButtonElement>*); 200 201private: 202 bool m_forward; 203 bool m_seeking; 204 bool m_capturing; 205 Timer<MediaControlSeekButtonElement> m_seekTimer; 206}; 207 208// ---------------------------- 209 210class MediaControlRewindButtonElement : public MediaControlInputElement { 211public: 212 MediaControlRewindButtonElement(Document*, HTMLMediaElement*); 213 virtual void defaultEventHandler(Event*); 214}; 215 216// ---------------------------- 217 218class MediaControlReturnToRealtimeButtonElement : public MediaControlInputElement { 219public: 220 MediaControlReturnToRealtimeButtonElement(Document*, HTMLMediaElement*); 221 virtual void defaultEventHandler(Event*); 222}; 223 224// ---------------------------- 225 226class MediaControlToggleClosedCaptionsButtonElement : public MediaControlInputElement { 227public: 228 MediaControlToggleClosedCaptionsButtonElement(Document*, HTMLMediaElement*); 229 virtual void defaultEventHandler(Event*); 230 virtual void updateDisplayType(); 231}; 232 233// ---------------------------- 234 235class MediaControlTimelineElement : public MediaControlInputElement { 236public: 237 MediaControlTimelineElement(Document*, HTMLMediaElement*); 238 virtual void defaultEventHandler(Event*); 239 void update(bool updateDuration = true); 240}; 241 242// ---------------------------- 243 244class MediaControlVolumeSliderElement : public MediaControlInputElement { 245public: 246 MediaControlVolumeSliderElement(Document*, HTMLMediaElement*); 247 virtual void defaultEventHandler(Event*); 248 virtual void update(); 249}; 250 251// ---------------------------- 252 253class MediaControlFullscreenButtonElement : public MediaControlInputElement { 254public: 255 MediaControlFullscreenButtonElement(Document*, HTMLMediaElement*); 256 virtual void defaultEventHandler(Event*); 257}; 258 259// ---------------------------- 260 261class MediaControlTimeDisplayElement : public MediaControlElement { 262public: 263 MediaControlTimeDisplayElement(Document*, PseudoId, HTMLMediaElement*); 264 void setVisible(bool); 265 virtual PassRefPtr<RenderStyle> styleForElement(); 266 267 void setCurrentValue(float); 268 float currentValue() const { return m_currentValue; } 269 270private: 271 float m_currentValue; 272 bool m_isVisible; 273}; 274 275// ---------------------------- 276 277class RenderMediaControlShadowRoot : public RenderBlock { 278public: 279 RenderMediaControlShadowRoot(Element* e) : RenderBlock(e) { } 280 void setParent(RenderObject* p) { RenderObject::setParent(p); } 281}; 282 283// ---------------------------- 284 285 286} //namespace WebCore 287#endif // enable(video) 288#endif // MediaControlElements_h 289