<!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>[207897] 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/207897">207897</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2016-10-26 07:49:48 -0700 (Wed, 26 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>IceCandidate does not need to be refcounted
https://bugs.webkit.org/show_bug.cgi?id=163944

Patch by Youenn Fablet &lt;youennf@gmail.com&gt; on 2016-10-26
Reviewed by Eric Carlson.

No change of behavior.

Simplifying IceCandidate class into a simple structure, no longer refcounted.
Updated call sites accordingly.
Updated SDP parsing of candidates to return a Variant instead of having both a return and an out parameter.

* Modules/mediastream/MediaEndpointPeerConnection.cpp:
(WebCore::MediaEndpointPeerConnection::addIceCandidateTask):
(WebCore::MediaEndpointPeerConnection::gotIceCandidate):
* Modules/mediastream/MediaEndpointPeerConnection.h:
* Modules/mediastream/SDPProcessor.cpp:
(WebCore::createCandidateObject):
(WebCore::createCandidate):
(WebCore::iceCandidateFromJSON):
(WebCore::configurationToJSON):
(WebCore::SDPProcessor::parseCandidateLine):
* Modules/mediastream/SDPProcessor.h:
(WebCore::SDPProcessor::ParsingResult::parsingStatus):
(WebCore::SDPProcessor::ParsingResult::candidate):
* platform/mediastream/IceCandidate.h:
* platform/mediastream/MediaEndpoint.cpp:
* platform/mediastream/MediaEndpoint.h:
* platform/mediastream/PeerMediaDescription.h:
(WebCore::PeerMediaDescription::iceCandidates):
(WebCore::PeerMediaDescription::addIceCandidate):
(WebCore::PeerMediaDescription::clone):
* platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:
(WebCore::MediaEndpointOwr::updateSendConfiguration):
(WebCore::MediaEndpointOwr::addRemoteCandidate):
(WebCore::MediaEndpointOwr::dispatchNewIceCandidate):
(WebCore::MediaEndpointOwr::internalAddRemoteCandidate):
* platform/mediastream/openwebrtc/MediaEndpointOwr.h:
* platform/mock/MockMediaEndpoint.cpp:
(WebCore::MockMediaEndpoint::addRemoteCandidate):
(WebCore::MockMediaEndpoint::dispatchFakeIceCandidates):
* platform/mock/MockMediaEndpoint.h:</pre>

