Changeset 181423 in webkit


Ignore:
Timestamp:
Mar 11, 2015 6:54:06 PM (9 years ago)
Author:
eric.carlson@apple.com
Message:

[Mac] Update AirPlay handling
https://bugs.webkit.org/show_bug.cgi?id=142541

Reviewed by Sam Weinig.

Source/WebCore:

  • WebCore.xcodeproj/project.pbxproj:
  • dom/Document.cpp:

(WebCore::Document::showPlaybackTargetPicker):
(WebCore::Document::addPlaybackTargetPickerClient):
(WebCore::Document::removePlaybackTargetPickerClient):
(WebCore::Document::configurePlaybackTargetMonitoring):
(WebCore::Document::requiresPlaybackTargetRouteMonitoring):
(WebCore::Document::playbackTargetAvailabilityDidChange):
(WebCore::Document::didChoosePlaybackTarget):

  • dom/Document.h:
  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::registerWithDocument):
(WebCore::HTMLMediaElement::unregisterWithDocument):
(WebCore::HTMLMediaElement::parseAttribute):

  • html/HTMLMediaElement.h:
  • html/HTMLMediaSession.cpp:

(WebCore::HTMLMediaSession::HTMLMediaSession):
(WebCore::HTMLMediaSession::registerWithDocument):
(WebCore::HTMLMediaSession::unregisterWithDocument):
(WebCore::HTMLMediaSession::showPlaybackTargetPicker):
(WebCore::HTMLMediaSession::hasWirelessPlaybackTargets):
(WebCore::HTMLMediaSession::setHasPlaybackTargetAvailabilityListeners):
(WebCore::HTMLMediaSession::didChoosePlaybackTarget):
(WebCore::HTMLMediaSession::externalOutputDeviceAvailableDidChange):
(WebCore::HTMLMediaSession::requiresPlaybackTargetRouteMonitoring):

  • html/HTMLMediaSession.h:
  • page/ChromeClient.h:
  • page/Page.cpp:

(WebCore::Page::didChoosePlaybackTarget):
(WebCore::Page::playbackTargetAvailabilityDidChange):
(WebCore::Page::configurePlaybackTargetMonitoring):

  • page/Page.h:

(WebCore::Page::hasWirelessPlaybackTarget):
(WebCore::Page::playbackTarget):

  • platform/audio/MediaSession.cpp:

(WebCore::MediaSession::clientDataBufferingTimerFired):
(WebCore::MediaSession::wirelessRoutesAvailableDidChange): Deleted.

  • platform/audio/MediaSession.h:

(WebCore::MediaSession::didChoosePlaybackTarget):
(WebCore::MediaSession::externalOutputDeviceAvailableDidChange):
(WebCore::MediaSession::requiresPlaybackTargetRouteMonitoring):
(WebCore::MediaSessionClient::setWirelessPlaybackTarget):

  • platform/audio/MediaSessionManager.cpp:

(WebCore::MediaSessionManager::wirelessRoutesAvailableChanged): Deleted.

  • platform/audio/MediaSessionManager.h:

(WebCore::MediaSessionManager::configureWireLessTargetMonitoring):

  • platform/audio/ios/MediaSessionManagerIOS.h:
  • platform/audio/ios/MediaSessionManagerIOS.mm:

(WebCore::MediaSessionManageriOS::externalOutputDeviceAvailableDidChange):
(-[WebMediaSessionHelper wirelessRoutesAvailableDidChange:]):

  • platform/graphics/AVPlaybackTarget.h: Added.

(WebCore::AVPlaybackTarget::~AVPlaybackTarget):
(WebCore::AVPlaybackTarget::AVPlaybackTarget):
(WebCore::AVPlaybackTarget::setDevicePickerContext):
(WebCore::AVPlaybackTarget::devicePickerContext):

  • platform/graphics/AVPlaybackTargetPickerClient.h: Added.

(WebCore::AVPlaybackTargetPickerClient::~AVPlaybackTargetPickerClient):

  • platform/graphics/MediaPlayer.cpp:

(WebCore::MediaPlayer::setWirelessPlaybackTarget):

  • platform/graphics/MediaPlayer.h:
  • platform/graphics/MediaPlayerPrivate.h:

(WebCore::MediaPlayerPrivateInterface::setWirelessPlaybackTarget):

  • platform/graphics/avfoundation/AVPlaybackTargetMac.mm: Added.

(WebCore::AVPlaybackTarget::encode):
(WebCore::AVPlaybackTarget::decode):

  • platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
  • platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:

(WebCore::MediaPlayerPrivateAVFoundationObjC::cancelLoad):
(WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayer):
(WebCore::MediaPlayerPrivateAVFoundationObjC::setVideoFullscreenLayer):
(WebCore::MediaPlayerPrivateAVFoundationObjC::isCurrentPlaybackTargetWireless):
(WebCore::MediaPlayerPrivateAVFoundationObjC::wirelessPlaybackTargetType):
(WebCore::MediaPlayerPrivateAVFoundationObjC::wirelessVideoPlaybackDisabled):
(WebCore::MediaPlayerPrivateAVFoundationObjC::setWirelessVideoPlaybackDisabled):
(WebCore::MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget):
(WebCore::MediaPlayerPrivateAVFoundationObjC::updateDisableExternalPlayback):
(-[WebCoreAVFMovieObserver observeValueForKeyPath:ofObject:change:context:]):

Source/WebKit2:

  • Shared/WebCoreArgumentCoders.h:
  • Shared/mac/WebCoreArgumentCodersMac.mm:

(IPC::ArgumentCoder<AVPlaybackTarget>::encode):
(IPC::ArgumentCoder<AVPlaybackTarget>::decode):

  • UIProcess/PageClient.h:
  • UIProcess/WebAVPlaybackTargetPickerProxy.cpp: Added.

(WebKit::WebAVPlaybackTargetPickerProxy::WebAVPlaybackTargetPickerProxy):
(WebKit::WebAVPlaybackTargetPickerProxy::~WebAVPlaybackTargetPickerProxy):
(WebKit::WebAVPlaybackTargetPickerProxy::showPlaybackTargetPicker):
(WebKit::WebAVPlaybackTargetPickerProxy::startingMonitoringPlaybackTargets):
(WebKit::WebAVPlaybackTargetPickerProxy::stopMonitoringPlaybackTargets):

  • UIProcess/WebAVPlaybackTargetPickerProxy.h: Added.

(WebKit::WebAVPlaybackTargetPickerProxy::Client::~Client):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::devicePickerProxy):
(WebKit::WebPageProxy::showPlaybackTargetPicker):
(WebKit::WebPageProxy::startingMonitoringPlaybackTargets):
(WebKit::WebPageProxy::stopMonitoringPlaybackTargets):
(WebKit::WebPageProxy::didChoosePlaybackTarget):
(WebKit::WebPageProxy::externalOutputDeviceAvailableDidChange):

  • UIProcess/WebPageProxy.h:
  • UIProcess/WebPageProxy.messages.in:
  • UIProcess/mac/PageClientImpl.h:
  • UIProcess/mac/PageClientImpl.mm:

(WebKit::PageClientImpl::createPlaybackTargetPicker):

  • UIProcess/mac/WebAVPlaybackTargetPickerProxyMac.h: Added.
  • UIProcess/mac/WebAVPlaybackTargetPickerProxyMac.mm: Added.

(WebKit::WebAVPlaybackTargetPickerProxyMac::create):
(WebKit::WebAVPlaybackTargetPickerProxyMac::WebAVPlaybackTargetPickerProxyMac):
(WebKit::WebAVPlaybackTargetPickerProxyMac::~WebAVPlaybackTargetPickerProxyMac):
(WebKit::WebAVPlaybackTargetPickerProxyMac::outputeDeviceAvailabilityChangedTimerFired):
(WebKit::WebAVPlaybackTargetPickerProxyMac::availableDevicesDidChange):
(WebKit::WebAVPlaybackTargetPickerProxyMac::devicePicker):
(WebKit::WebAVPlaybackTargetPickerProxyMac::showPlaybackTargetPicker):
(WebKit::WebAVPlaybackTargetPickerProxyMac::currentDeviceDidChange):
(WebKit::WebAVPlaybackTargetPickerProxyMac::startingMonitoringPlaybackTargets):
(WebKit::WebAVPlaybackTargetPickerProxyMac::stopMonitoringPlaybackTargets):
(-[WebAVOutputDevicePickerMenuControllerHelper initWithCallback:]):
(-[WebAVOutputDevicePickerMenuControllerHelper clearCallback]):
(-[WebAVOutputDevicePickerMenuControllerHelper observeValueForKeyPath:ofObject:change:context:]):

  • WebKit2.xcodeproj/project.pbxproj:
  • WebProcess/WebCoreSupport/WebAVPlaybackTargetPicker.cpp: Added.

(WebKit::WebAVPlaybackTargetPicker::WebAVPlaybackTargetPicker):
(WebKit::WebAVPlaybackTargetPicker::showPlaybackDevicePicker):
(WebKit::WebAVPlaybackTargetPicker::configureWireLessTargetMonitoring):
(WebKit::WebAVPlaybackTargetPicker::addClient):
(WebKit::WebAVPlaybackTargetPicker::removeClient):
(WebKit::WebAVPlaybackTargetPicker::didChoosePlaybackTarget):
(WebKit::WebAVPlaybackTargetPicker::playbackTargetAvailabilityDidChange):

  • WebProcess/WebCoreSupport/WebChromeClient.cpp:

