<!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>[211441] trunk/Source/WebKit2</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/211441">211441</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2017-01-31 11:37:24 -0800 (Tue, 31 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WebRTC] Add support for WK2 libwebrtc endpoint
https://bugs.webkit.org/show_bug.cgi?id=167306
&lt;rdar://problem/30245426&gt;

Patch by Youenn Fablet &lt;youennf@gmail.com&gt; on 2017-01-31
Reviewed by Alex Christensen.

Implementation of the LibWebRTC networking in WebKit2.
The following features are required to be moved from WebProcess to NetworkProcess:
1 Resolution of DNS names (RTCResolver)
2 Enumeration of interfaces/gathering of host addresses (RTCMonitor)
3 Implementation of Packet Socket for TCP/UDP communication (RTCSocket).

This patch implements the related classes in WebProcess/NetworkProcess and the integration with libwebrtc.
NetworkProcess implementation is using libwebetc for NetworkRTCMonitor and NetworkRTCSocket.
This ensures an as-close implementation to libwebrtc as possible.
In the future, after getting a better test infrastructure we should try to implement these using native APIs.

Currently, the implementation is as follow:
- libwebrtc is calling WebProcess stack on the rtc network thread
- WebProcess stack is forwarding calls to the main thread and makes related IPC calls
- NetworkProcess receives the IPC calls and forward them to the rtc network thread.
- The calls are processed in the rtc network thread
Conversely, when the rtc network thread wants to notify its client, the reverse path is used.

This patch also implements the LibWebRTCProvider for WebKit2.
This provider uses the related classes to create a peer connection factory that will use them.

