Diff
Modified: trunk/Source/WebCore/ChangeLog (171344 => 171345)
--- trunk/Source/WebCore/ChangeLog 2014-07-22 16:38:48 UTC (rev 171344)
+++ trunk/Source/WebCore/ChangeLog 2014-07-22 17:19:21 UTC (rev 171345)
@@ -1,3 +1,21 @@
+2014-07-22 Jeremy Jones <jere...@apple.com>
+
+ Don't create new UIWindow for video fullscreen.
+ https://bugs.webkit.org/show_bug.cgi?id=135038
+
+ Reviewed by Darin Adler.
+
+ * WebCore.exp.in:
+ * platform/ios/WebVideoFullscreenControllerAVKit.h: use UIView instead of UIScreen.
+ * platform/ios/WebVideoFullscreenControllerAVKit.mm:
+ (-[WebVideoFullscreenController enterFullscreen:]): provide parent UIView.
+ * platform/ios/WebVideoFullscreenInterfaceAVKit.h: remove UIWindow.
+ * platform/ios/WebVideoFullscreenInterfaceAVKit.mm:
+ (WebVideoFullscreenInterfaceAVKit::setupFullscreen): ditto
+ (WebVideoFullscreenInterfaceAVKit::cleanupFullscreen): ditto
+ (WebVideoFullscreenInterfaceAVKit::invalidate): ditto
+ (WebVideoFullscreenInterfaceAVKit::requestHideAndExitFullscreen): ditto
+
2014-07-22 Carlos Alberto Lopez Perez <clo...@igalia.com>
[GTK] Rollout r170529 due to ~10% performance regression on the
Modified: trunk/Source/WebCore/WebCore.exp.in (171344 => 171345)
--- trunk/Source/WebCore/WebCore.exp.in 2014-07-22 16:38:48 UTC (rev 171344)
+++ trunk/Source/WebCore/WebCore.exp.in 2014-07-22 17:19:21 UTC (rev 171345)
@@ -3442,7 +3442,7 @@
__ZN7WebCore32WebVideoFullscreenInterfaceAVKit14exitFullscreenENS_7IntRectE
__ZN7WebCore32WebVideoFullscreenInterfaceAVKit14setCurrentTimeEdd
__ZN7WebCore32WebVideoFullscreenInterfaceAVKit15enterFullscreenEv
-__ZN7WebCore32WebVideoFullscreenInterfaceAVKit15setupFullscreenER7CALayerNS_7IntRectE
+__ZN7WebCore32WebVideoFullscreenInterfaceAVKit15setupFullscreenER7CALayerNS_7IntRectEP6UIView
__ZN7WebCore32WebVideoFullscreenInterfaceAVKit17cleanupFullscreenEv
__ZN7WebCore32WebVideoFullscreenInterfaceAVKit17setSeekableRangesERKNS_10TimeRangesE
__ZN7WebCore32WebVideoFullscreenInterfaceAVKit18setVideoDimensionsEbff
Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.h (171344 => 171345)
--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.h 2014-07-22 16:38:48 UTC (rev 171344)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.h 2014-07-22 17:19:21 UTC (rev 171345)
@@ -30,12 +30,12 @@
#import <WebCore/HTMLMediaElement.h>
-OBJC_CLASS UIScreen;
+OBJC_CLASS UIView;
@interface WebVideoFullscreenController : NSObject
- (void)setMediaElement:(WebCore::HTMLMediaElement*)mediaElement;
- (WebCore::HTMLMediaElement*)mediaElement;
-- (void)enterFullscreen:(UIScreen *)screen;
+- (void)enterFullscreen:(UIView *)view;
- (void)exitFullscreen;
- (void)requestHideAndExitFullscreen;
@end
Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm (171344 => 171345)
--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm 2014-07-22 16:38:48 UTC (rev 171344)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm 2014-07-22 17:19:21 UTC (rev 171345)
@@ -50,9 +50,9 @@
return nullptr;
}
-- (void)enterFullscreen:(UIScreen *)screen
+- (void)enterFullscreen:(UIView *)view
{
- UNUSED_PARAM(screen);
+ UNUSED_PARAM(view);
}
- (void)exitFullscreen
@@ -114,11 +114,10 @@
return _mediaElement.get();
}
-- (void)enterFullscreen:(UIScreen *)screen
+- (void)enterFullscreen:(UIView *)view
{
[self retain]; // Balanced by -release in didExitFullscreen:
- UNUSED_PARAM(screen);
_interface = adoptRef(new WebVideoFullscreenInterfaceAVKit);
_interface->setWebVideoFullscreenChangeObserver(&_changeObserver);
_model = adoptRef(new WebVideoFullscreenModelMediaElement);
@@ -126,7 +125,7 @@
_interface->setWebVideoFullscreenModel(_model.get());
_model->setMediaElement(_mediaElement.get());
_videoFullscreenLayer = [CALayer layer];
- _interface->setupFullscreen(*_videoFullscreenLayer.get(), _mediaElement->screenRect());
+ _interface->setupFullscreen(*_videoFullscreenLayer.get(), _mediaElement->screenRect(), view);
}
- (void)exitFullscreen
Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h (171344 => 171345)
--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h 2014-07-22 16:38:48 UTC (rev 171344)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h 2014-07-22 17:19:21 UTC (rev 171345)
@@ -40,6 +40,7 @@
OBJC_CLASS AVPlayerViewController;
OBJC_CLASS UIViewController;
OBJC_CLASS UIWindow;
+OBJC_CLASS UIView;
OBJC_CLASS CALayer;
OBJC_CLASS WebAVVideoLayer;
@@ -62,7 +63,6 @@
RetainPtr<WebAVPlayerController> m_playerController;
RetainPtr<AVPlayerViewController> m_playerViewController;
RetainPtr<UIViewController> m_viewController;
- RetainPtr<UIWindow> m_window;
RetainPtr<CALayer> m_videoLayer;
RetainPtr<WebAVVideoLayer> m_videoLayerContainer;
WebVideoFullscreenModel* m_videoFullscreenModel;
@@ -88,7 +88,7 @@
virtual void setLegibleMediaSelectionOptions(const Vector<String>& options, uint64_t selectedIndex) override;
virtual void setExternalPlayback(bool enabled, ExternalPlaybackTargetType, String localizedDeviceName) override;
- virtual void setupFullscreen(PlatformLayer&, WebCore::IntRect initialRect);
+ virtual void setupFullscreen(PlatformLayer&, WebCore::IntRect initialRect, UIView *);
virtual void enterFullscreen();
virtual void exitFullscreen(WebCore::IntRect finalRect);
virtual void cleanupFullscreen();
Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm (171344 => 171345)
--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm 2014-07-22 16:38:48 UTC (rev 171344)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm 2014-07-22 17:19:21 UTC (rev 171345)
@@ -605,7 +605,7 @@
playerController.minTime = 0;
playerController.status = AVPlayerControllerStatusReadyToPlay;
- protect.clear();
+ protect = nullptr;
});
}
@@ -619,7 +619,7 @@
anchorTimeStamp:anchorTimeStamp rate:0];
playerController().timing = timing;
- protect.clear();
+ protect = nullptr;
});
}
@@ -630,7 +630,7 @@
dispatch_async(dispatch_get_main_queue(), ^{
playerController().rate = isPlaying ? playbackRate : 0.;
- protect.clear();
+ protect = nullptr;
});
}
@@ -642,7 +642,7 @@
playerController().hasEnabledVideo = hasVideo;
playerController().contentDimensions = CGSizeMake(width, height);
- protect.clear();
+ protect = nullptr;
});
}
@@ -664,7 +664,7 @@
dispatch_async(dispatch_get_main_queue(), ^{
playerController().seekableTimeRanges = seekableRanges;
- protect.clear();
+ protect = nullptr;
});
}
@@ -694,7 +694,7 @@
if (selectedIndex < webOptions.count)
playerController().currentAudioMediaSelectionOption = webOptions[(size_t)selectedIndex];
- protect.clear();
+ protect = nullptr;
});
}
@@ -708,7 +708,7 @@
if (selectedIndex < webOptions.count)
playerController().currentLegibleMediaSelectionOption = webOptions[(size_t)selectedIndex];
- protect.clear();
+ protect = nullptr;
});
}
@@ -728,11 +728,11 @@
playerController().externalPlaybackActive = enabled;
[m_videoLayerContainer.get() setHidden:enabled];
- protect.clear();
+ protect = nullptr;
});
}
-void WebVideoFullscreenInterfaceAVKit::setupFullscreen(PlatformLayer& videoLayer, WebCore::IntRect initialRect)
+void WebVideoFullscreenInterfaceAVKit::setupFullscreen(PlatformLayer& videoLayer, WebCore::IntRect initialRect, UIView* parentView)
{
__block RefPtr<WebVideoFullscreenInterfaceAVKit> protect(this);
@@ -743,6 +743,10 @@
[CATransaction begin];
[CATransaction setDisableActions:YES];
+ m_viewController = adoptNS([[getUIViewControllerClass() alloc] init]);
+ [[m_viewController view] setFrame:parentView.bounds];
+ [parentView addSubview:[m_viewController view]];
+
[m_videoLayer removeFromSuperlayer];
m_videoLayerContainer = [WebAVVideoLayer videoLayer];
@@ -758,19 +762,11 @@
[m_playerViewController setPlayerController:(AVPlayerController *)playerController()];
[m_playerViewController setDelegate:playerController()];
[m_videoLayerContainer setPlayerViewController:m_playerViewController.get()];
-
- m_viewController = adoptNS([[getUIViewControllerClass() alloc] init]);
- m_window = adoptNS([[getUIWindowClass() alloc] initWithFrame:[[getUIScreenClass() mainScreen] bounds]]);
- [m_window setBackgroundColor:[getUIColorClass() clearColor]];
- [m_window setRootViewController:m_viewController.get()];
- [m_window makeKeyAndVisible];
-
[m_viewController addChildViewController:m_playerViewController.get()];
[[m_viewController view] addSubview:[m_playerViewController view]];
[m_playerViewController view].frame = initialRect;
[[m_playerViewController view] setBackgroundColor:[getUIColorClass() clearColor]];
- [m_playerViewController didMoveToParentViewController:m_viewController.get()];
[[m_playerViewController view] layoutIfNeeded];
[CATransaction commit];
@@ -779,7 +775,7 @@
if (m_fullscreenChangeObserver)
m_fullscreenChangeObserver->didSetupFullscreen();
- protect.clear();
+ protect = nullptr;
});
});
}
@@ -794,7 +790,7 @@
[m_playerViewController setShowsPlaybackControls:YES];
if (m_fullscreenChangeObserver)
m_fullscreenChangeObserver->didEnterFullscreen();
- protect.clear();
+ protect = nullptr;
}];
});
}
@@ -803,7 +799,7 @@
{
__block RefPtr<WebVideoFullscreenInterfaceAVKit> protect(this);
- m_playerController.clear();
+ m_playerController = nil;
dispatch_async(dispatch_get_main_queue(), ^{
[m_playerViewController setShowsPlaybackControls:NO];
@@ -811,59 +807,67 @@
if ([m_videoLayerContainer videoLayerGravity] != AVVideoLayerGravityResizeAspect)
[m_videoLayerContainer setVideoLayerGravity:AVVideoLayerGravityResizeAspect];
[[m_playerViewController view] layoutIfNeeded];
- [m_playerViewController exitFullScreenWithCompletionHandler:^(BOOL, NSError*)
- {
+ [m_playerViewController exitFullScreenWithCompletionHandler:^(BOOL, NSError*) {
[[m_playerViewController view] setBackgroundColor:[getUIColorClass() clearColor]];
if (m_fullscreenChangeObserver)
m_fullscreenChangeObserver->didExitFullscreen();
- protect.clear();
+ protect = nullptr;
}];
});
}
void WebVideoFullscreenInterfaceAVKit::cleanupFullscreen()
{
+ // Retain this to extend object life until async block completes.
__block RefPtr<WebVideoFullscreenInterfaceAVKit> protect(this);
dispatch_async(dispatch_get_main_queue(), ^{
- [m_window setHidden:YES];
- [m_window setRootViewController:nil];
[m_playerViewController setDelegate:nil];
+ [[m_playerViewController view] removeFromSuperview];
+ [m_playerViewController removeFromParentViewController];
[m_playerViewController setPlayerController:nil];
m_playerViewController = nil;
- m_viewController = nil;
- m_window = nil;
[m_videoLayer removeFromSuperlayer];
m_videoLayer = nil;
[m_videoLayerContainer removeFromSuperlayer];
[m_videoLayerContainer setPlayerViewController:nil];
m_videoLayerContainer = nil;
+ [[m_viewController view] removeFromSuperview];
+ m_viewController = nil;
if (m_fullscreenChangeObserver)
m_fullscreenChangeObserver->didCleanupFullscreen();
- protect.clear();
+ protect = nullptr;
});
}
void WebVideoFullscreenInterfaceAVKit::invalidate()
{
- m_playerController.clear();
- [m_window setHidden:YES];
- [m_window setRootViewController:nil];
+ m_playerController = nil;
[m_playerViewController setDelegate:nil];
+ [[m_playerViewController view] removeFromSuperview];
+ [m_playerViewController removeFromParentViewController];
[m_playerViewController setPlayerController:nil];
m_playerViewController = nil;
- m_viewController = nil;
- m_window = nil;
[m_videoLayer removeFromSuperlayer];
m_videoLayer = nil;
[m_videoLayerContainer removeFromSuperlayer];
+ [m_videoLayerContainer setPlayerViewController:nil];
m_videoLayerContainer = nil;
+ [[m_viewController view] removeFromSuperview];
+ m_viewController = nil;
}
void WebVideoFullscreenInterfaceAVKit::requestHideAndExitFullscreen()
{
- [m_window setHidden:YES];
+ __block RefPtr<WebVideoFullscreenInterfaceAVKit> protect(this);
+
+ dispatch_async(dispatch_get_main_queue(), ^{
+ [m_playerViewController exitFullScreenWithCompletionHandler:^(BOOL, NSError*) {
+ protect = nullptr;
+ }];
+ });
+
if (m_videoFullscreenModel)
m_videoFullscreenModel->requestExitFullscreen();
}
Modified: trunk/Source/WebKit/mac/ChangeLog (171344 => 171345)
--- trunk/Source/WebKit/mac/ChangeLog 2014-07-22 16:38:48 UTC (rev 171344)
+++ trunk/Source/WebKit/mac/ChangeLog 2014-07-22 17:19:21 UTC (rev 171345)
@@ -1,3 +1,15 @@
+2014-07-22 Jeremy Jones <jere...@apple.com>
+
+ Don't create new UIWindow for video fullscreen.
+ https://bugs.webkit.org/show_bug.cgi?id=135038
+
+ Reviewed by Darin Adler.
+
+ Provide UIView to WebVideoFullscreenController
+
+ * WebView/WebView.mm:
+ (-[WebView _enterFullscreenForNode:]): pass UIView instead of nil
+
2014-07-21 Pratik Solanki <psola...@apple.com>
Unreviewed iOS build fix after r171321.
Modified: trunk/Source/WebKit/mac/WebView/WebView.mm (171344 => 171345)
--- trunk/Source/WebKit/mac/WebView/WebView.mm 2014-07-22 16:38:48 UTC (rev 171344)
+++ trunk/Source/WebKit/mac/WebView/WebView.mm 2014-07-22 17:19:21 UTC (rev 171345)
@@ -8429,7 +8429,7 @@
_private->fullscreenController = [[WebVideoFullscreenController alloc] init];
[_private->fullscreenController setMediaElement:videoElement];
#if PLATFORM(IOS)
- [_private->fullscreenController enterFullscreen:nil];
+ [_private->fullscreenController enterFullscreen:(UIView *)[[[self window] hostLayer] delegate]];
#else
[_private->fullscreenController enterFullscreen:[[self window] screen]];
#endif
Modified: trunk/Source/WebKit2/ChangeLog (171344 => 171345)
--- trunk/Source/WebKit2/ChangeLog 2014-07-22 16:38:48 UTC (rev 171344)
+++ trunk/Source/WebKit2/ChangeLog 2014-07-22 17:19:21 UTC (rev 171345)
@@ -1,3 +1,17 @@
+2014-07-22 Jeremy Jones <jere...@apple.com>
+
+ Don't create new UIWindow for video fullscreen.
+ https://bugs.webkit.org/show_bug.cgi?id=135038
+
+ Reviewed by Darin Adler.
+
+ Use root UIView to parent fullscreen interface.
+
+ * UIProcess/ios/WebVideoFullscreenManagerProxy.mm:
+ (WebKit::WebVideoFullscreenManagerProxy::setupFullscreenWithID): pass parent UIView
+ * WebProcess/ios/WebVideoFullscreenManager.mm:
+ (WebKit::screenRectForNode): Use client rect instead of screen rect.
+
2014-07-21 Ryuan Choi <ryuan.c...@samsung.com>
[EFL] Add Ewk prefix to enums of ewk_navigation_policy
Modified: trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.mm (171344 => 171345)
--- trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.mm 2014-07-22 16:38:48 UTC (rev 171344)
+++ trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.mm 2014-07-22 17:19:21 UTC (rev 171345)
@@ -28,6 +28,7 @@
#if PLATFORM(IOS)
+#include "RemoteLayerTreeDrawingAreaProxy.h"
#include "WebPageProxy.h"
#include "WebProcessProxy.h"
#include "WebVideoFullscreenManagerMessages.h"
@@ -75,7 +76,8 @@
{
ASSERT(videoLayerID);
m_layerHost = WKMakeRenderLayer(videoLayerID);
- setupFullscreen(*m_layerHost.get(), initialRect);
+ UIView *parentView = toRemoteLayerTreeDrawingAreaProxy(m_page->drawingArea())->remoteLayerTreeHost().rootLayer();
+ setupFullscreen(*m_layerHost.get(), initialRect, parentView);
}
void WebVideoFullscreenManagerProxy::setSeekableRangesVector(Vector<std::pair<double, double>>& ranges)
Modified: trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.mm (171344 => 171345)
--- trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.mm 2014-07-22 16:38:48 UTC (rev 171344)
+++ trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.mm 2014-07-22 17:19:21 UTC (rev 171345)
@@ -50,12 +50,12 @@
namespace WebKit {
-static IntRect screenRectForNode(Node* node)
+static IntRect clientRectForNode(Node* node)
{
if (!node || !node->isElementNode())
return IntRect();
- return toElement(node)->screenRect();
+ return toElement(node)->clientRect();
}
PassRefPtr<WebVideoFullscreenManager> WebVideoFullscreenManager::create(PassRefPtr<WebPage> page)
@@ -97,7 +97,7 @@
m_layerHostingContext = LayerHostingContext::createForExternalHostingProcess();
- m_page->send(Messages::WebVideoFullscreenManagerProxy::SetupFullscreenWithID(m_layerHostingContext->contextID(), screenRectForNode(node)), m_page->pageID());
+ m_page->send(Messages::WebVideoFullscreenManagerProxy::SetupFullscreenWithID(m_layerHostingContext->contextID(), clientRectForNode(node)), m_page->pageID());
}
void WebVideoFullscreenManager::exitFullscreenForNode(Node* node)
@@ -109,7 +109,7 @@
return;
m_isAnimating = true;
- m_page->send(Messages::WebVideoFullscreenManagerProxy::ExitFullscreen(screenRectForNode(node)), m_page->pageID());
+ m_page->send(Messages::WebVideoFullscreenManagerProxy::ExitFullscreen(clientRectForNode(node)), m_page->pageID());
}
void WebVideoFullscreenManager::setDuration(double duration)