Changeset 267053 in webkit
- Timestamp:
- Sep 14, 2020 3:39:50 PM (4 years ago)
- Location:
- trunk/Source
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r267051 r267053 1 2020-09-14 Peng Liu <peng.liu6@apple.com> 2 3 Returning to element fullscreen from PiP is not stable under stress tests 4 https://bugs.webkit.org/show_bug.cgi?id=216287 5 6 Reviewed by Jer Noble. 7 8 * platform/cocoa/VideoFullscreenChangeObserver.h: 9 Delete prepareToExitFullscreen(). 10 11 * platform/ios/VideoFullscreenInterfaceAVKit.h: 12 * platform/ios/VideoFullscreenInterfaceAVKit.mm: 13 (VideoFullscreenInterfaceAVKit::VideoFullscreenInterfaceAVKit): 14 (VideoFullscreenInterfaceAVKit::prepareForPictureInPictureStop): 15 (VideoFullscreenInterfaceAVKit::didStopPictureInPicture): 16 (VideoFullscreenInterfaceAVKit::stopPictureInPictureTimerFired): 17 (VideoFullscreenInterfaceAVKit::setReadyToStopPictureInPicture): 18 VideoFullscreenInterfaceAVKit expects an element enters fullscreen and figure out the 19 location and size of the video element after that, which will be used by AVKit for the 20 exiting picture-in-picture animation. However, the entering fullscreen may take a long 21 time and AVKit will start exiting picture-in-picture before the entering fullscreen 22 transition is done. We need to add protection for such a scenario. This patch adds 23 a timer (m_stopPictureInPictureTimer) for this purpose. This patch also makes sure 24 VideoFullscreenInterfaceAVKit will call didExitPictureInPicture() properly. 25 26 * platform/ios/WebVideoFullscreenControllerAVKit.mm: 27 Delete prepareToExitFullscreen(). 28 29 * platform/mac/VideoFullscreenInterfaceMac.mm: 30 (WebCore::VideoFullscreenInterfaceMac::preparedToReturnToInline): This function 31 is not used on Mac. 32 1 33 2020-09-14 Sam Weinig <weinig@apple.com> 2 34 -
trunk/Source/WebCore/platform/cocoa/VideoFullscreenChangeObserver.h
r266728 r267053 42 42 virtual void didExitFullscreen() = 0; 43 43 virtual void didCleanupFullscreen() = 0; 44 virtual void prepareToExitFullscreen() = 0;45 44 virtual void fullscreenMayReturnToInline() = 0; 46 45 virtual void fullscreenWillReturnToInline() = 0; -
trunk/Source/WebCore/platform/ios/VideoFullscreenInterfaceAVKit.h
r266728 r267053 167 167 void doEnterFullscreen(); 168 168 void watchdogTimerFired(); 169 void stopPictureInPictureTimerFired(); 169 170 WebAVPlayerController *playerController() const; 170 171 … … 184 185 WTF::Function<void(bool)> m_prepareToInlineCallback; 185 186 RunLoop::Timer<VideoFullscreenInterfaceAVKit> m_watchdogTimer; 187 RunLoop::Timer<VideoFullscreenInterfaceAVKit> m_stopPictureInPictureTimer; 186 188 FloatRect m_inlineRect; 187 189 RouteSharingPolicy m_routeSharingPolicy { RouteSharingPolicy::Default }; -
trunk/Source/WebCore/platform/ios/VideoFullscreenInterfaceAVKit.mm
r266728 r267053 86 86 87 87 static const Seconds defaultWatchdogTimerInterval { 1_s }; 88 static const Seconds stopPictureInPictureTimerInterval { 1_s }; 88 89 static bool ignoreWatchdogForDebugging = false; 89 90 … … 813 814 , m_playerViewControllerDelegate(adoptNS([[WebAVPlayerViewControllerDelegate alloc] init])) 814 815 , m_watchdogTimer(RunLoop::main(), this, &VideoFullscreenInterfaceAVKit::watchdogTimerFired) 816 , m_stopPictureInPictureTimer(RunLoop::main(), this, &VideoFullscreenInterfaceAVKit::stopPictureInPictureTimerFired) 815 817 { 816 818 } … … 1085 1087 if (m_fullscreenChangeObserver) { 1086 1088 m_fullscreenChangeObserver->fullscreenMayReturnToInline(); 1087 m_fullscreenChangeObserver->prepareToExitFullscreen();1088 1089 if (m_readyToStopPictureInPicture) 1089 1090 m_fullscreenChangeObserver->fullscreenWillReturnToInline(); … … 1177 1178 if (m_exitFullscreenNeedsExitPictureInPicture) 1178 1179 doExitFullscreen(); 1180 else if (m_exitingPictureInPicture) { 1181 m_exitingPictureInPicture = false; 1182 if (m_videoFullscreenModel) 1183 m_videoFullscreenModel->didExitPictureInPicture(); 1184 } 1179 1185 1180 1186 if (m_enterFullscreenNeedsExitPictureInPicture) … … 1183 1189 } 1184 1190 1191 if (!m_readyToStopPictureInPicture) { 1192 if (!m_stopPictureInPictureTimer.isActive()) 1193 m_stopPictureInPictureTimer.startOneShot(stopPictureInPictureTimerInterval); 1194 } else 1195 clearMode(HTMLMediaElementEnums::VideoFullscreenModePictureInPicture); 1196 1185 1197 [m_playerLayerView setBackgroundColor:clearUIColor()]; 1186 1198 [[m_playerViewController view] setBackgroundColor:clearUIColor()]; 1187 1199 1188 if (m_videoFullscreenModel)1189 m_videoFullscreenModel->requestFullscreenMode(HTMLMediaElementEnums::VideoFullscreenModeNone);1190 1191 clearMode(HTMLMediaElementEnums::VideoFullscreenModePictureInPicture);1192 1193 1200 if (m_enterFullscreenNeedsExitPictureInPicture) 1194 1201 doEnterFullscreen(); … … 1196 1203 if (m_exitFullscreenNeedsExitPictureInPicture) 1197 1204 doExitFullscreen(); 1205 else if (m_exitingPictureInPicture) { 1206 m_exitingPictureInPicture = false; 1207 1208 if (m_videoFullscreenModel) 1209 m_videoFullscreenModel->didExitPictureInPicture(); 1210 } 1198 1211 } 1199 1212 … … 1573 1586 } 1574 1587 1588 void VideoFullscreenInterfaceAVKit::stopPictureInPictureTimerFired() 1589 { 1590 LOG(Fullscreen, "VideoFullscreenInterfaceAVKit::stopPictureInPictureTimerFired(%p) - not ready to stop picture-in-picture in %gs; forcing stop picture-in-picture.", this, stopPictureInPictureTimerInterval.value()); 1591 m_stopPictureInPictureTimer.stop(); 1592 clearMode(HTMLMediaElementEnums::VideoFullscreenModePictureInPicture); 1593 } 1594 1575 1595 void VideoFullscreenInterfaceAVKit::setMode(HTMLMediaElementEnums::VideoFullscreenMode mode) 1576 1596 { … … 1606 1626 1607 1627 m_readyToStopPictureInPicture = ready; 1608 if (m_readyToStopPictureInPicture && m_fullscreenChangeObserver) 1609 m_fullscreenChangeObserver->fullscreenWillReturnToInline(); 1628 if (m_readyToStopPictureInPicture) { 1629 if (m_stopPictureInPictureTimer.isActive()) { 1630 m_stopPictureInPictureTimer.stop(); 1631 clearMode(HTMLMediaElementEnums::VideoFullscreenModePictureInPicture); 1632 } 1633 1634 if (m_fullscreenChangeObserver) 1635 m_fullscreenChangeObserver->fullscreenWillReturnToInline(); 1636 } 1610 1637 } 1611 1638 -
trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm
r266728 r267053 129 129 void didExitFullscreen() final; 130 130 void didCleanupFullscreen() final; 131 void prepareToExitFullscreen() final { }132 131 void fullscreenMayReturnToInline() final { } 133 132 void fullscreenWillReturnToInline() final; -
trunk/Source/WebCore/platform/mac/VideoFullscreenInterfaceMac.mm
r266728 r267053 553 553 void VideoFullscreenInterfaceMac::preparedToReturnToInline(bool visible, const IntRect& inlineRect, NSWindow *parentWindow) 554 554 { 555 LOG(Fullscreen, "VideoFullscreenInterfaceMac::preparedToReturnToInline(%p), visible:%s, inlineRect:{%d, %d, %d, %d}, parentWindow:%p", this, boolString(visible), inlineRect.x(), inlineRect.y(), inlineRect.width(), inlineRect.height(), parentWindow); 556 557 if (!visible) { 558 [m_webVideoFullscreenInterfaceObjC exitPIP]; 559 return; 560 } 561 562 ASSERT(parentWindow); 563 [m_webVideoFullscreenInterfaceObjC exitPIPAnimatingToRect:(NSRect)inlineRect inWindow:parentWindow]; 555 UNUSED_PARAM(visible); 556 UNUSED_PARAM(inlineRect); 557 UNUSED_PARAM(parentWindow); 564 558 } 565 559 -
trunk/Source/WebKit/ChangeLog
r267042 r267053 1 2020-09-14 Peng Liu <peng.liu6@apple.com> 2 3 Returning to element fullscreen from PiP is not stable under stress tests 4 https://bugs.webkit.org/show_bug.cgi?id=216287 5 6 Reviewed by Jer Noble. 7 8 * UIProcess/Cocoa/VideoFullscreenManagerProxy.h: 9 (WebKit::VideoFullscreenManagerProxyClient::~VideoFullscreenManagerProxyClient): 10 (WebKit::VideoFullscreenManagerProxy::setClient): 11 (WebKit::VideoFullscreenManagerProxy::client const): 12 * UIProcess/Cocoa/VideoFullscreenManagerProxy.mm: 13 (WebKit::VideoFullscreenModelContext::didEnterPictureInPicture): 14 (WebKit::VideoFullscreenModelContext::didExitPictureInPicture): 15 (WebKit::VideoFullscreenModelContext::willEnterPictureInPicture): 16 (WebKit::VideoFullscreenManagerProxy::hasVideoInPictureInPictureDidChange): 17 (WebKit::VideoFullscreenManagerProxy::fullscreenMayReturnToInline): 18 (WebKit::VideoFullscreenModelContext::prepareToExitFullscreen): Deleted. 19 Add the interface VideoFullscreenManagerProxyClient, which is used by WKFullScreenWindowController 20 to implement the support of "returning to element fullscreen from PiP". Using VideoFullscreenModelClient 21 for that purpose is not a good idea because the instance observed by VideoFullscreenModelClient may be 22 destroyed when a video element is exiting picture-in-picture if we don't call 23 VideoFullscreenManagerProxy::addClientForContext() and VideoFullscreenManagerProxy::removeClientForContext() 24 properly. 25 26 * UIProcess/ios/fullscreen/WKFullScreenWindowControllerIOS.mm: 27 (-[WKFullScreenWindowController initWithWebView:]): 28 (-[WKFullScreenWindowController dealloc]): 29 (-[WKFullScreenWindowController beganEnterFullScreenWithInitialFrame:finalFrame:]): 30 (-[WKFullScreenWindowController _completedExitFullScreen]): 31 (-[WKFullScreenWindowController videoControlsManagerDidChange]): 32 (-[WKFullScreenWindowController prepareToExitPictureInPicture]): 33 (-[WKFullScreenWindowController didExitPictureInPicture]): 34 (-[WKFullScreenWindowController _videoFullscreenManager]): 35 (WKFullScreenWindowControllerVideoFullscreenModelClient::setParent): Deleted. 36 (WKFullScreenWindowControllerVideoFullscreenModelClient::setInterface): Deleted. 37 (WKFullScreenWindowControllerVideoFullscreenModelClient::interface const): Deleted. 38 (-[WKFullScreenWindowController willEnterPictureInPicture]): Deleted. 39 (-[WKFullScreenWindowController failedToEnterPictureInPicture]): Deleted. 40 Use VideoFullscreenManagerProxyClient instead of VideoFullscreenModelClient to implement 41 the support of "returning to element fullscreen from PiP" on iOS. 42 A user can "return to element fullscreen from PiP" by clicking the "return to fullscreen" 43 button on the PiP window, or by clicking the "fullscreen" button on the page. This patch 44 adds support for the latter case. 45 46 * UIProcess/mac/WKFullScreenWindowController.h: 47 * UIProcess/mac/WKFullScreenWindowController.mm: 48 (-[WKFullScreenWindowController initWithWindow:webView:page:]): 49 (-[WKFullScreenWindowController dealloc]): 50 (-[WKFullScreenWindowController videoControlsManagerDidChange]): 51 (-[WKFullScreenWindowController didExitPictureInPicture]): 52 (-[WKFullScreenWindowController windowDidEnterFullScreen:]): 53 (-[WKFullScreenWindowController _videoFullscreenManager]): 54 (WebKit::WKFullScreenWindowControllerVideoFullscreenModelClient::setParent): Deleted. 55 (WebKit::WKFullScreenWindowControllerVideoFullscreenModelClient::setInterface): Deleted. 56 (WebKit::WKFullScreenWindowControllerVideoFullscreenModelClient::interface const): Deleted. 57 Use VideoFullscreenManagerProxyClient instead of VideoFullscreenModelClient to implement the 58 support of "exiting fullscreen after entering PiP" on Mac. We may implement the support of 59 "returning to element fullscreen from PiP" on Mac in the future. 60 1 61 2020-09-14 Alex Christensen <achristensen@webkit.org> 2 62 -
trunk/Source/WebKit/UIProcess/Cocoa/VideoFullscreenManagerProxy.h
r266728 r267053 112 112 void didExitFullscreen() final; 113 113 void didCleanupFullscreen() final; 114 void prepareToExitFullscreen() final;115 114 void fullscreenMayReturnToInline() final; 116 115 void fullscreenWillReturnToInline() final; … … 125 124 }; 126 125 126 class VideoFullscreenManagerProxyClient : public CanMakeWeakPtr<VideoFullscreenManagerProxyClient> { 127 public: 128 virtual ~VideoFullscreenManagerProxyClient() { }; 129 130 virtual void fullscreenMayReturnToInline() = 0; 131 virtual void hasVideoInPictureInPictureDidChange(bool value) = 0; 132 }; 133 127 134 class VideoFullscreenManagerProxy : public RefCounted<VideoFullscreenManagerProxy>, private IPC::MessageReceiver { 128 135 public: … … 145 152 146 153 PlatformVideoFullscreenInterface* controlsManagerInterface(); 154 void setClient(VideoFullscreenManagerProxyClient* client) { m_client = makeWeakPtr(client); } 155 VideoFullscreenManagerProxyClient* client() const { return m_client.get(); } 147 156 148 157 void forEachSession(Function<void(WebCore::VideoFullscreenModel&, PlatformVideoFullscreenInterface&)>&&); … … 203 212 PlaybackSessionContextIdentifier m_controlsManagerContextId; 204 213 HashMap<PlaybackSessionContextIdentifier, int> m_clientCounts; 214 WeakPtr<VideoFullscreenManagerProxyClient> m_client; 205 215 }; 206 216 -
trunk/Source/WebKit/UIProcess/Cocoa/VideoFullscreenManagerProxy.mm
r266728 r267053 289 289 } 290 290 291 void VideoFullscreenModelContext::prepareToExitFullscreen() 292 { 293 for (auto& client : copyToVector(m_clients)) 294 client->prepareToExitPictureInPicture(); 291 void VideoFullscreenModelContext::didEnterPictureInPicture() 292 { 293 if (m_manager) 294 m_manager->hasVideoInPictureInPictureDidChange(true); 295 } 296 297 void VideoFullscreenModelContext::didExitPictureInPicture() 298 { 299 if (m_manager) 300 m_manager->hasVideoInPictureInPictureDidChange(false); 295 301 } 296 302 … … 301 307 } 302 308 303 void VideoFullscreenModelContext::didEnterPictureInPicture()304 {305 if (m_manager)306 m_manager->hasVideoInPictureInPictureDidChange(true);307 308 for (auto& client : copyToVector(m_clients))309 client->didEnterPictureInPicture();310 }311 312 309 void VideoFullscreenModelContext::failedToEnterPictureInPicture() 313 310 { … … 320 317 for (auto& client : copyToVector(m_clients)) 321 318 client->willExitPictureInPicture(); 322 }323 324 void VideoFullscreenModelContext::didExitPictureInPicture()325 {326 if (m_manager)327 m_manager->hasVideoInPictureInPictureDidChange(false);328 329 for (auto& client : copyToVector(m_clients))330 client->didExitPictureInPicture();331 319 } 332 320 … … 521 509 { 522 510 m_page->uiClient().hasVideoInPictureInPictureDidChange(m_page, value); 511 if (m_client) 512 m_client->hasVideoInPictureInPictureDidChange(value); 523 513 } 524 514 … … 826 816 { 827 817 m_page->fullscreenMayReturnToInline(); 818 if (m_client) 819 m_client->fullscreenMayReturnToInline(); 828 820 } 829 821 -
trunk/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenWindowControllerIOS.mm
r266728 r267053 25 25 26 26 #import "config.h" 27 #import "WKFullScreenWindowControllerIOS.h" 27 28 28 29 #if PLATFORM(IOS_FAMILY) && ENABLE(FULLSCREEN_API) 29 #import "WKFullScreenWindowControllerIOS.h"30 30 31 31 #import "UIKitSPI.h" … … 428 428 #pragma mark - 429 429 430 @interface WKFullScreenWindowController (VideoFullscreenClientCallbacks) 431 - (void)willEnterPictureInPicture; 430 @interface WKFullScreenWindowController (VideoFullscreenManagerProxyClient) 432 431 - (void)didEnterPictureInPicture; 433 - (void)failedToEnterPictureInPicture;434 432 - (void)prepareToExitPictureInPicture; 435 433 - (void)didExitPictureInPicture; 436 434 @end 437 435 438 class WKFullScreenWindowControllerVideoFullscreenM odelClient : WebCore::VideoFullscreenModelClient {436 class WKFullScreenWindowControllerVideoFullscreenManagerProxyClient : public WebKit::VideoFullscreenManagerProxyClient { 439 437 WTF_MAKE_FAST_ALLOCATED; 440 438 public: 441 439 void setParent(WKFullScreenWindowController *parent) { m_parent = parent; } 442 440 443 void setInterface(WebCore::VideoFullscreenInterfaceAVKit* interface) 444 { 445 if (m_interface == interface) 446 return; 447 448 if (m_interface && m_interface->videoFullscreenModel()) 449 m_interface->videoFullscreenModel()->removeClient(*this); 450 m_interface = interface; 451 if (m_interface && m_interface->videoFullscreenModel()) 452 m_interface->videoFullscreenModel()->addClient(*this); 453 } 454 455 WebCore::VideoFullscreenInterfaceAVKit* interface() const { return m_interface.get(); } 456 457 void willEnterPictureInPicture() final 458 { 459 [m_parent willEnterPictureInPicture]; 460 } 461 462 void didEnterPictureInPicture() final 463 { 464 [m_parent didEnterPictureInPicture]; 465 } 466 467 void failedToEnterPictureInPicture() final 468 { 469 [m_parent failedToEnterPictureInPicture]; 470 } 471 472 void prepareToExitPictureInPicture() final 441 private: 442 void fullscreenMayReturnToInline() final 473 443 { 474 444 [m_parent prepareToExitPictureInPicture]; 475 445 } 476 446 477 void didExitPictureInPicture() final447 void hasVideoInPictureInPictureDidChange(bool value) final 478 448 { 479 [m_parent didExitPictureInPicture]; 480 } 481 482 private: 449 if (value) 450 [m_parent didEnterPictureInPicture]; 451 else 452 [m_parent didExitPictureInPicture]; 453 } 454 483 455 WKFullScreenWindowController *m_parent { nullptr }; 484 RefPtr<WebCore::VideoFullscreenInterfaceAVKit> m_interface;485 456 }; 486 457 … … 504 475 RetainPtr<WKFullScreenInteractiveTransition> _interactiveDismissTransitionCoordinator; 505 476 506 WKFullScreenWindowControllerVideoFullscreenM odelClient _videoFullscreenClient;477 WKFullScreenWindowControllerVideoFullscreenManagerProxyClient _videoFullscreenManagerProxyClient; 507 478 BOOL _inPictureInPicture; 479 BOOL _enterFullscreenNeedsExitPictureInPicture; 508 480 BOOL _returnToFullscreenFromPictureInPicture; 509 481 … … 529 501 530 502 self._webView = webView; 531 _videoFullscreen Client.setParent(self);503 _videoFullscreenManagerProxyClient.setParent(self); 532 504 533 505 return self; … … 539 511 [[NSNotificationCenter defaultCenter] removeObserver:self]; 540 512 541 _videoFullscreenClient.setInterface(nullptr); 542 _videoFullscreenClient.setParent(nullptr); 513 _videoFullscreenManagerProxyClient.setParent(nullptr); 543 514 544 515 [super dealloc]; … … 726 697 page->setSuppressVisibilityUpdates(false); 727 698 728 auto* videoFullscreenManager = page->videoFullscreenManager(); 729 auto* videoFullscreenInterface = videoFullscreenManager ? videoFullscreenManager->controlsManagerInterface() : nullptr; 730 if (_returnToFullscreenFromPictureInPicture) { 731 ASSERT(videoFullscreenInterface); 732 _returnToFullscreenFromPictureInPicture = NO; 733 if (videoFullscreenInterface) 734 videoFullscreenInterface->setReadyToStopPictureInPicture(YES); 735 } else 736 _videoFullscreenClient.setInterface(videoFullscreenInterface); 699 if (auto* videoFullscreenManager = self._videoFullscreenManager) { 700 ASSERT(videoFullscreenManager->client() == nullptr); 701 videoFullscreenManager->setClient(&_videoFullscreenManagerProxyClient); 702 auto* videoFullscreenInterface = videoFullscreenManager ? videoFullscreenManager->controlsManagerInterface() : nullptr; 703 if (videoFullscreenInterface) { 704 if (_returnToFullscreenFromPictureInPicture) 705 videoFullscreenInterface->setReadyToStopPictureInPicture(YES); 706 else if (_inPictureInPicture) { 707 if (auto* model = videoFullscreenInterface->videoFullscreenModel()) { 708 _enterFullscreenNeedsExitPictureInPicture = YES; 709 model->requestFullscreenMode(WebCore::HTMLMediaElementEnums::VideoFullscreenModeNone); 710 } 711 } 712 } 713 } 714 715 _returnToFullscreenFromPictureInPicture = NO; 737 716 738 717 return; … … 851 830 } 852 831 832 if (!_inPictureInPicture) { 833 if (auto* videoFullscreenManager = self._videoFullscreenManager) { 834 ASSERT(videoFullscreenManager->client() == &_videoFullscreenManagerProxyClient); 835 videoFullscreenManager->setClient(nullptr); 836 } 837 } 838 853 839 [_window setHidden:YES]; 854 840 _window = nil; … … 868 854 page->setNeedsDOMWindowResizeEvent(); 869 855 } 870 871 if (!_inPictureInPicture)872 _videoFullscreenClient.setInterface(nullptr);873 856 874 857 _exitRequested = NO; … … 905 888 if (_fullscreenViewController) 906 889 [_fullscreenViewController videoControlsManagerDidChange]; 907 908 auto page = [self._webView _page];909 auto* videoFullscreenManager = page ? page->videoFullscreenManager() : nullptr;910 auto* videoFullscreenInterface = videoFullscreenManager ? videoFullscreenManager->controlsManagerInterface() : nullptr;911 _videoFullscreenClient.setInterface(videoFullscreenInterface);912 890 } 913 891 … … 923 901 } 924 902 925 - (void)willEnterPictureInPicture926 {927 auto* interface = _videoFullscreenClient.interface();928 if (!interface || !interface->pictureInPictureWasStartedWhenEnteringBackground())929 return;930 931 [_fullscreenViewController setAnimatingViewAlpha:0];932 }933 934 903 - (void)didEnterPictureInPicture 935 904 { … … 938 907 } 939 908 940 - (void)failedToEnterPictureInPicture941 {942 auto* interface = _videoFullscreenClient.interface();943 if (!interface || !interface->pictureInPictureWasStartedWhenEnteringBackground())944 return;945 946 [_fullscreenViewController setAnimatingViewAlpha:1];947 }948 949 909 - (void)prepareToExitPictureInPicture 950 910 { 951 auto* interface = _videoFullscreenClient.interface(); 952 if (!interface) 953 return; 954 955 interface->setReadyToStopPictureInPicture(NO); 911 if (_enterFullscreenNeedsExitPictureInPicture) 912 return; 913 914 auto* videoFullscreenInterface = self._videoFullscreenManager ? self._videoFullscreenManager->controlsManagerInterface() : nullptr; 915 916 if (!videoFullscreenInterface) 917 return; 918 919 videoFullscreenInterface->setReadyToStopPictureInPicture(NO); 956 920 _returnToFullscreenFromPictureInPicture = YES; 957 921 … … 965 929 { 966 930 _inPictureInPicture = NO; 967 if (!_returnToFullscreenFromPictureInPicture && ![self isFullScreen]) 968 _videoFullscreenClient.setInterface(nullptr); 931 _enterFullscreenNeedsExitPictureInPicture = NO; 932 if (![self isFullScreen]) { 933 if (auto* videoFullscreenManager = self._videoFullscreenManager) { 934 ASSERT(videoFullscreenManager->client() == &_videoFullscreenManagerProxyClient); 935 videoFullscreenManager->setClient(nullptr); 936 } 937 } 969 938 } 970 939 … … 1142 1111 } 1143 1112 1113 - (WebKit::VideoFullscreenManagerProxy*)_videoFullscreenManager 1114 { 1115 if (auto page = [self._webView _page]) 1116 return page->videoFullscreenManager(); 1117 return nullptr; 1118 } 1119 1144 1120 - (void)_startToDismissFullscreenChanged:(id)sender 1145 1121 { -
trunk/Source/WebKit/UIProcess/mac/WKFullScreenWindowController.h
r266728 r267053 35 35 class LayerTreeContext; 36 36 class WebPageProxy; 37 class WKFullScreenWindowControllerVideoFullscreenModelClient;38 37 } 39 38 … … 65 64 double _savedScale; 66 65 RefPtr<WebKit::VoidCallback> _repaintCallback; 67 std::unique_ptr<WebKit::WKFullScreenWindowControllerVideoFullscreenModelClient> _videoFullscreenClient;68 66 float _savedTopContentInset; 69 67 } … … 88 86 89 87 - (void)videoControlsManagerDidChange; 90 - (void)didEnterPictureInPicture;91 - (void)didExitPictureInPicture;92 88 93 89 @end -
trunk/Source/WebKit/UIProcess/mac/WKFullScreenWindowController.mm
r266728 r267053 25 25 26 26 #import "config.h" 27 #import "WKFullScreenWindowController.h" 27 28 28 29 #if ENABLE(FULLSCREEN_API) && !PLATFORM(IOS_FAMILY) 29 30 #import "WKFullScreenWindowController.h"31 30 32 31 #import "AppKitSPI.h" … … 55 54 static const NSTimeInterval DefaultWatchdogTimerInterval = 1; 56 55 57 namespace WebKit { 58 59 class WKFullScreenWindowControllerVideoFullscreenModelClient : WebCore::VideoFullscreenModelClient { 56 @interface WKFullScreenWindowController (VideoFullscreenManagerProxyClient) 57 - (void)didEnterPictureInPicture; 58 - (void)didExitPictureInPicture; 59 @end 60 61 class WKFullScreenWindowControllerVideoFullscreenManagerProxyClient : public WebKit::VideoFullscreenManagerProxyClient { 60 62 WTF_MAKE_FAST_ALLOCATED; 61 63 public: 62 64 void setParent(WKFullScreenWindowController *parent) { m_parent = parent; } 63 65 64 void setInterface(WebCore::VideoFullscreenInterfaceMac* interface) 66 private: 67 void fullscreenMayReturnToInline() final 65 68 { 66 if (m_interface == interface) 67 return; 68 69 if (m_interface && m_interface->videoFullscreenModel()) 70 m_interface->videoFullscreenModel()->removeClient(*this); 71 m_interface = interface; 72 if (m_interface && m_interface->videoFullscreenModel()) 73 m_interface->videoFullscreenModel()->addClient(*this); 74 } 75 76 WebCore::VideoFullscreenInterfaceMac* interface() const { return m_interface.get(); } 77 78 void didEnterPictureInPicture() final 69 } 70 71 void hasVideoInPictureInPictureDidChange(bool value) final 79 72 { 80 [m_parent didEnterPictureInPicture]; 81 } 82 83 void didExitPictureInPicture() final 84 { 85 [m_parent didExitPictureInPicture]; 86 } 87 88 private: 73 if (value) 74 [m_parent didEnterPictureInPicture]; 75 else 76 [m_parent didExitPictureInPicture]; 77 } 78 89 79 WKFullScreenWindowController *m_parent { nullptr }; 90 RefPtr<WebCore::VideoFullscreenInterfaceMac> m_interface;91 80 }; 92 93 }94 81 95 82 enum FullScreenState : NSInteger { … … 120 107 } 121 108 122 @implementation WKFullScreenWindowController 109 @implementation WKFullScreenWindowController { 110 WKFullScreenWindowControllerVideoFullscreenManagerProxyClient _videoFullscreenManagerProxyClient; 111 } 123 112 124 113 #pragma mark - … … 156 145 _page = page.ptr(); 157 146 158 _videoFullscreenClient = makeUnique<WebKit::WKFullScreenWindowControllerVideoFullscreenModelClient>(); 159 _videoFullscreenClient->setParent(self); 147 _videoFullscreenManagerProxyClient.setParent(self); 160 148 161 149 [self videoControlsManagerDidChange]; … … 179 167 } 180 168 181 _videoFullscreenClient->setParent(nil); 182 _videoFullscreenClient->setInterface(nullptr); 169 _videoFullscreenManagerProxyClient.setParent(nullptr); 183 170 184 171 [super dealloc]; … … 656 643 - (void)videoControlsManagerDidChange 657 644 { 658 auto* videoFullscreenManager = _page ? _page->videoFullscreenManager() : nullptr;659 auto* videoFullscreenInterface = videoFullscreenManager ? videoFullscreenManager->controlsManagerInterface() : nullptr;660 661 _videoFullscreenClient->setInterface(videoFullscreenInterface);662 645 } 663 646 … … 669 652 - (void)didExitPictureInPicture 670 653 { 671 _videoFullscreenClient->setInterface(nullptr); 654 if (auto* videoFullscreenManager = self._videoFullscreenManager) { 655 ASSERT(videoFullscreenManager->client() == &_videoFullscreenManagerProxyClient); 656 videoFullscreenManager->setClient(nullptr); 657 } 672 658 } 673 659 … … 703 689 { 704 690 [self finishedEnterFullScreenAnimation:YES]; 691 692 if (auto* videoFullscreenManager = self._videoFullscreenManager) { 693 ASSERT(videoFullscreenManager->client() == nullptr); 694 videoFullscreenManager->setClient(&_videoFullscreenManagerProxyClient); 695 } 705 696 } 706 697 … … 728 719 return nullptr; 729 720 return _page->fullScreenManager(); 721 } 722 723 - (WebKit::VideoFullscreenManagerProxy*)_videoFullscreenManager 724 { 725 if (!_page) 726 return nullptr; 727 728 return _page->videoFullscreenManager(); 730 729 } 731 730
Note: See TracChangeset
for help on using the changeset viewer.