#include "bindings/v8/ExceptionState.h"
#include "bindings/v8/ExceptionStatePlaceholder.h"
#include "core/dom/ExceptionCode.h"
+#include "core/events/GenericEventQueue.h"
#include "core/html/HTMLMediaElement.h"
#include "core/html/TimeRanges.h"
#include "platform/Clock.h"
, m_muted(false)
, m_readyState(HTMLMediaElement::HAVE_NOTHING)
, m_playbackState(WAITING)
- , m_asyncEventTimer(this, &MediaController::asyncEventTimerFired)
+ , m_pendingEventsQueue(GenericEventQueue::create(this))
, m_clearPositionTimer(this, &MediaController::clearPositionTimerFired)
- , m_closedCaptionsVisible(false)
, m_clock(Clock::create())
, m_executionContext(context)
, m_timeupdateTimer(this, &MediaController::timeupdateTimerFired)
m_mediaElements.remove(m_mediaElements.find(element));
}
-bool MediaController::containsMediaElement(HTMLMediaElement* element) const
-{
- return m_mediaElements.contains(element);
-}
-
PassRefPtr<TimeRanges> MediaController::buffered() const
{
if (m_mediaElements.isEmpty())
if (m_position == MediaPlayer::invalidTime()) {
// Some clocks may return times outside the range of [0..duration].
m_position = max(0.0, min(duration(), m_clock->currentTime()));
- m_clearPositionTimer.startOneShot(0);
+ m_clearPositionTimer.startOneShot(0, FROM_HERE);
}
return m_position;
time = min(time, duration());
// Set the media controller position to the new playback position.
+ m_position = time;
m_clock->setCurrentTime(time);
// Seek each slaved media element to the new playback position relative to the media element timeline.
// If the new value is outside the range 0.0 to 1.0 inclusive, then, on setting, an
// IndexSizeError exception must be raised instead.
if (level < 0 || level > 1) {
- exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::failedToSet("volume", "MediaController", "The value provided (" + String::number(level) + ") is not in the range [0.0, 1.0]."));
+ exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::indexOutsideRange("volume", level, 0.0, ExceptionMessages::InclusiveBound, 1.0, ExceptionMessages::InclusiveBound));
return;
}
element->seek(currentTime(), IGNORE_EXCEPTION);
}
+bool MediaController::isRestrained() const
+{
+ ASSERT(!m_mediaElements.isEmpty());
+
+ // A MediaController is a restrained media controller if the MediaController is a playing media
+ // controller,
+ if (m_paused)
+ return false;
+
+ bool anyAutoplayingAndPaused = false;
+ bool allPaused = true;
+ for (size_t index = 0; index < m_mediaElements.size(); ++index) {
+ HTMLMediaElement* element = m_mediaElements[index];
+
+ // and none of its slaved media elements are blocked media elements,
+ if (element->isBlocked())
+ return false;
+
+ if (element->isAutoplaying() && element->paused())
+ anyAutoplayingAndPaused = true;
+
+ if (!element->paused())
+ allPaused = false;
+ }
+
+ // but either at least one of its slaved media elements whose autoplaying flag is true still has
+ // its paused attribute set to true, or, all of its slaved media elements have their paused
+ // attribute set to true.
+ return anyAutoplayingAndPaused || allPaused;
+}
+
bool MediaController::isBlocked() const
{
+ ASSERT(!m_mediaElements.isEmpty());
+
// A MediaController is a blocked media controller if the MediaController is a paused media
// controller,
if (m_paused)
return true;
- if (m_mediaElements.isEmpty())
- return false;
-
bool allPaused = true;
for (size_t index = 0; index < m_mediaElements.size(); ++index) {
HTMLMediaElement* element = m_mediaElements[index];
- // or if any of its slaved media elements are blocked media elements,
+
+ // or if any of its slaved media elements are blocked media elements,
if (element->isBlocked())
return true;
void MediaController::scheduleEvent(const AtomicString& eventName)
{
- m_pendingEvents.append(Event::createCancelable(eventName));
- if (!m_asyncEventTimer.isActive())
- m_asyncEventTimer.startOneShot(0);
-}
-
-void MediaController::asyncEventTimerFired(Timer<MediaController>*)
-{
- Vector<RefPtr<Event> > pendingEvents;
-
- m_pendingEvents.swap(pendingEvents);
- size_t count = pendingEvents.size();
- for (size_t index = 0; index < count; ++index)
- dispatchEvent(pendingEvents[index].release(), IGNORE_EXCEPTION);
+ m_pendingEventsQueue->enqueueEvent(Event::createCancelable(eventName));
}
void MediaController::clearPositionTimerFired(Timer<MediaController>*)
m_position = MediaPlayer::invalidTime();
}
-bool MediaController::hasAudio() const
-{
- for (size_t index = 0; index < m_mediaElements.size(); ++index) {
- if (m_mediaElements[index]->hasAudio())
- return true;
- }
- return false;
-}
-
-bool MediaController::hasVideo() const
-{
- for (size_t index = 0; index < m_mediaElements.size(); ++index) {
- if (m_mediaElements[index]->hasVideo())
- return true;
- }
- return false;
-}
-
-bool MediaController::hasClosedCaptions() const
-{
- for (size_t index = 0; index < m_mediaElements.size(); ++index) {
- if (m_mediaElements[index]->hasClosedCaptions())
- return true;
- }
- return false;
-}
-
-void MediaController::setClosedCaptionsVisible(bool visible)
-{
- m_closedCaptionsVisible = visible;
- for (size_t index = 0; index < m_mediaElements.size(); ++index)
- m_mediaElements[index]->setClosedCaptionsVisible(visible);
-}
-
-void MediaController::beginScrubbing()
-{
- for (size_t index = 0; index < m_mediaElements.size(); ++index)
- m_mediaElements[index]->beginScrubbing();
- if (m_playbackState == PLAYING)
- m_clock->stop();
-}
-
-void MediaController::endScrubbing()
-{
- for (size_t index = 0; index < m_mediaElements.size(); ++index)
- m_mediaElements[index]->endScrubbing();
- if (m_playbackState == PLAYING)
- m_clock->start();
-}
-
-bool MediaController::canPlay() const
-{
- if (m_paused)
- return true;
-
- for (size_t index = 0; index < m_mediaElements.size(); ++index) {
- if (!m_mediaElements[index]->canPlay())
- return false;
- }
- return true;
-}
-
const AtomicString& MediaController::interfaceName() const
{
return EventTargetNames::MediaController;
if (m_timeupdateTimer.isActive())
return;
- m_timeupdateTimer.startRepeating(maxTimeupdateEventFrequency);
+ m_timeupdateTimer.startRepeating(maxTimeupdateEventFrequency, FROM_HERE);
}
void MediaController::timeupdateTimerFired(Timer<MediaController>*)