<!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>[282046] trunk/Source/WebCore</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/282046">282046</a></dd>
<dt>Author</dt> <dd>peng.liu6@apple.com</dd>
<dt>Date</dt> <dd>2021-09-04 09:55:13 -0700 (Sat, 04 Sep 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS] Play/pause button's icon does not update when pausing in full screen
https://bugs.webkit.org/show_bug.cgi?id=229904

Reviewed by Eric Carlson.

AVKit expects KVO notification of `rate` to update the play/pause icon.
However, with the changes in <a href="http://trac.webkit.org/projects/webkit/changeset/280840">r280840</a>, `-[WebAVPlayerController setRate]`
will be called by AVKit only. When a user taps the play/pause button,
`-[WebAVPlayerController setRate:fromJavaScript:]` will be called, which
does not generate the KVO notification.

This patch fixes the issue by manually generate the KVO notification.

To be safe, this patch manually generates the KVO notification for
property `defaultPlaybackRate` as well.

Tested manually.

* platform/ios/WebAVPlayerController.mm:
(-[WebAVPlayerController setDefaultPlaybackRate:fromJavaScript:]):
(-[WebAVPlayerController setRate:fromJavaScript:]):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformiosWebAVPlayerControllermm">trunk/Source/WebCore/platform/ios/WebAVPlayerController.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (282045 => 282046)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2021-09-04 13:20:39 UTC (rev 282045)
+++ trunk/Source/WebCore/ChangeLog      2021-09-04 16:55:13 UTC (rev 282046)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2021-09-04  Peng Liu  <peng.liu6@apple.com>
+
+        [iOS] Play/pause button's icon does not update when pausing in full screen
+        https://bugs.webkit.org/show_bug.cgi?id=229904
+
+        Reviewed by Eric Carlson.
+
+        AVKit expects KVO notification of `rate` to update the play/pause icon.
+        However, with the changes in r280840, `-[WebAVPlayerController setRate]`
+        will be called by AVKit only. When a user taps the play/pause button,
+        `-[WebAVPlayerController setRate:fromJavaScript:]` will be called, which
+        does not generate the KVO notification.
+
+        This patch fixes the issue by manually generate the KVO notification.
+
+        To be safe, this patch manually generates the KVO notification for
+        property `defaultPlaybackRate` as well.
+
+        Tested manually.
+
+        * platform/ios/WebAVPlayerController.mm:
+        (-[WebAVPlayerController setDefaultPlaybackRate:fromJavaScript:]):
+        (-[WebAVPlayerController setRate:fromJavaScript:]):
+
</ins><span class="cx"> 2021-09-04  Antti Koivisto  <antti@apple.com>
</span><span class="cx"> 
</span><span class="cx">         REGRESSION(r275515): pointer-events:none may get stuck in LFC runs
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformiosWebAVPlayerControllermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/WebAVPlayerController.mm (282045 => 282046)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/WebAVPlayerController.mm       2021-09-04 13:20:39 UTC (rev 282045)
+++ trunk/Source/WebCore/platform/ios/WebAVPlayerController.mm  2021-09-04 16:55:13 UTC (rev 282046)
</span><span class="lines">@@ -173,7 +173,9 @@
</span><span class="cx">     if (defaultPlaybackRate == _defaultPlaybackRate)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    [self willChangeValueForKey:@"defaultPlaybackRate"];
</ins><span class="cx">     _defaultPlaybackRate = defaultPlaybackRate;
</span><ins>+    [self didChangeValueForKey:@"defaultPlaybackRate"];
</ins><span class="cx"> 
</span><span class="cx">     if (!fromJavaScript && self.delegate && self.delegate->defaultPlaybackRate() != _defaultPlaybackRate)
</span><span class="cx">         self.delegate->setDefaultPlaybackRate(_defaultPlaybackRate);
</span><span class="lines">@@ -197,7 +199,9 @@
</span><span class="cx">     if (rate == _rate)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    [self willChangeValueForKey:@"rate"];
</ins><span class="cx">     _rate = rate;
</span><ins>+    [self didChangeValueForKey:@"rate"];
</ins><span class="cx"> 
</span><span class="cx">     // AVKit doesn't have a separate variable for "paused", instead representing it by a `rate` of
</span><span class="cx">     // `0`. Unfortunately, `HTMLMediaElement::play` doesn't call `HTMLMediaElement::setPlaybackRate`
</span></span></pre>
</div>
</div>

</body>
</html>