<!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>[266202] branches/safari-610-branch/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/266202">266202</a></dd>
<dt>Author</dt> <dd>alancoon@apple.com</dd>
<dt>Date</dt> <dd>2020-08-26 16:38:04 -0700 (Wed, 26 Aug 2020)</dd>
</dl>

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

    [Mac,EME] Netflix.com shows HDCP error for all streams
    https://bugs.webkit.org/show_bug.cgi?id=215825

    Reviewed by Eric Carlson.

    New API added to AVContentKeySession hits a sandbox restriction when run in the WebContent process, and the default
    behavior when an error checking HDCP status is to report that the output is restricted, regardless of the displays
    actual capabilities. To work around this behavior for now, pass in an empty displayID array, rather than the actual
    displayID. This causes AVFoundation to do a "lowest common level of support" rather than a specific display check.
    The upside is that this call no longer requires a connection to the WindowServer. The downside is that the
    AVContentKeyRequest will report that its output is restricted if any non-HDCP compliant display is attached.

    * WebCore.xcodeproj/project.pbxproj:
    * platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h:
    * platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm:
    (WebCore::CDMInstanceSessionFairPlayStreamingAVFObjC::keyStatuses const):
    (WebCore::CDMInstanceSessionFairPlayStreamingAVFObjC::keyRequestHasInsufficientProtectionForDisplayID const):
    (WebCore::CDMInstanceSessionFairPlayStreamingAVFObjC::updateProtectionStatusForDisplayID):

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

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchessafari610branchSourceWebCoreChangeLog">branches/safari-610-branch/Source/WebCore/ChangeLog</a></li>
<li><a href="#branchessafari610branchSourceWebCoreplatformgraphicsavfoundationobjcCDMInstanceFairPlayStreamingAVFObjCh">branches/safari-610-branch/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h</a></li>
<li><a href="#branchessafari610branchSourceWebCoreplatformgraphicsavfoundationobjcCDMInstanceFairPlayStreamingAVFObjCmm">branches/safari-610-branch/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchessafari610branchSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-610-branch/Source/WebCore/ChangeLog (266201 => 266202)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-610-branch/Source/WebCore/ChangeLog      2020-08-26 23:21:13 UTC (rev 266201)
+++ branches/safari-610-branch/Source/WebCore/ChangeLog 2020-08-26 23:38:04 UTC (rev 266202)
</span><span class="lines">@@ -1,3 +1,50 @@
</span><ins>+2020-08-26  Alan Coon  <alancoon@apple.com>
+
+        Cherry-pick r266176. rdar://problem/67836292
+
+    [Mac,EME] Netflix.com shows HDCP error for all streams
+    https://bugs.webkit.org/show_bug.cgi?id=215825
+    
+    Reviewed by Eric Carlson.
+    
+    New API added to AVContentKeySession hits a sandbox restriction when run in the WebContent process, and the default
+    behavior when an error checking HDCP status is to report that the output is restricted, regardless of the displays
+    actual capabilities. To work around this behavior for now, pass in an empty displayID array, rather than the actual
+    displayID. This causes AVFoundation to do a "lowest common level of support" rather than a specific display check.
+    The upside is that this call no longer requires a connection to the WindowServer. The downside is that the
+    AVContentKeyRequest will report that its output is restricted if any non-HDCP compliant display is attached.
+    
+    * WebCore.xcodeproj/project.pbxproj:
+    * platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h:
+    * platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm:
+    (WebCore::CDMInstanceSessionFairPlayStreamingAVFObjC::keyStatuses const):
+    (WebCore::CDMInstanceSessionFairPlayStreamingAVFObjC::keyRequestHasInsufficientProtectionForDisplayID const):
+    (WebCore::CDMInstanceSessionFairPlayStreamingAVFObjC::updateProtectionStatusForDisplayID):
+    
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266176 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2020-08-26  Jer Noble  <jer.noble@apple.com>
+
+            [Mac,EME] Netflix.com shows HDCP error for all streams
+            https://bugs.webkit.org/show_bug.cgi?id=215825
+
+            Reviewed by Eric Carlson.
+
+            New API added to AVContentKeySession hits a sandbox restriction when run in the WebContent process, and the default
+            behavior when an error checking HDCP status is to report that the output is restricted, regardless of the displays
+            actual capabilities. To work around this behavior for now, pass in an empty displayID array, rather than the actual
+            displayID. This causes AVFoundation to do a "lowest common level of support" rather than a specific display check.
+            The upside is that this call no longer requires a connection to the WindowServer. The downside is that the
+            AVContentKeyRequest will report that its output is restricted if any non-HDCP compliant display is attached.
+
+            * WebCore.xcodeproj/project.pbxproj:
+            * platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h:
+            * platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm:
+            (WebCore::CDMInstanceSessionFairPlayStreamingAVFObjC::keyStatuses const):
+            (WebCore::CDMInstanceSessionFairPlayStreamingAVFObjC::keyRequestHasInsufficientProtectionForDisplayID const):
+            (WebCore::CDMInstanceSessionFairPlayStreamingAVFObjC::updateProtectionStatusForDisplayID):
+
</ins><span class="cx"> 2020-08-21  Simon Fraser  <simon.fraser@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Add some FIXMEs in the EventHandler wheel event handling code for all the things that are wrong
</span></span></pre></div>
<a id="branchessafari610branchSourceWebCoreplatformgraphicsavfoundationobjcCDMInstanceFairPlayStreamingAVFObjCh"></a>
<div class="modfile"><h4>Modified: branches/safari-610-branch/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h (266201 => 266202)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-610-branch/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h      2020-08-26 23:21:13 UTC (rev 266201)
+++ branches/safari-610-branch/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h 2020-08-26 23:38:04 UTC (rev 266202)
</span><span class="lines">@@ -190,10 +190,12 @@
</span><span class="cx">     bool ensureSessionOrGroup();
</span><span class="cx">     bool isLicenseTypeSupported(LicenseType) const;
</span><span class="cx"> 
</span><del>-    KeyStatusVector keyStatuses() const;
</del><ins>+    KeyStatusVector keyStatuses(Optional<PlatformDisplayID> = WTF::nullopt) const;
</ins><span class="cx">     void nextRequest();
</span><span class="cx">     AVContentKeyRequest* lastKeyRequest() const;
</span><span class="cx"> 
</span><ins>+    bool keyRequestHasInsufficientProtectionForDisplayID(AVContentKeyRequest *, PlatformDisplayID) const;
+
</ins><span class="cx"> #if !RELEASE_LOG_DISABLED
</span><span class="cx">     WTF::Logger* loggerPtr() const { return m_logger.get(); };
</span><span class="cx">     const void* logIdentifier() const { return m_logIdentifier; }
</span></span></pre></div>
<a id="branchessafari610branchSourceWebCoreplatformgraphicsavfoundationobjcCDMInstanceFairPlayStreamingAVFObjCmm"></a>
<div class="modfile"><h4>Modified: branches/safari-610-branch/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm (266201 => 266202)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-610-branch/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm     2020-08-26 23:21:13 UTC (rev 266201)
+++ branches/safari-610-branch/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm        2020-08-26 23:38:04 UTC (rev 266202)
</span><span class="lines">@@ -1340,10 +1340,13 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-CDMInstanceSession::KeyStatusVector CDMInstanceSessionFairPlayStreamingAVFObjC::keyStatuses() const
</del><ins>+CDMInstanceSession::KeyStatusVector CDMInstanceSessionFairPlayStreamingAVFObjC::keyStatuses(Optional<PlatformDisplayID> displayID) const
</ins><span class="cx"> {
</span><span class="cx">     KeyStatusVector keyStatuses;
</span><span class="cx"> 
</span><ins>+    if (!displayID && m_client)
+        displayID = m_client->displayID();
+
</ins><span class="cx">     for (auto& request : m_requests) {
</span><span class="cx">         for (auto& oneRequest : request.requests) {
</span><span class="cx">             auto keyIDs = keyIDsForRequest(oneRequest.get());
</span><span class="lines">@@ -1351,6 +1354,9 @@
</span><span class="cx">             if (m_outputObscured || oneRequest.get().error.code == SecurityLevelError)
</span><span class="cx">                 status = CDMKeyStatus::OutputRestricted;
</span><span class="cx"> 
</span><ins>+            if (displayID && keyRequestHasInsufficientProtectionForDisplayID(oneRequest.get(), *displayID))
+                status = CDMKeyStatus::OutputRestricted;
+
</ins><span class="cx">             for (auto& keyID : keyIDs)
</span><span class="cx">                 keyStatuses.append({ WTFMove(keyID), status });
</span><span class="cx">         }
</span><span class="lines">@@ -1379,21 +1385,35 @@
</span><span class="cx">     updateProtectionStatusForDisplayID(m_client->displayID());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool CDMInstanceSessionFairPlayStreamingAVFObjC::keyRequestHasInsufficientProtectionForDisplayID(AVContentKeyRequest *request, PlatformDisplayID displayID) const
+{
+    // willOutputBeObscuredDueToInsufficientExternalProtectionForDisplays will always return "YES" prior to
+    // receiving a response.
+    if (request.status != AVContentKeyRequestStatusReceivedResponse && request.status != AVContentKeyRequestStatusRenewed) {
+        ALWAYS_LOG_IF_POSSIBLE(LOGIDENTIFIER, "request has insufficient status ", (int)request.status);
+        return false;
+    }
+
+    // FIXME: AVFoundation requires a connection to the WindowServer in order to query the HDCP status of individual
+    // displays. Passing in an empty NSArray will cause AVFoundation to fall back to a "minimum supported HDCP level"
+    // across all displays. Replace the below with explicit APIs to query the per-display HDCP status in the UIProcess
+    // and to query the HDCP level required by each AVContentKeyRequest, and do the comparison between the two in the
+    // WebProcess.
+    UNUSED_PARAM(displayID);
+    if ([request respondsToSelector:@selector(willOutputBeObscuredDueToInsufficientExternalProtectionForDisplays:)]) {
+        auto obscured = [request willOutputBeObscuredDueToInsufficientExternalProtectionForDisplays:@[ ]];
+        ALWAYS_LOG_IF_POSSIBLE(LOGIDENTIFIER, "request willOutputBeObscured...forDisplays:[ nil ] = ", obscured ? "true" : "false");
+        return obscured;
+    }
+    return false;
+};
+
+
</ins><span class="cx"> void CDMInstanceSessionFairPlayStreamingAVFObjC::updateProtectionStatusForDisplayID(PlatformDisplayID displayID)
</span><span class="cx"> {
</span><del>-    if (m_requests.isEmpty())
</del><ins>+    if (m_requests.isEmpty() || !m_client)
</ins><span class="cx">         return;
</span><del>-
-    auto keyRequestHasInsufficientProtectionForDisplayID = [displayID] (auto& request) -> bool {
-        if ([request respondsToSelector:@selector(willOutputBeObscuredDueToInsufficientExternalProtectionForDisplays:)])
-            return [request willOutputBeObscuredDueToInsufficientExternalProtectionForDisplays:@[ @(displayID) ]];
-        return false;
-    };
-
-    bool outputWillBeObscured = WTF::anyOf(m_requests, [&](Request& request) {
-        return WTF::anyOf(request.requests, keyRequestHasInsufficientProtectionForDisplayID);
-    });
-    outputObscuredDueToInsufficientExternalProtectionChanged(outputWillBeObscured);
</del><ins>+    m_client->updateKeyStatuses(keyStatuses(displayID));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool CDMInstanceSessionFairPlayStreamingAVFObjC::ensureSessionOrGroup()
</span></span></pre>
</div>
</div>

</body>
</html>