Diff
Modified: trunk/Source/WebCore/ChangeLog (123968 => 123969)
--- trunk/Source/WebCore/ChangeLog 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/ChangeLog 2012-07-28 19:23:50 UTC (rev 123969)
@@ -1,3 +1,76 @@
+2012-07-28 Min Qin <qin...@chromium.org>
+
+ Add an overlay play button to media controls on android
+ https://bugs.webkit.org/show_bug.cgi?id=92132
+
+ Reviewed by Adam Barth.
+
+ This change adds an overlay play button to the media controls for android.
+ No tests for now as this setting is not being used by other port.
+ Will add a test and adjust all the test expectations when we upstream the layout tests for android.
+
+ * WebCore.gypi:
+ * css/CSSPrimitiveValueMappings.h:
+ (WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
+ * css/CSSValueKeywords.in:
+ * css/mediaControls.css:
+ (audio::-webkit-media-controls-overlay-play-button, video::-webkit-media-controls-overlay-play-button):
+ * css/mediaControlsChromiumAndroid.css:
+ (audio::-webkit-media-controls-overlay-enclosure):
+ (video::-webkit-media-controls-overlay-enclosure):
+ (audio::-webkit-media-controls-play-button, video::-webkit-media-controls-play-button):
+ (video::-webkit-media-controls-overlay-play-button):
+ * html/shadow/MediaControlElements.cpp:
+ (WebCore::MediaControlOverlayPlayButtonElement::MediaControlOverlayPlayButtonElement):
+ (WebCore):
+ (WebCore::MediaControlOverlayPlayButtonElement::create):
+ (WebCore::MediaControlOverlayPlayButtonElement::defaultEventHandler):
+ (WebCore::MediaControlOverlayPlayButtonElement::updateDisplayType):
+ (WebCore::MediaControlOverlayPlayButtonElement::shadowPseudoId):
+ * html/shadow/MediaControlElements.h:
+ (MediaControlOverlayPlayButtonElement):
+ (WebCore):
+ * html/shadow/MediaControlRootElementChromium.cpp:
+ (WebCore::MediaControlPanelEnclosureElement::MediaControlPanelEnclosureElement):
+ (WebCore::MediaControlPanelEnclosureElement::create):
+ (WebCore):
+ (WebCore::MediaControlPanelEnclosureElement::shadowPseudoId):
+ (WebCore::MediaControlRootElementChromium::create):
+ (WebCore::MediaControlRootElementChromium::initializeControls):
+ * html/shadow/MediaControlRootElementChromium.h:
+ (MediaControlChromiumEnclosureElement):
+ (WebCore):
+ (MediaControlPanelEnclosureElement):
+ (MediaControlRootElementChromium):
+ * html/shadow/MediaControlRootElementChromiumAndroid.cpp: Added.
+ (WebCore):
+ (WebCore::MediaControlOverlayEnclosureElement::MediaControlOverlayEnclosureElement):
+ (WebCore::MediaControlOverlayEnclosureElement::create):
+ (WebCore::MediaControlOverlayEnclosureElement::shadowPseudoId):
+ (WebCore::MediaControlRootElementChromiumAndroid::MediaControlRootElementChromiumAndroid):
+ (WebCore::MediaControls::create):
+ (WebCore::MediaControlRootElementChromiumAndroid::create):
+ (WebCore::MediaControlRootElementChromiumAndroid::setMediaController):
+ (WebCore::MediaControlRootElementChromiumAndroid::playbackStarted):
+ (WebCore::MediaControlRootElementChromiumAndroid::playbackStopped):
+ * html/shadow/MediaControlRootElementChromiumAndroid.h: Added.
+ (WebCore):
+ (MediaControlOverlayEnclosureElement):
+ (MediaControlRootElementChromiumAndroid):
+ * platform/ThemeTypes.h:
+ * rendering/RenderMediaControlsChromium.cpp:
+ (WebCore::paintMediaOverlayPlayButton):
+ (WebCore):
+ (WebCore::RenderMediaControlsChromium::paintMediaControlsPart):
+ * rendering/RenderTheme.cpp:
+ (WebCore::RenderTheme::paint):
+ * rendering/RenderTheme.h:
+ (WebCore::RenderTheme::paintMediaOverlayPlayButton):
+ * rendering/RenderThemeChromiumAndroid.cpp:
+ (WebCore::RenderThemeChromiumAndroid::paintMediaOverlayPlayButton):
+ (WebCore):
+ * rendering/RenderThemeChromiumAndroid.h:
+
2012-07-28 Mario Sanchez Prada <msanc...@igalia.com>
[GTK] Add a new and reusable enchant-based spellchecker in WebCore
Modified: trunk/Source/WebCore/WebCore.gyp/WebCore.gyp (123968 => 123969)
--- trunk/Source/WebCore/WebCore.gyp/WebCore.gyp 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/WebCore.gyp/WebCore.gyp 2012-07-28 19:23:50 UTC (rev 123969)
@@ -1539,6 +1539,13 @@
'sources/': [
['exclude', 'AllInOne\\.cpp$'],
],
+ 'conditions': [
+ ['OS!="android"', {
+ 'sources/': [
+ ['exclude', 'Android\\.cpp$'],
+ ],
+ }],
+ ],
},
{
'target_name': 'webcore_svg',
@@ -1627,7 +1634,6 @@
'sources/': [
['exclude', 'platform/graphics/harfbuzz/ComplexTextControllerHarfBuzz\\.cpp$'],
['exclude', 'platform/graphics/harfbuzz/HarfBuzzSkia\\.cpp$'],
-
['include', 'platform/graphics/harfbuzz/ng/HarfBuzzNGFace\\.(cpp|h)$'],
['include', 'platform/graphics/harfbuzz/ng/HarfBuzzNGFaceSkia\\.cpp$'],
['include', 'platform/graphics/harfbuzz/ng/HarfBuzzShaper\\.(cpp|h)$'],
Modified: trunk/Source/WebCore/WebCore.gypi (123968 => 123969)
--- trunk/Source/WebCore/WebCore.gypi 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/WebCore.gypi 2012-07-28 19:23:50 UTC (rev 123969)
@@ -5740,6 +5740,8 @@
'html/shadow/MediaControlElements.h',
'html/shadow/MediaControlRootElementChromium.cpp',
'html/shadow/MediaControlRootElementChromium.h',
+ 'html/shadow/MediaControlRootElementChromiumAndroid.cpp',
+ 'html/shadow/MediaControlRootElementChromiumAndroid.h',
'html/shadow/MeterShadowElement.cpp',
'html/shadow/MeterShadowElement.h',
'html/shadow/ProgressShadowElement.cpp',
Modified: trunk/Source/WebCore/css/CSSPrimitiveValueMappings.h (123968 => 123969)
--- trunk/Source/WebCore/css/CSSPrimitiveValueMappings.h 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/css/CSSPrimitiveValueMappings.h 2012-07-28 19:23:50 UTC (rev 123969)
@@ -383,6 +383,9 @@
case MediaPlayButtonPart:
m_value.ident = CSSValueMediaPlayButton;
break;
+ case MediaOverlayPlayButtonPart:
+ m_value.ident = CSSValueMediaOverlayPlayButton;
+ break;
case MediaMuteButtonPart:
m_value.ident = CSSValueMediaMuteButton;
break;
Modified: trunk/Source/WebCore/css/CSSValueKeywords.in (123968 => 123969)
--- trunk/Source/WebCore/css/CSSValueKeywords.in 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/css/CSSValueKeywords.in 2012-07-28 19:23:50 UTC (rev 123969)
@@ -644,6 +644,7 @@
media-fullscreen-volume-slider-thumb
media-mute-button
media-play-button
+media-overlay-play-button
media-seek-back-button
media-seek-forward-button
media-rewind-button
Modified: trunk/Source/WebCore/css/mediaControls.css (123968 => 123969)
--- trunk/Source/WebCore/css/mediaControls.css 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/css/mediaControls.css 2012-07-28 19:23:50 UTC (rev 123969)
@@ -81,6 +81,10 @@
color: inherit;
}
+audio::-webkit-media-controls-overlay-play-button, video::-webkit-media-controls-overlay-play-button {
+ display: none;
+}
+
audio::-webkit-media-controls-play-button, video::-webkit-media-controls-play-button {
-webkit-appearance: media-play-button;
display: -webkit-box;
Modified: trunk/Source/WebCore/css/mediaControlsChromiumAndroid.css (123968 => 123969)
--- trunk/Source/WebCore/css/mediaControlsChromiumAndroid.css 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/css/mediaControlsChromiumAndroid.css 2012-07-28 19:23:50 UTC (rev 123969)
@@ -75,6 +75,22 @@
height: 35px;
}
+audio::-webkit-media-controls-overlay-enclosure {
+ display: none;
+}
+
+video::-webkit-media-controls-overlay-enclosure {
+ display: -webkit-box;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack:center;
+ -webkit-box-align:center;
+ -webkit-box-flex:1;
+ width: 100%;
+ max-width: 800px;
+ text-indent: 0;
+ box-sizing: border-box;
+}
+
audio::-webkit-media-controls-mute-button, video::-webkit-media-controls-mute-button {
display: none;
}
@@ -92,6 +108,18 @@
padding: 0;
}
+video::-webkit-media-controls-overlay-play-button {
+ -webkit-appearance: media-overlay-play-button;
+ -webkit-box-align: center;
+ display: -webkit-box;
+ border: none;
+ box-sizing: border-box;
+ background-color: transparent;
+ width: 80px;
+ height: 80px;
+ padding: 0;
+}
+
audio::-webkit-media-controls-current-time-display, video::-webkit-media-controls-current-time-display,
audio::-webkit-media-controls-time-remaining-display, video::-webkit-media-controls-time-remaining-display {
-webkit-appearance: media-current-time-display;
Modified: trunk/Source/WebCore/html/shadow/MediaControlElements.cpp (123968 => 123969)
--- trunk/Source/WebCore/html/shadow/MediaControlElements.cpp 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/html/shadow/MediaControlElements.cpp 2012-07-28 19:23:50 UTC (rev 123969)
@@ -612,6 +612,46 @@
// ----------------------------
+inline MediaControlOverlayPlayButtonElement::MediaControlOverlayPlayButtonElement(Document* document)
+ : MediaControlInputElement(document, MediaOverlayPlayButton)
+{
+}
+
+PassRefPtr<MediaControlOverlayPlayButtonElement> MediaControlOverlayPlayButtonElement::create(Document* document)
+{
+ RefPtr<MediaControlOverlayPlayButtonElement> button = adoptRef(new MediaControlOverlayPlayButtonElement(document));
+ button->createShadowSubtree();
+ button->setType("button");
+ return button.release();
+}
+
+void MediaControlOverlayPlayButtonElement::defaultEventHandler(Event* event)
+{
+ if (event->type() == eventNames().clickEvent && mediaController()->canPlay()) {
+ mediaController()->play();
+ updateDisplayType();
+ event->setDefaultHandled();
+ }
+ HTMLInputElement::defaultEventHandler(event);
+}
+
+void MediaControlOverlayPlayButtonElement::updateDisplayType()
+{
+ if (mediaController()->canPlay()) {
+ show();
+ setDisplayType(MediaOverlayPlayButton);
+ } else
+ hide();
+}
+
+const AtomicString& MediaControlOverlayPlayButtonElement::shadowPseudoId() const
+{
+ DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-overlay-play-button"));
+ return id;
+}
+
+// ----------------------------
+
inline MediaControlSeekButtonElement::MediaControlSeekButtonElement(Document* document, MediaControlElementType displayType)
: MediaControlInputElement(document, displayType)
, m_actionOnStop(Nothing)
Modified: trunk/Source/WebCore/html/shadow/MediaControlElements.h (123968 => 123969)
--- trunk/Source/WebCore/html/shadow/MediaControlElements.h 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/html/shadow/MediaControlElements.h 2012-07-28 19:23:50 UTC (rev 123969)
@@ -74,6 +74,7 @@
MediaTextTrackDisplayContainer,
MediaTextTrackDisplay,
MediaExitFullscreenButton,
+ MediaOverlayPlayButton,
};
HTMLMediaElement* toParentMediaElement(Node*);
@@ -271,6 +272,20 @@
// ----------------------------
+class MediaControlOverlayPlayButtonElement : public MediaControlInputElement {
+public:
+ static PassRefPtr<MediaControlOverlayPlayButtonElement> create(Document*);
+
+ virtual void defaultEventHandler(Event*);
+ virtual void updateDisplayType();
+
+private:
+ explicit MediaControlOverlayPlayButtonElement(Document*);
+
+ virtual const AtomicString& shadowPseudoId() const;
+};
+
+// ----------------------------
class MediaControlSeekButtonElement : public MediaControlInputElement {
public:
virtual void defaultEventHandler(Event*);
Modified: trunk/Source/WebCore/html/shadow/MediaControlRootElementChromium.cpp (123968 => 123969)
--- trunk/Source/WebCore/html/shadow/MediaControlRootElementChromium.cpp 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/html/shadow/MediaControlRootElementChromium.cpp 2012-07-28 19:23:50 UTC (rev 123969)
@@ -53,20 +53,24 @@
{
}
-PassRefPtr<MediaControlChromiumEnclosureElement> MediaControlChromiumEnclosureElement::create(Document* document)
-{
- return adoptRef(new MediaControlChromiumEnclosureElement(document));
-}
-
MediaControlElementType MediaControlChromiumEnclosureElement::displayType() const
{
// Mapping onto same MediaControlElementType as panel element, since it has similar properties.
return MediaControlsPanel;
}
+MediaControlPanelEnclosureElement::MediaControlPanelEnclosureElement(Document* document)
+ : MediaControlChromiumEnclosureElement(document)
+{
+}
-const AtomicString& MediaControlChromiumEnclosureElement::shadowPseudoId() const
+PassRefPtr<MediaControlPanelEnclosureElement> MediaControlPanelEnclosureElement::create(Document* document)
{
+ return adoptRef(new MediaControlPanelEnclosureElement(document));
+}
+
+const AtomicString& MediaControlPanelEnclosureElement::shadowPseudoId() const
+{
DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-enclosure"));
return id;
}
@@ -92,10 +96,13 @@
{
}
+// MediaControls::create() for Android is defined in MediaControlRootElementChromiumAndroid.cpp.
+#if !OS(ANDROID)
PassRefPtr<MediaControls> MediaControls::create(Document* document)
{
return MediaControlRootElementChromium::create(document);
}
+#endif
PassRefPtr<MediaControlRootElementChromium> MediaControlRootElementChromium::create(Document* document)
{
@@ -104,68 +111,76 @@
RefPtr<MediaControlRootElementChromium> controls = adoptRef(new MediaControlRootElementChromium(document));
+ if (controls->initializeControls(document))
+ return controls.release();
+
+ return 0;
+}
+
+bool MediaControlRootElementChromium::initializeControls(Document* document)
+{
// Create an enclosing element for the panel so we can visually offset the controls correctly.
- RefPtr<MediaControlChromiumEnclosureElement> enclosure = MediaControlChromiumEnclosureElement::create(document);
+ RefPtr<MediaControlPanelEnclosureElement> enclosure = MediaControlPanelEnclosureElement::create(document);
RefPtr<MediaControlPanelElement> panel = MediaControlPanelElement::create(document);
ExceptionCode ec;
RefPtr<MediaControlPlayButtonElement> playButton = MediaControlPlayButtonElement::create(document);
- controls->m_playButton = playButton.get();
+ m_playButton = playButton.get();
panel->appendChild(playButton.release(), ec, true);
if (ec)
- return 0;
+ return false;
- RefPtr<MediaControlTimelineElement> timeline = MediaControlTimelineElement::create(document, controls.get());
- controls->m_timeline = timeline.get();
+ RefPtr<MediaControlTimelineElement> timeline = MediaControlTimelineElement::create(document, this);
+ m_timeline = timeline.get();
panel->appendChild(timeline.release(), ec, true);
if (ec)
- return 0;
+ return false;
RefPtr<MediaControlCurrentTimeDisplayElement> currentTimeDisplay = MediaControlCurrentTimeDisplayElement::create(document);
- controls->m_currentTimeDisplay = currentTimeDisplay.get();
- controls->m_currentTimeDisplay->hide();
+ m_currentTimeDisplay = currentTimeDisplay.get();
+ m_currentTimeDisplay->hide();
panel->appendChild(currentTimeDisplay.release(), ec, true);
if (ec)
- return 0;
+ return false;
RefPtr<MediaControlTimeRemainingDisplayElement> durationDisplay = MediaControlTimeRemainingDisplayElement::create(document);
- controls->m_durationDisplay = durationDisplay.get();
+ m_durationDisplay = durationDisplay.get();
panel->appendChild(durationDisplay.release(), ec, true);
if (ec)
- return 0;
+ return false;
- RefPtr<MediaControlPanelMuteButtonElement> panelMuteButton = MediaControlPanelMuteButtonElement::create(document, controls.get());
- controls->m_panelMuteButton = panelMuteButton.get();
+ RefPtr<MediaControlPanelMuteButtonElement> panelMuteButton = MediaControlPanelMuteButtonElement::create(document, this);
+ m_panelMuteButton = panelMuteButton.get();
panel->appendChild(panelMuteButton.release(), ec, true);
if (ec)
- return 0;
+ return false;
RefPtr<MediaControlVolumeSliderElement> slider = MediaControlVolumeSliderElement::create(document);
- controls->m_volumeSlider = slider.get();
- controls->m_volumeSlider->setClearMutedOnUserInteraction(true);
+ m_volumeSlider = slider.get();
+ m_volumeSlider->setClearMutedOnUserInteraction(true);
panel->appendChild(slider.release(), ec, true);
if (ec)
- return 0;
+ return false;
- RefPtr<MediaControlFullscreenButtonElement> fullscreenButton = MediaControlFullscreenButtonElement::create(document, controls.get());
- controls->m_fullscreenButton = fullscreenButton.get();
+ RefPtr<MediaControlFullscreenButtonElement> fullscreenButton = MediaControlFullscreenButtonElement::create(document, this);
+ m_fullscreenButton = fullscreenButton.get();
panel->appendChild(fullscreenButton.release(), ec, true);
if (ec)
- return 0;
+ return false;
- controls->m_panel = panel.get();
+ m_panel = panel.get();
enclosure->appendChild(panel.release(), ec, true);
if (ec)
- return 0;
+ return false;
- controls->m_enclosure = enclosure.get();
- controls->appendChild(enclosure.release(), ec, true);
+ m_enclosure = enclosure.get();
+ appendChild(enclosure.release(), ec, true);
if (ec)
- return 0;
+ return false;
- return controls.release();
+ return true;
}
void MediaControlRootElementChromium::setMediaController(MediaControllerInterface* controller)
Modified: trunk/Source/WebCore/html/shadow/MediaControlRootElementChromium.h (123968 => 123969)
--- trunk/Source/WebCore/html/shadow/MediaControlRootElementChromium.h 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/html/shadow/MediaControlRootElementChromium.h 2012-07-28 19:23:50 UTC (rev 123969)
@@ -63,13 +63,19 @@
#endif
class MediaControlChromiumEnclosureElement : public MediaControlElement {
+protected:
+ explicit MediaControlChromiumEnclosureElement(Document*);
+
+private:
+ virtual MediaControlElementType displayType() const;
+};
+
+class MediaControlPanelEnclosureElement : public MediaControlChromiumEnclosureElement {
public:
- static PassRefPtr<MediaControlChromiumEnclosureElement> create(Document*);
+ static PassRefPtr<MediaControlPanelEnclosureElement> create(Document*);
private:
- explicit MediaControlChromiumEnclosureElement(Document*);
-
- virtual MediaControlElementType displayType() const;
+ explicit MediaControlPanelEnclosureElement(Document*);
virtual const AtomicString& shadowPseudoId() const;
};
@@ -78,7 +84,7 @@
static PassRefPtr<MediaControlRootElementChromium> create(Document*);
// MediaControls implementation.
- void setMediaController(MediaControllerInterface*);
+ virtual void setMediaController(MediaControllerInterface*);
void show();
void hide();
@@ -87,9 +93,9 @@
void reset();
- void playbackProgressed();
- void playbackStarted();
- void playbackStopped();
+ virtual void playbackProgressed();
+ virtual void playbackStarted();
+ virtual void playbackStopped();
void changedMute();
void changedVolume();
@@ -116,9 +122,13 @@
virtual bool shouldHideControls();
+protected:
+ explicit MediaControlRootElementChromium(Document*);
+
+ // Returns true if successful, otherwise return false.
+ bool initializeControls(Document*);
+
private:
- MediaControlRootElementChromium(Document*);
-
virtual void defaultEventHandler(Event*);
void hideFullscreenControlsTimerFired(Timer<MediaControlRootElementChromium>*);
void startHideFullscreenControlsTimer();
@@ -138,7 +148,8 @@
MediaControlVolumeSliderElement* m_volumeSlider;
MediaControlFullscreenButtonElement* m_fullscreenButton;
MediaControlPanelElement* m_panel;
- MediaControlChromiumEnclosureElement* m_enclosure;
+ MediaControlPanelEnclosureElement* m_enclosure;
+
#if ENABLE(VIDEO_TRACK)
MediaControlTextTrackContainerElement* m_textDisplayContainer;
#endif
Added: trunk/Source/WebCore/html/shadow/MediaControlRootElementChromiumAndroid.cpp (0 => 123969)
--- trunk/Source/WebCore/html/shadow/MediaControlRootElementChromiumAndroid.cpp (rev 0)
+++ trunk/Source/WebCore/html/shadow/MediaControlRootElementChromiumAndroid.cpp 2012-07-28 19:23:50 UTC (rev 123969)
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#if ENABLE(VIDEO)
+#include "MediaControlRootElementChromiumAndroid.h"
+
+#include "MediaControlElements.h"
+
+namespace WebCore {
+
+MediaControlOverlayEnclosureElement::MediaControlOverlayEnclosureElement(Document* document)
+ : MediaControlChromiumEnclosureElement(document)
+{
+}
+
+PassRefPtr<MediaControlOverlayEnclosureElement> MediaControlOverlayEnclosureElement::create(Document* document)
+{
+ return adoptRef(new MediaControlOverlayEnclosureElement(document));
+}
+
+const AtomicString& MediaControlOverlayEnclosureElement::shadowPseudoId() const
+{
+ DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-overlay-enclosure"));
+ return id;
+}
+
+MediaControlRootElementChromiumAndroid::MediaControlRootElementChromiumAndroid(Document* document)
+ : MediaControlRootElementChromium(document)
+ , m_overlayPlayButton(0)
+ , m_overlayEnclosure(0)
+{
+}
+
+PassRefPtr<MediaControls> MediaControls::create(Document* document)
+{
+ return MediaControlRootElementChromiumAndroid::create(document);
+}
+
+PassRefPtr<MediaControlRootElementChromiumAndroid> MediaControlRootElementChromiumAndroid::create(Document* document)
+{
+ if (!document->page())
+ return 0;
+
+ RefPtr<MediaControlRootElementChromiumAndroid> controls = adoptRef(new MediaControlRootElementChromiumAndroid(document));
+
+ ExceptionCode ec;
+
+ RefPtr<MediaControlOverlayEnclosureElement> overlayEnclosure = MediaControlOverlayEnclosureElement::create(document);
+ RefPtr<MediaControlOverlayPlayButtonElement> overlayPlayButton = MediaControlOverlayPlayButtonElement::create(document);
+ controls->m_overlayPlayButton = overlayPlayButton.get();
+ overlayEnclosure->appendChild(overlayPlayButton.release(), ec, true);
+ if (ec)
+ return 0;
+
+ controls->m_overlayEnclosure = overlayEnclosure.get();
+ controls->appendChild(overlayEnclosure.release(), ec, true);
+ if (ec)
+ return 0;
+
+ if (controls->initializeControls(document))
+ return controls.release();
+
+ return 0;
+}
+
+void MediaControlRootElementChromiumAndroid::setMediaController(MediaControllerInterface* controller)
+{
+ if (m_overlayPlayButton)
+ m_overlayPlayButton->setMediaController(controller);
+ if (m_overlayEnclosure)
+ m_overlayEnclosure->setMediaController(controller);
+ MediaControlRootElementChromium::setMediaController(controller);
+}
+
+void MediaControlRootElementChromiumAndroid::playbackStarted()
+{
+ m_overlayPlayButton->updateDisplayType();
+ MediaControlRootElementChromium::playbackStarted();
+}
+
+void MediaControlRootElementChromiumAndroid::playbackStopped()
+{
+ m_overlayPlayButton->updateDisplayType();
+ MediaControlRootElementChromium::playbackStopped();
+}
+
+}
+
+#endif
Added: trunk/Source/WebCore/html/shadow/MediaControlRootElementChromiumAndroid.h (0 => 123969)
--- trunk/Source/WebCore/html/shadow/MediaControlRootElementChromiumAndroid.h (rev 0)
+++ trunk/Source/WebCore/html/shadow/MediaControlRootElementChromiumAndroid.h 2012-07-28 19:23:50 UTC (rev 123969)
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef MediaControlRootElementChromiumAndroid_h
+#define MediaControlRootElementChromiumAndroid_h
+
+#if ENABLE(VIDEO)
+
+#include "MediaControlRootElementChromium.h"
+
+namespace WebCore {
+
+class MediaControlOverlayPlayButtonElement;
+
+class MediaControlOverlayEnclosureElement : public MediaControlChromiumEnclosureElement {
+public:
+ static PassRefPtr<MediaControlOverlayEnclosureElement> create(Document*);
+
+private:
+ explicit MediaControlOverlayEnclosureElement(Document*);
+ virtual const AtomicString& shadowPseudoId() const;
+};
+
+class MediaControlRootElementChromiumAndroid : public MediaControlRootElementChromium {
+public:
+ static PassRefPtr<MediaControlRootElementChromiumAndroid> create(Document*);
+
+ virtual void setMediaController(MediaControllerInterface*);
+ virtual void playbackStarted();
+ virtual void playbackStopped();
+
+private:
+ explicit MediaControlRootElementChromiumAndroid(Document*);
+
+ MediaControlOverlayPlayButtonElement* m_overlayPlayButton;
+ MediaControlOverlayEnclosureElement* m_overlayEnclosure;
+};
+
+}
+
+#endif
+
+#endif
Modified: trunk/Source/WebCore/platform/ThemeTypes.h (123968 => 123969)
--- trunk/Source/WebCore/platform/ThemeTypes.h 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/platform/ThemeTypes.h 2012-07-28 19:23:50 UTC (rev 123969)
@@ -48,8 +48,8 @@
enum ControlPart {
NoControlPart, CheckboxPart, RadioPart, PushButtonPart, SquareButtonPart, ButtonPart,
ButtonBevelPart, DefaultButtonPart, InnerSpinButtonPart, InputSpeechButtonPart, ListboxPart, ListItemPart,
- MediaEnterFullscreenButtonPart, MediaExitFullscreenButtonPart, MediaFullScreenVolumeSliderPart, MediaFullScreenVolumeSliderThumbPart, MediaMuteButtonPart, MediaPlayButtonPart, MediaSeekBackButtonPart,
- MediaSeekForwardButtonPart, MediaRewindButtonPart, MediaReturnToRealtimeButtonPart, MediaToggleClosedCaptionsButtonPart,
+ MediaEnterFullscreenButtonPart, MediaExitFullscreenButtonPart, MediaFullScreenVolumeSliderPart, MediaFullScreenVolumeSliderThumbPart, MediaMuteButtonPart, MediaPlayButtonPart,
+ MediaOverlayPlayButtonPart, MediaSeekBackButtonPart, MediaSeekForwardButtonPart, MediaRewindButtonPart, MediaReturnToRealtimeButtonPart, MediaToggleClosedCaptionsButtonPart,
MediaSliderPart, MediaSliderThumbPart, MediaVolumeSliderContainerPart, MediaVolumeSliderPart, MediaVolumeSliderThumbPart,
MediaVolumeSliderMuteButtonPart, MediaControlsBackgroundPart, MediaControlsFullscreenBackgroundPart, MediaCurrentTimePart, MediaTimeRemainingPart,
MenulistPart, MenulistButtonPart, MenulistTextPart, MenulistTextFieldPart, MeterPart, ProgressBarPart, ProgressBarValuePart,
Modified: trunk/Source/WebCore/rendering/RenderMediaControlsChromium.cpp (123968 => 123969)
--- trunk/Source/WebCore/rendering/RenderMediaControlsChromium.cpp 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/rendering/RenderMediaControlsChromium.cpp 2012-07-28 19:23:50 UTC (rev 123969)
@@ -111,6 +111,19 @@
return paintMediaButton(paintInfo.context, rect, mediaElement->canPlay() ? mediaPlay : mediaPause);
}
+static bool paintMediaOverlayPlayButton(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
+{
+ HTMLMediaElement* mediaElement = toParentMediaElement(object);
+ if (!mediaElement)
+ return false;
+
+ if (!hasSource(mediaElement) || !mediaElement->canPlay())
+ return false;
+
+ static Image* mediaOverlayPlay = platformResource("mediaplayerOverlayPlay");
+ return paintMediaButton(paintInfo.context, rect, mediaOverlayPlay);
+}
+
static Image* getMediaSliderThumb()
{
static Image* mediaSliderThumb = platformResource("mediaplayerSliderThumb");
@@ -334,6 +347,8 @@
case MediaEnterFullscreenButton:
case MediaExitFullscreenButton:
return paintMediaFullscreenButton(object, paintInfo, rect);
+ case MediaOverlayPlayButton:
+ return paintMediaOverlayPlayButton(object, paintInfo, rect);
case MediaVolumeSliderMuteButton:
case MediaSeekBackButton:
case MediaSeekForwardButton:
Modified: trunk/Source/WebCore/rendering/RenderTheme.cpp (123968 => 123969)
--- trunk/Source/WebCore/rendering/RenderTheme.cpp 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/rendering/RenderTheme.cpp 2012-07-28 19:23:50 UTC (rev 123969)
@@ -329,6 +329,8 @@
return paintMediaFullscreenButton(o, paintInfo, r);
case MediaPlayButtonPart:
return paintMediaPlayButton(o, paintInfo, r);
+ case MediaOverlayPlayButtonPart:
+ return paintMediaOverlayPlayButton(o, paintInfo, r);
case MediaMuteButtonPart:
return paintMediaMuteButton(o, paintInfo, r);
case MediaSeekBackButtonPart:
Modified: trunk/Source/WebCore/rendering/RenderTheme.h (123968 => 123969)
--- trunk/Source/WebCore/rendering/RenderTheme.h 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/rendering/RenderTheme.h 2012-07-28 19:23:50 UTC (rev 123969)
@@ -318,6 +318,7 @@
virtual void adjustMediaControlStyle(StyleResolver*, RenderStyle*, Element*) const;
virtual bool paintMediaFullscreenButton(RenderObject*, const PaintInfo&, const IntRect&) { return true; }
virtual bool paintMediaPlayButton(RenderObject*, const PaintInfo&, const IntRect&) { return true; }
+ virtual bool paintMediaOverlayPlayButton(RenderObject*, const PaintInfo&, const IntRect&) { return true; }
virtual bool paintMediaMuteButton(RenderObject*, const PaintInfo&, const IntRect&) { return true; }
virtual bool paintMediaSeekBackButton(RenderObject*, const PaintInfo&, const IntRect&) { return true; }
virtual bool paintMediaSeekForwardButton(RenderObject*, const PaintInfo&, const IntRect&) { return true; }
Modified: trunk/Source/WebCore/rendering/RenderThemeChromiumAndroid.cpp (123968 => 123969)
--- trunk/Source/WebCore/rendering/RenderThemeChromiumAndroid.cpp 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/rendering/RenderThemeChromiumAndroid.cpp 2012-07-28 19:23:50 UTC (rev 123969)
@@ -88,6 +88,18 @@
}
}
+bool RenderThemeChromiumAndroid::paintMediaOverlayPlayButton(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
+{
+#if ENABLE(VIDEO)
+ return RenderMediaControlsChromium::paintMediaControlsPart(MediaOverlayPlayButton, object, paintInfo, rect);
+#else
+ UNUSED_PARAM(object);
+ UNUSED_PARAM(paintInfo);
+ UNUSED_PARAM(rect);
+ return false;
+#endif
+}
+
int RenderThemeChromiumAndroid::menuListArrowPadding() const
{
// We cannot use the scrollbar thickness here, as it's width is 0 on Android.
Modified: trunk/Source/WebCore/rendering/RenderThemeChromiumAndroid.h (123968 => 123969)
--- trunk/Source/WebCore/rendering/RenderThemeChromiumAndroid.h 2012-07-28 19:22:46 UTC (rev 123968)
+++ trunk/Source/WebCore/rendering/RenderThemeChromiumAndroid.h 2012-07-28 19:23:50 UTC (rev 123969)
@@ -41,6 +41,8 @@
virtual bool delegatesMenuListRendering() const OVERRIDE { return true; }
+ virtual bool paintMediaOverlayPlayButton(RenderObject*, const PaintInfo&, const IntRect&) OVERRIDE;
+
#if ENABLE(VIDEO)
virtual String extraMediaControlsStyleSheet() OVERRIDE;
#endif