https://bugs.webkit.org/show_bug.cgi?id=129723
Reviewed by Jer Noble.
Source/WebCore:
Make the name and type of the external device available to the JS based controls.
* Modules/mediacontrols/MediaControlsHost.cpp:
(WebCore::MediaControlsHost::externalDeviceDisplayName):
(WebCore::MediaControlsHost::externalDeviceType):
* Modules/mediacontrols/MediaControlsHost.h:
* Modules/mediacontrols/MediaControlsHost.idl:
* Modules/mediacontrols/mediaControlsiOS.js:
(ControllerIOS.prototype.updateWirelessPlaybackStatus): Display device type-specific infomation
in the placeholder image.
* WebCore.exp.in: Export new WebKitSystemInterface functions.
* platform/graphics/MediaPlayer.cpp:
(WebCore::MediaPlayer::wirelessPlaybackTargetName): Added.
(WebCore::MediaPlayer::wirelessPlaybackTargetType): Ditto.
* platform/graphics/MediaPlayer.h:
* platform/graphics/MediaPlayerPrivate.h:
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::MediaPlayerPrivateAVFoundationObjC::wirelessPlaybackTargetType): Added.
(WebCore::MediaPlayerPrivateAVFoundationObjC::wirelessPlaybackTargetName): Ditto.
* platform/ios/WebCoreSystemInterfaceIOS.mm:
* platform/mac/WebCoreSystemInterface.h:
* platform/mac/WebCoreSystemInterface.mm:
Source/WebKit/mac:
* WebCoreSupport/WebSystemInterface.mm:
(InitWebCoreSystemInterface):
WebKitLibraries:
* WebKitSystemInterface.h:
* libWebKitSystemInterfaceLion.a:
* libWebKitSystemInterfaceMavericks.a:
* libWebKitSystemInterfaceMountainLion.a:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@165125
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2014-03-05 Eric Carlson <eric.carlson@apple.com>
+
+ [iOS] Show external device name/type in placeholder
+ https://bugs.webkit.org/show_bug.cgi?id=129723
+
+ Reviewed by Jer Noble.
+
+ Make the name and type of the external device available to the JS based controls.
+ * Modules/mediacontrols/MediaControlsHost.cpp:
+ (WebCore::MediaControlsHost::externalDeviceDisplayName):
+ (WebCore::MediaControlsHost::externalDeviceType):
+ * Modules/mediacontrols/MediaControlsHost.h:
+ * Modules/mediacontrols/MediaControlsHost.idl:
+
+ * Modules/mediacontrols/mediaControlsiOS.js:
+ (ControllerIOS.prototype.updateWirelessPlaybackStatus): Display device type-specific infomation
+ in the placeholder image.
+
+ * WebCore.exp.in: Export new WebKitSystemInterface functions.
+
+ * platform/graphics/MediaPlayer.cpp:
+ (WebCore::MediaPlayer::wirelessPlaybackTargetName): Added.
+ (WebCore::MediaPlayer::wirelessPlaybackTargetType): Ditto.
+ * platform/graphics/MediaPlayer.h:
+ * platform/graphics/MediaPlayerPrivate.h:
+
+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::wirelessPlaybackTargetType): Added.
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::wirelessPlaybackTargetName): Ditto.
+
+ * platform/ios/WebCoreSystemInterfaceIOS.mm:
+ * platform/mac/WebCoreSystemInterface.h:
+ * platform/mac/WebCoreSystemInterface.mm:
+
2014-03-05 Benjamin Poulain <bpoulain@apple.com>
[iOS] Rename the various VisibleExtent variations to exposedContentRect
/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
#include "CaptionUserPreferences.h"
#include "Element.h"
#include "HTMLMediaElement.h"
+#include "Logging.h"
#include "MediaControlElements.h"
#include "Page.h"
#include "PageGroup.h"
return !m_mediaElement->mediaSession().playbackPermitted(*m_mediaElement);
}
+String MediaControlsHost::externalDeviceDisplayName() const
+{
+#if ENABLE(IOS_AIRPLAY)
+ MediaPlayer* player = m_mediaElement->player();
+ if (!player) {
+ LOG(Media, "MediaControlsHost::externalDeviceDisplayName - returning \"\" because player is NULL");
+ return emptyString();
+ }
+
+ String name = player->wirelessPlaybackTargetName();
+ LOG(Media, "MediaControlsHost::externalDeviceDisplayName - returning \"%s\"", name.utf8().data());
+
+ return name;
+#else
+ return emptyString();
+#endif
+}
+
+String MediaControlsHost::externalDeviceType() const
+{
+ DEFINE_STATIC_LOCAL(String, none, (ASCIILiteral("none")));
+ String type = none;
+
+#if ENABLE(IOS_AIRPLAY)
+ DEFINE_STATIC_LOCAL(String, airplay, (ASCIILiteral("airplay")));
+ DEFINE_STATIC_LOCAL(String, tvout, (ASCIILiteral("tvout")));
+
+ MediaPlayer* player = m_mediaElement->player();
+ if (!player) {
+ LOG(Media, "MediaControlsHost::externalDeviceType - returning \"none\" because player is NULL");
+ return none;
+ }
+
+ switch (player->wirelessPlaybackTargetType()) {
+ case MediaPlayer::TargetTypeNone:
+ type = none;
+ break;
+ case MediaPlayer::TargetTypeAirPlay:
+ type = airplay;
+ break;
+ case MediaPlayer::TargetTypeTVOut:
+ type = tvout;
+ break;
+ }
+#endif
+
+ LOG(Media, "MediaControlsHost::externalDeviceType - returning \"%s\"", type.utf8().data());
+
+ return type;
+}
+
}
#endif
/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
bool supportsFullscreen();
bool userGestureRequired() const;
+ String externalDeviceDisplayName() const;
+ String externalDeviceType() const;
+
private:
MediaControlsHost(HTMLMediaElement*);
/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+enum DeviceType {
+ "none",
+ "airplay",
+ "tvout"
+};
+
[
NoInterfaceObject,
Conditional=MEDIA_CONTROLS_SCRIPT,
readonly attribute boolean mediaPlaybackAllowsInline;
readonly attribute boolean supportsFullscreen;
readonly attribute boolean userGestureRequired;
+
+ readonly attribute DOMString externalDeviceDisplayName;
+ readonly attribute DeviceType externalDeviceType;
};
},
localizedStrings: {
// FIXME: Move localization to ext strings file <http://webkit.org/b/120956>
- '##DEVICE_TYPE##': 'AirPlay',
- '##DEVICE_NAME##': 'This video is playing on "##DEVICE_NAME##".',
+ '##AIRPLAY_DEVICE_TYPE##': 'AirPlay',
+ '##AIRPLAY_DEVICE_NAME##': 'This video is playing on "##DEVICE_NAME##".',
+
+ '##TVOUT_DEVICE_TYPE##': 'TV Connected',
+ '##TVOUT_DEVICE_NAME##': 'This video is playing on the TV.',
},
shouldHaveStartPlaybackButton: function() {
if (this.currentPlaybackTargetIsWireless()) {
var backgroundImageSVG = "url('" + ControllerIOS.gWirelessImage + "')";
- var deviceType = this.UIString('##DEVICE_TYPE##');
+ var deviceName = "";
+ var deviceType = "";
+ var type = this.host.externalDeviceType;
+ if (type == "airplay") {
+ deviceType = this.UIString('##AIRPLAY_DEVICE_TYPE##');
+ deviceName = this.UIString('##AIRPLAY_DEVICE_NAME##').replace('##DEVICE_NAME##', this.host.externalDeviceDisplayName);
+ } else if (type == "tvout") {
+ deviceType = this.UIString('##TVOUT_DEVICE_TYPE##');
+ deviceName = this.UIString('##TVOUT_DEVICE_NAME##');
+ }
+
backgroundImageSVG = backgroundImageSVG.replace('##DEVICE_TYPE##', deviceType);
-
- // FIXME: Get the device type and name from the host.
- var deviceName = "unknown";
- var deviceName = this.UIString('##DEVICE_NAME##').replace('##DEVICE_NAME##', deviceName);;
backgroundImageSVG = backgroundImageSVG.replace('##DEVICE_NAME##', deviceName);
this.controls.wirelessPlaybackStatus.style.backgroundImage = backgroundImageSVG;
_wkDeleteAllHTTPCookies
_wkDeleteHTTPCookie
_wkDestroyRenderingResources
+_wkExernalDeviceDisplayNameForPlayer
+_wkExernalDeviceTypeForPlayer
_wkGetCFURLResponseHTTPResponse
_wkGetCFURLResponseMIMEType
_wkGetCFURLResponseURL
return m_private->isCurrentPlaybackTargetWireless();
}
+String MediaPlayer::wirelessPlaybackTargetName() const
+{
+ return m_private->wirelessPlaybackTargetName();
+}
+
+MediaPlayer::WirelessPlaybackTargetType MediaPlayer::wirelessPlaybackTargetType() const
+{
+ return m_private->wirelessPlaybackTargetType();
+}
+
void MediaPlayer::showPlaybackTargetPicker()
{
m_private->showPlaybackTargetPicker();
#if ENABLE(IOS_AIRPLAY)
bool isCurrentPlaybackTargetWireless() const;
+
+ enum WirelessPlaybackTargetType { TargetTypeNone, TargetTypeAirPlay, TargetTypeTVOut };
+ WirelessPlaybackTargetType wirelessPlaybackTargetType() const;
+
+ String wirelessPlaybackTargetName() const;
+
void showPlaybackTargetPicker();
bool hasWirelessPlaybackTargets() const;
#if ENABLE(IOS_AIRPLAY)
virtual bool isCurrentPlaybackTargetWireless() const { return false; }
+
+ virtual String wirelessPlaybackTargetName() const { return emptyString(); }
+ virtual MediaPlayer::WirelessPlaybackTargetType wirelessPlaybackTargetType() const { return MediaPlayer::TargetTypeNone; }
+
virtual void showPlaybackTargetPicker() { }
virtual bool hasWirelessPlaybackTargets() const { return false; }
#if ENABLE(IOS_AIRPLAY)
virtual bool isCurrentPlaybackTargetWireless() const override;
+ virtual String wirelessPlaybackTargetName() const override;
+ virtual MediaPlayer::WirelessPlaybackTargetType wirelessPlaybackTargetType() const override;
virtual bool wirelessVideoPlaybackDisabled() const override;
virtual void setWirelessVideoPlaybackDisabled(bool) override;
#endif
@end
#endif
-
SOFT_LINK_FRAMEWORK_OPTIONAL(AVFoundation)
SOFT_LINK_FRAMEWORK_OPTIONAL(CoreMedia)
SOFT_LINK_FRAMEWORK_OPTIONAL(CoreImage)
return wirelessTarget;
}
+MediaPlayer::WirelessPlaybackTargetType MediaPlayerPrivateAVFoundationObjC::wirelessPlaybackTargetType() const
+{
+ if (!m_avPlayer)
+ return MediaPlayer::TargetTypeNone;
+
+ switch (wkExernalDeviceTypeForPlayer(m_avPlayer.get())) {
+ case wkExternalPlaybackTypeNone:
+ return MediaPlayer::TargetTypeNone;
+ case wkExternalPlaybackTypeAirPlay:
+ return MediaPlayer::TargetTypeAirPlay;
+ case wkExternalPlaybackTypeTVOut:
+ return MediaPlayer::TargetTypeTVOut;
+ }
+
+ ASSERT_NOT_REACHED();
+ return MediaPlayer::TargetTypeNone;
+}
+
+String MediaPlayerPrivateAVFoundationObjC::wirelessPlaybackTargetName() const
+{
+ if (!m_avPlayer)
+ return emptyString();
+
+ String wirelessTargetName = wkExernalDeviceDisplayNameForPlayer(m_avPlayer.get());
+ LOG(Media, "MediaPlayerPrivateAVFoundationObjC::wirelessPlaybackTargetName(%p) - returning %s", this, wirelessTargetName.utf8().data());
+
+ return wirelessTargetName;
+}
+
bool MediaPlayerPrivateAVFoundationObjC::wirelessVideoPlaybackDisabled() const
{
if (!m_avPlayer)
CFStringRef (*wkGetOSNameForUserAgent)(void);
CFStringRef (*wkGetPlatformNameForNavigator)(void);
CFStringRef (*wkGetVendorNameForNavigator)(void);
+
+int (*wkExernalDeviceTypeForPlayer)(AVPlayer *);
+NSString *(*wkExernalDeviceDisplayNameForPlayer)(AVPlayer *);
#endif
OBJC_CLASS AVAsset;
+OBJC_CLASS AVPlayer;
OBJC_CLASS CALayer;
OBJC_CLASS NSArray;
OBJC_CLASS NSButtonCell;
#if ENABLE(CACHE_PARTITIONING)
extern CFStringRef (*wkCachePartitionKey)(void);
#endif
+
+typedef enum {
+ wkExternalPlaybackTypeNone,
+ wkExternalPlaybackTypeAirPlay,
+ wkExternalPlaybackTypeTVOut,
+} wkExternalPlaybackType;
+extern int (*wkExernalDeviceTypeForPlayer)(AVPlayer *);
+extern NSString *(*wkExernalDeviceDisplayNameForPlayer)(AVPlayer *);
+
}
#endif
#if ENABLE(CACHE_PARTITIONING)
CFStringRef (*wkCachePartitionKey)(void);
#endif
+
+int (*wkExernalDeviceTypeForPlayer)(AVPlayer *);
+NSString *(*wkExernalDeviceDisplayNameForPlayer)(AVPlayer *);
+2014-03-05 Eric Carlson <eric.carlson@apple.com>
+
+ [iOS] Show external device name/type in placeholder
+ https://bugs.webkit.org/show_bug.cgi?id=129723
+
+ Reviewed by Jer Noble.
+
+ * WebCoreSupport/WebSystemInterface.mm:
+ (InitWebCoreSystemInterface):
+
2014-03-05 Simon Fraser <simon.fraser@apple.com>
ObjC exception when dropping files into a WKView: drag and drop uses code from WebKit.framework
INIT(CachePartitionKey);
#endif
+ INIT(ExernalDeviceTypeForPlayer);
+ INIT(ExernalDeviceDisplayNameForPlayer);
+
didInit = true;
}
+2014-03-05 Eric Carlson <eric.carlson@apple.com>
+
+ [iOS] Show external device name/type in placeholder
+ https://bugs.webkit.org/show_bug.cgi?id=129723
+
+ Reviewed by Jer Noble.
+
+ * WebKitSystemInterface.h:
+ * libWebKitSystemInterfaceLion.a:
+ * libWebKitSystemInterfaceMavericks.a:
+ * libWebKitSystemInterfaceMountainLion.a:
+
2014-02-21 Jeffrey Pfau <jpfau@apple.com>
[Mac] Cache callbacks for cache partitioning may be passed null
#endif
@class AVAsset;
+@class AVPlayer;
@class QTMovie;
@class QTMovieView;
void WKCFURLCacheCopyAllPartitionNames(CFURLCacheCopyAllPartitionNamesResultsNotification resultsBlock);
#endif
+typedef enum {
+ WKExternalPlaybackTypeNone,
+ WKExternalPlaybackTypeAirPlay,
+ WKExternalPlaybackTypeTVOut,
+} WKExternalPlaybackType;
+
+int WKExernalDeviceTypeForPlayer(AVPlayer *);
+NSString *WKExernalDeviceDisplayNameForPlayer(AVPlayer *);
+
#ifdef __cplusplus
}
#endif