Source/WebCore/ChangeLog

 12012-07-24 Min Qin <qinmin@chromium.org>
 2
 3 Add an overlay play button to media controls on android
 4 https://bugs.webkit.org/show_bug.cgi?id=92132
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 This change adds an overlay play button to the media controls for android.
 9 No tests for now as this setting is not being used by other port.
 10 Will add a test and adjust all the test expectations when we upstream the layout tests for android.
 11
 12 * css/CSSPrimitiveValueMappings.h:
 13 (WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
 14 * css/CSSValueKeywords.in:
 15 * css/mediaControls.css:
 16 (audio::-webkit-media-controls-overlay-play-button, video::-webkit-media-controls-overlay-play-button):
 17 * css/mediaControlsChromiumAndroid.css:
 18 (audio::-webkit-media-controls-overlay-enclosure):
 19 (video::-webkit-media-controls-overlay-enclosure):
 20 (audio::-webkit-media-controls-play-button, video::-webkit-media-controls-play-button):
 21 (audio::-webkit-media-controls-overlay-play-button):
 22 (video::-webkit-media-controls-overlay-play-button):
 23 * html/shadow/MediaControlElements.cpp:
 24 (WebCore::MediaControlOverlayPlayButtonElement::MediaControlOverlayPlayButtonElement):
 25 (WebCore):
 26 (WebCore::MediaControlOverlayPlayButtonElement::create):
 27 (WebCore::MediaControlOverlayPlayButtonElement::defaultEventHandler):
 28 (WebCore::MediaControlOverlayPlayButtonElement::updateDisplayType):
 29 (WebCore::MediaControlOverlayPlayButtonElement::shadowPseudoId):
 30 * html/shadow/MediaControlElements.h:
 31 (MediaControlOverlayPlayButtonElement):
 32 (WebCore):
 33 * html/shadow/MediaControlRootElementChromium.cpp:
 34 (WebCore::MediaControlPanelEnclosureElement::MediaControlPanelEnclosureElement):
 35 (WebCore::MediaControlPanelEnclosureElement::create):
 36 (WebCore):
 37 (WebCore::MediaControlPanelEnclosureElement::shadowPseudoId):
 38 (WebCore::MediaControlOverlayEnclosureElement::MediaControlOverlayEnclosureElement):
 39 (WebCore::MediaControlOverlayEnclosureElement::create):
 40 (WebCore::MediaControlOverlayEnclosureElement::shadowPseudoId):
 41 (WebCore::MediaControlRootElementChromium::MediaControlRootElementChromium):
 42 (WebCore::MediaControlRootElementChromium::create):
 43 (WebCore::MediaControlRootElementChromium::setMediaController):
 44 (WebCore::MediaControlRootElementChromium::playbackStarted):
 45 (WebCore::MediaControlRootElementChromium::playbackStopped):
 46 * html/shadow/MediaControlRootElementChromium.h:
 47 (WebCore):
 48 (MediaControlPanelEnclosureElement):
 49 (MediaControlOverlayEnclosureElement):
 50 (MediaControlRootElementChromium):
 51 * platform/ThemeTypes.h:
 52 * rendering/RenderMediaControlsChromium.cpp:
 53 (WebCore):
 54 (WebCore::paintMediaOverlayPlayButton):
 55 (WebCore::RenderMediaControlsChromium::paintMediaControlsPart):
 56 * rendering/RenderTheme.cpp:
 57 (WebCore::RenderTheme::paint):
 58 * rendering/RenderTheme.h:
 59 (WebCore::RenderTheme::paintMediaOverlayPlayButton):
 60 * rendering/RenderThemeChromiumAndroid.cpp:
 61 (WebCore::RenderThemeChromiumAndroid::paintMediaOverlayPlayButton):
 62 (WebCore):
 63 * rendering/RenderThemeChromiumAndroid.h:
 64
1652012-07-23 Kwang Yul Seo <skyul@company100.net>
266
367 Ref-count AtomicHTMLToken

Source/WebCore/WebCore.gypi

57235723 'html/shadow/MediaControlElements.h',
57245724 'html/shadow/MediaControlRootElementChromium.cpp',
57255725 'html/shadow/MediaControlRootElementChromium.h',
 5726 'html/shadow/MediaControlRootElementChromiumAndroid.cpp',
 5727 'html/shadow/MediaControlRootElementChromiumAndroid.h',
57265728 'html/shadow/MeterShadowElement.cpp',
57275729 'html/shadow/MeterShadowElement.h',
57285730 'html/shadow/ProgressShadowElement.cpp',

Source/WebCore/css/CSSPrimitiveValueMappings.h

@@template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ControlPart e)
383383 case MediaPlayButtonPart:
384384 m_value.ident = CSSValueMediaPlayButton;
385385 break;
 386 case MediaOverlayPlayButtonPart:
 387 m_value.ident = CSSValueMediaOverlayPlayButton;
 388 break;
