MediaControlElements.cpp [plain text]
#include "config.h"
#if ENABLE(VIDEO)
#include "MediaControlElements.h"
#include "Event.h"
#include "EventNames.h"
#include "EventHandler.h"
#include "FloatConversion.h"
#include "Frame.h"
#include "HTMLNames.h"
#include "RenderSlider.h"
namespace WebCore {
using namespace EventNames;
using namespace HTMLNames;
static const float cSeekRepeatDelay = 0.1f;
static const float cStepTime = 0.07f;
static const float cSeekTime = 0.2f;
MediaControlShadowRootElement::MediaControlShadowRootElement(Document* doc, HTMLMediaElement* mediaElement)
: HTMLDivElement(doc)
, m_mediaElement(mediaElement)
{
RenderStyle* rootStyle = new (mediaElement->renderer()->renderArena()) RenderStyle();
rootStyle->inheritFrom(mediaElement->renderer()->style());
rootStyle->setDisplay(BLOCK);
rootStyle->setPosition(RelativePosition);
RenderMediaControlShadowRoot* renderer = new (mediaElement->renderer()->renderArena()) RenderMediaControlShadowRoot(this);
renderer->setParent(mediaElement->renderer());
renderer->setStyle(rootStyle);
setRenderer(renderer);
setAttached();
setInDocument(true);
}
MediaControlInputElement::MediaControlInputElement(Document* doc, RenderStyle::PseudoId pseudo, String type, HTMLMediaElement* mediaElement)
: HTMLInputElement(doc)
, m_mediaElement(mediaElement)
{
setInputType(type);
RenderStyle* style = m_mediaElement->renderer()->getPseudoStyle(pseudo);
RenderObject* renderer = createRenderer(m_mediaElement->renderer()->renderArena(), style);
if (renderer) {
setRenderer(renderer);
renderer->setStyle(style);
}
setAttached();
setInDocument(true);
}
void MediaControlInputElement::attachToParent(Element* parent)
{
parent->addChild(this);
parent->renderer()->addChild(renderer());
}
void MediaControlInputElement::update()
{
if (renderer())
renderer()->updateFromElement();
}
MediaControlMuteButtonElement::MediaControlMuteButtonElement(Document* doc, HTMLMediaElement* element)
: MediaControlInputElement(doc, RenderStyle::MEDIA_CONTROLS_MUTE_BUTTON, "button", element)
{
}
void MediaControlMuteButtonElement::defaultEventHandler(Event* event)
{
if (event->type() == clickEvent) {
m_mediaElement->setMuted(!m_mediaElement->muted());
event->defaultHandled();
}
HTMLInputElement::defaultEventHandler(event);
}
MediaControlPlayButtonElement::MediaControlPlayButtonElement(Document* doc, HTMLMediaElement* element)
: MediaControlInputElement(doc, RenderStyle::MEDIA_CONTROLS_PLAY_BUTTON, "button", element)
{
}
void MediaControlPlayButtonElement::defaultEventHandler(Event* event)
{
if (event->type() == clickEvent) {
ExceptionCode ec;
if (m_mediaElement->canPlay())
m_mediaElement->play(ec);
else
m_mediaElement->pause(ec);
event->defaultHandled();
}
HTMLInputElement::defaultEventHandler(event);
}
MediaControlSeekButtonElement::MediaControlSeekButtonElement(Document* doc, HTMLMediaElement* element, bool forward)
: MediaControlInputElement(doc, forward ? RenderStyle::MEDIA_CONTROLS_SEEK_FORWARD_BUTTON : RenderStyle::MEDIA_CONTROLS_SEEK_BACK_BUTTON, "button", element)
, m_forward(forward)
, m_seeking(false)
, m_capturing(false)
, m_seekTimer(this, &MediaControlSeekButtonElement::seekTimerFired)
{
}
void MediaControlSeekButtonElement::defaultEventHandler(Event* event)
{
if (event->type() == mousedownEvent) {
if (Frame* frame = document()->frame()) {
m_capturing = true;
frame->eventHandler()->setCapturingMouseEventsNode(this);
}
ExceptionCode ec;
m_mediaElement->pause(ec);
m_seekTimer.startRepeating(cSeekRepeatDelay);
event->defaultHandled();
} else if (event->type() == mouseupEvent) {
if (m_capturing)
if (Frame* frame = document()->frame()) {
m_capturing = false;
frame->eventHandler()->setCapturingMouseEventsNode(0);
}
ExceptionCode ec;
if (m_seeking || m_seekTimer.isActive()) {
if (!m_seeking) {
float stepTime = m_forward ? cStepTime : -cStepTime;
m_mediaElement->setCurrentTime(m_mediaElement->currentTime() + stepTime, ec);
}
m_seekTimer.stop();
m_seeking = false;
event->defaultHandled();
}
}
HTMLInputElement::defaultEventHandler(event);
}
void MediaControlSeekButtonElement::seekTimerFired(Timer<MediaControlSeekButtonElement>*)
{
ExceptionCode ec;
m_seeking = true;
float seekTime = m_forward ? cSeekTime : -cSeekTime;
m_mediaElement->setCurrentTime(m_mediaElement->currentTime() + seekTime, ec);
}
MediaControlTimelineElement::MediaControlTimelineElement(Document* doc, HTMLMediaElement* element)
: MediaControlInputElement(doc, RenderStyle::MEDIA_CONTROLS_TIMELINE, "range", element)
{
setAttribute(precisionAttr, "float");
}
void MediaControlTimelineElement::defaultEventHandler(Event* event)
{
RenderSlider* slider = static_cast<RenderSlider*>(renderer());
bool oldInDragMode = slider && slider->inDragMode();
float oldTime = narrowPrecisionToFloat(value().toDouble());
bool oldEnded = m_mediaElement->ended();
HTMLInputElement::defaultEventHandler(event);
float time = narrowPrecisionToFloat(value().toDouble());
if (oldTime != time || event->type() == inputEvent) {
ExceptionCode ec;
m_mediaElement->setCurrentTime(time, ec);
}
if (oldEnded && !m_mediaElement->ended() && !m_mediaElement->paused()) {
ExceptionCode ec;
m_mediaElement->pause(ec);
}
bool inDragMode = slider && slider->inDragMode();
if (inDragMode != oldInDragMode)
m_mediaElement->setPausedInternal(inDragMode);
}
void MediaControlTimelineElement::update(bool updateDuration)
{
if (updateDuration) {
float dur = m_mediaElement->duration();
setAttribute(maxAttr, String::number(isfinite(dur) ? dur : 0));
}
setValue(String::number(m_mediaElement->currentTime()));
}
MediaControlFullscreenButtonElement::MediaControlFullscreenButtonElement(Document* doc, HTMLMediaElement* element)
: MediaControlInputElement(doc, RenderStyle::MEDIA_CONTROLS_FULLSCREEN_BUTTON, "button", element)
{
}
void MediaControlFullscreenButtonElement::defaultEventHandler(Event* event)
{
if (event->type() == clickEvent) {
event->defaultHandled();
}
HTMLInputElement::defaultEventHandler(event);
}
} #endif // enable(video)