Title: [171345] trunk/Source
Revision
171345
Author
commit-qu...@webkit.org
Date
2014-07-22 10:19:21 -0700 (Tue, 22 Jul 2014)

Log Message

Don't create new UIWindow for video fullscreen.
https://bugs.webkit.org/show_bug.cgi?id=135038

Patch by Jeremy Jones <jere...@apple.com> on 2014-07-22
Reviewed by Darin Adler.

Source/WebCore:
* 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

Source/WebKit/mac:
Provide UIView to WebVideoFullscreenController

* WebView/WebView.mm:
(-[WebView _enterFullscreenForNode:]): pass UIView instead of nil

Source/WebKit2:
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.

Modified Paths

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)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to