<!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>[208587] 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/208587">208587</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2016-11-11 05:09:33 -0800 (Fri, 11 Nov 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WebRTC][OpenWebRTC] Implement device permissions handling solution for owr backend in the UI process
https://bugs.webkit.org/show_bug.cgi?id=164010

Patch by Alejandro G. Castro &lt;alex@igalia.com&gt; on 2016-11-11
Reviewed by Philippe Normand.

Move the capture of the sources for the OWR backend to the
WebProcess. In the UI we continue checking if the user allows
access to the audio and video capture. When device handling is
added in the future we will need some persistent ID and API to
pass from the UI process to the Web process.

* platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp:
(WebCore::RealtimeMediaSourceCenterOwr::validateRequestConstraints):
Add the proper audio and video sources to allow the UI message to
be properly rendered. We are adding the specific devices, even
though the dialog just asks for general audio and video. There was
already a FIXME about improving this.
(WebCore::RealtimeMediaSourceCenterOwr::createMediaStream): We are
capturing the devices here when the allowed message arrived from
the UI process. We store the completion handler to use it later
when the aync owr API finishes capture devices process.
(WebCore::RealtimeMediaSourceCenterOwr::mediaSourcesAvailable): We
now call the completion handler in this callback called when the
owr library finishes the capture of the devices. Now this happens
in the WebProcess for OWR port.
* platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.h:
Add an attribute to store the completion handler.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamopenwebrtcRealtimeMediaSourceCenterOwrcpp">trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamopenwebrtcRealtimeMediaSourceCenterOwrh">trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (208586 => 208587)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-11-11 11:08:39 UTC (rev 208586)
+++ trunk/Source/WebCore/ChangeLog        2016-11-11 13:09:33 UTC (rev 208587)
</span><span class="lines">@@ -1,3 +1,33 @@
</span><ins>+2016-11-11  Alejandro G. Castro  &lt;alex@igalia.com&gt;
+
+        [WebRTC][OpenWebRTC] Implement device permissions handling solution for owr backend in the UI process
+        https://bugs.webkit.org/show_bug.cgi?id=164010
+
+        Reviewed by Philippe Normand.
+
+        Move the capture of the sources for the OWR backend to the
+        WebProcess. In the UI we continue checking if the user allows
+        access to the audio and video capture. When device handling is
+        added in the future we will need some persistent ID and API to
+        pass from the UI process to the Web process.
+
+        * platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp:
+        (WebCore::RealtimeMediaSourceCenterOwr::validateRequestConstraints):
+        Add the proper audio and video sources to allow the UI message to
+        be properly rendered. We are adding the specific devices, even
+        though the dialog just asks for general audio and video. There was
+        already a FIXME about improving this.
+        (WebCore::RealtimeMediaSourceCenterOwr::createMediaStream): We are
+        capturing the devices here when the allowed message arrived from
+        the UI process. We store the completion handler to use it later
+        when the aync owr API finishes capture devices process.
+        (WebCore::RealtimeMediaSourceCenterOwr::mediaSourcesAvailable): We
+        now call the completion handler in this callback called when the
+        owr library finishes the capture of the devices. Now this happens
+        in the WebProcess for OWR port.
+        * platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.h:
+        Add an attribute to store the completion handler.
+
</ins><span class="cx"> 2016-11-11  Manuel Rego Casasnovas  &lt;rego@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [css-grid] ASSERTION FAILED: !m_gridIsDirty in WebCore::RenderGrid::gridRowCount
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamopenwebrtcRealtimeMediaSourceCenterOwrcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp (208586 => 208587)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp        2016-11-11 11:08:39 UTC (rev 208586)
+++ trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp        2016-11-11 13:09:33 UTC (rev 208587)
</span><span class="lines">@@ -81,46 +81,35 @@
</span><span class="cx">     m_validConstraintsHandler = WTFMove(validHandler);
</span><span class="cx">     m_invalidConstraintsHandler = WTFMove(invalidHandler);
</span><span class="cx"> 
</span><ins>+    Vector&lt;String&gt; audioSources;
+    Vector&lt;String&gt; videoSources;
+
</ins><span class="cx">     // FIXME: Actually do constraints validation. The MediaConstraints
</span><span class="cx">     // need to comply with the available audio/video device(s)
</span><span class="cx">     // capabilities. See bug #123345.
</span><del>-    int types = OWR_MEDIA_TYPE_UNKNOWN;
</del><span class="cx">     if (audioConstraints.isValid())
</span><del>-        types |= OWR_MEDIA_TYPE_AUDIO;
</del><ins>+        audioSources.append(String(&quot;audio&quot;));
+
</ins><span class="cx">     if (videoConstraints.isValid())
</span><del>-        types |= OWR_MEDIA_TYPE_VIDEO;
</del><ins>+        videoSources.append(String(&quot;video&quot;));
</ins><span class="cx"> 
</span><del>-    owr_get_capture_sources(static_cast&lt;OwrMediaType&gt;(types), mediaSourcesAvailableCallback, this);
</del><ins>+    m_validConstraintsHandler(WTFMove(audioSources), WTFMove(videoSources));
+    m_validConstraintsHandler = nullptr;
+    m_invalidConstraintsHandler = nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RealtimeMediaSourceCenterOwr::createMediaStream(NewMediaStreamHandler completionHandler, const String&amp; audioDeviceID, const String&amp; videoDeviceID, const MediaConstraints*, const MediaConstraints*)
</span><span class="cx"> {
</span><del>-    Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; audioSources;
-    Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; videoSources;
</del><ins>+    int types = OWR_MEDIA_TYPE_UNKNOWN;
</ins><span class="cx"> 
</span><del>-    // FIXME: Actually apply constraints to newly created sources.
</del><ins>+    if (!audioDeviceID.isEmpty())
+        types |= OWR_MEDIA_TYPE_AUDIO;
+    if (!videoDeviceID.isEmpty())
+        types |= OWR_MEDIA_TYPE_VIDEO;
</ins><span class="cx"> 
</span><del>-    if (!audioDeviceID.isEmpty()) {
-        RealtimeMediaSourceOwrMap::iterator sourceIterator = m_sourceMap.find(audioDeviceID);
-        if (sourceIterator != m_sourceMap.end()) {
-            RefPtr&lt;RealtimeMediaSource&gt; source = sourceIterator-&gt;value;
-            if (source-&gt;type() == RealtimeMediaSource::Audio)
-                audioSources.append(source.release());
-        }
-    }
-    if (!videoDeviceID.isEmpty()) {
-        RealtimeMediaSourceOwrMap::iterator sourceIterator = m_sourceMap.find(videoDeviceID);
-        if (sourceIterator != m_sourceMap.end()) {
-            RefPtr&lt;RealtimeMediaSource&gt; source = sourceIterator-&gt;value;
-            if (source-&gt;type() == RealtimeMediaSource::Video)
-                videoSources.append(source.release());
-        }
-    }
</del><ins>+    m_completionHandler = completionHandler;
</ins><span class="cx"> 
</span><del>-    if (videoSources.isEmpty() &amp;&amp; audioSources.isEmpty())
-        completionHandler(nullptr);
-    else
-        completionHandler(MediaStreamPrivate::create(audioSources, videoSources));
</del><ins>+    owr_get_capture_sources(static_cast&lt;OwrMediaType&gt;(types), mediaSourcesAvailableCallback, this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Vector&lt;CaptureDevice&gt; RealtimeMediaSourceCenterOwr::getMediaStreamDevices()
</span><span class="lines">@@ -131,8 +120,8 @@
</span><span class="cx"> 
</span><span class="cx"> void RealtimeMediaSourceCenterOwr::mediaSourcesAvailable(GList* sources)
</span><span class="cx"> {
</span><del>-    Vector&lt;String&gt; audioSources;
-    Vector&lt;String&gt; videoSources;
</del><ins>+    Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; audioSources;
+    Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; videoSources;
</ins><span class="cx"> 
</span><span class="cx">     for (auto item = sources; item; item = item-&gt;next) {
</span><span class="cx">         OwrMediaSource* source = OWR_MEDIA_SOURCE(item-&gt;data);
</span><span class="lines">@@ -143,17 +132,24 @@
</span><span class="cx">         String sourceName(name.get());
</span><span class="cx">         String id(createCanonicalUUIDString());
</span><span class="cx"> 
</span><del>-        RealtimeMediaSource::Type sourceType;
</del><ins>+        if (g_getenv(&quot;OWR_USE_TEST_SOURCES&quot;)) {
+            OwrSourceType sourceType = OWR_SOURCE_TYPE_UNKNOWN;
+            g_object_get(source, &quot;type&quot;, &amp;sourceType, NULL);
+            if (sourceType != OWR_SOURCE_TYPE_TEST)
+                continue;
+        }
+
+        RealtimeMediaSource::Type mediaSourceType;
</ins><span class="cx">         if (mediaType &amp; OWR_MEDIA_TYPE_AUDIO)
</span><del>-            sourceType = RealtimeMediaSource::Audio;
</del><ins>+            mediaSourceType = RealtimeMediaSource::Audio;
</ins><span class="cx">         else if (mediaType &amp; OWR_MEDIA_TYPE_VIDEO)
</span><del>-            sourceType = RealtimeMediaSource::Video;
</del><ins>+            mediaSourceType = RealtimeMediaSource::Video;
</ins><span class="cx">         else {
</span><del>-            sourceType = RealtimeMediaSource::None;
</del><ins>+            mediaSourceType = RealtimeMediaSource::None;
</ins><span class="cx">             ASSERT_NOT_REACHED();
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        RefPtr&lt;RealtimeMediaSourceOwr&gt; mediaSource = adoptRef(new RealtimeMediaSourceOwr(source, id, sourceType, sourceName));
</del><ins>+        RefPtr&lt;RealtimeMediaSourceOwr&gt; mediaSource = adoptRef(new RealtimeMediaSourceOwr(source, id, mediaSourceType, sourceName));
</ins><span class="cx"> 
</span><span class="cx">         RealtimeMediaSourceOwrMap::iterator sourceIterator = m_sourceMap.find(id);
</span><span class="cx">         if (sourceIterator == m_sourceMap.end())
</span><span class="lines">@@ -160,15 +156,16 @@
</span><span class="cx">             m_sourceMap.add(id, mediaSource);
</span><span class="cx"> 
</span><span class="cx">         if (mediaType &amp; OWR_MEDIA_TYPE_AUDIO)
</span><del>-            audioSources.append(id);
</del><ins>+            audioSources.append(mediaSource);
</ins><span class="cx">         else if (mediaType &amp; OWR_MEDIA_TYPE_VIDEO)
</span><del>-            videoSources.append(id);
</del><ins>+            videoSources.append(mediaSource);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // TODO: Make sure contraints are actually validated by checking source types.
-    m_validConstraintsHandler(WTFMove(audioSources), WTFMove(videoSources));
-    m_validConstraintsHandler = nullptr;
-    m_invalidConstraintsHandler = nullptr;
</del><ins>+    if (videoSources.isEmpty() &amp;&amp; audioSources.isEmpty())
+        m_completionHandler(nullptr);
+    else
+        m_completionHandler(MediaStreamPrivate::create(audioSources, videoSources));
+
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;RealtimeMediaSource&gt; RealtimeMediaSourceCenterOwr::firstSource(RealtimeMediaSource::Type type)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamopenwebrtcRealtimeMediaSourceCenterOwrh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.h (208586 => 208587)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.h        2016-11-11 11:08:39 UTC (rev 208586)
+++ trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.h        2016-11-11 13:09:33 UTC (rev 208587)
</span><span class="lines">@@ -67,6 +67,7 @@
</span><span class="cx">     RealtimeMediaSourceOwrMap m_sourceMap;
</span><span class="cx">     ValidConstraintsHandler m_validConstraintsHandler;
</span><span class="cx">     InvalidConstraintsHandler m_invalidConstraintsHandler;
</span><ins>+    NewMediaStreamHandler m_completionHandler;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre>
</div>
</div>

</body>
</html>