<h3>Modified Paths</h3>
<ul>
<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="#trunkSourceWebCoreModulesmediastreamSDPProcessorcpp">trunk/Source/WebCore/Modules/mediastream/SDPProcessor.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamSDPProcessorh">trunk/Source/WebCore/Modules/mediastream/SDPProcessor.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamIceCandidateh">trunk/Source/WebCore/platform/mediastream/IceCandidate.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamMediaEndpointcpp">trunk/Source/WebCore/platform/mediastream/MediaEndpoint.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamMediaEndpointh">trunk/Source/WebCore/platform/mediastream/MediaEndpoint.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamPeerMediaDescriptionh">trunk/Source/WebCore/platform/mediastream/PeerMediaDescription.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamopenwebrtcMediaEndpointOwrcpp">trunk/Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamopenwebrtcMediaEndpointOwrh">trunk/Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMockMediaEndpointcpp">trunk/Source/WebCore/platform/mock/MockMediaEndpoint.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMockMediaEndpointh">trunk/Source/WebCore/platform/mock/MockMediaEndpoint.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (207896 => 207897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-10-26 13:24:12 UTC (rev 207896)
+++ trunk/Source/WebCore/ChangeLog        2016-10-26 14:49:48 UTC (rev 207897)
</span><span class="lines">@@ -1,3 +1,47 @@
</span><ins>+2016-10-26  Youenn Fablet  &lt;youennf@gmail.com&gt;
+
+        IceCandidate does not need to be refcounted
+        https://bugs.webkit.org/show_bug.cgi?id=163944
+
+        Reviewed by Eric Carlson.
+
+        No change of behavior.
+
+        Simplifying IceCandidate class into a simple structure, no longer refcounted.
+        Updated call sites accordingly.
+        Updated SDP parsing of candidates to return a Variant instead of having both a return and an out parameter.
+
+        * Modules/mediastream/MediaEndpointPeerConnection.cpp:
+        (WebCore::MediaEndpointPeerConnection::addIceCandidateTask):
+        (WebCore::MediaEndpointPeerConnection::gotIceCandidate):
+        * Modules/mediastream/MediaEndpointPeerConnection.h:
+        * Modules/mediastream/SDPProcessor.cpp:
+        (WebCore::createCandidateObject):
+        (WebCore::createCandidate):
+        (WebCore::iceCandidateFromJSON):
+        (WebCore::configurationToJSON):
+        (WebCore::SDPProcessor::parseCandidateLine):
+        * Modules/mediastream/SDPProcessor.h:
+        (WebCore::SDPProcessor::ParsingResult::parsingStatus):
+        (WebCore::SDPProcessor::ParsingResult::candidate):
+        * platform/mediastream/IceCandidate.h:
+        * platform/mediastream/MediaEndpoint.cpp:
+        * platform/mediastream/MediaEndpoint.h:
+        * platform/mediastream/PeerMediaDescription.h:
+        (WebCore::PeerMediaDescription::iceCandidates):
+        (WebCore::PeerMediaDescription::addIceCandidate):
+        (WebCore::PeerMediaDescription::clone):
+        * platform/mediastream/openwebrtc/MediaEndpointOwr.cpp:
+        (WebCore::MediaEndpointOwr::updateSendConfiguration):
+        (WebCore::MediaEndpointOwr::addRemoteCandidate):
+        (WebCore::MediaEndpointOwr::dispatchNewIceCandidate):
+        (WebCore::MediaEndpointOwr::internalAddRemoteCandidate):
+        * platform/mediastream/openwebrtc/MediaEndpointOwr.h:
+        * platform/mock/MockMediaEndpoint.cpp:
+        (WebCore::MockMediaEndpoint::addRemoteCandidate):
+        (WebCore::MockMediaEndpoint::dispatchFakeIceCandidates):
+        * platform/mock/MockMediaEndpoint.h:
+
</ins><span class="cx"> 2016-10-26  Andreas Kling  &lt;akling@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix mach port leak in ResourceUsageThread.
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp (207896 => 207897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp        2016-10-26 13:24:12 UTC (rev 207896)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp        2016-10-26 14:49:48 UTC (rev 207897)
</span><span class="lines">@@ -676,10 +676,9 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    RefPtr&lt;IceCandidate&gt; candidate;
-    SDPProcessor::Result result = m_sdpProcessor-&gt;parseCandidateLine(rtcCandidate.candidate(), candidate);
-    if (result != SDPProcessor::Result::Success) {
-        if (result == SDPProcessor::Result::ParseError)
</del><ins>+    auto result = m_sdpProcessor-&gt;parseCandidateLine(rtcCandidate.candidate());
+    if (result.parsingStatus() != SDPProcessor::Result::Success) {
+        if (result.parsingStatus() == SDPProcessor::Result::ParseError)
</ins><span class="cx">             promise.reject(OperationError, &quot;Invalid candidate content&quot;);
</span><span class="cx">         else
</span><span class="cx">             LOG_ERROR(&quot;SDPProcessor internal error&quot;);
</span><span class="lines">@@ -686,10 +685,9 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    targetMediaDescription-&gt;addIceCandidate(candidate.copyRef());
</del><ins>+    m_mediaEndpoint-&gt;addRemoteCandidate(result.candidate(), targetMediaDescription-&gt;mid(), targetMediaDescription-&gt;iceUfrag(), targetMediaDescription-&gt;icePassword());
</ins><span class="cx"> 
</span><del>-    m_mediaEndpoint-&gt;addRemoteCandidate(*candidate, targetMediaDescription-&gt;mid(), targetMediaDescription-&gt;iceUfrag(),
-        targetMediaDescription-&gt;icePassword());
</del><ins>+    targetMediaDescription-&gt;addIceCandidate(WTFMove(result.candidate()));
</ins><span class="cx"> 
</span><span class="cx">     promise.resolve(nullptr);
</span><span class="cx"> }
</span><span class="lines">@@ -835,7 +833,7 @@
</span><span class="cx">     startRunningTasks();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaEndpointPeerConnection::gotIceCandidate(const String&amp; mid, RefPtr&lt;IceCandidate&gt;&amp;&amp; candidate)
</del><ins>+void MediaEndpointPeerConnection::gotIceCandidate(const String&amp; mid, IceCandidate&amp;&amp; candidate)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx"> 
</span><span class="lines">@@ -850,19 +848,18 @@
</span><span class="cx">     }
</span><span class="cx">     ASSERT(mediaDescriptionIndex != notFound);
</span><span class="cx"> 
</span><del>-    PeerMediaDescription&amp; mediaDescription = *mediaDescriptions[mediaDescriptionIndex];
-    mediaDescription.addIceCandidate(candidate.copyRef());
-
</del><span class="cx">     String candidateLine;
</span><del>-    SDPProcessor::Result result = m_sdpProcessor-&gt;generateCandidateLine(*candidate, candidateLine);
</del><ins>+    auto result = m_sdpProcessor-&gt;generateCandidateLine(candidate, candidateLine);
</ins><span class="cx">     if (result != SDPProcessor::Result::Success) {
</span><span class="cx">         LOG_ERROR(&quot;SDPProcessor internal error&quot;);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    RefPtr&lt;RTCIceCandidate&gt; iceCandidate = RTCIceCandidate::create(candidateLine, mid, mediaDescriptionIndex);
</del><ins>+    auto&amp; mediaDescription = mediaDescriptions[mediaDescriptionIndex];
+    ASSERT(mediaDescription);
+    mediaDescription-&gt;addIceCandidate(WTFMove(candidate));
</ins><span class="cx"> 
</span><del>-    m_client-&gt;fireEvent(RTCIceCandidateEvent::create(false, false, WTFMove(iceCandidate)));
</del><ins>+    m_client-&gt;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></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h (207896 => 207897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h        2016-10-26 13:24:12 UTC (rev 207896)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h        2016-10-26 14:49:48 UTC (rev 207897)
</span><span class="lines">@@ -108,7 +108,7 @@
</span><span class="cx"> 
</span><span class="cx">     // MediaEndpointClient
</span><span class="cx">     void gotDtlsFingerprint(const String&amp; fingerprint, const String&amp; fingerprintFunction) override;
</span><del>-    void gotIceCandidate(const String&amp; mid, RefPtr&lt;IceCandidate&gt;&amp;&amp;) override;
</del><ins>+    void gotIceCandidate(const String&amp; mid, IceCandidate&amp;&amp;) override;
</ins><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></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamSDPProcessorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/SDPProcessor.cpp (207896 => 207897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/SDPProcessor.cpp        2016-10-26 13:24:12 UTC (rev 207896)
+++ trunk/Source/WebCore/Modules/mediastream/SDPProcessor.cpp        2016-10-26 14:49:48 UTC (rev 207897)
</span><span class="lines">@@ -111,58 +111,58 @@
</span><span class="cx"> {
</span><span class="cx">     RefPtr&lt;InspectorObject&gt; candidateObject = InspectorObject::create();
</span><span class="cx"> 
</span><del>-    candidateObject-&gt;setString(typeString(), candidate.type());
-    candidateObject-&gt;setString(foundationString(), candidate.foundation());
-    candidateObject-&gt;setInteger(componentIdString(), candidate.componentId());
-    candidateObject-&gt;setString(transportString(), candidate.transport());
-    candidateObject-&gt;setInteger(priorityString(), candidate.priority());
-    candidateObject-&gt;setString(addressString(), candidate.address());
-    candidateObject-&gt;setInteger(portString(), candidate.port());
-    if (!candidate.tcpType().isEmpty())
-        candidateObject-&gt;setString(tcpTypeString(), candidate.tcpType());
-    if (candidate.type().convertToASCIIUppercase() != &quot;HOST&quot;) {
-        candidateObject-&gt;setString(relatedAddressString(), candidate.relatedAddress());
-        candidateObject-&gt;setInteger(relatedPortString(), candidate.relatedPort());
</del><ins>+    candidateObject-&gt;setString(typeString(), candidate.type);
+    candidateObject-&gt;setString(foundationString(), candidate.foundation);
+    candidateObject-&gt;setInteger(componentIdString(), candidate.componentId);
+    candidateObject-&gt;setString(transportString(), candidate.transport);
+    candidateObject-&gt;setInteger(priorityString(), candidate.priority);
+    candidateObject-&gt;setString(addressString(), candidate.address);
+    candidateObject-&gt;setInteger(portString(), candidate.port);
+    if (!candidate.tcpType.isEmpty())
+        candidateObject-&gt;setString(tcpTypeString(), candidate.tcpType);
+    if (candidate.type.convertToASCIIUppercase() != &quot;HOST&quot;) {
+        candidateObject-&gt;setString(relatedAddressString(), candidate.relatedAddress);
+        candidateObject-&gt;setInteger(relatedPortString(), candidate.relatedPort);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return candidateObject;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static RefPtr&lt;IceCandidate&gt; createCandidate(const InspectorObject&amp; candidateObject)
</del><ins>+static IceCandidate createCandidate(const InspectorObject&amp; candidateObject)
</ins><span class="cx"> {
</span><del>-    RefPtr&lt;IceCandidate&gt; candidate = IceCandidate::create();
</del><ins>+    IceCandidate candidate;
</ins><span class="cx">     String stringValue;
</span><span class="cx">     unsigned intValue;
</span><span class="cx"> 
</span><span class="cx">     if (candidateObject.getString(typeString(), stringValue))
</span><del>-        candidate-&gt;setType(stringValue);
</del><ins>+        candidate.type = stringValue;
</ins><span class="cx"> 
</span><span class="cx">     if (candidateObject.getString(foundationString(), stringValue))
</span><del>-        candidate-&gt;setFoundation(stringValue);
</del><ins>+        candidate.foundation = stringValue;
</ins><span class="cx"> 
</span><span class="cx">     if (candidateObject.getInteger(componentIdString(), intValue))
</span><del>-        candidate-&gt;setComponentId(intValue);
</del><ins>+        candidate.componentId = intValue;
</ins><span class="cx"> 
</span><span class="cx">     if (candidateObject.getString(transportString(), stringValue))
</span><del>-        candidate-&gt;setTransport(stringValue);
</del><ins>+        candidate.transport = stringValue;
</ins><span class="cx"> 
</span><span class="cx">     if (candidateObject.getInteger(priorityString(), intValue))
</span><del>-        candidate-&gt;setPriority(intValue);
</del><ins>+        candidate.priority = intValue;
</ins><span class="cx"> 
</span><span class="cx">     if (candidateObject.getString(addressString(), stringValue))
</span><del>-        candidate-&gt;setAddress(stringValue);
</del><ins>+        candidate.address = stringValue;
</ins><span class="cx"> 
</span><span class="cx">     if (candidateObject.getInteger(portString(), intValue))
</span><del>-        candidate-&gt;setPort(intValue);
</del><ins>+        candidate.port = intValue;
</ins><span class="cx"> 
</span><span class="cx">     if (candidateObject.getString(tcpTypeString(), stringValue))
</span><del>-        candidate-&gt;setTcpType(stringValue);
</del><ins>+        candidate.tcpType = stringValue;
</ins><span class="cx"> 
</span><span class="cx">     if (candidateObject.getString(relatedAddressString(), stringValue))
</span><del>-        candidate-&gt;setRelatedAddress(stringValue);
</del><ins>+        candidate.relatedAddress = stringValue;
</ins><span class="cx"> 
</span><span class="cx">     if (candidateObject.getInteger(relatedPortString(), intValue))
</span><del>-        candidate-&gt;setRelatedPort(intValue);
</del><ins>+        candidate.relatedPort = intValue;
</ins><span class="cx"> 
</span><span class="cx">     return candidate;
</span><span class="cx"> }
</span><span class="lines">@@ -327,15 +327,15 @@
</span><span class="cx">     return configuration;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static RefPtr&lt;IceCandidate&gt; iceCandidateFromJSON(const String&amp; json)
</del><ins>+static Optional&lt;IceCandidate&gt; iceCandidateFromJSON(const String&amp; json)
</ins><span class="cx"> {
</span><span class="cx">     RefPtr&lt;InspectorValue&gt; value;
</span><span class="cx">     if (!InspectorValue::parseJSON(json, value))
</span><del>-        return nullptr;
</del><ins>+        return Nullopt;
</ins><span class="cx"> 
</span><span class="cx">     RefPtr&lt;InspectorObject&gt; candidateObject;
</span><span class="cx">     if (!value-&gt;asObject(candidateObject))
</span><del>-        return nullptr;
</del><ins>+        return Nullopt;
</ins><span class="cx"> 
</span><span class="cx">     return createCandidate(*candidateObject);
</span><span class="cx"> }
</span><span class="lines">@@ -415,8 +415,8 @@
</span><span class="cx"> 
</span><span class="cx">         RefPtr&lt;InspectorArray&gt; candidatesArray = InspectorArray::create();
</span><span class="cx"> 
</span><del>-        for (RefPtr&lt;IceCandidate&gt; candidate : mediaDescription-&gt;iceCandidates())
-            candidatesArray-&gt;pushObject(createCandidateObject(*candidate));
</del><ins>+        for (auto&amp; candidate : mediaDescription-&gt;iceCandidates())
+            candidatesArray-&gt;pushObject(createCandidateObject(candidate));
</ins><span class="cx"> 
</span><span class="cx">         iceObject-&gt;setArray(candidatesString(), candidatesArray);
</span><span class="cx">         mediaDescriptionObject-&gt;setObject(iceString(), iceObject);
</span><span class="lines">@@ -470,21 +470,19 @@
</span><span class="cx">     return Result::Success;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-SDPProcessor::Result SDPProcessor::parseCandidateLine(const String&amp; candidateLine, RefPtr&lt;IceCandidate&gt;&amp; outCandidate) const
</del><ins>+SDPProcessor::ParsingResult SDPProcessor::parseCandidateLine(const String&amp; candidateLine) const
</ins><span class="cx"> {
</span><span class="cx">     String scriptOutput;
</span><span class="cx">     if (!callScript(&quot;parseCandidateLine&quot;, candidateLine, scriptOutput))
</span><del>-        return Result::InternalError;
</del><ins>+        return { Result::InternalError };
</ins><span class="cx"> 
</span><span class="cx">     if (scriptOutput == &quot;ParseError&quot;)
</span><del>-        return Result::ParseError;
</del><ins>+        return { Result::ParseError };
</ins><span class="cx"> 
</span><del>-    RefPtr&lt;IceCandidate&gt; candidate = iceCandidateFromJSON(scriptOutput);
</del><ins>+    auto candidate = iceCandidateFromJSON(scriptOutput);
</ins><span class="cx">     if (!candidate)
</span><del>-        return Result::InternalError;
-
-    outCandidate = candidate;
-    return Result::Success;
</del><ins>+        return { Result::InternalError };
+    return { WTFMove(candidate.value()) };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool SDPProcessor::callScript(const String&amp; functionName, const String&amp; argument, String&amp; outResult) const
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamSDPProcessorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/SDPProcessor.h (207896 => 207897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/SDPProcessor.h        2016-10-26 13:24:12 UTC (rev 207896)
+++ trunk/Source/WebCore/Modules/mediastream/SDPProcessor.h        2016-10-26 14:49:48 UTC (rev 207897)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> #include &quot;IceCandidate.h&quot;
</span><span class="cx"> #include &quot;MediaEndpointSessionConfiguration.h&quot;
</span><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><ins>+#include &lt;wtf/Variant.h&gt;
</ins><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -58,8 +59,15 @@
</span><span class="cx">     Result parse(const String&amp; sdp, RefPtr&lt;MediaEndpointSessionConfiguration&gt;&amp;) const;
</span><span class="cx"> 
</span><span class="cx">     Result generateCandidateLine(const IceCandidate&amp;, String&amp; outCandidateLine) const;
</span><del>-    Result parseCandidateLine(const String&amp; candidateLine, RefPtr&lt;IceCandidate&gt;&amp;) const;
</del><span class="cx"> 
</span><ins>+    struct ParsingResult {
+        Variant&lt;IceCandidate, Result&gt; result;
+
+        Result parsingStatus() const { return WTF::holds_alternative&lt;IceCandidate&gt;(result) ? Result::Success : WTF::get&lt;SDPProcessor::Result&gt;(result); }
+        IceCandidate&amp; candidate() { return WTF::get&lt;IceCandidate&gt;(result); }
+    };
+    ParsingResult parseCandidateLine(const String&amp; candidateLine) const;
+
</ins><span class="cx"> private:
</span><span class="cx">     bool callScript(const String&amp; functionName, const String&amp; argument, String&amp; outResult) const;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamIceCandidateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/IceCandidate.h (207896 => 207897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/IceCandidate.h        2016-10-26 13:24:12 UTC (rev 207896)
+++ trunk/Source/WebCore/platform/mediastream/IceCandidate.h        2016-10-26 14:49:48 UTC (rev 207897)
</span><span class="lines">@@ -28,90 +28,41 @@
</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 IceCandidate_h
-#define IceCandidate_h
</del><ins>+#pragma once
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_RTC)
</span><span class="cx"> 
</span><del>-#include &lt;wtf/RefCounted.h&gt;
-#include &lt;wtf/RefPtr.h&gt;
</del><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class IceCandidate : public RefCounted&lt;IceCandidate&gt; {
-public:
-    static RefPtr&lt;IceCandidate&gt; create()
-    {
-        return adoptRef(new IceCandidate());
-    }
-    virtual ~IceCandidate() { }
</del><ins>+struct IceCandidate {
+    String type;
+    String foundation;
+    unsigned componentId { 0 };
+    String transport;
+    unsigned long priority { 0 };
+    String address;
+    unsigned port { 0 };
+    String tcpType;
+    String relatedAddress;
+    unsigned relatedPort { 0 };
</ins><span class="cx"> 
</span><del>-    const String&amp; type() const { return m_type; }
-    void setType(const String&amp; type) { m_type = type; }
-
-    const String&amp; foundation() const { return m_foundation; }
-    void setFoundation(const String&amp; foundation) { m_foundation = foundation; }
-
-    unsigned componentId() const { return m_componentId; }
-    void setComponentId(unsigned componentId) { m_componentId = componentId; }
-
-    const String&amp; transport() const { return m_transport; }
-    void setTransport(const String&amp; transport) { m_transport = transport; }
-
-    int priority() const { return m_priority; }
-    void setPriority(int priority) { m_priority = priority; }
-
-    const String&amp; address() const { return m_address; }
-    void setAddress(const String&amp; address) { m_address = address; }
-
-    unsigned port() const { return m_port; }
-    void setPort(unsigned port) { m_port = port; }
-
-    const String&amp; tcpType() const { return m_tcpType; }
-    void setTcpType(const String&amp; tcpType) { m_tcpType = tcpType; }
-
-    const String&amp; relatedAddress() const { return m_relatedAddress; }
-    void setRelatedAddress(const String&amp; relatedAddress) { m_relatedAddress = relatedAddress; }
-
-    unsigned relatedPort() const { return m_relatedPort; }
-    void setRelatedPort(unsigned relatedPort) { m_relatedPort = relatedPort; }
-
-    RefPtr&lt;IceCandidate&gt; clone() const
-    {
-        RefPtr&lt;IceCandidate&gt; copy = create();
-
-        copy-&gt;m_type = String(m_type);
-        copy-&gt;m_foundation = String(m_foundation);
-        copy-&gt;m_componentId = m_componentId;
-        copy-&gt;m_transport = String(m_transport);
-        copy-&gt;m_priority = m_priority;
-        copy-&gt;m_address = String(m_address);
-        copy-&gt;m_port = m_port;
-        copy-&gt;m_tcpType = String(m_tcpType);
-        copy-&gt;m_relatedAddress = String(m_relatedAddress);
-        copy-&gt;m_relatedPort = m_relatedPort;
-
-        return copy;
-    }
-
-private:
-    IceCandidate() { }
-
-    String m_type;
-    String m_foundation;
-    unsigned m_componentId { 0 };
-    String m_transport;
-    int m_priority { 0 };
-    String m_address;
-    unsigned m_port { 0 };
-    String m_tcpType;
-    String m_relatedAddress;
-    unsigned m_relatedPort { 0 };
</del><ins>+    IceCandidate() = default;
+    IceCandidate(String&amp;&amp; type, String&amp;&amp; foundation, unsigned componentId, String&amp;&amp; transport, unsigned long priority, String&amp;&amp; address, unsigned port, String&amp;&amp; tcpType, String&amp;&amp; relatedAddress, unsigned relatedPort)
+        : type(WTFMove(type))
+        , foundation(WTFMove(foundation))
+        , componentId(componentId)
+        , transport(WTFMove(transport))
+        , priority(priority)
+        , address(WTFMove(address))
+        , port(port)
+        , tcpType(WTFMove(tcpType))
+        , relatedAddress(WTFMove(relatedAddress))
+        , relatedPort(relatedPort)
+    { }
</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 // IceCandidate_h
</del></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamMediaEndpointcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/MediaEndpoint.cpp (207896 => 207897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/MediaEndpoint.cpp        2016-10-26 13:24:12 UTC (rev 207896)
+++ trunk/Source/WebCore/platform/mediastream/MediaEndpoint.cpp        2016-10-26 14:49:48 UTC (rev 207897)
</span><span class="lines">@@ -67,7 +67,7 @@
</span><span class="cx">     UpdateResult updateReceiveConfiguration(MediaEndpointSessionConfiguration*, bool) override { return UpdateResult::Failed; }
</span><span class="cx">     UpdateResult updateSendConfiguration(MediaEndpointSessionConfiguration*, const RealtimeMediaSourceMap&amp;, bool) override { return UpdateResult::Failed; }
</span><span class="cx"> 
</span><del>-    void addRemoteCandidate(IceCandidate&amp;, const String&amp;, const String&amp;, const String&amp;) override { }
</del><ins>+    void addRemoteCandidate(const IceCandidate&amp;, const String&amp;, const String&amp;, const String&amp;) override { }
</ins><span class="cx"> 
</span><span class="cx">     Ref&lt;RealtimeMediaSource&gt; createMutedRemoteSource(const String&amp;, RealtimeMediaSource::Type) override { return EmptyRealtimeMediaSource::create(); }
</span><span class="cx">     void replaceSendSource(RealtimeMediaSource&amp;, const String&amp;) override { }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamMediaEndpointh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/MediaEndpoint.h (207896 => 207897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/MediaEndpoint.h        2016-10-26 13:24:12 UTC (rev 207896)
+++ trunk/Source/WebCore/platform/mediastream/MediaEndpoint.h        2016-10-26 14:49:48 UTC (rev 207897)
</span><span class="lines">@@ -39,7 +39,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class IceCandidate;
</del><ins>+struct IceCandidate;
</ins><span class="cx"> class MediaEndpoint;
</span><span class="cx"> class MediaEndpointClient;
</span><span class="cx"> class MediaEndpointSessionConfiguration;
</span><span class="lines">@@ -73,7 +73,7 @@
</span><span class="cx">     virtual UpdateResult updateReceiveConfiguration(MediaEndpointSessionConfiguration*, bool isInitiator) = 0;
</span><span class="cx">     virtual UpdateResult updateSendConfiguration(MediaEndpointSessionConfiguration*, const RealtimeMediaSourceMap&amp;, bool isInitiator) = 0;
</span><span class="cx"> 
</span><del>-    virtual void addRemoteCandidate(IceCandidate&amp;, const String&amp; mid, const String&amp; ufrag, const String&amp; password) = 0;
</del><ins>+    virtual void addRemoteCandidate(const IceCandidate&amp;, const String&amp; mid, const String&amp; ufrag, const String&amp; password) = 0;
</ins><span class="cx"> 
</span><span class="cx">     virtual Ref&lt;RealtimeMediaSource&gt; createMutedRemoteSource(const String&amp; mid, RealtimeMediaSource::Type) = 0;
</span><span class="cx">     virtual void replaceSendSource(RealtimeMediaSource&amp;, const String&amp; mid) = 0;
</span><span class="lines">@@ -87,7 +87,7 @@
</span><span class="cx"> class MediaEndpointClient {
</span><span class="cx"> public:
</span><span class="cx">     virtual void gotDtlsFingerprint(const String&amp; fingerprint, const String&amp; fingerprintFunction) = 0;
</span><del>-    virtual void gotIceCandidate(const String&amp; mid, RefPtr&lt;IceCandidate&gt;&amp;&amp;) = 0;
</del><ins>+    virtual void gotIceCandidate(const String&amp; mid, IceCandidate&amp;&amp;) = 0;
</ins><span class="cx">     virtual void doneGatheringCandidates(const String&amp; mid) = 0;
</span><span class="cx">     virtual void iceTransportStateChanged(const String&amp; mid, MediaEndpoint::IceTransportState) = 0;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamPeerMediaDescriptionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/PeerMediaDescription.h (207896 => 207897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/PeerMediaDescription.h        2016-10-26 13:24:12 UTC (rev 207896)
+++ trunk/Source/WebCore/platform/mediastream/PeerMediaDescription.h        2016-10-26 14:49:48 UTC (rev 207897)
</span><span class="lines">@@ -106,8 +106,8 @@
</span><span class="cx">     const String&amp; icePassword() const { return m_icePassword; }
</span><span class="cx">     void setIcePassword(const String&amp; icePassword) { m_icePassword = icePassword; }
</span><span class="cx"> 
</span><del>-    const Vector&lt;RefPtr&lt;IceCandidate&gt;&gt;&amp; iceCandidates() const { return m_iceCandidates; }
-    void addIceCandidate(RefPtr&lt;IceCandidate&gt;&amp;&amp; candidate) { m_iceCandidates.append(WTFMove(candidate)); }
</del><ins>+    const Vector&lt;IceCandidate&gt;&amp; iceCandidates() const { return m_iceCandidates; }
+    void addIceCandidate(IceCandidate&amp;&amp; candidate) { m_iceCandidates.append(WTFMove(candidate)); }
</ins><span class="cx"> 
</span><span class="cx">     RefPtr&lt;PeerMediaDescription&gt; clone() const
</span><span class="cx">     {
</span><span class="lines">@@ -141,8 +141,7 @@
</span><span class="cx">         copy-&gt;m_iceUfrag = String(m_iceUfrag);
</span><span class="cx">         copy-&gt;m_icePassword = String(m_icePassword);
</span><span class="cx"> 
</span><del>-        for (auto&amp; candidate : m_iceCandidates)
-            copy-&gt;m_iceCandidates.append(candidate-&gt;clone());
</del><ins>+        copy-&gt;m_iceCandidates = m_iceCandidates;
</ins><span class="cx"> 
</span><span class="cx">         return copy;
</span><span class="cx">     }
</span><span class="lines">@@ -174,7 +173,7 @@
</span><span class="cx"> 
</span><span class="cx">     String m_iceUfrag;
</span><span class="cx">     String m_icePassword;
</span><del>-    Vector&lt;RefPtr&lt;IceCandidate&gt;&gt; m_iceCandidates;
</del><ins>+    Vector&lt;IceCandidate&gt; m_iceCandidates;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamopenwebrtcMediaEndpointOwrcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp (207896 => 207897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp        2016-10-26 13:24:12 UTC (rev 207896)
+++ trunk/Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp        2016-10-26 14:49:48 UTC (rev 207897)
</span><span class="lines">@@ -267,7 +267,7 @@
</span><span class="cx"> 
</span><span class="cx">         if (mdesc.iceCandidates().size()) {
</span><span class="cx">             for (auto&amp; candidate : mdesc.iceCandidates())
</span><del>-                internalAddRemoteCandidate(session, *candidate, mdesc.iceUfrag(), mdesc.icePassword());
</del><ins>+                internalAddRemoteCandidate(session, candidate, mdesc.iceUfrag(), mdesc.icePassword());
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (i &lt; m_numberOfSendPreparedSessions)
</span><span class="lines">@@ -311,7 +311,7 @@
</span><span class="cx">     return UpdateResult::Success;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaEndpointOwr::addRemoteCandidate(IceCandidate&amp; candidate, const String&amp; mid, const String&amp; ufrag, const String&amp; password)
</del><ins>+void MediaEndpointOwr::addRemoteCandidate(const IceCandidate&amp; candidate, const String&amp; mid, const String&amp; ufrag, const String&amp; password)
</ins><span class="cx"> {
</span><span class="cx">     for (auto&amp; transceiver : m_transceivers) {
</span><span class="cx">         if (transceiver-&gt;mid() == mid) {
</span><span class="lines">@@ -394,7 +394,7 @@
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaEndpointOwr::dispatchNewIceCandidate(const String&amp; mid, RefPtr&lt;IceCandidate&gt;&amp;&amp; iceCandidate)
</del><ins>+void MediaEndpointOwr::dispatchNewIceCandidate(const String&amp; mid, IceCandidate&amp;&amp; iceCandidate)
</ins><span class="cx"> {
</span><span class="cx">     m_client.gotIceCandidate(mid, WTFMove(iceCandidate));
</span><span class="cx"> }
</span><span class="lines">@@ -590,35 +590,35 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaEndpointOwr::internalAddRemoteCandidate(OwrSession* session, IceCandidate&amp; candidate, const String&amp; ufrag, const String&amp; password)
</del><ins>+void MediaEndpointOwr::internalAddRemoteCandidate(OwrSession* session, const IceCandidate&amp; candidate, const String&amp; ufrag, const String&amp; password)
</ins><span class="cx"> {
</span><span class="cx">     gboolean rtcpMux;
</span><span class="cx">     g_object_get(session, &quot;rtcp-mux&quot;, &amp;rtcpMux, nullptr);
</span><span class="cx"> 
</span><del>-    if (rtcpMux &amp;&amp; candidate.componentId() == OWR_COMPONENT_TYPE_RTCP)
</del><ins>+    if (rtcpMux &amp;&amp; candidate.componentId == OWR_COMPONENT_TYPE_RTCP)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    ASSERT(candidateTypes.find(candidate.type()) != notFound);
</del><ins>+    ASSERT(candidateTypes.find(candidate.type) != notFound);
</ins><span class="cx"> 
</span><del>-    OwrCandidateType candidateType = static_cast&lt;OwrCandidateType&gt;(candidateTypes.find(candidate.type()));
-    OwrComponentType componentId = static_cast&lt;OwrComponentType&gt;(candidate.componentId());
</del><ins>+    OwrCandidateType candidateType = static_cast&lt;OwrCandidateType&gt;(candidateTypes.find(candidate.type));
+    OwrComponentType componentId = static_cast&lt;OwrComponentType&gt;(candidate.componentId);
</ins><span class="cx">     OwrTransportType transportType;
</span><span class="cx"> 
</span><del>-    if (candidate.transport().convertToASCIIUppercase() == &quot;UDP&quot;)
</del><ins>+    if (candidate.transport.convertToASCIIUppercase() == &quot;UDP&quot;)
</ins><span class="cx">         transportType = OWR_TRANSPORT_TYPE_UDP;
</span><span class="cx">     else {
</span><del>-        ASSERT(candidateTcpTypes.find(candidate.tcpType()) != notFound);
-        transportType = static_cast&lt;OwrTransportType&gt;(candidateTcpTypes.find(candidate.tcpType()));
</del><ins>+        ASSERT(candidateTcpTypes.find(candidate.tcpType) != notFound);
+        transportType = static_cast&lt;OwrTransportType&gt;(candidateTcpTypes.find(candidate.tcpType));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     OwrCandidate* owrCandidate = owr_candidate_new(candidateType, componentId);
</span><span class="cx">     g_object_set(owrCandidate, &quot;transport-type&quot;, transportType,
</span><del>-        &quot;address&quot;, candidate.address().ascii().data(),
-        &quot;port&quot;, candidate.port(),
-        &quot;base-address&quot;, candidate.relatedAddress().ascii().data(),
-        &quot;base-port&quot;, candidate.relatedPort(),
-        &quot;priority&quot;, candidate.priority(),
-        &quot;foundation&quot;, candidate.foundation().ascii().data(),
</del><ins>+        &quot;address&quot;, candidate.address.ascii().data(),
+        &quot;port&quot;, candidate.port,
+        &quot;base-address&quot;, candidate.relatedAddress.ascii().data(),
+        &quot;base-port&quot;, candidate.relatedPort,
+        &quot;priority&quot;, candidate.priority,
+        &quot;foundation&quot;, candidate.foundation.ascii().data(),
</ins><span class="cx">         &quot;ufrag&quot;, ufrag.ascii().data(),
</span><span class="cx">         &quot;password&quot;, password.ascii().data(),
</span><span class="cx">         nullptr);
</span><span class="lines">@@ -652,24 +652,24 @@
</span><span class="cx">     ASSERT(candidateType &gt;= 0 &amp;&amp; candidateType &lt; candidateTypes.size());
</span><span class="cx">     ASSERT(transportType &gt;= 0 &amp;&amp; transportType &lt; candidateTcpTypes.size());
</span><span class="cx"> 
</span><del>-    RefPtr&lt;IceCandidate&gt; iceCandidate = IceCandidate::create();
-    iceCandidate-&gt;setType(candidateTypes[candidateType]);
-    iceCandidate-&gt;setFoundation(foundation);
-    iceCandidate-&gt;setComponentId(componentId);
-    iceCandidate-&gt;setPriority(priority);
-    iceCandidate-&gt;setAddress(address);
-    iceCandidate-&gt;setPort(port ? port : candidateDefaultPort);
</del><ins>+    IceCandidate iceCandidate;
+    iceCandidate.type = candidateTypes[candidateType];
+    iceCandidate.foundation = foundation;
+    iceCandidate.componentId = componentId;
+    iceCandidate.priority = priority;
+    iceCandidate.address = address;
+    iceCandidate.port = port ? port : candidateDefaultPort;
</ins><span class="cx"> 
</span><span class="cx">     if (transportType == OWR_TRANSPORT_TYPE_UDP)
</span><del>-        iceCandidate-&gt;setTransport(&quot;UDP&quot;);
</del><ins>+        iceCandidate.transport = &quot;UDP&quot;;
</ins><span class="cx">     else {
</span><del>-        iceCandidate-&gt;setTransport(&quot;TCP&quot;);
-        iceCandidate-&gt;setTcpType(candidateTcpTypes[transportType]);
</del><ins>+        iceCandidate.transport = &quot;TCP&quot;;
+        iceCandidate.tcpType = candidateTcpTypes[transportType];
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (candidateType != OWR_CANDIDATE_TYPE_HOST) {
</span><del>-        iceCandidate-&gt;setRelatedAddress(relatedAddress);
-        iceCandidate-&gt;setRelatedPort(relatedPort ? relatedPort : candidateDefaultPort);
</del><ins>+        iceCandidate.relatedAddress = relatedAddress;
+        iceCandidate.relatedPort = relatedPort ? relatedPort : candidateDefaultPort;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     g_object_set(G_OBJECT(candidate), &quot;ufrag&quot;, g_object_get_data(G_OBJECT(session), &quot;ice-ufrag&quot;),
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamopenwebrtcMediaEndpointOwrh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.h (207896 => 207897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.h        2016-10-26 13:24:12 UTC (rev 207896)
+++ trunk/Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.h        2016-10-26 14:49:48 UTC (rev 207897)
</span><span class="lines">@@ -92,7 +92,7 @@
</span><span class="cx">     UpdateResult updateReceiveConfiguration(MediaEndpointSessionConfiguration*, bool isInitiator) override;
</span><span class="cx">     UpdateResult updateSendConfiguration(MediaEndpointSessionConfiguration*, const RealtimeMediaSourceMap&amp;, bool isInitiator) override;
</span><span class="cx"> 
</span><del>-    void addRemoteCandidate(IceCandidate&amp;, const String&amp; mid, const String&amp; ufrag, const String&amp; password) override;
</del><ins>+    void addRemoteCandidate(const IceCandidate&amp;, const String&amp; mid, const String&amp; ufrag, const String&amp; password) override;
</ins><span class="cx"> 
</span><span class="cx">     Ref&lt;RealtimeMediaSource&gt; createMutedRemoteSource(const String&amp; mid, RealtimeMediaSource::Type) override;
</span><span class="cx">     void replaceMutedRemoteSourceMid(const String&amp;, const String&amp;) final;
</span><span class="lines">@@ -104,7 +104,7 @@
</span><span class="cx">     const String&amp; sessionMid(OwrSession*) const;
</span><span class="cx">     OwrTransceiver* matchTransceiverByMid(const String&amp; mid) const;
</span><span class="cx"> 
</span><del>-    void dispatchNewIceCandidate(const String&amp; mid, RefPtr&lt;IceCandidate&gt;&amp;&amp;);
</del><ins>+    void dispatchNewIceCandidate(const String&amp; mid, IceCandidate&amp;&amp;);
</ins><span class="cx">     void dispatchGatheringDone(const String&amp; mid);
</span><span class="cx">     void processIceTransportStateChange(OwrSession*);
</span><span class="cx">     void dispatchDtlsFingerprint(gchar* privateKey, gchar* certificate, const String&amp; fingerprint, const String&amp; fingerprintFunction);
</span><span class="lines">@@ -123,7 +123,7 @@
</span><span class="cx">     void prepareMediaSession(OwrMediaSession*, PeerMediaDescription*, bool isInitiator);
</span><span class="cx"> 
</span><span class="cx">     void ensureTransportAgentAndTransceivers(bool isInitiator, const Vector&lt;TransceiverConfig&gt;&amp;);
</span><del>-    void internalAddRemoteCandidate(OwrSession*, IceCandidate&amp;, const String&amp; ufrag, const String&amp; password);
</del><ins>+    void internalAddRemoteCandidate(OwrSession*, const IceCandidate&amp;, const String&amp; ufrag, const String&amp; password);
</ins><span class="cx"> 
</span><span class="cx">     Optional&lt;MediaEndpointConfiguration&gt; m_configuration;
</span><span class="cx">     GRegex* m_helperServerRegEx;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMockMediaEndpointcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mock/MockMediaEndpoint.cpp (207896 => 207897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MockMediaEndpoint.cpp        2016-10-26 13:24:12 UTC (rev 207896)
+++ trunk/Source/WebCore/platform/mock/MockMediaEndpoint.cpp        2016-10-26 14:49:48 UTC (rev 207897)
</span><span class="lines">@@ -173,7 +173,7 @@
</span><span class="cx">     return UpdateResult::Success;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MockMediaEndpoint::addRemoteCandidate(IceCandidate&amp; candidate, const String&amp; mid, const String&amp; ufrag, const String&amp; password)
</del><ins>+void MockMediaEndpoint::addRemoteCandidate(const IceCandidate&amp; candidate, const String&amp; mid, const String&amp; ufrag, const String&amp; password)
</ins><span class="cx"> {
</span><span class="cx">     UNUSED_PARAM(candidate);
</span><span class="cx">     UNUSED_PARAM(mid);
</span><span class="lines">@@ -232,39 +232,10 @@
</span><span class="cx"> 
</span><span class="cx"> void MockMediaEndpoint::dispatchFakeIceCandidates()
</span><span class="cx"> {
</span><del>-    RefPtr&lt;IceCandidate&gt; iceCandidate = IceCandidate::create();
-    iceCandidate-&gt;setType(&quot;host&quot;);
-    iceCandidate-&gt;setFoundation(&quot;1&quot;);
-    iceCandidate-&gt;setComponentId(1);
-    iceCandidate-&gt;setPriority(2013266431);
-    iceCandidate-&gt;setAddress(&quot;192.168.0.100&quot;);
-    iceCandidate-&gt;setPort(38838);
-    iceCandidate-&gt;setTransport(&quot;UDP&quot;);
-    m_fakeIceCandidates.append(WTFMove(iceCandidate));
</del><ins>+    m_fakeIceCandidates.append({ &quot;host&quot;, &quot;1&quot;, 1, &quot;UDP&quot;, 2013266431, &quot;192.168.0.100&quot;, 38838, { }, { }, 0 });
+    m_fakeIceCandidates.append({ &quot;host&quot;, &quot;2&quot;, 1, &quot;TCP&quot;, 1019216383, &quot;192.168.0.100&quot;, 9, &quot;active&quot;, { }, 0 });
+    m_fakeIceCandidates.append({ &quot;srflx&quot;, &quot;3&quot;, 1, &quot;UDP&quot;, 1677722111, &quot;172.18.0.1&quot;, 47989, { }, &quot;192.168.0.100&quot;, 47989 });
</ins><span class="cx"> 
</span><del>-    iceCandidate = IceCandidate::create();
-    iceCandidate-&gt;setType(&quot;host&quot;);
-    iceCandidate-&gt;setFoundation(&quot;2&quot;);
-    iceCandidate-&gt;setComponentId(1);
-    iceCandidate-&gt;setPriority(1019216383);
-    iceCandidate-&gt;setAddress(&quot;192.168.0.100&quot;);
-    iceCandidate-&gt;setPort(9);
-    iceCandidate-&gt;setTransport(&quot;TCP&quot;);
-    iceCandidate-&gt;setTcpType(&quot;active&quot;);
-    m_fakeIceCandidates.append(WTFMove(iceCandidate));
-
-    iceCandidate = IceCandidate::create();
-    iceCandidate-&gt;setType(&quot;srflx&quot;);
-    iceCandidate-&gt;setFoundation(&quot;3&quot;);
-    iceCandidate-&gt;setComponentId(1);
-    iceCandidate-&gt;setPriority(1677722111);
-    iceCandidate-&gt;setAddress(&quot;172.18.0.1&quot;);
-    iceCandidate-&gt;setPort(47989);
-    iceCandidate-&gt;setTransport(&quot;UDP&quot;);
-    iceCandidate-&gt;setRelatedAddress(&quot;192.168.0.100&quot;);
-    iceCandidate-&gt;setRelatedPort(47989);
-    m_fakeIceCandidates.append(WTFMove(iceCandidate));
-
</del><span class="cx">     // Reverse order to use takeLast() while keeping the above order
</span><span class="cx">     m_fakeIceCandidates.reverse();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMockMediaEndpointh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mock/MockMediaEndpoint.h (207896 => 207897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MockMediaEndpoint.h        2016-10-26 13:24:12 UTC (rev 207896)
+++ trunk/Source/WebCore/platform/mock/MockMediaEndpoint.h        2016-10-26 14:49:48 UTC (rev 207897)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx">     UpdateResult updateReceiveConfiguration(MediaEndpointSessionConfiguration*, bool isInitiator) final;
</span><span class="cx">     UpdateResult updateSendConfiguration(MediaEndpointSessionConfiguration*, const RealtimeMediaSourceMap&amp;, bool isInitiator) final;
</span><span class="cx"> 
</span><del>-    void addRemoteCandidate(IceCandidate&amp;, const String&amp; mid, const String&amp; ufrag, const String&amp; password) final;
</del><ins>+    void addRemoteCandidate(const IceCandidate&amp;, const String&amp; mid, const String&amp; ufrag, const String&amp; password) final;
</ins><span class="cx"> 
</span><span class="cx">     Ref&lt;RealtimeMediaSource&gt; createMutedRemoteSource(const String&amp; mid, RealtimeMediaSource::Type) final;
</span><span class="cx">     void replaceSendSource(RealtimeMediaSource&amp;, const String&amp; mid) final;
</span><span class="lines">@@ -81,7 +81,7 @@
</span><span class="cx">     Vector&lt;String&gt; m_mids;
</span><span class="cx">     HashMap&lt;String, RefPtr&lt;RealtimeMediaSource&gt;&gt; m_mutedRemoteSources;
</span><span class="cx"> 
</span><del>-    Vector&lt;RefPtr&lt;IceCandidate&gt;&gt; m_fakeIceCandidates;
</del><ins>+    Vector&lt;IceCandidate&gt; m_fakeIceCandidates;
</ins><span class="cx">     Timer m_iceCandidateTimer;
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;std::pair&lt;String, MediaEndpoint::IceTransportState&gt;&gt; m_iceTransportStateChanges;
</span></span></pre>
</div>
</div>

</body>
</html>