Title: [123969] trunk/Source/WebCore
Revision
123969
Author
commit-qu...@webkit.org
Date
2012-07-28 12:23:50 -0700 (Sat, 28 Jul 2012)

Log Message

Add an overlay play button to media controls on android
https://bugs.webkit.org/show_bug.cgi?id=92132

Patch by Min Qin <qin...@chromium.org> on 2012-07-28
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:

Modified Paths

Added Paths

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
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to