<!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>[208379] 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/208379">208379</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2016-11-03 23:34:46 -0700 (Thu, 03 Nov 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WebRTC] Introduce asynchronous backend createOffer API
https://bugs.webkit.org/show_bug.cgi?id=164365

Patch by Youenn Fablet &lt;youenn@apple.com&gt; on 2016-11-03
Reviewed by Sam Weinig.

Covered by existing tests.

Removing PeerEndpointBackendClient as it is only RTCPeerConnection.
This allows removing virtual for some functions.

Moving MediaEndpointPeerClient::m_client to PeerEndpointBackendClient::m_peerConnection and making it a reference.

Implementing createOffer at PeerConnectionBackend by splitting it in four sub-functions:
- main createOffer, implemented at PeerConnectionBackend.
- doCreateOffer implemented by subclasses (MediaEndpointPeerConnection).
- createOfferSucceeded/createOfferFailed implemented by PeerConnectionBackend.

* CMakeLists.txt:
* Modules/mediastream/MediaEndpointPeerConnection.cpp:
(WebCore::createMediaEndpointPeerConnection):
(WebCore::MediaEndpointPeerConnection::MediaEndpointPeerConnection):
(WebCore::MediaEndpointPeerConnection::doCreateOffer):
(WebCore::MediaEndpointPeerConnection::createOfferTask):
(WebCore::MediaEndpointPeerConnection::createAnswerTask):
(WebCore::MediaEndpointPeerConnection::setLocalDescriptionTask):
(WebCore::MediaEndpointPeerConnection::setRemoteDescriptionTask):
(WebCore::MediaEndpointPeerConnection::addIceCandidateTask):
(WebCore::MediaEndpointPeerConnection::createReceiver):
(WebCore::MediaEndpointPeerConnection::replaceTrack):
(WebCore::MediaEndpointPeerConnection::replaceTrackTask):
(WebCore::MediaEndpointPeerConnection::markAsNeedingNegotiation):
(WebCore::MediaEndpointPeerConnection::localDescriptionTypeValidForState):
(WebCore::MediaEndpointPeerConnection::remoteDescriptionTypeValidForState):
(WebCore::MediaEndpointPeerConnection::gotIceCandidate):
(WebCore::MediaEndpointPeerConnection::doneGatheringCandidates):
(WebCore::MediaEndpointPeerConnection::iceTransportStateChanged):
(WebCore::MediaEndpointPeerConnection::createOffer): Deleted.
* Modules/mediastream/MediaEndpointPeerConnection.h:
* Modules/mediastream/PeerConnectionBackend.cpp:
(WebCore::PeerConnectionBackend::createOffer):
(WebCore::PeerConnectionBackend::createOfferSucceeded):
(WebCore::PeerConnectionBackend::createOfferFailed):
(WebCore::createPeerConnectionBackend): Deleted.
* Modules/mediastream/PeerConnectionBackend.h:
(WebCore::PeerConnectionBackend::PeerConnectionBackend):
(WebCore::PeerConnectionBackendClient::~PeerConnectionBackendClient): Deleted.
* Modules/mediastream/RTCPeerConnection.cpp:
(WebCore::RTCPeerConnection::RTCPeerConnection):
* Modules/mediastream/RTCPeerConnection.h:
* WebCore.xcodeproj/project.pbxproj:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectioncpp">trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectionh">trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamPeerConnectionBackendcpp">trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamPeerConnectionBackendh">trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCPeerConnectioncpp">trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCPeerConnectionh">trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (208378 => 208379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2016-11-04 06:21:06 UTC (rev 208378)
+++ trunk/Source/WebCore/CMakeLists.txt        2016-11-04 06:34:46 UTC (rev 208379)
</span><span class="lines">@@ -902,6 +902,7 @@
</span><span class="cx">     Modules/mediastream/MediaTrackConstraintSet.cpp
</span><span class="cx">     Modules/mediastream/MediaTrackConstraints.cpp
</span><span class="cx">     Modules/mediastream/NavigatorMediaDevices.cpp
</span><ins>+    Modules/mediastream/PeerConnectionBackend.cpp
</ins><span class="cx">     Modules/mediastream/RTCConfiguration.cpp
</span><span class="cx">     Modules/mediastream/RTCDTMFSender.cpp
</span><span class="cx">     Modules/mediastream/RTCDTMFToneChangeEvent.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (208378 => 208379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-11-04 06:21:06 UTC (rev 208378)
+++ trunk/Source/WebCore/ChangeLog        2016-11-04 06:34:46 UTC (rev 208379)
</span><span class="lines">@@ -1,3 +1,56 @@
</span><ins>+2016-11-03  Youenn Fablet  &lt;youenn@apple.com&gt;
+
+        [WebRTC] Introduce asynchronous backend createOffer API
+        https://bugs.webkit.org/show_bug.cgi?id=164365
+
+        Reviewed by Sam Weinig.
+
+        Covered by existing tests.
+
+        Removing PeerEndpointBackendClient as it is only RTCPeerConnection.
+        This allows removing virtual for some functions.
+
+        Moving MediaEndpointPeerClient::m_client to PeerEndpointBackendClient::m_peerConnection and making it a reference.
+
+        Implementing createOffer at PeerConnectionBackend by splitting it in four sub-functions:
+        - main createOffer, implemented at PeerConnectionBackend.
+        - doCreateOffer implemented by subclasses (MediaEndpointPeerConnection).
+        - createOfferSucceeded/createOfferFailed implemented by PeerConnectionBackend.
+
+        * CMakeLists.txt:
+        * Modules/mediastream/MediaEndpointPeerConnection.cpp:
+        (WebCore::createMediaEndpointPeerConnection):
+        (WebCore::MediaEndpointPeerConnection::MediaEndpointPeerConnection):
+        (WebCore::MediaEndpointPeerConnection::doCreateOffer):
+        (WebCore::MediaEndpointPeerConnection::createOfferTask):
+        (WebCore::MediaEndpointPeerConnection::createAnswerTask):
+        (WebCore::MediaEndpointPeerConnection::setLocalDescriptionTask):
+        (WebCore::MediaEndpointPeerConnection::setRemoteDescriptionTask):
+        (WebCore::MediaEndpointPeerConnection::addIceCandidateTask):
+        (WebCore::MediaEndpointPeerConnection::createReceiver):
+        (WebCore::MediaEndpointPeerConnection::replaceTrack):
+        (WebCore::MediaEndpointPeerConnection::replaceTrackTask):
+        (WebCore::MediaEndpointPeerConnection::markAsNeedingNegotiation):
+        (WebCore::MediaEndpointPeerConnection::localDescriptionTypeValidForState):
+        (WebCore::MediaEndpointPeerConnection::remoteDescriptionTypeValidForState):
+        (WebCore::MediaEndpointPeerConnection::gotIceCandidate):
+        (WebCore::MediaEndpointPeerConnection::doneGatheringCandidates):
+        (WebCore::MediaEndpointPeerConnection::iceTransportStateChanged):
+        (WebCore::MediaEndpointPeerConnection::createOffer): Deleted.
+        * Modules/mediastream/MediaEndpointPeerConnection.h:
+        * Modules/mediastream/PeerConnectionBackend.cpp:
+        (WebCore::PeerConnectionBackend::createOffer):
+        (WebCore::PeerConnectionBackend::createOfferSucceeded):
+        (WebCore::PeerConnectionBackend::createOfferFailed):
+        (WebCore::createPeerConnectionBackend): Deleted.
+        * Modules/mediastream/PeerConnectionBackend.h:
+        (WebCore::PeerConnectionBackend::PeerConnectionBackend):
+        (WebCore::PeerConnectionBackendClient::~PeerConnectionBackendClient): Deleted.
+        * Modules/mediastream/RTCPeerConnection.cpp:
+        (WebCore::RTCPeerConnection::RTCPeerConnection):
+        * Modules/mediastream/RTCPeerConnection.h:
+        * WebCore.xcodeproj/project.pbxproj:
+
</ins><span class="cx"> 2016-11-03  Antti Koivisto  &lt;antti@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r207717): DumpRenderTree crashed in com.apple.WebCore: WebCore::Style::Scope::flushPendingUpdate + 16
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp (208378 => 208379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp        2016-11-04 06:21:06 UTC (rev 208378)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp        2016-11-04 06:34:46 UTC (rev 208379)
</span><span class="lines">@@ -45,6 +45,7 @@
</span><span class="cx"> #include &quot;RTCIceCandidate.h&quot;
</span><span class="cx"> #include &quot;RTCIceCandidateEvent.h&quot;
</span><span class="cx"> #include &quot;RTCOfferAnswerOptions.h&quot;
</span><ins>+#include &quot;RTCPeerConnection.h&quot;
</ins><span class="cx"> #include &quot;RTCRtpTransceiver.h&quot;
</span><span class="cx"> #include &quot;RTCTrackEvent.h&quot;
</span><span class="cx"> #include &quot;SDPProcessor.h&quot;
</span><span class="lines">@@ -63,9 +64,9 @@
</span><span class="cx"> // Size range from 22 to 256 ice-chars defined in RFC 5245.
</span><span class="cx"> static const size_t icePasswordSize = 24;
</span><span class="cx"> 
</span><del>-static std::unique_ptr&lt;PeerConnectionBackend&gt; createMediaEndpointPeerConnection(PeerConnectionBackendClient* client)
</del><ins>+static std::unique_ptr&lt;PeerConnectionBackend&gt; createMediaEndpointPeerConnection(RTCPeerConnection&amp; peerConnection)
</ins><span class="cx"> {
</span><del>-    return std::unique_ptr&lt;PeerConnectionBackend&gt;(new MediaEndpointPeerConnection(client));
</del><ins>+    return std::unique_ptr&lt;PeerConnectionBackend&gt;(new MediaEndpointPeerConnection(peerConnection));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> CreatePeerConnectionBackend PeerConnectionBackend::create = createMediaEndpointPeerConnection;
</span><span class="lines">@@ -77,10 +78,10 @@
</span><span class="cx">     return base64Encode(randomValues, size);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-MediaEndpointPeerConnection::MediaEndpointPeerConnection(PeerConnectionBackendClient* client)
-    : m_client(client)
</del><ins>+MediaEndpointPeerConnection::MediaEndpointPeerConnection(RTCPeerConnection&amp; peerConnection)
+    : PeerConnectionBackend(peerConnection)
</ins><span class="cx">     , m_mediaEndpoint(MediaEndpoint::create(*this))
</span><del>-    , m_sdpProcessor(std::unique_ptr&lt;SDPProcessor&gt;(new SDPProcessor(m_client-&gt;scriptExecutionContext())))
</del><ins>+    , m_sdpProcessor(std::unique_ptr&lt;SDPProcessor&gt;(new SDPProcessor(m_peerConnection.scriptExecutionContext())))
</ins><span class="cx">     , m_cname(randomString(cnameSize))
</span><span class="cx">     , m_iceUfrag(randomString(iceUfragSize))
</span><span class="cx">     , m_icePassword(randomString(icePasswordSize))
</span><span class="lines">@@ -136,20 +137,17 @@
</span><span class="cx">     m_initialDeferredTask = nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaEndpointPeerConnection::createOffer(RTCOfferOptions&amp;&amp; options, SessionDescriptionPromise&amp;&amp; promise)
</del><ins>+void MediaEndpointPeerConnection::doCreateOffer(RTCOfferOptions&amp;&amp; options)
</ins><span class="cx"> {
</span><del>-    runTask([this, protectedOptions = WTFMove(options), protectedPromise = WTFMove(promise)]() mutable {
-        createOfferTask(protectedOptions, protectedPromise);
</del><ins>+    runTask([this, protectedOptions = WTFMove(options)]() mutable {
+        createOfferTask(protectedOptions);
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaEndpointPeerConnection::createOfferTask(const RTCOfferOptions&amp;, SessionDescriptionPromise&amp; promise)
</del><ins>+void MediaEndpointPeerConnection::createOfferTask(const RTCOfferOptions&amp;)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_dtlsFingerprint.isEmpty());
</span><span class="cx"> 
</span><del>-    if (m_client-&gt;internalSignalingState() == SignalingState::Closed)
-        return;
-
</del><span class="cx">     MediaEndpointSessionDescription* localDescription = internalLocalDescription();
</span><span class="cx">     RefPtr&lt;MediaEndpointSessionConfiguration&gt; configurationSnapshot = localDescription ?
</span><span class="cx">         localDescription-&gt;configuration()-&gt;clone() : MediaEndpointSessionConfiguration::create();
</span><span class="lines">@@ -156,7 +154,7 @@
</span><span class="cx"> 
</span><span class="cx">     configurationSnapshot-&gt;setSessionVersion(m_sdpOfferSessionVersion++);
</span><span class="cx"> 
</span><del>-    auto transceivers = RtpTransceiverVector(m_client-&gt;getTransceivers());
</del><ins>+    auto transceivers = RtpTransceiverVector(m_peerConnection.getTransceivers());
</ins><span class="cx"> 
</span><span class="cx">     // Remove any transceiver objects from transceivers that can be matched to an existing media description.
</span><span class="cx">     for (auto&amp; mediaDescription : configurationSnapshot-&gt;mediaDescriptions()) {
</span><span class="lines">@@ -203,8 +201,13 @@
</span><span class="cx">         configurationSnapshot-&gt;addMediaDescription(WTFMove(mediaDescription));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    auto description = MediaEndpointSessionDescription::create(RTCSessionDescription::SdpType::Offer, WTFMove(configurationSnapshot));
-    promise.resolve(*description-&gt;toRTCSessionDescription(*m_sdpProcessor));
</del><ins>+    String sdp;
+    SDPProcessor::Result result = m_sdpProcessor-&gt;generate(*configurationSnapshot, sdp);
+    if (result != SDPProcessor::Result::Success) {
+        createOfferFailed(OperationError, &quot;SDPProcessor internal error&quot;);
+        return;
+    }
+    createOfferSucceeded(WTFMove(sdp));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaEndpointPeerConnection::createAnswer(RTCAnswerOptions&amp;&amp; options, SessionDescriptionPromise&amp;&amp; promise)
</span><span class="lines">@@ -218,7 +221,7 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!m_dtlsFingerprint.isEmpty());
</span><span class="cx"> 
</span><del>-    if (m_client-&gt;internalSignalingState() == SignalingState::Closed)
</del><ins>+    if (m_peerConnection.internalSignalingState() == SignalingState::Closed)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (!internalRemoteDescription()) {
</span><span class="lines">@@ -232,7 +235,7 @@
</span><span class="cx"> 
</span><span class="cx">     configurationSnapshot-&gt;setSessionVersion(m_sdpAnswerSessionVersion++);
</span><span class="cx"> 
</span><del>-    auto transceivers = RtpTransceiverVector(m_client-&gt;getTransceivers());
</del><ins>+    auto transceivers = RtpTransceiverVector(m_peerConnection.getTransceivers());
</ins><span class="cx">     auto&amp; remoteMediaDescriptions = internalRemoteDescription()-&gt;configuration()-&gt;mediaDescriptions();
</span><span class="cx"> 
</span><span class="cx">     for (unsigned i = 0; i &lt; remoteMediaDescriptions.size(); ++i) {
</span><span class="lines">@@ -318,7 +321,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaEndpointPeerConnection::setLocalDescriptionTask(RefPtr&lt;RTCSessionDescription&gt;&amp;&amp; description, VoidPromise&amp; promise)
</span><span class="cx"> {
</span><del>-    if (m_client-&gt;internalSignalingState() == SignalingState::Closed)
</del><ins>+    if (m_peerConnection.internalSignalingState() == SignalingState::Closed)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     auto result = MediaEndpointSessionDescription::create(WTFMove(description), *m_sdpProcessor);
</span><span class="lines">@@ -333,7 +336,7 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const RtpTransceiverVector&amp; transceivers = m_client-&gt;getTransceivers();
</del><ins>+    const RtpTransceiverVector&amp; transceivers = m_peerConnection.getTransceivers();
</ins><span class="cx">     const MediaDescriptionVector&amp; mediaDescriptions = newDescription-&gt;configuration()-&gt;mediaDescriptions();
</span><span class="cx">     MediaEndpointSessionDescription* localDescription = internalLocalDescription();
</span><span class="cx">     unsigned previousNumberOfMediaDescriptions = localDescription ? localDescription-&gt;configuration()-&gt;mediaDescriptions().size() : 0;
</span><span class="lines">@@ -344,11 +347,11 @@
</span><span class="cx">         MediaEndpoint::UpdateResult result = m_mediaEndpoint-&gt;updateReceiveConfiguration(newDescription-&gt;configuration(), isInitiator);
</span><span class="cx"> 
</span><span class="cx">         if (result == MediaEndpoint::UpdateResult::SuccessWithIceRestart) {
</span><del>-            if (m_client-&gt;internalIceGatheringState() != IceGatheringState::Gathering)
-                m_client-&gt;updateIceGatheringState(IceGatheringState::Gathering);
</del><ins>+            if (m_peerConnection.internalIceGatheringState() != IceGatheringState::Gathering)
+                m_peerConnection.updateIceGatheringState(IceGatheringState::Gathering);
</ins><span class="cx"> 
</span><del>-            if (m_client-&gt;internalIceConnectionState() != IceConnectionState::Completed)
-                m_client-&gt;updateIceConnectionState(IceConnectionState::Connected);
</del><ins>+            if (m_peerConnection.internalIceConnectionState() != IceConnectionState::Completed)
+                m_peerConnection.updateIceConnectionState(IceConnectionState::Connected);
</ins><span class="cx"> 
</span><span class="cx">             LOG_ERROR(&quot;ICE restart is not implemented&quot;);
</span><span class="cx">             notImplemented();
</span><span class="lines">@@ -409,16 +412,16 @@
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (newSignalingState != m_client-&gt;internalSignalingState()) {
-        m_client-&gt;setSignalingState(newSignalingState);
-        m_client-&gt;fireEvent(Event::create(eventNames().signalingstatechangeEvent, false, false));
</del><ins>+    if (newSignalingState != m_peerConnection.internalSignalingState()) {
+        m_peerConnection.setSignalingState(newSignalingState);
+        m_peerConnection.fireEvent(Event::create(eventNames().signalingstatechangeEvent, false, false));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (m_client-&gt;internalIceGatheringState() == IceGatheringState::New &amp;&amp; mediaDescriptions.size())
-        m_client-&gt;updateIceGatheringState(IceGatheringState::Gathering);
</del><ins>+    if (m_peerConnection.internalIceGatheringState() == IceGatheringState::New &amp;&amp; mediaDescriptions.size())
+        m_peerConnection.updateIceGatheringState(IceGatheringState::Gathering);
</ins><span class="cx"> 
</span><del>-    if (m_client-&gt;internalSignalingState() == SignalingState::Stable &amp;&amp; m_negotiationNeeded)
-        m_client-&gt;scheduleNegotiationNeededEvent();
</del><ins>+    if (m_peerConnection.internalSignalingState() == SignalingState::Stable &amp;&amp; m_negotiationNeeded)
+        m_peerConnection.scheduleNegotiationNeededEvent();
</ins><span class="cx"> 
</span><span class="cx">     promise.resolve(nullptr);
</span><span class="cx"> }
</span><span class="lines">@@ -447,7 +450,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaEndpointPeerConnection::setRemoteDescriptionTask(RefPtr&lt;RTCSessionDescription&gt;&amp;&amp; description, VoidPromise&amp; promise)
</span><span class="cx"> {
</span><del>-    if (m_client-&gt;internalSignalingState() == SignalingState::Closed)
</del><ins>+    if (m_peerConnection.internalSignalingState() == SignalingState::Closed)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     auto result = MediaEndpointSessionDescription::create(WTFMove(description), *m_sdpProcessor);
</span><span class="lines">@@ -471,7 +474,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool isInitiator = newDescription-&gt;type() == RTCSessionDescription::SdpType::Answer;
</span><del>-    const RtpTransceiverVector&amp; transceivers = m_client-&gt;getTransceivers();
</del><ins>+    const RtpTransceiverVector&amp; transceivers = m_peerConnection.getTransceivers();
</ins><span class="cx"> 
</span><span class="cx">     RealtimeMediaSourceMap sendSourceMap;
</span><span class="cx">     if (internalLocalDescription())
</span><span class="lines">@@ -506,7 +509,7 @@
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             if (!transceiver) {
</span><del>-                auto sender = RTCRtpSender::create(mediaDescription.type, Vector&lt;String&gt;(), m_client-&gt;senderClient());
</del><ins>+                auto sender = RTCRtpSender::create(mediaDescription.type, Vector&lt;String&gt;(), m_peerConnection.senderClient());
</ins><span class="cx">                 auto receiver = createReceiver(mediaDescription.mid, mediaDescription.type, mediaDescription.mediaStreamTrackId);
</span><span class="cx"> 
</span><span class="cx">                 auto newTransceiver = RTCRtpTransceiver::create(WTFMove(sender), WTFMove(receiver));
</span><span class="lines">@@ -515,7 +518,7 @@
</span><span class="cx">                     newTransceiver-&gt;disableSendingDirection();
</span><span class="cx"> 
</span><span class="cx">                 transceiver = newTransceiver.ptr();
</span><del>-                m_client-&gt;addTransceiver(WTFMove(newTransceiver));
</del><ins>+                m_peerConnection.addTransceiver(WTFMove(newTransceiver));
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -539,7 +542,7 @@
</span><span class="cx">                     stream-&gt;addTrack(*receiver.track());
</span><span class="cx">                     trackEventMediaStreams.add(id, WTFMove(stream));
</span><span class="cx">                 } else {
</span><del>-                    auto newStream = MediaStream::create(*m_client-&gt;scriptExecutionContext(), MediaStreamTrackVector({ receiver.track() }));
</del><ins>+                    auto newStream = MediaStream::create(*m_peerConnection.scriptExecutionContext(), MediaStreamTrackVector({ receiver.track() }));
</ins><span class="cx">                     m_remoteStreamMap.add(id, newStream.copyRef());
</span><span class="cx">                     legacyMediaStreamEvents.append(MediaStreamEvent::create(eventNames().addstreamEvent, false, false, newStream.copyRef()));
</span><span class="cx">                     trackEventMediaStreams.add(id, WTFMove(newStream));
</span><span class="lines">@@ -549,7 +552,7 @@
</span><span class="cx">             Vector&lt;RefPtr&lt;MediaStream&gt;&gt; streams;
</span><span class="cx">             copyValuesToVector(trackEventMediaStreams, streams);
</span><span class="cx"> 
</span><del>-            m_client-&gt;fireEvent(RTCTrackEvent::create(eventNames().trackEvent, false, false,
</del><ins>+            m_peerConnection.fireEvent(RTCTrackEvent::create(eventNames().trackEvent, false, false,
</ins><span class="cx">                 &amp;receiver, receiver.track(), WTFMove(streams), transceiver));
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -556,7 +559,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Fire legacy addstream events.
</span><span class="cx">     for (auto&amp; event : legacyMediaStreamEvents)
</span><del>-        m_client-&gt;fireEvent(*event);
</del><ins>+        m_peerConnection.fireEvent(*event);
</ins><span class="cx"> 
</span><span class="cx">     SignalingState newSignalingState;
</span><span class="cx"> 
</span><span class="lines">@@ -586,9 +589,9 @@
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (newSignalingState != m_client-&gt;internalSignalingState()) {
-        m_client-&gt;setSignalingState(newSignalingState);
-        m_client-&gt;fireEvent(Event::create(eventNames().signalingstatechangeEvent, false, false));
</del><ins>+    if (newSignalingState != m_peerConnection.internalSignalingState()) {
+        m_peerConnection.setSignalingState(newSignalingState);
+        m_peerConnection.fireEvent(Event::create(eventNames().signalingstatechangeEvent, false, false));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     promise.resolve(nullptr);
</span><span class="lines">@@ -635,7 +638,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaEndpointPeerConnection::addIceCandidateTask(RTCIceCandidate&amp; rtcCandidate, PeerConnection::VoidPromise&amp; promise)
</span><span class="cx"> {
</span><del>-    if (m_client-&gt;internalSignalingState() == SignalingState::Closed)
</del><ins>+    if (m_peerConnection.internalSignalingState() == SignalingState::Closed)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (!internalRemoteDescription()) {
</span><span class="lines">@@ -711,7 +714,7 @@
</span><span class="cx">     // Create a muted remote source that will be unmuted once media starts arriving.
</span><span class="cx">     auto remoteSource = m_mediaEndpoint-&gt;createMutedRemoteSource(transceiverMid, sourceType);
</span><span class="cx">     auto remoteTrackPrivate = MediaStreamTrackPrivate::create(WTFMove(remoteSource), trackId);
</span><del>-    auto remoteTrack = MediaStreamTrack::create(*m_client-&gt;scriptExecutionContext(), *remoteTrackPrivate);
</del><ins>+    auto remoteTrack = MediaStreamTrack::create(*m_peerConnection.scriptExecutionContext(), *remoteTrackPrivate);
</ins><span class="cx"> 
</span><span class="cx">     return RTCRtpReceiver::create(WTFMove(remoteTrack));
</span><span class="cx"> }
</span><span class="lines">@@ -718,7 +721,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaEndpointPeerConnection::replaceTrack(RTCRtpSender&amp; sender, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp; withTrack, PeerConnection::VoidPromise&amp;&amp; promise)
</span><span class="cx"> {
</span><del>-    RTCRtpTransceiver* transceiver = matchTransceiver(m_client-&gt;getTransceivers(), [&amp;sender] (RTCRtpTransceiver&amp; current) {
</del><ins>+    RTCRtpTransceiver* transceiver = matchTransceiver(m_peerConnection.getTransceivers(), [&amp;sender] (RTCRtpTransceiver&amp; current) {
</ins><span class="cx">         return current.sender() == &amp;sender;
</span><span class="cx">     });
</span><span class="cx">     ASSERT(transceiver);
</span><span class="lines">@@ -738,7 +741,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaEndpointPeerConnection::replaceTrackTask(RTCRtpSender&amp; sender, const String&amp; mid, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp; withTrack, PeerConnection::VoidPromise&amp; promise)
</span><span class="cx"> {
</span><del>-    if (m_client-&gt;internalSignalingState() == SignalingState::Closed)
</del><ins>+    if (m_peerConnection.internalSignalingState() == SignalingState::Closed)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_mediaEndpoint-&gt;replaceSendSource(withTrack-&gt;source(), mid);
</span><span class="lines">@@ -759,8 +762,8 @@
</span><span class="cx"> 
</span><span class="cx">     m_negotiationNeeded = true;
</span><span class="cx"> 
</span><del>-    if (m_client-&gt;internalSignalingState() == SignalingState::Stable)
-        m_client-&gt;scheduleNegotiationNeededEvent();
</del><ins>+    if (m_peerConnection.internalSignalingState() == SignalingState::Stable)
+        m_peerConnection.scheduleNegotiationNeededEvent();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaEndpointPeerConnection::emulatePlatformEvent(const String&amp; action)
</span><span class="lines">@@ -770,7 +773,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool MediaEndpointPeerConnection::localDescriptionTypeValidForState(RTCSessionDescription::SdpType type) const
</span><span class="cx"> {
</span><del>-    switch (m_client-&gt;internalSignalingState()) {
</del><ins>+    switch (m_peerConnection.internalSignalingState()) {
</ins><span class="cx">     case SignalingState::Stable:
</span><span class="cx">         return type == RTCSessionDescription::SdpType::Offer;
</span><span class="cx">     case SignalingState::HaveLocalOffer:
</span><span class="lines">@@ -789,7 +792,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool MediaEndpointPeerConnection::remoteDescriptionTypeValidForState(RTCSessionDescription::SdpType type) const
</span><span class="cx"> {
</span><del>-    switch (m_client-&gt;internalSignalingState()) {
</del><ins>+    switch (m_peerConnection.internalSignalingState()) {
</ins><span class="cx">     case SignalingState::Stable:
</span><span class="cx">         return type == RTCSessionDescription::SdpType::Offer;
</span><span class="cx">     case SignalingState::HaveLocalOffer:
</span><span class="lines">@@ -855,7 +858,7 @@
</span><span class="cx"> 
</span><span class="cx">     mediaDescriptions[mediaDescriptionIndex].addIceCandidate(WTFMove(candidate));
</span><span class="cx"> 
</span><del>-    m_client-&gt;fireEvent(RTCIceCandidateEvent::create(false, false, RTCIceCandidate::create(candidateLine, mid, mediaDescriptionIndex)));
</del><ins>+    m_peerConnection.fireEvent(RTCIceCandidateEvent::create(false, false, RTCIceCandidate::create(candidateLine, mid, mediaDescriptionIndex)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaEndpointPeerConnection::doneGatheringCandidates(const String&amp; mid)
</span><span class="lines">@@ -862,7 +865,7 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx"> 
</span><del>-    RtpTransceiverVector transceivers = RtpTransceiverVector(m_client-&gt;getTransceivers());
</del><ins>+    RtpTransceiverVector transceivers = RtpTransceiverVector(m_peerConnection.getTransceivers());
</ins><span class="cx">     RTCRtpTransceiver* notifyingTransceiver = matchTransceiverByMid(transceivers, mid);
</span><span class="cx">     ASSERT(notifyingTransceiver);
</span><span class="cx"> 
</span><span class="lines">@@ -874,8 +877,8 @@
</span><span class="cx">             &amp;&amp; current.iceTransport().gatheringState() != RTCIceTransport::GatheringState::Complete;
</span><span class="cx">     });
</span><span class="cx">     if (!stillGatheringTransceiver) {
</span><del>-        m_client-&gt;fireEvent(RTCIceCandidateEvent::create(false, false, nullptr));
-        m_client-&gt;updateIceGatheringState(IceGatheringState::Complete);
</del><ins>+        m_peerConnection.fireEvent(RTCIceCandidateEvent::create(false, false, nullptr));
+        m_peerConnection.updateIceGatheringState(IceGatheringState::Complete);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -928,7 +931,7 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx"> 
</span><del>-    RTCRtpTransceiver* transceiver = matchTransceiverByMid(m_client-&gt;getTransceivers(), mid);
</del><ins>+    RTCRtpTransceiver* transceiver = matchTransceiverByMid(m_peerConnection.getTransceivers(), mid);
</ins><span class="cx">     ASSERT(transceiver);
</span><span class="cx"> 
</span><span class="cx">     RTCIceTransport::TransportState transportState = static_cast&lt;RTCIceTransport::TransportState&gt;(mediaEndpointIceTransportState);
</span><span class="lines">@@ -936,11 +939,11 @@
</span><span class="cx"> 
</span><span class="cx">     // Determine if the script needs to be notified.
</span><span class="cx">     Vector&lt;RTCIceTransport::TransportState&gt; transportStates;
</span><del>-    for (auto&amp; transceiver : m_client-&gt;getTransceivers())
</del><ins>+    for (auto&amp; transceiver : m_peerConnection.getTransceivers())
</ins><span class="cx">         transportStates.append(transceiver-&gt;iceTransport().transportState());
</span><span class="cx"> 
</span><span class="cx">     RTCIceTransport::TransportState derivedState = deriveAggregatedIceConnectionState(transportStates);
</span><del>-    m_client-&gt;updateIceConnectionState(static_cast&lt;IceConnectionState&gt;(derivedState));
</del><ins>+    m_peerConnection.updateIceConnectionState(static_cast&lt;IceConnectionState&gt;(derivedState));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h (208378 => 208379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h        2016-11-04 06:21:06 UTC (rev 208378)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h        2016-11-04 06:34:46 UTC (rev 208379)
</span><span class="lines">@@ -28,8 +28,7 @@
</span><span class="cx">  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-#ifndef MediaEndpointPeerConnection_h
-#define MediaEndpointPeerConnection_h
</del><ins>+#pragma once
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_RTC)
</span><span class="cx"> 
</span><span class="lines">@@ -51,11 +50,11 @@
</span><span class="cx"> using RtpSenderVector = Vector&lt;RefPtr&lt;RTCRtpSender&gt;&gt;;
</span><span class="cx"> using RtpTransceiverVector = Vector&lt;RefPtr&lt;RTCRtpTransceiver&gt;&gt;;
</span><span class="cx"> 
</span><del>-class MediaEndpointPeerConnection : public PeerConnectionBackend, public MediaEndpointClient {
</del><ins>+class MediaEndpointPeerConnection final : public PeerConnectionBackend, public MediaEndpointClient {
</ins><span class="cx"> public:
</span><del>-    MediaEndpointPeerConnection(PeerConnectionBackendClient*);
</del><ins>+    MediaEndpointPeerConnection(RTCPeerConnection&amp;);
</ins><span class="cx"> 
</span><del>-    void createOffer(RTCOfferOptions&amp;&amp;, PeerConnection::SessionDescriptionPromise&amp;&amp;) override;
</del><ins>+    void doCreateOffer(RTCOfferOptions&amp;&amp;) final;
</ins><span class="cx">     void createAnswer(RTCAnswerOptions&amp;&amp;, PeerConnection::SessionDescriptionPromise&amp;&amp;) override;
</span><span class="cx"> 
</span><span class="cx">     void setLocalDescription(RTCSessionDescription&amp;, PeerConnection::VoidPromise&amp;&amp;) override;
</span><span class="lines">@@ -90,7 +89,7 @@
</span><span class="cx">     void runTask(Function&lt;void ()&gt;&amp;&amp;);
</span><span class="cx">     void startRunningTasks();
</span><span class="cx"> 
</span><del>-    void createOfferTask(const RTCOfferOptions&amp;, PeerConnection::SessionDescriptionPromise&amp;);
</del><ins>+    void createOfferTask(const RTCOfferOptions&amp;);
</ins><span class="cx">     void createAnswerTask(const RTCAnswerOptions&amp;, PeerConnection::SessionDescriptionPromise&amp;);
</span><span class="cx"> 
</span><span class="cx">     void setLocalDescriptionTask(RefPtr&lt;RTCSessionDescription&gt;&amp;&amp;, PeerConnection::VoidPromise&amp;);
</span><span class="lines">@@ -113,7 +112,6 @@
</span><span class="cx">     void doneGatheringCandidates(const String&amp; mid) override;
</span><span class="cx">     void iceTransportStateChanged(const String&amp; mid, MediaEndpoint::IceTransportState) override;
</span><span class="cx"> 
</span><del>-    PeerConnectionBackendClient* m_client;
</del><span class="cx">     std::unique_ptr&lt;MediaEndpoint&gt; m_mediaEndpoint;
</span><span class="cx"> 
</span><span class="cx">     Function&lt;void ()&gt; m_initialDeferredTask;
</span><span class="lines">@@ -145,5 +143,3 @@
</span><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(WEB_RTC)
</span><del>-
-#endif // MediaEndpointPeerConnection_h
</del></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamPeerConnectionBackendcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp (208378 => 208379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp        2016-11-04 06:21:06 UTC (rev 208378)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp        2016-11-04 06:34:46 UTC (rev 208379)
</span><span class="lines">@@ -1,5 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2015 Ericsson AB. All rights reserved.
</span><ins>+ * Copyright (C) 2016 Apple INC. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -29,19 +30,50 @@
</span><span class="cx">  */
</span><span class="cx"> 
</span><span class="cx"> #include &quot;config.h&quot;
</span><del>-
-#if ENABLE(MEDIA_STREAM)
</del><span class="cx"> #include &quot;PeerConnectionBackend.h&quot;
</span><span class="cx"> 
</span><ins>+#if ENABLE(WEB_RTC)
+
+#include &quot;JSRTCSessionDescription.h&quot;
+#include &quot;RTCPeerConnection.h&quot;
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-static std::unique_ptr&lt;PeerConnectionBackend&gt; createPeerConnectionBackend(PeerConnectionBackendClient*)
</del><ins>+void PeerConnectionBackend::createOffer(RTCOfferOptions&amp;&amp; options, PeerConnection::SessionDescriptionPromise&amp;&amp; promise)
</ins><span class="cx"> {
</span><del>-    return nullptr;
</del><ins>+    ASSERT(!m_offerAnswerPromise);
+
+    if (m_peerConnection.internalSignalingState() == PeerConnectionStates::SignalingState::Closed)
+        return;
+
+    m_offerAnswerPromise = WTFMove(promise);
+    doCreateOffer(WTFMove(options));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-CreatePeerConnectionBackend PeerConnectionBackend::create = createPeerConnectionBackend;
</del><ins>+void PeerConnectionBackend::createOfferSucceeded(String&amp;&amp; sdp)
+{
+    ASSERT(isMainThread());
</ins><span class="cx"> 
</span><ins>+    if (m_peerConnection.internalSignalingState() == PeerConnectionStates::SignalingState::Closed)
+        return;
+
+    ASSERT(m_offerAnswerPromise);
+    m_offerAnswerPromise-&gt;resolve(RTCSessionDescription::create(RTCSessionDescription::SdpType::Offer, WTFMove(sdp)));
+    m_offerAnswerPromise = Nullopt;
+}
+
+void PeerConnectionBackend::createOfferFailed(ExceptionCode ec, String&amp;&amp; error)
+{
+    ASSERT(isMainThread());
+
+    if (m_peerConnection.internalSignalingState() == PeerConnectionStates::SignalingState::Closed)
+        return;
+
+    ASSERT(m_offerAnswerPromise);
+    m_offerAnswerPromise-&gt;reject(ec, WTFMove(error));
+    m_offerAnswerPromise = Nullopt;
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><del>-#endif // ENABLE(MEDIA_STREAM)
</del><ins>+#endif // ENABLE(WEB_RTC)
</ins></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamPeerConnectionBackendh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h (208378 => 208379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h        2016-11-04 06:21:06 UTC (rev 208378)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h        2016-11-04 06:34:46 UTC (rev 208379)
</span><span class="lines">@@ -28,8 +28,7 @@
</span><span class="cx">  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-#ifndef PeerConnectionBackend_h
-#define PeerConnectionBackend_h
</del><ins>+#pragma once
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_RTC)
</span><span class="cx"> 
</span><span class="lines">@@ -45,6 +44,7 @@
</span><span class="cx"> class PeerConnectionBackend;
</span><span class="cx"> class RTCConfiguration;
</span><span class="cx"> class RTCIceCandidate;
</span><ins>+class RTCPeerConnection;
</ins><span class="cx"> class RTCRtpReceiver;
</span><span class="cx"> class RTCRtpSender;
</span><span class="cx"> class RTCRtpSenderClient;
</span><span class="lines">@@ -56,6 +56,8 @@
</span><span class="cx"> struct RTCAnswerOptions;
</span><span class="cx"> struct RTCOfferOptions;
</span><span class="cx"> 
</span><ins>+using ExceptionCode = int;
+
</ins><span class="cx"> namespace PeerConnection {
</span><span class="cx"> typedef DOMPromise&lt;RTCSessionDescription&gt; SessionDescriptionPromise;
</span><span class="cx"> typedef DOMPromise&lt;std::nullptr_t&gt; VoidPromise;
</span><span class="lines">@@ -62,35 +64,20 @@
</span><span class="cx"> typedef DOMPromise&lt;RTCStatsResponse&gt; StatsPromise;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-class PeerConnectionBackendClient {
-public:
-    virtual const Vector&lt;RefPtr&lt;RTCRtpTransceiver&gt;&gt;&amp; getTransceivers() const = 0;
-    virtual RTCRtpSenderClient&amp; senderClient() = 0;
-    virtual void fireEvent(Event&amp;) = 0;
</del><ins>+typedef std::unique_ptr&lt;PeerConnectionBackend&gt; (*CreatePeerConnectionBackend)(RTCPeerConnection&amp;);
</ins><span class="cx"> 
</span><del>-    virtual void addTransceiver(RefPtr&lt;RTCRtpTransceiver&gt;&amp;&amp;) = 0;
-    virtual void setSignalingState(PeerConnectionStates::SignalingState) = 0;
-    virtual void updateIceGatheringState(PeerConnectionStates::IceGatheringState) = 0;
-    virtual void updateIceConnectionState(PeerConnectionStates::IceConnectionState) = 0;
-
-    virtual void scheduleNegotiationNeededEvent() = 0;
-
-    virtual ScriptExecutionContext* scriptExecutionContext() const = 0;
-    virtual PeerConnectionStates::SignalingState internalSignalingState() const = 0;
-    virtual PeerConnectionStates::IceGatheringState internalIceGatheringState() const = 0;
-    virtual PeerConnectionStates::IceConnectionState internalIceConnectionState() const = 0;
-
-    virtual ~PeerConnectionBackendClient() { }
-};
-
-typedef std::unique_ptr&lt;PeerConnectionBackend&gt; (*CreatePeerConnectionBackend)(PeerConnectionBackendClient*);
-
</del><span class="cx"> class PeerConnectionBackend {
</span><span class="cx"> public:
</span><span class="cx">     WEBCORE_EXPORT static CreatePeerConnectionBackend create;
</span><ins>+
+    PeerConnectionBackend(RTCPeerConnection&amp; peerConnection) : m_peerConnection(peerConnection) { }
</ins><span class="cx">     virtual ~PeerConnectionBackend() { }
</span><span class="cx"> 
</span><del>-    virtual void createOffer(RTCOfferOptions&amp;&amp;, PeerConnection::SessionDescriptionPromise&amp;&amp;) = 0;
</del><ins>+    void createOffer(RTCOfferOptions&amp;&amp;, PeerConnection::SessionDescriptionPromise&amp;&amp;);
+    virtual void doCreateOffer(RTCOfferOptions&amp;&amp;) = 0;
+    void createOfferSucceeded(String&amp;&amp;);
+    void createOfferFailed(ExceptionCode, String&amp;&amp;);
+
</ins><span class="cx">     virtual void createAnswer(RTCAnswerOptions&amp;&amp;, PeerConnection::SessionDescriptionPromise&amp;&amp;) = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual void setLocalDescription(RTCSessionDescription&amp;, PeerConnection::VoidPromise&amp;&amp;) = 0;
</span><span class="lines">@@ -120,10 +107,12 @@
</span><span class="cx">     virtual void clearNegotiationNeededState() = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual void emulatePlatformEvent(const String&amp; action) = 0;
</span><ins>+
+protected:
+    RTCPeerConnection&amp; m_peerConnection;
+    Optional&lt;PeerConnection::SessionDescriptionPromise&gt; m_offerAnswerPromise;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(WEB_RTC)
</span><del>-
-#endif // PeerConnectionBackend_h
</del></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCPeerConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp (208378 => 208379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp        2016-11-04 06:21:06 UTC (rev 208378)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp        2016-11-04 06:34:46 UTC (rev 208379)
</span><span class="lines">@@ -69,7 +69,7 @@
</span><span class="cx"> 
</span><span class="cx"> RTCPeerConnection::RTCPeerConnection(ScriptExecutionContext&amp; context)
</span><span class="cx">     : ActiveDOMObject(&amp;context)
</span><del>-    , m_backend(PeerConnectionBackend::create(this))
</del><ins>+    , m_backend(PeerConnectionBackend::create(*this))
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCPeerConnectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h (208378 => 208379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h        2016-11-04 06:21:06 UTC (rev 208378)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h        2016-11-04 06:34:46 UTC (rev 208379)
</span><span class="lines">@@ -38,7 +38,6 @@
</span><span class="cx"> #include &quot;Dictionary.h&quot;
</span><span class="cx"> #include &quot;EventTarget.h&quot;
</span><span class="cx"> #include &quot;MediaStream.h&quot;
</span><del>-#include &quot;PeerConnectionBackend.h&quot;
</del><span class="cx"> #include &quot;RTCOfferAnswerOptions.h&quot;
</span><span class="cx"> #include &quot;RTCRtpTransceiver.h&quot;
</span><span class="cx"> #include &quot;ScriptWrappable.h&quot;
</span><span class="lines">@@ -56,7 +55,7 @@
</span><span class="cx"> class RTCSessionDescription;
</span><span class="cx"> class RTCStatsCallback;
</span><span class="cx"> 
</span><del>-class RTCPeerConnection final : public RefCounted&lt;RTCPeerConnection&gt;, public PeerConnectionBackendClient, public RTCRtpSenderClient, public EventTargetWithInlineData, public ActiveDOMObject {
</del><ins>+class RTCPeerConnection final : public RefCounted&lt;RTCPeerConnection&gt;, public RTCRtpSenderClient, public EventTargetWithInlineData, public ActiveDOMObject {
</ins><span class="cx"> public:
</span><span class="cx">     static Ref&lt;RTCPeerConnection&gt; create(ScriptExecutionContext&amp;);
</span><span class="cx">     ~RTCPeerConnection();
</span><span class="lines">@@ -69,7 +68,7 @@
</span><span class="cx"> 
</span><span class="cx">     const Vector&lt;RefPtr&lt;RTCRtpSender&gt;&gt;&amp; getSenders() const { return m_transceiverSet-&gt;getSenders(); }
</span><span class="cx">     const Vector&lt;RefPtr&lt;RTCRtpReceiver&gt;&gt;&amp; getReceivers() const { return m_transceiverSet-&gt;getReceivers(); }
</span><del>-    const Vector&lt;RefPtr&lt;RTCRtpTransceiver&gt;&gt;&amp; getTransceivers() const final { return m_transceiverSet-&gt;list(); }
</del><ins>+    const Vector&lt;RefPtr&lt;RTCRtpTransceiver&gt;&gt;&amp; getTransceivers() const { return m_transceiverSet-&gt;list(); }
</ins><span class="cx"> 
</span><span class="cx">     // Part of legacy MediaStream-based API (mostly implemented as JS built-ins)
</span><span class="cx">     Vector&lt;RefPtr&lt;MediaStream&gt;&gt; getRemoteStreams() const { return m_backend-&gt;getRemoteStreams(); }
</span><span class="lines">@@ -126,6 +125,20 @@
</span><span class="cx">     // Used for testing with a mock
</span><span class="cx">     WEBCORE_EXPORT void emulatePlatformEvent(const String&amp; action);
</span><span class="cx"> 
</span><ins>+    // API used by PeerConnectionBackend and relatives
+    void addTransceiver(RefPtr&lt;RTCRtpTransceiver&gt;&amp;&amp;);
+    void setSignalingState(PeerConnectionStates::SignalingState);
+    void updateIceGatheringState(PeerConnectionStates::IceGatheringState);
+    void updateIceConnectionState(PeerConnectionStates::IceConnectionState);
+
+    void scheduleNegotiationNeededEvent();
+
+    RTCRtpSenderClient&amp; senderClient() { return *this; }
+    void fireEvent(Event&amp;);
+    PeerConnectionStates::SignalingState internalSignalingState() const { return m_signalingState; }
+    PeerConnectionStates::IceGatheringState internalIceGatheringState() const { return m_iceGatheringState; }
+    PeerConnectionStates::IceConnectionState internalIceConnectionState() const { return m_iceConnectionState; }
+
</ins><span class="cx"> private:
</span><span class="cx">     RTCPeerConnection(ScriptExecutionContext&amp;);
</span><span class="cx"> 
</span><span class="lines">@@ -140,20 +153,6 @@
</span><span class="cx">     const char* activeDOMObjectName() const final;
</span><span class="cx">     bool canSuspendForDocumentSuspension() const final;
</span><span class="cx"> 
</span><del>-    // PeerConnectionBackendClient
-    void addTransceiver(RefPtr&lt;RTCRtpTransceiver&gt;&amp;&amp;) final;
-    void setSignalingState(PeerConnectionStates::SignalingState) final;
-    void updateIceGatheringState(PeerConnectionStates::IceGatheringState) final;
-    void updateIceConnectionState(PeerConnectionStates::IceConnectionState) final;
-
-    void scheduleNegotiationNeededEvent() final;
-
-    RTCRtpSenderClient&amp; senderClient() final { return *this; }
-    void fireEvent(Event&amp;) final;
-    PeerConnectionStates::SignalingState internalSignalingState() const final { return m_signalingState; }
-    PeerConnectionStates::IceGatheringState internalIceGatheringState() const final { return m_iceGatheringState; }
-    PeerConnectionStates::IceConnectionState internalIceConnectionState() const final { return m_iceConnectionState; }
-
</del><span class="cx">     // RTCRtpSenderClient
</span><span class="cx">     void replaceTrack(RTCRtpSender&amp;, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, PeerConnection::VoidPromise&amp;&amp;) final;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (208378 => 208379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-11-04 06:21:06 UTC (rev 208378)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-11-04 06:34:46 UTC (rev 208379)
</span><span class="lines">@@ -1607,6 +1607,7 @@
</span><span class="cx">                 41D015CB0F4B5C71004A662F /* ContentType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41D015C90F4B5C71004A662F /* ContentType.cpp */; };
</span><span class="cx">                 41E1B1D00FF5986900576B3B /* AbstractWorker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41E1B1CA0FF5986900576B3B /* AbstractWorker.cpp */; };
</span><span class="cx">                 41E1B1D10FF5986900576B3B /* AbstractWorker.h in Headers */ = {isa = PBXBuildFile; fileRef = 41E1B1CB0FF5986900576B3B /* AbstractWorker.h */; };
</span><ins>+                41E408391DCB748900EFCE19 /* PeerConnectionBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41E408381DCB747900EFCE19 /* PeerConnectionBackend.cpp */; };
</ins><span class="cx">                 41F062140F5F192600A07EAC /* InspectorDatabaseResource.h in Headers */ = {isa = PBXBuildFile; fileRef = 41F062120F5F192600A07EAC /* InspectorDatabaseResource.h */; };
</span><span class="cx">                 41F062150F5F192600A07EAC /* InspectorDatabaseResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41F062130F5F192600A07EAC /* InspectorDatabaseResource.cpp */; };
</span><span class="cx">                 41F066E40F64BCF600A07EAC /* ScriptGlobalObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 41F066E20F64BCF600A07EAC /* ScriptGlobalObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -8675,6 +8676,7 @@
</span><span class="cx">                 41E1B1CA0FF5986900576B3B /* AbstractWorker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AbstractWorker.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 41E1B1CB0FF5986900576B3B /* AbstractWorker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AbstractWorker.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 41E1B1CC0FF5986900576B3B /* AbstractWorker.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AbstractWorker.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                41E408381DCB747900EFCE19 /* PeerConnectionBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PeerConnectionBackend.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 41F062120F5F192600A07EAC /* InspectorDatabaseResource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorDatabaseResource.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 41F062130F5F192600A07EAC /* InspectorDatabaseResource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorDatabaseResource.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 41F066E20F64BCF600A07EAC /* ScriptGlobalObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptGlobalObject.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -14901,6 +14903,7 @@
</span><span class="cx">                                 0704A4031D6DE9F10086DCDB /* OverconstrainedError.idl */,
</span><span class="cx">                                 072A703E1D6E8F6200DF0AFC /* OverconstrainedErrorEvent.h */,
</span><span class="cx">                                 072A703F1D6E8F6200DF0AFC /* OverconstrainedErrorEvent.idl */,
</span><ins>+                                41E408381DCB747900EFCE19 /* PeerConnectionBackend.cpp */,
</ins><span class="cx">                                 5E2C434D1BCEE2E50001E2BC /* PeerConnectionBackend.h */,
</span><span class="cx">                                 5E2C434F1BCEE2E50001E2BC /* RTCConfiguration.cpp */,
</span><span class="cx">                                 07AB996518DA3C010018771E /* RTCConfiguration.h */,
</span><span class="lines">@@ -28639,6 +28642,7 @@
</span><span class="cx">                                 31BC742D1AAFF45C006B4340 /* CSSAnimationTriggerScrollValue.cpp in Sources */,
</span><span class="cx">                                 CAE9F90F146441F000C245B0 /* CSSAspectRatioValue.cpp in Sources */,
</span><span class="cx">                                 94DE5C811D7F3A1400164F2A /* CSSAtRuleID.cpp in Sources */,
</span><ins>+                                41E408391DCB748900EFCE19 /* PeerConnectionBackend.cpp in Sources */,
</ins><span class="cx">                                 FBD6AF8B15EF25E5008B7110 /* CSSBasicShapes.cpp in Sources */,
</span><span class="cx">                                 E16A84F914C85CCC002977DF /* CSSBorderImage.cpp in Sources */,
</span><span class="cx">                                 BC274B31140EBED800EADFA6 /* CSSBorderImageSliceValue.cpp in Sources */,
</span></span></pre>
</div>
</div>

</body>
</html>