386389 case MediaMuteButtonPart:
387390 m_value.ident = CSSValueMediaMuteButton;
388391 break;

Source/WebCore/css/CSSValueKeywords.in

@@media-fullscreen-volume-slider
644644media-fullscreen-volume-slider-thumb
645645media-mute-button
646646media-play-button
 647media-overlay-play-button
647648media-seek-back-button
648649media-seek-forward-button
649650media-rewind-button

Source/WebCore/css/mediaControls.css

@@audio::-webkit-media-controls-mute-button, video::-webkit-media-controls-mute-bu
8181 color: inherit;
8282}
8383
 84audio::-webkit-media-controls-overlay-play-button, video::-webkit-media-controls-overlay-play-button {
 85 display: none;
 86}
 87
8488audio::-webkit-media-controls-play-button, video::-webkit-media-controls-play-button {
8589 -webkit-appearance: media-play-button;
8690 display: -webkit-box;

Source/WebCore/css/mediaControlsChromiumAndroid.css

@@video::-webkit-media-controls-enclosure {
7575 height: 35px;
7676}
7777
 78audio::-webkit-media-controls-overlay-enclosure {
 79 display: none;
 80}
 81
 82video::-webkit-media-controls-overlay-enclosure {
 83 display: -webkit-box;
 84 -webkit-box-orient: horizontal;
 85 -webkit-box-pack:center;
 86 -webkit-box-align:center;
 87 -webkit-box-flex:1;
 88 width: 100%;
 89 max-width: 800px;
 90 text-indent: 0;
 91 box-sizing: border-box;
 92}
 93
7894audio::-webkit-media-controls-mute-button, video::-webkit-media-controls-mute-button {
7995 display: none;
8096}

@@audio::-webkit-media-controls-play-button, video::-webkit-media-controls-play-bu
92108 padding: 0;
93109}
94110
 111video::-webkit-media-controls-overlay-play-button {
 112 -webkit-appearance: media-overlay-play-button;
 113 -webkit-box-align: center;
 114 display: -webkit-box;
 115 border: none;
 116 box-sizing: border-box;
 117 background-color: transparent;
 118 width: 80px;
 119 height: 80px;
 120 padding: 0;
 121}
 122
