<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[283001] branches/safari-612-branch/Source/WebKit</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/283001">283001</a></dd>
<dt>Author</dt> <dd>repstein@apple.com</dd>
<dt>Date</dt> <dd>2021-09-23 13:14:24 -0700 (Thu, 23 Sep 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>Cherry-pick <a href="http://trac.webkit.org/projects/webkit/changeset/282175">r282175</a>. rdar://problem/83460931

    [macOS] -[WKFullScreenWindowController exitFullScreenImmediately] does not exit fullscreen immediately
    https://bugs.webkit.org/show_bug.cgi?id=230024

    Reviewed by Jer Noble.

    A WebContent process may ask the `WKFullScreenWindowController` in
    the UI process to exit fullscreen immediately without walking through
    the normal exit fullscreen sequence, and the WebContent process won't
    expect any IPC message related to fullscreen to come back from the
    UI process. If the UI process sends an IPC message to the WebContent
    process and expects the response from the WebContent process (e.g., in
    `WebPageProxy::forceRepaint()`), the UI process will be stuck.

    That will happen when a tab navigates to the previous page while a video
    element in the current page is playing in fullscreen. The reason is that
    `-[WKFullScreenWindowController exitFullScreen]` is called before
    `-[WKFullScreenWindowController exitFullScreenImmediately]`.
    `-[WKFullScreenWindowController exitFullScreen]` changes `_fullScreenState`
    to `WaitingToExitFullScreen`, so `-[WKFullScreenWindowController exitFullScreenImmediately]`
    will return early. This patch fixes this issue by changing the early return condition.

    In addition, `-[WKFullScreenWindowController exitFullScreenImmediately]`
    does not really exit fullscreen immediately. Instead, it calls
    `-[WKFullScreenWindowController finishedExitFullScreenAnimation:]`,
    which always calls `WebPageProxy::forceRepaint()` and expects a response
    from the WebContet process. This patch fixes this issue as well.

    Tested manually.

    * UIProcess/mac/WKFullScreenWindowController.mm:
    (-[WKFullScreenWindowController exitFullScreenImmediately]):
    Update the early return condition to make sure the UI process will proceed
    to exit fullscreen unless the current state is `NotInFullScreen`.
    (-[WKFullScreenWindowController beganExitFullScreenWithInitialFrame:finalFrame:]):
    (-[WKFullScreenWindowController finishedExitFullScreenAnimation:]):
    The `completed` parameter was not used. This patch renames it to `immediately` to
    indicate whether `WKFullScreenWindowController` wants to exit fullscreen immediately.
    (-[WKFullScreenWindowController close]):
    Clean up this function after revising `-[WKFullScreenWindowController exitFullScreenImmediately]`.
    (-[WKFullScreenWindowController windowDidFailToExitFullScreen:]):
    Update the argument according to the change of `-[WKFullScreenWindowController finishedExitFullScreenAnimation:]`.
    (-[WKFullScreenWindowController windowDidExitFullScreen:]): Ditto.

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@282175 268f45cc-cd09-0410-ab3c-d52691b4dbfc</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchessafari612branchSourceWebKitChangeLog">branches/safari-612-branch/Source/WebKit/ChangeLog</a></li>
<li><a href="#branchessafari612branchSourceWebKitUIProcessmacWKFullScreenWindowControllermm">branches/safari-612-branch/Source/WebKit/UIProcess/mac/WKFullScreenWindowController.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchessafari612branchSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-612-branch/Source/WebKit/ChangeLog (283000 => 283001)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-612-branch/Source/WebKit/ChangeLog       2021-09-23 20:14:21 UTC (rev 283000)
+++ branches/safari-612-branch/Source/WebKit/ChangeLog  2021-09-23 20:14:24 UTC (rev 283001)
</span><span class="lines">@@ -1,5 +1,100 @@
</span><span class="cx"> 2021-09-23  Russell Epstein  <repstein@apple.com>
</span><span class="cx"> 
</span><ins>+        Cherry-pick r282175. rdar://problem/83460931
+
+    [macOS] -[WKFullScreenWindowController exitFullScreenImmediately] does not exit fullscreen immediately
+    https://bugs.webkit.org/show_bug.cgi?id=230024
+    
+    Reviewed by Jer Noble.
+    
+    A WebContent process may ask the `WKFullScreenWindowController` in
+    the UI process to exit fullscreen immediately without walking through
+    the normal exit fullscreen sequence, and the WebContent process won't
+    expect any IPC message related to fullscreen to come back from the
+    UI process. If the UI process sends an IPC message to the WebContent
+    process and expects the response from the WebContent process (e.g., in
+    `WebPageProxy::forceRepaint()`), the UI process will be stuck.
+    
+    That will happen when a tab navigates to the previous page while a video
+    element in the current page is playing in fullscreen. The reason is that
+    `-[WKFullScreenWindowController exitFullScreen]` is called before
+    `-[WKFullScreenWindowController exitFullScreenImmediately]`.
+    `-[WKFullScreenWindowController exitFullScreen]` changes `_fullScreenState`
+    to `WaitingToExitFullScreen`, so `-[WKFullScreenWindowController exitFullScreenImmediately]`
+    will return early. This patch fixes this issue by changing the early return condition.
+    
+    In addition, `-[WKFullScreenWindowController exitFullScreenImmediately]`
+    does not really exit fullscreen immediately. Instead, it calls
+    `-[WKFullScreenWindowController finishedExitFullScreenAnimation:]`,
+    which always calls `WebPageProxy::forceRepaint()` and expects a response
+    from the WebContet process. This patch fixes this issue as well.
+    
+    Tested manually.
+    
+    * UIProcess/mac/WKFullScreenWindowController.mm:
+    (-[WKFullScreenWindowController exitFullScreenImmediately]):
+    Update the early return condition to make sure the UI process will proceed
+    to exit fullscreen unless the current state is `NotInFullScreen`.
+    (-[WKFullScreenWindowController beganExitFullScreenWithInitialFrame:finalFrame:]):
+    (-[WKFullScreenWindowController finishedExitFullScreenAnimation:]):
+    The `completed` parameter was not used. This patch renames it to `immediately` to
+    indicate whether `WKFullScreenWindowController` wants to exit fullscreen immediately.
+    (-[WKFullScreenWindowController close]):
+    Clean up this function after revising `-[WKFullScreenWindowController exitFullScreenImmediately]`.
+    (-[WKFullScreenWindowController windowDidFailToExitFullScreen:]):
+    Update the argument according to the change of `-[WKFullScreenWindowController finishedExitFullScreenAnimation:]`.
+    (-[WKFullScreenWindowController windowDidExitFullScreen:]): Ditto.
+    
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@282175 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2021-09-08  Peng Liu  <peng.liu6@apple.com>
+
+            [macOS] -[WKFullScreenWindowController exitFullScreenImmediately] does not exit fullscreen immediately
+            https://bugs.webkit.org/show_bug.cgi?id=230024
+
+            Reviewed by Jer Noble.
+
+            A WebContent process may ask the `WKFullScreenWindowController` in
+            the UI process to exit fullscreen immediately without walking through
+            the normal exit fullscreen sequence, and the WebContent process won't
+            expect any IPC message related to fullscreen to come back from the
+            UI process. If the UI process sends an IPC message to the WebContent
+            process and expects the response from the WebContent process (e.g., in
+            `WebPageProxy::forceRepaint()`), the UI process will be stuck.
+
+            That will happen when a tab navigates to the previous page while a video
+            element in the current page is playing in fullscreen. The reason is that
+            `-[WKFullScreenWindowController exitFullScreen]` is called before
+            `-[WKFullScreenWindowController exitFullScreenImmediately]`.
+            `-[WKFullScreenWindowController exitFullScreen]` changes `_fullScreenState`
+            to `WaitingToExitFullScreen`, so `-[WKFullScreenWindowController exitFullScreenImmediately]`
+            will return early. This patch fixes this issue by changing the early return condition.
+
+            In addition, `-[WKFullScreenWindowController exitFullScreenImmediately]`
+            does not really exit fullscreen immediately. Instead, it calls
+            `-[WKFullScreenWindowController finishedExitFullScreenAnimation:]`,
+            which always calls `WebPageProxy::forceRepaint()` and expects a response
+            from the WebContet process. This patch fixes this issue as well.
+
+            Tested manually.
+
+            * UIProcess/mac/WKFullScreenWindowController.mm:
+            (-[WKFullScreenWindowController exitFullScreenImmediately]):
+            Update the early return condition to make sure the UI process will proceed
+            to exit fullscreen unless the current state is `NotInFullScreen`.
+            (-[WKFullScreenWindowController beganExitFullScreenWithInitialFrame:finalFrame:]):
+            (-[WKFullScreenWindowController finishedExitFullScreenAnimation:]):
+            The `completed` parameter was not used. This patch renames it to `immediately` to
+            indicate whether `WKFullScreenWindowController` wants to exit fullscreen immediately.
+            (-[WKFullScreenWindowController close]):
+            Clean up this function after revising `-[WKFullScreenWindowController exitFullScreenImmediately]`.
+            (-[WKFullScreenWindowController windowDidFailToExitFullScreen:]):
+            Update the argument according to the change of `-[WKFullScreenWindowController finishedExitFullScreenAnimation:]`.
+            (-[WKFullScreenWindowController windowDidExitFullScreen:]): Ditto.
+
+2021-09-23  Russell Epstein  <repstein@apple.com>
+
</ins><span class="cx">         Cherry-pick r281984. rdar://problem/83460908
</span><span class="cx"> 
</span><span class="cx">     RemoteVideoSample needs CVPixelBufferRef to be kept alive, but relies on caller to retain it
</span></span></pre></div>
<a id="branchessafari612branchSourceWebKitUIProcessmacWKFullScreenWindowControllermm"></a>
<div class="modfile"><h4>Modified: branches/safari-612-branch/Source/WebKit/UIProcess/mac/WKFullScreenWindowController.mm (283000 => 283001)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-612-branch/Source/WebKit/UIProcess/mac/WKFullScreenWindowController.mm   2021-09-23 20:14:21 UTC (rev 283000)
+++ branches/safari-612-branch/Source/WebKit/UIProcess/mac/WKFullScreenWindowController.mm      2021-09-23 20:14:24 UTC (rev 283001)
</span><span class="lines">@@ -440,7 +440,7 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)exitFullScreenImmediately
</span><span class="cx"> {
</span><del>-    if (![self isFullScreen])
</del><ins>+    if (_fullScreenState == NotInFullScreen)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     [self _manager]->requestExitFullScreen();
</span><span class="lines">@@ -447,7 +447,7 @@
</span><span class="cx">     [_webViewPlaceholder setExitWarningVisible:NO];
</span><span class="cx">     [self _manager]->willExitFullScreen();
</span><span class="cx">     _fullScreenState = ExitingFullScreen;
</span><del>-    [self finishedExitFullScreenAnimation:YES];
</del><ins>+    [self finishedExitFullScreenAnimationAndExitImmediately:YES];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)requestExitFullScreen
</span><span class="lines">@@ -463,8 +463,8 @@
</span><span class="cx"> 
</span><span class="cx">     if (![[self window] isOnActiveSpace]) {
</span><span class="cx">         // If the full screen window is not in the active space, the NSWindow full screen animation delegate methods
</span><del>-        // will never be called. So call finishedExitFullScreenAnimation explicitly.
-        [self finishedExitFullScreenAnimation:YES];
</del><ins>+        // will never be called. So call finishedExitFullScreenAnimationAndExitImmediately explicitly.
+        [self finishedExitFullScreenAnimationAndExitImmediately:NO];
</ins><span class="cx"> 
</span><span class="cx">         // Because we are breaking the normal animation pattern, re-enable screen updates
</span><span class="cx">         // as exitFullScreen has disabled them, but _startExitFullScreenAnimationWithDuration:
</span><span class="lines">@@ -497,7 +497,7 @@
</span><span class="cx">     return adoptCF(CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, windowID, imageOptions));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)finishedExitFullScreenAnimation:(bool)completed
</del><ins>+- (void)finishedExitFullScreenAnimationAndExitImmediately:(bool)immediately
</ins><span class="cx"> {
</span><span class="cx">     if (_fullScreenState == InFullScreen) {
</span><span class="cx">         // If we are currently in the InFullScreen state, this notification is unexpected, meaning
</span><span class="lines">@@ -560,15 +560,20 @@
</span><span class="cx">     [self _manager]->restoreScrollPosition();
</span><span class="cx">     _page->setTopContentInset(_savedTopContentInset);
</span><span class="cx"> 
</span><ins>+    [CATransaction commit];
+    [CATransaction flush];
+
+    if (immediately) {
+        [self completeFinishExitFullScreenAnimation];
+        return;
+    }
+
</ins><span class="cx">     _page->forceRepaint([weakSelf = WeakObjCPtr<WKFullScreenWindowController>(self)] {
</span><del>-        [weakSelf completeFinishExitFullScreenAnimationAfterRepaint];
</del><ins>+        [weakSelf completeFinishExitFullScreenAnimation];
</ins><span class="cx">     });
</span><del>-
-    [CATransaction commit];
-    [CATransaction flush];
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)completeFinishExitFullScreenAnimationAfterRepaint
</del><ins>+- (void)completeFinishExitFullScreenAnimation
</ins><span class="cx"> {
</span><span class="cx">     [CATransaction begin];
</span><span class="cx">     [CATransaction setDisableActions:YES];
</span><span class="lines">@@ -603,11 +608,7 @@
</span><span class="cx">     // has closed or the web process has crashed.  Just walk through our
</span><span class="cx">     // normal exit full screen sequence, but don't wait to be called back
</span><span class="cx">     // in response.
</span><del>-    if ([self isFullScreen])
-        [self exitFullScreenImmediately];
-    
-    if (_fullScreenState == ExitingFullScreen)
-        [self finishedExitFullScreenAnimation:YES];
</del><ins>+    [self exitFullScreenImmediately];
</ins><span class="cx"> 
</span><span class="cx">     [super close];
</span><span class="cx"> 
</span><span class="lines">@@ -692,7 +693,7 @@
</span><span class="cx"> - (void)windowDidFailToExitFullScreen:(NSWindow *)window
</span><span class="cx"> {
</span><span class="cx">     RetainPtr<WKFullScreenWindowController> retain = self;
</span><del>-    [self finishedExitFullScreenAnimation:NO];
</del><ins>+    [self finishedExitFullScreenAnimationAndExitImmediately:YES];
</ins><span class="cx">     [self clearVideoFullscreenManagerObserver];
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -699,7 +700,7 @@
</span><span class="cx"> - (void)windowDidExitFullScreen:(NSNotification *)notification
</span><span class="cx"> {
</span><span class="cx">     RetainPtr<WKFullScreenWindowController> retain = self;
</span><del>-    [self finishedExitFullScreenAnimation:YES];
</del><ins>+    [self finishedExitFullScreenAnimationAndExitImmediately:NO];
</ins><span class="cx">     [self clearVideoFullscreenManagerObserver];
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>