<!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 <youenn@apple.com> 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 <youenn@apple.com>
+
+ [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 <antti@apple.com>
</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 "RTCIceCandidate.h"
</span><span class="cx"> #include "RTCIceCandidateEvent.h"
</span><span class="cx"> #include "RTCOfferAnswerOptions.h"
</span><ins>+#include "RTCPeerConnection.h"
</ins><span class="cx"> #include "RTCRtpTransceiver.h"
</span><span class="cx"> #include "RTCTrackEvent.h"
</span><span class="cx"> #include "SDPProcessor.h"
</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<PeerConnectionBackend> createMediaEndpointPeerConnection(PeerConnectionBackendClient* client)
</del><ins>+static std::unique_ptr<PeerConnectionBackend> createMediaEndpointPeerConnection(RTCPeerConnection& peerConnection)
</ins><span class="cx"> {
</span><del>- return std::unique_ptr<PeerConnectionBackend>(new MediaEndpointPeerConnection(client));
</del><ins>+ return std::unique_ptr<PeerConnectionBackend>(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& peerConnection)
+ : PeerConnectionBackend(peerConnection)
</ins><span class="cx"> , m_mediaEndpoint(MediaEndpoint::create(*this))
</span><del>- , m_sdpProcessor(std::unique_ptr<SDPProcessor>(new SDPProcessor(m_client->scriptExecutionContext())))
</del><ins>+ , m_sdpProcessor(std::unique_ptr<SDPProcessor>(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&& options, SessionDescriptionPromise&& promise)
</del><ins>+void MediaEndpointPeerConnection::doCreateOffer(RTCOfferOptions&& 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&, SessionDescriptionPromise& promise)
</del><ins>+void MediaEndpointPeerConnection::createOfferTask(const RTCOfferOptions&)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(!m_dtlsFingerprint.isEmpty());
</span><span class="cx">
</span><del>- if (m_client->internalSignalingState() == SignalingState::Closed)
- return;
-
</del><span class="cx"> MediaEndpointSessionDescription* localDescription = internalLocalDescription();
</span><span class="cx"> RefPtr<MediaEndpointSessionConfiguration> configurationSnapshot = localDescription ?
</span><span class="cx"> localDescription->configuration()->clone() : MediaEndpointSessionConfiguration::create();
</span><span class="lines">@@ -156,7 +154,7 @@
</span><span class="cx">
</span><span class="cx"> configurationSnapshot->setSessionVersion(m_sdpOfferSessionVersion++);
</span><span class="cx">
</span><del>- auto transceivers = RtpTransceiverVector(m_client->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& mediaDescription : configurationSnapshot->mediaDescriptions()) {
</span><span class="lines">@@ -203,8 +201,13 @@
</span><span class="cx"> configurationSnapshot->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->toRTCSessionDescription(*m_sdpProcessor));
</del><ins>+ String sdp;
+ SDPProcessor::Result result = m_sdpProcessor->generate(*configurationSnapshot, sdp);
+ if (result != SDPProcessor::Result::Success) {
+ createOfferFailed(OperationError, "SDPProcessor internal error");
+ return;
+ }
+ createOfferSucceeded(WTFMove(sdp));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void MediaEndpointPeerConnection::createAnswer(RTCAnswerOptions&& options, SessionDescriptionPromise&& 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->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->setSessionVersion(m_sdpAnswerSessionVersion++);
</span><span class="cx">
</span><del>- auto transceivers = RtpTransceiverVector(m_client->getTransceivers());
</del><ins>+ auto transceivers = RtpTransceiverVector(m_peerConnection.getTransceivers());
</ins><span class="cx"> auto& remoteMediaDescriptions = internalRemoteDescription()->configuration()->mediaDescriptions();
</span><span class="cx">
</span><span class="cx"> for (unsigned i = 0; i < remoteMediaDescriptions.size(); ++i) {
</span><span class="lines">@@ -318,7 +321,7 @@
</span><span class="cx">
</span><span class="cx"> void MediaEndpointPeerConnection::setLocalDescriptionTask(RefPtr<RTCSessionDescription>&& description, VoidPromise& promise)
</span><span class="cx"> {
</span><del>- if (m_client->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& transceivers = m_client->getTransceivers();
</del><ins>+ const RtpTransceiverVector& transceivers = m_peerConnection.getTransceivers();
</ins><span class="cx"> const MediaDescriptionVector& mediaDescriptions = newDescription->configuration()->mediaDescriptions();
</span><span class="cx"> MediaEndpointSessionDescription* localDescription = internalLocalDescription();
</span><span class="cx"> unsigned previousNumberOfMediaDescriptions = localDescription ? localDescription->configuration()->mediaDescriptions().size() : 0;
</span><span class="lines">@@ -344,11 +347,11 @@
</span><span class="cx"> MediaEndpoint::UpdateResult result = m_mediaEndpoint->updateReceiveConfiguration(newDescription->configuration(), isInitiator);
</span><span class="cx">
</span><span class="cx"> if (result == MediaEndpoint::UpdateResult::SuccessWithIceRestart) {
</span><del>- if (m_client->internalIceGatheringState() != IceGatheringState::Gathering)
- m_client->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->internalIceConnectionState() != IceConnectionState::Completed)
- m_client->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("ICE restart is not implemented");
</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->internalSignalingState()) {
- m_client->setSignalingState(newSignalingState);
- m_client->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->internalIceGatheringState() == IceGatheringState::New && mediaDescriptions.size())
- m_client->updateIceGatheringState(IceGatheringState::Gathering);
</del><ins>+ if (m_peerConnection.internalIceGatheringState() == IceGatheringState::New && mediaDescriptions.size())
+ m_peerConnection.updateIceGatheringState(IceGatheringState::Gathering);
</ins><span class="cx">
</span><del>- if (m_client->internalSignalingState() == SignalingState::Stable && m_negotiationNeeded)
- m_client->scheduleNegotiationNeededEvent();
</del><ins>+ if (m_peerConnection.internalSignalingState() == SignalingState::Stable && 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<RTCSessionDescription>&& description, VoidPromise& promise)
</span><span class="cx"> {
</span><del>- if (m_client->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->type() == RTCSessionDescription::SdpType::Answer;
</span><del>- const RtpTransceiverVector& transceivers = m_client->getTransceivers();
</del><ins>+ const RtpTransceiverVector& 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<String>(), m_client->senderClient());
</del><ins>+ auto sender = RTCRtpSender::create(mediaDescription.type, Vector<String>(), 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->disableSendingDirection();
</span><span class="cx">
</span><span class="cx"> transceiver = newTransceiver.ptr();
</span><del>- m_client->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->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->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<RefPtr<MediaStream>> streams;
</span><span class="cx"> copyValuesToVector(trackEventMediaStreams, streams);
</span><span class="cx">
</span><del>- m_client->fireEvent(RTCTrackEvent::create(eventNames().trackEvent, false, false,
</del><ins>+ m_peerConnection.fireEvent(RTCTrackEvent::create(eventNames().trackEvent, false, false,
</ins><span class="cx"> &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& event : legacyMediaStreamEvents)
</span><del>- m_client->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->internalSignalingState()) {
- m_client->setSignalingState(newSignalingState);
- m_client->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& rtcCandidate, PeerConnection::VoidPromise& promise)
</span><span class="cx"> {
</span><del>- if (m_client->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->createMutedRemoteSource(transceiverMid, sourceType);
</span><span class="cx"> auto remoteTrackPrivate = MediaStreamTrackPrivate::create(WTFMove(remoteSource), trackId);
</span><del>- auto remoteTrack = MediaStreamTrack::create(*m_client->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& sender, RefPtr<MediaStreamTrack>&& withTrack, PeerConnection::VoidPromise&& promise)
</span><span class="cx"> {
</span><del>- RTCRtpTransceiver* transceiver = matchTransceiver(m_client->getTransceivers(), [&sender] (RTCRtpTransceiver& current) {
</del><ins>+ RTCRtpTransceiver* transceiver = matchTransceiver(m_peerConnection.getTransceivers(), [&sender] (RTCRtpTransceiver& current) {
</ins><span class="cx"> return current.sender() == &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& sender, const String& mid, RefPtr<MediaStreamTrack>&& withTrack, PeerConnection::VoidPromise& promise)
</span><span class="cx"> {
</span><del>- if (m_client->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->replaceSendSource(withTrack->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->internalSignalingState() == SignalingState::Stable)
- m_client->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& 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->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->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->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& 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->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"> && current.iceTransport().gatheringState() != RTCIceTransport::GatheringState::Complete;
</span><span class="cx"> });
</span><span class="cx"> if (!stillGatheringTransceiver) {
</span><del>- m_client->fireEvent(RTCIceCandidateEvent::create(false, false, nullptr));
- m_client->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->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<RTCIceTransport::TransportState>(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<RTCIceTransport::TransportState> transportStates;
</span><del>- for (auto& transceiver : m_client->getTransceivers())
</del><ins>+ for (auto& transceiver : m_peerConnection.getTransceivers())
</ins><span class="cx"> transportStates.append(transceiver->iceTransport().transportState());
</span><span class="cx">
</span><span class="cx"> RTCIceTransport::TransportState derivedState = deriveAggregatedIceConnectionState(transportStates);
</span><del>- m_client->updateIceConnectionState(static_cast<IceConnectionState>(derivedState));
</del><ins>+ m_peerConnection.updateIceConnectionState(static_cast<IceConnectionState>(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<RefPtr<RTCRtpSender>>;
</span><span class="cx"> using RtpTransceiverVector = Vector<RefPtr<RTCRtpTransceiver>>;
</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&);
</ins><span class="cx">
</span><del>- void createOffer(RTCOfferOptions&&, PeerConnection::SessionDescriptionPromise&&) override;
</del><ins>+ void doCreateOffer(RTCOfferOptions&&) final;
</ins><span class="cx"> void createAnswer(RTCAnswerOptions&&, PeerConnection::SessionDescriptionPromise&&) override;
</span><span class="cx">
</span><span class="cx"> void setLocalDescription(RTCSessionDescription&, PeerConnection::VoidPromise&&) override;
</span><span class="lines">@@ -90,7 +89,7 @@
</span><span class="cx"> void runTask(Function<void ()>&&);
</span><span class="cx"> void startRunningTasks();
</span><span class="cx">
</span><del>- void createOfferTask(const RTCOfferOptions&, PeerConnection::SessionDescriptionPromise&);
</del><ins>+ void createOfferTask(const RTCOfferOptions&);
</ins><span class="cx"> void createAnswerTask(const RTCAnswerOptions&, PeerConnection::SessionDescriptionPromise&);
</span><span class="cx">
</span><span class="cx"> void setLocalDescriptionTask(RefPtr<RTCSessionDescription>&&, PeerConnection::VoidPromise&);
</span><span class="lines">@@ -113,7 +112,6 @@
</span><span class="cx"> void doneGatheringCandidates(const String& mid) override;
</span><span class="cx"> void iceTransportStateChanged(const String& mid, MediaEndpoint::IceTransportState) override;
</span><span class="cx">
</span><del>- PeerConnectionBackendClient* m_client;
</del><span class="cx"> std::unique_ptr<MediaEndpoint> m_mediaEndpoint;
</span><span class="cx">
</span><span class="cx"> Function<void ()> 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 "config.h"
</span><del>-
-#if ENABLE(MEDIA_STREAM)
</del><span class="cx"> #include "PeerConnectionBackend.h"
</span><span class="cx">
</span><ins>+#if ENABLE(WEB_RTC)
+
+#include "JSRTCSessionDescription.h"
+#include "RTCPeerConnection.h"
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-static std::unique_ptr<PeerConnectionBackend> createPeerConnectionBackend(PeerConnectionBackendClient*)
</del><ins>+void PeerConnectionBackend::createOffer(RTCOfferOptions&& options, PeerConnection::SessionDescriptionPromise&& 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&& sdp)
+{
+ ASSERT(isMainThread());
</ins><span class="cx">
</span><ins>+ if (m_peerConnection.internalSignalingState() == PeerConnectionStates::SignalingState::Closed)
+ return;
+
+ ASSERT(m_offerAnswerPromise);
+ m_offerAnswerPromise->resolve(RTCSessionDescription::create(RTCSessionDescription::SdpType::Offer, WTFMove(sdp)));
+ m_offerAnswerPromise = Nullopt;
+}
+
+void PeerConnectionBackend::createOfferFailed(ExceptionCode ec, String&& error)
+{
+ ASSERT(isMainThread());
+
+ if (m_peerConnection.internalSignalingState() == PeerConnectionStates::SignalingState::Closed)
+ return;
+
+ ASSERT(m_offerAnswerPromise);
+ m_offerAnswerPromise->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<RTCSessionDescription> SessionDescriptionPromise;
</span><span class="cx"> typedef DOMPromise<std::nullptr_t> VoidPromise;
</span><span class="lines">@@ -62,35 +64,20 @@
</span><span class="cx"> typedef DOMPromise<RTCStatsResponse> StatsPromise;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-class PeerConnectionBackendClient {
-public:
- virtual const Vector<RefPtr<RTCRtpTransceiver>>& getTransceivers() const = 0;
- virtual RTCRtpSenderClient& senderClient() = 0;
- virtual void fireEvent(Event&) = 0;
</del><ins>+typedef std::unique_ptr<PeerConnectionBackend> (*CreatePeerConnectionBackend)(RTCPeerConnection&);
</ins><span class="cx">
</span><del>- virtual void addTransceiver(RefPtr<RTCRtpTransceiver>&&) = 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<PeerConnectionBackend> (*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& peerConnection) : m_peerConnection(peerConnection) { }
</ins><span class="cx"> virtual ~PeerConnectionBackend() { }
</span><span class="cx">
</span><del>- virtual void createOffer(RTCOfferOptions&&, PeerConnection::SessionDescriptionPromise&&) = 0;
</del><ins>+ void createOffer(RTCOfferOptions&&, PeerConnection::SessionDescriptionPromise&&);
+ virtual void doCreateOffer(RTCOfferOptions&&) = 0;
+ void createOfferSucceeded(String&&);
+ void createOfferFailed(ExceptionCode, String&&);
+
</ins><span class="cx"> virtual void createAnswer(RTCAnswerOptions&&, PeerConnection::SessionDescriptionPromise&&) = 0;
</span><span class="cx">
</span><span class="cx"> virtual void setLocalDescription(RTCSessionDescription&, PeerConnection::VoidPromise&&) = 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& action) = 0;
</span><ins>+
+protected:
+ RTCPeerConnection& m_peerConnection;
+ Optional<PeerConnection::SessionDescriptionPromise> 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& context)
</span><span class="cx"> : ActiveDOMObject(&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 "Dictionary.h"
</span><span class="cx"> #include "EventTarget.h"
</span><span class="cx"> #include "MediaStream.h"
</span><del>-#include "PeerConnectionBackend.h"
</del><span class="cx"> #include "RTCOfferAnswerOptions.h"
</span><span class="cx"> #include "RTCRtpTransceiver.h"
</span><span class="cx"> #include "ScriptWrappable.h"
</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<RTCPeerConnection>, public PeerConnectionBackendClient, public RTCRtpSenderClient, public EventTargetWithInlineData, public ActiveDOMObject {
</del><ins>+class RTCPeerConnection final : public RefCounted<RTCPeerConnection>, public RTCRtpSenderClient, public EventTargetWithInlineData, public ActiveDOMObject {
</ins><span class="cx"> public:
</span><span class="cx"> static Ref<RTCPeerConnection> create(ScriptExecutionContext&);
</span><span class="cx"> ~RTCPeerConnection();
</span><span class="lines">@@ -69,7 +68,7 @@
</span><span class="cx">
</span><span class="cx"> const Vector<RefPtr<RTCRtpSender>>& getSenders() const { return m_transceiverSet->getSenders(); }
</span><span class="cx"> const Vector<RefPtr<RTCRtpReceiver>>& getReceivers() const { return m_transceiverSet->getReceivers(); }
</span><del>- const Vector<RefPtr<RTCRtpTransceiver>>& getTransceivers() const final { return m_transceiverSet->list(); }
</del><ins>+ const Vector<RefPtr<RTCRtpTransceiver>>& getTransceivers() const { return m_transceiverSet->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<RefPtr<MediaStream>> getRemoteStreams() const { return m_backend->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& action);
</span><span class="cx">
</span><ins>+ // API used by PeerConnectionBackend and relatives
+ void addTransceiver(RefPtr<RTCRtpTransceiver>&&);
+ void setSignalingState(PeerConnectionStates::SignalingState);
+ void updateIceGatheringState(PeerConnectionStates::IceGatheringState);
+ void updateIceConnectionState(PeerConnectionStates::IceConnectionState);
+
+ void scheduleNegotiationNeededEvent();
+
+ RTCRtpSenderClient& senderClient() { return *this; }
+ void fireEvent(Event&);
+ 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&);
</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<RTCRtpTransceiver>&&) final;
- void setSignalingState(PeerConnectionStates::SignalingState) final;
- void updateIceGatheringState(PeerConnectionStates::IceGatheringState) final;
- void updateIceConnectionState(PeerConnectionStates::IceConnectionState) final;
-
- void scheduleNegotiationNeededEvent() final;
-
- RTCRtpSenderClient& senderClient() final { return *this; }
- void fireEvent(Event&) 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&, RefPtr<MediaStreamTrack>&&, PeerConnection::VoidPromise&&) 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 = "<group>"; };
</span><span class="cx">                 41E1B1CB0FF5986900576B3B /* AbstractWorker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AbstractWorker.h; sourceTree = "<group>"; };
</span><span class="cx">                 41E1B1CC0FF5986900576B3B /* AbstractWorker.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AbstractWorker.idl; sourceTree = "<group>"; };
</span><ins>+                41E408381DCB747900EFCE19 /* PeerConnectionBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PeerConnectionBackend.cpp; sourceTree = "<group>"; };
</ins><span class="cx">                 41F062120F5F192600A07EAC /* InspectorDatabaseResource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorDatabaseResource.h; sourceTree = "<group>"; };
</span><span class="cx">                 41F062130F5F192600A07EAC /* InspectorDatabaseResource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorDatabaseResource.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 41F066E20F64BCF600A07EAC /* ScriptGlobalObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptGlobalObject.h; sourceTree = "<group>"; };
</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>