(WebKit::WebChromeClient::showPlaybackTargetPicker):
(WebKit::WebChromeClient::startingMonitoringPlaybackTargets):
(WebKit::WebChromeClient::stopMonitoringPlaybackTargets):

  • WebProcess/WebCoreSupport/WebChromeClient.h:
  • WebProcess/WebPage/WebPage.h:
  • WebProcess/WebPage/WebPage.messages.in:
  • WebProcess/WebPage/mac/WebPageMac.mm:

(WebKit::WebPage::playbackTargetSelected):
(WebKit::WebPage::playbackTargetAvailabilityDidChange):

  • WebProcess/com.apple.WebProcess.sb.in:
Location:
trunk/Source
Files:
5 added
31 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r181421 r181423  
     12015-03-11  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [Mac] Update AirPlay handling
     4        https://bugs.webkit.org/show_bug.cgi?id=142541
     5
     6        Reviewed by Sam Weinig.
     7
     8        * WebCore.xcodeproj/project.pbxproj:
     9        * dom/Document.cpp:
     10        (WebCore::Document::showPlaybackTargetPicker):
     11        (WebCore::Document::addPlaybackTargetPickerClient):
     12        (WebCore::Document::removePlaybackTargetPickerClient):
     13        (WebCore::Document::configurePlaybackTargetMonitoring):
     14        (WebCore::Document::requiresPlaybackTargetRouteMonitoring):
     15        (WebCore::Document::playbackTargetAvailabilityDidChange):
     16        (WebCore::Document::didChoosePlaybackTarget):
     17        * dom/Document.h:
     18        * html/HTMLMediaElement.cpp:
     19        (WebCore::HTMLMediaElement::registerWithDocument):
     20        (WebCore::HTMLMediaElement::unregisterWithDocument):
     21        (WebCore::HTMLMediaElement::parseAttribute):
     22        * html/HTMLMediaElement.h:
     23        * html/HTMLMediaSession.cpp:
     24        (WebCore::HTMLMediaSession::HTMLMediaSession):
     25        (WebCore::HTMLMediaSession::registerWithDocument):
     26        (WebCore::HTMLMediaSession::unregisterWithDocument):
     27        (WebCore::HTMLMediaSession::showPlaybackTargetPicker):
     28        (WebCore::HTMLMediaSession::hasWirelessPlaybackTargets):
     29        (WebCore::HTMLMediaSession::setHasPlaybackTargetAvailabilityListeners):
     30        (WebCore::HTMLMediaSession::didChoosePlaybackTarget):
     31        (WebCore::HTMLMediaSession::externalOutputDeviceAvailableDidChange):
     32        (WebCore::HTMLMediaSession::requiresPlaybackTargetRouteMonitoring):
     33        * html/HTMLMediaSession.h:
     34        * page/ChromeClient.h:
     35        * page/Page.cpp:
     36        (WebCore::Page::didChoosePlaybackTarget):
     37        (WebCore::Page::playbackTargetAvailabilityDidChange):
     38        (WebCore::Page::configurePlaybackTargetMonitoring):
     39        * page/Page.h:
     40        (WebCore::Page::hasWirelessPlaybackTarget):
     41        (WebCore::Page::playbackTarget):
     42        * platform/audio/MediaSession.cpp:
     43        (WebCore::MediaSession::clientDataBufferingTimerFired):
     44        (WebCore::MediaSession::wirelessRoutesAvailableDidChange): Deleted.
     45        * platform/audio/MediaSession.h:
     46        (WebCore::MediaSession::didChoosePlaybackTarget):
     47        (WebCore::MediaSession::externalOutputDeviceAvailableDidChange):
     48        (WebCore::MediaSession::requiresPlaybackTargetRouteMonitoring):
     49        (WebCore::MediaSessionClient::setWirelessPlaybackTarget):
     50        * platform/audio/MediaSessionManager.cpp:
     51        (WebCore::MediaSessionManager::wirelessRoutesAvailableChanged): Deleted.
     52        * platform/audio/MediaSessionManager.h:
     53        (WebCore::MediaSessionManager::configureWireLessTargetMonitoring):
     54        * platform/audio/ios/MediaSessionManagerIOS.h:
     55        * platform/audio/ios/MediaSessionManagerIOS.mm:
     56        (WebCore::MediaSessionManageriOS::externalOutputDeviceAvailableDidChange):
     57        (-[WebMediaSessionHelper wirelessRoutesAvailableDidChange:]):
     58        * platform/graphics/AVPlaybackTarget.h: Added.
     59        (WebCore::AVPlaybackTarget::~AVPlaybackTarget):
     60        (WebCore::AVPlaybackTarget::AVPlaybackTarget):
     61        (WebCore::AVPlaybackTarget::setDevicePickerContext):
     62        (WebCore::AVPlaybackTarget::devicePickerContext):
     63        * platform/graphics/AVPlaybackTargetPickerClient.h: Added.
     64        (WebCore::AVPlaybackTargetPickerClient::~AVPlaybackTargetPickerClient):
     65        * platform/graphics/MediaPlayer.cpp:
     66        (WebCore::MediaPlayer::setWirelessPlaybackTarget):
     67        * platform/graphics/MediaPlayer.h:
     68        * platform/graphics/MediaPlayerPrivate.h:
     69        (WebCore::MediaPlayerPrivateInterface::setWirelessPlaybackTarget):
     70        * platform/graphics/avfoundation/AVPlaybackTargetMac.mm: Added.
     71        (WebCore::AVPlaybackTarget::encode):
     72        (WebCore::AVPlaybackTarget::decode):
     73        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
     74        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
     75        (WebCore::MediaPlayerPrivateAVFoundationObjC::cancelLoad):
     76        (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayer):
     77        (WebCore::MediaPlayerPrivateAVFoundationObjC::setVideoFullscreenLayer):
     78        (WebCore::MediaPlayerPrivateAVFoundationObjC::isCurrentPlaybackTargetWireless):
     79        (WebCore::MediaPlayerPrivateAVFoundationObjC::wirelessPlaybackTargetType):
     80        (WebCore::MediaPlayerPrivateAVFoundationObjC::wirelessVideoPlaybackDisabled):
     81        (WebCore::MediaPlayerPrivateAVFoundationObjC::setWirelessVideoPlaybackDisabled):
     82        (WebCore::MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget):
     83        (WebCore::MediaPlayerPrivateAVFoundationObjC::updateDisableExternalPlayback):
     84        (-[WebCoreAVFMovieObserver observeValueForKeyPath:ofObject:change:context:]):
     85
    1862015-03-11  Alex Christensen  <achristensen@webkit.org>
    287
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r181421 r181423  
    176176                0753860214489E9800B78452 /* CachedTextTrack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0753860014489E9800B78452 /* CachedTextTrack.cpp */; };
    177177                0753860314489E9800B78452 /* CachedTextTrack.h in Headers */ = {isa = PBXBuildFile; fileRef = 0753860114489E9800B78452 /* CachedTextTrack.h */; };
     178                0760C17A1AA8FC7D009ED7B8 /* MediaPlaybackTargetMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07E3DFD21A9E78A500764CA8 /* MediaPlaybackTargetMac.mm */; };
    178179                076306D017E1478D005A7C4E /* MediaStreamTrackSourcesCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 076306CC17E1478D005A7C4E /* MediaStreamTrackSourcesCallback.h */; settings = {ATTRIBUTES = (Private, ); }; };
    179180                076306D217E1478D005A7C4E /* MediaStreamTrackSourcesRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 076306CE17E1478D005A7C4E /* MediaStreamTrackSourcesRequest.cpp */; };
     
    270271                078E094B17D1709600420AA1 /* MediaStreamAudioDestinationNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 078E094817D1709600420AA1 /* MediaStreamAudioDestinationNode.cpp */; };
    271272                078E094C17D1709600420AA1 /* MediaStreamAudioDestinationNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 078E094917D1709600420AA1 /* MediaStreamAudioDestinationNode.h */; settings = {ATTRIBUTES = (Private, ); }; };
     273                079216551AA560AA00A3C049 /* MediaPlaybackTargetPickerClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 079216531AA560AA00A3C049 /* MediaPlaybackTargetPickerClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
    272274                07941791166E855F009416C2 /* InbandTextTrack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0794178F166E855F009416C2 /* InbandTextTrack.cpp */; };
    273275                07941792166E855F009416C2 /* InbandTextTrack.h in Headers */ = {isa = PBXBuildFile; fileRef = 07941790166E855F009416C2 /* InbandTextTrack.h */; };
     
    339341                07E116B11489C9A100EC5ACE /* JSTextTrackCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07E116B01489C9A100EC5ACE /* JSTextTrackCustom.cpp */; };
    340342                07E117071489EBEB00EC5ACE /* JSTextTrackCueCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07E117061489EBEB00EC5ACE /* JSTextTrackCueCustom.cpp */; };
     343                07E3DFD11A9E786500764CA8 /* MediaPlaybackTarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 07E3DFD01A9E786500764CA8 /* MediaPlaybackTarget.h */; settings = {ATTRIBUTES = (Private, ); }; };
    341344                07E9E12E18F5E2760011A3A4 /* InbandMetadataTextTrackPrivateAVF.h in Headers */ = {isa = PBXBuildFile; fileRef = 07E9E12D18F5E2760011A3A4 /* InbandMetadataTextTrackPrivateAVF.h */; };
    342345                07E9E13018F62B370011A3A4 /* InbandMetadataTextTrackPrivateAVF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07E9E12F18F62B370011A3A4 /* InbandMetadataTextTrackPrivateAVF.cpp */; };
     346                07EDC3EE1AACB75D00983EB5 /* MediaSessionManagerMac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07EDC3ED1AACB75D00983EB5 /* MediaSessionManagerMac.cpp */; };
    343347                07F944161864D046005D31CB /* MediaSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = CDAE8C081746B95700532D78 /* MediaSessionManager.h */; settings = {ATTRIBUTES = (Private, ); }; };
    344348                07FBDE2C18FED178001A7CFF /* JSDataCueCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07FBDE2B18FED178001A7CFF /* JSDataCueCustom.cpp */; };
     
    56885692                CD54A762180F9F7000B076C9 /* AudioTrackPrivateMediaSourceAVFObjC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD54A760180F9F7000B076C9 /* AudioTrackPrivateMediaSourceAVFObjC.cpp */; };
    56895693                CD54A763180F9F7000B076C9 /* AudioTrackPrivateMediaSourceAVFObjC.h in Headers */ = {isa = PBXBuildFile; fileRef = CD54A761180F9F7000B076C9 /* AudioTrackPrivateMediaSourceAVFObjC.h */; };
    5690                 CD54DE4717468B6F005E5B36 /* MediaSessionManagerMac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD54DE4517468B6F005E5B36 /* MediaSessionManagerMac.cpp */; };
    56915694                CD54DE4B17469C6D005E5B36 /* AudioSessionMac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD54DE4917469C6D005E5B36 /* AudioSessionMac.cpp */; };
    56925695                CD5596911475B678001D0BD0 /* AudioFileReaderIOS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD55968F1475B678001D0BD0 /* AudioFileReaderIOS.cpp */; };
     
    72687271                078E094917D1709600420AA1 /* MediaStreamAudioDestinationNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamAudioDestinationNode.h; sourceTree = "<group>"; };
    72697272                078E094A17D1709600420AA1 /* MediaStreamAudioDestinationNode.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = MediaStreamAudioDestinationNode.idl; sourceTree = "<group>"; };
     7273                079216531AA560AA00A3C049 /* MediaPlaybackTargetPickerClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MediaPlaybackTargetPickerClient.h; path = graphics/MediaPlaybackTargetPickerClient.h; sourceTree = "<group>"; };
    72707274                0794178F166E855F009416C2 /* InbandTextTrack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InbandTextTrack.cpp; sourceTree = "<group>"; };
    72717275                07941790166E855F009416C2 /* InbandTextTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandTextTrack.h; sourceTree = "<group>"; };
     
    73467350                07E116B01489C9A100EC5ACE /* JSTextTrackCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextTrackCustom.cpp; sourceTree = "<group>"; };
    73477351                07E117061489EBEB00EC5ACE /* JSTextTrackCueCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextTrackCueCustom.cpp; sourceTree = "<group>"; };
     7352                07E3DFD01A9E786500764CA8 /* MediaPlaybackTarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaPlaybackTarget.h; sourceTree = "<group>"; };
     7353                07E3DFD21A9E78A500764CA8 /* MediaPlaybackTargetMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MediaPlaybackTargetMac.mm; path = platform/graphics/avfoundation/MediaPlaybackTargetMac.mm; sourceTree = SOURCE_ROOT; };
    73487354                07E9E12D18F5E2760011A3A4 /* InbandMetadataTextTrackPrivateAVF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandMetadataTextTrackPrivateAVF.h; sourceTree = "<group>"; };
    73497355                07E9E12F18F62B370011A3A4 /* InbandMetadataTextTrackPrivateAVF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InbandMetadataTextTrackPrivateAVF.cpp; sourceTree = "<group>"; };
     7356                07EDC3ED1AACB75D00983EB5 /* MediaSessionManagerMac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaSessionManagerMac.cpp; sourceTree = "<group>"; };
    73507357                07FBDE2B18FED178001A7CFF /* JSDataCueCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDataCueCustom.cpp; sourceTree = "<group>"; };
    73517358                07FE99DA18807A7D00256648 /* HTMLMediaSession.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLMediaSession.cpp; sourceTree = "<group>"; };
     
    1319513202                CD54A760180F9F7000B076C9 /* AudioTrackPrivateMediaSourceAVFObjC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AudioTrackPrivateMediaSourceAVFObjC.cpp; path = objc/AudioTrackPrivateMediaSourceAVFObjC.cpp; sourceTree = "<group>"; };
    1319613203                CD54A761180F9F7000B076C9 /* AudioTrackPrivateMediaSourceAVFObjC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AudioTrackPrivateMediaSourceAVFObjC.h; path = objc/AudioTrackPrivateMediaSourceAVFObjC.h; sourceTree = "<group>"; };
    13197                 CD54DE4517468B6F005E5B36 /* MediaSessionManagerMac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaSessionManagerMac.cpp; sourceTree = "<group>"; };
    1319813204                CD54DE4917469C6D005E5B36 /* AudioSessionMac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioSessionMac.cpp; sourceTree = "<group>"; };
    1319913205                CD55968F1475B678001D0BD0 /* AudioFileReaderIOS.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AudioFileReaderIOS.cpp; path = ios/AudioFileReaderIOS.cpp; sourceTree = "<group>"; };
     
    2056020566                        isa = PBXGroup;
    2056120567                        children = (
     20568                                07E3DFD21A9E78A500764CA8 /* MediaPlaybackTargetMac.mm */,
    2056220569                                EDE3A4FF0C7A430600956A37 /* ColorMac.h */,
    2056320570                                B275354A0B053814002CE64F /* ColorMac.mm */,
     
    2061020617                                3721493318F0B6D600156EDC /* opentype */,
    2061120618                                49E911B20EF86D27009D0CAF /* transforms */,
     20619                                07E3DFD01A9E786500764CA8 /* MediaPlaybackTarget.h */,
    2061220620                                490707E41219C04300D90E51 /* ANGLEWebKitBridge.cpp */,
    2061320621                                490707E51219C04300D90E51 /* ANGLEWebKitBridge.h */,
     
    2153021538                        isa = PBXGroup;
    2153121539                        children = (
     21540                                079216531AA560AA00A3C049 /* MediaPlaybackTargetPickerClient.h */,
    2153221541                                49E912A40EFAC8E6009D0CAF /* animation */,
    2153321542                                FD31604012B026A300C1A359 /* audio */,
     
    2342023429                        isa = PBXGroup;
    2342123430                        children = (
     23431                                07EDC3ED1AACB75D00983EB5 /* MediaSessionManagerMac.cpp */,
    2342223432                                FD3160B512B0272A00C1A359 /* AudioBusMac.mm */,
    2342323433                                FD3160B612B0272A00C1A359 /* AudioDestinationMac.cpp */,
     
    2343123441                                CDC734131977896C0046BFC5 /* CARingBuffer.h */,
    2343223442                                FD3160BA12B0272A00C1A359 /* FFTFrameMac.cpp */,
    23433                                 CD54DE4517468B6F005E5B36 /* MediaSessionManagerMac.cpp */,
    2343423443                        );
    2343523444                        path = mac;
     
    2373623745                                319FBD5F15D2F464009640A6 /* CachedImageClient.h in Headers */,
    2373723746                                510184690B08602A004A825F /* CachedPage.h in Headers */,
     23747                                07E3DFD11A9E786500764CA8 /* MediaPlaybackTarget.h in Headers */,
    2373823748                                D0EDA775143E303C0028E383 /* CachedRawResource.h in Headers */,
    2373923749                                E1B533491717DEE300F205F9 /* CachedRawResourceClient.h in Headers */,
     
    2620126211                                93C38BFF164473C700091EB2 /* ScrollingStateFixedNode.h in Headers */,
    2620226212                                0FEA3E7B191B2FC5000F1B55 /* ScrollingStateFrameScrollingNode.h in Headers */,
     26213                                079216551AA560AA00A3C049 /* MediaPlaybackTargetPickerClient.h in Headers */,
    2620326214                                931CBD0D161A44E900E4C874 /* ScrollingStateNode.h in Headers */,
    2620426215                                0FEA3E84191B31BF000F1B55 /* ScrollingStateOverflowScrollingNode.h in Headers */,
     
    2737527386                                FD315FFB12B0267600C1A359 /* AudioBufferSourceNode.cpp in Sources */,
    2737627387                                FD31607B12B026F700C1A359 /* AudioBus.cpp in Sources */,
     27388                                07EDC3EE1AACB75D00983EB5 /* MediaSessionManagerMac.cpp in Sources */,
    2737727389                                FD3160BB12B0272A00C1A359 /* AudioBusMac.mm in Sources */,
    2737827390                                FD31607D12B026F700C1A359 /* AudioChannel.cpp in Sources */,
     
    2795627968                                4B3043CC0AE0373B00A82647 /* Editor.cpp in Sources */,
    2795727969                                93A38B4B0D0E5808006872C2 /* EditorCommand.cpp in Sources */,
     27970                                0760C17A1AA8FC7D009ED7B8 /* MediaPlaybackTargetMac.mm in Sources */,
    2795827971                                FED13D3A0CEA934600D89466 /* EditorIOS.mm in Sources */,
    2795927972                                ED501DC60B249F2900AE18D9 /* EditorMac.mm in Sources */,
     
    2917929192                                CDAE8C091746B95700532D78 /* MediaSessionManager.cpp in Sources */,
    2918029193                                07638A9A1884487200E15A1B /* MediaSessionManagerIOS.mm in Sources */,
    29181                                 CD54DE4717468B6F005E5B36 /* MediaSessionManagerMac.cpp in Sources */,
    2918229194                                CD3A495E17A9D01B00274E42 /* MediaSource.cpp in Sources */,
    2918329195                                CDC8B5A6180474F70016E685 /* MediaSourcePrivateAVFObjC.mm in Sources */,
  • trunk/Source/WebCore/dom/Document.cpp

    r181396 r181423  
    229229#endif
    230230
     231#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     232#include "HTMLVideoElement.h"
     233#endif
     234
    231235using namespace WTF;
    232236using namespace Unicode;
     
    64526456#endif
    64536457
     6458#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     6459void Document::showPlaybackTargetPicker(const HTMLMediaElement& element)
     6460{
     6461    Page* page = this->page();
     6462    if (!page)
     6463        return;
     6464
     6465    page->showPlaybackTargetPicker(this, view()->lastKnownMousePosition(), is<HTMLVideoElement>(element));
     6466}
     6467
     6468void Document::addPlaybackTargetPickerClient(MediaPlaybackTargetPickerClient& client)
     6469{
     6470    Page* page = this->page();
     6471    if (!page)
     6472        return;
     6473
     6474    m_playbackTargetClients.add(&client);
     6475
     6476    client.didChoosePlaybackTarget(page->playbackTarget());
     6477    client.externalOutputDeviceAvailableDidChange(page->hasWirelessPlaybackTarget());
     6478}
     6479
     6480void Document::removePlaybackTargetPickerClient(MediaPlaybackTargetPickerClient& client)
     6481{
     6482    m_playbackTargetClients.remove(&client);
     6483    configurePlaybackTargetMonitoring();
     6484}
     6485
     6486void Document::configurePlaybackTargetMonitoring()
     6487{
     6488    Page* page = this->page();
     6489    if (!page)
     6490        return;
     6491
     6492    page->configurePlaybackTargetMonitoring();
     6493}
     6494
     6495bool Document::requiresPlaybackTargetRouteMonitoring()
     6496{
     6497    for (auto* client : m_playbackTargetClients) {
     6498        if (client->requiresPlaybackTargetRouteMonitoring()) {
     6499            return true;
     6500            break;
     6501        }
     6502    }
     6503
     6504    return false;
     6505}
     6506
     6507void Document::playbackTargetAvailabilityDidChange(bool available)
     6508{
     6509    if (m_playbackTargetsAvailable == available)
     6510        return;
     6511    m_playbackTargetsAvailable = available;
     6512
     6513    for (auto* client : m_playbackTargetClients)
     6514        client->externalOutputDeviceAvailableDidChange(available);
     6515}
     6516
     6517void Document::didChoosePlaybackTarget(MediaPlaybackTarget& device)
     6518{
     6519    MediaPlaybackTargetPickerClient* clientThatRequestedPicker = nullptr;
     6520
     6521    for (auto* client : m_playbackTargetClients) {
     6522        if (client->requestedPlaybackTargetPicker()) {
     6523            clientThatRequestedPicker = client;
     6524            continue;
     6525        }
     6526
     6527        client->didChoosePlaybackTarget(device);
     6528    }
     6529
     6530    if (clientThatRequestedPicker)
     6531        clientThatRequestedPicker->didChoosePlaybackTarget(device);
     6532}
     6533
     6534#endif
     6535
    64546536} // namespace WebCore
  • trunk/Source/WebCore/dom/Document.h

    r181396 r181423  
    125125class Locale;
    126126class MediaCanStartListener;
     127class MediaPlaybackTarget;
     128class MediaPlaybackTargetPickerClient;
    127129class MediaQueryList;
    128130class MediaQueryMatcher;
     
    12191221    WeakPtr<Document> createWeakPtr() { return m_weakFactory.createWeakPtr(); }
    12201222
     1223#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     1224    void showPlaybackTargetPicker(const HTMLMediaElement&);
     1225    void didChoosePlaybackTarget(MediaPlaybackTarget&);
     1226    void addPlaybackTargetPickerClient(MediaPlaybackTargetPickerClient&);
     1227    void removePlaybackTargetPickerClient(MediaPlaybackTargetPickerClient&);
     1228    bool requiresPlaybackTargetRouteMonitoring();
     1229    void configurePlaybackTargetMonitoring();
     1230    void playbackTargetAvailabilityDidChange(bool);
     1231#endif
     1232
    12211233protected:
    12221234    enum ConstructionFlags { Synthesized = 1, NonRenderedPlaceholder = 1 << 1 };
     
    16561668    HashSet<AudioProducer*> m_audioProducers;
    16571669    bool m_isPlayingAudio;
     1670
     1671#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     1672    HashSet<WebCore::MediaPlaybackTargetPickerClient*> m_playbackTargetClients;
     1673    bool m_playbackTargetsAvailable { false };
     1674#endif
    16581675};
    16591676
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r181411 r181423  
    427427void HTMLMediaElement::registerWithDocument(Document& document)
    428428{
     429    m_mediaSession->registerWithDocument(document);
     430
    429431    if (m_isWaitingUntilMediaCanStart)
    430432        document.addMediaCanStartListener(this);
     
    452454void HTMLMediaElement::unregisterWithDocument(Document& document)
    453455{
     456    m_mediaSession->unregisterWithDocument(document);
     457
    454458    if (m_isWaitingUntilMediaCanStart)
    455459        document.removeMediaCanStartListener(this);
     
    24722476void HTMLMediaElement::invalidateCachedTime() const
    24732477{
     2478    if (!m_player->maximumDurationToCacheMediaTime())
     2479        return;
     2480
    24742481#if !LOG_DISABLED
    24752482    if (m_cachedTime.isValid())
     
    48574864    m_asyncEventQueue.enqueueEvent(event.release());
    48584865}
     4866
     4867void HTMLMediaElement::setWirelessPlaybackTarget(const MediaPlaybackTarget& device)
     4868{
     4869    LOG(Media, "HTMLMediaElement::setWirelessPlaybackTarget(%p)", this);
     4870    if (m_player)
     4871        m_player->setWirelessPlaybackTarget(device);
     4872}
    48594873#endif
    48604874
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r181259 r181423  
    11/*
    2  * Copyright (C) 2007-2014 Apple Inc. All rights reserved.
     2 * Copyright (C) 2007-2015 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    358358    virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture) override;
    359359    virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture) override;
     360
    360361    virtual void wirelessRoutesAvailableDidChange() override;
     362    virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&) override;
    361363#endif
    362364
  • trunk/Source/WebCore/html/HTMLMediaSession.cpp

    r180717 r181423  
    3232#include "Chrome.h"
    3333#include "ChromeClient.h"
     34#include "Document.h"
    3435#include "Frame.h"
     36#include "FrameView.h"
    3537#include "HTMLMediaElement.h"
    3638#include "HTMLNames.h"
     
    7375    : MediaSession(client)
    7476    , m_restrictions(NoRestrictions)
    75     , m_hasPlaybackTargetAvailabilityListeners(false)
    76 {
     77#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     78    , m_targetAvailabilityChangedTimer(*this, &HTMLMediaSession::targetAvailabilityChangedTimerFired)
     79#endif
     80{
     81}
     82
     83void HTMLMediaSession::registerWithDocument(Document& document)
     84{
     85#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     86    document.addPlaybackTargetPickerClient(*this);
     87#else
     88    UNUSED_PARAM(document);
     89#endif
     90}
     91
     92void HTMLMediaSession::unregisterWithDocument(Document& document)
     93{
     94#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     95    document.removePlaybackTargetPickerClient(*this);
     96#else
     97    UNUSED_PARAM(document);
     98#endif
    7799}
    78100
     
    178200        return;
    179201
    180 #if PLATFORM(IOS)
    181     element.document().frame()->page()->chrome().client().showPlaybackTargetPicker(element.hasVideo());
    182 #endif
    183 }
    184 
    185 bool HTMLMediaSession::hasWirelessPlaybackTargets(const HTMLMediaElement& element) const
    186 {
    187     UNUSED_PARAM(element);
    188 
    189     bool hasTargets = MediaSessionManager::sharedManager().hasWirelessTargetsAvailable();
    190     LOG(Media, "HTMLMediaSession::hasWirelessPlaybackTargets - returning %s", hasTargets ? "TRUE" : "FALSE");
    191 
    192     return hasTargets;
     202    m_haveRequestedPlaybackTargetPicker = true;
     203    element.document().showPlaybackTargetPicker(element);
     204}
     205
     206bool HTMLMediaSession::hasWirelessPlaybackTargets(const HTMLMediaElement&) const
     207{
     208#if PLATFORM(IOS)
     209    // FIXME: consolidate Mac and iOS implementations
     210    m_hasPlaybackTargets = MediaSessionManager::sharedManager().hasWirelessTargetsAvailable();
     211#endif
     212
     213    LOG(Media, "HTMLMediaSession::hasWirelessPlaybackTargets - returning %s", m_hasPlaybackTargets ? "TRUE" : "FALSE");
     214
     215    return m_hasPlaybackTargets;
    193216}
    194217
     
    245268
    246269    m_hasPlaybackTargetAvailabilityListeners = hasListeners;
     270
     271#if PLATFORM(IOS)
    247272    MediaSessionManager::sharedManager().configureWireLessTargetMonitoring();
     273#else
     274    element.document().configurePlaybackTargetMonitoring();
     275#endif
     276}
     277
     278void HTMLMediaSession::didChoosePlaybackTarget(MediaPlaybackTarget& device)
     279{
     280    m_haveRequestedPlaybackTargetPicker = false;
     281    client().setWirelessPlaybackTarget(device);
     282}
     283
     284void HTMLMediaSession::targetAvailabilityChangedTimerFired()
     285{
     286    client().wirelessRoutesAvailableDidChange();
     287}
     288
     289void HTMLMediaSession::externalOutputDeviceAvailableDidChange(bool hasTargets) const
     290{
     291    if (m_hasPlaybackTargets == hasTargets)
     292        return;
     293
     294    m_hasPlaybackTargets = hasTargets;
     295    if (!m_targetAvailabilityChangedTimer.isActive())
     296        m_targetAvailabilityChangedTimer.startOneShot(0);
     297}
     298
     299bool HTMLMediaSession::requiresPlaybackTargetRouteMonitoring() const
     300{
     301    return m_hasPlaybackTargetAvailabilityListeners;
    248302}
    249303#endif
  • trunk/Source/WebCore/html/HTMLMediaSession.h

    r180717 r181423  
    11/*
    2  * Copyright (C) 2014 Apple Inc. All rights reserved.
     2 * Copyright (C) 2014-2015 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3131#include "MediaPlayer.h"
    3232#include "MediaSession.h"
     33#include "Timer.h"
    3334
    3435namespace WebCore {
    3536
     37class Document;
    3638class HTMLMediaElement;
    3739class SourceBuffer;
     
    4244    virtual ~HTMLMediaSession() { }
    4345
     46    void registerWithDocument(Document&);
     47    void unregisterWithDocument(Document&);
     48
    4449    bool playbackPermitted(const HTMLMediaElement&) const;
    4550    bool dataLoadingPermitted(const HTMLMediaElement&) const;
     
    4752    bool pageAllowsDataLoading(const HTMLMediaElement&) const;
    4853    bool pageAllowsPlaybackAfterResuming(const HTMLMediaElement&) const;
     54
    4955#if ENABLE(WIRELESS_PLAYBACK_TARGET)
    5056    bool showingPlaybackTargetPickerPermitted(const HTMLMediaElement&) const;
    51 
    5257    bool currentPlaybackTargetIsWireless(const HTMLMediaElement&) const;
    5358    void showPlaybackTargetPicker(const HTMLMediaElement&);
     
    5964    void setHasPlaybackTargetAvailabilityListeners(const HTMLMediaElement&, bool);
    6065#endif
     66
    6167    bool requiresFullscreenForVideoPlayback(const HTMLMediaElement&) const;
    6268    WEBCORE_EXPORT bool allowsAlternateFullscreen(const HTMLMediaElement&) const;
     
    8894
    8995private:
    90     virtual bool requiresPlaybackTargetRouteMonitoring() const override { return m_hasPlaybackTargetAvailabilityListeners; }
     96
     97#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     98    void targetAvailabilityChangedTimerFired();
     99
     100    // MediaPlaybackTargetPickerClient
     101    virtual void didChoosePlaybackTarget(MediaPlaybackTarget&) override;
     102    virtual void externalOutputDeviceAvailableDidChange(bool) const override;
     103    virtual bool requiresPlaybackTargetRouteMonitoring() const override;
     104    virtual bool requestedPlaybackTargetPicker() const override { return m_haveRequestedPlaybackTargetPicker; }
     105#endif
    91106
    92107    BehaviorRestrictions m_restrictions;
    93     bool m_hasPlaybackTargetAvailabilityListeners;
     108
     109#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     110    mutable Timer m_targetAvailabilityChangedTimer;
     111    bool m_hasPlaybackTargetAvailabilityListeners { false };
     112    mutable bool m_hasPlaybackTargets { false };
     113    mutable bool m_haveRequestedPlaybackTargetPicker { false };
     114#endif
    94115};
    95116
  • trunk/Source/WebCore/page/ChromeClient.h

    r181408 r181423  
    448448    virtual void handleAutoFillButtonClick(HTMLInputElement&) { }
    449449
     450#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     451    virtual void showPlaybackTargetPicker(const WebCore::IntPoint&, bool) { }
     452    virtual void startingMonitoringPlaybackTargets() { }
     453    virtual void stopMonitoringPlaybackTargets() { }
     454#endif
     455
    450456protected:
    451457    virtual ~ChromeClient() { }
  • trunk/Source/WebCore/page/Page.cpp

    r180653 r181423  
    105105#endif
    106106
     107#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     108#include "HTMLVideoElement.h"
     109#include "MediaPlaybackTarget.h"
     110#include "MediaPlaybackTargetPickerClient.h"
     111#endif
     112
    107113namespace WebCore {
    108114
     
    16921698}
    16931699
     1700#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     1701void Page::showPlaybackTargetPicker(Document* document, const WebCore::IntPoint& location, bool isVideo)
     1702{
     1703
     1704    m_documentRequestingPlaybackTargetPicker = document;
     1705#if PLATFORM(IOS)
     1706    // FIXME: refactor iOS implementation.
     1707    UNUSED_PARAM(location);
     1708    chrome().client().showPlaybackTargetPicker(isVideo);
     1709#else
     1710    chrome().client().showPlaybackTargetPicker(location, isVideo);
     1711#endif
     1712}
     1713
     1714void Page::didChoosePlaybackTarget(MediaPlaybackTarget& target)
     1715{
     1716    Document* documentThatRequestedPicker = nullptr;
     1717
     1718    m_playbackTarget = std::make_unique<MediaPlaybackTarget>(target.devicePickerContext());
     1719    for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) {
     1720        Document* document = frame->document();
     1721        if (frame->document() == m_documentRequestingPlaybackTargetPicker) {
     1722            documentThatRequestedPicker = document;
     1723            continue;
     1724        }
     1725        frame->document()->didChoosePlaybackTarget(target);
     1726    }
     1727
     1728    if (documentThatRequestedPicker)
     1729        documentThatRequestedPicker->didChoosePlaybackTarget(target);
     1730
     1731    m_documentRequestingPlaybackTargetPicker = nullptr;
     1732}
     1733
     1734void Page::playbackTargetAvailabilityDidChange(bool available)
     1735{
     1736    m_hasWirelessPlaybackTarget = available;
     1737    for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext())
     1738        frame->document()->playbackTargetAvailabilityDidChange(available);
     1739}
     1740
     1741void Page::configurePlaybackTargetMonitoring()
     1742{
     1743    bool monitoringRequired = false;
     1744    for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) {
     1745        if (frame->document()->requiresPlaybackTargetRouteMonitoring()) {
     1746            monitoringRequired = true;
     1747            break;
     1748        }
     1749    }
     1750
     1751    if (m_requiresPlaybackTargetMonitoring == monitoringRequired)
     1752        return;
     1753    m_requiresPlaybackTargetMonitoring = monitoringRequired;
     1754
     1755
     1756    if (monitoringRequired)
     1757        chrome().client().startingMonitoringPlaybackTargets();
     1758    else
     1759        chrome().client().stopMonitoringPlaybackTargets();
     1760}
     1761#endif
     1762
    16941763} // namespace WebCore
  • trunk/Source/WebCore/page/Page.h

    r180301 r181423  
    7777class FrameLoaderClient;
    7878class HistoryItem;
     79class HTMLMediaElement;
    7980class UserInputBridge;
    8081class InspectorClient;
     
    8283class MainFrame;
    8384class MediaCanStartListener;
     85class MediaPlaybackTarget;
    8486class PageConfiguration;
    8587class PageConsoleClient;
     
    423425    WEBCORE_EXPORT void setMuted(bool);
    424426
     427#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     428    void showPlaybackTargetPicker(Document*, const WebCore::IntPoint&, bool);
     429    bool hasWirelessPlaybackTarget() const { return m_hasWirelessPlaybackTarget; }
     430    MediaPlaybackTarget& playbackTarget() const { return *m_playbackTarget.get(); }
     431    void configurePlaybackTargetMonitoring();
     432
     433    WEBCORE_EXPORT void didChoosePlaybackTarget(MediaPlaybackTarget&);
     434    WEBCORE_EXPORT void playbackTargetAvailabilityDidChange(bool);
     435#endif
     436
    425437private:
    426438    WEBCORE_EXPORT void initGroup();
     
    582594    SessionID m_sessionID;
    583595
     596#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     597    Document* m_documentRequestingPlaybackTargetPicker { nullptr };
     598    std::unique_ptr<MediaPlaybackTarget> m_playbackTarget;
     599    bool m_requiresPlaybackTargetMonitoring { false };
     600    bool m_hasWirelessPlaybackTarget { false };
     601#endif
     602
    584603    bool m_isClosing;
    585604
  • trunk/Source/WebCore/platform/audio/MediaSession.cpp

    r180274 r181423  
    11/*
    2  * Copyright (C) 2014 Apple Inc. All rights reserved.
     2 * Copyright (C) 2014-2015 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    191191void MediaSession::clientDataBufferingTimerFired()
    192192{
    193     LOG(Media, "MediaSession::visibilityChanged(%p)- visible = %s", this, m_client.elementIsHidden() ? "false" : "true");
     193    LOG(Media, "MediaSession::clientDataBufferingTimerFired(%p)- visible = %s", this, m_client.elementIsHidden() ? "false" : "true");
    194194
    195195    updateClientDataBuffering();
     
    221221}
    222222
    223 void MediaSession::wirelessRoutesAvailableDidChange() const
    224 {
    225     m_client.wirelessRoutesAvailableDidChange();
    226 }
    227 
    228223String MediaSessionClient::mediaSessionTitle() const
    229224{
  • trunk/Source/WebCore/platform/audio/MediaSession.h

    r179869 r181423  
    11/*
    2  * Copyright (C) 2014 Apple Inc. All rights reserved.
     2 * Copyright (C) 2014-2015 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3131#include <wtf/text/WTFString.h>
    3232
     33#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     34#include "MediaPlaybackTargetPickerClient.h"
     35#endif
     36
    3337namespace WebCore {
    3438
     39class MediaPlaybackTarget;
    3540class MediaSessionClient;
    3641
    37 class MediaSession {
     42class MediaSession
     43#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     44    : public MediaPlaybackTargetPickerClient
     45#endif
     46{
    3847public:
    3948    static std::unique_ptr<MediaSession> create(MediaSessionClient&);
     
    100109    void didReceiveRemoteControlCommand(RemoteControlCommandType);
    101110
    102     virtual bool requiresPlaybackTargetRouteMonitoring() const { return false; }
    103     void wirelessRoutesAvailableDidChange() const;
    104 
    105111    enum DisplayType {
    106112        Normal,
     
    111117
    112118    bool isHidden() const;
     119
     120#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     121    // MediaPlaybackTargetPickerClient
     122    virtual void didChoosePlaybackTarget(MediaPlaybackTarget&) override { }
     123    virtual void externalOutputDeviceAvailableDidChange(bool) const override { }
     124    virtual bool requiresPlaybackTargetRouteMonitoring() const override { return false; }
     125    virtual bool requestedPlaybackTargetPicker() const override { return false; }
     126#endif
    113127
    114128protected:
     
    151165    virtual bool overrideBackgroundPlaybackRestriction() const = 0;
    152166
     167#if ENABLE(WIRELESS_PLAYBACK_TARGET)
    153168    virtual void wirelessRoutesAvailableDidChange() { }
     169    virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&) { }
     170#endif
    154171
    155172protected:
  • trunk/Source/WebCore/platform/audio/MediaSessionManager.cpp

    r180274 r181423  
    11/*
    2  * Copyright (C) 2013-2014 Apple Inc. All rights reserved.
     2 * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    286286}
    287287
    288 void MediaSessionManager::wirelessRoutesAvailableChanged()
    289 {
    290     LOG(Media, "MediaSessionManager::wirelessRoutesAvailableChanged");
    291     Vector<MediaSession*> sessions = m_sessions;
    292     for (auto* session : sessions)
    293         session->wirelessRoutesAvailableDidChange();
    294 }
    295 
    296288#if !PLATFORM(COCOA)
    297289void MediaSessionManager::updateSessionState()
  • trunk/Source/WebCore/platform/audio/MediaSessionManager.h

    r180416 r181423  
    11/*
    2  * Copyright (C) 2013-2014 Apple Inc. All rights reserved.
     2 * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    5555    WEBCORE_EXPORT void applicationWillEnterForeground() const;
    5656    WEBCORE_EXPORT void applicationWillEnterBackground() const;
    57     void wirelessRoutesAvailableChanged();
    5857
    5958    enum SessionRestrictionFlags {
     
    8079    virtual bool sessionCanLoadMedia(const MediaSession&) const;
    8180
     81#if PLATFORM(IOS)
    8282    virtual void configureWireLessTargetMonitoring() { }
    83 
    84 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
    8583    virtual bool hasWirelessTargetsAvailable() { return false; }
    8684#endif
  • trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.h

    r180416 r181423  
    11/*
    2  * Copyright (C) 2014 Apple Inc. All rights reserved.
     2 * Copyright (C) 2014-2015 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    4646    virtual ~MediaSessionManageriOS();
    4747
     48    void externalOutputDeviceAvailableDidChange();
     49    virtual bool hasWirelessTargetsAvailable() override;
     50
    4851private:
    4952    friend class MediaSessionManager;
     53
     54    MediaSessionManageriOS();
    5055
    5156    virtual void sessionWillBeginPlayback(MediaSession&) override;
     
    5661    virtual void resetRestrictions() override;
    5762
    58 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
    59     virtual bool hasWirelessTargetsAvailable() override;
    6063    virtual void configureWireLessTargetMonitoring() override;
    61 #endif
    6264
    6365    virtual bool sessionCanLoadMedia(const MediaSession&) const override;
    64 
    65     MediaSessionManageriOS();
     66   
    6667    RetainPtr<WebMediaSessionHelper> m_objcObserver;
    6768};
  • trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm

    r180416 r181423  
    11/*
    2  * Copyright (C) 2014 Apple Inc. All rights reserved.
     2 * Copyright (C) 2014-2015 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    160160}
    161161
    162 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
    163162bool MediaSessionManageriOS::hasWirelessTargetsAvailable()
    164163{
     
    185184        [m_objcObserver stopMonitoringAirPlayRoutes];
    186185}
    187 #endif
    188    
     186
    189187void MediaSessionManageriOS::sessionWillBeginPlayback(MediaSession& session)
    190188{
     
    232230{
    233231    return session.state() == MediaSession::Playing || !session.isHidden() || session.displayType() == MediaSession::Optimized;
     232}
     233
     234void MediaSessionManageriOS::externalOutputDeviceAvailableDidChange()
     235{
     236    Vector<MediaSession*> sessionList = sessions();
     237    bool haveTargets = [m_objcObserver hasWirelessTargetsAvailable];
     238    for (auto* session : sessionList)
     239        session->externalOutputDeviceAvailableDidChange(haveTargets);
    234240}
    235241
     
    446452            return;
    447453
    448         _callback->wirelessRoutesAvailableChanged();
     454        _callback->externalOutputDeviceAvailableDidChange();
    449455    });
    450456}
  • trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp

    r181153 r181423  
    868868    m_client.mediaPlayerCurrentPlaybackTargetIsWirelessChanged(this);
    869869}
     870
     871void MediaPlayer::setWirelessPlaybackTarget(const MediaPlaybackTarget& device)
     872{
     873    m_private->setWirelessPlaybackTarget(device);
     874}
    870875#endif
    871876
  • trunk/Source/WebCore/platform/graphics/MediaPlayer.h

    r181153 r181423  
    7272class AudioSourceProvider;
    7373class AuthenticationChallenge;
     74class MediaPlaybackTarget;
    7475#if ENABLE(MEDIA_SOURCE)
    7576class MediaSourcePrivateClient;
     
    477478    void currentPlaybackTargetIsWirelessChanged();
    478479    void playbackTargetAvailabilityChanged();
     480
     481    void setWirelessPlaybackTarget(const MediaPlaybackTarget&);
    479482#endif
    480483
  • trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h

    r181153 r181423  
    3737class IntRect;
    3838class IntSize;
     39class MediaPlaybackTarget;
    3940class PlatformTextTrack;
    4041
     
    167168    virtual bool wirelessVideoPlaybackDisabled() const { return false; }
    168169    virtual void setWirelessVideoPlaybackDisabled(bool) { }
     170
     171    virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&) { }
    169172#endif
    170173
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h

    r181006 r181423  
    3535OBJC_CLASS AVAssetResourceLoadingRequest;
    3636OBJC_CLASS AVMediaSelectionGroup;
     37OBJC_CLASS AVOutputDevicePickerContext;
    3738OBJC_CLASS AVPlayer;
    3839OBJC_CLASS AVPlayerItem;
     
    6061namespace WebCore {
    6162
    62 class WebCoreAVFResourceLoader;
     63class AudioSourceProviderAVFObjC;
     64class AudioTrackPrivateAVFObjC;
    6365class InbandMetadataTextTrackPrivateAVF;
    6466class InbandTextTrackPrivateAVFObjC;
    65 class AudioSourceProviderAVFObjC;
    66 class AudioTrackPrivateAVFObjC;
     67class MediaPlaybackTarget;
    6768class MediaSelectionGroupAVFObjC;
    6869class VideoTrackPrivateAVFObjC;
     70class WebCoreAVFResourceLoader;
    6971
    7072class MediaPlayerPrivateAVFoundationObjC : public MediaPlayerPrivateAVFoundation {
     
    275277    virtual MediaPlayer::WirelessPlaybackTargetType wirelessPlaybackTargetType() const override;
    276278    virtual bool wirelessVideoPlaybackDisabled() const override;
     279#if !PLATFORM(IOS)
     280    virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&) override;
     281#endif
    277282    virtual void setWirelessVideoPlaybackDisabled(bool) override;
    278283    void updateDisableExternalPlayback();
     
    344349#if ENABLE(DATACUE_VALUE)
    345350    RefPtr<InbandMetadataTextTrackPrivateAVF> m_metadataTrack;
     351#endif
     352
     353#if PLATFORM(MAC) && ENABLE(WIRELESS_PLAYBACK_TARGET)
     354    RetainPtr<AVOutputDevicePickerContext> m_outputDevicePickerContext;
    346355#endif
    347356
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm

    r181036 r181423  
    4747#import "URL.h"
    4848#import "Logging.h"
     49#import "MediaPlaybackTarget.h"
    4950#import "MediaSelectionGroupAVFObjC.h"
    5051#import "MediaTimeAVFoundation.h"
     
    136137@end
    137138
     139#if PLATFORM(MAC) && ENABLE(WIRELESS_PLAYBACK_TARGET)
     140typedef AVOutputDevicePickerContext AVOutputDevicePickerContextType;
     141
     142@interface AVPlayer (WebKitExtensions)
     143@property (nonatomic) AVOutputDevicePickerContext *outputDevicePickerContext;
     144@end
     145#endif
     146
    138147typedef AVPlayer AVPlayerType;
    139148typedef AVPlayerItem AVPlayerItemType;
     
    547556#if ENABLE(WIRELESS_PLAYBACK_TARGET)
    548557        [m_avPlayer.get() removeObserver:m_objcObserver.get() forKeyPath:@"externalPlaybackActive"];
     558        [m_avPlayer.get() removeObserver:m_objcObserver.get() forKeyPath:@"outputDevicePickerContext"];
    549559#endif
    550560        m_avPlayer = nil;
     
    928938#if ENABLE(WIRELESS_PLAYBACK_TARGET)
    929939    [m_avPlayer.get() addObserver:m_objcObserver.get() forKeyPath:@"externalPlaybackActive" options:NSKeyValueObservingOptionNew context:(void *)MediaPlayerAVFoundationObservationContextPlayer];
     940    [m_avPlayer.get() addObserver:m_objcObserver.get() forKeyPath:@"outputDevicePickerContext" options:NSKeyValueObservingOptionNew context:(void *)MediaPlayerAVFoundationObservationContextPlayer];
     941#endif
     942
     943#if ENABLE(WIRELESS_PLAYBACK_TARGET)
    930944    updateDisableExternalPlayback();
    931945#endif
     
    937951#if ENABLE(WIRELESS_PLAYBACK_TARGET)
    938952    [m_avPlayer.get() setAllowsExternalPlayback:m_allowsWirelessVideoPlayback];
     953#endif
     954
     955#if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS)
     956    if (m_outputDevicePickerContext)
     957        m_avPlayer.get().outputDevicePickerContext = m_outputDevicePickerContext.get();
    939958#endif
    940959
     
    11351154        [m_videoFullscreenLayer addSublayer:m_textTrackRepresentationLayer.get()];
    11361155    }
    1137 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
     1156
    11381157    updateDisableExternalPlayback();
    1139 #endif
    11401158}
    11411159
     
    26882706        return false;
    26892707
    2690     bool wirelessTarget = [m_avPlayer.get() isExternalPlaybackActive];
     2708    bool wirelessTarget = m_avPlayer.get().externalPlaybackActive;
    26912709    LOG(Media, "MediaPlayerPrivateAVFoundationObjC::isCurrentPlaybackTargetWireless(%p) - returning %s", this, boolString(wirelessTarget));
     2710
    26922711    return wirelessTarget;
    26932712}
     
    26982717        return MediaPlayer::TargetTypeNone;
    26992718
     2719#if PLATFORM(IOS)
    27002720    switch (wkExernalDeviceTypeForPlayer(m_avPlayer.get())) {
    27012721    case wkExternalPlaybackTypeNone:
     
    27092729    ASSERT_NOT_REACHED();
    27102730    return MediaPlayer::TargetTypeNone;
     2731
     2732#else
     2733    return MediaPlayer::TargetTypeAirPlay;
     2734#endif
    27112735}
    27122736
     
    27262750    if (!m_avPlayer)
    27272751        return !m_allowsWirelessVideoPlayback;
    2728    
     2752
    27292753    m_allowsWirelessVideoPlayback = [m_avPlayer.get() allowsExternalPlayback];
    27302754    LOG(Media, "MediaPlayerPrivateAVFoundationObjC::wirelessVideoPlaybackDisabled(%p) - returning %s", this, boolString(!m_allowsWirelessVideoPlayback));
     
    27392763    if (!m_avPlayer)
    27402764        return;
    2741    
     2765
    27422766    [m_avPlayer.get() setAllowsExternalPlayback:!disabled];
    27432767}
    27442768
     2769#if !PLATFORM(IOS)
     2770void MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget(const MediaPlaybackTarget& target)
     2771{
     2772    m_outputDevicePickerContext = target.devicePickerContext();
     2773
     2774    LOG(Media, "MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget(%p) - target = %p", this, m_outputDevicePickerContext.get());
     2775
     2776    if (!m_avPlayer)
     2777        return;
     2778
     2779    m_avPlayer.get().outputDevicePickerContext = m_outputDevicePickerContext.get();
     2780}
     2781#endif
     2782
    27452783void MediaPlayerPrivateAVFoundationObjC::updateDisableExternalPlayback()
    27462784{
     
    27482786        return;
    27492787
     2788#if PLATFORM(IOS)
    27502789    [m_avPlayer setUsesExternalPlaybackWhileExternalScreenIsActive:m_videoFullscreenLayer != nil];
     2790#endif
    27512791}
    27522792#endif
     
    31703210        else if ([keyPath isEqualToString:@"externalPlaybackActive"])
    31713211            function = WTF::bind(&MediaPlayerPrivateAVFoundationObjC::playbackTargetIsWirelessDidChange, m_callback);
     3212        else if ([keyPath isEqualToString:@"outputDevicePickerContext"])
     3213            function = WTF::bind(&MediaPlayerPrivateAVFoundationObjC::playbackTargetIsWirelessDidChange, m_callback);
    31723214#endif
    31733215    }
  • trunk/Source/WebCore/testing/InternalSettings.cpp

    r181285 r181423  
    9898    , m_touchEventEmulationEnabled(settings.isTouchEventEmulationEnabled())
    9999#endif
     100#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     101    , m_mediaPlaybackAllowsAirPlay(settings.mediaPlaybackAllowsAirPlay())
     102#endif
    100103{
    101104}
     
    202205    , m_backup(page->settings())
    203206{
     207#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     208    page->settings().setMediaPlaybackAllowsAirPlay(false);
     209#endif
    204210}
    205211
  • trunk/Source/WebCore/testing/InternalSettings.h

    r181285 r181423  
    9696        bool m_touchEventEmulationEnabled;
    9797#endif
     98#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     99        bool m_mediaPlaybackAllowsAirPlay;
     100#endif
    98101    };
    99102
  • trunk/Source/WebKit2/ChangeLog

    r181410 r181423  
     12015-03-11  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [Mac] Update AirPlay handling
     4        https://bugs.webkit.org/show_bug.cgi?id=142541
     5
     6        Reviewed by Sam Weinig.
     7
     8        * Shared/WebCoreArgumentCoders.h:
     9        * Shared/mac/WebCoreArgumentCodersMac.mm:
     10        (IPC::ArgumentCoder<AVPlaybackTarget>::encode):
     11        (IPC::ArgumentCoder<AVPlaybackTarget>::decode):
     12        * UIProcess/PageClient.h:
     13        * UIProcess/WebAVPlaybackTargetPickerProxy.cpp: Added.
     14        (WebKit::WebAVPlaybackTargetPickerProxy::WebAVPlaybackTargetPickerProxy):
     15        (WebKit::WebAVPlaybackTargetPickerProxy::~WebAVPlaybackTargetPickerProxy):
     16        (WebKit::WebAVPlaybackTargetPickerProxy::showPlaybackTargetPicker):
     17        (WebKit::WebAVPlaybackTargetPickerProxy::startingMonitoringPlaybackTargets):
     18        (WebKit::WebAVPlaybackTargetPickerProxy::stopMonitoringPlaybackTargets):
     19        * UIProcess/WebAVPlaybackTargetPickerProxy.h: Added.
     20        (WebKit::WebAVPlaybackTargetPickerProxy::Client::~Client):
     21        * UIProcess/WebPageProxy.cpp:
     22        (WebKit::WebPageProxy::devicePickerProxy):
     23        (WebKit::WebPageProxy::showPlaybackTargetPicker):
     24        (WebKit::WebPageProxy::startingMonitoringPlaybackTargets):
     25        (WebKit::WebPageProxy::stopMonitoringPlaybackTargets):
     26        (WebKit::WebPageProxy::didChoosePlaybackTarget):
     27        (WebKit::WebPageProxy::externalOutputDeviceAvailableDidChange):
     28        * UIProcess/WebPageProxy.h:
     29        * UIProcess/WebPageProxy.messages.in:
     30        * UIProcess/mac/PageClientImpl.h:
     31        * UIProcess/mac/PageClientImpl.mm:
     32        (WebKit::PageClientImpl::createPlaybackTargetPicker):
     33        * UIProcess/mac/WebAVPlaybackTargetPickerProxyMac.h: Added.
     34        * UIProcess/mac/WebAVPlaybackTargetPickerProxyMac.mm: Added.
     35        (WebKit::WebAVPlaybackTargetPickerProxyMac::create):
     36        (WebKit::WebAVPlaybackTargetPickerProxyMac::WebAVPlaybackTargetPickerProxyMac):
     37        (WebKit::WebAVPlaybackTargetPickerProxyMac::~WebAVPlaybackTargetPickerProxyMac):
     38        (WebKit::WebAVPlaybackTargetPickerProxyMac::outputeDeviceAvailabilityChangedTimerFired):
     39        (WebKit::WebAVPlaybackTargetPickerProxyMac::availableDevicesDidChange):
     40        (WebKit::WebAVPlaybackTargetPickerProxyMac::devicePicker):
     41        (WebKit::WebAVPlaybackTargetPickerProxyMac::showPlaybackTargetPicker):
     42        (WebKit::WebAVPlaybackTargetPickerProxyMac::currentDeviceDidChange):
     43        (WebKit::WebAVPlaybackTargetPickerProxyMac::startingMonitoringPlaybackTargets):
     44        (WebKit::WebAVPlaybackTargetPickerProxyMac::stopMonitoringPlaybackTargets):
     45        (-[WebAVOutputDevicePickerMenuControllerHelper initWithCallback:]):
     46        (-[WebAVOutputDevicePickerMenuControllerHelper clearCallback]):
     47        (-[WebAVOutputDevicePickerMenuControllerHelper observeValueForKeyPath:ofObject:change:context:]):
     48        * WebKit2.xcodeproj/project.pbxproj:
     49        * WebProcess/WebCoreSupport/WebAVPlaybackTargetPicker.cpp: Added.
     50        (WebKit::WebAVPlaybackTargetPicker::WebAVPlaybackTargetPicker):
     51        (WebKit::WebAVPlaybackTargetPicker::showPlaybackDevicePicker):
     52        (WebKit::WebAVPlaybackTargetPicker::configureWireLessTargetMonitoring):
     53        (WebKit::WebAVPlaybackTargetPicker::addClient):
     54        (WebKit::WebAVPlaybackTargetPicker::removeClient):
     55        (WebKit::WebAVPlaybackTargetPicker::didChoosePlaybackTarget):
     56        (WebKit::WebAVPlaybackTargetPicker::playbackTargetAvailabilityDidChange):
     57        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
     58        (WebKit::WebChromeClient::showPlaybackTargetPicker):
     59        (WebKit::WebChromeClient::startingMonitoringPlaybackTargets):
     60        (WebKit::WebChromeClient::stopMonitoringPlaybackTargets):
     61        * WebProcess/WebCoreSupport/WebChromeClient.h:
     62        * WebProcess/WebPage/WebPage.h:
     63        * WebProcess/WebPage/WebPage.messages.in:
     64        * WebProcess/WebPage/mac/WebPageMac.mm:
     65        (WebKit::WebPage::playbackTargetSelected):
     66        (WebKit::WebPage::playbackTargetAvailabilityDidChange):
     67        * WebProcess/com.apple.WebProcess.sb.in:
     68
    1692015-03-11  Myles C. Maxfield  <mmaxfield@apple.com>
    270
  • trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h

    r180985 r181423  
    116116#endif
    117117
     118#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     119namespace WebCore {
     120class MediaPlaybackTarget;
     121}
     122#endif
     123
    118124namespace IPC {
    119125
     
    455461};
    456462
     463#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     464template<> struct ArgumentCoder<WebCore::MediaPlaybackTarget> {
     465    static void encode(ArgumentEncoder&, const WebCore::MediaPlaybackTarget&);
     466    static bool decode(ArgumentDecoder&, WebCore::MediaPlaybackTarget&);
     467};
     468#endif
     469
    457470} // namespace IPC
    458471
  • trunk/Source/WebKit2/Shared/mac/WebCoreArgumentCodersMac.mm

    r180985 r181423  
    3939#import <WebCore/ResourceError.h>
    4040#import <WebCore/ResourceRequest.h>
     41#import <WebCore/SoftLinking.h>
     42#import <objc/runtime.h>
    4143
    4244#if USE(CFNETWORK)
    4345#import <CFNetwork/CFURLRequest.h>
     46#endif
     47
     48#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     49#import <WebCore/MediaPlaybackTarget.h>
    4450#endif
    4551
     
    433439}
    434440
     441#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     442void ArgumentCoder<MediaPlaybackTarget>::encode(ArgumentEncoder& encoder, const MediaPlaybackTarget& target)
     443{
     444    RetainPtr<NSMutableData> data = adoptNS([[NSMutableData alloc] init]);
     445    RetainPtr<NSKeyedArchiver> archiver = adoptNS([[NSKeyedArchiver alloc] initForWritingWithMutableData:data.get()]);
     446    [archiver setRequiresSecureCoding:YES];
     447    target.encode(archiver.get());
     448    [archiver finishEncoding];
     449    IPC::encode(encoder, reinterpret_cast<CFDataRef>(data.get()));
     450}
     451
     452bool ArgumentCoder<MediaPlaybackTarget>::decode(ArgumentDecoder& decoder, MediaPlaybackTarget& target)
     453{
     454    RetainPtr<CFDataRef> data;
     455    if (!IPC::decode(decoder, data))
     456        return false;
     457
     458    RetainPtr<NSKeyedUnarchiver> unarchiver = adoptNS([[NSKeyedUnarchiver alloc] initForReadingWithData:(NSData *)data.get()]);
     459    [unarchiver setRequiresSecureCoding:YES];
     460    if (!MediaPlaybackTarget::decode(unarchiver.get(), target))
     461        return false;
     462   
     463    [unarchiver finishDecoding];
     464    return true;
     465}
     466#endif
     467
    435468} // namespace IPC
  • trunk/Source/WebKit2/UIProcess/PageClient.h

    r181023 r181423  
    3535#include <wtf/Forward.h>
    3636
     37#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     38#include "WebMediaPlaybackTargetPickerProxy.h"
     39#endif
     40
    3741#if PLATFORM(COCOA)
    3842#include "PluginComplexTextInputState.h"
     
    314318    virtual void didPerformActionMenuHitTest(const ActionMenuHitTestResult&, bool forImmediateAction, API::Object*) = 0;
    315319#endif
     320
     321#if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS)
     322    virtual std::unique_ptr<WebMediaPlaybackTargetPickerProxy> createPlaybackTargetPicker(WebPageProxy*) = 0;
     323#endif
     324
    316325};
    317326
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r181408 r181423  
    55985598}
    55995599
     5600#if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS)
     5601
     5602WebMediaPlaybackTargetPickerProxy& WebPageProxy::devicePickerProxy()
     5603{
     5604    if (!m_playbackTargetPicker)
     5605        m_playbackTargetPicker = m_pageClient.createPlaybackTargetPicker(this);
     5606
     5607    return *m_playbackTargetPicker.get();
     5608}
     5609
     5610void WebPageProxy::showPlaybackTargetPicker(const WebCore::FloatRect& rect, bool hasVideo)
     5611{
     5612    devicePickerProxy().showPlaybackTargetPicker(m_pageClient.rootViewToScreen(IntRect(rect)), hasVideo);
     5613}
     5614
     5615void WebPageProxy::startingMonitoringPlaybackTargets()
     5616{
     5617    devicePickerProxy().startingMonitoringPlaybackTargets();
     5618}
     5619
     5620void WebPageProxy::stopMonitoringPlaybackTargets()
     5621{
     5622    devicePickerProxy().stopMonitoringPlaybackTargets();
     5623}
     5624
     5625void WebPageProxy::didChoosePlaybackTarget(const WebCore::MediaPlaybackTarget& target)
     5626{
     5627    if (!isValid())
     5628        return;
     5629
     5630    m_process->send(Messages::WebPage::PlaybackTargetSelected(target), m_pageID);
     5631}
     5632
     5633void WebPageProxy::externalOutputDeviceAvailableDidChange(bool available)
     5634{
     5635    if (!isValid())
     5636        return;
     5637
     5638    m_process->send(Messages::WebPage::PlaybackTargetAvailabilityDidChange(available), m_pageID);
     5639}
     5640
     5641#endif
     5642
    56005643} // namespace WebKit
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r181408 r181423  
    112112#endif
    113113
     114#if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS)
     115#include "WebMediaPlaybackTargetPickerProxy.h"
     116#endif
     117
    114118namespace API {
    115119class ContextMenuClient;
     
    258262#if ENABLE(INPUT_TYPE_COLOR)
    259263    , public WebColorPicker::Client
     264#endif
     265#if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS)
     266    , public WebMediaPlaybackTargetPickerProxy::Client
    260267#endif
    261268    , public WebPopupMenuProxy::Client
     
    10001007    void logDiagnosticMessageWithValue(const String& message, const String& description, const String& value, bool shouldSample);
    10011008
     1009#if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS)
     1010    WebMediaPlaybackTargetPickerProxy& devicePickerProxy();
     1011    void showPlaybackTargetPicker(const WebCore::FloatRect&, bool hasVideo);
     1012    void startingMonitoringPlaybackTargets();
     1013    void stopMonitoringPlaybackTargets();
     1014
     1015    // WebMediaPlaybackTargetPickerProxy::Client
     1016    virtual void didChoosePlaybackTarget(const WebCore::MediaPlaybackTarget&) override;
     1017    virtual void externalOutputDeviceAvailableDidChange(bool) override;
     1018#endif
     1019
    10021020private:
    10031021    WebPageProxy(PageClient&, WebProcessProxy&, uint64_t pageID, const WebPageConfiguration&);
     
    16651683    Vector<uint64_t> m_nextViewStateChangeCallbacks;
    16661684
     1685#if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS)
     1686    std::unique_ptr<WebMediaPlaybackTargetPickerProxy> m_playbackTargetPicker;
     1687#endif
     1688
    16671689    bool m_isPlayingAudio;
    16681690};
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in

    r181408 r181423  
    426426
    427427    HandleAutoFillButtonClick(WebKit::UserData userData);
     428
     429#if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS)
     430    ShowPlaybackTargetPicker(WebCore::FloatRect pickerLocation, bool hasVideo)
     431    StartingMonitoringPlaybackTargets()
     432    StopMonitoringPlaybackTargets()
     433#endif
     434
    428435}
Note: See TracChangeset for help on using the changeset viewer.