| /* |
| * Copyright (C) 2008-2019 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 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. |
| */ |
| |
| #pragma once |
| |
| #if ENABLE(VIDEO) |
| |
| #include "GenericTaskQueue.h" |
| #include "MediaControlElementTypes.h" |
| #include "TextTrackRepresentation.h" |
| #include <wtf/LoggerHelper.h> |
| |
| namespace WebCore { |
| |
| // ---------------------------- |
| |
| class MediaControlPanelElement final : public MediaControlDivElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlPanelElement); |
| public: |
| static Ref<MediaControlPanelElement> create(Document&); |
| |
| void setCanBeDragged(bool); |
| void setIsDisplayed(bool); |
| |
| void resetPosition(); |
| void makeOpaque(); |
| void makeTransparent(); |
| |
| #if !PLATFORM(IOS_FAMILY) |
| bool willRespondToMouseMoveEvents() override { return true; } |
| bool willRespondToMouseClickEvents() override { return true; } |
| #endif |
| |
| private: |
| explicit MediaControlPanelElement(Document&); |
| |
| void defaultEventHandler(Event&) override; |
| |
| void startDrag(const LayoutPoint& eventLocation); |
| void continueDrag(const LayoutPoint& eventLocation); |
| void endDrag(); |
| |
| void startTimer(); |
| void stopTimer(); |
| void transitionTimerFired(); |
| |
| void setPosition(const LayoutPoint&); |
| |
| bool m_canBeDragged; |
| bool m_isBeingDragged; |
| bool m_isDisplayed; |
| bool m_opaque; |
| LayoutPoint m_lastDragEventLocation; |
| LayoutPoint m_cumulativeDragOffset; |
| |
| Timer m_transitionTimer; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlPanelEnclosureElement final : public MediaControlDivElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlPanelEnclosureElement); |
| public: |
| static Ref<MediaControlPanelEnclosureElement> create(Document&); |
| |
| private: |
| explicit MediaControlPanelEnclosureElement(Document&); |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlOverlayEnclosureElement final : public MediaControlDivElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlOverlayEnclosureElement); |
| public: |
| static Ref<MediaControlOverlayEnclosureElement> create(Document&); |
| |
| private: |
| explicit MediaControlOverlayEnclosureElement(Document&); |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlTimelineContainerElement final : public MediaControlDivElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlTimelineContainerElement); |
| public: |
| static Ref<MediaControlTimelineContainerElement> create(Document&); |
| |
| void setTimeDisplaysHidden(bool); |
| |
| private: |
| explicit MediaControlTimelineContainerElement(Document&); |
| |
| RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlVolumeSliderContainerElement final : public MediaControlDivElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlVolumeSliderContainerElement); |
| public: |
| static Ref<MediaControlVolumeSliderContainerElement> create(Document&); |
| |
| #if !PLATFORM(IOS_FAMILY) |
| bool willRespondToMouseMoveEvents() override { return true; } |
| #endif |
| |
| private: |
| explicit MediaControlVolumeSliderContainerElement(Document&); |
| |
| void defaultEventHandler(Event&) override; |
| |
| RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlStatusDisplayElement final : public MediaControlDivElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlStatusDisplayElement); |
| public: |
| static Ref<MediaControlStatusDisplayElement> create(Document&); |
| |
| void update(); |
| |
| private: |
| explicit MediaControlStatusDisplayElement(Document&); |
| |
| enum StateBeingDisplayed { Nothing, Loading, LiveBroadcast }; |
| StateBeingDisplayed m_stateBeingDisplayed; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlPanelMuteButtonElement final : public MediaControlMuteButtonElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlPanelMuteButtonElement); |
| public: |
| static Ref<MediaControlPanelMuteButtonElement> create(Document&, MediaControls*); |
| |
| #if !PLATFORM(IOS_FAMILY) |
| bool willRespondToMouseMoveEvents() override { return true; } |
| #endif |
| |
| private: |
| explicit MediaControlPanelMuteButtonElement(Document&, MediaControls*); |
| |
| void defaultEventHandler(Event&) override; |
| |
| MediaControls* m_controls; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlVolumeSliderMuteButtonElement final : public MediaControlMuteButtonElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlVolumeSliderMuteButtonElement); |
| public: |
| static Ref<MediaControlVolumeSliderMuteButtonElement> create(Document&); |
| |
| private: |
| explicit MediaControlVolumeSliderMuteButtonElement(Document&); |
| }; |
| |
| |
| // ---------------------------- |
| |
| class MediaControlPlayButtonElement final : public MediaControlInputElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlPlayButtonElement); |
| public: |
| static Ref<MediaControlPlayButtonElement> create(Document&); |
| |
| #if !PLATFORM(IOS_FAMILY) |
| bool willRespondToMouseClickEvents() override { return true; } |
| #endif |
| |
| void updateDisplayType() override; |
| |
| private: |
| explicit MediaControlPlayButtonElement(Document&); |
| |
| void defaultEventHandler(Event&) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlOverlayPlayButtonElement final : public MediaControlInputElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlOverlayPlayButtonElement); |
| public: |
| static Ref<MediaControlOverlayPlayButtonElement> create(Document&); |
| |
| void updateDisplayType() override; |
| |
| private: |
| explicit MediaControlOverlayPlayButtonElement(Document&); |
| |
| void defaultEventHandler(Event&) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlSeekForwardButtonElement final : public MediaControlSeekButtonElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlSeekForwardButtonElement); |
| public: |
| static Ref<MediaControlSeekForwardButtonElement> create(Document&); |
| |
| private: |
| explicit MediaControlSeekForwardButtonElement(Document&); |
| |
| bool isForwardButton() const override { return true; } |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlSeekBackButtonElement final : public MediaControlSeekButtonElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlSeekBackButtonElement); |
| public: |
| static Ref<MediaControlSeekBackButtonElement> create(Document&); |
| |
| private: |
| explicit MediaControlSeekBackButtonElement(Document&); |
| |
| bool isForwardButton() const override { return false; } |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlRewindButtonElement final : public MediaControlInputElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlRewindButtonElement); |
| public: |
| static Ref<MediaControlRewindButtonElement> create(Document&); |
| |
| #if !PLATFORM(IOS_FAMILY) |
| bool willRespondToMouseClickEvents() override { return true; } |
| #endif |
| |
| private: |
| explicit MediaControlRewindButtonElement(Document&); |
| |
| void defaultEventHandler(Event&) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlReturnToRealtimeButtonElement final : public MediaControlInputElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlReturnToRealtimeButtonElement); |
| public: |
| static Ref<MediaControlReturnToRealtimeButtonElement> create(Document&); |
| |
| #if !PLATFORM(IOS_FAMILY) |
| bool willRespondToMouseClickEvents() override { return true; } |
| #endif |
| |
| private: |
| explicit MediaControlReturnToRealtimeButtonElement(Document&); |
| |
| void defaultEventHandler(Event&) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlToggleClosedCaptionsButtonElement final : public MediaControlInputElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlToggleClosedCaptionsButtonElement); |
| public: |
| static Ref<MediaControlToggleClosedCaptionsButtonElement> create(Document&, MediaControls*); |
| |
| #if !PLATFORM(IOS_FAMILY) |
| bool willRespondToMouseClickEvents() override { return true; } |
| #endif |
| |
| void updateDisplayType() override; |
| |
| private: |
| explicit MediaControlToggleClosedCaptionsButtonElement(Document&, MediaControls*); |
| |
| void defaultEventHandler(Event&) override; |
| |
| #if PLATFORM(COCOA) || PLATFORM(WIN) || PLATFORM(GTK) |
| MediaControls* m_controls; |
| #endif |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlClosedCaptionsContainerElement final : public MediaControlDivElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlClosedCaptionsContainerElement); |
| public: |
| static Ref<MediaControlClosedCaptionsContainerElement> create(Document&); |
| |
| #if !PLATFORM(IOS_FAMILY) |
| bool willRespondToMouseClickEvents() override { return true; } |
| #endif |
| |
| private: |
| MediaControlClosedCaptionsContainerElement(Document&); |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlClosedCaptionsTrackListElement final : public MediaControlDivElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlClosedCaptionsTrackListElement); |
| public: |
| static Ref<MediaControlClosedCaptionsTrackListElement> create(Document&, MediaControls*); |
| |
| #if !PLATFORM(IOS_FAMILY) |
| bool willRespondToMouseClickEvents() override { return true; } |
| #endif |
| |
| void updateDisplay(); |
| |
| private: |
| MediaControlClosedCaptionsTrackListElement(Document&, MediaControls*); |
| |
| void rebuildTrackListMenu(); |
| |
| void defaultEventHandler(Event&) override; |
| |
| typedef Vector<RefPtr<Element>> TrackMenuItems; |
| TrackMenuItems m_menuItems; |
| #if ENABLE(VIDEO_TRACK) |
| typedef HashMap<RefPtr<Element>, RefPtr<TextTrack>> MenuItemToTrackMap; |
| MenuItemToTrackMap m_menuToTrackMap; |
| #endif |
| MediaControls* m_controls; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlTimelineElement final : public MediaControlInputElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlTimelineElement); |
| public: |
| static Ref<MediaControlTimelineElement> create(Document&, MediaControls*); |
| |
| #if !PLATFORM(IOS_FAMILY) |
| bool willRespondToMouseClickEvents() override; |
| #endif |
| |
| void setPosition(double); |
| void setDuration(double); |
| |
| private: |
| explicit MediaControlTimelineElement(Document&, MediaControls*); |
| |
| void defaultEventHandler(Event&) override; |
| |
| MediaControls* m_controls; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlFullscreenButtonElement final : public MediaControlInputElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlFullscreenButtonElement); |
| public: |
| static Ref<MediaControlFullscreenButtonElement> create(Document&); |
| |
| #if !PLATFORM(IOS_FAMILY) |
| bool willRespondToMouseClickEvents() override { return true; } |
| #endif |
| |
| void setIsFullscreen(bool); |
| |
| private: |
| explicit MediaControlFullscreenButtonElement(Document&); |
| |
| void defaultEventHandler(Event&) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlPanelVolumeSliderElement final : public MediaControlVolumeSliderElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlPanelVolumeSliderElement); |
| public: |
| static Ref<MediaControlPanelVolumeSliderElement> create(Document&); |
| |
| private: |
| explicit MediaControlPanelVolumeSliderElement(Document&); |
| }; |
| // ---------------------------- |
| |
| class MediaControlFullscreenVolumeSliderElement final : public MediaControlVolumeSliderElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlFullscreenVolumeSliderElement); |
| public: |
| static Ref<MediaControlFullscreenVolumeSliderElement> create(Document&); |
| |
| private: |
| explicit MediaControlFullscreenVolumeSliderElement(Document&); |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlFullscreenVolumeMinButtonElement final : public MediaControlInputElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlFullscreenVolumeMinButtonElement); |
| public: |
| static Ref<MediaControlFullscreenVolumeMinButtonElement> create(Document&); |
| |
| #if !PLATFORM(IOS_FAMILY) |
| bool willRespondToMouseClickEvents() override { return true; } |
| #endif |
| |
| private: |
| explicit MediaControlFullscreenVolumeMinButtonElement(Document&); |
| void defaultEventHandler(Event&) override; |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlFullscreenVolumeMaxButtonElement final : public MediaControlInputElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlFullscreenVolumeMaxButtonElement); |
| public: |
| static Ref<MediaControlFullscreenVolumeMaxButtonElement> create(Document&); |
| |
| #if !PLATFORM(IOS_FAMILY) |
| bool willRespondToMouseClickEvents() override { return true; } |
| #endif |
| |
| private: |
| explicit MediaControlFullscreenVolumeMaxButtonElement(Document&); |
| |
| void defaultEventHandler(Event&) override; |
| }; |
| |
| |
| // ---------------------------- |
| |
| class MediaControlTimeRemainingDisplayElement final : public MediaControlTimeDisplayElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlTimeRemainingDisplayElement); |
| public: |
| static Ref<MediaControlTimeRemainingDisplayElement> create(Document&); |
| |
| private: |
| explicit MediaControlTimeRemainingDisplayElement(Document&); |
| }; |
| |
| // ---------------------------- |
| |
| class MediaControlCurrentTimeDisplayElement final : public MediaControlTimeDisplayElement { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlCurrentTimeDisplayElement); |
| public: |
| static Ref<MediaControlCurrentTimeDisplayElement> create(Document&); |
| |
| private: |
| explicit MediaControlCurrentTimeDisplayElement(Document&); |
| }; |
| |
| // ---------------------------- |
| |
| #if ENABLE(VIDEO_TRACK) |
| |
| class VTTCue; |
| |
| class MediaControlTextTrackContainerElement final |
| : public MediaControlDivElement |
| , public TextTrackRepresentationClient |
| #if !RELEASE_LOG_DISABLED |
| , private LoggerHelper |
| #endif |
| { |
| WTF_MAKE_ISO_ALLOCATED(MediaControlTextTrackContainerElement); |
| public: |
| static Ref<MediaControlTextTrackContainerElement> create(Document&); |
| |
| enum class ForceUpdate { Yes, No }; |
| void updateSizes(ForceUpdate force = ForceUpdate::No); |
| void updateDisplay(); |
| |
| void updateTextTrackRepresentationImageIfNeeded(); |
| |
| void enteredFullscreen(); |
| void exitedFullscreen(); |
| |
| private: |
| explicit MediaControlTextTrackContainerElement(Document&); |
| |
| // Element |
| RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override; |
| |
| // TextTrackRepresentationClient |
| RefPtr<Image> createTextTrackRepresentationImage() override; |
| void textTrackRepresentationBoundsChanged(const IntRect&) override; |
| |
| void updateTextTrackRepresentationIfNeeded(); |
| void clearTextTrackRepresentation(); |
| |
| bool updateVideoDisplaySize(); |
| void updateActiveCuesFontSize(); |
| void updateTextStrokeStyle(); |
| void processActiveVTTCue(VTTCue&); |
| void updateTextTrackStyle(); |
| |
| #if !RELEASE_LOG_DISABLED |
| const Logger& logger() const final; |
| const void* logIdentifier() const final; |
| WTFLogChannel& logChannel() const final; |
| const char* logClassName() const final { return "MediaControlTextTrackContainerElement"; } |
| mutable RefPtr<Logger> m_logger; |
| mutable const void* m_logIdentifier { nullptr }; |
| #endif |
| |
| std::unique_ptr<TextTrackRepresentation> m_textTrackRepresentation; |
| |
| GenericTaskQueue<Timer> m_taskQueue; |
| IntRect m_videoDisplaySize; |
| int m_fontSize { 0 }; |
| bool m_fontSizeIsImportant { false }; |
| bool m_needsGenerateTextTrackRepresentation { false }; |
| }; |
| |
| #endif |
| |
| } // namespace WebCore |
| |
| #endif // ENABLE(VIDEO) |