| /* |
| * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. |
| * 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. |
| * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of |
| * its contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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 MediaControlElements_h |
| #define MediaControlElements_h |
| |
| #include "core/html/shadow/MediaControlElementTypes.h" |
| #include "public/platform/WebLocalizedString.h" |
| |
| namespace blink { |
| |
| class TextTrack; |
| |
| // ---------------------------- |
| |
| class MediaControlPanelElement final : public MediaControlDivElement { |
| public: |
| static MediaControlPanelElement* create(MediaControls&); |
| |
| void setIsDisplayed(bool); |
| |
| void makeOpaque(); |
| void makeTransparent(); |
| |
| private: |
| explicit MediaControlPanelElement(MediaControls&); |
| |
| void defaultEventHandler(Event*) override; |
| bool keepEventInNode(Event*) override; |
| |
| void startTimer(); |
| void stopTimer(); |
| void transitionTimerFired(TimerBase*); |
| void didBecomeVisible(); |
| |
| bool m_isDisplayed; |
| bool m_opaque; |
| |
| Timer<MediaControlPanelElement> m_transitionTimer; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlPanelEnclosureElement final : public MediaControlDivElement { |
| public: |
| static MediaControlPanelEnclosureElement* create(MediaControls&); |
| |
| private: |
| explicit MediaControlPanelEnclosureElement(MediaControls&); |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlOverlayEnclosureElement final |
| : public MediaControlDivElement { |
| public: |
| static MediaControlOverlayEnclosureElement* create(MediaControls&); |
| |
| private: |
| explicit MediaControlOverlayEnclosureElement(MediaControls&); |
| EventDispatchHandlingState* preDispatchEventHandler(Event*) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlMuteButtonElement final : public MediaControlInputElement { |
| public: |
| static MediaControlMuteButtonElement* create(MediaControls&); |
| |
| bool willRespondToMouseClickEvents() override { return true; } |
| void updateDisplayType() override; |
| |
| WebLocalizedString::Name getOverflowStringName() override; |
| |
| bool hasOverflowButton() override { return true; } |
| |
| private: |
| explicit MediaControlMuteButtonElement(MediaControls&); |
| |
| void defaultEventHandler(Event*) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlPlayButtonElement final : public MediaControlInputElement { |
| public: |
| static MediaControlPlayButtonElement* create(MediaControls&); |
| |
| bool willRespondToMouseClickEvents() override { return true; } |
| void updateDisplayType() override; |
| |
| WebLocalizedString::Name getOverflowStringName() override; |
| |
| bool hasOverflowButton() override { return true; } |
| |
| private: |
| explicit MediaControlPlayButtonElement(MediaControls&); |
| |
| void defaultEventHandler(Event*) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlOverlayPlayButtonElement final |
| : public MediaControlInputElement { |
| public: |
| static MediaControlOverlayPlayButtonElement* create(MediaControls&); |
| |
| void updateDisplayType() override; |
| |
| private: |
| explicit MediaControlOverlayPlayButtonElement(MediaControls&); |
| |
| void defaultEventHandler(Event*) override; |
| bool keepEventInNode(Event*) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlToggleClosedCaptionsButtonElement final |
| : public MediaControlInputElement { |
| public: |
| static MediaControlToggleClosedCaptionsButtonElement* create(MediaControls&); |
| |
| bool willRespondToMouseClickEvents() override { return true; } |
| |
| void updateDisplayType() override; |
| |
| WebLocalizedString::Name getOverflowStringName() override; |
| |
| bool hasOverflowButton() override { return true; } |
| |
| private: |
| explicit MediaControlToggleClosedCaptionsButtonElement(MediaControls&); |
| |
| void defaultEventHandler(Event*) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlTextTrackListElement final : public MediaControlDivElement { |
| public: |
| static MediaControlTextTrackListElement* create(MediaControls&); |
| |
| bool willRespondToMouseClickEvents() override { return true; } |
| |
| void setVisible(bool); |
| |
| private: |
| explicit MediaControlTextTrackListElement(MediaControls&); |
| |
| void defaultEventHandler(Event*) override; |
| |
| void refreshTextTrackListMenu(); |
| |
| // Returns the label for the track when a valid track is passed in and "Off" |
| // when the parameter is null. |
| String getTextTrackLabel(TextTrack*); |
| // Creates the track element in the list when a valid track is passed in and |
| // the "Off" item when the parameter is null. |
| Element* createTextTrackListItem(TextTrack*); |
| |
| void showTextTrackAtIndex(unsigned); |
| void disableShowingTextTracks(); |
| }; |
| |
| // ---------------------------- |
| // Represents the overflow menu which is displayed when the width of the media |
| // player is small enough that at least two buttons are no longer visible. |
| class MediaControlOverflowMenuButtonElement final |
| : public MediaControlInputElement { |
| public: |
| static MediaControlOverflowMenuButtonElement* create(MediaControls&); |
| |
| // The overflow button should respond to mouse clicks since we want a click |
| // to open up the menu. |
| bool willRespondToMouseClickEvents() override { return true; } |
| |
| private: |
| explicit MediaControlOverflowMenuButtonElement(MediaControls&); |
| |
| void defaultEventHandler(Event*) override; |
| }; |
| |
| // ---------------------------- |
| // Holds a list of elements within the overflow menu. |
| class MediaControlOverflowMenuListElement final |
| : public MediaControlDivElement { |
| public: |
| static MediaControlOverflowMenuListElement* create(MediaControls&); |
| |
| private: |
| explicit MediaControlOverflowMenuListElement(MediaControls&); |
| |
| void defaultEventHandler(Event*) override; |
| }; |
| |
| // ---------------------------- |
| // Represents a button that allows users to download media if the file is |
| // downloadable. |
| class MediaControlDownloadButtonElement final |
| : public MediaControlInputElement { |
| public: |
| static MediaControlDownloadButtonElement* create(MediaControls&); |
| |
| WebLocalizedString::Name getOverflowStringName() override; |
| |
| bool hasOverflowButton() override { return true; } |
| |
| // Returns true if the download button should be shown. We should |
| // show the button for only non-MSE, non-EME, and non-MediaStream content. |
| bool shouldDisplayDownloadButton(); |
| |
| DECLARE_VIRTUAL_TRACE(); |
| |
| private: |
| explicit MediaControlDownloadButtonElement(MediaControls&); |
| |
| void defaultEventHandler(Event*) override; |
| |
| // Points to an anchor element that contains the URL of the media file. |
| Member<HTMLAnchorElement> m_anchor; |
| }; |
| |
| class MediaControlTimelineElement final : public MediaControlInputElement { |
| public: |
| static MediaControlTimelineElement* create(MediaControls&); |
| |
| bool willRespondToMouseClickEvents() override; |
| |
| // FIXME: An "earliest possible position" will be needed once that concept |
| // is supported by HTMLMediaElement, see https://crbug.com/137275 |
| void setPosition(double); |
| void setDuration(double); |
| |
| private: |
| explicit MediaControlTimelineElement(MediaControls&); |
| |
| void defaultEventHandler(Event*) override; |
| bool keepEventInNode(Event*) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlFullscreenButtonElement final |
| : public MediaControlInputElement { |
| public: |
| static MediaControlFullscreenButtonElement* create(MediaControls&); |
| |
| bool willRespondToMouseClickEvents() override { return true; } |
| |
| void setIsFullscreen(bool); |
| |
| WebLocalizedString::Name getOverflowStringName() override; |
| |
| bool hasOverflowButton() override { return true; } |
| |
| private: |
| explicit MediaControlFullscreenButtonElement(MediaControls&); |
| |
| void defaultEventHandler(Event*) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlCastButtonElement final : public MediaControlInputElement { |
| public: |
| static MediaControlCastButtonElement* create(MediaControls&, |
| bool isOverlayButton); |
| |
| bool willRespondToMouseClickEvents() override { return true; } |
| |
| void setIsPlayingRemotely(bool); |
| |
| WebLocalizedString::Name getOverflowStringName() override; |
| |
| bool hasOverflowButton() override { return true; } |
| |
| // This will show a cast button if it is not covered by another element. |
| // This MUST be called for cast button elements that are overlay elements. |
| void tryShowOverlay(); |
| |
| private: |
| explicit MediaControlCastButtonElement(MediaControls&, bool isOverlayButton); |
| |
| const AtomicString& shadowPseudoId() const override; |
| void defaultEventHandler(Event*) override; |
| bool keepEventInNode(Event*) override; |
| |
| bool m_isOverlayButton; |
| |
| // This is used for UMA histogram (Cast.Sender.Overlay). New values should |
| // be appended only and must be added before |Count|. |
| enum class CastOverlayMetrics { |
| Created = 0, |
| Shown, |
| Clicked, |
| Count // Keep last. |
| }; |
| void recordMetrics(CastOverlayMetrics); |
| |
| // UMA related boolean. They are used to prevent counting something twice |
| // for the same media element. |
| bool m_clickUseCounted = false; |
| bool m_showUseCounted = false; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlVolumeSliderElement final : public MediaControlInputElement { |
| public: |
| static MediaControlVolumeSliderElement* create(MediaControls&); |
| |
| bool willRespondToMouseMoveEvents() override; |
| bool willRespondToMouseClickEvents() override; |
| void setVolume(double); |
| |
| private: |
| explicit MediaControlVolumeSliderElement(MediaControls&); |
| |
| void defaultEventHandler(Event*) override; |
| bool keepEventInNode(Event*) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlTimeRemainingDisplayElement final |
| : public MediaControlTimeDisplayElement { |
| public: |
| static MediaControlTimeRemainingDisplayElement* create(MediaControls&); |
| |
| private: |
| explicit MediaControlTimeRemainingDisplayElement(MediaControls&); |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlCurrentTimeDisplayElement final |
| : public MediaControlTimeDisplayElement { |
| public: |
| static MediaControlCurrentTimeDisplayElement* create(MediaControls&); |
| |
| private: |
| explicit MediaControlCurrentTimeDisplayElement(MediaControls&); |
| }; |
| |
| } // namespace blink |
| |
| #endif // MediaControlElements_h |