* CMakeLists.txt:
* DerivedSources.make:
* NetworkProcess/NetworkConnectionToWebProcess.cpp:
(WebKit::NetworkConnectionToWebProcess::~NetworkConnectionToWebProcess):
(WebKit::NetworkConnectionToWebProcess::didReceiveMessage):
(WebKit::NetworkConnectionToWebProcess::rtcProvider):
(WebKit::NetworkConnectionToWebProcess::didClose):
* NetworkProcess/NetworkConnectionToWebProcess.h:
* NetworkProcess/webrtc/LibWebRTCSocketClient.cpp: Added.
(WebKit::LibWebRTCSocketClient::LibWebRTCSocketClient):
(WebKit::LibWebRTCSocketClient::sendTo):
(WebKit::LibWebRTCSocketClient::close):
(WebKit::LibWebRTCSocketClient::setOption):
(WebKit::LibWebRTCSocketClient::signalReadPacket):
(WebKit::LibWebRTCSocketClient::signalSentPacket):
(WebKit::LibWebRTCSocketClient::signalAddressReady):
(WebKit::LibWebRTCSocketClient::signalConnect):
(WebKit::LibWebRTCSocketClient::signalClose):
* NetworkProcess/webrtc/LibWebRTCSocketClient.h: Added.
* NetworkProcess/webrtc/NetworkRTCMonitor.cpp: Added.
(WebKit::NetworkRTCMonitor::startUpdating):
(WebKit::NetworkRTCMonitor::stopUpdating):
(WebKit::NetworkRTCMonitor::onNetworksChanged):
* NetworkProcess/webrtc/NetworkRTCMonitor.h: Added.
* NetworkProcess/webrtc/NetworkRTCMonitor.messages.in: Added.
* NetworkProcess/webrtc/NetworkRTCProvider.cpp: Added.
(WebKit::createThread):
(WebKit::NetworkRTCProvider::NetworkRTCProvider):
(WebKit::NetworkRTCProvider::close):
(WebKit::NetworkRTCProvider::createUDPSocket):
(WebKit::NetworkRTCProvider::createServerTCPSocket):
(WebKit::NetworkRTCProvider::createClientTCPSocket):
(WebKit::NetworkRTCProvider::addSocket):
(WebKit::NetworkRTCProvider::takeSocket):
(WebKit::NetworkRTCProvider::didReceiveNetworkRTCSocketMessage):
(WebKit::NetworkRTCProvider::createResolver):
(WebKit::NetworkRTCProvider::stopResolver):
(WebKit::NetworkRTCProvider::resolvedName):
(WebKit::NetworkMessageData::NetworkMessageData):
(WebKit::NetworkRTCProvider::OnMessage):
(WebKit::NetworkRTCProvider::callOnRTCNetworkThread):
(WebKit::NetworkRTCProvider::callSocket):
(WebKit::NetworkRTCProvider::sendFromMainThread):
* NetworkProcess/webrtc/NetworkRTCProvider.h: Added.
(WebKit::NetworkRTCProvider::create):
(WebKit::NetworkRTCProvider::didReceiveNetworkRTCMonitorMessage):
(WebKit::NetworkRTCProvider::Resolver::Resolver):
(WebKit::NetworkRTCProvider::Resolver::~Resolver):
* NetworkProcess/webrtc/NetworkRTCProvider.messages.in: Added.
* NetworkProcess/webrtc/NetworkRTCSocket.cpp: Added.
(WebKit::NetworkRTCSocket::NetworkRTCSocket):
(WebKit::NetworkRTCSocket::sendTo):
(WebKit::NetworkRTCSocket::close):
(WebKit::NetworkRTCSocket::setOption):
* NetworkProcess/webrtc/NetworkRTCSocket.h: Added.
* NetworkProcess/webrtc/NetworkRTCSocket.messages.in: Added.
* Shared/RTCNetwork.cpp: Added.
(WebKit::RTCNetwork::RTCNetwork):
(WebKit::ips):
(WebKit::RTCNetwork::value):
(WebKit::RTCNetwork::IPAddress::decode):
(WebKit::RTCNetwork::IPAddress::encode):
(WebKit::RTCNetwork::decode):
(WebKit::RTCNetwork::encode):
* Shared/RTCNetwork.h: Added.
(WebKit::RTCNetwork::IPAddress::IPAddress):
* WebKit2.xcodeproj/project.pbxproj:
* WebProcess/Network/NetworkProcessConnection.cpp:
(WebKit::NetworkProcessConnection::didReceiveMessage):
* WebProcess/Network/webrtc/LibWebRTCNetwork.h: Added.
(WebKit::LibWebRTCNetwork::monitor):
(WebKit::LibWebRTCNetwork::socketFactory):
(WebKit::LibWebRTCNetwork::socket):
(WebKit::LibWebRTCNetwork::resolver):
* WebProcess/Network/webrtc/LibWebRTCProvider.cpp: Added.
(WebKit::LibWebRTCProvider::createPeerConnection):
* WebProcess/Network/webrtc/LibWebRTCProvider.h: Added.
* WebProcess/Network/webrtc/LibWebRTCResolver.cpp: Added.
(WebKit::sendOnMainThread):
(WebKit::LibWebRTCResolver::Start):
(WebKit::LibWebRTCResolver::GetResolvedAddress):
(WebKit::LibWebRTCResolver::Destroy):
(WebKit::LibWebRTCResolver::setResolvedAddress):
(WebKit::LibWebRTCResolver::setError):
* WebProcess/Network/webrtc/LibWebRTCResolver.h: Added.
* WebProcess/Network/webrtc/LibWebRTCSocket.cpp: Added.
(WebKit::sendOnMainThread):
(WebKit::LibWebRTCSocket::LibWebRTCSocket):
(WebKit::LibWebRTCSocket::~LibWebRTCSocket):
(WebKit::LibWebRTCSocket::GetLocalAddress):
(WebKit::LibWebRTCSocket::GetRemoteAddress):
(WebKit::LibWebRTCSocket::signalAddressReady):
(WebKit::LibWebRTCSocket::signalReadPacket):
(WebKit::LibWebRTCSocket::signalSentPacket):
(WebKit::LibWebRTCSocket::signalConnect):
(WebKit::LibWebRTCSocket::signalClose):
(WebKit::authKey):
(WebKit::LibWebRTCSocket::willSend):
(WebKit::LibWebRTCSocket::SendTo):
(WebKit::LibWebRTCSocket::Close):
(WebKit::LibWebRTCSocket::GetOption):
(WebKit::LibWebRTCSocket::SetOption):
* WebProcess/Network/webrtc/LibWebRTCSocket.h: Added.
* WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp: Added.
(WebKit::LibWebRTCSocketFactory::CreateServerTcpSocket):
(WebKit::LibWebRTCSocketFactory::CreateUdpSocket):
(WebKit::LibWebRTCSocketFactory::CreateClientTcpSocket):
(WebKit::LibWebRTCSocketFactory::detach):
(WebKit::LibWebRTCSocketFactory::CreateAsyncResolver):
* WebProcess/Network/webrtc/LibWebRTCSocketFactory.h: Added.
* WebProcess/Network/webrtc/WebRTCMonitor.cpp: Added.
(WebKit::sendOnMainThread):
(WebKit::WebRTCMonitor::StartUpdating):
(WebKit::WebRTCMonitor::StopUpdating):
(WebKit::WebRTCMonitor::networksChanged):
* WebProcess/Network/webrtc/WebRTCMonitor.h: Added.
* WebProcess/Network/webrtc/WebRTCMonitor.messages.in: Added.
* WebProcess/Network/webrtc/WebRTCResolver.cpp: Added.
(WebKit::WebRTCResolver::WebRTCResolver):
(WebKit::WebRTCResolver::setResolvedAddress):
(WebKit::WebRTCResolver::resolvedAddressError):
* WebProcess/Network/webrtc/WebRTCResolver.h: Added.
* WebProcess/Network/webrtc/WebRTCResolver.messages.in: Added.
* WebProcess/Network/webrtc/WebRTCSocket.cpp: Added.
(WebKit::WebRTCSocket::signalOnNetworkThread):
(WebKit::WebRTCSocket::WebRTCSocket):
(WebKit::WebRTCSocket::signalAddressReady):
(WebKit::WebRTCSocket::signalReadPacket):
(WebKit::WebRTCSocket::signalSentPacket):
(WebKit::WebRTCSocket::signalConnect):
(WebKit::WebRTCSocket::signalClose):
* WebProcess/Network/webrtc/WebRTCSocket.h: Added.
* WebProcess/Network/webrtc/WebRTCSocket.messages.in: Added.
* WebProcess/WebPage/WebPage.cpp:
(WebKit::m_userInterfaceLayoutDirection):
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::initializeLibWebRTC):
* WebProcess/WebProcess.h:
(WebKit::WebProcess::libWebRTC):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2CMakeListstxt">trunk/Source/WebKit2/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2DerivedSourcesmake">trunk/Source/WebKit2/DerivedSources.make</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkConnectionToWebProcesscpp">trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkConnectionToWebProcessh">trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.h</a></li>
<li><a href="#trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj">trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkNetworkProcessConnectioncpp">trunk/Source/WebKit2/WebProcess/Network/NetworkProcessConnection.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebProcesscpp">trunk/Source/WebKit2/WebProcess/WebProcess.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebProcessh">trunk/Source/WebKit2/WebProcess/WebProcess.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li>trunk/Source/WebKit2/NetworkProcess/webrtc/</li>
<li><a href="#trunkSourceWebKit2NetworkProcesswebrtcLibWebRTCSocketClientcpp">trunk/Source/WebKit2/NetworkProcess/webrtc/LibWebRTCSocketClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesswebrtcLibWebRTCSocketClienth">trunk/Source/WebKit2/NetworkProcess/webrtc/LibWebRTCSocketClient.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCMonitorcpp">trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCMonitor.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCMonitorh">trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCMonitor.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCMonitormessagesin">trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCMonitor.messages.in</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCProvidercpp">trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCProvider.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCProviderh">trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCProvider.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCProvidermessagesin">trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCProvider.messages.in</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCSocketcpp">trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCSocket.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCSocketh">trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCSocket.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCSocketmessagesin">trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCSocket.messages.in</a></li>
<li><a href="#trunkSourceWebKit2SharedRTCNetworkcpp">trunk/Source/WebKit2/Shared/RTCNetwork.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedRTCNetworkh">trunk/Source/WebKit2/Shared/RTCNetwork.h</a></li>
<li>trunk/Source/WebKit2/WebProcess/Network/webrtc/</li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCNetworkh">trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCNetwork.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCProvidercpp">trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCProvider.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCProviderh">trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCProvider.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCResolvercpp">trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCResolver.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCResolverh">trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCResolver.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCSocketcpp">trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocket.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCSocketh">trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocket.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCSocketFactorycpp">trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCSocketFactoryh">trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCMonitorcpp">trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCMonitor.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCMonitorh">trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCMonitor.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCMonitormessagesin">trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCMonitor.messages.in</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCResolvercpp">trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCResolver.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCResolverh">trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCResolver.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCResolvermessagesin">trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCResolver.messages.in</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCSocketcpp">trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCSocket.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCSocketh">trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCSocket.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCSocketmessagesin">trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCSocket.messages.in</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2CMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/CMakeLists.txt (211440 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/CMakeLists.txt        2017-01-31 18:59:23 UTC (rev 211440)
+++ trunk/Source/WebKit2/CMakeLists.txt        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -10,6 +10,7 @@
</span><span class="cx">     &quot;${WEBKIT2_DIR}/NetworkProcess/FileAPI&quot;
</span><span class="cx">     &quot;${WEBKIT2_DIR}/NetworkProcess/cache&quot;
</span><span class="cx">     &quot;${WEBKIT2_DIR}/NetworkProcess/capture&quot;
</span><ins>+    &quot;${WEBKIT2_DIR}/NetworkProcess/webrtc&quot;
</ins><span class="cx">     &quot;${WEBKIT2_DIR}/Platform&quot;
</span><span class="cx">     &quot;${WEBKIT2_DIR}/Platform/IPC&quot;
</span><span class="cx">     &quot;${WEBKIT2_DIR}/PluginProcess&quot;
</span><span class="lines">@@ -65,6 +66,7 @@
</span><span class="cx">     &quot;${WEBKIT2_DIR}/WebProcess/MediaCache&quot;
</span><span class="cx">     &quot;${WEBKIT2_DIR}/WebProcess/MediaStream&quot;
</span><span class="cx">     &quot;${WEBKIT2_DIR}/WebProcess/Network&quot;
</span><ins>+    &quot;${WEBKIT2_DIR}/WebProcess/Network/webrtc&quot;
</ins><span class="cx">     &quot;${WEBKIT2_DIR}/WebProcess/Notifications&quot;
</span><span class="cx">     &quot;${WEBKIT2_DIR}/WebProcess/OriginData&quot;
</span><span class="cx">     &quot;${WEBKIT2_DIR}/WebProcess/Plugins&quot;
</span><span class="lines">@@ -593,6 +595,10 @@
</span><span class="cx">     NetworkProcess/NetworkProcess.messages.in
</span><span class="cx">     NetworkProcess/NetworkResourceLoader.messages.in
</span><span class="cx"> 
</span><ins>+    NetworkProcess/webrtc/NetworkRTCMonitor.messages.in
+    NetworkProcess/webrtc/NetworkRTCProvider.messages.in
+    NetworkProcess/webrtc/NetworkRTCSocket.messages.in
+
</ins><span class="cx">     PluginProcess/PluginControllerProxy.messages.in
</span><span class="cx">     PluginProcess/PluginProcess.messages.in
</span><span class="cx">     PluginProcess/WebProcessConnection.messages.in
</span><span class="lines">@@ -649,6 +655,10 @@
</span><span class="cx"> 
</span><span class="cx">     WebProcess/IconDatabase/WebIconDatabaseProxy.messages.in
</span><span class="cx"> 
</span><ins>+    WebProcess/Network/webrtc/WebRTCMonitor.messages.in
+    WebProcess/Network/webrtc/WebRTCResolver.messages.in
+    WebProcess/Network/webrtc/WebRTCSocket.messages.in
+
</ins><span class="cx">     WebProcess/Network/NetworkProcessConnection.messages.in
</span><span class="cx">     WebProcess/Network/WebResourceLoader.messages.in
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (211440 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2017-01-31 18:59:23 UTC (rev 211440)
+++ trunk/Source/WebKit2/ChangeLog        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -1,3 +1,172 @@
</span><ins>+2017-01-31  Youenn Fablet  &lt;youennf@gmail.com&gt;
+
+        [WebRTC] Add support for WK2 libwebrtc endpoint
+        https://bugs.webkit.org/show_bug.cgi?id=167306
+        &lt;rdar://problem/30245426&gt;
+
+        Reviewed by Alex Christensen.
+
+        Implementation of the LibWebRTC networking in WebKit2.
+        The following features are required to be moved from WebProcess to NetworkProcess:
+        1 Resolution of DNS names (RTCResolver)
+        2 Enumeration of interfaces/gathering of host addresses (RTCMonitor)
+        3 Implementation of Packet Socket for TCP/UDP communication (RTCSocket).
+
+        This patch implements the related classes in WebProcess/NetworkProcess and the integration with libwebrtc.
+        NetworkProcess implementation is using libwebetc for NetworkRTCMonitor and NetworkRTCSocket.
+        This ensures an as-close implementation to libwebrtc as possible.
+        In the future, after getting a better test infrastructure we should try to implement these using native APIs.
+
+        Currently, the implementation is as follow:
+        - libwebrtc is calling WebProcess stack on the rtc network thread
+        - WebProcess stack is forwarding calls to the main thread and makes related IPC calls
+        - NetworkProcess receives the IPC calls and forward them to the rtc network thread.
+        - The calls are processed in the rtc network thread
+        Conversely, when the rtc network thread wants to notify its client, the reverse path is used.
+
+        This patch also implements the LibWebRTCProvider for WebKit2.
+        This provider uses the related classes to create a peer connection factory that will use them.
+
+        * CMakeLists.txt:
+        * DerivedSources.make:
+        * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+        (WebKit::NetworkConnectionToWebProcess::~NetworkConnectionToWebProcess):
+        (WebKit::NetworkConnectionToWebProcess::didReceiveMessage):
+        (WebKit::NetworkConnectionToWebProcess::rtcProvider):
+        (WebKit::NetworkConnectionToWebProcess::didClose):
+        * NetworkProcess/NetworkConnectionToWebProcess.h:
+        * NetworkProcess/webrtc/LibWebRTCSocketClient.cpp: Added.
+        (WebKit::LibWebRTCSocketClient::LibWebRTCSocketClient):
+        (WebKit::LibWebRTCSocketClient::sendTo):
+        (WebKit::LibWebRTCSocketClient::close):
+        (WebKit::LibWebRTCSocketClient::setOption):
+        (WebKit::LibWebRTCSocketClient::signalReadPacket):
+        (WebKit::LibWebRTCSocketClient::signalSentPacket):
+        (WebKit::LibWebRTCSocketClient::signalAddressReady):
+        (WebKit::LibWebRTCSocketClient::signalConnect):
+        (WebKit::LibWebRTCSocketClient::signalClose):
+        * NetworkProcess/webrtc/LibWebRTCSocketClient.h: Added.
+        * NetworkProcess/webrtc/NetworkRTCMonitor.cpp: Added.
+        (WebKit::NetworkRTCMonitor::startUpdating):
+        (WebKit::NetworkRTCMonitor::stopUpdating):
+        (WebKit::NetworkRTCMonitor::onNetworksChanged):
+        * NetworkProcess/webrtc/NetworkRTCMonitor.h: Added.
+        * NetworkProcess/webrtc/NetworkRTCMonitor.messages.in: Added.
+        * NetworkProcess/webrtc/NetworkRTCProvider.cpp: Added.
+        (WebKit::createThread):
+        (WebKit::NetworkRTCProvider::NetworkRTCProvider):
+        (WebKit::NetworkRTCProvider::close):
+        (WebKit::NetworkRTCProvider::createUDPSocket):
+        (WebKit::NetworkRTCProvider::createServerTCPSocket):
+        (WebKit::NetworkRTCProvider::createClientTCPSocket):
+        (WebKit::NetworkRTCProvider::addSocket):
+        (WebKit::NetworkRTCProvider::takeSocket):
+        (WebKit::NetworkRTCProvider::didReceiveNetworkRTCSocketMessage):
+        (WebKit::NetworkRTCProvider::createResolver):
+        (WebKit::NetworkRTCProvider::stopResolver):
+        (WebKit::NetworkRTCProvider::resolvedName):
+        (WebKit::NetworkMessageData::NetworkMessageData):
+        (WebKit::NetworkRTCProvider::OnMessage):
+        (WebKit::NetworkRTCProvider::callOnRTCNetworkThread):
+        (WebKit::NetworkRTCProvider::callSocket):
+        (WebKit::NetworkRTCProvider::sendFromMainThread):
+        * NetworkProcess/webrtc/NetworkRTCProvider.h: Added.
+        (WebKit::NetworkRTCProvider::create):
+        (WebKit::NetworkRTCProvider::didReceiveNetworkRTCMonitorMessage):
+        (WebKit::NetworkRTCProvider::Resolver::Resolver):
+        (WebKit::NetworkRTCProvider::Resolver::~Resolver):
+        * NetworkProcess/webrtc/NetworkRTCProvider.messages.in: Added.
+        * NetworkProcess/webrtc/NetworkRTCSocket.cpp: Added.
+        (WebKit::NetworkRTCSocket::NetworkRTCSocket):
+        (WebKit::NetworkRTCSocket::sendTo):
+        (WebKit::NetworkRTCSocket::close):
+        (WebKit::NetworkRTCSocket::setOption):
+        * NetworkProcess/webrtc/NetworkRTCSocket.h: Added.
+        * NetworkProcess/webrtc/NetworkRTCSocket.messages.in: Added.
+        * Shared/RTCNetwork.cpp: Added.
+        (WebKit::RTCNetwork::RTCNetwork):
+        (WebKit::ips):
+        (WebKit::RTCNetwork::value):
+        (WebKit::RTCNetwork::IPAddress::decode):
+        (WebKit::RTCNetwork::IPAddress::encode):
+        (WebKit::RTCNetwork::decode):
+        (WebKit::RTCNetwork::encode):
+        * Shared/RTCNetwork.h: Added.
+        (WebKit::RTCNetwork::IPAddress::IPAddress):
+        * WebKit2.xcodeproj/project.pbxproj:
+        * WebProcess/Network/NetworkProcessConnection.cpp:
+        (WebKit::NetworkProcessConnection::didReceiveMessage):
+        * WebProcess/Network/webrtc/LibWebRTCNetwork.h: Added.
+        (WebKit::LibWebRTCNetwork::monitor):
+        (WebKit::LibWebRTCNetwork::socketFactory):
+        (WebKit::LibWebRTCNetwork::socket):
+        (WebKit::LibWebRTCNetwork::resolver):
+        * WebProcess/Network/webrtc/LibWebRTCProvider.cpp: Added.
+        (WebKit::LibWebRTCProvider::createPeerConnection):
+        * WebProcess/Network/webrtc/LibWebRTCProvider.h: Added.
+        * WebProcess/Network/webrtc/LibWebRTCResolver.cpp: Added.
+        (WebKit::sendOnMainThread):
+        (WebKit::LibWebRTCResolver::Start):
+        (WebKit::LibWebRTCResolver::GetResolvedAddress):
+        (WebKit::LibWebRTCResolver::Destroy):
+        (WebKit::LibWebRTCResolver::setResolvedAddress):
+        (WebKit::LibWebRTCResolver::setError):
+        * WebProcess/Network/webrtc/LibWebRTCResolver.h: Added.
+        * WebProcess/Network/webrtc/LibWebRTCSocket.cpp: Added.
+        (WebKit::sendOnMainThread):
+        (WebKit::LibWebRTCSocket::LibWebRTCSocket):
+        (WebKit::LibWebRTCSocket::~LibWebRTCSocket):
+        (WebKit::LibWebRTCSocket::GetLocalAddress):
+        (WebKit::LibWebRTCSocket::GetRemoteAddress):
+        (WebKit::LibWebRTCSocket::signalAddressReady):
+        (WebKit::LibWebRTCSocket::signalReadPacket):
+        (WebKit::LibWebRTCSocket::signalSentPacket):
+        (WebKit::LibWebRTCSocket::signalConnect):
+        (WebKit::LibWebRTCSocket::signalClose):
+        (WebKit::authKey):
+        (WebKit::LibWebRTCSocket::willSend):
+        (WebKit::LibWebRTCSocket::SendTo):
+        (WebKit::LibWebRTCSocket::Close):
+        (WebKit::LibWebRTCSocket::GetOption):
+        (WebKit::LibWebRTCSocket::SetOption):
+        * WebProcess/Network/webrtc/LibWebRTCSocket.h: Added.
+        * WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp: Added.
+        (WebKit::LibWebRTCSocketFactory::CreateServerTcpSocket):
+        (WebKit::LibWebRTCSocketFactory::CreateUdpSocket):
+        (WebKit::LibWebRTCSocketFactory::CreateClientTcpSocket):
+        (WebKit::LibWebRTCSocketFactory::detach):
+        (WebKit::LibWebRTCSocketFactory::CreateAsyncResolver):
+        * WebProcess/Network/webrtc/LibWebRTCSocketFactory.h: Added.
+        * WebProcess/Network/webrtc/WebRTCMonitor.cpp: Added.
+        (WebKit::sendOnMainThread):
+        (WebKit::WebRTCMonitor::StartUpdating):
+        (WebKit::WebRTCMonitor::StopUpdating):
+        (WebKit::WebRTCMonitor::networksChanged):
+        * WebProcess/Network/webrtc/WebRTCMonitor.h: Added.
+        * WebProcess/Network/webrtc/WebRTCMonitor.messages.in: Added.
+        * WebProcess/Network/webrtc/WebRTCResolver.cpp: Added.
+        (WebKit::WebRTCResolver::WebRTCResolver):
+        (WebKit::WebRTCResolver::setResolvedAddress):
+        (WebKit::WebRTCResolver::resolvedAddressError):
+        * WebProcess/Network/webrtc/WebRTCResolver.h: Added.
+        * WebProcess/Network/webrtc/WebRTCResolver.messages.in: Added.
+        * WebProcess/Network/webrtc/WebRTCSocket.cpp: Added.
+        (WebKit::WebRTCSocket::signalOnNetworkThread):
+        (WebKit::WebRTCSocket::WebRTCSocket):
+        (WebKit::WebRTCSocket::signalAddressReady):
+        (WebKit::WebRTCSocket::signalReadPacket):
+        (WebKit::WebRTCSocket::signalSentPacket):
+        (WebKit::WebRTCSocket::signalConnect):
+        (WebKit::WebRTCSocket::signalClose):
+        * WebProcess/Network/webrtc/WebRTCSocket.h: Added.
+        * WebProcess/Network/webrtc/WebRTCSocket.messages.in: Added.
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::m_userInterfaceLayoutDirection):
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::initializeLibWebRTC):
+        * WebProcess/WebProcess.h:
+        (WebKit::WebProcess::libWebRTC):
+
</ins><span class="cx"> 2017-01-31  Jessie Berlin  &lt;jberlin@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Build fix.
</span></span></pre></div>
<a id="trunkSourceWebKit2DerivedSourcesmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DerivedSources.make (211440 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DerivedSources.make        2017-01-31 18:59:23 UTC (rev 211440)
+++ trunk/Source/WebKit2/DerivedSources.make        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx">     $(WebKit2)/NetworkProcess \
</span><span class="cx">     $(WebKit2)/NetworkProcess/CustomProtocols \
</span><span class="cx">     $(WebKit2)/NetworkProcess/mac \
</span><ins>+    $(WebKit2)/NetworkProcess/webrtc \
</ins><span class="cx">     $(WebKit2)/PluginProcess \
</span><span class="cx">     $(WebKit2)/PluginProcess/mac \
</span><span class="cx">     $(WebKit2)/Shared/Plugins \
</span><span class="lines">@@ -45,6 +46,7 @@
</span><span class="cx">     $(WebKit2)/WebProcess/IconDatabase \
</span><span class="cx">     $(WebKit2)/WebProcess/MediaCache \
</span><span class="cx">     $(WebKit2)/WebProcess/Network \
</span><ins>+    $(WebKit2)/WebProcess/Network/webrtc \
</ins><span class="cx">     $(WebKit2)/WebProcess/Notifications \
</span><span class="cx">     $(WebKit2)/WebProcess/OriginData \
</span><span class="cx">     $(WebKit2)/WebProcess/Plugins \
</span><span class="lines">@@ -100,6 +102,9 @@
</span><span class="cx">     NetworkProcess \
</span><span class="cx">     NetworkProcessConnection \
</span><span class="cx">     NetworkProcessProxy \
</span><ins>+    NetworkRTCMonitor \
+    NetworkRTCProvider \
+    NetworkRTCSocket \
</ins><span class="cx">     NetworkResourceLoader \
</span><span class="cx">     PluginControllerProxy \
</span><span class="cx">     PluginProcess \
</span><span class="lines">@@ -149,6 +154,9 @@
</span><span class="cx">     WebProcessConnection \
</span><span class="cx">     WebProcessPool \
</span><span class="cx">     WebProcessProxy \
</span><ins>+    WebRTCMonitor \
+    WebRTCResolver \
+    WebRTCSocket \
</ins><span class="cx">     WebResourceLoader \
</span><span class="cx">     WebResourceLoadStatisticsStore \
</span><span class="cx">     WebUserContentController \
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkConnectionToWebProcesscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp (211440 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp        2017-01-31 18:59:23 UTC (rev 211440)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -34,6 +34,9 @@
</span><span class="cx"> #include &quot;NetworkLoad.h&quot;
</span><span class="cx"> #include &quot;NetworkProcess.h&quot;
</span><span class="cx"> #include &quot;NetworkProcessConnectionMessages.h&quot;
</span><ins>+#include &quot;NetworkRTCMonitorMessages.h&quot;
+#include &quot;NetworkRTCProviderMessages.h&quot;
+#include &quot;NetworkRTCSocketMessages.h&quot;
</ins><span class="cx"> #include &quot;NetworkResourceLoadParameters.h&quot;
</span><span class="cx"> #include &quot;NetworkResourceLoader.h&quot;
</span><span class="cx"> #include &quot;NetworkResourceLoaderMessages.h&quot;
</span><span class="lines">@@ -68,6 +71,10 @@
</span><span class="cx"> 
</span><span class="cx"> NetworkConnectionToWebProcess::~NetworkConnectionToWebProcess()
</span><span class="cx"> {
</span><ins>+#if USE(LIBWEBRTC)
+    if (m_rtcProvider)
+        m_rtcProvider-&gt;close();
+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkConnectionToWebProcess::didCleanupResourceLoader(NetworkResourceLoader&amp; loader)
</span><span class="lines">@@ -76,7 +83,7 @@
</span><span class="cx"> 
</span><span class="cx">     m_networkResourceLoaders.remove(loader.identifier());
</span><span class="cx"> }
</span><del>-    
</del><ins>+
</ins><span class="cx"> void NetworkConnectionToWebProcess::didReceiveMessage(IPC::Connection&amp; connection, IPC::Decoder&amp; decoder)
</span><span class="cx"> {
</span><span class="cx">     if (decoder.messageReceiverName() == Messages::NetworkConnectionToWebProcess::messageReceiverName()) {
</span><span class="lines">@@ -85,15 +92,39 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (decoder.messageReceiverName() == Messages::NetworkResourceLoader::messageReceiverName()) {
</span><del>-        HashMap&lt;ResourceLoadIdentifier, RefPtr&lt;NetworkResourceLoader&gt;&gt;::iterator loaderIterator = m_networkResourceLoaders.find(decoder.destinationID());
</del><ins>+        auto loaderIterator = m_networkResourceLoaders.find(decoder.destinationID());
</ins><span class="cx">         if (loaderIterator != m_networkResourceLoaders.end())
</span><span class="cx">             loaderIterator-&gt;value-&gt;didReceiveNetworkResourceLoaderMessage(connection, decoder);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><del>-    
</del><ins>+
+#if USE(LIBWEBRTC)
+    if (decoder.messageReceiverName() == Messages::NetworkRTCSocket::messageReceiverName()) {
+        rtcProvider().didReceiveNetworkRTCSocketMessage(connection, decoder);
+        return;
+    }
+    if (decoder.messageReceiverName() == Messages::NetworkRTCMonitor::messageReceiverName()) {
+        rtcProvider().didReceiveNetworkRTCMonitorMessage(connection, decoder);
+        return;
+    }
+    if (decoder.messageReceiverName() == Messages::NetworkRTCProvider::messageReceiverName()) {
+        rtcProvider().didReceiveMessage(connection, decoder);
+        return;
+    }
+#endif
+
</ins><span class="cx">     ASSERT_NOT_REACHED();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if USE(LIBWEBRTC)
+NetworkRTCProvider&amp; NetworkConnectionToWebProcess::rtcProvider()
+{
+    if (!m_rtcProvider)
+        m_rtcProvider = NetworkRTCProvider::create(*this);
+    return *m_rtcProvider;
+}
+#endif
+
</ins><span class="cx"> void NetworkConnectionToWebProcess::didReceiveSyncMessage(IPC::Connection&amp; connection, IPC::Decoder&amp; decoder, std::unique_ptr&lt;IPC::Encoder&gt;&amp; reply)
</span><span class="cx"> {
</span><span class="cx">     if (decoder.messageReceiverName() == Messages::NetworkConnectionToWebProcess::messageReceiverName()) {
</span><span class="lines">@@ -116,6 +147,13 @@
</span><span class="cx"> 
</span><span class="cx">     NetworkBlobRegistry::singleton().connectionToWebProcessDidClose(this);
</span><span class="cx">     NetworkProcess::singleton().removeNetworkConnectionToWebProcess(this);
</span><ins>+
+#if USE(LIBWEBRTC)
+    if (m_rtcProvider) {
+        m_rtcProvider-&gt;close();
+        m_rtcProvider = nullptr;
+    }
+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkConnectionToWebProcess::didReceiveInvalidMessage(IPC::Connection&amp;, IPC::StringReference, IPC::StringReference)
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkConnectionToWebProcessh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.h (211440 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.h        2017-01-31 18:59:23 UTC (rev 211440)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.h        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -29,6 +29,8 @@
</span><span class="cx"> #include &quot;Connection.h&quot;
</span><span class="cx"> #include &quot;DownloadID.h&quot;
</span><span class="cx"> #include &quot;NetworkConnectionToWebProcessMessages.h&quot;
</span><ins>+#include &quot;NetworkRTCProvider.h&quot;
+
</ins><span class="cx"> #include &lt;WebCore/ResourceLoadPriority.h&gt;
</span><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -71,7 +73,7 @@
</span><span class="cx">     // Message handlers.
</span><span class="cx">     void didReceiveNetworkConnectionToWebProcessMessage(IPC::Connection&amp;, IPC::Decoder&amp;);
</span><span class="cx">     void didReceiveSyncNetworkConnectionToWebProcessMessage(IPC::Connection&amp;, IPC::Decoder&amp;, std::unique_ptr&lt;IPC::Encoder&gt;&amp;);
</span><del>-    
</del><ins>+
</ins><span class="cx">     void scheduleResourceLoad(const NetworkResourceLoadParameters&amp;);
</span><span class="cx">     void performSynchronousLoad(const NetworkResourceLoadParameters&amp;, Ref&lt;Messages::NetworkConnectionToWebProcess::PerformSynchronousLoad::DelayedReply&gt;&amp;&amp;);
</span><span class="cx">     void loadPing(const NetworkResourceLoadParameters&amp;);
</span><span class="lines">@@ -105,10 +107,18 @@
</span><span class="cx"> 
</span><span class="cx">     void ensureLegacyPrivateBrowsingSession();
</span><span class="cx"> 
</span><ins>+#if USE(LIBWEBRTC)
+    NetworkRTCProvider&amp; rtcProvider();
+#endif
+    
</ins><span class="cx">     Ref&lt;IPC::Connection&gt; m_connection;
</span><span class="cx"> 
</span><span class="cx">     HashMap&lt;ResourceLoadIdentifier, RefPtr&lt;NetworkResourceLoader&gt;&gt; m_networkResourceLoaders;
</span><span class="cx">     HashMap&lt;String, RefPtr&lt;WebCore::BlobDataFileReference&gt;&gt; m_blobDataFileReferences;
</span><ins>+
+#if USE(LIBWEBRTC)
+    RefPtr&lt;NetworkRTCProvider&gt; m_rtcProvider;
+#endif
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesswebrtcLibWebRTCSocketClientcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/webrtc/LibWebRTCSocketClient.cpp (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/webrtc/LibWebRTCSocketClient.cpp                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/webrtc/LibWebRTCSocketClient.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,118 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;LibWebRTCSocketClient.h&quot;
+
+#if USE(LIBWEBRTC)
+
+#include &quot;Connection.h&quot;
+#include &quot;DataReference.h&quot;
+#include &quot;NetworkRTCProvider.h&quot;
+#include &quot;WebRTCSocketMessages.h&quot;
+#include &lt;WebCore/SharedBuffer.h&gt;
+#include &lt;wtf/Function.h&gt;
+
+namespace WebKit {
+
+LibWebRTCSocketClient::LibWebRTCSocketClient(uint64_t identifier, NetworkRTCProvider&amp; rtcProvider, std::unique_ptr&lt;rtc::AsyncPacketSocket&gt;&amp;&amp; socket)
+    : m_identifier(identifier)
+    , m_rtcProvider(rtcProvider)
+    , m_socket(WTFMove(socket))
+{
+    if (!m_socket) {
+        rtcProvider.sendFromMainThread([identifier](IPC::Connection&amp; connection) {
+            connection.send(Messages::WebRTCSocket::SignalClose(1), identifier);
+        });
+        return;
+    }
+
+    m_socket-&gt;SignalReadPacket.connect(this, &amp;LibWebRTCSocketClient::signalReadPacket);
+    m_socket-&gt;SignalSentPacket.connect(this, &amp;LibWebRTCSocketClient::signalSentPacket);
+    m_socket-&gt;SignalAddressReady.connect(this, &amp;LibWebRTCSocketClient::signalAddressReady);
+    m_socket-&gt;SignalConnect.connect(this, &amp;LibWebRTCSocketClient::signalConnect);
+    m_socket-&gt;SignalClose.connect(this, &amp;LibWebRTCSocketClient::signalClose);
+}
+
+void LibWebRTCSocketClient::sendTo(const WebCore::SharedBuffer&amp; buffer, const rtc::SocketAddress&amp; socketAddress, const rtc::PacketOptions&amp; options)
+{
+    m_socket-&gt;SendTo(reinterpret_cast&lt;const uint8_t*&gt;(buffer.data()), buffer.size(), socketAddress, options);
+}
+
+void LibWebRTCSocketClient::close()
+{
+    ASSERT(m_socket);
+    m_socket-&gt;Close();
+    m_rtcProvider.takeSocket(m_identifier);
+}
+
+void LibWebRTCSocketClient::setOption(int option, int value)
+{
+    ASSERT(m_socket);
+    m_socket-&gt;SetOption(static_cast&lt;rtc::Socket::Option&gt;(option), value);
+}
+
+void LibWebRTCSocketClient::signalReadPacket(rtc::AsyncPacketSocket*, const char* value, size_t length, const rtc::SocketAddress&amp; address, const rtc::PacketTime&amp; packetTime)
+{
+    auto buffer = WebCore::SharedBuffer::create(value, length);
+    m_rtcProvider.sendFromMainThread([identifier = m_identifier, buffer = WTFMove(buffer), address, packetTime](IPC::Connection&amp; connection) {
+        IPC::DataReference data(reinterpret_cast&lt;const uint8_t*&gt;(buffer-&gt;data()), buffer-&gt;size());
+        connection.send(Messages::WebRTCSocket::SignalReadPacket(data, RTCNetwork::IPAddress(address.ipaddr()), address.port(), packetTime.timestamp), identifier);
+    });
+}
+
+void LibWebRTCSocketClient::signalSentPacket(rtc::AsyncPacketSocket*, const rtc::SentPacket&amp; sentPacket)
+{
+    m_rtcProvider.sendFromMainThread([identifier = m_identifier, sentPacket](IPC::Connection&amp; connection) {
+        connection.send(Messages::WebRTCSocket::SignalSentPacket(sentPacket.packet_id, sentPacket.send_time_ms), identifier);
+    });
+}
+
+void LibWebRTCSocketClient::signalAddressReady(rtc::AsyncPacketSocket*, const rtc::SocketAddress&amp; address)
+{
+    m_rtcProvider.sendFromMainThread([identifier = m_identifier, address](IPC::Connection&amp; connection) {
+        auto addressString = address.ToString();
+        connection.send(Messages::WebRTCSocket::SignalAddressReady(String(addressString.data(), addressString.length())), identifier);
+    });
+}
+
+void LibWebRTCSocketClient::signalConnect(rtc::AsyncPacketSocket*)
+{
+    m_rtcProvider.sendFromMainThread([identifier = m_identifier](IPC::Connection&amp; connection) {
+        connection.send(Messages::WebRTCSocket::SignalConnect(), identifier);
+    });
+}
+
+void LibWebRTCSocketClient::signalClose(rtc::AsyncPacketSocket*, int error)
+{
+    m_rtcProvider.sendFromMainThread([identifier = m_identifier, error](IPC::Connection&amp; connection) {
+        connection.send(Messages::WebRTCSocket::SignalClose(error), identifier);
+    });
+    m_rtcProvider.takeSocket(m_identifier);
+}
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesswebrtcLibWebRTCSocketClienth"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/webrtc/LibWebRTCSocketClient.h (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/webrtc/LibWebRTCSocketClient.h                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/webrtc/LibWebRTCSocketClient.h        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,74 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(LIBWEBRTC)
+
+#include &lt;WebCore/LibWebRTCMacros.h&gt;
+#include &lt;webrtc/base/asyncpacketsocket.h&gt;
+#include &lt;webrtc/base/sigslot.h&gt;
+
+namespace rtc {
+class AsyncPacketSocket;
+class SocketAddress;
+struct PacketOptions;
+struct PacketTime;
+struct SentPacket;
+}
+
+namespace WebCore {
+class SharedBuffer;
+}
+
+namespace WebKit {
+
+class NetworkRTCProvider;
+
+class LibWebRTCSocketClient final : public sigslot::has_slots&lt;&gt; {
+public:
+    LibWebRTCSocketClient(uint64_t identifier, NetworkRTCProvider&amp;, std::unique_ptr&lt;rtc::AsyncPacketSocket&gt;&amp;&amp;);
+
+private:
+    friend class NetworkRTCSocket;
+
+    void close();
+    void setOption(int option, int value);
+    void sendTo(const WebCore::SharedBuffer&amp;, const rtc::SocketAddress&amp;, const rtc::PacketOptions&amp;);
+
+    void signalReadPacket(rtc::AsyncPacketSocket*, const char*, size_t, const rtc::SocketAddress&amp;, const rtc::PacketTime&amp;);
+    void signalSentPacket(rtc::AsyncPacketSocket*, const rtc::SentPacket&amp;);
+    void signalAddressReady(rtc::AsyncPacketSocket*, const rtc::SocketAddress&amp;);
+    void signalConnect(rtc::AsyncPacketSocket*);
+    void signalClose(rtc::AsyncPacketSocket*, int);
+
+    uint64_t m_identifier;
+    NetworkRTCProvider&amp; m_rtcProvider;
+    std::unique_ptr&lt;rtc::AsyncPacketSocket&gt; m_socket;
+};
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCMonitorcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCMonitor.cpp (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCMonitor.cpp                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCMonitor.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,83 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;NetworkRTCMonitor.h&quot;
+
+#if USE(LIBWEBRTC)
+
+#include &quot;Connection.h&quot;
+#include &quot;NetworkRTCProvider.h&quot;
+#include &quot;WebRTCMonitorMessages.h&quot;
+#include &lt;wtf/Function.h&gt;
+
+namespace WebKit {
+
+void NetworkRTCMonitor::startUpdating()
+{
+    m_isStarted = true;
+    m_rtcProvider.callOnRTCNetworkThread([this]() {
+        m_manager = std::make_unique&lt;rtc::BasicNetworkManager&gt;();
+        m_manager-&gt;SignalNetworksChanged.connect(this, &amp;NetworkRTCMonitor::onNetworksChanged);
+        m_manager-&gt;StartUpdating();
+    });
+}
+
+void NetworkRTCMonitor::stopUpdating()
+{
+    m_isStarted = false;
+    m_rtcProvider.callOnRTCNetworkThread([this]() {
+        m_manager-&gt;StopUpdating();
+        m_manager = nullptr;
+    });
+}
+
+void NetworkRTCMonitor::onNetworksChanged()
+{
+    rtc::BasicNetworkManager::NetworkList networks;
+    m_manager-&gt;GetNetworks(&amp;networks);
+
+    RTCNetwork::IPAddress ipv4;
+    m_manager-&gt;GetDefaultLocalAddress(AF_INET, &amp;ipv4.value);
+    RTCNetwork::IPAddress ipv6;
+    m_manager-&gt;GetDefaultLocalAddress(AF_INET6, &amp;ipv6.value);
+
+    Vector&lt;RTCNetwork&gt; networkList;
+    networkList.reserveInitialCapacity(networks.size());
+    for (auto* network : networks) {
+        ASSERT(network);
+        networkList.uncheckedAppend(RTCNetwork { *network });
+    }
+
+    m_rtcProvider.sendFromMainThread([this, networkList = WTFMove(networkList), ipv4 = WTFMove(ipv4), ipv6 = WTFMove(ipv6)](IPC::Connection&amp; connection) {
+        if (!m_isStarted)
+            return;
+        connection.send(Messages::WebRTCMonitor::NetworksChanged(networkList, ipv4, ipv6), 0);
+    });
+}
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCMonitorh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCMonitor.h (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCMonitor.h                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCMonitor.h        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,63 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(LIBWEBRTC)
+
+#include &quot;WebCore/LibWebRTCMacros.h&quot;
+#include &lt;webrtc/base/network.h&gt;
+#include &lt;webrtc/base/sigslot.h&gt;
+#include &lt;webrtc/base/thread.h&gt;
+
+namespace IPC {
+class Connection;
+class Decoder;
+}
+
+namespace WebKit {
+
+class NetworkRTCProvider;
+
+class NetworkRTCMonitor final : public sigslot::has_slots&lt;&gt; {
+public:
+    explicit NetworkRTCMonitor(NetworkRTCProvider&amp; rtcProvider) : m_rtcProvider(rtcProvider) { }
+
+    void didReceiveMessage(IPC::Connection&amp;, IPC::Decoder&amp;);
+    void stopUpdating();
+
+private:
+    void startUpdating();
+
+    void onNetworksChanged();
+
+    NetworkRTCProvider&amp; m_rtcProvider;
+    std::unique_ptr&lt;rtc::BasicNetworkManager&gt; m_manager;
+    bool m_isStarted { false };
+};
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCMonitormessagesin"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCMonitor.messages.in (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCMonitor.messages.in                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCMonitor.messages.in        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,30 @@
</span><ins>+# Copyright (C) 2017 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#if USE(LIBWEBRTC)
+
+messages -&gt; NetworkRTCMonitor {
+    void StartUpdating()
+    void StopUpdating()
+}
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCProvidercpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCProvider.cpp (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCProvider.cpp                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCProvider.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,214 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;NetworkRTCProvider.h&quot;
+
+#if USE(LIBWEBRTC)
+
+#include &quot;NetworkConnectionToWebProcess.h&quot;
+#include &quot;NetworkProcess.h&quot;
+#include &quot;NetworkRTCSocket.h&quot;
+#include &quot;WebRTCResolverMessages.h&quot;
+#include &lt;WebCore/LibWebRTCMacros.h&gt;
+#include &lt;webrtc/base/asyncpacketsocket.h&gt;
+#include &lt;wtf/MainThread.h&gt;
+#include &lt;wtf/text/WTFString.h&gt;
+
+namespace WebKit {
+
+static inline std::unique_ptr&lt;rtc::Thread&gt; createThread()
+{
+    auto thread = rtc::Thread::CreateWithSocketServer();
+    auto result = thread-&gt;Start();
+    ASSERT_UNUSED(result, result);
+    // FIXME: Set thread name.
+    return thread;
+}
+
+NetworkRTCProvider::NetworkRTCProvider(NetworkConnectionToWebProcess&amp; connection)
+    : m_connection(&amp;connection)
+    , m_rtcMonitor(*this)
+    , m_rtcNetworkThread(createThread())
+    , m_packetSocketFactory(makeUniqueRef&lt;rtc::BasicPacketSocketFactory&gt;(m_rtcNetworkThread.get()))
+{
+}
+
+void NetworkRTCProvider::close()
+{
+    m_connection = nullptr;
+    m_resolvers.clear();
+    m_rtcMonitor.stopUpdating();
+
+    callOnRTCNetworkThread([this]() {
+        m_sockets.clear();
+    });
+}
+
+void NetworkRTCProvider::createUDPSocket(uint64_t identifier, const String&amp; address, uint16_t minPort, uint16_t maxPort)
+{
+    rtc::SocketAddress socketAddress;
+    socketAddress.FromString(address.utf8().data());
+
+    callOnRTCNetworkThread([this, identifier, socketAddress, minPort, maxPort]() {
+        std::unique_ptr&lt;rtc::AsyncPacketSocket&gt; socket(m_packetSocketFactory-&gt;CreateUdpSocket(socketAddress, minPort, maxPort));
+        addSocket(identifier, std::make_unique&lt;LibWebRTCSocketClient&gt;(identifier, *this, WTFMove(socket)));
+    });
+}
+
+void NetworkRTCProvider::createServerTCPSocket(uint64_t identifier, const String&amp; address, uint16_t minPort, uint16_t maxPort, int options)
+{
+    rtc::SocketAddress socketAddress;
+    socketAddress.FromString(address.utf8().data());
+
+    callOnRTCNetworkThread([this, identifier, socketAddress, minPort, maxPort, options]() {
+        std::unique_ptr&lt;rtc::AsyncPacketSocket&gt; socket(m_packetSocketFactory-&gt;CreateServerTcpSocket(socketAddress, minPort, maxPort, options));
+        addSocket(identifier, std::make_unique&lt;LibWebRTCSocketClient&gt;(identifier, *this, WTFMove(socket)));
+    });
+}
+
+void NetworkRTCProvider::createClientTCPSocket(uint64_t identifier, const String&amp; localAddress, const String&amp; remoteAddress, int options)
+{
+    rtc::SocketAddress socketLocalAddress;
+    socketLocalAddress.FromString(localAddress.utf8().data());
+
+    rtc::SocketAddress socketRemoteAddress;
+    socketRemoteAddress.FromString(remoteAddress.utf8().data());
+
+    callOnRTCNetworkThread([this, identifier, socketLocalAddress, socketRemoteAddress, options]() {
+        std::unique_ptr&lt;rtc::AsyncPacketSocket&gt; socket(m_packetSocketFactory-&gt;CreateClientTcpSocket(socketLocalAddress, socketRemoteAddress, { }, { }, options));
+        addSocket(identifier, std::make_unique&lt;LibWebRTCSocketClient&gt;(identifier, *this, WTFMove(socket)));
+    });
+}
+
+void NetworkRTCProvider::addSocket(uint64_t identifier, std::unique_ptr&lt;LibWebRTCSocketClient&gt;&amp;&amp; socket)
+{
+    m_sockets.add(identifier, WTFMove(socket));
+}
+
+std::unique_ptr&lt;LibWebRTCSocketClient&gt; NetworkRTCProvider::takeSocket(uint64_t identifier)
+{
+    return m_sockets.take(identifier);
+}
+
+void NetworkRTCProvider::didReceiveNetworkRTCSocketMessage(IPC::Connection&amp; connection, IPC::Decoder&amp; decoder)
+{
+    NetworkRTCSocket(decoder.destinationID(), *this).didReceiveMessage(connection, decoder);
+}
+
+void NetworkRTCProvider::createResolver(uint64_t identifier, const String&amp; address)
+{
+    CFHostRef host = CFHostCreateWithName(kCFAllocatorDefault, address.createCFString().get());
+    ASSERT(host);
+
+    auto resolver = std::make_unique&lt;Resolver&gt;(identifier, *this, host);
+
+    CFHostClientContext context = { 0, resolver.get(), nullptr, nullptr, nullptr };
+    CFHostSetClient(host, NetworkRTCProvider::resolvedName, &amp;context);
+    CFHostScheduleWithRunLoop(host, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+    Boolean result = CFHostStartInfoResolution(host, kCFHostAddresses, nullptr);
+    ASSERT_UNUSED(result, result);
+
+    m_resolvers.add(identifier, WTFMove(resolver));
+}
+
+void NetworkRTCProvider::stopResolver(uint64_t identifier)
+{
+    auto resolver = m_resolvers.take(identifier);
+    if (resolver)
+        CFHostCancelInfoResolution(resolver-&gt;host, CFHostInfoType::kCFHostAddresses);
+}
+
+void NetworkRTCProvider::resolvedName(CFHostRef hostRef, CFHostInfoType typeInfo, const CFStreamError *error, void *info)
+{
+    ASSERT_UNUSED(typeInfo, !typeInfo);
+
+    if (error-&gt;domain) {
+        // FIXME: Need to handle failure, but info is not provided in the callback.
+        return;
+    }
+
+    ASSERT(info);
+    auto* resolverInfo = static_cast&lt;Resolver*&gt;(info);
+    auto resolver = resolverInfo-&gt;rtcProvider.m_resolvers.take(resolverInfo-&gt;identifier);
+    if (!resolver)
+        return;
+
+    Boolean result;
+    CFArrayRef resolvedAddresses = (CFArrayRef)CFHostGetAddressing(hostRef, &amp;result);
+    ASSERT_UNUSED(result, result);
+
+    size_t count = CFArrayGetCount(resolvedAddresses);
+    Vector&lt;RTCNetwork::IPAddress&gt; addresses;
+    addresses.reserveInitialCapacity(count);
+
+    for (size_t index = 0; index &lt; count; ++index) {
+        CFDataRef data = (CFDataRef)CFArrayGetValueAtIndex(resolvedAddresses, index);
+        auto* address = reinterpret_cast&lt;const struct sockaddr_in*&gt;(CFDataGetBytePtr(data));
+        addresses.uncheckedAppend(RTCNetwork::IPAddress(rtc::IPAddress(address-&gt;sin_addr)));
+    }
+    ASSERT(resolver-&gt;rtcProvider.m_connection);
+    resolver-&gt;rtcProvider.m_connection-&gt;connection().send(Messages::WebRTCResolver::SetResolvedAddress(addresses), resolver-&gt;identifier);
+}
+
+struct NetworkMessageData : public rtc::MessageData {
+    NetworkMessageData(Ref&lt;NetworkRTCProvider&gt;&amp;&amp; rtcProvider, Function&lt;void()&gt;&amp;&amp; callback)
+        : rtcProvider(WTFMove(rtcProvider))
+        , callback(WTFMove(callback))
+    { }
+    Ref&lt;NetworkRTCProvider&gt; rtcProvider;
+    Function&lt;void()&gt; callback;
+};
+
+void NetworkRTCProvider::OnMessage(rtc::Message* message)
+{
+    ASSERT(message-&gt;message_id == 1);
+    static_cast&lt;NetworkMessageData*&gt;(message-&gt;pdata)-&gt;callback();
+}
+
+void NetworkRTCProvider::callOnRTCNetworkThread(Function&lt;void()&gt;&amp;&amp; callback)
+{
+    m_rtcNetworkThread-&gt;Post(RTC_FROM_HERE, this, 1, new NetworkMessageData(*this, WTFMove(callback)));
+}
+
+void NetworkRTCProvider::callSocket(uint64_t identifier, Function&lt;void(LibWebRTCSocketClient&amp;)&gt;&amp;&amp; callback)
+{
+    callOnRTCNetworkThread([this, identifier, callback = WTFMove(callback)]() {
+        if (auto* socket = m_sockets.get(identifier))
+            callback(*socket);
+    });
+}
+
+void NetworkRTCProvider::sendFromMainThread(Function&lt;void(IPC::Connection&amp;)&gt;&amp;&amp; callback)
+{
+    callOnMainThread([provider = makeRef(*this), callback = WTFMove(callback)]() {
+        if (provider-&gt;m_connection)
+            callback(provider-&gt;m_connection-&gt;connection());
+    });
+}
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCProviderh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCProvider.h (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCProvider.h                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCProvider.h        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,108 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(LIBWEBRTC)
+
+#include &quot;LibWebRTCSocketClient.h&quot;
+#include &quot;NetworkRTCMonitor.h&quot;
+#include &lt;CFNetwork/CFHost.h&gt;
+#include &lt;WebCore/LibWebRTCMacros.h&gt;
+#include &lt;webrtc/base/sigslot.h&gt;
+#include &lt;webrtc/p2p/base/basicpacketsocketfactory.h&gt;
+#include &lt;wtf/HashMap.h&gt;
+#include &lt;wtf/ThreadSafeRefCounted.h&gt;
+#include &lt;wtf/UniqueRef.h&gt;
+#include &lt;wtf/text/WTFString.h&gt;
+
+namespace IPC {
+class Connection;
+class Decoder;
+}
+
+namespace WebKit {
+
+class NetworkConnectionToWebProcess;
+class NetworkRTCSocket;
+    
+class NetworkRTCProvider : public ThreadSafeRefCounted&lt;NetworkRTCProvider&gt;, public rtc::MessageHandler {
+public:
+    static Ref&lt;NetworkRTCProvider&gt; create(NetworkConnectionToWebProcess&amp; connection) { return adoptRef(*new NetworkRTCProvider(connection)); }
+
+    void didReceiveMessage(IPC::Connection&amp;, IPC::Decoder&amp;);
+    void didReceiveNetworkRTCMonitorMessage(IPC::Connection&amp; connection, IPC::Decoder&amp; decoder) { m_rtcMonitor.didReceiveMessage(connection, decoder); }
+    void didReceiveNetworkRTCSocketMessage(IPC::Connection&amp;, IPC::Decoder&amp;);
+
+    std::unique_ptr&lt;LibWebRTCSocketClient&gt; takeSocket(uint64_t);
+    void resolverDone(uint64_t);
+
+    void close();
+
+    void callSocket(uint64_t, Function&lt;void(LibWebRTCSocketClient&amp;)&gt;&amp;&amp;);
+    void callOnRTCNetworkThread(Function&lt;void()&gt;&amp;&amp;);
+    void sendFromMainThread(Function&lt;void(IPC::Connection&amp;)&gt;&amp;&amp;);
+
+private:
+    explicit NetworkRTCProvider(NetworkConnectionToWebProcess&amp;);
+
+    void createUDPSocket(uint64_t, const String&amp;, uint16_t, uint16_t);
+    void createClientTCPSocket(uint64_t, const String&amp;, const String&amp;, int);
+    void createServerTCPSocket(uint64_t, const String&amp;, uint16_t minPort, uint16_t maxPort, int);
+    void createResolver(uint64_t, const String&amp;);
+    void stopResolver(uint64_t);
+
+    void addSocket(uint64_t, std::unique_ptr&lt;LibWebRTCSocketClient&gt;&amp;&amp;);
+
+    void OnMessage(rtc::Message*);
+
+    static void resolvedName(CFHostRef, CFHostInfoType, const CFStreamError*, void*);
+
+    struct Resolver {
+        Resolver(uint64_t identifier, NetworkRTCProvider&amp; rtcProvider, RetainPtr&lt;CFHostRef&gt;&amp;&amp; host)
+            : identifier(identifier)
+            , rtcProvider(rtcProvider)
+            , host(WTFMove(host)) { }
+        ~Resolver() { CFRelease(host); }
+
+        uint64_t identifier;
+        NetworkRTCProvider&amp; rtcProvider;
+        CFHostRef host;
+    };
+
+    HashMap&lt;uint64_t, std::unique_ptr&lt;Resolver&gt;&gt; m_resolvers;
+    HashMap&lt;uint64_t, std::unique_ptr&lt;LibWebRTCSocketClient&gt;&gt; m_sockets;
+    NetworkConnectionToWebProcess* m_connection;
+    bool m_isStarted { true };
+
+    NetworkRTCMonitor m_rtcMonitor;
+
+    std::unique_ptr&lt;rtc::Thread&gt; m_rtcNetworkThread;
+    UniqueRef&lt;rtc::BasicPacketSocketFactory&gt; m_packetSocketFactory;
+};
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCProvidermessagesin"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCProvider.messages.in (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCProvider.messages.in                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCProvider.messages.in        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+# Copyright (C) 2017 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#if USE(LIBWEBRTC)
+
+messages -&gt; NetworkRTCProvider {
+    CreateUDPSocket(int identifier, String localAddress, uint16_t minPort, uint16_t maxPort)
+    CreateServerTCPSocket(int identifier, String localAddress, uint16_t minPort, uint16_t maxPort, int options)
+    CreateClientTCPSocket(int identifier, String localAddress, String remoteAddress, int options)
+    CreateResolver(uint64_t identifier, String address)
+    StopResolver(uint64_t identifier)
+}
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCSocketcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCSocket.cpp (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCSocket.cpp                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCSocket.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,83 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;NetworkRTCSocket.h&quot;
+
+#if USE(LIBWEBRTC)
+
+#include &quot;DataReference.h&quot;
+#include &quot;LibWebRTCSocketClient.h&quot;
+#include &quot;NetworkRTCProvider.h&quot;
+#include &lt;WebCore/SharedBuffer.h&gt;
+#include &lt;wtf/Function.h&gt;
+
+namespace WebKit {
+
+NetworkRTCSocket::NetworkRTCSocket(uint64_t identifier, NetworkRTCProvider&amp; rtcProvider)
+    : m_identifier(identifier)
+    , m_rtcProvider(rtcProvider)
+{
+}
+
+void NetworkRTCSocket::sendTo(const IPC::DataReference&amp; data, const RTCNetwork::IPAddress&amp; address, uint16_t port, int packetID, int rtpSendtimeExtensionID, String srtpAuth, int64_t srtpPacketIndex, int dscp)
+{
+    auto buffer = WebCore::SharedBuffer::create(data.data(), data.size());
+
+    rtc::SocketAddress socketAddress(address.value, port);
+
+    rtc::PacketOptions options;
+    options.packet_id = packetID;
+    options.packet_time_params.rtp_sendtime_extension_id = rtpSendtimeExtensionID;
+    options.packet_time_params.srtp_packet_index = srtpPacketIndex;
+    options.dscp = static_cast&lt;rtc::DiffServCodePoint&gt;(dscp);
+    if (srtpAuth.utf8().length()) {
+        options.packet_time_params.srtp_auth_key = std::vector&lt;char&gt;(srtpAuth.utf8().data(), srtpAuth.utf8().data() + srtpAuth.utf8().length());
+        options.packet_time_params.srtp_auth_tag_len = srtpAuth.utf8().length();
+    } else
+        options.packet_time_params.srtp_auth_tag_len = -1;
+    
+    m_rtcProvider.callSocket(m_identifier, [buffer = WTFMove(buffer), socketAddress, options](LibWebRTCSocketClient&amp; client) {
+        client.sendTo(buffer.get(), socketAddress, options);
+    });
+}
+
+void NetworkRTCSocket::close()
+{
+    m_rtcProvider.callSocket(m_identifier, [](LibWebRTCSocketClient&amp; socket) {
+        socket.close();
+    });
+}
+    
+void NetworkRTCSocket::setOption(int option, int value)
+{
+    m_rtcProvider.callSocket(m_identifier, [option, value](LibWebRTCSocketClient&amp; socket) {
+        socket.setOption(option, value);
+    });
+}
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCSocketh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCSocket.h (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCSocket.h                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCSocket.h        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,73 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(LIBWEBRTC)
+
+#include &quot;RTCNetwork.h&quot;
+
+#include &lt;WebCore/LibWebRTCMacros.h&gt;
+#include &lt;webrtc/base/asyncpacketsocket.h&gt;
+#include &lt;webrtc/base/sigslot.h&gt;
+
+namespace IPC {
+class Connection;
+class DataReference;
+}
+
+namespace rtc {
+class AsyncPacketSocket;
+class SocketAddress;
+struct PacketOptions;
+struct PacketTime;
+struct SentPacket;
+}
+
+namespace WebCore {
+class SharedBuffer;
+}
+
+namespace WebKit {
+
+class NetworkConnectionToWebProcess;
+class NetworkRTCProvider;
+
+class NetworkRTCSocket {
+public:
+    NetworkRTCSocket(uint64_t, NetworkRTCProvider&amp;);
+    void didReceiveMessage(IPC::Connection&amp;, IPC::Decoder&amp;);
+private:
+    void sendTo(const IPC::DataReference&amp;, const RTCNetwork::IPAddress&amp;, uint16_t port, int packetID, int rtpSendtimeExtensionID, String srtpAuth, int64_t srtpPacketIndex, int dscp);
+    void close();
+    void setOption(int option, int value);
+
+    uint64_t m_identifier;
+    NetworkRTCProvider&amp; m_rtcProvider;
+};
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesswebrtcNetworkRTCSocketmessagesin"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCSocket.messages.in (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCSocket.messages.in                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/webrtc/NetworkRTCSocket.messages.in        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+# Copyright (C) 2017 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#if USE(LIBWEBRTC)
+
+messages -&gt; NetworkRTCSocket {
+    void SendTo(IPC::DataReference data, WebKit::RTCNetwork::IPAddress address, uint16_t port, int packetID, int rtpSendtimeExtensionID, String srtpAuth, int64_t srtpPacketIndex, int dscp)
+    void Close()
+    void SetOption(int option, int value)
+}
+
+#endif // USE(LIBWEBRTC)s
</ins></span></pre></div>
<a id="trunkSourceWebKit2SharedRTCNetworkcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/Shared/RTCNetwork.cpp (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/RTCNetwork.cpp                                (rev 0)
+++ trunk/Source/WebKit2/Shared/RTCNetwork.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,160 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;RTCNetwork.h&quot;
+
+#if USE(LIBWEBRTC)
+
+#include &quot;DataReference.h&quot;
+#include &quot;WebCoreArgumentCoders.h&quot;
+
+namespace WebKit {
+
+RTCNetwork::RTCNetwork(const rtc::Network&amp; network)
+    : name(network.name())
+    , description(network.description())
+    , prefix { network.prefix() }
+    , prefixLength(network.prefix_length())
+    , type(network.type())
+    , id(network.id())
+    , preference(network.preference())
+    , active(network.active())
+    , ignored(network.ignored())
+    , scopeID(network.scope_id())
+    , ips(network.GetIPs())
+{
+}
+
+rtc::Network RTCNetwork::value() const
+{
+    rtc::Network network(name.data(), description.data(), prefix.value, prefixLength, rtc::AdapterType(type));
+    network.set_id(id);
+    network.set_preference(preference);
+    network.set_active(active);
+    network.set_ignored(ignored);
+    network.set_scope_id(scopeID);
+    network.SetIPs(ips, true);
+    return network;
+}
+
+bool RTCNetwork::IPAddress::decode(IPC::Decoder&amp; decoder, IPAddress&amp; result)
+{
+    int family;
+    if (!decoder.decode(family))
+        return false;
+    IPC::DataReference data;
+    if (!decoder.decode(data))
+        return false;
+    if (family == AF_INET) {
+        if (data.size() != sizeof(in_addr))
+            return false;
+        result.value = rtc::IPAddress(*reinterpret_cast&lt;const in_addr*&gt;(data.data()));
+        return true;
+    }
+    if (data.size() != sizeof(in6_addr))
+        return false;
+    result.value = rtc::IPAddress(*reinterpret_cast&lt;const in6_addr*&gt;(data.data()));
+    return true;
+}
+
+void RTCNetwork::IPAddress::encode(IPC::Encoder&amp; encoder) const
+{
+    encoder &lt;&lt; value.family();
+    if (value.family() == AF_INET) {
+        auto address = value.ipv4_address();
+        encoder &lt;&lt; IPC::DataReference(reinterpret_cast&lt;const uint8_t*&gt;(&amp;address), sizeof(address));
+        return;
+    }
+    auto address = value.ipv6_address();
+    encoder &lt;&lt; IPC::DataReference(reinterpret_cast&lt;const uint8_t*&gt;(&amp;address), sizeof(address));
+}
+
+bool RTCNetwork::decode(IPC::Decoder&amp; decoder, RTCNetwork&amp; result)
+{
+    IPC::DataReference name, description;
+    if (!decoder.decode(name))
+        return false;
+    result.name = std::string(reinterpret_cast&lt;const char*&gt;(name.data()), name.size());
+    if (!decoder.decode(description))
+        return false;
+    result.description = std::string(reinterpret_cast&lt;const char*&gt;(description.data()), description.size());
+    if (!decoder.decode(result.prefix))
+        return false;
+    if (!decoder.decode(result.prefixLength))
+        return false;
+    if (!decoder.decode(result.type))
+        return false;
+    if (!decoder.decode(result.id))
+        return false;
+    if (!decoder.decode(result.preference))
+        return false;
+    if (!decoder.decode(result.active))
+        return false;
+    if (!decoder.decode(result.ignored))
+        return false;
+    if (!decoder.decode(result.scopeID))
+        return false;
+
+    uint64_t length;
+    if (!decoder.decode(length))
+        return false;
+    result.ips.reserve(length);
+    for (size_t index = 0; index &lt; length; ++index) {
+        IPAddress address;
+        if (!decoder.decode(address))
+            return false;
+        int flags;
+        if (!decoder.decode(flags))
+            return false;
+        result.ips.push_back({ address.value, flags });
+    }
+    return true;
+}
+
+void RTCNetwork::encode(IPC::Encoder&amp; encoder) const
+{
+    encoder &lt;&lt; IPC::DataReference(reinterpret_cast&lt;const uint8_t*&gt;(name.data()), name.length());
+    encoder &lt;&lt; IPC::DataReference(reinterpret_cast&lt;const uint8_t*&gt;(description.data()), description.length());
+    encoder &lt;&lt; prefix;
+    encoder &lt;&lt; prefixLength;
+    encoder &lt;&lt; type;
+
+    encoder &lt;&lt; id;
+    encoder &lt;&lt; preference;
+    encoder &lt;&lt; active;
+    encoder &lt;&lt; ignored;
+    encoder &lt;&lt; scopeID;
+
+    encoder &lt;&lt; (uint64_t)ips.size();
+    for (auto&amp; ip : ips) {
+        encoder &lt;&lt; IPAddress { ip };
+        encoder &lt;&lt; ip.ipv6_flags();
+    }
+}
+
+}
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2SharedRTCNetworkh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/Shared/RTCNetwork.h (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/RTCNetwork.h                                (rev 0)
+++ trunk/Source/WebKit2/Shared/RTCNetwork.h        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,77 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(LIBWEBRTC)
+
+#include &lt;WebCore/LibWebRTCMacros.h&gt;
+#include &lt;webrtc/base/network.h&gt;
+#include &lt;wtf/Forward.h&gt;
+
+namespace IPC {
+class Decoder;
+class Encoder;
+}
+
+namespace WebKit {
+
+struct RTCNetwork {
+    RTCNetwork() = default;
+    explicit RTCNetwork(const rtc::Network&amp;);
+
+    rtc::Network value() const;
+
+    void encode(IPC::Encoder&amp;) const;
+    static bool decode(IPC::Decoder&amp;, RTCNetwork&amp;);
+
+    struct IPAddress {
+        IPAddress() = default;
+        explicit IPAddress(const rtc::IPAddress&amp; address): value(address) { }
+
+        void encode(IPC::Encoder&amp;) const;
+        static bool decode(IPC::Decoder&amp;, IPAddress&amp;);
+
+        rtc::IPAddress value;
+    };
+
+    std::string name;
+    std::string description;
+    IPAddress prefix;
+    int prefixLength;
+    int type;
+    uint16_t id;
+    int preference;
+    bool active;
+    bool ignored;
+    int scopeID;
+    std::string key;
+    size_t length;
+    std::vector&lt;rtc::InterfaceAddress&gt; ips;
+};
+
+}
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (211440 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2017-01-31 18:59:23 UTC (rev 211440)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -873,6 +873,31 @@
</span><span class="cx">                 3F87B9BD158940120090FF62 /* WebColorChooser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3F87B9BA15893F630090FF62 /* WebColorChooser.cpp */; };
</span><span class="cx">                 3F87B9BE158940190090FF62 /* WebColorChooser.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F87B9BB15893F630090FF62 /* WebColorChooser.h */; };
</span><span class="cx">                 3F87B9C0158940D80090FF62 /* WebColorPicker.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F87B9BF158940D80090FF62 /* WebColorPicker.h */; };
</span><ins>+                410482CD1DDD324C00F006D0 /* RTCNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 410482CB1DDD2FB500F006D0 /* RTCNetwork.cpp */; };
+                410482CE1DDD324F00F006D0 /* RTCNetwork.h in Headers */ = {isa = PBXBuildFile; fileRef = 410482CC1DDD2FB500F006D0 /* RTCNetwork.h */; };
+                411B22641E371BA6004F7363 /* LibWebRTCNetwork.h in Headers */ = {isa = PBXBuildFile; fileRef = 411B22621E371244004F7363 /* LibWebRTCNetwork.h */; };
+                413075A91DE85F2C0039EC69 /* NetworkRTCSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 413075981DE84FB00039EC69 /* NetworkRTCSocket.cpp */; };
+                413075AA1DE85F300039EC69 /* NetworkRTCMonitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4130759A1DE84FB00039EC69 /* NetworkRTCMonitor.cpp */; };
+                413075AB1DE85F330039EC69 /* NetworkRTCSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 413075991DE84FB00039EC69 /* NetworkRTCSocket.h */; };
+                413075AC1DE85F370039EC69 /* NetworkRTCMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 4130759B1DE84FB00039EC69 /* NetworkRTCMonitor.h */; };
+                413075AD1DE85F580039EC69 /* LibWebRTCSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 413075A01DE85EE70039EC69 /* LibWebRTCSocket.h */; };
+                413075AE1DE85F580039EC69 /* LibWebRTCSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 413075A11DE85EE70039EC69 /* LibWebRTCSocket.cpp */; };
+                413075AF1DE85F580039EC69 /* WebRTCMonitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 413075A21DE85EE70039EC69 /* WebRTCMonitor.cpp */; };
+                413075B01DE85F580039EC69 /* WebRTCMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 413075A31DE85EE70039EC69 /* WebRTCMonitor.h */; };
+                413075B11DE85F580039EC69 /* LibWebRTCSocketFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 413075A51DE85EE70039EC69 /* LibWebRTCSocketFactory.cpp */; };
+                413075B21DE85F580039EC69 /* LibWebRTCSocketFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 413075A61DE85EE70039EC69 /* LibWebRTCSocketFactory.h */; };
+                413075B31DE85F580039EC69 /* LibWebRTCProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 413075A71DE85EE70039EC69 /* LibWebRTCProvider.cpp */; };
+                413075B41DE85F580039EC69 /* LibWebRTCProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 413075A81DE85EE70039EC69 /* LibWebRTCProvider.h */; };
+                41DC45961E3D6E2200B11F51 /* NetworkRTCProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 41DC45941E3D6E1E00B11F51 /* NetworkRTCProvider.h */; };
+                41DC45971E3D6E2200B11F51 /* NetworkRTCProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41DC45951E3D6E1E00B11F51 /* NetworkRTCProvider.cpp */; };
+                41DC459B1E3DBB2800B11F51 /* LibWebRTCSocketClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41DC45991E3DBB2400B11F51 /* LibWebRTCSocketClient.cpp */; };
+                41DC459C1E3DBB2800B11F51 /* LibWebRTCSocketClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 41DC459A1E3DBB2400B11F51 /* LibWebRTCSocketClient.h */; };
+                41DC459E1E3DBDA100B11F51 /* WebRTCSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41DC459D1E3DBCF000B11F51 /* WebRTCSocket.cpp */; };
+                41DC459F1E3DBDA500B11F51 /* WebRTCSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 41FAF5F31E3BFE7F001AE678 /* WebRTCSocket.h */; };
+                41DC45A11E3DC53F00B11F51 /* WebRTCResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41DC45A01E3DC53C00B11F51 /* WebRTCResolver.cpp */; };
+                41FAF5F51E3C0649001AE678 /* WebRTCResolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 41FAF5F41E3C0641001AE678 /* WebRTCResolver.h */; };
+                41FAF5F81E3C1021001AE678 /* LibWebRTCResolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 41FAF5F61E3C0B47001AE678 /* LibWebRTCResolver.h */; };
+                41FAF5F91E3C1025001AE678 /* LibWebRTCResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41FAF5F71E3C0B47001AE678 /* LibWebRTCResolver.cpp */; };
</ins><span class="cx">                 4450AEC01DC3FAE5009943F2 /* SharedMemoryCocoa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4450AEBF1DC3FAE5009943F2 /* SharedMemoryCocoa.cpp */; };
</span><span class="cx">                 4A3CC18A19B063E700D14AEF /* UserMediaPermissionRequestManagerProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A410F3919AF7B04002EBAB5 /* UserMediaPermissionRequestManagerProxy.cpp */; };
</span><span class="cx">                 4A3CC18B19B0640F00D14AEF /* UserMediaPermissionRequestManagerProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A410F3A19AF7B04002EBAB5 /* UserMediaPermissionRequestManagerProxy.h */; };
</span><span class="lines">@@ -1043,6 +1068,12 @@
</span><span class="cx">                 51EFC1CF1524E62500C9A938 /* WKBundleDOMWindowExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 51FA2D541521118600C1BA0B /* WKBundleDOMWindowExtension.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 51F060E01654317F00F3281B /* WebResourceLoaderMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 51F060DE1654317500F3281B /* WebResourceLoaderMessages.h */; };
</span><span class="cx">                 51F060E11654318500F3281B /* WebResourceLoaderMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51F060DD1654317500F3281B /* WebResourceLoaderMessageReceiver.cpp */; };
</span><ins>+                51F060E11654318500F3281C /* WebRTCSocketMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51F060DD1654317500F3281C /* WebRTCSocketMessageReceiver.cpp */; };
+                51F060E11654318500F3281D /* NetworkRTCSocketMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51F060DD1654317500F3281D /* NetworkRTCSocketMessageReceiver.cpp */; };
+                51F060E11654318500F3281E /* NetworkRTCMonitorMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51F060DD1654317500F3281E /* NetworkRTCMonitorMessageReceiver.cpp */; };
+                51F060E11654318500F3281F /* WebRTCMonitorMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51F060DD1654317500F3281F /* WebRTCMonitorMessageReceiver.cpp */; };
+                51F060E11654318500F3282C /* WebRTCResolverMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51F060DD1654317500F3282C /* WebRTCResolverMessageReceiver.cpp */; };
+                51F060E11654318500F3282E /* NetworkRTCProviderMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51F060DD1654317500F3282E /* NetworkRTCProviderMessageReceiver.cpp */; };
</ins><span class="cx">                 51F7DC41180CC93600212CA3 /* XPCServiceMain.mm in Sources */ = {isa = PBXBuildFile; fileRef = BC82839616B47EC400A278FE /* XPCServiceMain.mm */; };
</span><span class="cx">                 51F7DC43180CC93600212CA3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC3DE46815A91763008D26FC /* Foundation.framework */; };
</span><span class="cx">                 51F7DC44180CC93600212CA3 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* WebKit.framework */; };
</span><span class="lines">@@ -2983,6 +3014,37 @@
</span><span class="cx">                 3F87B9BA15893F630090FF62 /* WebColorChooser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebColorChooser.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 3F87B9BB15893F630090FF62 /* WebColorChooser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebColorChooser.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 3F87B9BF158940D80090FF62 /* WebColorPicker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebColorPicker.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                410482CB1DDD2FB500F006D0 /* RTCNetwork.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RTCNetwork.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                410482CC1DDD2FB500F006D0 /* RTCNetwork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCNetwork.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                411B22621E371244004F7363 /* LibWebRTCNetwork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibWebRTCNetwork.h; path = Network/webrtc/LibWebRTCNetwork.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                413075981DE84FB00039EC69 /* NetworkRTCSocket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkRTCSocket.cpp; path = NetworkProcess/webrtc/NetworkRTCSocket.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                413075991DE84FB00039EC69 /* NetworkRTCSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkRTCSocket.h; path = NetworkProcess/webrtc/NetworkRTCSocket.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                4130759A1DE84FB00039EC69 /* NetworkRTCMonitor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkRTCMonitor.cpp; path = NetworkProcess/webrtc/NetworkRTCMonitor.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                4130759B1DE84FB00039EC69 /* NetworkRTCMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkRTCMonitor.h; path = NetworkProcess/webrtc/NetworkRTCMonitor.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                4130759C1DE84FB00039EC69 /* NetworkRTCMonitor.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = NetworkRTCMonitor.messages.in; path = NetworkProcess/webrtc/NetworkRTCMonitor.messages.in; sourceTree = &quot;&lt;group&gt;&quot;; };
+                4130759D1DE84FB00039EC69 /* NetworkRTCSocket.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = NetworkRTCSocket.messages.in; path = NetworkProcess/webrtc/NetworkRTCSocket.messages.in; sourceTree = &quot;&lt;group&gt;&quot;; };
+                4130759F1DE85EE70039EC69 /* WebRTCSocket.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebRTCSocket.messages.in; path = Network/webrtc/WebRTCSocket.messages.in; sourceTree = &quot;&lt;group&gt;&quot;; };
+                413075A01DE85EE70039EC69 /* LibWebRTCSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibWebRTCSocket.h; path = Network/webrtc/LibWebRTCSocket.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                413075A11DE85EE70039EC69 /* LibWebRTCSocket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LibWebRTCSocket.cpp; path = Network/webrtc/LibWebRTCSocket.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                413075A21DE85EE70039EC69 /* WebRTCMonitor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; name = WebRTCMonitor.cpp; path = Network/webrtc/WebRTCMonitor.cpp; sourceTree = &quot;&lt;group&gt;&quot;; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };
+                413075A31DE85EE70039EC69 /* WebRTCMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebRTCMonitor.h; path = Network/webrtc/WebRTCMonitor.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                413075A41DE85EE70039EC69 /* WebRTCMonitor.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebRTCMonitor.messages.in; path = Network/webrtc/WebRTCMonitor.messages.in; sourceTree = &quot;&lt;group&gt;&quot;; };
+                413075A51DE85EE70039EC69 /* LibWebRTCSocketFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; name = LibWebRTCSocketFactory.cpp; path = Network/webrtc/LibWebRTCSocketFactory.cpp; sourceTree = &quot;&lt;group&gt;&quot;; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };
+                413075A61DE85EE70039EC69 /* LibWebRTCSocketFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibWebRTCSocketFactory.h; path = Network/webrtc/LibWebRTCSocketFactory.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                413075A71DE85EE70039EC69 /* LibWebRTCProvider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; name = LibWebRTCProvider.cpp; path = Network/webrtc/LibWebRTCProvider.cpp; sourceTree = &quot;&lt;group&gt;&quot;; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };
+                413075A81DE85EE70039EC69 /* LibWebRTCProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = LibWebRTCProvider.h; path = Network/webrtc/LibWebRTCProvider.h; sourceTree = &quot;&lt;group&gt;&quot;; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
+                41AC86811E042E5300303074 /* WebRTCResolver.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; lineEnding = 0; name = WebRTCResolver.messages.in; path = Network/webrtc/WebRTCResolver.messages.in; sourceTree = &quot;&lt;group&gt;&quot;; xcLanguageSpecificationIdentifier = &quot;&lt;none&gt;&quot;; };
+                41DC45941E3D6E1E00B11F51 /* NetworkRTCProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkRTCProvider.h; path = NetworkProcess/webrtc/NetworkRTCProvider.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                41DC45951E3D6E1E00B11F51 /* NetworkRTCProvider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkRTCProvider.cpp; path = NetworkProcess/webrtc/NetworkRTCProvider.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                41DC45981E3D6ED600B11F51 /* NetworkRTCProvider.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = NetworkRTCProvider.messages.in; path = NetworkProcess/webrtc/NetworkRTCProvider.messages.in; sourceTree = &quot;&lt;group&gt;&quot;; };
+                41DC45991E3DBB2400B11F51 /* LibWebRTCSocketClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LibWebRTCSocketClient.cpp; path = NetworkProcess/webrtc/LibWebRTCSocketClient.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                41DC459A1E3DBB2400B11F51 /* LibWebRTCSocketClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibWebRTCSocketClient.h; path = NetworkProcess/webrtc/LibWebRTCSocketClient.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                41DC459D1E3DBCF000B11F51 /* WebRTCSocket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebRTCSocket.cpp; path = Network/webrtc/WebRTCSocket.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                41DC45A01E3DC53C00B11F51 /* WebRTCResolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebRTCResolver.cpp; path = Network/webrtc/WebRTCResolver.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                41FAF5F31E3BFE7F001AE678 /* WebRTCSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebRTCSocket.h; path = Network/webrtc/WebRTCSocket.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                41FAF5F41E3C0641001AE678 /* WebRTCResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebRTCResolver.h; path = Network/webrtc/WebRTCResolver.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                41FAF5F61E3C0B47001AE678 /* LibWebRTCResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibWebRTCResolver.h; path = Network/webrtc/LibWebRTCResolver.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                41FAF5F71E3C0B47001AE678 /* LibWebRTCResolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LibWebRTCResolver.cpp; path = Network/webrtc/LibWebRTCResolver.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 4450AEBF1DC3FAE5009943F2 /* SharedMemoryCocoa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SharedMemoryCocoa.cpp; path = cocoa/SharedMemoryCocoa.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 4A410F3519AF7AC3002EBAB5 /* WKUserMediaPermissionRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKUserMediaPermissionRequest.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 4A410F3619AF7AC3002EBAB5 /* WKUserMediaPermissionRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKUserMediaPermissionRequest.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -3180,6 +3242,12 @@
</span><span class="cx">                 51E399051D6F54C5009C8831 /* UIGamepadProviderCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UIGamepadProviderCocoa.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51E949961D761CC700EC9EB9 /* UIGamepadProviderIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UIGamepadProviderIOS.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51F060DD1654317500F3281B /* WebResourceLoaderMessageReceiver.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WebResourceLoaderMessageReceiver.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                51F060DD1654317500F3281C /* WebRTCSocketMessageReceiver.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WebRTCSocketMessageReceiver.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                51F060DD1654317500F3281D /* NetworkRTCSocketMessageReceiver.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkRTCSocketMessageReceiver.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                51F060DD1654317500F3281E /* NetworkRTCMonitorMessageReceiver.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkRTCMonitorMessageReceiver.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                51F060DD1654317500F3281F /* WebRTCMonitorMessageReceiver.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WebRTCMonitorMessageReceiver.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                51F060DD1654317500F3282C /* WebRTCResolverMessageReceiver.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WebRTCResolverMessageReceiver.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                51F060DD1654317500F3282E /* NetworkRTCProviderMessageReceiver.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkRTCProviderMessageReceiver.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 51F060DE1654317500F3281B /* WebResourceLoaderMessages.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebResourceLoaderMessages.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51F7DC4A180CC93600212CA3 /* com.apple.WebKit.Databases.xpc */ = {isa = PBXFileReference; explicitFileType = &quot;wrapper.xpc-service&quot;; includeInIndex = 0; path = com.apple.WebKit.Databases.xpc; sourceTree = BUILT_PRODUCTS_DIR; };
</span><span class="cx">                 51FA2D541521118600C1BA0B /* WKBundleDOMWindowExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKBundleDOMWindowExtension.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -4692,6 +4760,8 @@
</span><span class="cx">                                 BCC43AB9127B95DC00317F16 /* PlatformPopupMenuData.h */,
</span><span class="cx">                                 E18C92F312DB9E7100CF2AEB /* PrintInfo.cpp */,
</span><span class="cx">                                 E1CC1B8E12D7EADF00625838 /* PrintInfo.h */,
</span><ins>+                                410482CB1DDD2FB500F006D0 /* RTCNetwork.cpp */,
+                                410482CC1DDD2FB500F006D0 /* RTCNetwork.h */,
</ins><span class="cx">                                 F6A0C13F13281E6E0070430F /* ResourceCachesToClear.h */,
</span><span class="cx">                                 BC2D021612AC41CB00E732A3 /* SameDocumentNavigationType.h */,
</span><span class="cx">                                 1AAB4A8C1296F0A20023952F /* SandboxExtension.h */,
</span><span class="lines">@@ -5537,6 +5607,49 @@
</span><span class="cx">                         path = Resources/mac;
</span><span class="cx">                         sourceTree = &quot;&lt;group&gt;&quot;;
</span><span class="cx">                 };
</span><ins>+                413075971DE84ED70039EC69 /* webrtc */ = {
+                        isa = PBXGroup;
+                        children = (
+                                41DC45941E3D6E1E00B11F51 /* NetworkRTCProvider.h */,
+                                41DC45951E3D6E1E00B11F51 /* NetworkRTCProvider.cpp */,
+                                41DC45981E3D6ED600B11F51 /* NetworkRTCProvider.messages.in */,
+                                41DC45991E3DBB2400B11F51 /* LibWebRTCSocketClient.cpp */,
+                                41DC459A1E3DBB2400B11F51 /* LibWebRTCSocketClient.h */,
+                                413075981DE84FB00039EC69 /* NetworkRTCSocket.cpp */,
+                                413075991DE84FB00039EC69 /* NetworkRTCSocket.h */,
+                                4130759D1DE84FB00039EC69 /* NetworkRTCSocket.messages.in */,
+                                4130759A1DE84FB00039EC69 /* NetworkRTCMonitor.cpp */,
+                                4130759B1DE84FB00039EC69 /* NetworkRTCMonitor.h */,
+                                4130759C1DE84FB00039EC69 /* NetworkRTCMonitor.messages.in */,
+                        );
+                        name = webrtc;
+                        sourceTree = &quot;&lt;group&gt;&quot;;
+                };
+                4130759E1DE85E650039EC69 /* webrtc */ = {
+                        isa = PBXGroup;
+                        children = (
+                                41DC459D1E3DBCF000B11F51 /* WebRTCSocket.cpp */,
+                                41FAF5F31E3BFE7F001AE678 /* WebRTCSocket.h */,
+                                4130759F1DE85EE70039EC69 /* WebRTCSocket.messages.in */,
+                                413075A01DE85EE70039EC69 /* LibWebRTCSocket.h */,
+                                413075A11DE85EE70039EC69 /* LibWebRTCSocket.cpp */,
+                                413075A21DE85EE70039EC69 /* WebRTCMonitor.cpp */,
+                                413075A31DE85EE70039EC69 /* WebRTCMonitor.h */,
+                                413075A41DE85EE70039EC69 /* WebRTCMonitor.messages.in */,
+                                413075A51DE85EE70039EC69 /* LibWebRTCSocketFactory.cpp */,
+                                413075A61DE85EE70039EC69 /* LibWebRTCSocketFactory.h */,
+                                413075A71DE85EE70039EC69 /* LibWebRTCProvider.cpp */,
+                                413075A81DE85EE70039EC69 /* LibWebRTCProvider.h */,
+                                41FAF5F71E3C0B47001AE678 /* LibWebRTCResolver.cpp */,
+                                41FAF5F61E3C0B47001AE678 /* LibWebRTCResolver.h */,
+                                41DC45A01E3DC53C00B11F51 /* WebRTCResolver.cpp */,
+                                41FAF5F41E3C0641001AE678 /* WebRTCResolver.h */,
+                                41AC86811E042E5300303074 /* WebRTCResolver.messages.in */,
+                                411B22621E371244004F7363 /* LibWebRTCNetwork.h */,
+                        );
+                        name = webrtc;
+                        sourceTree = &quot;&lt;group&gt;&quot;;
+                };
</ins><span class="cx">                 4450AEBE1DC3FAAC009943F2 /* cocoa */ = {
</span><span class="cx">                         isa = PBXGroup;
</span><span class="cx">                         children = (
</span><span class="lines">@@ -5559,6 +5672,7 @@
</span><span class="cx">                 5105B0D2162F7A5E00E27709 /* Network */ = {
</span><span class="cx">                         isa = PBXGroup;
</span><span class="cx">                         children = (
</span><ins>+                                4130759E1DE85E650039EC69 /* webrtc */,
</ins><span class="cx">                                 5105B0D4162F7A7A00E27709 /* NetworkProcessConnection.cpp */,
</span><span class="cx">                                 5105B0D5162F7A7A00E27709 /* NetworkProcessConnection.h */,
</span><span class="cx">                                 51FB0902163A3B1C00EC324A /* NetworkProcessConnection.messages.in */,
</span><span class="lines">@@ -5585,6 +5699,7 @@
</span><span class="cx">                                 E1798C7616E6815500240139 /* FileAPI */,
</span><span class="cx">                                 2DA944BB188511DD00ED86DB /* ios */,
</span><span class="cx">                                 510CC7DC16138E2900D03ED3 /* mac */,
</span><ins>+                                413075971DE84ED70039EC69 /* webrtc */,
</ins><span class="cx">                                 513A16491630A9BF005D7D22 /* NetworkConnectionToWebProcess.cpp */,
</span><span class="cx">                                 513A164A1630A9BF005D7D22 /* NetworkConnectionToWebProcess.h */,
</span><span class="cx">                                 513A164B1630A9BF005D7D22 /* NetworkConnectionToWebProcess.messages.in */,
</span><span class="lines">@@ -7447,6 +7562,12 @@
</span><span class="cx">                                 BCEE7ACC12817988009827DA /* WebProcessProxyMessageReceiver.cpp */,
</span><span class="cx">                                 BCEE7ACD12817988009827DA /* WebProcessProxyMessages.h */,
</span><span class="cx">                                 51F060DD1654317500F3281B /* WebResourceLoaderMessageReceiver.cpp */,
</span><ins>+                                51F060DD1654317500F3281C /* WebRTCSocketMessageReceiver.cpp */,
+                                51F060DD1654317500F3282C /* WebRTCResolverMessageReceiver.cpp */,
+                                51F060DD1654317500F3281D /* NetworkRTCSocketMessageReceiver.cpp */,
+                                51F060DD1654317500F3282E /* NetworkRTCProviderMessageReceiver.cpp */,
+                                51F060DD1654317500F3281E /* NetworkRTCMonitorMessageReceiver.cpp */,
+                                51F060DD1654317500F3281F /* WebRTCMonitorMessageReceiver.cpp */,
</ins><span class="cx">                                 51F060DE1654317500F3281B /* WebResourceLoaderMessages.h */,
</span><span class="cx">                                 7A791EF91C7CFB3700C4C52B /* WebResourceLoadStatisticsStoreMessageReceiver.cpp */,
</span><span class="cx">                                 7A791EF81C7CFB1000C4C52B /* WebResourceLoadStatisticsStoreMessages.h */,
</span><span class="lines">@@ -7749,6 +7870,7 @@
</span><span class="cx">                                 076E884E1A13CADF005E90FC /* APIContextMenuClient.h in Headers */,
</span><span class="cx">                                 51578B831209ECEF00A37C4A /* APIData.h in Headers */,
</span><span class="cx">                                 83891B631A68B3420030F386 /* APIDiagnosticLoggingClient.h in Headers */,
</span><ins>+                                41DC45961E3D6E2200B11F51 /* NetworkRTCProvider.h in Headers */,
</ins><span class="cx">                                 7C1BA33E1A4A0E600043E249 /* APIDictionary.h in Headers */,
</span><span class="cx">                                 1F7D36C118DA513F00D9D659 /* APIDownloadClient.h in Headers */,
</span><span class="cx">                                 516A4A5D120A2CCD00C05B7F /* APIError.h in Headers */,
</span><span class="lines">@@ -7890,6 +8012,7 @@
</span><span class="cx">                                 1A1EC69E1872092100B951F0 /* ImportanceAssertion.h in Headers */,
</span><span class="cx">                                 BC204EE311C83E98008F3375 /* InjectedBundle.h in Headers */,
</span><span class="cx">                                 935EEBA2127761D0003322B8 /* InjectedBundleBackForwardList.h in Headers */,
</span><ins>+                                413075B21DE85F580039EC69 /* LibWebRTCSocketFactory.h in Headers */,
</ins><span class="cx">                                 935EEBA4127761D6003322B8 /* InjectedBundleBackForwardListItem.h in Headers */,
</span><span class="cx">                                 BCEE7DC5128B645D009827DA /* InjectedBundleClient.h in Headers */,
</span><span class="cx">                                 7CBB811D1AA0F8B1006B1942 /* InjectedBundleFileHandle.h in Headers */,
</span><span class="lines">@@ -7909,6 +8032,7 @@
</span><span class="cx">                                 C5BCE5DF1C50766A00CDE3FA /* InteractionInformationAtPosition.h in Headers */,
</span><span class="cx">                                 C58CDF2A1887548B00871536 /* InteractionInformationAtPosition.h in Headers */,
</span><span class="cx">                                 2D4D2C811DF60BF3002EB10C /* InteractionInformationRequest.h in Headers */,
</span><ins>+                                41FAF5F51E3C0649001AE678 /* WebRTCResolver.h in Headers */,
</ins><span class="cx">                                 1AE49A4911FFA8CE0048B464 /* JSNPMethod.h in Headers */,
</span><span class="cx">                                 1AE4987811FF7FAA0048B464 /* JSNPObject.h in Headers */,
</span><span class="cx">                                 53DEA3661DDE423100E82648 /* json.hpp in Headers */,
</span><span class="lines">@@ -8024,6 +8148,7 @@
</span><span class="cx">                                 1A3D610213A7CC2A00F95D4E /* PluginModuleInfo.h in Headers */,
</span><span class="cx">                                 1A043976124D034800FFBFB5 /* PluginProcess.h in Headers */,
</span><span class="cx">                                 1AC5FFC2174BFD1B0001483D /* PluginProcessAttributes.h in Headers */,
</span><ins>+                                41DC459F1E3DBDA500B11F51 /* WebRTCSocket.h in Headers */,
</ins><span class="cx">                                 1A0EC906124C0AB8007EF4A5 /* PluginProcessConnection.h in Headers */,
</span><span class="cx">                                 1A0EC90F124C0AF5007EF4A5 /* PluginProcessConnectionManager.h in Headers */,
</span><span class="cx">                                 1A7865BA16CAC71500ACE83A /* PluginProcessConnectionManagerMessages.h in Headers */,
</span><span class="lines">@@ -8080,6 +8205,7 @@
</span><span class="cx">                                 E18E690C169B563F009B6670 /* SecItemShimProxy.h in Headers */,
</span><span class="cx">                                 E18E6918169B667B009B6670 /* SecItemShimProxyMessages.h in Headers */,
</span><span class="cx">                                 514D9F5719119D35000063A7 /* ServicesController.h in Headers */,
</span><ins>+                                413075AB1DE85F330039EC69 /* NetworkRTCSocket.h in Headers */,
</ins><span class="cx">                                 1AFDE65A1954A42B00C48FFA /* SessionState.h in Headers */,
</span><span class="cx">                                 1A002D49196B345D00B9AD44 /* SessionStateCoding.h in Headers */,
</span><span class="cx">                                 753E3E0E1887398900188496 /* SessionTracker.h in Headers */,
</span><span class="lines">@@ -8169,6 +8295,7 @@
</span><span class="cx">                                 1AA83F6D1A5B63FF00026EC6 /* WebDatabaseProvider.h in Headers */,
</span><span class="cx">                                 CD19A26E1A13E834008D650E /* WebDiagnosticLoggingClient.h in Headers */,
</span><span class="cx">                                 1A5B1C5518987EDF004FCF9B /* WebDocumentLoader.h in Headers */,
</span><ins>+                                413075B41DE85F580039EC69 /* LibWebRTCProvider.h in Headers */,
</ins><span class="cx">                                 BC032D7B10F4378D0058C15A /* WebDragClient.h in Headers */,
</span><span class="cx">                                 BCA0EF9F12332642007D3CFB /* WebEditCommandProxy.h in Headers */,
</span><span class="cx">                                 BC032D7D10F4378D0058C15A /* WebEditorClient.h in Headers */,
</span><span class="lines">@@ -8193,6 +8320,7 @@
</span><span class="cx">                                 BC54CACB12D64291005C67B0 /* WebGeolocationManagerProxy.h in Headers */,
</span><span class="cx">                                 BC0E618312D6CB1D0012A72A /* WebGeolocationManagerProxyMessages.h in Headers */,
</span><span class="cx">                                 BC0E607312D6BC200012A72A /* WebGeolocationPosition.h in Headers */,
</span><ins>+                                413075AC1DE85F370039EC69 /* NetworkRTCMonitor.h in Headers */,
</ins><span class="cx">                                 BC1BE1F212D54DBD0004A228 /* WebGeolocationProvider.h in Headers */,
</span><span class="cx">                                 2D5036761BCED19F00E20BB3 /* WebGestureEvent.h in Headers */,
</span><span class="cx">                                 93A88B331BC6E9CD00ABA5C2 /* WebHitTestResultData.h in Headers */,
</span><span class="lines">@@ -8202,6 +8330,7 @@
</span><span class="cx">                                 511B24A7132E095700065A0C /* WebIconDatabaseProxy.h in Headers */,
</span><span class="cx">                                 51D02F6C132EC73700BEAA96 /* WebIconDatabaseProxyMessages.h in Headers */,
</span><span class="cx">                                 510523701C739D42007993CB /* WebIDBConnectionToClient.h in Headers */,
</span><ins>+                                413075AD1DE85F580039EC69 /* LibWebRTCSocket.h in Headers */,
</ins><span class="cx">                                 5105237A1C73DA77007993CB /* WebIDBConnectionToClientMessages.h in Headers */,
</span><span class="cx">                                 514129941C6428BB0059E714 /* WebIDBConnectionToServer.h in Headers */,
</span><span class="cx">                                 510523741C73D38B007993CB /* WebIDBConnectionToServerMessages.h in Headers */,
</span><span class="lines">@@ -8256,6 +8385,7 @@
</span><span class="cx">                                 CDA29A1B1CBDBF4100901CCF /* WebPlaybackSessionManager.h in Headers */,
</span><span class="cx">                                 CDA29A291CBEB67A00901CCF /* WebPlaybackSessionManagerMessages.h in Headers */,
</span><span class="cx">                                 CDA29A201CBEB5FB00901CCF /* WebPlaybackSessionManagerProxy.h in Headers */,
</span><ins>+                                410482CE1DDD324F00F006D0 /* RTCNetwork.h in Headers */,
</ins><span class="cx">                                 CDA29A2B1CBEB67A00901CCF /* WebPlaybackSessionManagerProxyMessages.h in Headers */,
</span><span class="cx">                                 31D5929F166E060000E6BF02 /* WebPlugInClient.h in Headers */,
</span><span class="cx">                                 BC5744F012638FB3006F0F12 /* WebPopupItem.h in Headers */,
</span><span class="lines">@@ -8428,6 +8558,7 @@
</span><span class="cx">                                 07A5EBBC1C7BA43E00B9CA69 /* WKFrameHandleRef.h in Headers */,
</span><span class="cx">                                 1A4D664C18A3030E00D82E21 /* WKFrameInfo.h in Headers */,
</span><span class="cx">                                 2DF9EEE81A78245500B6CFBE /* WKFrameInfoInternal.h in Headers */,
</span><ins>+                                41FAF5F81E3C1021001AE678 /* LibWebRTCResolver.h in Headers */,
</ins><span class="cx">                                 1A6FA21E1BD0435B00AAA650 /* WKFrameInfoPrivate.h in Headers */,
</span><span class="cx">                                 2D3A65E71A7C3AA700CAC637 /* WKFrameInfoRef.h in Headers */,
</span><span class="cx">                                 BCB9F6A51123DD0D00A137E0 /* WKFramePolicyListener.h in Headers */,
</span><span class="lines">@@ -8467,6 +8598,7 @@
</span><span class="cx">                                 370F34A31829BE1E009027C8 /* WKNavigationData.h in Headers */,
</span><span class="cx">                                 370F34A51829BEA3009027C8 /* WKNavigationDataInternal.h in Headers */,
</span><span class="cx">                                 BCF69FA91176D1CB00471A52 /* WKNavigationDataRef.h in Headers */,
</span><ins>+                                411B22641E371BA6004F7363 /* LibWebRTCNetwork.h in Headers */,
</ins><span class="cx">                                 1ABC3DFC1899F51C004F0626 /* WKNavigationDelegate.h in Headers */,
</span><span class="cx">                                 1AA20D5118AD50E0005D1ED4 /* WKNavigationDelegatePrivate.h in Headers */,
</span><span class="cx">                                 1ABC3DF11899C6B6004F0626 /* WKNavigationInternal.h in Headers */,
</span><span class="lines">@@ -8589,6 +8721,7 @@
</span><span class="cx">                                 377EAD4917E2C77B002D193D /* WKUserScriptInjectionTime.h in Headers */,
</span><span class="cx">                                 1AAF089D19267FC800B6390C /* WKUserScriptInternal.h in Headers */,
</span><span class="cx">                                 7C882DFA1C7E9973006BF731 /* WKUserScriptPrivate.h in Headers */,
</span><ins>+                                413075B01DE85F580039EC69 /* WebRTCMonitor.h in Headers */,
</ins><span class="cx">                                 7C89D2A41A678875003A5FDE /* WKUserScriptRef.h in Headers */,
</span><span class="cx">                                 BC8699B5116AADAA002A925B /* WKView.h in Headers */,
</span><span class="cx">                                 BC8699B7116AADAA002A925B /* WKViewInternal.h in Headers */,
</span><span class="lines">@@ -8632,6 +8765,7 @@
</span><span class="cx">                                 1ADF591B1890528E0043C145 /* WKWebViewConfiguration.h in Headers */,
</span><span class="cx">                                 2D7AAFD618C956AF00A7ACD4 /* WKWebViewConfigurationInternal.h in Headers */,
</span><span class="cx">                                 1AC1415118AC47EE006C602C /* WKWebViewConfigurationPrivate.h in Headers */,
</span><ins>+                                41DC459C1E3DBB2800B11F51 /* LibWebRTCSocketClient.h in Headers */,
</ins><span class="cx">                                 2D7AAFD318C8640600A7ACD4 /* WKWebViewContentProvider.h in Headers */,
</span><span class="cx">                                 2DC6D9C318C44A610043BAD4 /* WKWebViewContentProviderRegistry.h in Headers */,
</span><span class="cx">                                 1A66BF8F18A052ED002071B4 /* WKWebViewInternal.h in Headers */,
</span><span class="lines">@@ -9239,7 +9373,9 @@
</span><span class="cx">                                 1A43E829188F3CDC009E4D30 /* _WKProcessPoolConfiguration.mm in Sources */,
</span><span class="cx">                                 1A9E328E182165A900F5D04C /* _WKRemoteObjectInterface.mm in Sources */,
</span><span class="cx">                                 1A9E328A1821636900F5D04C /* _WKRemoteObjectRegistry.mm in Sources */,
</span><ins>+                                410482CD1DDD324C00F006D0 /* RTCNetwork.cpp in Sources */,
</ins><span class="cx">                                 A55BA8111BA13181007CD33D /* _WKRemoteWebInspectorViewController.mm in Sources */,
</span><ins>+                                41DC45A11E3DC53F00B11F51 /* WebRTCResolver.cpp in Sources */,
</ins><span class="cx">                                 1A002D45196B338E00B9AD44 /* _WKSessionState.mm in Sources */,
</span><span class="cx">                                 2D6B371C18A967AD0042AE80 /* _WKThumbnailView.mm in Sources */,
</span><span class="cx">                                 7C2413021AACFA7500A58C15 /* _WKUserContentExtensionStore.mm in Sources */,
</span><span class="lines">@@ -9363,6 +9499,7 @@
</span><span class="cx">                                 8CFECE941490F140002AAA32 /* EditorState.cpp in Sources */,
</span><span class="cx">                                 BC032DA710F437D10058C15A /* Encoder.cpp in Sources */,
</span><span class="cx">                                 51B15A8413843A3900321AD8 /* EnvironmentUtilities.cpp in Sources */,
</span><ins>+                                413075AF1DE85F580039EC69 /* WebRTCMonitor.cpp in Sources */,
</ins><span class="cx">                                 1AA575FA1496B52600A4EE06 /* EventDispatcher.cpp in Sources */,
</span><span class="cx">                                 1AA576021496B97900A4EE06 /* EventDispatcherMessageReceiver.cpp in Sources */,
</span><span class="cx">                                 00B9661918E25AE100CE1F88 /* FindClient.mm in Sources */,
</span><span class="lines">@@ -9516,6 +9653,7 @@
</span><span class="cx">                                 5C85C7881C3F23CE0061A4FA /* PendingDownload.cpp in Sources */,
</span><span class="cx">                                 0F5E200318E77051003EC3E5 /* PlatformCAAnimationRemote.mm in Sources */,
</span><span class="cx">                                 2DA049B3180CCCD300AAFA9E /* PlatformCALayerRemote.cpp in Sources */,
</span><ins>+                                413075A91DE85F2C0039EC69 /* NetworkRTCSocket.cpp in Sources */,
</ins><span class="cx">                                 2D8710161828415D0018FA01 /* PlatformCALayerRemoteCustom.mm in Sources */,
</span><span class="cx">                                 2D8949F0182044F600E898AA /* PlatformCALayerRemoteTiledBacking.cpp in Sources */,
</span><span class="cx">                                 BCC43ABA127B95DC00317F16 /* PlatformPopupMenuData.cpp in Sources */,
</span><span class="lines">@@ -9707,6 +9845,7 @@
</span><span class="cx">                                 BC111B5E112F629800337BAB /* WebEventFactory.mm in Sources */,
</span><span class="cx">                                 BCE469531214E6CB000B98EB /* WebFormClient.cpp in Sources */,
</span><span class="cx">                                 BCE469551214E6CB000B98EB /* WebFormSubmissionListenerProxy.cpp in Sources */,
</span><ins>+                                41DC45971E3D6E2200B11F51 /* NetworkRTCProvider.cpp in Sources */,
</ins><span class="cx">                                 BC111ADD112F5B9300337BAB /* WebFrame.cpp in Sources */,
</span><span class="cx">                                 BCE469791214F2B4000B98EB /* WebFrameListenerProxy.cpp in Sources */,
</span><span class="cx">                                 BC111A5F112F4FBB00337BAB /* WebFrameLoaderClient.cpp in Sources */,
</span><span class="lines">@@ -9725,6 +9864,7 @@
</span><span class="cx">                                 BC0E606112D6BA910012A72A /* WebGeolocationManagerMessageReceiver.cpp in Sources */,
</span><span class="cx">                                 BC54CACC12D64291005C67B0 /* WebGeolocationManagerProxy.cpp in Sources */,
</span><span class="cx">                                 BC0E618212D6CB1D0012A72A /* WebGeolocationManagerProxyMessageReceiver.cpp in Sources */,
</span><ins>+                                413075AE1DE85F580039EC69 /* LibWebRTCSocket.cpp in Sources */,
</ins><span class="cx">                                 BC0E607412D6BC200012A72A /* WebGeolocationPosition.cpp in Sources */,
</span><span class="cx">                                 BC1BE1F312D54DBD0004A228 /* WebGeolocationProvider.cpp in Sources */,
</span><span class="cx">                                 2D5036751BCED19F00E20BB3 /* WebGestureEvent.cpp in Sources */,
</span><span class="lines">@@ -9844,6 +9984,12 @@
</span><span class="cx">                                 3760881E150413E900FC82C7 /* WebRenderObject.cpp in Sources */,
</span><span class="cx">                                 510AFFB916542048001BA05E /* WebResourceLoader.cpp in Sources */,
</span><span class="cx">                                 51F060E11654318500F3281B /* WebResourceLoaderMessageReceiver.cpp in Sources */,
</span><ins>+                                51F060E11654318500F3281C /* WebRTCSocketMessageReceiver.cpp in Sources */,
+                                51F060E11654318500F3282C /* WebRTCResolverMessageReceiver.cpp in Sources */,
+                                51F060E11654318500F3281D /* NetworkRTCSocketMessageReceiver.cpp in Sources */,
+                                51F060E11654318500F3282E /* NetworkRTCProviderMessageReceiver.cpp in Sources */,
+                                51F060E11654318500F3281E /* NetworkRTCMonitorMessageReceiver.cpp in Sources */,
+                                51F060E11654318500F3281F /* WebRTCMonitorMessageReceiver.cpp in Sources */,
</ins><span class="cx">                                 7A791EFC1C7D08C500C4C52B /* WebResourceLoadStatisticsStore.cpp in Sources */,
</span><span class="cx">                                 7A791EFA1C7CFCF100C4C52B /* WebResourceLoadStatisticsStoreMessageReceiver.cpp in Sources */,
</span><span class="cx">                                 7C361D721927FA360036A59D /* WebScriptMessageHandler.cpp in Sources */,
</span><span class="lines">@@ -9854,6 +10000,7 @@
</span><span class="cx">                                 1A4832C31A965A3C008B4DFE /* WebsiteDataStoreCocoa.mm in Sources */,
</span><span class="cx">                                 5C7706741D1138380012700F /* WebSocketProvider.cpp in Sources */,
</span><span class="cx">                                 8360349F1ACB34D600626549 /* WebSQLiteDatabaseTracker.cpp in Sources */,
</span><ins>+                                41DC459B1E3DBB2800B11F51 /* LibWebRTCSocketClient.cpp in Sources */,
</ins><span class="cx">                                 1A52C0F71A38CDC70016160A /* WebStorageNamespaceProvider.cpp in Sources */,
</span><span class="cx">                                 BCC5715C115ADAEF001CCAF9 /* WebSystemInterface.mm in Sources */,
</span><span class="cx">                                 51032F18180F73BB00961BB7 /* WebToDatabaseProcessConnection.cpp in Sources */,
</span><span class="lines">@@ -9871,10 +10018,12 @@
</span><span class="cx">                                 3F418EF91887BD97002795FD /* WebVideoFullscreenManagerMessageReceiver.cpp in Sources */,
</span><span class="cx">                                 52D5A1B11C57496200DE34A3 /* WebVideoFullscreenManagerProxy.mm in Sources */,
</span><span class="cx">                                 3F418EFB1887BD97002795FD /* WebVideoFullscreenManagerProxyMessageReceiver.cpp in Sources */,
</span><ins>+                                413075B31DE85F580039EC69 /* LibWebRTCProvider.cpp in Sources */,
</ins><span class="cx">                                 2DFC7DBC1BCCC19500C1548C /* WebViewImpl.mm in Sources */,
</span><span class="cx">                                 C0337DD1127A2980008FF4F4 /* WebWheelEvent.cpp in Sources */,
</span><span class="cx">                                 868160D0187645570021E79D /* WindowServerConnection.mm in Sources */,
</span><span class="cx">                                 29CD55AB128E294F00133C85 /* WKAccessibilityWebPageObjectBase.mm in Sources */,
</span><ins>+                                413075B11DE85F580039EC69 /* LibWebRTCSocketFactory.cpp in Sources */,
</ins><span class="cx">                                 29232DF818B2A9AE00D0596F /* WKAccessibilityWebPageObjectIOS.mm in Sources */,
</span><span class="cx">                                 29232DF918B2AB3A00D0596F /* WKAccessibilityWebPageObjectMac.mm in Sources */,
</span><span class="cx">                                 0FCB4E4918BBE044000FCFC9 /* WKActionSheet.mm in Sources */,
</span><span class="lines">@@ -9892,6 +10041,7 @@
</span><span class="cx">                                 BCBAACF51452324F0053F82F /* WKBrowsingContextGroup.mm in Sources */,
</span><span class="cx">                                 1AE00D4C182D6EB000087DD7 /* WKBrowsingContextHandle.mm in Sources */,
</span><span class="cx">                                 BC204EEE11C83EC8008F3375 /* WKBundle.cpp in Sources */,
</span><ins>+                                413075AA1DE85F300039EC69 /* NetworkRTCMonitor.cpp in Sources */,
</ins><span class="cx">                                 935EEB9E127761AC003322B8 /* WKBundleBackForwardList.cpp in Sources */,
</span><span class="cx">                                 935EEBA0127761AC003322B8 /* WKBundleBackForwardListItem.cpp in Sources */,
</span><span class="cx">                                 51FA2D7715212E2600C1BA0B /* WKBundleDOMWindowExtension.cpp in Sources */,
</span><span class="lines">@@ -9906,6 +10056,7 @@
</span><span class="cx">                                 7CF47FF617275B71008ACB91 /* WKBundlePageBanner.cpp in Sources */,
</span><span class="cx">                                 7CF47FFE17276AE3008ACB91 /* WKBundlePageBannerMac.mm in Sources */,
</span><span class="cx">                                 BC7B633E12A45D1200D174A4 /* WKBundlePageGroup.cpp in Sources */,
</span><ins>+                                41FAF5F91E3C1025001AE678 /* LibWebRTCResolver.cpp in Sources */,
</ins><span class="cx">                                 EDCA71B7128DDA8C00201B26 /* WKBundlePageOverlay.cpp in Sources */,
</span><span class="cx">                                 BC60C57A1240A546008C5E29 /* WKBundleRangeHandle.cpp in Sources */,
</span><span class="cx">                                 BC14DF9E120B635F00826C0C /* WKBundleScriptWorld.cpp in Sources */,
</span><span class="lines">@@ -9934,6 +10085,7 @@
</span><span class="cx">                                 BC017D2016263308007054F5 /* WKDOMTextIterator.mm in Sources */,
</span><span class="cx">                                 1AB7D78E1288CD9A00CFD08C /* WKDownload.cpp in Sources */,
</span><span class="cx">                                 1AF4592E19464B2000F9D4A2 /* WKError.mm in Sources */,
</span><ins>+                                41DC459E1E3DBDA100B11F51 /* WebRTCSocket.cpp in Sources */,
</ins><span class="cx">                                 BCFD548B132D82680055D816 /* WKErrorCF.cpp in Sources */,
</span><span class="cx">                                 BC4075FB124FF0270068F20A /* WKErrorRef.cpp in Sources */,
</span><span class="cx">                                 A58B6F0918FCA733008CBA53 /* WKFileUploadPanel.mm in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkNetworkProcessConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Network/NetworkProcessConnection.cpp (211440 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/NetworkProcessConnection.cpp        2017-01-31 18:59:23 UTC (rev 211440)
+++ trunk/Source/WebKit2/WebProcess/Network/NetworkProcessConnection.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -31,6 +31,10 @@
</span><span class="cx"> #include &quot;WebCoreArgumentCoders.h&quot;
</span><span class="cx"> #include &quot;WebLoaderStrategy.h&quot;
</span><span class="cx"> #include &quot;WebProcess.h&quot;
</span><ins>+#include &quot;WebRTCMonitor.h&quot;
+#include &quot;WebRTCMonitorMessages.h&quot;
+#include &quot;WebRTCResolverMessages.h&quot;
+#include &quot;WebRTCSocketMessages.h&quot;
</ins><span class="cx"> #include &quot;WebResourceLoaderMessages.h&quot;
</span><span class="cx"> #include &lt;WebCore/CachedResource.h&gt;
</span><span class="cx"> #include &lt;WebCore/MemoryCache.h&gt;
</span><span class="lines">@@ -54,12 +58,26 @@
</span><span class="cx"> void NetworkProcessConnection::didReceiveMessage(IPC::Connection&amp; connection, IPC::Decoder&amp; decoder)
</span><span class="cx"> {
</span><span class="cx">     if (decoder.messageReceiverName() == Messages::WebResourceLoader::messageReceiverName()) {
</span><del>-        if (WebResourceLoader* webResourceLoader = WebProcess::singleton().webLoaderStrategy().webResourceLoaderForIdentifier(decoder.destinationID()))
</del><ins>+        if (auto* webResourceLoader = WebProcess::singleton().webLoaderStrategy().webResourceLoaderForIdentifier(decoder.destinationID()))
</ins><span class="cx">             webResourceLoader-&gt;didReceiveWebResourceLoaderMessage(connection, decoder);
</span><del>-        
</del><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+#if USE(LIBWEBRTC)
+    if (decoder.messageReceiverName() == Messages::WebRTCSocket::messageReceiverName()) {
+        WebProcess::singleton().libWebRTCNetwork().socket(decoder.destinationID()).didReceiveMessage(connection, decoder);
+        return;
+    }
+    if (decoder.messageReceiverName() == Messages::WebRTCMonitor::messageReceiverName()) {
+        WebProcess::singleton().libWebRTCNetwork().monitor().didReceiveMessage(connection, decoder);
+        return;
+    }
+    if (decoder.messageReceiverName() == Messages::WebRTCResolver::messageReceiverName()) {
+        WebProcess::singleton().libWebRTCNetwork().resolver(decoder.destinationID()).didReceiveMessage(connection, decoder);
+        return;
+    }
+#endif
+
</ins><span class="cx">     didReceiveNetworkProcessConnectionMessage(connection, decoder);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCNetworkh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCNetwork.h (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCNetwork.h                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCNetwork.h        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,54 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(LIBWEBRTC)
+
+#include &quot;LibWebRTCSocketFactory.h&quot;
+#include &quot;WebRTCMonitor.h&quot;
+#include &quot;WebRTCResolver.h&quot;
+#include &quot;WebRTCSocket.h&quot;
+
+namespace WebKit {
+
+class LibWebRTCNetwork {
+public:
+    LibWebRTCNetwork() = default;
+
+    WebRTCMonitor&amp; monitor() { return m_webNetworkMonitor; }
+    LibWebRTCSocketFactory&amp; socketFactory() { return m_socketFactory; }
+
+    WebRTCSocket socket(uint64_t identifier) { return WebRTCSocket(socketFactory(), identifier); }
+    WebRTCResolver resolver(uint64_t identifier) { return WebRTCResolver(socketFactory(), identifier); }
+
+private:
+    LibWebRTCSocketFactory m_socketFactory;
+    WebRTCMonitor m_webNetworkMonitor;
+};
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCProvidercpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCProvider.cpp (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCProvider.cpp                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCProvider.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,44 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;LibWebRTCProvider.h&quot;
+
+#if USE(LIBWEBRTC)
+
+#include &quot;WebProcess.h&quot;
+#include &lt;WebCore/LibWebRTCUtils.h&gt;
+#include &lt;webrtc/api/peerconnectionfactory.h&gt;
+
+namespace WebKit {
+
+rtc::scoped_refptr&lt;webrtc::PeerConnectionInterface&gt; LibWebRTCProvider::createPeerConnection(webrtc::PeerConnectionObserver&amp; observer)
+{
+    return WebCore::createPeerConnection(observer, WebProcess::singleton().libWebRTCNetwork().monitor(), WebProcess::singleton().libWebRTCNetwork().socketFactory());
+}
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCProviderh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCProvider.h (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCProvider.h                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCProvider.h        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,45 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include &lt;WebCore/LibWebRTCProvider.h&gt;
+
+
+namespace WebKit {
+
+#if USE(LIBWEBRTC)
+class LibWebRTCProvider final : public WebCore::LibWebRTCProvider {
+public:
+    LibWebRTCProvider() = default;
+
+private:
+    rtc::scoped_refptr&lt;webrtc::PeerConnectionInterface&gt; createPeerConnection(webrtc::PeerConnectionObserver&amp;) final;
+};
+#else
+using LibWebRTCProvider = WebCore::LibWebRTCProvider;
+#endif // USE(LIBWEBRTC)
+
+} // namespace WebKit
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCResolvercpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCResolver.cpp (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCResolver.cpp                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCResolver.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,103 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;LibWebRTCResolver.h&quot;
+
+#if USE(LIBWEBRTC)
+
+#include &quot;NetworkProcessConnection.h&quot;
+#include &quot;NetworkRTCProviderMessages.h&quot;
+#include &quot;WebProcess.h&quot;
+#include &lt;wtf/MainThread.h&gt;
+
+namespace WebKit {
+
+static inline void sendOnMainThread(Function&lt;void(IPC::Connection&amp;)&gt;&amp;&amp; callback)
+{
+    callOnMainThread([callback = WTFMove(callback)]() {
+        callback(WebProcess::singleton().networkConnection().connection());
+    });
+}
+
+void LibWebRTCResolver::Start(const rtc::SocketAddress&amp; address)
+{
+    m_isResolving = true;
+    m_addressToResolve = address;
+    m_port = address.port();
+    auto identifier = m_identifier;
+    sendOnMainThread([identifier, address](IPC::Connection&amp; connection) {
+        auto addressString = address.HostAsURIString();
+        connection.send(Messages::NetworkRTCProvider::CreateResolver(identifier, String(addressString.data(), addressString.length())), 0);
+    });
+}
+
+bool LibWebRTCResolver::GetResolvedAddress(int family, rtc::SocketAddress* address) const
+{
+    ASSERT(address);
+    if (m_error || !m_addresses.size())
+        return false;
+
+    *address = m_addressToResolve;
+    for (auto&amp; ipAddress : m_addresses) {
+        if (family == ipAddress.family()) {
+            address-&gt;SetResolvedIP(ipAddress);
+            address-&gt;SetPort(m_port);
+            return true;
+        }
+    }
+    return false;
+}
+
+void LibWebRTCResolver::Destroy(bool)
+{
+    if (!isResolving())
+        return;
+
+    auto identifier = m_identifier;
+    sendOnMainThread([identifier](IPC::Connection&amp; connection) {
+        connection.send(Messages::NetworkRTCProvider::StopResolver(identifier), 0);
+    });
+
+    // Let's take the resolver so that it gets destroyed at the end of this function.
+    auto resolver = WebProcess::singleton().libWebRTCNetwork().socketFactory().takeResolver(m_identifier);
+    ASSERT(resolver);
+}
+
+void LibWebRTCResolver::setResolvedAddress(const Vector&lt;rtc::IPAddress&gt;&amp; addresses)
+{
+    m_addresses = addresses;
+    SignalDone(this);
+}
+
+void LibWebRTCResolver::setError(int error)
+{
+    m_error = error;
+    SignalDone(this);
+}
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCResolverh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCResolver.h (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCResolver.h                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCResolver.h        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,67 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(LIBWEBRTC)
+
+#include &lt;WebCore/LibWebRTCMacros.h&gt;
+#include &lt;webrtc/base/nethelpers.h&gt;
+#include &lt;webrtc/p2p/base/packetsocketfactory.h&gt;
+#include &lt;wtf/Vector.h&gt;
+
+namespace WebKit {
+class LibWebRTCSocketFactory;
+
+class LibWebRTCResolver final : public rtc::AsyncResolverInterface {
+public:
+    LibWebRTCResolver(uint64_t identifier) : m_identifier(identifier) { }
+
+    bool isResolving() const { return m_isResolving; }
+    uint64_t identifier() const { return m_identifier; }
+
+private:
+    friend class WebRTCResolver;
+
+    // AsyncResolverInterface API.
+    void Start(const rtc::SocketAddress&amp;) final;
+    bool GetResolvedAddress(int, rtc::SocketAddress*) const final;
+    int GetError() const final { return m_error; }
+    void Destroy(bool) final;
+
+    void setError(int);
+    void setResolvedAddress(const Vector&lt;rtc::IPAddress&gt;&amp;);
+
+    uint64_t m_identifier;
+    Vector&lt;rtc::IPAddress&gt; m_addresses;
+    rtc::SocketAddress m_addressToResolve;
+    int m_error { 0 };
+    uint16_t m_port { 0 };
+    bool m_isResolving { false };
+};
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCSocketcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocket.cpp (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocket.cpp                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocket.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,193 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;LibWebRTCSocket.h&quot;
+
+#if USE(LIBWEBRTC)
+
+#include &quot;DataReference.h&quot;
+#include &quot;LibWebRTCSocketFactory.h&quot;
+#include &quot;NetworkProcessConnection.h&quot;
+#include &quot;NetworkRTCSocketMessages.h&quot;
+#include &quot;WebProcess.h&quot;
+#include &lt;WebCore/SharedBuffer.h&gt;
+#include &lt;wtf/Function.h&gt;
+#include &lt;wtf/MainThread.h&gt;
+
+namespace WebKit {
+
+static inline void sendOnMainThread(Function&lt;void(IPC::Connection&amp;)&gt;&amp;&amp; callback)
+{
+    callOnMainThread([callback = WTFMove(callback)]() {
+        callback(WebProcess::singleton().networkConnection().connection());
+    });
+}
+
+LibWebRTCSocket::LibWebRTCSocket(LibWebRTCSocketFactory&amp; factory, uint64_t identifier, Type type, const rtc::SocketAddress&amp; localAddress, const rtc::SocketAddress&amp; remoteAddress)
+    : m_factory(factory)
+    , m_identifier(identifier)
+    , m_type(type)
+    , m_localAddress(localAddress)
+    , m_remoteAddress(remoteAddress)
+{
+    memset(&amp;m_options, 1, MAX_SOCKET_OPTION);
+
+    if (type == Type::ClientTCP)
+        return;
+
+    WebRTCSocket::signalOnNetworkThread(m_factory, m_identifier, [](LibWebRTCSocket&amp; socket) {
+        socket.signalAddressReady();
+    });
+}
+
+LibWebRTCSocket::~LibWebRTCSocket()
+{
+    m_factory.detach(*this);
+}
+
+rtc::SocketAddress LibWebRTCSocket::GetLocalAddress() const
+{
+    return m_localAddress;
+}
+
+rtc::SocketAddress LibWebRTCSocket::GetRemoteAddress() const
+{
+    return m_remoteAddress;
+}
+
+void LibWebRTCSocket::signalAddressReady()
+{
+    ASSERT(m_type != Type::ClientTCP);
+    m_state = STATE_BOUND;
+    SignalAddressReady(this, m_localAddress);
+}
+
+void LibWebRTCSocket::signalAddressReady(const String&amp; address)
+{
+    ASSERT(m_type == Type::ClientTCP);
+    m_localAddress.FromString(address.utf8().data());
+    m_state = STATE_CONNECTED;
+    SignalAddressReady(this, m_localAddress);
+}
+
+void LibWebRTCSocket::signalReadPacket(const WebCore::SharedBuffer&amp; buffer, rtc::SocketAddress&amp;&amp; address, int64_t timestamp)
+{
+    m_remoteAddress = WTFMove(address);
+    SignalReadPacket(this, buffer.data(), buffer.size(), m_remoteAddress, rtc::PacketTime(timestamp, 0));
+}
+
+void LibWebRTCSocket::signalSentPacket(int rtcPacketID, int64_t sendTimeMs)
+{
+    m_availableSendingBytes += m_beingSentPacketSizes.takeFirst();
+    SignalSentPacket(this, rtc::SentPacket(rtcPacketID, sendTimeMs));
+    if (m_shouldSignalReadyToSend) {
+        m_shouldSignalReadyToSend = false;
+        SignalReadyToSend(this);
+    }
+}
+
+void LibWebRTCSocket::signalConnect()
+{
+    m_state = STATE_CONNECTED;
+    SignalConnect(this);
+}
+
+void LibWebRTCSocket::signalClose(int error)
+{
+    m_state = STATE_CLOSED;
+    SignalClose(this, error);
+}
+
+static inline String authKey(const rtc::PacketOptions&amp; options)
+{
+    if (options.packet_time_params.srtp_auth_key.size() &lt;= 0)
+        return { };
+    return String(options.packet_time_params.srtp_auth_key.data(), options.packet_time_params.srtp_auth_key.size());
+}
+
+bool LibWebRTCSocket::willSend(size_t size)
+{
+    if (size &gt; m_availableSendingBytes) {
+        m_shouldSignalReadyToSend = true;
+        setError(EWOULDBLOCK);
+        return false;
+    }
+    m_availableSendingBytes -= size;
+    m_beingSentPacketSizes.append(size);
+    return true;
+}
+
+int LibWebRTCSocket::SendTo(const void *value, size_t size, const rtc::SocketAddress&amp; address, const rtc::PacketOptions&amp; options)
+{
+    if (!willSend(size))
+        return -1;
+
+    auto buffer = WebCore::SharedBuffer::create(static_cast&lt;const uint8_t*&gt;(value), size);
+    auto identifier = this-&gt;identifier();
+
+    sendOnMainThread([identifier, buffer = WTFMove(buffer), address, options](IPC::Connection&amp; connection) {
+        IPC::DataReference data(reinterpret_cast&lt;const uint8_t*&gt;(buffer-&gt;data()), buffer-&gt;size());
+        String srtpAuthKey = authKey(options);
+        Messages::NetworkRTCSocket::SendTo message(data, RTCNetwork::IPAddress(address.ipaddr()), address.port(), options.packet_id, options.packet_time_params.rtp_sendtime_extension_id, srtpAuthKey, options.packet_time_params.srtp_packet_index, options.dscp);
+        connection.send(WTFMove(message), identifier);
+    });
+    return size;
+}
+
+int LibWebRTCSocket::Close()
+{
+    auto identifier = this-&gt;identifier();
+    sendOnMainThread([identifier](IPC::Connection&amp; connection) {
+        connection.send(Messages::NetworkRTCSocket::Close(), identifier);
+    });
+    return 0;
+}
+
+int LibWebRTCSocket::GetOption(rtc::Socket::Option option, int* value)
+{
+    ASSERT(option &lt; MAX_SOCKET_OPTION);
+    int storedValue = m_options[option];
+    if (storedValue != -1)
+        *value = m_options[option];
+    return 0;
+}
+
+int LibWebRTCSocket::SetOption(rtc::Socket::Option option, int value)
+{
+    ASSERT(option &lt; MAX_SOCKET_OPTION);
+
+    m_options[option] = value;
+
+    auto identifier = this-&gt;identifier();
+    sendOnMainThread([identifier, option, value](IPC::Connection&amp; connection) {
+        connection.send(Messages::NetworkRTCSocket::SetOption(option, value), identifier);
+    });
+    return 0;
+}
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCSocketh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocket.h (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocket.h                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocket.h        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,106 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(LIBWEBRTC)
+
+#include &lt;WebCore/LibWebRTCMacros.h&gt;
+#include &lt;WebCore/LibWebRTCUtils.h&gt;
+#include &lt;webrtc/base/asyncpacketsocket.h&gt;
+#include &lt;wtf/Deque.h&gt;
+#include &lt;wtf/Forward.h&gt;
+
+namespace IPC {
+class Connection;
+class DataReference;
+class Decoder;
+}
+
+namespace WebCore {
+class SharedBuffer;
+}
+
+namespace WebKit {
+
+class LibWebRTCSocketFactory;
+
+class LibWebRTCSocket final : public rtc::AsyncPacketSocket {
+public:
+    enum class Type { UDP, ServerTCP, ClientTCP };
+
+    LibWebRTCSocket(LibWebRTCSocketFactory&amp;, uint64_t identifier, Type, const rtc::SocketAddress&amp; localAddress, const rtc::SocketAddress&amp; remoteAddress);
+    ~LibWebRTCSocket();
+
+    uint64_t identifier() const { return m_identifier; }
+    const rtc::SocketAddress&amp; localAddress() const { return m_localAddress; }
+    const rtc::SocketAddress&amp; remoteAddress() const { return m_remoteAddress; }
+
+    void setError(int error) { m_error = error; }
+    void setState(State state) { m_state = state; }
+
+private:
+    bool willSend(size_t);
+
+    friend class WebRTCSocket;
+    void signalReadPacket(const WebCore::SharedBuffer&amp;, rtc::SocketAddress&amp;&amp;, int64_t);
+    void signalSentPacket(int, int64_t);
+    void signalAddressReady(const String&amp;);
+    void signalAddressReady();
+    void signalConnect();
+    void signalClose(int);
+
+    // AsyncPacketSocket API
+    int GetError() const final { return m_error; }
+    void SetError(int error) final { setError(error); }
+    rtc::SocketAddress GetLocalAddress() const final;
+    rtc::SocketAddress GetRemoteAddress() const final;
+    int Send(const void *pv, size_t cb, const rtc::PacketOptions&amp; options) final { return SendTo(pv, cb, m_remoteAddress, options); }
+    int SendTo(const void *, size_t, const rtc::SocketAddress&amp;, const rtc::PacketOptions&amp;) final;
+    int Close() final;
+    State GetState() const final { return m_state; }
+    int GetOption(rtc::Socket::Option, int*) final;
+    int SetOption(rtc::Socket::Option, int) final;
+
+    LibWebRTCSocketFactory&amp; m_factory;
+    uint64_t m_identifier { 0 };
+    Type m_type;
+    rtc::SocketAddress m_localAddress;
+    rtc::SocketAddress m_remoteAddress;
+
+    int m_error { 0 };
+    State m_state { STATE_BINDING };
+
+    static const unsigned MAX_SOCKET_OPTION { rtc::Socket::OPT_RTP_SENDTIME_EXTN_ID + 1 };
+    int m_options[MAX_SOCKET_OPTION];
+
+    Deque&lt;size_t&gt; m_beingSentPacketSizes;
+    size_t m_availableSendingBytes { 65536 };
+    bool m_shouldSignalReadyToSend { false };
+};
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCSocketFactorycpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,116 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;LibWebRTCSocketFactory.h&quot;
+
+#if USE(LIBWEBRTC)
+
+#include &quot;NetworkProcessConnection.h&quot;
+#include &quot;NetworkRTCMonitorMessages.h&quot;
+#include &quot;NetworkRTCProviderMessages.h&quot;
+#include &quot;WebProcess.h&quot;
+#include &quot;WebRTCSocket.h&quot;
+#include &lt;wtf/MainThread.h&gt;
+
+namespace WebKit {
+
+uint64_t LibWebRTCSocketFactory::s_uniqueSocketIdentifier = 0;
+uint64_t LibWebRTCSocketFactory::s_uniqueResolverIdentifier = 0;
+
+rtc::AsyncPacketSocket* LibWebRTCSocketFactory::CreateServerTcpSocket(const rtc::SocketAddress&amp; socketAddress, uint16_t minPort, uint16_t maxPort, int options)
+{
+    auto socket = std::make_unique&lt;LibWebRTCSocket&gt;(*this, ++s_uniqueSocketIdentifier, LibWebRTCSocket::Type::ServerTCP, socketAddress, rtc::SocketAddress());
+    m_sockets.set(socket-&gt;identifier(), socket.get());
+
+    auto identifier = socket-&gt;identifier();
+    auto address = socket-&gt;localAddress().ToString();
+    callOnMainThread([identifier, address, minPort, maxPort, options]() {
+        String addressString = String(address.data(), address.length());
+        if (!WebProcess::singleton().networkConnection().connection().send(Messages::NetworkRTCProvider::CreateServerTCPSocket(identifier, addressString, minPort, maxPort, options), 0)) {
+            // FIXME: Set error back to socket
+            return;
+        }
+
+    });
+
+    return socket.release();
+}
+
+rtc::AsyncPacketSocket* LibWebRTCSocketFactory::CreateUdpSocket(const rtc::SocketAddress&amp; socketAddress, uint16_t minPort, uint16_t maxPort)
+{
+    auto socket = std::make_unique&lt;LibWebRTCSocket&gt;(*this, ++s_uniqueSocketIdentifier, LibWebRTCSocket::Type::ServerTCP, socketAddress, rtc::SocketAddress());
+    m_sockets.set(socket-&gt;identifier(), socket.get());
+
+    auto identifier = socket-&gt;identifier();
+    auto address = socket-&gt;localAddress().ToString();
+    callOnMainThread([identifier, address, minPort, maxPort]() {
+        String addressString = String(address.data(), address.length());
+        if (!WebProcess::singleton().networkConnection().connection().send(Messages::NetworkRTCProvider::CreateUDPSocket(identifier, addressString, minPort, maxPort), 0)) {
+            // FIXME: Set error back to socket
+            return;
+        }
+    });
+    return socket.release();
+}
+
+rtc::AsyncPacketSocket* LibWebRTCSocketFactory::CreateClientTcpSocket(const rtc::SocketAddress&amp; localSocketAddress, const rtc::SocketAddress&amp; remoteSocketAddress, const rtc::ProxyInfo&amp;, const std::string&amp;, int options)
+{
+    auto socket = std::make_unique&lt;LibWebRTCSocket&gt;(*this, ++s_uniqueSocketIdentifier, LibWebRTCSocket::Type::ServerTCP, localSocketAddress, remoteSocketAddress);
+    socket-&gt;setState(LibWebRTCSocket::STATE_CONNECTING);
+    m_sockets.set(socket-&gt;identifier(), socket.get());
+
+    auto identifier = socket-&gt;identifier();
+    auto localAddress = socket-&gt;localAddress().ToString();
+    auto remoteAddress = socket-&gt;remoteAddress().ToString();
+    callOnMainThread([identifier, localAddress, remoteAddress, options]() {
+        String localAddressString = String(localAddress.data(), localAddress.length());
+        String remoteAddressString = String(remoteAddress.data(), remoteAddress.length());
+        if (!WebProcess::singleton().networkConnection().connection().send(Messages::NetworkRTCProvider::CreateClientTCPSocket(identifier, localAddressString, remoteAddressString, options), 0)) {
+            // FIXME: Set error back to socket
+            return;
+        }
+    });
+
+    return socket.release();
+}
+
+void LibWebRTCSocketFactory::detach(LibWebRTCSocket&amp; socket)
+{
+    ASSERT(m_sockets.contains(socket.identifier()));
+    m_sockets.remove(socket.identifier());
+}
+
+rtc::AsyncResolverInterface* LibWebRTCSocketFactory::CreateAsyncResolver()
+{
+    auto resolver = std::make_unique&lt;LibWebRTCResolver&gt;(++s_uniqueResolverIdentifier);
+    auto* resolverPointer = resolver.get();
+    m_resolvers.set(resolverPointer-&gt;identifier(), WTFMove(resolver));
+    return resolverPointer;
+}
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcLibWebRTCSocketFactoryh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,67 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(LIBWEBRTC)
+
+#include &quot;LibWebRTCResolver.h&quot;
+#include &quot;LibWebRTCSocket.h&quot;
+#include &lt;WebCore/LibWebRTCMacros.h&gt;
+#include &lt;webrtc/base/nethelpers.h&gt;
+#include &lt;webrtc/p2p/base/packetsocketfactory.h&gt;
+#include &lt;wtf/HashMap.h&gt;
+
+namespace WebKit {
+
+class LibWebRTCSocketFactory final : public rtc::PacketSocketFactory {
+public:
+    LibWebRTCSocketFactory() { }
+
+    void detach(LibWebRTCSocket&amp;);
+
+    LibWebRTCSocket* socket(uint64_t identifier) { return m_sockets.get(identifier); }
+    LibWebRTCResolver* resolver(uint64_t identifier) { return m_resolvers.get(identifier); }
+
+    std::unique_ptr&lt;LibWebRTCResolver&gt; takeResolver(uint64_t identifier) { return m_resolvers.take(identifier); }
+
+private:
+    rtc::AsyncPacketSocket* CreateUdpSocket(const rtc::SocketAddress&amp;, uint16_t minPort, uint16_t maxPort) final;
+    rtc::AsyncPacketSocket* CreateServerTcpSocket(const rtc::SocketAddress&amp;, uint16_t min_port, uint16_t max_port, int options) final;
+    rtc::AsyncPacketSocket* CreateClientTcpSocket(const rtc::SocketAddress&amp; localAddress, const rtc::SocketAddress&amp; remoteAddress, const rtc::ProxyInfo&amp;, const std::string&amp;, int options);
+    rtc::AsyncResolverInterface* CreateAsyncResolver() final;
+
+    // We cannot own sockets, clients of the factory are responsible to free them.
+    HashMap&lt;uint64_t, LibWebRTCSocket*&gt; m_sockets;
+    static uint64_t s_uniqueSocketIdentifier;
+    
+    // We can own resolvers as we control their Destroy method.
+    HashMap&lt;uint64_t, std::unique_ptr&lt;LibWebRTCResolver&gt;&gt; m_resolvers;
+    static uint64_t s_uniqueResolverIdentifier;
+};
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCMonitorcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCMonitor.cpp (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCMonitor.cpp                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCMonitor.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,99 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;WebRTCMonitor.h&quot;
+
+#if USE(LIBWEBRTC)
+
+#include &quot;NetworkConnectionToWebProcessMessages.h&quot;
+#include &quot;NetworkProcessConnection.h&quot;
+#include &quot;NetworkRTCMonitorMessages.h&quot;
+#include &quot;WebProcess.h&quot;
+#include &lt;WebCOre/LibWebRTCMacros.h&gt;
+#include &lt;webrtc/base/nethelpers.h&gt;
+#include &lt;wtf/MainThread.h&gt;
+
+namespace WebKit {
+
+static inline void sendOnMainThread(Function&lt;void(IPC::Connection&amp;)&gt;&amp;&amp; callback)
+{
+    callOnMainThread([callback = WTFMove(callback)]() {
+        callback(WebProcess::singleton().networkConnection().connection());
+    });
+}
+
+void WebRTCMonitor::StartUpdating()
+{
+    if (m_clientCount) {
+        // Need to signal new client that we already have the network list, let's do it asynchronously
+        if (m_receivedNetworkList) {
+            WebCore::callOnWebRTCNetworkThread([this] {
+                SignalNetworksChanged();
+            });
+        }
+    } else {
+        m_receivedNetworkList = false;
+        sendOnMainThread([](IPC::Connection&amp; connection) {
+            connection.send(Messages::NetworkRTCMonitor::StartUpdating(), 0);
+        });
+    }
+    ++m_clientCount;
+}
+
+void WebRTCMonitor::StopUpdating()
+{
+    ASSERT(m_clientCount);
+    if (--m_clientCount)
+        return;
+
+    sendOnMainThread([](IPC::Connection&amp; connection) {
+        connection.send(Messages::NetworkRTCMonitor::StopUpdating(), 0);
+    });
+}
+
+void WebRTCMonitor::networksChanged(const Vector&lt;RTCNetwork&gt;&amp; networks, const RTCNetwork::IPAddress&amp; ipv4, const RTCNetwork::IPAddress&amp; ipv6)
+{
+    // No need to protect 'this' as it has the lifetime of LibWebRTC which has the lifetime of the web process.
+    WebCore::callOnWebRTCNetworkThread([this, networks, ipv4, ipv6] {
+        std::vector&lt;rtc::Network*&gt; networkList(networks.size());
+        for (size_t index = 0; index &lt; networks.size(); ++index)
+            networkList[index] = new rtc::Network(networks[index].value());
+
+        bool forceSignaling = !m_receivedNetworkList;
+        m_receivedNetworkList = true;
+
+        bool hasChanged;
+        set_default_local_addresses(ipv4.value, ipv6.value);
+        MergeNetworkList(networkList, &amp;hasChanged);
+        if (hasChanged || forceSignaling)
+            SignalNetworksChanged();
+
+    });
+}
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCMonitorh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCMonitor.h (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCMonitor.h                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCMonitor.h        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,61 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(LIBWEBRTC)
+
+#include &quot;RTCNetwork.h&quot;
+#include &lt;WebCore/LibWebRTCUtils.h&gt;
+#include &lt;wtf/Vector.h&gt;
+
+namespace IPC {
+class Connection;
+class Decoder;
+}
+
+namespace WebKit {
+
+struct NetworksChangedData;
+
+class WebRTCMonitor final : public rtc::NetworkManagerBase {
+public:
+    WebRTCMonitor() = default;
+
+    void didReceiveMessage(IPC::Connection&amp;, IPC::Decoder&amp;);
+
+private:
+    void networksChanged(const Vector&lt;RTCNetwork&gt;&amp; networkList, const RTCNetwork::IPAddress&amp;, const RTCNetwork::IPAddress&amp;);
+
+    void StartUpdating() final;
+    void StopUpdating() final;
+
+    unsigned m_clientCount { 0 };
+    bool m_receivedNetworkList { false };
+};
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCMonitormessagesin"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCMonitor.messages.in (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCMonitor.messages.in                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCMonitor.messages.in        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,29 @@
</span><ins>+# Copyright (C) 2017 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#if USE(LIBWEBRTC)
+
+messages -&gt; WebRTCMonitor {
+    void NetworksChanged(Vector&lt;WebKit::RTCNetwork&gt; networks, WebKit::RTCNetwork::IPAddress defaultIPV4Address, WebKit::RTCNetwork::IPAddress defaultIPV6Address)
+}
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCResolvercpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCResolver.cpp (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCResolver.cpp                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCResolver.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,76 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;WebRTCResolver.h&quot;
+
+#if USE(LIBWEBRTC)
+
+#include &quot;LibWebRTCResolver.h&quot;
+#include &quot;LibWebRTCSocketFactory.h&quot;
+#include &lt;WebCore/LibWebRTCUtils.h&gt;
+#include &lt;wtf/Function.h&gt;
+
+namespace WebKit {
+
+WebRTCResolver::WebRTCResolver(LibWebRTCSocketFactory&amp; socketFactory, uint64_t identifier)
+    : m_socketFactory(socketFactory)
+    , m_identifier(identifier)
+{
+}
+
+void WebRTCResolver::setResolvedAddress(const Vector&lt;RTCNetwork::IPAddress&gt;&amp; addresses)
+{
+    auto identifier = m_identifier;
+    auto&amp; factory = m_socketFactory;
+
+    Vector&lt;rtc::IPAddress&gt; rtcAddresses;
+    rtcAddresses.reserveInitialCapacity(addresses.size());
+    for (auto&amp; address : addresses)
+        rtcAddresses.uncheckedAppend(address.value);
+    
+    WebCore::callOnWebRTCNetworkThread([&amp;factory, identifier, rtcAddresses = WTFMove(rtcAddresses)]() {
+        auto* resolver = factory.resolver(identifier);
+        if (!resolver)
+            return;
+        resolver-&gt;setResolvedAddress(rtcAddresses);
+    });
+}
+
+void WebRTCResolver::resolvedAddressError(int error)
+{
+    auto identifier = m_identifier;
+    auto&amp; factory = m_socketFactory;
+    WebCore::callOnWebRTCNetworkThread([&amp;factory, identifier, error]() {
+        auto* resolver = factory.resolver(identifier);
+        if (!resolver)
+            return;
+        resolver-&gt;setError(error);
+    });
+}
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCResolverh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCResolver.h (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCResolver.h                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCResolver.h        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,58 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(LIBWEBRTC)
+
+#include &quot;RTCNetwork.h&quot;
+#include &lt;wtf/Vector.h&gt;
+
+namespace IPC {
+class Connection;
+class Decoder;
+}
+
+namespace WebKit {
+
+class LibWebRTCSocketFactory;
+
+class WebRTCResolver {
+public:
+    WebRTCResolver(LibWebRTCSocketFactory&amp;, uint64_t);
+
+    void didReceiveMessage(IPC::Connection&amp;, IPC::Decoder&amp;);
+
+private:
+    void setResolvedAddress(const Vector&lt;RTCNetwork::IPAddress&gt;&amp;);
+    void resolvedAddressError(int);
+
+    LibWebRTCSocketFactory&amp; m_socketFactory;
+    uint64_t m_identifier { 0 };
+};
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCResolvermessagesin"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCResolver.messages.in (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCResolver.messages.in                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCResolver.messages.in        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,30 @@
</span><ins>+# Copyright (C) 2017 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#if USE(LIBWEBRTC)
+
+messages -&gt; WebRTCResolver {
+    void SetResolvedAddress(Vector&lt;WebKit::RTCNetwork::IPAddress&gt; addresses)
+    void ResolvedAddressError(int error)
+}
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCSocketcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCSocket.cpp (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCSocket.cpp                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCSocket.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,95 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;WebRTCSocket.h&quot;
+
+#if USE(LIBWEBRTC)
+
+#include &quot;DataReference.h&quot;
+#include &quot;LibWebRTCSocket.h&quot;
+#include &quot;LibWebRTCSocketFactory.h&quot;
+#include &quot;NetworkRTCSocketMessages.h&quot;
+#include &lt;WebCore/SharedBuffer.h&gt;
+#include &lt;wtf/Function.h&gt;
+
+namespace WebKit {
+
+void WebRTCSocket::signalOnNetworkThread(LibWebRTCSocketFactory&amp; factory, uint64_t identifier, Function&lt;void(LibWebRTCSocket&amp;)&gt;&amp;&amp; callback)
+{
+    // factory is staying valid during the process lifetime.
+    WebCore::callOnWebRTCNetworkThread([&amp;factory, identifier, callback = WTFMove(callback)]() {
+        auto* socket = factory.socket(identifier);
+        if (!socket)
+            return;
+        callback(*socket);
+    });
+}
+
+WebRTCSocket::WebRTCSocket(LibWebRTCSocketFactory&amp; factory, uint64_t identifier)
+    : m_factory(factory)
+    , m_identifier(identifier)
+{
+}
+
+void WebRTCSocket::signalAddressReady(const String&amp; address)
+{
+    signalOnNetworkThread(m_factory, m_identifier, [address](LibWebRTCSocket&amp; socket) {
+        socket.signalAddressReady(address);
+    });
+}
+
+void WebRTCSocket::signalReadPacket(const IPC::DataReference&amp; data, const RTCNetwork::IPAddress&amp; address, uint16_t port, int64_t timestamp)
+{
+    auto buffer = WebCore::SharedBuffer::create(data.data(), data.size());
+    signalOnNetworkThread(m_factory, m_identifier, [buffer = WTFMove(buffer), address, port, timestamp](LibWebRTCSocket&amp; socket) {
+        socket.signalReadPacket(buffer.get(), rtc::SocketAddress(address.value, port), timestamp);
+    });
+}
+
+void WebRTCSocket::signalSentPacket(int rtcPacketID, int64_t sendTimeMs)
+{
+    signalOnNetworkThread(m_factory, m_identifier, [rtcPacketID, sendTimeMs](LibWebRTCSocket&amp; socket) {
+        socket.signalSentPacket(rtcPacketID, sendTimeMs);
+    });
+}
+
+void WebRTCSocket::signalConnect()
+{
+    signalOnNetworkThread(m_factory, m_identifier, [](LibWebRTCSocket&amp; socket) {
+        socket.signalConnect();
+    });
+}
+
+void WebRTCSocket::signalClose(int error)
+{
+    signalOnNetworkThread(m_factory, m_identifier, [error](LibWebRTCSocket&amp; socket) {
+        socket.signalClose(error);
+    });
+}
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCSocketh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCSocket.h (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCSocket.h                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCSocket.h        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,65 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(LIBWEBRTC)
+
+#include &quot;RTCNetwork.h&quot;
+#include &lt;wtf/Function.h&gt;
+
+namespace IPC {
+class Connection;
+class DataReference;
+class Decoder;
+}
+
+namespace WebKit {
+
+class LibWebRTCSocket;
+class LibWebRTCSocketFactory;
+
+class WebRTCSocket {
+public:
+    WebRTCSocket(LibWebRTCSocketFactory&amp;, uint64_t);
+
+    void didReceiveMessage(IPC::Connection&amp;, IPC::Decoder&amp;);
+
+    static void signalOnNetworkThread(LibWebRTCSocketFactory&amp;, uint64_t, Function&lt;void(LibWebRTCSocket&amp;)&gt;&amp;&amp;);
+
+private:
+    void signalReadPacket(const IPC::DataReference&amp;, const RTCNetwork::IPAddress&amp;, uint16_t port, int64_t);
+    void signalSentPacket(int, int64_t);
+    void signalAddressReady(const String&amp;);
+    void signalConnect();
+    void signalClose(int);
+    
+    LibWebRTCSocketFactory&amp; m_factory;
+    uint64_t m_identifier { 0 };
+};
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessNetworkwebrtcWebRTCSocketmessagesin"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCSocket.messages.in (0 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCSocket.messages.in                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Network/webrtc/WebRTCSocket.messages.in        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+# Copyright (C) 2017 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#if USE(LIBWEBRTC)
+
+messages -&gt; WebRTCSocket {
+    SignalReadPacket(IPC::DataReference data, WebKit::RTCNetwork::IPAddress address, uint16_t port, int64_t timestamp)
+    SignalSentPacket(int packetSize, int64_t timestamp)
+    SignalAddressReady(String address)
+    SignalConnect()
+    SignalClose(int error)
+}
+
+#endif // USE(LIBWEBRTC)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (211440 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2017-01-31 18:59:23 UTC (rev 211440)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -40,6 +40,7 @@
</span><span class="cx"> #include &quot;InjectedBundle.h&quot;
</span><span class="cx"> #include &quot;InjectedBundleBackForwardList.h&quot;
</span><span class="cx"> #include &quot;InjectedBundleScriptWorld.h&quot;
</span><ins>+#include &quot;LibWebRTCProvider.h&quot;
</ins><span class="cx"> #include &quot;LoadParameters.h&quot;
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="cx"> #include &quot;NetscapePlugin.h&quot;
</span><span class="lines">@@ -148,7 +149,6 @@
</span><span class="cx"> #include &lt;WebCore/JSDOMExceptionHandling.h&gt;
</span><span class="cx"> #include &lt;WebCore/JSDOMWindow.h&gt;
</span><span class="cx"> #include &lt;WebCore/KeyboardEvent.h&gt;
</span><del>-#include &lt;WebCore/LibWebRTCProvider.h&gt;
</del><span class="cx"> #include &lt;WebCore/MIMETypeRegistry.h&gt;
</span><span class="cx"> #include &lt;WebCore/MainFrame.h&gt;
</span><span class="cx"> #include &lt;WebCore/MouseEvent.h&gt;
</span><span class="lines">@@ -374,7 +374,7 @@
</span><span class="cx">     PageConfiguration pageConfiguration(
</span><span class="cx">         makeUniqueRef&lt;WebEditorClient&gt;(this),
</span><span class="cx">         WebSocketProvider::create(),
</span><del>-        makeUniqueRef&lt;WebCore::LibWebRTCProvider&gt;()
</del><ins>+        makeUniqueRef&lt;WebKit::LibWebRTCProvider&gt;()
</ins><span class="cx">     );
</span><span class="cx">     pageConfiguration.chromeClient = new WebChromeClient(*this);
</span><span class="cx"> #if ENABLE(CONTEXT_MENUS)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebProcesscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (211440 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp        2017-01-31 18:59:23 UTC (rev 211440)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -1546,4 +1546,13 @@
</span><span class="cx">     m_dnsPrefetchHystereris.impulse();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if USE(LIBWEBRTC)
+LibWebRTCNetwork&amp; WebProcess::libWebRTCNetwork()
+{
+    if (!m_libWebRTCNetwork)
+        m_libWebRTCNetwork = std::make_unique&lt;LibWebRTCNetwork&gt;();
+    return *m_libWebRTCNetwork;
+}
+#endif
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebProcessh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebProcess.h (211440 => 211441)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebProcess.h        2017-01-31 18:59:23 UTC (rev 211440)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.h        2017-01-31 19:37:24 UTC (rev 211441)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> #include &quot;CacheModel.h&quot;
</span><span class="cx"> #include &quot;ChildProcess.h&quot;
</span><span class="cx"> #include &quot;DrawingArea.h&quot;
</span><ins>+#include &quot;LibWebRTCNetwork.h&quot;
</ins><span class="cx"> #include &quot;PluginProcessConnectionManager.h&quot;
</span><span class="cx"> #include &quot;ResourceCachesToClear.h&quot;
</span><span class="cx"> #include &quot;SandboxExtension.h&quot;
</span><span class="lines">@@ -165,6 +166,10 @@
</span><span class="cx">     void networkProcessConnectionClosed(NetworkProcessConnection*);
</span><span class="cx">     WebLoaderStrategy&amp; webLoaderStrategy();
</span><span class="cx"> 
</span><ins>+#if USE(LIBWEBRTC)
+    LibWebRTCNetwork&amp; libWebRTCNetwork();
+#endif
+
</ins><span class="cx"> #if ENABLE(DATABASE_PROCESS)
</span><span class="cx">     void webToDatabaseProcessConnectionClosed(WebToDatabaseProcessConnection*);
</span><span class="cx">     WebToDatabaseProcessConnection* webToDatabaseProcessConnection();
</span><span class="lines">@@ -377,6 +382,11 @@
</span><span class="cx">     void ensureNetworkProcessConnection();
</span><span class="cx">     RefPtr&lt;NetworkProcessConnection&gt; m_networkProcessConnection;
</span><span class="cx">     WebLoaderStrategy&amp; m_webLoaderStrategy;
</span><ins>+
+#if USE(LIBWEBRTC)
+    std::unique_ptr&lt;LibWebRTCNetwork&gt; m_libWebRTCNetwork;
+#endif
+
</ins><span class="cx">     HashSet&lt;String&gt; m_dnsPrefetchedHosts;
</span><span class="cx">     WebCore::HysteresisActivity m_dnsPrefetchHystereris;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>