blob: 76b14d6f52be6a0e7381917293d53779bcf91d92 [file] [log] [blame]
/*
* 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)