Title: [183229] trunk/Source/WebCore
- Revision
- 183229
- Author
- [email protected]
- Date
- 2015-04-23 16:43:04 -0700 (Thu, 23 Apr 2015)
Log Message
[iOS] Add a wrapper around the hosted AVPlayerLayer to intercept -setBounds:
https://bugs.webkit.org/show_bug.cgi?id=144129
Reviewed by Simon Fraser.
When passing the hosted AVPlayerLayer to the fullscreen controller, the new superlayer will
resize the hosted layer with a call to -setBounds:. But because this is a hosted layer, the
bonuds change has no effect. Instead, wrap the CALayerHost in another CALayer whose job it is
to intercept -setBounds: in the same way that WebAVVideoLayer did. In fact, we should just use
that wrapper class inside WebAVVideoLayer as well, to avoid duplicating code.
Drive-by Fix: Null-check m_videoElement in setVideoLayerFrame().
* platform/ios/WebVideoFullscreenInterfaceAVKit.h:
* platform/ios/WebVideoFullscreenInterfaceAVKit.mm:
(-[WebCALayerHostWrapper setVideoSublayer:]):
(-[WebCALayerHostWrapper videoSublayer]):
(-[WebCALayerHostWrapper setBounds:]): Moved from WebAVVideoLayer.
(-[WebCALayerHostWrapper resolveBounds]): Ditto.
(-[WebAVVideoLayer setBounds:]): Moved to WebCALayerHostWrapper.
(WebVideoFullscreenInterfaceAVKit::setupFullscreenInternal): Create the wrapper.
(WebVideoFullscreenInterfaceAVKit::cleanupFullscreenInternal): Clear the wrapper.
(-[WebAVVideoLayer resolveBounds]): Deleted. Moved to WebCALayerHostWrapper.
* platform/ios/WebVideoFullscreenModelVideoElement.mm:
(WebVideoFullscreenModelVideoElement::setVideoLayerFrame): Null-check m_videoElement.
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (183228 => 183229)
--- trunk/Source/WebCore/ChangeLog 2015-04-23 23:18:03 UTC (rev 183228)
+++ trunk/Source/WebCore/ChangeLog 2015-04-23 23:43:04 UTC (rev 183229)
@@ -1,3 +1,31 @@
+2015-04-23 Jer Noble <[email protected]>
+
+ [iOS] Add a wrapper around the hosted AVPlayerLayer to intercept -setBounds:
+ https://bugs.webkit.org/show_bug.cgi?id=144129
+
+ Reviewed by Simon Fraser.
+
+ When passing the hosted AVPlayerLayer to the fullscreen controller, the new superlayer will
+ resize the hosted layer with a call to -setBounds:. But because this is a hosted layer, the
+ bonuds change has no effect. Instead, wrap the CALayerHost in another CALayer whose job it is
+ to intercept -setBounds: in the same way that WebAVVideoLayer did. In fact, we should just use
+ that wrapper class inside WebAVVideoLayer as well, to avoid duplicating code.
+
+ Drive-by Fix: Null-check m_videoElement in setVideoLayerFrame().
+
+ * platform/ios/WebVideoFullscreenInterfaceAVKit.h:
+ * platform/ios/WebVideoFullscreenInterfaceAVKit.mm:
+ (-[WebCALayerHostWrapper setVideoSublayer:]):
+ (-[WebCALayerHostWrapper videoSublayer]):
+ (-[WebCALayerHostWrapper setBounds:]): Moved from WebAVVideoLayer.
+ (-[WebCALayerHostWrapper resolveBounds]): Ditto.
+ (-[WebAVVideoLayer setBounds:]): Moved to WebCALayerHostWrapper.
+ (WebVideoFullscreenInterfaceAVKit::setupFullscreenInternal): Create the wrapper.
+ (WebVideoFullscreenInterfaceAVKit::cleanupFullscreenInternal): Clear the wrapper.
+ (-[WebAVVideoLayer resolveBounds]): Deleted. Moved to WebCALayerHostWrapper.
+ * platform/ios/WebVideoFullscreenModelVideoElement.mm:
+ (WebVideoFullscreenModelVideoElement::setVideoLayerFrame): Null-check m_videoElement.
+
2015-04-23 Tim Horton <[email protected]>
Yellow highlight has gray background color when invoking Lookup on an address in a Google Maps drop down
Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h (183228 => 183229)
--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h 2015-04-23 23:18:03 UTC (rev 183228)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h 2015-04-23 23:43:04 UTC (rev 183229)
@@ -44,6 +44,7 @@
OBJC_CLASS UIView;
OBJC_CLASS CALayer;
OBJC_CLASS WebAVVideoLayer;
+OBJC_CLASS WebCALayerHostWrapper;
namespace WTF {
class String;
@@ -128,6 +129,7 @@
RetainPtr<AVPlayerViewController> m_playerViewController;
RetainPtr<CALayer> m_videoLayer;
RetainPtr<WebAVVideoLayer> m_videoLayerContainer;
+ RetainPtr<WebCALayerHostWrapper> m_layerHostWrapper;
WebVideoFullscreenModel* m_videoFullscreenModel { nullptr };
WebVideoFullscreenChangeObserver* m_fullscreenChangeObserver { nullptr };
Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm (183228 => 183229)
--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm 2015-04-23 23:18:03 UTC (rev 183228)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm 2015-04-23 23:43:04 UTC (rev 183229)
@@ -566,6 +566,74 @@
@implementation WebAVMediaSelectionOption
@end
+
+@interface WebCALayerHostWrapper : CALayer
+@property (assign) WebVideoFullscreenModel* model;
+@end
+
+@implementation WebCALayerHostWrapper {
+ RetainPtr<CALayer> _videoSublayer;
+}
+
+- (void)setVideoSublayer:(CALayer*)videoSublayer
+{
+ _videoSublayer = videoSublayer;
+ [self addSublayer:videoSublayer];
+}
+
+- (CALayer*)videoSublayer
+{
+ return _videoSublayer.get();
+}
+
+- (void)setBounds:(CGRect)bounds
+{
+ if (CGRectEqualToRect(bounds, self.bounds))
+ return;
+
+ [super setBounds:bounds];
+
+ [_videoSublayer setPosition:CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))];
+
+ if (!self.model)
+ return;
+
+ FloatRect videoFrame = self.model->videoLayerFrame();
+ FloatRect targetFrame;
+ switch (self.model->videoLayerGravity()) {
+ case WebCore::WebVideoFullscreenModel::VideoGravityResize:
+ targetFrame = bounds;
+ break;
+ case WebCore::WebVideoFullscreenModel::VideoGravityResizeAspect:
+ targetFrame = largestRectWithAspectRatioInsideRect(videoFrame.size().aspectRatio(), bounds);
+ break;
+ case WebCore::WebVideoFullscreenModel::VideoGravityResizeAspectFill:
+ targetFrame = smallestRectWithAspectRatioAroundRect(videoFrame.size().aspectRatio(), bounds);
+ break;
+ }
+ CATransform3D transform = CATransform3DMakeScale(targetFrame.width() / videoFrame.width(), targetFrame.height() / videoFrame.height(), 1);
+ [_videoSublayer setSublayerTransform:transform];
+
+ [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(resolveBounds) object:nil];
+ [self performSelector:@selector(resolveBounds) withObject:nil afterDelay:[CATransaction animationDuration] + 0.1];
+}
+
+- (void)resolveBounds
+{
+ [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(resolveBounds) object:nil];
+ if (!self.model)
+ return;
+
+ [CATransaction begin];
+ [CATransaction setAnimationDuration:0];
+
+ [_videoSublayer setSublayerTransform:CATransform3DIdentity];
+ self.model->setVideoLayerFrame([self bounds]);
+
+ [CATransaction commit];
+}
+@end
+
@interface WebAVVideoLayer : CALayer <AVVideoLayer>
+(WebAVVideoLayer *)videoLayer;
@property (nonatomic) AVVideoLayerGravity videoLayerGravity;
@@ -632,45 +700,9 @@
[super setBounds:bounds];
[_videoSublayer setPosition:CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))];
-
- if (![_avPlayerController delegate] || !_avPlayerViewController)
- return;
-
- FloatRect videoFrame = [_avPlayerController delegate]->videoLayerFrame();
- FloatRect targetFrame;
- switch ([_avPlayerController delegate]->videoLayerGravity()) {
- case WebCore::WebVideoFullscreenModel::VideoGravityResize:
- targetFrame = bounds;
- break;
- case WebCore::WebVideoFullscreenModel::VideoGravityResizeAspect:
- targetFrame = largestRectWithAspectRatioInsideRect(videoFrame.size().aspectRatio(), bounds);
- break;
- case WebCore::WebVideoFullscreenModel::VideoGravityResizeAspectFill:
- targetFrame = smallestRectWithAspectRatioAroundRect(videoFrame.size().aspectRatio(), bounds);
- break;
- }
- CATransform3D transform = CATransform3DMakeScale(targetFrame.width() / videoFrame.width(), targetFrame.height() / videoFrame.height(), 1);
- [_videoSublayer setSublayerTransform:transform];
-
- [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(resolveBounds) object:nil];
- [self performSelector:@selector(resolveBounds) withObject:nil afterDelay:[CATransaction animationDuration] + 0.1];
+ [_videoSublayer setBounds:bounds];
}
-- (void)resolveBounds
-{
- [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(resolveBounds) object:nil];
- if (!_avPlayerController || ![_avPlayerController delegate])
- return;
-
- [CATransaction begin];
- [CATransaction setAnimationDuration:0];
-
- [_videoSublayer setSublayerTransform:CATransform3DIdentity];
- [_avPlayerController delegate]->setVideoLayerFrame([self bounds]);
-
- [CATransaction commit];
-}
-
- (void)setVideoLayerGravity:(AVVideoLayerGravity)videoLayerGravity
{
_videoLayerGravity = videoLayerGravity;
@@ -932,9 +964,13 @@
[m_videoLayer removeFromSuperlayer];
+ m_layerHostWrapper = adoptNS([[WebCALayerHostWrapper alloc] init]);
+ [m_layerHostWrapper setModel:m_videoFullscreenModel];
+ [m_layerHostWrapper setVideoSublayer:m_videoLayer.get()];
+
m_videoLayerContainer = [WebAVVideoLayer videoLayer];
[m_videoLayerContainer setHidden:[m_playerController isExternalPlaybackActive]];
- [m_videoLayerContainer setVideoSublayer:m_videoLayer.get()];
+ [m_videoLayerContainer setVideoSublayer:m_layerHostWrapper.get()];
CGSize videoSize = [m_playerController contentDimensions];
CGRect videoRect = CGRectMake(0, 0, videoSize.width, videoSize.height);
@@ -1122,7 +1158,8 @@
[m_videoLayerContainer removeFromSuperlayer];
[m_videoLayerContainer setPlayerViewController:nil];
[[m_viewController view] removeFromSuperview];
-
+
+ m_layerHostWrapper = nil;
m_videoLayer = nil;
m_videoLayerContainer = nil;
m_playerViewController = nil;
Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenModelVideoElement.mm (183228 => 183229)
--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenModelVideoElement.mm 2015-04-23 23:18:03 UTC (rev 183228)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenModelVideoElement.mm 2015-04-23 23:43:04 UTC (rev 183229)
@@ -304,7 +304,8 @@
{
m_videoFrame = rect;
[m_videoFullscreenLayer setBounds:CGRect(rect)];
- m_videoElement->setVideoFullscreenFrame(rect);
+ if (m_videoElement)
+ m_videoElement->setVideoFullscreenFrame(rect);
}
FloatRect WebVideoFullscreenModelVideoElement::videoLayerFrame() const
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes