Skip to content
  • jer.noble@apple.com's avatar
    Implement MediaController. · be39c543
    jer.noble@apple.com authored
    https://bugs.webkit.org/show_bug.cgi?id=71408
    
    Reviewed by Eric Carlson.
    
    Source/JavaScriptCore:
    
    Change the definition of WTF_USE_COREAUDIO to exclude Windows completely, as
    CoreAudioClock.h is not available there.
    
    * wtf/Platform.h:
    
    Source/WebCore:
    
    Tests: media/media-controller-playback.html
           media/media-controller.html
    
    Adds support for the MediaController DOM object, and the mediagroup and mediacontroller
    HTMLMediaElement attributes.
    
    MediaController is an DOM object which synchronizes playback of multiple HTMLMediaElements. It can
    either be created by a page script and assigned to a HTMLMediaElement using the controller property,
    or all HTMLMediaElements with identical mediagroup attributes will have a MediaController assigned
    automatically.
    
    Add an abstract interface implemented by both MediaController and HTMLMediaElement.
    * html/MediaControllerInterface.h: Added.
    (WebCore::MediaControllerInterface::~MediaControllerInterface):
    
    Add the MediaController object and IDL.
    * html/MediaController.cpp: Added.
    (mediaGroupToMediaControllerMap):
    (MediaController::mediaControllerForMediaGroup):
    (MediaController::create):
    (MediaController::MediaController):
    (MediaController::~MediaController):
    (MediaController::addMediaElement):
    (MediaController::removeMediaElement):
    (MediaController::containsMediaElement):
    (MediaController::buffered):
    (MediaController::seekable):
    (MediaController::played):
    (MediaController::duration):
    (MediaController::currentTime):
    (MediaController::setCurrentTime):
    (MediaController::play):
    (MediaController::pause):
    (MediaController::setDefaultPlaybackRate):
    (MediaController::setPlaybackRate):
    (MediaController::setVolume):
    (MediaController::setMuted):
    (MediaController::reportControllerState):
    (MediaController::updateReadyState):
    (MediaController::updatePlaybackState):
    (MediaController::updateMediaElements):
    (MediaController::scheduleEvent):
    (MediaController::asyncEventTimerFired):
    (MediaController::scriptExecutionContext):
    (MediaController::hasAudio):
    (MediaController::hasVideo):
    (MediaController::hasClosedCaptions):
    (MediaController::setClosedCaptionsVisible):
    (MediaController::supportsScanning):
    (MediaController::beginScrubbing):
    (MediaController::endScrubbing):
    (MediaController::canPlay):
    (MediaController::isLiveStream):
    (MediaController::hasSource):
    (MediaController::returnToRealtime):
    (MediaController::isBlocked):
    (MediaController::hasEnded):
    * html/MediaController.h: Added.
    (WebCore::MediaController::mediaGroup):
    (WebCore::MediaController::paused):
    (WebCore::MediaController::defaultPlaybackRate):
    (WebCore::MediaController::playbackRate):
    (WebCore::MediaController::volume):
    (WebCore::MediaController::muted):
    (WebCore::MediaController::readyState):
    (WebCore::MediaController::playbackState):
    (WebCore::MediaController::supportsFullscreen):
    (WebCore::MediaController::isFullscreen):
    (WebCore::MediaController::enterFullscreen):
    (WebCore::MediaController::closedCaptionsVisible):
    (WebCore::MediaController::refEventTarget):
    (WebCore::MediaController::derefEventTarget):
    (WebCore::MediaController::toMediaController):
    (WebCore::MediaController::eventTargetData):
    (WebCore::MediaController::ensureEventTargetData):
    * html/MediaController.idl: Added.
    
    Add convenience functions to TimeRanges which can calculate intersections and
    unions between TimeRanges objects.
    * html/TimeRanges.cpp:
    (TimeRanges::copy):
    (TimeRanges::invert):
    (TimeRanges::intersectWith):
    (TimeRanges::unionWith):
    * html/TimeRanges.h:
    
    Add MediaControllerConstructor to the Window object.
    * page/DOMWindow.idl:
    
    Add the two new attribute names, mediagroup and controller.
    * html/HTMLAttributeNames.in:
    
    Add support for the new attributes, and add overridden behavior when a media element
    has a current media controller:
    * html/HTMLMediaElement.cpp:
    (WebCore::HTMLMediaElement::~HTMLMediaElement):
    (WebCore::HTMLMediaElement::parseMappedAttribute):
    (WebCore::HTMLMediaElement::prepareForLoad):
    (WebCore::HTMLMediaElement::setReadyState):
    (WebCore::HTMLMediaElement::setCurrentTime):
    (WebCore::HTMLMediaElement::setPlaybackRate):
    (WebCore::HTMLMediaElement::playInternal):
    (WebCore::HTMLMediaElement::togglePlayState):
    (WebCore::HTMLMediaElement::mediaPlayerTimeChanged):
    (WebCore::HTMLMediaElement::seekable):
    (WebCore::HTMLMediaElement::potentiallyPlaying):
    (WebCore::HTMLMediaElement::endedPlayback):
    (WebCore::HTMLMediaElement::updateVolume):
    (WebCore::HTMLMediaElement::updatePlayState):
    (WebCore::HTMLMediaElement::userCancelledLoad):
    (WebCore::HTMLMediaElement::mediaGroup):
    (WebCore::HTMLMediaElement::setMediaGroup):
    (WebCore::HTMLMediaElement::controller):
    (WebCore::HTMLMediaElement::setController):
    (WebCore::HTMLMediaElement::updateMediaController):
    (WebCore::HTMLMediaElement::isBlockedOnMediaController):
    * html/HTMLMediaElement.h:
    (WebCore::HTMLMediaElement::hasSource):
    (WebCore::HTMLMediaElement::isLiveStream):
    * html/HTMLMediaElement.idl:
    * bindings/js/JSHTMLMediaElementCustom.cpp: Added.
    (WebCore::JSHTMLMediaElement::setMediaController):
    
    Add convenience functions to store a mapping of media-elements-per-document to allow
    a quick lookup of media elements with the same media group within a given document:
    * html/HTMLMediaElement.cpp:
    (WebCore::documentToElementSetMap):
    (WebCore::addElementToDocumentMap):
    (WebCore::removeElementFromDocumentMap):
    
    Add a function "seekable" which returns a TimeRanges containing the seekable time ranges
    in a media element.  By default this is a single range of [0, maxTimeSeekable].
    * platform/graphics/MediaPlayer.cpp:
    (WebCore::MediaPlayer::seekable):
    * platform/graphics/MediaPlayer.h:
    * platform/graphics/MediaPlayerPrivate.h:
    (WebCore::MediaPlayerPrivateInterface::seekable):
    
    Support functions to cast between MediaController and EventTarget.
    * bindings/js/JSEventTarget.cpp:
    (WebCore::toJS):
    * dom/EventTarget.cpp:
    (WebCore::EventTarget::toMediaController):
    * dom/EventTarget.h:
    
    Fixed an infinite-recursion bug due to a collision between WTF::currentTime and
    ClockGeneric::currentTime:
    * platform/ClockGeneric.cpp:
    (ClockGeneric::ClockGeneric):
    (ClockGeneric::setCurrentTime):
    (ClockGeneric::currentTime):
    (ClockGeneric::setPlayRate):
    (ClockGeneric::start):
    (ClockGeneric::stop):
    (ClockGeneric::now):
    * platform/ClockGeneric.h:
    
    Boilerplate to support creating the derived sources for MediaController and adding new sources
    to the project:
    * CMakeLists.txt:
    * DerivedSources.cpp:
    * DerivedSources.make:
    * GNUmakefile.list.am:
    * WebCore.gypi:
    * WebCore.xcodeproj/project.pbxproj:
    
    LayoutTests:
    
    * media/media-controller-expected.txt: Added.
    * media/media-controller-playback-expected.txt: Added.
    * media/media-controller-playback.html: Added.
    * media/media-controller.html: Added.
    * platform/mac/fast/dom/Window/window-properties-expected.txt:
    * platform/mac/fast/js/global-constructors-expected.txt:
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@100159 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    be39c543