95123audio::-webkit-media-controls-current-time-display, video::-webkit-media-controls-current-time-display,
96124audio::-webkit-media-controls-time-remaining-display, video::-webkit-media-controls-time-remaining-display {
97125 -webkit-appearance: media-current-time-display;

Source/WebCore/html/shadow/MediaControlElements.cpp

@@const AtomicString& MediaControlPlayButtonElement::shadowPseudoId() const
608608
609609// ----------------------------
610610
 611inline MediaControlOverlayPlayButtonElement::MediaControlOverlayPlayButtonElement(Document* document)
 612 : MediaControlInputElement(document, MediaOverlayPlayButton)
 613{
 614}
 615
 616PassRefPtr<MediaControlOverlayPlayButtonElement> MediaControlOverlayPlayButtonElement::create(Document* document)
 617{
 618 RefPtr<MediaControlOverlayPlayButtonElement> button = adoptRef(new MediaControlOverlayPlayButtonElement(document));
 619 button->createShadowSubtree();
 620 button->setType("button");
 621 return button.release();
 622}
 623
 624void MediaControlOverlayPlayButtonElement::defaultEventHandler(Event* event)
 625{
 626 if (event->type() == eventNames().clickEvent && mediaController()->canPlay()) {
 627 mediaController()->play();
 628 updateDisplayType();
 629 event->setDefaultHandled();
 630 }
 631 HTMLInputElement::defaultEventHandler(event);
 632}
 633
 634void MediaControlOverlayPlayButtonElement::updateDisplayType()
 635{
 636 if (mediaController()->canPlay()) {
 637 show();
 638 setDisplayType(MediaOverlayPlayButton);
 639 } else
 640 hide();
 641}
 642
 643const AtomicString& MediaControlOverlayPlayButtonElement::shadowPseudoId() const
 644{
 645 DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-overlay-play-button"));
 646 return id;
 647}
 648
 649// ----------------------------
 650
611651inline MediaControlSeekButtonElement::MediaControlSeekButtonElement(Document* document, MediaControlElementType displayType)
612652 : MediaControlInputElement(document, displayType)
613653 , m_actionOnStop(Nothing)

Source/WebCore/html/shadow/MediaControlElements.h

@@enum MediaControlElementType {
7474 MediaTextTrackDisplayContainer,
7575 MediaTextTrackDisplay,
7676 MediaExitFullscreenButton,
 77 MediaOverlayPlayButton,
7778};
7879
7980HTMLMediaElement* toParentMediaElement(Node*);

@@private:
271272
272273// ----------------------------
273274
 275class MediaControlOverlayPlayButtonElement : public MediaControlInputElement {
 276public:
 277 static PassRefPtr<MediaControlOverlayPlayButtonElement> create(Document*);
 278
 279 virtual void defaultEventHandler(Event*);
 280 virtual void updateDisplayType();
 281
 282private:
 283 explicit MediaControlOverlayPlayButtonElement(Document*);
 284
 285 virtual const AtomicString& shadowPseudoId() const;
 286};
 287
 288// ----------------------------
274289class MediaControlSeekButtonElement : public MediaControlInputElement {
275290public:
276291 virtual void defaultEventHandler(Event*);

Source/WebCore/html/shadow/MediaControlRootElementChromium.cpp

@@MediaControlChromiumEnclosureElement::MediaControlChromiumEnclosureElement(Docum
5454{
5555}
5656
57 PassRefPtr<MediaControlChromiumEnclosureElement> MediaControlChromiumEnclosureElement::create(Document* document)
 57MediaControlPanelEnclosureElement::MediaControlPanelEnclosureElement(Document* document)
 58 : MediaControlChromiumEnclosureElement(document)
5859{
59  return adoptRef(new MediaControlChromiumEnclosureElement(document));
6060}
6161
62 const AtomicString& MediaControlChromiumEnclosureElement::shadowPseudoId() const
 62PassRefPtr<MediaControlPanelEnclosureElement> MediaControlPanelEnclosureElement::create(Document* document)
 63{
 64 return adoptRef(new MediaControlPanelEnclosureElement(document));
 65}
 66
 67const AtomicString& MediaControlPanelEnclosureElement::shadowPseudoId() const
6368{
6469 DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-enclosure"));
6570 return id;

@@MediaControlRootElementChromium::MediaControlRootElementChromium(Document* docum
8691{
8792}
8893
 94// MediaControls::create() for Android is defined in MediaControlRootElementChromiumAndroid.cpp.
 95#if !OS(ANDROID)
8996PassRefPtr<MediaControls> MediaControls::create(Document* document)
9097{
9198 return MediaControlRootElementChromium::create(document);
9299}
 100#endif
93101
94102PassRefPtr<MediaControlRootElementChromium> MediaControlRootElementChromium::create(Document* document)
95103{

@@PassRefPtr<MediaControlRootElementChromium> MediaControlRootElementChromium::cre
98106
99107 RefPtr<MediaControlRootElementChromium> controls = adoptRef(new MediaControlRootElementChromium(document));
100108
 109 if (controls->initializeControls(document))
 110 return controls.release();
 111
 112 return 0;
 113}
 114
 115bool MediaControlRootElementChromium::initializeControls(Document* document)
 116{
101117 // Create an enclosing element for the panel so we can visually offset the controls correctly.
102  RefPtr<MediaControlChromiumEnclosureElement> enclosure = MediaControlChromiumEnclosureElement::create(document);
 118 RefPtr<MediaControlPanelEnclosureElement> enclosure = MediaControlPanelEnclosureElement::create(document);
103119
104120 RefPtr<MediaControlPanelElement> panel = MediaControlPanelElement::create(document);
105121
106122 ExceptionCode ec;
107123
108124 RefPtr<MediaControlPlayButtonElement> playButton = MediaControlPlayButtonElement::create(document);
109  controls->m_playButton = playButton.get();
 125 m_playButton = playButton.get();
110126 panel->appendChild(playButton.release(), ec, true);
111127 if (ec)
112  return 0;
 128 return false;
113129
114  RefPtr<MediaControlTimelineElement> timeline = MediaControlTimelineElement::create(document, controls.get());
115  controls->m_timeline = timeline.get();
 130 RefPtr<MediaControlTimelineElement> timeline = MediaControlTimelineElement::create(document, this);
 131 m_timeline = timeline.get();
116132 panel->appendChild(timeline.release(), ec, true);
117133 if (ec)
118  return 0;
 134 return false;
119135
120136 RefPtr<MediaControlCurrentTimeDisplayElement> currentTimeDisplay = MediaControlCurrentTimeDisplayElement::create(document);
121  controls->m_currentTimeDisplay = currentTimeDisplay.get();
122  controls->m_currentTimeDisplay->hide();
 137 m_currentTimeDisplay = currentTimeDisplay.get();
 138 m_currentTimeDisplay->hide();
123139 panel->appendChild(currentTimeDisplay.release(), ec, true);
124140 if (ec)
125  return 0;
 141 return false;
126142
127143 RefPtr<MediaControlTimeRemainingDisplayElement> durationDisplay = MediaControlTimeRemainingDisplayElement::create(document);
128  controls->m_durationDisplay = durationDisplay.get();
 144 m_durationDisplay = durationDisplay.get();
129145 panel->appendChild(durationDisplay.release(), ec, true);
130146 if (ec)
131  return 0;
 147 return false;
132148
133  RefPtr<MediaControlPanelMuteButtonElement> panelMuteButton = MediaControlPanelMuteButtonElement::create(document, controls.get());
134  controls->m_panelMuteButton = panelMuteButton.get();
 149 RefPtr<MediaControlPanelMuteButtonElement> panelMuteButton = MediaControlPanelMuteButtonElement::create(document, this);
 150 m_panelMuteButton = panelMuteButton.get();
135151 panel->appendChild(panelMuteButton.release(), ec, true);
136152 if (ec)
137  return 0;
 153 return false;
138154
139155 RefPtr<MediaControlVolumeSliderElement> slider = MediaControlVolumeSliderElement::create(document);
140  controls->m_volumeSlider = slider.get();
141  controls->m_volumeSlider->setClearMutedOnUserInteraction(true);
 156 m_volumeSlider = slider.get();
 157 m_volumeSlider->setClearMutedOnUserInteraction(true);
142158 panel->appendChild(slider.release(), ec, true);
143159 if (ec)
144  return 0;
 160 return false;
145161
146  RefPtr<MediaControlFullscreenButtonElement> fullscreenButton = MediaControlFullscreenButtonElement::create(document, controls.get());
147  controls->m_fullscreenButton = fullscreenButton.get();
 162 RefPtr<MediaControlFullscreenButtonElement> fullscreenButton = MediaControlFullscreenButtonElement::create(document, this);
 163 m_fullscreenButton = fullscreenButton.get();
148164 panel->appendChild(fullscreenButton.release(), ec, true);
149165 if (ec)
150  return 0;
 166 return false;
151167
152  controls->m_panel = panel.get();
 168 m_panel = panel.get();
153169 enclosure->appendChild(panel.release(), ec, true);
154170 if (ec)
155  return 0;
 171 return false;
156172
157  controls->m_enclosure = enclosure.get();
158  controls->appendChild(enclosure.release(), ec, true);
 173 m_enclosure = enclosure.get();
 174 appendChild(enclosure.release(), ec, true);
159175 if (ec)
160  return 0;
 176 return false;
161177
162  return controls.release();
 178 return true;
163179}
164180
165181void MediaControlRootElementChromium::setMediaController(MediaControllerInterface* controller)

Source/WebCore/html/shadow/MediaControlRootElementChromium.h

@@class MediaControlTextTrackDisplayElement;
6363
6464class MediaControlChromiumEnclosureElement : public HTMLDivElement {
6565public:
66  static PassRefPtr<MediaControlChromiumEnclosureElement> create(Document*);
67 
68  virtual const AtomicString& shadowPseudoId() const;
69 
7066 void setMediaController(MediaControllerInterface* controller) { m_mediaController = controller; }
7167 MediaControllerInterface* mediaController() const { return m_mediaController; }
7268
7369protected:
74  MediaControlChromiumEnclosureElement(Document*);
 70 explicit MediaControlChromiumEnclosureElement(Document*);
7571
7672private:
7773 virtual bool isMediaControlElement() const { return true; }
78 
7974 MediaControllerInterface* m_mediaController;
8075};
8176
 77class MediaControlPanelEnclosureElement : public MediaControlChromiumEnclosureElement {
 78public:
 79 static PassRefPtr<MediaControlPanelEnclosureElement> create(Document*);
 80 virtual const AtomicString& shadowPseudoId() const;
 81
 82private:
 83 explicit MediaControlPanelEnclosureElement(Document*);
 84};
 85
8286class MediaControlRootElementChromium : public MediaControls {
8387public:
8488 static PassRefPtr<MediaControlRootElementChromium> create(Document*);
8589
8690 // MediaControls implementation.
87  void setMediaController(MediaControllerInterface*);
 91 virtual void setMediaController(MediaControllerInterface*);
8892
8993 void show();
9094 void hide();

@@public:
9397
9498 void reset();
9599
96  void playbackProgressed();
97  void playbackStarted();
98  void playbackStopped();
 100 virtual void playbackProgressed();
 101 virtual void playbackStarted();
 102 virtual void playbackStopped();
99103
100104 void changedMute();
101105 void changedVolume();

@@public:
122126
123127 virtual bool shouldHideControls();
124128
125 private:
126  MediaControlRootElementChromium(Document*);
 129protected:
 130 explicit MediaControlRootElementChromium(Document*);
 131
 132 // Returns true if successful, otherwise return false.
 133 bool initializeControls(Document*);
127134
 135private:
128136 virtual void defaultEventHandler(Event*);
129137 void hideFullscreenControlsTimerFired(Timer<MediaControlRootElementChromium>*);
130138 void startHideFullscreenControlsTimer();

@@private:
144152 MediaControlVolumeSliderElement* m_volumeSlider;
145153 MediaControlFullscreenButtonElement* m_fullscreenButton;
146154 MediaControlPanelElement* m_panel;
147  MediaControlChromiumEnclosureElement* m_enclosure;
 155 MediaControlPanelEnclosureElement* m_enclosure;
 156
148157#if ENABLE(VIDEO_TRACK)
149158 MediaControlTextTrackContainerElement* m_textDisplayContainer;
150159#endif

Source/WebCore/html/shadow/MediaControlRootElementChromiumAndroid.cpp

 1/*
 2 * Copyright (C) 2012 Google 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#include "config.h"
 27
 28#if ENABLE(VIDEO)
 29#include "MediaControlRootElementChromiumAndroid.h"
 30
 31#include "MediaControlElements.h"
 32
 33namespace WebCore {
 34
 35MediaControlOverlayEnclosureElement::MediaControlOverlayEnclosureElement(Document* document)
 36 : MediaControlChromiumEnclosureElement(document)
 37{
 38}
 39
 40PassRefPtr<MediaControlOverlayEnclosureElement> MediaControlOverlayEnclosureElement::create(Document* document)
 41{
 42 return adoptRef(new MediaControlOverlayEnclosureElement(document));
 43}
 44
 45const AtomicString& MediaControlOverlayEnclosureElement::shadowPseudoId() const
 46{
 47 DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-overlay-enclosure"));
 48 return id;
 49}
 50
 51MediaControlRootElementChromiumAndroid::MediaControlRootElementChromiumAndroid(Document* document)
 52 : MediaControlRootElementChromium(document)
 53 , m_overlayPlayButton(0)
 54 , m_overlayEnclosure(0)
 55{
 56}
 57
 58PassRefPtr<MediaControls> MediaControls::create(Document* document)
 59{
 60 return MediaControlRootElementChromiumAndroid::create(document);
 61}
 62
 63PassRefPtr<MediaControlRootElementChromiumAndroid> MediaControlRootElementChromiumAndroid::create(Document* document)
 64{
 65 if (!document->page())
 66 return 0;
 67
 68 RefPtr<MediaControlRootElementChromiumAndroid> controls = adoptRef(new MediaControlRootElementChromiumAndroid(document));
 69
 70 ExceptionCode ec;
 71
 72 RefPtr<MediaControlOverlayEnclosureElement> overlayEnclosure = MediaControlOverlayEnclosureElement::create(document);
 73 RefPtr<MediaControlOverlayPlayButtonElement> overlayPlayButton = MediaControlOverlayPlayButtonElement::create(document);
 74 controls->m_overlayPlayButton = overlayPlayButton.get();
 75 overlayEnclosure->appendChild(overlayPlayButton.release(), ec, true);
 76 if (ec)
 77 return 0;
 78
 79 controls->m_overlayEnclosure = overlayEnclosure.get();
 80 controls->appendChild(overlayEnclosure.release(), ec, true);
 81 if (ec)
 82 return 0;
 83
 84 if (controls->initializeControls(document))
 85 return controls.release();
 86
 87 return 0;
 88}
 89
 90void MediaControlRootElementChromiumAndroid::setMediaController(MediaControllerInterface* controller)
 91{
 92 if (m_overlayPlayButton)
 93 m_overlayPlayButton->setMediaController(controller);
 94 if (m_overlayEnclosure)
 95 m_overlayEnclosure->setMediaController(controller);
 96 MediaControlRootElementChromium::setMediaController(controller);
 97}
 98
 99void MediaControlRootElementChromiumAndroid::playbackStarted()
 100{
 101 m_overlayPlayButton->updateDisplayType();
 102 MediaControlRootElementChromium::playbackStarted();
 103}
 104
 105void MediaControlRootElementChromiumAndroid::playbackStopped()
 106{
 107 m_overlayPlayButton->updateDisplayType();
 108 MediaControlRootElementChromium::playbackStopped();
 109}
 110
 111}
 112
 113#endif

Source/WebCore/html/shadow/MediaControlRootElementChromiumAndroid.h

 1/*
 2 * Copyright (C) 2012 Google 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 MediaControlRootElementChromiumAndroid_h
 27#define MediaControlRootElementChromiumAndroid_h
 28
 29#if ENABLE(VIDEO)
 30
 31#include "MediaControlRootElementChromium.h"
 32
 33namespace WebCore {
 34
 35class MediaControlOverlayPlayButtonElement;
 36
 37class MediaControlOverlayEnclosureElement : public MediaControlChromiumEnclosureElement {
 38public:
 39 static PassRefPtr<MediaControlOverlayEnclosureElement> create(Document*);
 40 virtual const AtomicString& shadowPseudoId() const;
 41
 42private:
 43 explicit MediaControlOverlayEnclosureElement(Document*);
 44};
 45
 46class MediaControlRootElementChromiumAndroid : public MediaControlRootElementChromium {
 47public:
 48 static PassRefPtr<MediaControlRootElementChromiumAndroid> create(Document*);
 49
 50 virtual void setMediaController(MediaControllerInterface*);
 51 virtual void playbackStarted();
 52 virtual void playbackStopped();
 53
 54private:
 55 explicit MediaControlRootElementChromiumAndroid(Document*);
 56
 57 MediaControlOverlayPlayButtonElement* m_overlayPlayButton;
 58 MediaControlOverlayEnclosureElement* m_overlayEnclosure;
 59};
 60
 61}
 62
 63#endif
 64
 65#endif

Source/WebCore/platform/ThemeTypes.h

@@typedef unsigned ControlStates;
4848enum ControlPart {
4949 NoControlPart, CheckboxPart, RadioPart, PushButtonPart, SquareButtonPart, ButtonPart,
5050 ButtonBevelPart, DefaultButtonPart, InnerSpinButtonPart, InputSpeechButtonPart, ListboxPart, ListItemPart,
51  MediaEnterFullscreenButtonPart, MediaExitFullscreenButtonPart, MediaFullScreenVolumeSliderPart, MediaFullScreenVolumeSliderThumbPart, MediaMuteButtonPart, MediaPlayButtonPart, MediaSeekBackButtonPart,
52  MediaSeekForwardButtonPart, MediaRewindButtonPart, MediaReturnToRealtimeButtonPart, MediaToggleClosedCaptionsButtonPart,
 51 MediaEnterFullscreenButtonPart, MediaExitFullscreenButtonPart, MediaFullScreenVolumeSliderPart, MediaFullScreenVolumeSliderThumbPart, MediaMuteButtonPart, MediaPlayButtonPart,
 52 MediaOverlayPlayButtonPart, MediaSeekBackButtonPart, MediaSeekForwardButtonPart, MediaRewindButtonPart, MediaReturnToRealtimeButtonPart, MediaToggleClosedCaptionsButtonPart,
5353 MediaSliderPart, MediaSliderThumbPart, MediaVolumeSliderContainerPart, MediaVolumeSliderPart, MediaVolumeSliderThumbPart,
5454 MediaVolumeSliderMuteButtonPart, MediaControlsBackgroundPart, MediaControlsFullscreenBackgroundPart, MediaCurrentTimePart, MediaTimeRemainingPart,
5555 MenulistPart, MenulistButtonPart, MenulistTextPart, MenulistTextFieldPart, MeterPart, ProgressBarPart, ProgressBarValuePart,

Source/WebCore/rendering/RenderMediaControlsChromium.cpp

@@static bool paintMediaPlayButton(RenderObject* object, const PaintInfo& paintInf
111111 return paintMediaButton(paintInfo.context, rect, mediaElement->canPlay() ? mediaPlay : mediaPause);
112112}
113113
 114static bool paintMediaOverlayPlayButton(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
 115{
 116 HTMLMediaElement* mediaElement = toParentMediaElement(object);
 117 if (!mediaElement)
 118 return false;
 119
 120 if (!hasSource(mediaElement) || !mediaElement->canPlay())
 121 return false;
 122
 123 static Image* mediaOverlayPlay = platformResource("mediaplayerOverlayPlay");
 124 return paintMediaButton(paintInfo.context, rect, mediaOverlayPlay);
 125}
 126
114127static Image* getMediaSliderThumb()
115128{
116129 static Image* mediaSliderThumb = platformResource("mediaplayerSliderThumb");

@@bool RenderMediaControlsChromium::paintMediaControlsPart(MediaControlElementType
338351 case MediaEnterFullscreenButton:
339352 case MediaExitFullscreenButton:
340353 return paintMediaFullscreenButton(object, paintInfo, rect);
 354 case MediaOverlayPlayButton:
 355 return paintMediaOverlayPlayButton(object, paintInfo, rect);
341356 case MediaVolumeSliderMuteButton:
342357 case MediaSeekBackButton:
343358 case MediaSeekForwardButton:

Source/WebCore/rendering/RenderTheme.cpp

@@bool RenderTheme::paint(RenderObject* o, const PaintInfo& paintInfo, const IntRe
329329 return paintMediaFullscreenButton(o, paintInfo, r);
330330 case MediaPlayButtonPart:
331331 return paintMediaPlayButton(o, paintInfo, r);
 332 case MediaOverlayPlayButtonPart:
 333 return paintMediaOverlayPlayButton(o, paintInfo, r);
332334 case MediaMuteButtonPart:
333335 return paintMediaMuteButton(o, paintInfo, r);
334336 case MediaSeekBackButtonPart:

Source/WebCore/rendering/RenderTheme.h

@@protected:
318318 virtual void adjustMediaControlStyle(StyleResolver*, RenderStyle*, Element*) const;
319319 virtual bool paintMediaFullscreenButton(RenderObject*, const PaintInfo&, const IntRect&) { return true; }
320320 virtual bool paintMediaPlayButton(RenderObject*, const PaintInfo&, const IntRect&) { return true; }
 321 virtual bool paintMediaOverlayPlayButton(RenderObject*, const PaintInfo&, const IntRect&) { return true; }
321322 virtual bool paintMediaMuteButton(RenderObject*, const PaintInfo&, const IntRect&) { return true; }
322323 virtual bool paintMediaSeekBackButton(RenderObject*, const PaintInfo&, const IntRect&) { return true; }
323324 virtual bool paintMediaSeekForwardButton(RenderObject*, const PaintInfo&, const IntRect&) { return true; }

Source/WebCore/rendering/RenderThemeChromiumAndroid.cpp

@@void RenderThemeChromiumAndroid::adjustInnerSpinButtonStyle(StyleResolver*, Rend
8787 }
8888}
8989
 90bool RenderThemeChromiumAndroid::paintMediaOverlayPlayButton(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
 91{
 92#if ENABLE(VIDEO) && ENABLE(MEDIA_OVERLAY_PLAY_BUTTON)
 93 return RenderMediaControlsChromium::paintMediaControlsPart(MediaOverlayPlayButton, object, paintInfo, rect);
 94#else
 95 UNUSED_PARAM(object);
 96 UNUSED_PARAM(paintInfo);
 97 UNUSED_PARAM(rect);
 98 return false;
 99#endif
 100}
 101
90102int RenderThemeChromiumAndroid::menuListArrowPadding() const
91103{
92104 // We cannot use the scrollbar thickness here, as it's width is 0 on Android.

Source/WebCore/rendering/RenderThemeChromiumAndroid.h

@@public:
4141
4242 virtual bool delegatesMenuListRendering() const OVERRIDE { return true; }
4343
 44 bool paintMediaOverlayPlayButton(RenderObject*, const PaintInfo&, const IntRect&) OVERRIDE;
 45
4446#if ENABLE(VIDEO)
4547 virtual String extraMediaControlsStyleSheet() OVERRIDE;
4648#endif